2011-12-15 18:09:05 +00:00
|
|
|
import bridge
|
|
|
|
import packets
|
|
|
|
import time
|
|
|
|
import Queue
|
|
|
|
import random
|
|
|
|
import threading
|
|
|
|
|
|
|
|
class Game:
|
2011-12-15 23:33:26 +00:00
|
|
|
def __init__(self, device, gameName, gameChannel, announcechannel, announcemac, maxplayer=0):
|
2011-12-15 18:09:05 +00:00
|
|
|
self.gameName = gameName
|
|
|
|
self.channel = gameChannel
|
|
|
|
self.gamemac = [int(random.random()*254) for x in range(1,6)]
|
|
|
|
self.playermac = list(self.gamemac)
|
|
|
|
self.playermac[4]+=1
|
|
|
|
self.gameid = int(random.random()*(2**31))
|
|
|
|
|
|
|
|
self.bridge = bridge.Bridge(device, self.channel, self.gamemac)
|
|
|
|
self.announce = packets.Announce(self.gamemac, self.channel,
|
|
|
|
self.gameid, 0, "testgame")
|
|
|
|
|
|
|
|
self.announcequeue = Queue.Queue()
|
|
|
|
self.bridge.registerQueue(self.announcequeue)
|
|
|
|
self.announcechannel = announcechannel
|
|
|
|
self.announcemac = announcemac
|
|
|
|
|
|
|
|
self.sendAnnounce()
|
|
|
|
|
2011-12-15 23:33:26 +00:00
|
|
|
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
|
|
|
|
|
2011-12-15 18:09:05 +00:00
|
|
|
def sendAnnounce(self):
|
|
|
|
aq = bridge.QueuePacket(self.announcechannel,
|
|
|
|
self.announcemac, False, self.announce)
|
|
|
|
self.bridge.putInQueue(self.announcequeue, aq)
|
|
|
|
self.announcetimer = threading.Timer(1, self.sendAnnounce)
|
|
|
|
self.announcetimer.start()
|
|
|
|
|
2011-12-15 23:33:26 +00:00
|
|
|
def registerPlayerCallback(self, callback):
|
|
|
|
if not callback in self.callbacks:
|
|
|
|
self.callbacks.append(callback)
|