Exemplo n.º 1
0
    def authenticate(self):
        login = self.loginwindow.loginEntry.get()
        password = self.loginwindow.passwordEntry.get()

        self.cManager  = QueuedConnectionManager()
        self.cListener = QueuedConnectionListener(self.cManager, 0)
        self.cReader   = QueuedConnectionReader(self.cManager, 0)
        self.cWriter   = ConnectionWriter(self.cManager, 0)
        self.cReader.setTcpHeaderSize(4)
        self.cWriter.setTcpHeaderSize(4)

        self.myConnection = self.cManager.openTCPClientConnection(IP, PORT, 5000)
        if self.myConnection:
            self.cReader.addConnection(self.myConnection)
            print 'Client listening on', IP, ':', PORT
            taskMgr.add(self.tskReaderPolling, "Poll the connection reader")

            myPyDatagram = PyDatagram()
            myPyDatagram.addUint8(LOGIN_MESSAGE)
            myPyDatagram.addString(login)
            myPyDatagram.addString(password)
            self.cWriter.send(myPyDatagram, self.myConnection)

        else:
            print 'Can\'t connect to server on', IP, ':', PORT
Exemplo n.º 2
0
    def onCrossClicked(self):
        if self.phase == 'tile' and self.cux is not False and self.party['yourturn']:

            if self.subphase == 'free':

                # if we clicked on a character
                if self.party['map']['tiles'][self.cux][self.cuy][self.cuz].has_key('char'):
                    charid = self.party['map']['tiles'][self.cux][self.cuy][self.cuz]['char']
                    myPyDatagram = PyDatagram()
                    myPyDatagram.addUint8(GET_PASSIVE_WALKABLES)
                    myPyDatagram.addString(charid)
                    self.cWriter.send(myPyDatagram, self.myConnection)

            elif self.subphase == 'passivewalkables':
                self.clearZone()
                self.cancel_snd.play()
                self.subphase = 'free'

            elif self.subphase == 'move':
                self.clearZone()
                self.cancel_snd.play()
                self.subphase = None
                self.turn()
            elif self.subphase == 'attack':
                self.clearZone()
                self.cancel_snd.play()
                self.subphase = None
                self.turn()
Exemplo n.º 3
0
 def attack(self, charid, targetid):
     
     myPyDatagram = PyDatagram()
     myPyDatagram.addUint8(ATTACK)
     myPyDatagram.addString(charid)
     myPyDatagram.addString(targetid)
     self.cWriter.send(myPyDatagram, self.myConnection)
Exemplo n.º 4
0
 def createParty(self, mapname):
     import time
     partyname = str(int(time.time()))
     
     myPyDatagram = PyDatagram()
     myPyDatagram.addUint8(CREATE_PARTY)
     myPyDatagram.addString(partyname)
     myPyDatagram.addString(mapname)
     self.cWriter.send(myPyDatagram, self.myConnection)
Exemplo n.º 5
0
    def updateAllPartyLists(self):
        parties = deepcopy(self.parties)
        for party in parties.values():
            del party['map']['tiles']

        for player in self.playersinlobby:
            myPyDatagram = PyDatagram()
            myPyDatagram.addUint8(UPDATE_PARTY_LIST)
            myPyDatagram.addString32(json.dumps(parties))
            self.cWriter.send(myPyDatagram, player)
    def doUpdate(self, updateType, data):
        self.heartbeat()

        if updateType == "inv":
            return  # rip crash

        dg = PyDatagram()
        dg.addUint8(0)
        dg.addString(updateType)
        dg.appendData(data)
        self.setShardData(dg.getMessage())
    def doUpdate(self, updateType, data):
        self.heartbeat()

        if updateType == "inv":
            return  # rip crash

        dg = PyDatagram()
        dg.addUint8(0)
        dg.addString(updateType)
        dg.appendData(data)
        self.setShardData(dg.getMessage())
def packGardenData(plants, statuary, started = True):
    dg = PyDatagram()
    for plant in plants:
        a, b, c, d, e = plant
        dg.addUint32(a)
        dg.addInt8(b)
        dg.addUint32(c)
        dg.addInt8(d)
        dg.addUint16(e)

    dg.addUint8(statuary)
    dg.addBool(started)
    return dg.getMessage()
