Example #1
0
    def __init__(self, host, port):
        ''' Communicates between the GUI and server. '''

        async_chat.__init__(self)
        self.data = []
        self.ID = -1   
        self.ch = ClientHelper(self)
        
        while True:
            if host == None:
                host = raw_input("Enter the IP of the server (leave blank for localhost) >")
                if len(host.strip()) == 0:
                    host = "localhost"
            try:
                print "connecting to...",host
                self.create_socket(socket.AF_INET, socket.SOCK_STREAM)
                self.connect((host,port))
                self.set_terminator("\n")
                self.register()
                
                try: asyncore.loop()
                except KeyboardInterrupt: print
                break
            except Exception:
                print "Cannot connect, ", Exception
                host = None
 def connect(self):
     try:
         hp = self.ui.connectInput.text()
         [host, port] = hp.split(':')[:2]
         port = int(port)
         self.connector = ClientHelper(host, port, self)
         self.connector.start()
         self.ui.connectButton.setEnabled(False)
     except Exception as e:
         self.ui.connectButton.setEnabled(True)
         self.log('%s' % e)
Example #3
0
class Client(async_chat):
    def __init__(self, host, port):
        ''' Communicates between the GUI and server. '''

        async_chat.__init__(self)
        self.data = []
        self.ID = -1   
        self.ch = ClientHelper(self)
        
        while True:
            if host == None:
                host = raw_input("Enter the IP of the server (leave blank for localhost) >")
                if len(host.strip()) == 0:
                    host = "localhost"
            try:
                print "connecting to...",host
                self.create_socket(socket.AF_INET, socket.SOCK_STREAM)
                self.connect((host,port))
                self.set_terminator("\n")
                self.register()
                
                try: asyncore.loop()
                except KeyboardInterrupt: print
                break
            except Exception:
                print "Cannot connect, ", Exception
                host = None

    def found_terminator(self):
        ''' Sends messages received from the server to be dealt with. '''
        line = ''.join(self.data)
        self.data = []
        self.ch.interpretMessage(line)
        
    def collect_incoming_data(self, data):
        ''' Collects messages from the server and stores in self.data. '''
        self.data.append(data)
   
    def register(self):
        '''
        Starts the registration process.
        Asks the player for a name, which is received by client helper,
        which then continues registering.
        
        '''
        name = None
        while name == None or len(name) < 1:
            name = raw_input("What name do you wish to go by? >   ")
            name = name.strip().replace(" ", "_")
        self.ch.name = name
        self.broadcast("NAME", self.ch.name)
        
    def broadcast(self, instruction, line="None"):
        ''' 
        Sends a message to the server.

        Arguments:
        instruction -- The type of the message, e.g. request for information
                       See Session and ClientHelper for message types.
        line -- The actual message.
        
        '''
        self.send(str(self.ID) + " " + instruction + " " + line + " \r\n")
