예제 #1
0
	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
예제 #2
0
	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
예제 #3
0
파일: IPlayer.py 프로젝트: Lukc/ospace-lukc
	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")