back to scratko.xyz
aboutsummaryrefslogtreecommitdiff
path: root/server/server_data_processing.c
diff options
context:
space:
mode:
authorscratko <m@scratko.xyz>2024-08-16 18:10:11 +0300
committerscratko <m@scratko.xyz>2024-08-16 18:10:11 +0300
commiteb90648bdad1443c9cfc72e903a93642e10a0ab7 (patch)
treedc567a9aa834bb0d5f3429e8a38910990d75e4eb /server/server_data_processing.c
parent880b8be2c28d761505b2eecc1386919d5add6f2f (diff)
downloaddurak-eb90648bdad1443c9cfc72e903a93642e10a0ab7.tar.gz
durak-eb90648bdad1443c9cfc72e903a93642e10a0ab7.tar.bz2
durak-eb90648bdad1443c9cfc72e903a93642e10a0ab7.zip
Global fixes v2.0
Added spectator mode. Added screen of game result. Added definition of durak. If not all players can replenish their decks, they take cards one at a time in turn.
Diffstat (limited to 'server/server_data_processing.c')
-rw-r--r--server/server_data_processing.c42
1 files changed, 34 insertions, 8 deletions
diff --git a/server/server_data_processing.c b/server/server_data_processing.c
index b7b2374..fc81996 100644
--- a/server/server_data_processing.c
+++ b/server/server_data_processing.c
@@ -63,7 +63,9 @@ int check_readiness(struct session *client)
}
/*
* example: 10#\A^\7v'\n'
- * or 0'\n'
+ * or: 10#\A^\7v:
+ * or: ='\n'
+ * or: =:
*/
static void copy_card_queue(int *offset, struct card_queue *cq)
{
@@ -84,7 +86,7 @@ static void copy_card_queue(int *offset, struct card_queue *cq)
/*
* example: 10#+\+Q#+A^+\+-+7v:
- * or 0:
+ * or =:
*/
static void copy_cards_on_table(int *offset, struct cards_on_table cot)
{
@@ -102,8 +104,8 @@ static void copy_cards_on_table(int *offset, struct cards_on_table cot)
/*
* example: 10#\A^\7v:
* or 10#\A^\7v'\n'
- * or 0:
- * or 0'\n'
+ * or =:
+ * or ='\n'
*/
static void copy_own_deck(int *offset, player_cards deck)
{
@@ -153,8 +155,10 @@ static void copy_base_info(int *free_pos, struct game_info *gi,
*free_pos += sprintf(output_buffer + *free_pos, "=:");
}
-int print_game_part(const struct session *client, struct game_info *gi)
+int print_game_part(const struct session *client,
+ enum server_states ss, struct game_info *gi)
{
+ enum spectator_mode sp_mode;
int free_pos; /* free_pos == data length */
copy_base_info(&free_pos, gi, client->state, client->deck,
@@ -181,6 +185,7 @@ int print_game_part(const struct session *client, struct game_info *gi)
*(output_buffer + free_pos-1) = '\n';
break;
case defense_expectation:
+ case spectator:
/* copying whose turn */
free_pos += sprintf(output_buffer + free_pos, "%u:",
gi->position_whose_turn);
@@ -189,6 +194,17 @@ int print_game_part(const struct session *client, struct game_info *gi)
free_pos += sprintf(output_buffer + free_pos, "=:");
else
copy_card_queue(&free_pos, gi->cq);
+ if(client->state == spectator) {
+ if(ss == attack_phase_out)
+ sp_mode = spectator_attack;
+ else if(ss == defense_phase_out)
+ sp_mode = spectator_defense;
+ else if(ss == tossing_phase_out)
+ sp_mode = spectator_tossing;
+ else
+ sp_mode = spectator_table;
+ free_pos += sprintf(output_buffer + free_pos, "%u:", sp_mode);
+ }
*(output_buffer + free_pos-1) = '\n';
default:
{}
@@ -315,6 +331,10 @@ int get_cards_from_tossing_player(struct session *client,
if(!read_result)
return read_result;
+ /* cancellation */
+ if(client->buffer[0] == '\n')
+ return 3;
+
for(i = 0, j = 0; i < read_result; ++i) {
if(client->buffer[i] == '\\') {
/* tossing limit was set */
@@ -342,9 +362,6 @@ int get_cards_from_tossing_player(struct session *client,
given_card[j] = client->buffer[i];
++j;
}
- /* cancellation */
- if(client->buffer[0] == '\n')
- return 3;
/* 7 -- state for result of received cards */
data_length = sprintf(output_buffer, "%d:%s\n", card_acceptance_status,
@@ -355,3 +372,12 @@ int get_cards_from_tossing_player(struct session *client,
else
return 2;
}
+
+void print_game_result(const struct session *client, int durak_position)
+{
+ int data_size;
+
+ data_size =
+ sprintf(output_buffer, "%u:%u\n", client->state, durak_position);
+ write_to_client(client->fd, data_size);
+}