From cdb96bab0156b5b3395da0d873693e8a05886809 Mon Sep 17 00:00:00 2001 From: schneider Date: Fri, 16 Dec 2011 00:33:26 +0100 Subject: [PATCH] remote: added player management to game class --- tools/game/r0ketrem0te/game.py | 48 +++++++++++++++++++++++++++++++++- tools/game/testgame.py | 27 ++----------------- 2 files changed, 49 insertions(+), 26 deletions(-) diff --git a/tools/game/r0ketrem0te/game.py b/tools/game/r0ketrem0te/game.py index eb54596..1be8823 100644 --- a/tools/game/r0ketrem0te/game.py +++ b/tools/game/r0ketrem0te/game.py @@ -6,7 +6,7 @@ import random import threading class Game: - def __init__(self, device, gameName, gameChannel, announcechannel, announcemac): + def __init__(self, device, gameName, gameChannel, announcechannel, announcemac, maxplayer=0): self.gameName = gameName self.channel = gameChannel self.gamemac = [int(random.random()*254) for x in range(1,6)] @@ -25,6 +25,49 @@ class Game: self.sendAnnounce() + self.maxplayer = maxplayer + self.players = {} + self.callbacks = [] + self.queue = Queue.Queue() + self.bridge.registerQueue(self.queue) + self.bridge.registerCallback(self.receivedPacket) + self.checkPlayers() + + def checkPlayers(self): + if self.maxplayer > 0: + toremove = [] + for player in self.players: + self.players[player]-=1 + if self.players[player] == 0: + toremove.append(player) + for player in toremove: + print "removing player", player + del self.players[player] + for callback in self.callbacks: + callback("removed", player) + self.timer = threading.Timer(1, self.checkPlayers) + self.timer.start() + + def receivedPacket(self, packet): + if self.maxplayer == 0: + return + if isinstance(packet, packets.Join): + # flags = 1: join ok + # flags = 0: join not ok + flags = 0 + if len(self.players) < self.maxplayer: + flags = 1 + self.players[packet.id] = 10 + for callback in self.callbacks: + callback("added", packet.id) + + ack = packets.Ack(packet.id, packet.ctr, flags) + qp = bridge.QueuePacket( + self.channel, self.playermac, False, ack) + self.bridge.putInQueue(self.queue, qp) + elif packet.id in self.players: + self.players[packet.id] = 10 + def sendAnnounce(self): aq = bridge.QueuePacket(self.announcechannel, self.announcemac, False, self.announce) @@ -32,3 +75,6 @@ class Game: self.announcetimer = threading.Timer(1, self.sendAnnounce) self.announcetimer.start() + def registerPlayerCallback(self, callback): + if not callback in self.callbacks: + self.callbacks.append(callback) diff --git a/tools/game/testgame.py b/tools/game/testgame.py index 54e608a..33a725d 100644 --- a/tools/game/testgame.py +++ b/tools/game/testgame.py @@ -4,24 +4,9 @@ import r0ketrem0te.packets import time import Queue -maxplayer = 2 -players = {} - def receivedPacket(packet): - if isinstance(packet, r0ketrem0te.packets.Join): - # flags = 1: join ok - # flags = 0: join not ok - flags = 0 - if len(players) < maxplayer: - flags = 1 - players[packet.id] = 10 - ack = r0ketrem0te.packets.Ack(packet.id, packet.ctr, flags) - qp = r0ketrem0te.bridge.QueuePacket(game.channel, game.playermac, False, ack) - game.bridge.putInQueue(queue, qp) - elif packet.id in players: - players[packet.id] = 10 - -game = r0ketrem0te.game.Game('/dev/ttyACM0', "testgame", 83, 81, (1,2,3,2,1)) + pass +game = r0ketrem0te.game.Game('/dev/ttyACM0', "testgame", 83, 81, (1,2,3,2,1), 2) queue = Queue.Queue() game.bridge.registerQueue(queue) @@ -29,11 +14,3 @@ game.bridge.registerCallback(receivedPacket) while True: time.sleep(1) - toremove = [] - for player in players: - players[player]-=1 - if players[player] == 0: - toremove.append(player) - for player in toremove: - print "removing player", player - del players[player]