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)
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)
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
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)
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()
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)
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()
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)
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
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()
def sendChat(self, sender, msg): builder = XMLBuilder("CHAT") builder.name(sender) builder.comment(msg) self.broadXml(builder)
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()