Exemplo n.º 9
0
def packGardenData(plants, statuary, started=True):
    dg = PyDatagram()
    for plant in plants:
        a, b, c, d, e = plant
        dg.addUint32(a)
        dg.addInt8(b)
        dg.addUint32(c)
        dg.addInt8(d)
        dg.addUint16(e)

    dg.addUint8(statuary)
    dg.addBool(started)
    return dg.getMessage()
Exemplo n.º 10
0
    def moveCharacterTo(self, charid, dest):

        (x2, y2, z2) = dest
        
        myPyDatagram = PyDatagram()
        myPyDatagram.addUint8(MOVE_TO)
        myPyDatagram.addString(charid)
        myPyDatagram.addUint8(x2)
        myPyDatagram.addUint8(y2)
        myPyDatagram.addUint8(z2)
        self.cWriter.send(myPyDatagram, self.myConnection)
Exemplo n.º 11
0
 def path(self, charid, dest):
     orig = self.getCharacterCoords(charid)
     origdir = self.sprites[charid].realdir
     (x, y, z) = dest
     
     myPyDatagram = PyDatagram()
     myPyDatagram.addUint8(GET_PATH)
     myPyDatagram.addString(charid)
     myPyDatagram.addUint8(x)
     myPyDatagram.addUint8(y)
     myPyDatagram.addUint8(z)
     self.cWriter.send(myPyDatagram, self.myConnection)
Exemplo n.º 12
0
    def d_setShardData(self):
        dg = PyDatagram()

        self.context += 1
        self.context %= 200
        dg.addUint8(self.context)

        buildings = self.air.doFindAllInstances(
            DistributedBuildingAI.DistributedBuildingAI)
        for bldg in buildings:
            if bldg.__class__ in (
                    DistributedBuildingAI.DistributedBuildingAI,
                    DistributedAnimBuildingAI.DistributedAnimBuildingAI):
                if not bldg.zoneId % 1000:
                    # sz bldg, ignore
                    continue

                if bldg.zoneId // 1000 == 7:
                    # ff bldg, ignore now
                    continue

                data = bldg.getPickleData()

                dg.addString("block")
                dg.addUint16(bldg.zoneId - (bldg.zoneId % 1000))
                dg.addUint16(bldg.zoneId)
                dg.addUint8(int(data['block']))
                dg.addString(data['state'].lower())
                dg.addUint8(ord(data['track']))
                dg.addUint8(int(data['difficulty']))
                dg.addInt8(int(data['numFloors']))

                self.bldgs.add(bldg)

        self.writeInvasion(dg)
        self.sendUpdate("setShardData", [dg.getMessage()])

        self.air.notify.info("Sent shard data to UD")
        taskMgr.doMethodLater(60, self.__timeout, 'UD-sync-timeout')
    def d_setShardData(self):
        dg = PyDatagram()
        
        self.context += 1
        self.context %= 200
        dg.addUint8(self.context)
        
        buildings = self.air.doFindAllInstances(DistributedBuildingAI.DistributedBuildingAI)
        for bldg in buildings:
            if bldg.__class__ in (DistributedBuildingAI.DistributedBuildingAI, DistributedAnimBuildingAI.DistributedAnimBuildingAI):
                if not bldg.zoneId % 1000:
                    # sz bldg, ignore
                    continue
                    
                if bldg.zoneId // 1000 == 7:
                    # ff bldg, ignore now
                    continue
                    
                data = bldg.getPickleData()

                dg.addString("block")
                dg.addUint16(bldg.zoneId - (bldg.zoneId % 1000))
                dg.addUint16(bldg.zoneId)
                dg.addUint8(int(data['block']))
                dg.addString(data['state'].lower())
                dg.addUint8(ord(data['track']))
                dg.addUint8(int(data['difficulty']))
                dg.addInt8(int(data['numFloors']))
                
                self.bldgs.add(bldg)
                    
        self.writeInvasion(dg)                    
        self.sendUpdate("setShardData", [dg.getMessage()])
                            
        self.air.notify.info("Sent shard data to UD")
        taskMgr.doMethodLater(60, self.__timeout, 'UD-sync-timeout')
