back to scratko.xyz
aboutsummaryrefslogtreecommitdiff
path: root/server_game_process.c
diff options
context:
space:
mode:
Diffstat (limited to 'server_game_process.c')
-rw-r--r--server_game_process.c147
1 files changed, 95 insertions, 52 deletions
diff --git a/server_game_process.c b/server_game_process.c
index 5f1aacb..99b50fe 100644
--- a/server_game_process.c
+++ b/server_game_process.c
@@ -4,6 +4,8 @@
#include <string.h>
#include <stdio.h>
+enum { deck_size = 52 };
+
static const char *basic_deck[deck_size] = {
"2^", "3^", "4^", "5^", "6^", "7^", "8^",
"9^", "10^", "J^", "Q^", "K^", "A^", "2#",
@@ -20,10 +22,10 @@ static int get_random_idx()
return 0 + (int)((double)deck_size*rand()/(RAND_MAX + 1.0));
}
-char** get_shuffled_deck()
+const char** get_shuffled_deck()
{
int i, new_idx;
- char **shuffled_deck = realloc(deck_size, sizeof(char*));
+ const char **shuffled_deck = calloc(deck_size, sizeof(char*));
for(i = 0; i < deck_size; ++i) {
new_idx = get_random_idx();
while(shuffled_deck[new_idx])
@@ -33,10 +35,11 @@ char** get_shuffled_deck()
return shuffled_deck;
}
-void deal_first_cards(char **shuffled_deck, int *cards_left, player_cards *deck)
+void deal_first_cards(const char **shuffled_deck, int *cards_left,
+ player_cards *deck)
{
int i, last_idx;
- char *str;
+ const char *str;
for(i = 0; i < start_deck_size; ++i) {
last_idx = *cards_left-1;
str = shuffled_deck[last_idx];
@@ -48,6 +51,32 @@ void deal_first_cards(char **shuffled_deck, int *cards_left, player_cards *deck)
}
}
+void deal_cards(const char **shuffled_deck, int *shuffled_cards_left,
+ struct session **turn_queue, int players_number,
+ int *card_quantity_arr)
+{
+ int i, j, key, player_deck_size, card_shortage_quantity, last_idx;
+ const char *extracted_card = NULL;
+
+ for(i = 0; i < players_number; ++i) {
+ key = turn_queue[i]->player_position - 1;
+ player_deck_size = card_quantity_arr[key];
+ if(player_deck_size < start_deck_size) {
+ card_shortage_quantity = start_deck_size - player_deck_size;
+ for(j = 0; j < card_shortage_quantity; ++j) {
+ last_idx = *shuffled_cards_left-1;
+ /* shuffled deck is empty */
+ if(last_idx == 0 || last_idx < 0)
+ return;
+ extracted_card = shuffled_deck[last_idx];
+ push_stack(&turn_queue[i]->deck, extracted_card);
+ --*shuffled_cards_left;
+ shuffled_deck[last_idx] = NULL;
+ }
+ }
+ }
+}
+
const char* find_trump_suit(const char **shuffled_deck, int *cards_left)
{
const char *trump_suit = NULL;
@@ -61,38 +90,44 @@ const char* find_trump_suit(const char **shuffled_deck, int *cards_left)
int convert_rank_to_int(const char *card)
{
- int length, rank = 0;
- char str_rand[2];
+ int length;
+ char str_rank[2];
length = strlen(card);
/* 10 - the only one of its kind */
if(length == 3)
return 10;
- strncpy(str_rank, 1);
+
+ str_rank[0] = card[0];
str_rank[1] = '\0';
- if(!strncmp(str_rank, "J", 1))
- rank = 11;
- else if(!strncmp(str_rank, "Q", 1))
- rank = 12;
- else if(!strncmp(str_rank, "K", 1))
- rank = 13;
- else if(!strncmp(str_rank, "A", 1))
- rank = 14;
- else
- rank = strtol(str_rank, NULL, 10);
- return rank;
+
+ switch(card[0]) {
+ case 'J':
+ return 11;
+ case 'Q':
+ return 12;
+ case 'K':
+ return 13;
+ case 'A':
+ return 14;
+ default:
+ return strtol(str_rank, NULL, 10);
+ }
+ return 0;
}
-int find_lowest_trump(player_cards deck, char *trump_suit)
+int find_lowest_trump(player_cards deck, const char *trump_suit)
{
- const char *card;
- int lowest_rank = 0;
+ int length, lowest_rank = 0, current_rank;
+ const char *suit = NULL;
while(deck) {
- if(!strncmp(card+length-1, trump_suit, 1)) {
- lowest_rank = convert_rank_to_int(deck->str);
- if(!lowest_rank || lowest_rank > rank)
- lowest_rank = rank;
+ length = strlen(deck->str);
+ suit = deck->str + length - 1;
+ if(*suit == *trump_suit) {
+ current_rank = convert_rank_to_int(deck->str);
+ if(!lowest_rank || lowest_rank > current_rank)
+ lowest_rank = current_rank;
}
deck = deck->next;
}
@@ -108,26 +143,35 @@ void shift_turn_queue_by_one(struct session **turn_queue, int size)
turn_queue[i-1] = tmp;
}
+void move_turn_queue_two_players_ahead(struct session **turn_queue, int size)
+{
+ int i;
+
+ for(i = 0; i < 2; ++i)
+ shift_turn_queue_by_one(turn_queue, size);
+}
+
void update_card_quantity_arr(struct server *serv)
{
- int i, j;
+ int i, player_position_idx;
- for(i = 0, j = 0; i < serv->max_sess_arr_size; ++i)
+ for(i = 0; i < serv->max_sess_arr_size; ++i)
if(serv->sess_arr[i]) {
- serv->card_quantity_arr[j] =
+ player_position_idx = serv->sess_arr[i]->player_position - 1;
+ serv->card_quantity_arr[player_position_idx] =
find_out_card_quantity_in_deck(serv->sess_arr[i]->deck);
- ++j;
}
}
struct game_info* get_new_game_info(int players_number, int *card_quantity_arr,
- int shuffled_cards_left, char *trump_suit,
+ int shuffled_cards_left,
+ const char *trump_suit,
int position_whose_turn,
struct card_queue *cq,
struct cards_on_table *cot)
{
- struct game_info *gi = malloc(sizeof(game_info));
+ struct game_info *gi = malloc(sizeof(struct game_info));
gi->players_number = players_number;
gi->card_quantity_arr = card_quantity_arr;
gi->shuffled_cards_left = shuffled_cards_left;
@@ -166,8 +210,7 @@ int is_card_bit(const char *attack_card, const char *defend_card,
/* defender has a trump suit */
} else if(!strcmp(defend_suit, trump_suit))
return 1;
- else
- return 0;
+ return 0;
}
/*
* analyze that each attacker card can be beat
@@ -176,7 +219,7 @@ int is_card_bit(const char *attack_card, const char *defend_card,
int check_defender_can_defend(struct card_queue *cq,
player_cards deck, const char *trump_suit)
{
- int i, is_bited_card;
+ int is_bited_card;
struct card_stack_item *next_defend_card;
struct card_queue_item *next_attack_card;
player_cards involved_cards;
@@ -227,7 +270,7 @@ int check_someone_can_toss_card(struct session **turn_queue,
{
int i, j;
struct card_queue_item *attack_card_in_queue;
- struct card_stack item *not_defender_card;
+ struct card_stack_item *not_defender_card;
for(i = 0; i < players_quantity; ++i) {
/* skipping defender's cards */
@@ -250,7 +293,7 @@ int check_someone_can_toss_card(struct session **turn_queue,
}
/* checking cards on table */
for(j = cot->card_arr_idx; j >= 0; --j) {
- if(cot->card_arr[j] == '-' || cot->card_arr[j] == '\')
+ if(cot->card_arr[j][0] == '-' || cot->card_arr[j][0] == '\\')
continue;
not_defender_card = NULL;
while((not_defender_card =
@@ -269,16 +312,15 @@ int check_someone_can_toss_card(struct session **turn_queue,
int check_player_can_toss_card(player_cards deck, struct cards_on_table *cot)
{
int i;
- struct card_stack item *not_defender_card;
+ struct card_stack_item *not_defender_card;
/* checking cards on table */
for(i = cot->card_arr_idx; i >= 0; --i) {
- if(cot->card_arr[i] == '-' || cot->card_arr[i] == '\')
+ if(cot->card_arr[i][0] == '-' || cot->card_arr[i][0] == '\\')
continue;
not_defender_card = NULL;
while((not_defender_card =
- get_next_card_from_stack(turn_queue[i]->deck,
- not_defender_card)) &&
+ get_next_card_from_stack(deck, not_defender_card)) &&
!check_matched_ranks(cot->card_arr[i], not_defender_card->str))
{}
if(not_defender_card)
@@ -292,7 +334,7 @@ int is_correct_tossing_card(const char *card, struct cards_on_table *cot)
int i;
for(i = cot->card_arr_idx; i >= 0; --i) {
- if(cot->card_arr[i] == '-' || cot->card_arr[i] == '\')
+ if(cot->card_arr[i][0] == '-' || cot->card_arr[i][0] == '\\')
continue;
if(check_matched_ranks(cot->card_arr[i], card))
return 1;
@@ -309,11 +351,11 @@ void put_all_cards_from_queue_to_table(struct cards_on_table *cot,
while(!is_empty_queue(cq)) {
card = pop_card_queue(cq);
++cot->card_arr_idx;
- cot->card_arr[card_arr_idx] = card;
+ cot->card_arr[cot->card_arr_idx] = card;
++cot->card_arr_idx;
- cot->card_arr[card_arr_idx] = "\\";
+ cot->card_arr[cot->card_arr_idx] = "\\";
++cot->card_arr_idx;
- cot->card_arr[card_arr_idx] = "-";
+ cot->card_arr[cot->card_arr_idx] = "-";
}
}
@@ -324,33 +366,34 @@ void put_one_card_from_queue_to_table(struct cards_on_table *cot,
card = pop_card_queue(cq);
++cot->card_arr_idx;
- cot->card_arr[card_arr_idx] = card;
+ cot->card_arr[cot->card_arr_idx] = card;
++cot->card_arr_idx;
- cot->card_arr[card_arr_idx] = "\\";
+ cot->card_arr[cot->card_arr_idx] = "\\";
++cot->card_arr_idx;
- cot->card_arr[card_arr_idx] = "-";
+ cot->card_arr[cot->card_arr_idx] = "-";
}
/* it used by defender to bit attack card */
void put_defender_card_on_table(struct cards_on_table *cot, const char *card)
{
- cot->card_arr[card_arr_idx] = card;
+ cot->card_arr[cot->card_arr_idx] = card;
}
void move_all_cards_to_defender(struct cards_on_table *cot, player_cards *deck)
{
+ int i;
+#if 0
const char *card;
-#if 0
while(!is_empty_queue(cq)) {
card = pop_card_queue(cq);
push_stack(deck, card);
}
#endif
for(i = cot->card_arr_idx; i >= 0; --i) {
- if(cot->card_arr == '-' || cot->card_arr == '\')
+ if(cot->card_arr[i][0] == '-' || cot->card_arr[i][0] == '\\')
continue;
- push_stack(deck, card);
+ push_stack(deck, cot->card_arr[i]);
}
cot->card_arr_idx = i;
}
@@ -386,7 +429,7 @@ int calculate_attack_card_quantity_on_table(const struct cards_on_table *cot)
return counter;
}
-int check_all_answers_were_received(const session **turn_queue, int size)
+int check_all_answers_were_received(const struct session **turn_queue, int size)
{
int i;