Example #1
0
    def exitGame(self, player):
        if player not in self.players:
            return

        #TODO: Ver como o server original trata qnd um player sai durante uma partida 1x1

        self.players.remove(player)
        if player in self.attackOrderList:
            self.attackOrderList.remove(player)

        builder = XMLBuilder("REMOVE_PLAYER")
        builder.player.name(player.name)
        self.broadXml(builder)

        builder.roomID(str(self.id))
        self.server.lobbyBroadXml(builder)
Example #2
0
    def addUser(self, user):
        builder = XMLBuilder("ENTER")
        bRoom = builder.room
        for user_ in self.users:
            bUser = bRoom.user
            bUser.name(user_.name)
        bRoom.name(self.name)
        bRoom.playersLimit(str(self.playersLimit))
        if self.fast:
            bRoom.isFast  # <isFast />
        bGame = bRoom.game  # <game />
        if len(self.players) > 0:
            bPlayers = bGame.players
            for player in self.players:
                bPlayer = bPlayers.player
                bPlayer.name(player.name)
                bPlayer.team(player.team)
                if player.ready:
                    bPlayer.isReady  # <isReady />
                if self.playing and player.dead:
                    bPlayer.isDead  # <isDead />
                bPlayer.power(key="HP")(str(player.hp))
                bPlayer.power(key="MP")(str(player.mp))
                bPlayer.power(key="YEN")(str(player.yen))
        user.sendXml(builder)

        user.state = "ROOM"
        self.users.append(user)

        builder = XMLBuilder("ADD_USER")
        builder.user.name(user.name)
        self.broadXml(builder)

        # Broadcast to Lobby
        bRoom = builder.room
        bRoom.name(self.name)
        bRoom.id(str(self.id))
        bRoom.language(self.language)
        bRoom.playersLimit(str(self.playersLimit))
        if self.fast:
            bRoom.isFast(str(self.fast))
        bRoom.time(str(self.time))
        self.server.lobbyBroadXml(builder)
Example #3
0
    def enterGame(self, user, team):
        player = self.getPlayer(user.name)

        if player is None:
            player = Player(user, user.name, team)
            self.players.append(player)
        else:
            player.team = team

        builder = XMLBuilder("ADD_PLAYER")
        bPlayer = builder.player
        bPlayer.name(player.name)
        bPlayer.team(player.team)
        self.broadXml(builder)

        # Broadcast to Lobby
        builder.roomID(str(self.id))
        self.server.lobbyBroadXml(builder)

        return player
Example #4
0
    def connectionLost(self, reason):
        if self.state != "UNKNOWN":
            self.server.users.remove(self)

            builder = XMLBuilder("REMOVE_USER")
            builder.user.name(self.name)
            self.server.lobbyBroadXml(builder)

        if self.room is not None:
            if self.player is not None:
                self.room.exitGame(self.player)
            self.room.removeUser(self)
Example #5
0
    def startInning(self, attacker):
        self.turn.new()
        self.turn.attacker = attacker

        self.inningCount += 1

        builder = XMLBuilder("START_INNING")
        builder.attacker.name(attacker.name)
        self.broadXml(builder)

        if isinstance(attacker, Bot):
            self.turn.newAttack(attacker, *attacker.on_turn())
            return self.turn.doAttack()
Example #6
0
    def nextInning(self):
        self.attackOrder = (self.attackOrder + 1) % len(self.players)
        if self.attackOrder == 0:
            self.attackOrderList = list(self.players)
            random.shuffle(self.attackOrderList)

            builder = XMLBuilder("RESET_ATTACK_ORDER")
            self.broadXml(builder)

        next = self.attackOrderList[self.attackOrder]
        while next.dead:
            self.attackOrder = (self.attackOrder + 1) % len(self.players)
            next = self.attackOrderList[self.attackOrder]

        return self.startInning(next)
Example #7
0
    def playerReady(self, playerName):
        builder = XMLBuilder("ADD_PLAYER")
        bPlayer = builder.player
        bPlayer.name(playerName)
        bPlayer.isReady
        self.broadXml(builder)

        if len(self.players) < 2:
            return

        for player in self.players:
            if not player.ready:
                return

        self.startGame()
Example #8
0
    def removeUser(self, user):
        if user not in self.users:
            return

        self.users.remove(user)

        if len(self.users) == 0:
            # Destroy Room
            del self.server.rooms[self.id]
        else:
            builder = XMLBuilder("REMOVE_USER")
            builder.name(user.name)
            self.broadXml(builder)

        # Broadcast to Lobby
        builder = XMLBuilder("REMOVE_USER")
        builder.roomID(str(self.id))
        builder.user.name(user.name)
        self.server.lobbyBroadXml(builder)