Exemplo n.º 14
0
    def d_updateBlock(self, bldg):
        if not bldg in self.bldgs:
            return

        data = bldg.getPickleData()

        dg = PyDatagram()
        dg.addUint16(bldg.zoneId - (bldg.zoneId % 1000))
        dg.addUint16(bldg.zoneId)
        dg.addUint8(int(data['block']))

        state = data['state'].lower()

        if state.startswith('clear'):
            state = 'cogdo' if state.endswith('cogdo') else 'suit'

        dg.addString(state)

        dg.addUint8(ord(data['track']))
        dg.addUint8(int(data['difficulty']))
        dg.addInt8(int(data['numFloors']))

        self.sendUpdate("doUpdate", ["block", dg.getMessage()])
 def d_updateBlock(self, bldg):
     if not bldg in self.bldgs:
         return
         
     data = bldg.getPickleData()
     
     dg = PyDatagram()
     dg.addUint16(bldg.zoneId - (bldg.zoneId % 1000))
     dg.addUint16(bldg.zoneId)
     dg.addUint8(int(data['block']))
     
     state = data['state'].lower()
     
     if state.startswith('clear'):
         state = 'cogdo' if state.endswith('cogdo') else 'suit'
         
     dg.addString(state)
     
     dg.addUint8(ord(data['track']))
     dg.addUint8(int(data['difficulty']))
     dg.addInt8(int(data['numFloors']))
     
     self.sendUpdate("doUpdate", ["block", dg.getMessage()])
Exemplo n.º 16
0
    def partyListScreen(self):

        myPyDatagram = PyDatagram()
        myPyDatagram.addUint8(GET_PARTIES)
        self.cWriter.send(myPyDatagram, self.myConnection)
Exemplo n.º 17
0
 def onMoveClicked(self, charid):
     myPyDatagram = PyDatagram()
     myPyDatagram.addUint8(GET_WALKABLES)
     myPyDatagram.addString(charid)
     self.cWriter.send(myPyDatagram, self.myConnection)
Exemplo n.º 18
0
 def directionChosen(self, charid, direction):
     myPyDatagram = PyDatagram()
     myPyDatagram.addUint8(WAIT)
     myPyDatagram.addString(charid)
     myPyDatagram.addUint8(direction)
     self.cWriter.send(myPyDatagram, self.myConnection)
