예제 #1
0
	def __init__(self, playerNames):
		self.logicHandler = LogicHandler()
		self.eventHandler = EventHandler()
		self.players = []
		self.turns = 0
		self.jsonResponse = {}

		for playerName in playerNames:
			objective = self.logicHandler.get_random_objective()
			self.players.append(Player(playerName, objective))
예제 #2
0
class Game(object):
	def __init__(self, playerNames):
		self.logicHandler = LogicHandler()
		self.eventHandler = EventHandler()
		self.players = []
		self.turns = 0
		self.jsonResponse = {}

		for playerName in playerNames:
			objective = self.logicHandler.get_random_objective()
			self.players.append(Player(playerName, objective))

	def handleAction(self, playerName, action, options):
		if self.getCurrentTurnPlayerName() != playerName:
			print "Not your turn! Player's " + str(self.getTurns()/2) + " turn."
			return False

		self.affectedPlayers = []
		player = self.getPlayerWithName(playerName)
		if player == None:
			print "Cannot find player!"
			return False

		self.jsonResponse = None

		if action is Action.TradeRequest:
			print "trade offer"
			#options contains targetPlayerNames, resourceOffer, resourceRequest
			targetPlayerNames = options["targetPlayerNames"]
			resourcesOffer = options["offer"]
			resourcesRequest = options["want"]

			if not targetPlayerNames or not resourcesOffer or not resourcesRequest:
				return False

			targetPlayers = []
			for name in targetPlayerNames:
				targetPlayer = self.getPlayerWithName(name)
				targetPlayers.append(targetPlayer)

			if self.logicHandler.ingredient_suffice_to_trade(player, resourcesOffer):
				self.currentTrade = Trade(player, resourcesOffer, resourcesRequest, targetPlayers)
				self.affectedPlayers.append(player)
				for playerName in targetPlayerNames:
					targetPlayer = self.getPlayerWithName(playerName)
					self.affectedPlayers.append(targetPlayer)
				makeTradeTemplateJson(self.currentTrade)
				return True
			else:
				return False
		if action is Action.TradeAccept:
			print "Trade accept"
			#options contains tradeId
			tradeId = options["tradeId"]
			if not self.isTradeValidWithIdAndName(tradeId, player.get_name()):
				return False 
			if self.logicHandler.accept_trade(player, self.currentTrade):
				self.currentTrade.set_player_responded(player.get_name())
				self.affectedPlayers.append(player) #player who accept the trade
				self.affectedPlayers.append(self.currentTrade.get_initiator())
				self.makeUpdateTemplateJson()
				return True
			else:
				return False
		elif action is Action.TradeDeny:
			print "trade deny"
			#options contains tradeId
			tradeId = options["tradeId"]
			if not self.isTradeValidWithIdAndName(tradeId, player.get_name()):
				return False 

			self.currentTrade.set_player_responded(player.get_name())
			return True
		elif action is Action.TradeWithBank:
			print "trade with bank"
			#options contains resourcesOffer, resourcesRequest
			bankMultiplier = self.eventHandler.getBankMultiplier()
			if self.logicHandler.trade_with_bank(player, options["offer"], options["want"], bankMultiplier):
				self.affectedPlayers.append(player)
				self.makeUpdateTemplateJson()
				return True
			else:
				return False
		elif action is Action.Build or action is Action.UpgradeResourceGenerator:
			print "Build or upgrade resouce generator"
			#options contains generatorName
			if self.logicHandler.build(player, options["target"]):
				self.affectedPlayers.append(player)
				self.makeUpdateTemplateJson()
				return True
			else:
				return False
		elif action is Action.Gather:
			print "gather"
			multipliers = self.eventHandler.getGeneratorMultipliers()
			if self.logicHandler.gather(player, multipliers):
				self.affectedPlayers.append(player)
				self.makeUpdateTemplateJson()
				return True
			else:
				return False
		elif action is Action.Destroy:
			#options contains targetPlayerName , buildingName
			print "destroy"
			targetPlayer = self.getPlayerWithName(options["to"])
			if self.logicHandler.destroy(player, targetPlayer, options["target"]):
				self.affectedPlayers.append(player)
				self.affectedPlayers.append(targetPlayer)
				self.makeUpdateTemplateJson()
				return True
			else:
				return False  
		elif action is Action.UpgradeResource:
			print "upgrade resource"
			#options contains resourceType
			if self.logicHandler.upgrade_resource(player, options["target"]):
				self.affectedPlayers.append(player)
				self.makeUpdateTemplateJson()
				return True
			else: 
				return False
		else: 
			print("error action")
			return False

	def isTradeValidWithIdAndName(self, tradeId, playerName):
		if not tradeId or tradeId != self.currentTrade.get_id() or \
			playerName not in self.currentTrade.get_target_players_name():
			return False

		if self.currentTrade.get_is_trade_over():
			print("trade is over")
			return False

		return True


	def updateEventAndGetUpcomingEvents(self):
		self.eventHandler.randomUpcomingEvent()
		currentEvents = self.eventHandler.getUpcomingEvents()


	def getPlayerWithName(self, name):
		for player in self.players:
			if player.get_name() == name:
				return player
		print "player not found"
		return None

	def playerLeft(self, player_name):
		for player in self.players:
			if (player_name == player.get_name()):
				self.players.remove(player)
				break;

	def getAffectedPlayersSummaries(self):
		affectedPlayerSummaries = {}
		for player in self.affectedPlayers:
			playerSummary = {}
			resources = player.get_resources()
			for res, count in resources.items():
				playerSummary[res.name] = count
			generator = player.get_generators()
			for gen, count in generator.items():
				playerSummary[gen.name] = count 
			affectedPlayerSummaries[player.get_name()] = playerSummary
		return affectedPlayerSummaries

	def getAllPlayersSummaries(self):
		allPlayerSummaries = {}
		for player in self.players:
			playerSummary = {}
			resources = player.get_resources()
			for res, count in resources.items():
				playerSummary[res.name] = count
			generator = player.get_generators()
			for gen, count in generator.items():
				playerSummary[gen.name] = count 
			allPlayerSummaries[player.get_name()] = playerSummary
		return allPlayerSummaries

	def getGeneratorsAndBankMultipliers(self):
		multipliers = {}
		for key, mutliplier in self.eventHandler.getGeneratorMultipliers.items():
			mutliplier[key.name] = multipliers
		multipliers["bank"] = self.eventHandler.getBankMultiplier()
		return multipliers

	def getTradeId(self):
		return self.currentTrade.get_id()

	def getIsTradeOver(self):
		return self.currentTrade.get_is_trade_over()

	def getTurns(self):
		return self.turns

	def increaseTurns(self):
		self.turns += 1

	def setTurns(self, turns):
		self.turns = turns

	def getCurrentTurnPlayerName(self):
		return self.players[(self.getTurns()/2)].get_name()

	def makeUpdateTemplateJson(self):
		json = {}
		json['action'] = "Update"
		json['update_res'] = self.getAffectedPlayersSummaries() 
		self.jsonResponse = json

	def makeTradeTemplateJson(self, trade):
		json = {}
		json['action'] = "TradeRequest"
		json['from'] = trade.get_initiator()
		json['to'] = trade.get_target_players_name()
		json['want'] = trade.get_resources_request()
		json['offer'] = trade.get_resources_offer()
		json['tid'] = trade.get_id()
		self.jsonResponse = json

	def getJsonResponse(self):
		return self.jsonResponse