Example #9
0
    def startGame(self):
        assert len(self.players) > 0, "StartGame called without players."

        self.inningCount = -1
        self.playing = True
        for player in self.players:
            player.dead = False
            player.deal = 10
            player.hp = 40
            player.mp = 10
            player.yen = 20
            player.resetItems()

        self.attackOrder = -1

        builder = XMLBuilder("START_GAME")
        self.broadXml(builder)

        while self.endInning():
            pass
Example #10
0
    def parseXml(self, xml):
        xmldict = xmltodict(xml)
        request = xmldict.keys()[0]
        xmldict = xmldict.values()[0] if xmldict.values()[0] != None else dict()

        #print repr(xml)
        #print "RECV ("+self.name+"):", request, xmldict

        #<player><name>Igoor</name><team>SINGLE</team><isReady/><power key="HP">90</power><power key="MP">90</power><power key="YEN">90</power></player><player><name>Sinbad</name><team>SINGLE</team><isReady/><power key="HP">40</power><power key="MP">10</power><power key="YEN">20</power></player><player><name>Santa Claus</name><team>SINGLE</team><isReady/><power key="HP">40</power><power key="MP">10</power><power key="YEN">20</power></player><player><name>Odin</name><team>SINGLE</team><isReady/><power key="HP">40</power><power key="MP">10</power><power key="YEN">20</power></player></players><privatePlayer/></game></room></ENTER>""" + chr(0))

        if request == "ERROR":
            print request, xmldict

        if request == "LOGIN":
            self.name = xmldict["name"]
            self.ipAddress = xmldict["ipAddress"]
            self.language = xmldict["language"]
            self.oneTimeID = xmldict["oneTimeID"]

            if self.server.getUser(self.name):
                self.transport.loseConnection()
                return

            if self.server.mode == "FREEFIGHT":
                self.server.gotoLobby(self)
                self.server.users.append(self)

                builder = XMLBuilder("ADD_USER")
                builder.user.name(self.name)
                for user in self.server.users:
                    if user.state != "LOBBY":
                        continue
                    user.sendXml(builder)
            else:
                self.transport.write("""<?xml version="1.0" encoding="UTF-8" standalone="no"?><ENTER><room><game><players><player><name>Igoor</name><team>SINGLE</team><isReady/><power key="HP">90</power><power key="MP">90</power><power key="YEN">90</power></player><player><name>Sinbad</name><team>SINGLE</team><isReady/><power key="HP">40</power><power key="MP">10</power><power key="YEN">20</power></player><player><name>Santa Claus</name><team>SINGLE</team><isReady/><power key="HP">40</power><power key="MP">10</power><power key="YEN">20</power></player><player><name>Odin</name><team>SINGLE</team><isReady/><power key="HP">40</power><power key="MP">10</power><power key="YEN">20</power></player></players><privatePlayer/></game></room></ENTER>""" + chr(0))
                self.transport.write("""<?xml version="1.0" encoding="UTF-8" standalone="no"?><ADD_USER><user><name>Igoor</name></user></ADD_USER><?xml version="1.0" encoding="UTF-8" standalone="no"?><START_GAME/><?xml version="1.0" encoding="UTF-8" standalone="no"?><RESET_ATTACK_ORDER/><?xml version="1.0" encoding="UTF-8" standalone="no"?><DEAL><item>220</item></DEAL><?xml version="1.0" encoding="UTF-8" standalone="no"?><DEAL><item>190</item></DEAL><?xml version="1.0" encoding="UTF-8" standalone="no"?><DEAL><item>150</item></DEAL><?xml version="1.0" encoding="UTF-8" standalone="no"?><DEAL><item>126</item></DEAL><?xml version="1.0" encoding="UTF-8" standalone="no"?><DEAL><item>104</item></DEAL><?xml version="1.0" encoding="UTF-8" standalone="no"?><DEAL><item>4</item></DEAL><?xml version="1.0" encoding="UTF-8" standalone="no"?><DEAL><item>77</item></DEAL><?xml version="1.0" encoding="UTF-8" standalone="no"?><DEAL><item>187</item></DEAL><?xml version="1.0" encoding="UTF-8" standalone="no"?><DEAL><item>72</item></DEAL><?xml version="1.0" encoding="UTF-8" standalone="no"?><DEAL><item>41</item></DEAL><?xml version="1.0" encoding="UTF-8" standalone="no"?><END_INNING/><?xml version="1.0" encoding="UTF-8" standalone="no"?><START_INNING><attacker><name>Sinbad</name></attacker></START_INNING><?xml version="1.0" encoding="UTF-8" standalone="no"?><COMMAND><piece><item>48</item></piece><piece><item>44</item></piece><commander><name>Sinbad</name></commander><target><name>Santa Claus</name></target></COMMAND><?xml version="1.0" encoding="UTF-8" standalone="no"?><COMMAND><piece><item>19</item></piece><piece><item>11</item></piece></COMMAND><?xml version="1.0" encoding="UTF-8" standalone="no"?><END_INNING/><?xml version="1.0" encoding="UTF-8" standalone="no"?><START_INNING><attacker><name>Igoor</name></attacker></START_INNING>""".replace("<?xml", "\0<?xml") + chr(0))

        if request == "ENTER":
            if "name" in xmldict:
                room = self.server.createRoom(xmldict["name"])
                room.language = self.language
                room.playersLimit = int(xmldict["playersLimit"])
                room.fast = "isFast" in xmldict
                room.time = 1475196662616
            elif "id" in xmldict:
                room = self.server.getRoom(int(xmldict["id"]))

            if room is not None:
                self.room = room
                self.room.addUser(self)

        if request == "EXIT":
            if self.room is not None:
                self.room.removeUser(self)
                if self.player is not None:
                    self.room.exitGame(self.player)

                self.room = None
                self.player = None

                self.server.gotoLobby(self)

        if request == "CHAT":
            if self.room is None:
                return
            if xmldict["comment"] == "go":
                self.room.startGame()
            if xmldict["comment"] == "die":
                self.player.hp = 0
            if xmldict["comment"] == "sdie":
                builder = XMLBuilder("DIE")
                builder.player.name(self.name)
                self.sendXml(builder)
            if xmldict["comment"].startswith("fnd"):
                self.room.forceNextDeal = int(xmldict["comment"].split(" ")[1])
                
            self.room.sendChat(self.name, xmldict["comment"])

        if request == "ENTER_GAME":
            if self.room is None:
                return
            self.player = self.room.enterGame(self, xmldict["team"])

        if request == "EXIT_GAME":
            if self.room is None:
                return
            self.room.exitGame(self.player)
            self.player = None

        if request == "READY":
            if self.room is None:
                return
            self.player.ready = "isReady" in xmldict
            self.room.playerReady(self.player.name)

        if request == "BUY":
            if self.room is None:
                return
            response = "doBuy" in xmldict
            self.room.turn.playerBuyResponse(self.player, response)

        if request == "COMMAND":
            if self.room is None:
                return
            
            piece = xmldict["piece"] if "piece" in xmldict else []
            target = xmldict["@target"] if "@target" in xmldict else None

            if type(piece) is not list:
                piece = [piece]

            endInning = False

            piece = map(lambda x: self.server.itemManager.getItem(int(x.values()[0])), piece)
            if target is not None:
                endInning = self.room.turn.attackerCommand(self.player, piece, self.room.getPlayer(target))
            else:
                endInning = self.room.turn.defenderCommand(self.player, piece)

            while endInning:
                endInning = self.room.endInning()
