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;
}