def draw(self, player): seat = self.get_seat_of_player(player) if not seat: self.tell_pre(player, "You're not playing!\n") return False elif seat != self.turn: self.tell_pre(player, "It's not your turn!\n") return False substate = self.state.get_sub() if substate != "draw": self.tell_pre(player, "You should be playing or discarding, not drawing!\n") return False # Draw a card. This one's easy! draw_card = self.draw_pile.discard() seat.data.hand.add(draw_card) # Resort the hand. seat.data.hand = sorted_hand(seat.data.hand) self.bc_pre("%s drew a card.\n" % (self.get_sp_str(seat))) self.tell_pre(player, "You drew %s.\n" % card_to_str(draw_card, mode=LONG)) return True
def play(self, player, play_str): seat = self.get_seat_of_player(player) if not seat: self.tell_pre(player, "You're not playing!\n") return False elif seat != self.turn: self.tell_pre(player, "It's not your turn!\n") return False substate = self.state.get_sub() if substate != "play": self.tell_pre(player, "You should be drawing or retrieving, not playing!\n") return False # Translate the play string into an actual card. potential_card = str_to_card(play_str) if not potential_card: self.tell_pre(player, "That's not a valid card!\n") return False # Do they even have this card? if potential_card not in seat.data.hand: self.tell_pre(player, "You don't have that card!\n") return False # All right. Grab the hand for that expedition. exp_hand = seat.data.expeditions[self.suit_to_loc(potential_card.suit)].hand # If this card is a lower value than the top card of the hand, nope. if len(exp_hand) and potential_card < exp_hand[-1]: self.tell_pre(player, "You can no longer play this card on this expedition.\n") return False # If it's the same value and not an agreement, nope. elif (len(exp_hand) and potential_card == exp_hand[-1] and potential_card.rank != AGREEMENT): self.tell_pre(player, "You cannot play same-valued point cards on an expedition.\n") return False # Passed the tests. Play it and clear the discard tracker. exp_hand.add(seat.data.hand.discard_specific(potential_card)) self.just_discarded_to = None self.bc_pre("%s played %s.\n" % (self.get_sp_str(seat), card_to_str(potential_card, mode=LONG))) return True
def retrieve(self, player, retrieve_str): seat = self.get_seat_of_player(player) if not seat: self.tell_pre(player, "You're not playing!\n") return False elif seat != self.turn: self.tell_pre(player, "It's not your turn!\n") return False substate = self.state.get_sub() if substate != "draw": self.tell_pre(player, "You should be playing or discarding, not retrieving!\n") return False # Turn the retrieve string into an actual suit. suit = str_to_suit(retrieve_str) if not suit: self.tell_pre(player, "That's not a valid suit!\n") return False # Is that a valid location in this game? loc = self.suit_to_loc(suit) if loc >= self.suit_count: self.tell_pre(player, "That suit isn't in play this game.\n") return False # Is there actually a card there /to/ draw? discard_pile = self.discards[loc].hand if not len(discard_pile): self.tell_pre(player, "There are no discards of that suit.\n") return False # Is it the card they just discarded? if suit == self.just_discarded_to: self.tell_pre(player, "You just discarded that card!\n") return False # Phew. All tests passed. Give them the card. dis_card = discard_pile.discard() seat.data.hand.add(dis_card) seat.data.hand = sorted_hand(seat.data.hand) self.bc_pre("%s retrieved %s from the discards.\n" % (self.get_sp_str(seat), card_to_str(dis_card, mode=LONG))) return True
def discard(self, player, play_str): seat = self.get_seat_of_player(player) if not seat: self.tell_pre(player, "You're not playing!\n") return False elif seat != self.turn: self.tell_pre(player, "It's not your turn!\n") return False substate = self.state.get_sub() if substate != "play": self.tell_pre(player, "You should be drawing or retrieving, not discarding!\n") return False # Translate the play string into an actual card. potential_card = str_to_card(play_str) if not potential_card: self.tell_pre(player, "That's not a valid card!\n") return False # Do they even have this card? if potential_card not in seat.data.hand: self.tell_pre(player, "You don't have that card!\n") return False # All right, they can discard it. Get the appropriate discard pile... discard_pile = self.discards[self.suit_to_loc(potential_card.suit)].hand discard_pile.add(seat.data.hand.discard_specific(potential_card)) # Note the pile we just discarded to, so the player can't just pick it # back up as their next play. self.just_discarded_to = potential_card.suit self.bc_pre("%s discarded %s.\n" % (self.get_sp_str(seat), card_to_str(potential_card, mode=LONG))) return True