Example #11
0
 def sendChat(self, sender, msg):
     builder = XMLBuilder("CHAT")
     builder.name(sender)
     builder.comment(msg)
     self.broadXml(builder)
Example #12
0
    def endInning(self):
        for player in self.players:
            if player.hp <= 0 and not player.dead:
                if self.getAlivesCount() >= 2 and player.hasItem(
                        244):  # REVIVE
                    self.turn.playerDyingAttack(
                        player, self.server.itemManager.getItem(244))
                elif self.getAlivesCount() >= 2 and player.hasItem(
                        117):  # DYING_ATTACK
                    self.turn.playerDyingAttack(
                        player, self.server.itemManager.getItem(117))
                else:
                    player.dead = True
                    builder = XMLBuilder("DIE")
                    builder.player.name(player.name)
                    self.broadXml(builder)

        if not self.turn.attackQueue.empty():
            return self.turn.doAttack()

        print "Round", self.inningCount + 1, "ended, starting new round.."

        for player in self.players:
            print player.name, "HP:", player.hp, "MP:", player.mp, "YEN:", player.yen
            if player.deal > 0 and not player.dead:
                if player.deal == 10:
                    items = self.server.itemManager.getProbRandomItems(9)  # 10
                    for item in items:
                        player.dealItem(item.id)
                #    player.dealItem(220)
                #    player.dealItem(221)
                #    player.dealItem(237)
                #    player.dealItem(243)
                #    player.dealItem(39) #244
                #    #player.dealItem(20)
                #    #player.dealItem(233)
                #    #player.dealItem(39)
                #    player.dealItem(63)
                #    player.dealItem(233)
                #    player.dealItem(242)
                #    player.dealItem(244) #212 = Arco da morte, 244 = Reviver
                #    player.dealItem(191) #194 = Take Yen, 188 = FOG, 191 = Glory ring
                    player.dealItem(190)
                else:
                    if self.forceNextDeal is None:
                        items = self.server.itemManager.getProbRandomItems(
                            player.deal)
                        for item in items:
                            player.dealItem(item.id)
                    else:
                        player.dealItem(self.forceNextDeal)
                player.deal = 0

        if self.forceNextDeal is not None:
            self.forceNextDeal = None

        builder = XMLBuilder("END_INNING")
        self.broadXml(builder)

        if self.getAlivesCount() <= 1:
            self.ended = True
            builder = XMLBuilder("END_GAME")
            self.broadXml(builder)
            return False
        else:
            return self.nextInning()