class LunarLanderServer(Server): channelClass = TCPConnector ActivePlayers = 0 def __init__(self, *args, **kwargs): self.id = 0 Server.__init__(self, *args, **kwargs) self.players = WeakKeyDictionary() self.service = BusinessService() print 'Server launched' def NextId(self): self.id += 1 return self.id def Connected(self, channel, addr): self.CheckGameStart(channel) def CheckGameStart(self, player): print "New Player" + str(player.addr) self.players[player] = True # TODO: PLayer creation and data transmission players = self.GetPLayers() print "Current players:", players print "ActivePlayers:" , self.ActivePlayers print "Sending acknowledge to the new player" player.Send({"action": "acknowledge", "players": players}) #acknowledges to the player it is connected to the server successfully if self.ActivePlayers == 2: print "Sending Game Start for all player" self.SendStartGame() self.SendLeaderBoard() elif self.ActivePlayers > 2: self.SendLeaderBoard() else: print "Waiting for more than one player to start." def GetPLayers(self): players = [] for p in self.players: playerObj = {"id" :p.id, "spaceship": p.spaceship.getSelfStateObj() } players.append(playerObj) return players def DelPlayer(self, player): print "Deleting Player" + str(player.addr) del self.players[player] #self.SendPlayers() def SendLeaderBoard(self): print "Sending leaderboard to all" new_data = {"action":"response"} new_data.update({PRINT_LEADERBOARD: self.getLeaderboard()}) new_data.update({"response_action":PRINT_LEADERBOARD}) #send this new information to all clients, they will just print this on their screens self.SendToAll(new_data) def SendStartGame(self): # TODO: Transmit data to players/clients players = self.GetPLayers() self.SendToAll({"action": "StartGame", "players": players}) def SendToAll(self, data): [p.Send(data) for p in self.players] def Launch(self): while True: self.Pump() sleep(0.0001) def getLeaderboard(self): leaderboard = Leaderboard() #PlayerInfo = namedtuple('PlayerInfo', 'name score') for p in self.players: row = LeaderboardEntry(p.id, p.spaceship.score) leaderboard.addEntry(row) leaderboard.entries.sort(key=self.getPlayerScore, reverse=True) #print (self.leaderboardToString(leaderboard)) data = leaderboard.getSelfStateObj() print "data is ", jsonpickle.encode(leaderboard) return jsonpickle.encode(leaderboard) def canBuyFuel(self): return self.service.canBuyFuel() def buyFuel(self): return self.service.buyFuel() def getGameScore(self): return self.service.getGameScore() def getGridStatus(self): return self.service.getGridStatus() def canAssignPlot(self, data, spaceship): return self.service.canAssignPlot(data[PLOT_TYPE_STRING], spaceship) def getPlot(self, data): self.service.assignPlot(data[PLOT_TYPE_STRING]) return self.getGridStatus() def freePlot(self,type): self.service.freePlot(type) return self.getGridStatus() def conquerPlot(self, data): return self.service.conquerPlot(data) def loadMineral(self, data, spaceship): return self.service.loadMineral(data, spaceship) def subtractPlayer(self): self.ActivePlayers = self.ActivePlayers - 1 def addPlayer(self): print "adding player" self.ActivePlayers = self.ActivePlayers + 1 def updateGameScore(self,spaceship): return self.service.updateGameScore(spaceship) def checkGoalAccomplished(self): return self.service.checkGoalAccomplished() def canRefuelSpaceship(self, data): if self.service.getBaseStationFuelLevel()>0: return True else: return False def getPlayerScore(self, pInfo): return pInfo.score def playerInfoToString(self,pInfo): return pInfo.name + " : " + str(pInfo.score) def leaderboardToString(self, leaderboard): returnString = "player : score \n" returnString += "*"*10 for pInfo in leaderboard: returnString += "\n" + self.playerInfoToString(pInfo) returnString += "\n" + "*"*10 return returnString def withdrawFuel(self,data): spaceshipFuelLevel = 0#data.get(SPACESHIP_FUEL_KEY,0) # default is 0 print "inside withdrawfuel, current spaceship fuel level ", spaceshipFuelLevel return self.service.withdrawFuel(SPACESHIP_FUEL_CAPACITY-spaceshipFuelLevel) def getBaseStationFuelLevel(self): return self.service.getBaseStationFuelLevel()