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
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
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)
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)