예제 #1
0
    def _fishing(self, rank):
        '''
		Process the act of going fishing.
		'''
        turn = self.state['g'].get_turn_pid()
        if True == self.DEBUG_FUNC:
            print "pid {0} going fishing.".format(turn)

        FAIL = ''
        if 0 == turn:
            if self.chance(
                    self.FAIL_CHANCE):  # correct len, wrong tags for this msg
                msg = sp.serialize_draw_request()
                FAIL = 'ERR_INVALID_XML'
            else:
                msg = sp.serialize_fishing()
            self.write(msg)

        if '' != FAIL:
            self._recv_error(FAIL)
            return -1

        # if pool is out of cards, card == None; will get xml shell w/o a card
        card = self.state['g'].go_fishing()
        msg = sp.serialize_cards([card])
        if 0 == turn:
            self.read(length=len(msg), expect=msg)

        if True == self.DEBUG_FUNC:
            print " fishing card:{0}, rank:{1}, msg:{2}".format(
                card, rank, msg)

        ZERO = False
        if (None != card) and (False == card.has_rank(rank)):
            msg = sp.serialize_cards([None])
            ZERO = True

        if 0 == turn:
            if self.chance(self.FAIL_CHANCE
                           ):  #  invalid card and incorrect for this msg
                if True == ZERO:
                    msg = sp.serialize_draw_request()  # just need 4 bytes
                else:
                    msg = sp.serialize_cards([Card(
                        5, 15)])  # just need bogus card (12 bytes)
                FAIL = 'ERR_INVALID_CARD'

            self.write(msg)
        else:
            self.read(length=len(msg), expect=msg)

        if '' != FAIL:
            self._recv_error(FAIL)
            return -1
        else:
            return 0
예제 #2
0
	def _fishing(self, rank):
		'''
		Process the act of going fishing.
		'''
		turn = self.state['g'].get_turn_pid()
		if True == self.DEBUG_FUNC:
			print "pid {0} going fishing.".format(turn)

		FAIL = ''
		if 0 == turn:
			# these msg's need 4 chars to prevent recv timeout
			if self.chance(self.FAIL_CHANCE): # correct len, wrong tags for this msg
				msg = sp.serialize_draw_request()
				FAIL = 'ERR_INVALID_XML'
			else:
				msg = sp.serialize_fishing()
			self.write(msg)

		if '' != FAIL:
			self._recv_error(FAIL)
			return -1

		# if pool is out of cards, card == None; will get xml shell w/o a card
		card = self.state['g'].go_fishing()
		msg = sp.serialize_cards([card])
		if 0 == turn:
			self.read(length=len(msg), expect=msg)

		if True == self.DEBUG_FUNC:
			print " fishing card:{0}, rank:{1}, msg:{2}".format(card, rank, msg)

		ZERO = False
		if (None != card) and (False == card.has_rank(rank)):
			msg = sp.serialize_cards([None])
			ZERO = True

		if 0 == turn:
			if self.chance(self.FAIL_CHANCE): #  invalid card and incorrect for this msg
				if True == ZERO:
					msg = sp.serialize_draw_request() # just need 4 bytes
				else:
					msg = sp.serialize_cards([Card(5,15)]) # just need bogus card (12 bytes)
				FAIL = 'ERR_INVALID_CARD'

			self.write(msg)
		else:
			self.read(length=len(msg), expect=msg)

		if '' != FAIL:
			self._recv_error(FAIL)
			return -1

		return 0
