Ejemplo n.º 1
0
 def Launch(self, pipe):
     logging.info("UDP Launched")
     self.pipe = get_timeout_pipe(pipe)
     spinner = CPUSpinnerController()
     self.ev = EventManager()
     self.ev.register_listener(self)
     self.ev.register_listener(spinner)
     spinner.run(self.ev)
Ejemplo n.º 2
0
class RegnancyUDPServer(UDPServer):

    def __init__(self, regnancy_server_address):

        for port in xrange(12000, 25000):
            try:
                logging.info("UDPServer starts")
                UDPServer.__init__(self, ("", port), Handler)
                logging.info("UDPServer runs %i", port)
                break
            except:
                pass

        self.timeout = 0.05
        RegnancyUDPServer.regnancy_server_address = \
            regnancy_server_address
        self.running = True

    def notify(self, event):
        pass

    def handle_tickevent(self, event):
        self.handle_request()
        
        if not self.pipe.check():
            self.running = False
            QuitEvent().post(self.ev)
        
    def handle_quitevent(self, event):
        logging.info("Shutting down UDP Server")
        self.pipe.send([PP_QUIT])

    def Launch(self, pipe):
        logging.info("UDP Launched")
        self.pipe = get_timeout_pipe(pipe)
        spinner = CPUSpinnerController()
        self.ev = EventManager()
        self.ev.register_listener(self)
        self.ev.register_listener(spinner)
        spinner.run(self.ev)
Ejemplo n.º 3
0
    def __init__(self, *args, **kwargs):
        self.running = True
        self.clients = WeakKeyDictionary()
        self.masterplayer = None

        self.localaddr = (nwp.get_lan_ip(), global_options.port)
        Server.__init__(self, RegnancyChannel, localaddr=self.localaddr)
        self.addr = self.socket.getsockname()
        self.ev = EventManager()
        self.ev.register_listener(self)
        self.__game = game.Game(self.ev)
        self.ev.register_listener(self.__game)
        self.__lock = Lock()
