Example #1
0
	def handle_nick(self, cmd, args):
		assert cmd == 'NICK'
		self.name, self.nicks = deserialize(args, 'tuple', ['unicode', ['list', 'unicode']])
		print 'JOIN', self.client_id, self.nicks
		self.bcast_cmd('JOIN', serialize((self.client_id, self.addr[0], self.name, self.nicks), 'tuple', ['int', 'str', 'unicode', ['list', 'unicode']]))
		self.push_cmd('ID', serialize(self.client_id, 'int'))
		self.push_cmd('NICKS', serialize([(client.client_id, client.addr[0], client.name, client.nicks) for client in self.serv.clients], 'list', 'tuple', ['int', 'str', 'unicode', ['list', 'unicode']]))
		self.handler = self.handle_general
Example #2
0
	def handle_general(self, cmd, args):
		if cmd == 'MSG':
			msg = deserialize(args, 'unicode')
			print 'MSG', self.client_id, self.nicks, repr(msg)
			self.bcast_cmd('MSG', serialize((self.client_id, msg), 'tuple', ['int', 'unicode']), not_to_self = False)
		elif cmd == 'CHALLENGE_CREATE':
			clients, map, players = deserialize(args, 'tuple', [['list', 'int'], 'str', ['list', 'Player']])
			if self.client_id in self.serv.challenges:
				self.die('Duplicate challenge')
			else:
				self.serv.challenges[self.client_id] = (map, set(clients), {self.client_id: players})
				self.mcast_cmd('CHALLENGE_CREATED', serialize((self.client_id, clients, map), 'tuple', ['int', ['list', 'int'], 'str']), self.serv.challenges[self.client_id][1])
		elif cmd == 'CHALLENGE_ACCEPT':
			client_id, players = deserialize(args, 'tuple', ['int', ['list', 'Player']])
			if self.challenge_valid(client_id):
				self.serv.challenges[client_id][2][self.client_id] = players
				self.mcast_cmd('CHALLENGE_ACCEPTED_BY', serialize((client_id, self.client_id), 'tuple', ['int', 'int']), self.serv.challenges[client_id][1])
				self.challenge_cancel_all(except_ = client_id)
				if self.serv.challenges[client_id][1] == set(self.serv.challenges[client_id][2]):
					players = [(cid, p) for cid, ps in self.serv.challenges[client_id][2].items() for p in ps]
					map, (width, height), spawns = load_map(self.serv.challenges[client_id][0])
					map = Grid(width, height, map)
					map.cell_size = (1, 1)
					map.x = map.y = 0
					game = Game(map, spawns, [])
					teams = [(p.name, None, p.team) for cid, p in players]
					spawns = game.get_spawnpoints(teams)
					class Dummy: pass
					main = Dummy()
					main.map = game.map
					main.res = None
					game.all_players = [GamePlayer(name, [(char, x, y, 0) for char, (x, y) in zip(characters, spawn)], main, None) for (name, remote, characters), spawn in zip(teams, spawns)]
					game.client_ids = self.serv.challenges[client_id][1]
					for client in self.serv.clients:
						if client.client_id not in self.serv.challenges[client_id][1]:
							continue
						client.game = game
					self.mcast_cmd('GAME_START', serialize((self.serv.challenges[client_id][0], spawns, players), 'tuple', ['str', ['list', 'list', ':coord'], ['list', 'tuple', ['int', 'Player']]]), self.serv.challenges[client_id][1])
		elif cmd == 'CHALLENGE_REJECT':
			client_id = deserialize(args, 'int')
			if self.challenge_valid(client_id):
				self.challenge_cancel(client_id, self.client_id)
		elif cmd == 'GAME_MOVE':
			p, c, t = deserialize(args, 'tuple', ['int', 'int', ':coord'])
			self.push_actions(self.game.move(self.game.all_players[p].all_characters[c], t))
		elif cmd == 'GAME_ATTACK':
			p, c, t = deserialize(args, 'tuple', ['int', 'int', ':coord'])
			self.push_actions(self.game.attack(self.game.all_players[p].all_characters[c], t))
		elif cmd == 'GAME_ENDTURN':
			self.push_actions(self.game.end_turn())
		else:
			self.die('Unknown command: ' + repr(cmd))
Example #3
0
	def handle_connect(self):
		self.push_cmd('VERSION', serialize(VERSION, 'str'))
Example #4
0
	def die(self, msg):
		print 'DIE:', msg
		self.push_cmd('ERROR', serialize(msg, 'str'))
		self.handle_close()
Example #5
0
	def challenge_cancel(self, challenger, canceler):
		self.mcast_cmd('CHALLENGE_CANCELED', serialize((challenger, canceler), 'tuple', ['int', 'int']), self.serv.challenges[challenger][1])
		del self.serv.challenges[challenger]
Example #6
0
	def handle_close(self):
		print 'DISCONNECT', self.client_id, self.nicks
		self.bcast_cmd('QUIT', serialize(self.client_id, 'int'))
		self.serv.clients.remove(self)
		self.challenge_cancel_all()
		self.close()
Example #7
0
	def push_actions(self, actions):
		for action in actions:
			self.mcast_cmd('GAME_' + action[0] + '_RET', serialize(action[1:]), self.game.client_ids)
			assert action[0] in 'TURN MOVE ATTACK'.split()
			handler = getattr(self.game, 'handle_' + action[0].lower())
			handler(*action[1:])