def takeOverAIPlayer(self, sid, playerID): log.debug('Creating new player in session', sid) session = self.clientMngr.getSession(sid) log.debug('Creating new player with CID', session.cid) universe = self.db[OID_UNIVERSE] log.debug('Creating transaction') tran = Transaction(self, session.cid, session) # create player log.debug("Morphing AI player", playerID) player = self.db[playerID] if not (player.type == T_AIPLAYER and player.planets): raise GameException('No such starting position.') player.type = T_PLAYER self.cmdPool[T_PLAYER].upgrade(tran, player) self.cmdPool[T_PLAYER].update(tran, player) # remove AI player account from game and its record from the AIlist self.clientMngr.removeAiAccount(player.login) aiList = AIList(self.configDir) aiList.remove(player.login) # reregister player self.removePlayer(player.oid) player.name = session.nick player.login = session.login self.registerPlayer(player.login, player, player.oid) # reset relations player.diplomacyRels.clear() # add player to the universe universe.players.append(playerID) # make sure, there is something useable on the home planet planet = self.db[player.planets[0]] hasOutpost = False for struct in planet.slots: if struct[STRUCT_IDX_TECHID] == Tech.PRIMITIVEOUTPOST: hasOutpost = True if not hasOutpost: # find something to replace finished = False for property in ("prodSci", "prodProd", "prodBio"): for struct in planet.slots: tech = Rules.techs[struct[STRUCT_IDX_TECHID]] if getattr(tech, property) > 0: struct[STRUCT_IDX_TECHID] = Tech.PRIMITIVEOUTPOST struct[STRUCT_IDX_HP] = tech.maxHP finished = True break if finished: break if not finished: # replace last structure struct = planet.slots[-1] struct[STRUCT_IDX_TECHID] = Tech.PRIMITIVEOUTPOST struct[STRUCT_IDX_HP] = tech.maxHP # save game info self.generateGameInfo() return player.oid, None
def takeOverPirate(self, sid, playerID, vipPassword): # limit this now only to the qark session = self.clientMngr.getSession(sid) if vipPassword != self.config.vip.password: raise SecurityException('You cannot issue this command.') # log.debug('Creating pirate in session', sid) session = self.clientMngr.getSession(sid) log.debug('Creating pirate with CID', session.cid) universe = self.db[OID_UNIVERSE] log.debug('Creating transaction') tran = Transaction(self, session.cid, session) # create player #log.debug("Morphing Pirate player", playerID) player = self.db[playerID] log.debug("Player type", player.type) if player.type != T_AIPIRPLAYER: raise GameException('No such starting position.') player.type = T_PIRPLAYER self.cmdPool[T_PIRPLAYER].upgrade(tran, player) self.cmdPool[T_PIRPLAYER].update(tran, player) # remove AI player account from game and its record from the AIlist self.clientMngr.removeAiAccount(player.login) aiList = AIList(self.configDir) aiList.remove(player.login) # reregister player self.removePlayer(player.oid) player.fullName = "Pirate %s" % session.nick player.name = session.nick player.login = session.login self.registerPlayer(player.login, player, player.oid) # add player to the universe universe.players.append(playerID) # initial scan scannerPwr = Rules.techs[9002].scannerPwr for planetID in player.planets: planet = self.db[planetID] system = self.db[planet.compOf] system.scannerPwrs[player.oid] = scannerPwr log.debug('Processing scan phase') galaxy = tran.db[player.galaxies[0]] self.cmdPool[T_GALAXY].processSCAN2Phase(tran, galaxy, None) # save game info self.generateGameInfo() return player.oid, None
def delete(self, tran, obj): # check whether it is AI or normal player if obj.type in AI_PLAYER_TYPES: # remove AI account from the game, and record in the AI list log.debug("Removing AI account from the AI list", obj.oid) tran.gameMngr.clientMngr.removeAiAccount(obj.login) aiList = AIList(tran.gameMngr.configDir) aiList.remove(obj.login) log.debug("Deleting player", obj.oid) # delete relations for playerID in tran.db[OID_UNIVERSE].players: player = tran.db[playerID] self.cmd(player).deleteDiplomacyWith(tran, player, obj.oid) # delete fleets for fleetID in obj.fleets: fleet = tran.db[fleetID] self.cmd(fleet).disbandFleet(tran, fleet) try: tran.gameMngr.removePlayer(obj.oid) except Exception: log.warning("Cannot remove player")