crashtest-r0ket/tools/game/r0ketrem0te/game.py

81 lines
2.8 KiB
Python

import bridge
import packets
import time
import Queue
import random
import threading
class Game:
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)]
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()
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)
self.bridge.putInQueue(self.announcequeue, aq)
self.announcetimer = threading.Timer(1, self.sendAnnounce)
self.announcetimer.start()
def registerPlayerCallback(self, callback):
if not callback in self.callbacks:
self.callbacks.append(callback)