diff --git a/hm_lobbyserver/src/game.c b/hm_lobbyserver/src/game.c index 3174d27..d2ae069 100644 --- a/hm_lobbyserver/src/game.c +++ b/hm_lobbyserver/src/game.c @@ -15,66 +15,73 @@ You should have received a copy of the GNU General Public License along with this program. If not, see . */ -#include -#include -#include -#include #include +#include +#include +#include +#include #include #include struct playerlist_s { - struct conn_client_s *player; - struct playerlist_s *next; + struct conn_client_s *player; + struct playerlist_s *next; }; -static struct playerlist_s *queue = NULL; static int gamehandle = 0; +struct playerlist_s *queue = NULL; +struct playerlist_s *tail = NULL; // Pointer to the last element -void mm_push(struct conn_client_s *c) -{ - struct playerlist_s *p; - - p = malloc(sizeof(*p)); - - p->player = c; - p->next = queue; +// Add a player to the matchmaking queue +void mm_push(struct conn_client_s *c) { + struct playerlist_s *p = malloc(sizeof(*p)); + p->player = c; + p->next = NULL; + if (queue == NULL) { queue = p; + } else { + tail->next = p; + } + + tail = p; // Update the tail pointer } -struct conn_client_s *mm_pop() -{ - struct conn_client_s *c; - struct playerlist_s *p; +// Remove a player from the matchmaking queue +struct conn_client_s *mm_pop() { + if (queue == NULL) + return NULL; - p = queue; - c = queue->player; + struct playerlist_s *temp = queue; + struct conn_client_s *c = temp->player; - queue = queue->next; - free(p); + queue = queue->next; + if (queue == NULL) { + tail = NULL; // If the queue is empty after pop, reset the tail pointer + } + free(temp); - return c; + return c; } -int matchmaking(struct conn_client_s *player1) -{ - struct conn_client_s *player2; +// Matchmaking +int matchmaking(struct conn_client_s *player) { + // Add the player to the queue + mm_push(player); - // first player - if(queue == NULL) { - mm_push(player1); - return 0; + while (queue != NULL && queue->next != NULL) { + struct conn_client_s *player1 = mm_pop(); + struct conn_client_s *player2 = mm_pop(); + + if (player1 && player2) { + start_game(player1, player2, gamehandle++); + } else { + // This block should never be reached in this setup + return -1; } + } - player2 = mm_pop(); - - if(player1 && player2) { - start_game(player1, player2, gamehandle++); - return 0; - } - - return -1; + return 0; }