void pa_classify_add_card(struct userdata *u, char *type, enum pa_classify_method method[2], char **arg, char **profiles, uint32_t flags[2]) { struct pa_classify *classify; pa_assert(u); pa_assert_se((classify = u->classify)); pa_assert(classify->cards); pa_assert(type); pa_assert(arg[0]); cards_add(&classify->cards, type, method, arg, profiles, flags); }
void gp_start(gp_t* gp) { int i,j; int start_num; card_t card; if (!gp) return; gp->round = 0; gp->game_state = GP_GAME_PLAY; gp->inning++; memset(&gp->last_hand_type, 0, sizeof(hand_type)); memset(gp->last_hand, 0, sizeof(card_t) * GP_MAX_CARDS); if (gp->mode == GP_MODE_SERVER) { deck_shuffle(gp->deck, gp->deck_all_num); gp->deck_deal_index = 0; gp->deck_valid_num = gp->deck_all_num; /* draw start cards for every player */ if (gp->game_rule == GP_RULE_DEFAULT) { start_num = 16; } else { start_num = 15; } for (i = 0; i < start_num; ++i) { for (j = 0; j < gp->player_num; ++j) { gp_deal(gp, &card); cards_add(gp->players[j].cards, GP_MAX_CARDS, &card); } } /* sort cards */ for (i = 0; i < gp->player_num; ++i) { gp_sort(gp->players[i].cards, GP_MAX_CARDS); } /* the first player */ gp->first_player_no = rand() % gp->player_num; gp->curr_player_no = gp->first_player_no; } else { for (i = 0; i < 3; i++) { memset(gp->players[i].cards, 0, sizeof(card_t) * GP_MAX_PLAYER); memset(gp->players[i].cards_played, 0, sizeof(card_t) * GP_MAX_PLAYER); } gp->first_player_no = 0; gp->curr_player_no = 0; } }
int gp_play(gp_t* gp, int player_no, card_t* cards, int len) { int i,valid_num; hand_type htype; card_t* card; if (!cards || len <= 0) return -1; if (gp->game_state != GP_GAME_PLAY) { if (gp->debug) printf("play cards but game state not play.\n"); return -2; } if (player_no != gp->curr_player_no) { if (gp->debug) printf("play cards but not this no.\n"); return -3; } valid_num = cards_num(cards, len); if (valid_num == 0) { if (gp->debug) printf("play zero cards.\n"); return -4; } if (gp->mode == GP_MODE_SERVER) { for (i = 0; i < valid_num; ++i){ card = cards + i; if (!cards_have(gp->players[player_no].cards, GP_MAX_CARDS, card)) { if (gp->debug) { printf("play cards but player hasn't this card(%s).\n", card_to_string(card)); } return -5; } } } gp_handtype(gp, cards, len, &htype); if (gp->mode == GP_MODE_SERVER) { /* can play out these cards */ if (gp->largest_player_no != player_no) { if (!gp_canplay(gp, cards, len)){ if (gp->debug) printf("cann't play these cards(smaller).\n"); return -6; } } } /* player play these cards */ memset(gp->last_hand, 0, sizeof(card_t) * GP_MAX_CARDS); for (i = 0; i < valid_num; ++i) { card = cards + i; cards_del(gp->players[player_no].cards, GP_MAX_CARDS, card); cards_add(gp->last_hand, GP_MAX_CARDS, card); } memcpy(&gp->last_hand_type, &htype, sizeof(hand_type)); memcpy(gp->players[player_no].cards_played, gp->last_hand, sizeof(card_t) * GP_MAX_CARDS); cards_sort(gp->players[player_no].cards_played, GP_MAX_CARDS); gp->largest_player_no = player_no; cards_trim(gp->players[player_no].cards, GP_MAX_CARDS); if (cards_num(gp->players[player_no].cards, GP_MAX_CARDS)) gp_next_player(gp); else { if (gp->mode == GP_MODE_SERVER) gp->game_state = GP_GAME_END; } return 1; }