class DesktopClientApp(QtGui.QMainWindow):
    '''
    classdocs
    '''


    def __init__(self, parent=None):
        '''
        Constructor
        '''
        QtGui.QMainWindow.__init__(self, parent)
        self.ui = Ui_MainWindow()
        self.ui.setupUi(self)
        self.connector = None
        self.scene = QtGui.QGraphicsScene(0, 0, 1000, 1000)
        self.ui.mapView.setScene(self.scene)
        self.scene.mousePressEvent = self.mouseClickedOnMap
        self.regions = {}
        self.state = S_ROAM
        self.ui.playerLabel.setVisible(False)
        self.ui.playerView.setVisible(False)
        self.ui.missionLabel.setVisible(False)
        self.ui
        
        
    
    def dopass(self):
        self.ui.passButton.setEnabled(False)
        self.ui.tradeButton.setEnabled(False)
        self.state = S_ROAM
        self.connector.doPass()
    def connect(self):
        try:
            hp = self.ui.connectInput.text()
            [host, port] = hp.split(':')[:2]
            port = int(port)
            self.connector = ClientHelper(host, port, self)
            self.connector.start()
            self.ui.connectButton.setEnabled(False)
        except Exception as e:
            self.ui.connectButton.setEnabled(True)
            self.log('%s' % e)
            
    def log(self, message):
        self.emit(QtCore.SIGNAL("log(QString)"), QtCore.QString(message))
    
    def map(self, map):
        self.map = map
        
    def mapImg(self):
        fname = "tmpImage"+str(uuid.uuid1())
        f = open(fname, 'w')
        f.write(self.mapImage)
        f.flush()
        f.close()
        image = QtGui.QPixmap(fname)
        item = QtGui.QGraphicsPixmapItem(image)
        self.scene.clear()
        self.scene.addItem(item)
        
        print self.map
        lines = self.map.split("\n")
        for i in range(len(lines)):
            if(lines[i] == "" or ("Turn of" in lines[i])):
                del lines[i]
        numReg = int(lines[0])
        numCont = int(lines[numReg + 1])
        contColors = {}
        for i in range(numCont):
            (conname, bonus) = lines[numReg + 2 + i].split(",")
            contColors[conname] = i
            self.ui.contList.addItem(QtCore.QString(conname + " " + bonus + "(Bonus)"))
            self.ui.contList.item(i).setData(QtCore.Qt.DecorationRole, QtCore.QVariant(continentColors[contColors[conname]]))
        for i in range(numReg):
            regStr = lines[i+1]
            [namecont,neighbours,points] = regStr.split(":")
            [name, contName] = namecont.split(',')
            neighbours = neighbours.split(',')[:-1]
            points = points.split(',')[:-1]
            polygon = QtGui.QPolygonF()
            for p in points:
                point  = QtCore.QPointF(float(p.split('-')[0]),float(p.split('-')[1]) )
                polygon.append(point)
            r = Region(self.scene, polygon, continentColors[contColors[contName]], self)
            r.name = name
            r.armies = 0
            r.neighbours = neighbours
            self.regions[r.name] = r
    def updateWorldMap(self, wm):
        lines = wm.split("\n")
        for line in lines:
            parts = line.split(" ")
            if(len(parts) == 3):
                [name, color, armies] = parts
                if name.strip() in self.regions:
                    r = self.regions[name.strip()]
                    r.occupantColor = occupantColors[color]
                    r.armies = int(armies.strip())
                    r.updateF()
                
    def updateCardList(self, cl):
        lines = cl.split('\n')
        for i  in range(len(lines)):
            line = lines[i]
            if 'Cards' in line:
                match = re.search('(\d+)', line)
                cardnum = int(match.group())
                self.ui.cardList.clear()
                for j in range(i+1, i+ 1+cardnum):
                    self.ui.cardList.addItem(lines[j].replace("\t",''))
                break
    def slotTradeIn(self):
        selected = self.ui.cardList.selectedItems()
        if(len(selected) != 3):
            QtGui.QMessageBox.information(self, 'Selection Error', 'Select Exactly 3 Cards')
        else:
            selectedids = map( lambda x: re.search('(\d+)', x).group() , selected)
            self.connector.trade(selectedids)
    def loadImgSlt(self):
        self.mapImg()
    def setStateLabel(self):
        self.ui.stateLabel.setText(self.connector.currentState+ " " + self.state)
    def mapImgSig(self):
        self.emit(QtCore.SIGNAL("loadImgSig()"))
    def placeSingle(self):
        self.ui.label_3.setText("Select an unoccupied territory to occupy")
        self.state = S_PLACE_SINGLE
    def placeArmy(self):
        self.setCommandLabel("Select a territory to place armies")
        self.state = S_PLACE_ARMIES
    def placeOrPass(self):
        self.setCommandLabel("PLACE Income or PASS")
        self.state = S_PLACE_INCOME
        self.ui.passButton.setEnabled(True)
    def attackOrPass(self):
        self.setCommandLabel("Select a region to ATTACK or PASS")
        self.state = S_ATTACK_0
        self.ui.passButton.setEnabled(True)
    def moveOrPass(self):
        self.setCommandLabel("SELECT a region to MOVE armies from or PASS")
        self.state = S_MOVE_0
        self.ui.passButton.setEnabled(True)
    def tradeOrPass(self):
        self.setCommandLabel("SELECT cards to TRADE or PASS")
        self.ui.tradeButton.setEnabled(True)
        if(self.state == S_TRADE):
            self.ui.passButton.setEnabled(True)
    def transfer(self):
        self.setCommandLabel("TRANSFER armies to occupied region")
        self.state = S_TRANSFER
        print 'signaling transfer' 
        self.emit(QtCore.SIGNAL("signalTransferPopup()"))
        
    def slotTransferPopup(self):
        army_num, ok = QtGui.QInputDialog.getInteger(self, "Select Number of armies to transfer newly conquered region", "Enter number of armies", value=1)
        while(not ok):
            army_num, ok = QtGui.QInputDialog.getInteger(self, "Select Number of armies to transfer newly conquered region", "Enter number of armies", value=1)
        self.connector.place(army = str(army_num), captured = True)
    def defend(self, region=None):
        if(region is None):
            region = self.defendRegion
        else:
            self.defendRegion = region
        if region is None:
            region = 'Amk'
        print 'signaling with region : %s'  % region
        self.emit(QtCore.SIGNAL("signalDefendPopup(QString)"), QtCore.QString(region))
    def setPlayerName(self, name):
        self.emit(QtCore.SIGNAL("signalPlayerName(QString)"), QtCore.QString(name))
    def setMission(self, mission):
        self.emit(QtCore.SIGNAL("signalMission(QString)"), QtCore.QString(mission))
    def victorFound(self, mess):
        self.emit(QtCore.SIGNAL("signalVictor(QString)"), QtCore.QString(mess))
    def slotVictor(self, mess):
        QtGui.QMessageBox.warning(self, 'Game Ended', mess)
        sys.exit()
    def slotMission(self, mission):
        self.ui.missionLabel.setVisible(True)
        self.ui.missionLabel.setText("Mission: " + str(mission))
    def slotPlayerName(self, name):
        self.ui.playerLabel.setVisible(True)
        self.ui.playerView.setVisible(True)
        self.ui.playerLabel.setText(name)
        scene = QtGui.QGraphicsScene(0, 0, 51, 41)
        brush = QtGui.QBrush(occupantColors[str(name)])
        pen = QtGui.QPen(brush)
        scene.addRect(QtCore.QRectF(0,0,51,41), pen=pen).setBrush(brush)
        self.ui.playerView.setScene(scene)
    def slotDefendPopup(self,region):
        army_num, ok = QtGui.QInputDialog.getInteger(self, "Defend Territory %s" % region, "Enter number of armies to defend", value=1, min =1, max =2, step=1)
        while(not ok):
            army_num, ok = QtGui.QInputDialog.getInteger(self, "Defend Territory %s" % region, "Enter number of armies to defend", value=1, min =1, max =2, step=1)
        self.connector.defend(str(army_num))
    def setCommandLabel(self, message):
        self.ui.label_3.setText(message)
    def mouseClickedOnMap(self, event):
        items = self.scene.items(event.scenePos())