예제 #3
0
    def _ask(self):
        '''
		Process the act of asking the other player for cards having a given rank.
		'''
        turn = self.state['g'].get_turn_pid()
        if True == self.DEBUG_FUNC:
            print "pid {0} asking.".format(turn)

        FAIL = ''

        rank = self.state['g'].ask_rank()
        msg = sp.serialize_ask(rank)
        if 0 == turn:
            if self.chance(self.FAIL_CHANCE):  # invliad rank
                msg = sp.serialize_ask(20)
                FAIL = 'ERR_INVALID_RANK'
            elif self.chance(self.FAIL_CHANCE):  # wrong tags for this msg
                # length needs to be 7
                msg = sp.serialize_fishing()  # len 4
                msg = msg[:-1] + msg  # len 3 + 4
                FAIL = 'ERR_INVALID_XML'

            self.write(msg)
        else:
            self.read(length=len(msg), expect=msg)

        if True == self.DEBUG_FUNC:
            print "  asked for rank {0}.".format(rank)

        if '' != FAIL:
            self._recv_error(FAIL)
            return -1

        qty = self.state['g'].ask_response_qty(rank)
        msg = sp.serialize_go_fish(qty)
        if 0 == turn:
            self.read(length=len(msg), expect=msg)
        else:
            if self.chance(self.FAIL_CHANCE):  # total junk
                msg = sp.pack_single_string(sp.random_string(5, 5))
                FAIL = 'ERRNO_RECV'
            elif self.chance(self.FAIL_CHANCE):  # wrong qty
                msg = sp.serialize_go_fish(6)
                FAIL = 'ERR_INVALID_QTY'
            elif self.chance(
                    self.FAIL_CHANCE):  # correct len, wrong tags for this msg
                msg = sp.serialize_fishing()
                msg = msg[1] + msg
                FAIL = 'ERR_INVALID_XML'
            elif self.chance(
                    self.FAIL_CHANCE):  # too short, wrong tags for this msg
                msg = sp.serialize_fishing()
                FAIL = 'ERRNO_RECV'

            self.write(msg)

        if True == self.DEBUG_FUNC:
            print "  asked player has qty {0}.".format(qty)

        if '' != FAIL:
            self._recv_error(FAIL)
            return -1

        if 0 == qty:
            return self._fishing(rank)
        else:
            return self._ask_give_cards(rank)
예제 #4
0
	def _ask(self):
		'''
		Process the act of asking the other player for cards having a given rank.
		'''
		turn = self.state['g'].get_turn_pid()
		if True == self.DEBUG_FUNC:
			print "pid {0} asking.".format(turn)

		FAIL = ''

		rank = self.state['g'].ask_rank()
		msg = sp.serialize_ask(rank)
		if 0 == turn:
			if self.chance(self.FAIL_CHANCE): # invliad rank
				msg = sp.serialize_ask(20)
				FAIL = 'ERR_INVALID_RANK'
			elif self.chance(self.FAIL_CHANCE): # wrong tags for this msg
				# length needs to be 7
				msg = sp.serialize_fishing() # len 4
				msg = msg[:-1] + msg # len 3 + 4
				FAIL = 'ERR_INVALID_XML'

			self.write(msg)
		else:
			self.read(length=len(msg), expect=msg)

		if True == self.DEBUG_FUNC:
			print "  asked for rank {0}.".format(rank)

		if '' != FAIL:
			self._recv_error(FAIL)
			return -1


		qty = self.state['g'].ask_response_qty(rank)
		msg = sp.serialize_go_fish(qty)
		if 0 == turn:
			self.read(length=len(msg), expect=msg)
		else:
			if self.chance(self.FAIL_CHANCE): # total junk
				msg = sp.pack_single_string(sp.random_string(5,5))
				FAIL = 'ERRNO_RECV'
			elif self.chance(self.FAIL_CHANCE): # wrong qty
				msg = sp.serialize_go_fish(6)
				FAIL = 'ERR_INVALID_QTY'
			elif self.chance(self.FAIL_CHANCE): # correct len, wrong tags for this msg
				msg = sp.serialize_fishing()
				msg = msg[1] + msg
				FAIL = 'ERR_INVALID_XML'
			elif self.chance(self.FAIL_CHANCE): # too short, wrong tags for this msg
				msg = sp.serialize_fishing()
				FAIL = 'ERRNO_RECV'


			self.write(msg)

		if True == self.DEBUG_FUNC:
			print "  asked player has qty {0}.".format(qty)

		if '' != FAIL:
			self._recv_error(FAIL)
			return -1


		if 0 == qty:
			return self._fishing(rank)
		else:
			return self._ask_give_cards(rank)