Exemplo n.º 19
0
    def processData(self, datagram):
        iterator = PyDatagramIterator(datagram)
        source = datagram.getConnection()
        msgID = iterator.getUint8()
        
        if msgID == LOGIN_MESSAGE:

            login = iterator.getString()
            password = iterator.getString()

            if login != password:
                myPyDatagram = PyDatagram()
                myPyDatagram.addUint8(LOGIN_FAIL)
                myPyDatagram.addString('Wrong credentials.')
                self.cWriter.send(myPyDatagram, source)
            elif self.sessions.has_key(source):
                myPyDatagram = PyDatagram()
                myPyDatagram.addUint8(LOGIN_FAIL)
                myPyDatagram.addString('Already logged in.')
                self.cWriter.send(myPyDatagram, source)
            elif login in self.players.keys():
                myPyDatagram = PyDatagram()
                myPyDatagram.addUint8(LOGIN_FAIL)
                myPyDatagram.addString('Username already in use.')
                self.cWriter.send(myPyDatagram, source)
            else:
                self.players[login] = source
                self.sessions[source] = {}
                self.sessions[source]['login'] = login
                print login, 'logged in.'
                myPyDatagram = PyDatagram()
                myPyDatagram.addUint8(LOGIN_SUCCESS)
                self.cWriter.send(myPyDatagram, source)
        
        elif msgID == CREATE_PARTY:

            name = iterator.getString()
            mapname = iterator.getString()
            
            party = {
                'name': name,
                'mapname': mapname,
                'map' : Map.load(mapname),
                'chars': {},
                'log': {},
                'creator': self.sessions[source]['login'],
                'players': [],
            }
            party['players'].append(self.sessions[source]['login'])

            self.parties[name] = party
            self.sessions[source]['party'] = name
            self.sessions[source]['player'] = len(party['players'])-1
            
            self.updateAllPartyLists()
            
            print self.sessions[source]['login'], "created the party", name, "using the map", mapname
            myPyDatagram = PyDatagram()
            myPyDatagram.addUint8(PARTY_CREATED)
            myPyDatagram.addString32(json.dumps(party))
            self.cWriter.send(myPyDatagram, source)

        elif msgID == GET_MAPS:
            self.playersinlobby.remove(source)

            mapnames = map( lambda m: m.split('.')[0], os.listdir(GAME+'/maps'))

            maps = []
            for mapname in mapnames:
                mp = Map.load(mapname)
                del mp['tiles']
                maps.append(mp)

            myPyDatagram = PyDatagram()
            myPyDatagram.addUint8(MAP_LIST)
            myPyDatagram.addString(json.dumps(maps))
            self.cWriter.send(myPyDatagram, source)
        
        elif msgID == GET_PARTIES:
            self.playersinlobby.append(source)

            parties = deepcopy(self.parties)
            for party in parties.values():
                del party['map']['tiles']

            myPyDatagram = PyDatagram()
            myPyDatagram.addUint8(PARTY_LIST)
            myPyDatagram.addString32(json.dumps(parties))
            self.cWriter.send(myPyDatagram, source)
        
        elif msgID == JOIN_PARTY:
        
            name = iterator.getString()
            party = self.parties[name]
            
            if len(party['players']) >= len(party['map']['chartiles']):
                parties = deepcopy(self.parties)
                for party in parties.values():
                    del party['map']['tiles']
                myPyDatagram = PyDatagram()
                myPyDatagram.addUint8(PARTY_JOIN_FAIL)
                myPyDatagram.addString('Party '+name+' is full.')
                myPyDatagram.addString32(json.dumps(parties))
                self.cWriter.send(myPyDatagram, source)
            else:
                party['players'].append(self.sessions[source]['login'])
                self.sessions[source]['party'] = name
                self.sessions[source]['player'] = len(party['players'])-1
                self.playersinlobby.remove(source)

                print self.sessions[source]['login'], "joined the party", name
                myPyDatagram = PyDatagram()
                myPyDatagram.addUint8(PARTY_JOINED)
                myPyDatagram.addString32(json.dumps(party))
                self.cWriter.send(myPyDatagram, source)
                
                for teamid,team in enumerate(party['map']['chartiles']):
                    for chartile in team:
                        x = int(chartile['x'])
                        y = int(chartile['y'])
                        z = int(chartile['z'])
                        direction = int(chartile['direction'])
                        charid = str(x)+str(y)+str(z)
                        party['map']['tiles'][x][y][z]['char'] = charid
                        party['chars'][charid] = Character.Random(charid, teamid, direction)
                
                if len(party['players']) == len(party['map']['chartiles']):
                    for player in party['players']:
                        myPyDatagram = PyDatagram()
                        myPyDatagram.addUint8(START_BATTLE)
                        myPyDatagram.addString32(json.dumps(party))
                        self.cWriter.send(myPyDatagram, self.players[player])

                self.updateAllPartyLists()

        elif msgID == UPDATE_PARTY:

            party = self.parties[self.sessions[source]['party']]
            chars = party['chars']
            
            aliveteams = {}
            for charid in chars.keys():
                if chars[charid]['hp'] > 0:
                    if aliveteams.has_key(chars[charid]['team']):
                        aliveteams[chars[charid]['team']] = aliveteams[chars[charid]['team']] + 1
                    else:
                        aliveteams[chars[charid]['team']] = 1
            if len(aliveteams) < 2:
                for client in party['players']:
                    if source == self.players[client]:
                        myPyDatagram = PyDatagram()
                        myPyDatagram.addUint8(BATTLE_COMPLETE)
                        self.cWriter.send(myPyDatagram, self.players[client])
                    else:
                        myPyDatagram = PyDatagram()
                        myPyDatagram.addUint8(GAME_OVER)
                        self.cWriter.send(myPyDatagram, self.players[client])
                del self.parties[self.sessions[source]['party']]
                self.updateAllPartyLists()
                return

            for charid in chars.keys():
                party['yourturn'] = int(chars[charid]['team']) == int(self.sessions[source]['player'])
                if chars[charid]['active']:
                    myPyDatagram = PyDatagram()
                    myPyDatagram.addUint8(PARTY_UPDATED)
                    myPyDatagram.addBool(party['yourturn'])
                    myPyDatagram.addString32(json.dumps(chars))
                    self.cWriter.send(myPyDatagram, source)
                    return
            
            while True:
                for charid in chars.keys():
                    char = chars[charid]
                    char['ct'] = char['ct'] + char['speed']
                    if char['ct'] >= 100:
                        if char['hp'] > 0:
                            char['active'] = True
                            char['canmove'] = True
                            char['canact'] = True
                            party['yourturn'] = int(chars[charid]['team']) == int(self.sessions[source]['player'])
                            myPyDatagram = PyDatagram()
                            myPyDatagram.addUint8(PARTY_UPDATED)
                            myPyDatagram.addBool(party['yourturn'])
                            myPyDatagram.addString32(json.dumps(chars))
                            self.cWriter.send(myPyDatagram, source)
                            return
                        else:
                            char['ct'] = 0

        elif msgID == GET_WALKABLES:
        
            charid = iterator.getString()
            party = self.parties[self.sessions[source]['party']]
            walkables = Move.GetWalkables( party, charid )
            
            myPyDatagram = PyDatagram()
            myPyDatagram.addUint8(WALKABLES_LIST)
            myPyDatagram.addString(charid)
            myPyDatagram.addString(json.dumps(walkables))
            self.cWriter.send(myPyDatagram, source)
        
        elif msgID == GET_PASSIVE_WALKABLES:
        
            charid = iterator.getString()
            party = self.parties[self.sessions[source]['party']]
            walkables = Move.GetWalkables( party, charid )
            
            myPyDatagram = PyDatagram()
            myPyDatagram.addUint8(PASSIVE_WALKABLES_LIST)
            myPyDatagram.addString(charid)
            myPyDatagram.addString(json.dumps(walkables))
            self.cWriter.send(myPyDatagram, source)
        
        elif msgID == GET_PATH:
        
            charid = iterator.getString()
            x2 = iterator.getUint8()
            y2 = iterator.getUint8()
            z2 = iterator.getUint8()
            
            party = self.parties[self.sessions[source]['party']]
            
            orig = Character.Coords( party, charid )
            x1 = orig[0]
            y1 = orig[1]
            z1 = orig[2]
            
            path = Move.GetPath( party, charid, x1, y1, z1, x2, y2, z2 )
            
            myPyDatagram = PyDatagram()
            myPyDatagram.addUint8(PATH)
            myPyDatagram.addString(charid)
            myPyDatagram.addString(json.dumps(orig))
            myPyDatagram.addUint8(party['chars'][charid]['direction'])
            myPyDatagram.addString(json.dumps((x2,y2,z2)))
            myPyDatagram.addString(json.dumps(path))
            self.cWriter.send(myPyDatagram, source)
        
        elif msgID == MOVE_TO:
            
            charid = iterator.getString()
            x2 = iterator.getUint8()
            y2 = iterator.getUint8()
            z2 = iterator.getUint8()
            
            party = self.parties[self.sessions[source]['party']]
            
            orig = Character.Coords( party, charid )
            x1 = orig[0]
            y1 = orig[1]
            z1 = orig[2]

            path = Move.GetPath( party, charid, x1, y1, z1, x2, y2, z2 )
            walkables = Move.GetWalkables( party, charid )

            del party['map']['tiles'][x1][y1][z1]['char']
            party['map']['tiles'][x2][y2][z2]['char'] = charid

            party['chars'][charid]['direction'] = Move.GetNewDirection( x1, y1, x2, y2 )
            party['chars'][charid]['canmove'] = False
            
            myPyDatagram = PyDatagram()
            myPyDatagram.addUint8(MOVED)
            myPyDatagram.addString(charid)
            myPyDatagram.addUint8(x2)
            myPyDatagram.addUint8(y2)
            myPyDatagram.addUint8(z2)
            self.cWriter.send(myPyDatagram, source)
            
            for playerid,playerlogin in enumerate(party['players']):
                if playerid != self.sessions[source]['player']:
                    myPyDatagram = PyDatagram()
                    myPyDatagram.addUint8(MOVED_PASSIVE)
                    myPyDatagram.addString(charid)
                    myPyDatagram.addString(json.dumps(walkables))
                    myPyDatagram.addString(json.dumps(path))
                    self.cWriter.send(myPyDatagram, self.players[playerlogin])

        elif msgID == WAIT:
        
            charid = iterator.getString()
            direction = iterator.getUint8()
            
            party = self.parties[self.sessions[source]['party']]
            char = party['chars'][charid]

            if char['canmove'] and char['canact']:
                char['ct'] = char['ct'] - 60
            elif char['canmove'] or char['canact']:
                char['ct'] = char['ct'] - 80
            else:
                char['ct'] = char['ct'] - 100

            char['direction'] = direction

            char['active'] = False
            char['canmove'] = False
            char['canact'] = False
            
            myPyDatagram = PyDatagram()
            myPyDatagram.addUint8(WAIT_SUCCESS)
            self.cWriter.send(myPyDatagram, source)

            for playerid,playerlogin in enumerate(party['players']):
                if playerid != self.sessions[source]['player']:
                    myPyDatagram = PyDatagram()
                    myPyDatagram.addUint8(WAIT_PASSIVE)
                    myPyDatagram.addString(charid)
                    myPyDatagram.addUint8(direction)
                    self.cWriter.send(myPyDatagram, self.players[playerlogin])

        elif msgID == GET_ATTACKABLES:
        
            charid = iterator.getString()
            
            party = self.parties[self.sessions[source]['party']]
            
            attackables = Attack.GetAttackables( party, charid )
            
            myPyDatagram = PyDatagram()
            myPyDatagram.addUint8(ATTACKABLES_LIST)
            myPyDatagram.addString(charid)
            myPyDatagram.addString(json.dumps(attackables))
            self.cWriter.send(myPyDatagram, source)

        elif msgID == ATTACK:
        
            charid1 = iterator.getString()
            charid2 = iterator.getString()
            party = self.parties[self.sessions[source]['party']]
            char1 = party['chars'][charid1]
            char2 = party['chars'][charid2]
            
            damages = char1['pa'] * char1['br'] / 100 * char1['pa']
            
            char2['hp'] = char2['hp'] - damages*4
            if char2['hp'] < 0:
                char2['hp'] = 0
            
            char1['canact'] = False
            
            myPyDatagram = PyDatagram()
            myPyDatagram.addUint8(ATTACK_SUCCESS)
            myPyDatagram.addString(charid1)
            myPyDatagram.addString(charid2)
            myPyDatagram.addUint8(damages)
            self.cWriter.send(myPyDatagram, source)
            
            attackables = Attack.GetAttackables( party, charid1 )
            
            for playerid,playerlogin in enumerate(party['players']):
                if playerid != self.sessions[source]['player']:
                    myPyDatagram = PyDatagram()
                    myPyDatagram.addUint8(ATTACK_PASSIVE)
                    myPyDatagram.addString(charid1)
                    myPyDatagram.addString(charid2)
                    myPyDatagram.addUint8(damages)
                    myPyDatagram.addString(json.dumps(attackables))
                    self.cWriter.send(myPyDatagram, self.players[playerlogin])
Exemplo n.º 20
0
 def turn(self):
     myPyDatagram = PyDatagram()
     myPyDatagram.addUint8(UPDATE_PARTY)
     self.cWriter.send(myPyDatagram, self.myConnection)
Exemplo n.º 21
0
 def joinParty(self, name):
     
     myPyDatagram = PyDatagram()
     myPyDatagram.addUint8(JOIN_PARTY)
     myPyDatagram.addString(name)
     self.cWriter.send(myPyDatagram, self.myConnection)
Exemplo n.º 22
0
 def setupAttackables(self, charid):
     myPyDatagram = PyDatagram()
     myPyDatagram.addUint8(GET_ATTACKABLES)
     myPyDatagram.addString(charid)
     self.cWriter.send(myPyDatagram, self.myConnection)
Exemplo n.º 23
0
    def mapChooserScreen(self):

        myPyDatagram = PyDatagram()
        myPyDatagram.addUint8(GET_MAPS)
        self.cWriter.send(myPyDatagram, self.myConnection)