Ejemplo n.º 4
0
class RegnancyServer(Server):

    def __init__(self, *args, **kwargs):
        self.running = True
        self.clients = WeakKeyDictionary()
        self.masterplayer = None

        self.localaddr = (nwp.get_lan_ip(), global_options.port)
        Server.__init__(self, RegnancyChannel, localaddr=self.localaddr)
        self.addr = self.socket.getsockname()
        self.ev = EventManager()
        self.ev.register_listener(self)
        self.__game = game.Game(self.ev)
        self.ev.register_listener(self.__game)
        self.__lock = Lock()
        
    @property
    def game(self):
        with self.__lock:
            return self.__game

    def NextId(self):
        return get_id()
        
    def Connected(self, channel, addr):
        self.add_player(channel)

    def add_player(self, client):
        (self.clients)[client] = True
        client.Send({ACTION: INITIAL, MESSAGE: "Welcome to Regnancy-Server at %s:%i" %
                    ((self.localaddr)[0], (self.localaddr)[1]), ID: client.id})

        if len(self.clients) == 1:
            self.masterplayer = client
            client.Send({ACTION: SETMASTER, VALUE: True})
        self.send_playerlist()

    def delete_player(self, client):
        logging.warning("Deleting Player %s", str(client.addr))
        self.send_to_all({ACTION: MESSAGE, MESSAGE: "player %s (%s) left the server" %
                         (client.id, client.player.name)})
        try:
            del (self.clients)[client]
        except:
            pass
        self.send_playerlist()
        if self.game.running:
            raise Exception("Player died while playing")

    def get_client(self, player):
        assert player, "player is None"
        return next(c for c in self.clients if c.player.id == player.id)

    def get_playerinfos(self):
        infos = []
        for c in self.clients:
            info = c.player.create_info()
            info.player_id = c.id
            infos.append(info)
        return infos

    def send_playerlist(self):
        infos = self.get_playerinfos()
        if self.game.running:
            if not len([p for p in infos if p.current]) == 1:  # or len(infos) < 2:
                for i in infos:
                    print i
                    raise Exception("no active player???")

        self.send_to_all({ACTION: UPDATE, PLAYERINFO: nwp.pack(infos)})

    def send_to_all(self, data):
        assert data, "data is None"

        [p.Send(data) for p in self.clients]
        self.Pump()  #ensure data is send

    def handle_changephaseevent(self, event):
        assert event.player, "player is None"
        assert event.phase, "phase is None"
        self.send_to_all({ACTION: UPDATE, 
                          PHASE: event.phase, 
                          CLIENTID: self.get_client(event.player).id})

    def handle_changesubphaseevent(self, event):
        assert event.player, "player is None"
        assert event.subphase, "subphase is None"

        if event.info:
            assert isinstance(event.info, InfoToken)
        
        self.send_to_all({ACTION: UPDATE, 
                          SUBID: nwp.pack(event.card_id),
                          SUBPHASE: event.subphase, 
                          INFO: nwp.pack(event.info),
                          CLIENTID: self.get_client(event.player).id})

    def handle_changehandevent(self, event):
        assert event.player, "player is None"
        self.__send_hand(event.player)

    def __send_hand(self, player):
        for c in player.hand: #TODO: Should be done in game
            c.calc_cost = self.game.get_cost(c)
            
        self.get_client(player).Send({ACTION: UPDATE, 
                                      HAND: nwp.pack(player.hand),
                                      DECK: nwp.pack(player.deck)})

    def handle_changeboardevent(self, event):
        assert event.player, "player is None"
        for c in event.player.board: #TODO: Should be done in game
            c.calc_cost = self.game.get_cost(c)

        self.send_to_all({ACTION: UPDATE, 
                          BOARD: nwp.pack(event.player.board)})

    def handle_messageevent(self, event):
        assert event.message, "message is None"
        #logging.debug(event.message)
        m = {ACTION: MESSAGE, MESSAGE: event.message}
        if event.reciever:
            self.get_client(event.reciever).Send(m)
        else:
            self.send_to_all(m)

    def handle_playerinfoevent(self, event):
        self.send_to_all({ACTION: UPDATE, PLAYERINFO: nwp.pack(event.playerinfos)})

    def handle_gameendevent(self, event):
        self.send_to_all({ACTION: END, RESULT: nwp.pack(event.result)})
        self.running = False
        
    def handle_changepilesevent(self, event):
        self.__send_piles()

    def __send_piles(self):
        self.send_to_all({ACTION: UPDATE, BOARDSETUP: nwp.pack([(pile.id,
                         pile.card, len(pile), self.game.get_cost(pile))
                         for pile in self.game.kingdompiles])})

        self.send_to_all({ACTION: UPDATE, BOARDCOMMON: nwp.pack([(pile.id,
                         pile.card, len(pile), self.game.get_cost(pile))
                         for pile in self.game.commonpiles])})

    def start_game(self, data):
        self.game_running = True

        deck_name = data[INFO]
        self.game.setup(deck_name, [c.player for c in self.clients])

        self.send_playerlist()
        self.__send_piles()

        for client in self.clients:
            self.__send_hand(client.player)

        self.send_to_all({ACTION: START, MESSAGE: "game started"})

    def handle_quitevent(self, event):
        sleep(0.0001)
        self.close()
        self.pipe.send([PP_QUIT])

    def handle_tickevent(self, event):
        if not self.pipe.check():
            self.running = False
            QuitEvent().post(self.ev)
            
        if self.game.running:
            self.game.update()
        self.Pump()
        sleep(0.01)
    
    def notify(self, event):
        pass
        
    def Launch(self, pipe=None):
        self.pipe = get_timeout_pipe(pipe)
        spinner = CPUSpinnerController()
        self.ev.register_listener(spinner)
        spinner.run(self.ev)