#        self.log("Selected items are %s" % items)
        region = None
        for item in items:
            if(isinstance(item, Region)):
                region  = item
                break;
        if(not region is None):
            self.log("Selected region is %s" % region.name)
            if(self.state == S_PLACE_SINGLE):
                self.connector.place(region.name)
            elif(self.state == S_PLACE_ARMIES):
                army_num, ok = QtGui.QInputDialog.getInteger(self, "Army Placement", "Enter number of armies", value=1)
                while(not ok):
                    army_num, ok = QtGui.QInputDialog.getInteger(self, "Army Placement", "Enter number of armies", value=1)
                self.connector.place(region.name, str(army_num))
            elif(self.state == S_PLACE_INCOME):
                army_num, ok = QtGui.QInputDialog.getInteger(self, "Army Placement", "Enter number of armies", value=1)
                while(not ok):
                    army_num, ok = QtGui.QInputDialog.getInteger(self, "Army Placement", "Enter number of armies", value=1)
                self.connector.place(region.name, str(army_num))
            elif(self.state == S_ATTACK_0):
                self.attackfrom = region.name
                self.state = S_ATTACK_1
                self.setCommandLabel("SELECT a region to ATTACK")
                self.ui.passButton.setEnabled(False)
            elif(self.state == S_ATTACK_1):
                self.attackto = region.name
                army_num, ok = QtGui.QInputDialog.getInteger(self, "Select Number of armies to attack", "Enter number of armies", value=1)
                while(not ok):
                    army_num, ok = QtGui.QInputDialog.getInteger(self, "Select Number of armies to attack", "Enter number of armies", value=1)
                self.setCommandLabel("ENTER number of armies to ATTACK")
                self.state = S_ATTACK_2
                self.connector.attack(self.attackfrom, self.attackto, str(army_num))
                self.attackto, self.attackfrom = None, None
            elif(self.state == S_MOVE_0):
                self.movefrom = region.name
                self.setCommandLabel("SELECT a region to MOVE armies")
                self.state = S_MOVE_1
                self.ui.passButton.setEnabled(False)
            elif(self.state == S_MOVE_1):
                self.moveto = region.name
                army_num, ok = QtGui.QInputDialog.getInteger(self, "Select Number of armies to move", "Enter number of armies", value=1)
                while(not ok):
                    army_num, ok = QtGui.QInputDialog.getInteger(self, "Select Number of armies to move", "Enter number of armies", value=1)
                self.setCommandLabel("ENTER number of armies to MOVE")
                self.state = S_MOVE_2
                self.connector.move(self.movefrom, self.moveto, str(army_num))
                self.moveto, self.movefrom = None, None
        else:
            self.log("No region selected")