aboutsummaryrefslogtreecommitdiff
path: root/player.c
diff options
context:
space:
mode:
authorrodri <rgl@antares-labs.eu>2023-06-05 20:23:26 +0000
committerrodri <rgl@antares-labs.eu>2023-06-05 20:23:26 +0000
commit9c20abc1ab976cab00040a32299896dc8ea71e6c (patch)
tree5037406ea18c55dc0be2001c1d27e2d89edc16f7 /player.c
parent0625897dd0194986b02988eb5a9c2969e24adf0c (diff)
downloadmusw-9c20abc1ab976cab00040a32299896dc8ea71e6c.tar.gz
musw-9c20abc1ab976cab00040a32299896dc8ea71e6c.tar.bz2
musw-9c20abc1ab976cab00040a32299896dc8ea71e6c.zip
put the player routines in their own unit.
fixed an issue with the threadsim routine that would cause re-stepping of all the previous parties after dissolving one of them due to one of the players quitting.
Diffstat (limited to 'player.c')
-rw-r--r--player.c91
1 files changed, 91 insertions, 0 deletions
diff --git a/player.c b/player.c
new file mode 100644
index 0000000..fc573b7
--- /dev/null
+++ b/player.c
@@ -0,0 +1,91 @@
+#include <u.h>
+#include <libc.h>
+#include <ip.h>
+#include <mp.h>
+#include <libsec.h>
+#include <draw.h>
+#include <geometry.h>
+#include "dat.h"
+#include "fns.h"
+
+Player *
+newplayer(char *name, NetConn *nc)
+{
+ Player *p;
+
+ p = emalloc(sizeof(Player));
+ p->name = name? strdup(name): nil;
+ p->conn = nc;
+ p->oldkdown = p->kdown = 0;
+ p->next = nil;
+
+ return p;
+}
+
+void
+delplayer(Player *p)
+{
+ free(p->name);
+ free(p);
+}
+
+/* Player queue */
+
+static void
+playerq_put(Playerq *pq, Player *p)
+{
+ if(pq->tail == nil)
+ pq->head = pq->tail = p;
+ else{
+ pq->tail->next = p;
+ pq->tail = p;
+ }
+ pq->len++;
+}
+
+static Player *
+playerq_get(Playerq *pq)
+{
+ Player *p;
+
+ if(pq->head == nil)
+ return nil;
+
+ p = pq->head;
+ if(pq->head == pq->tail)
+ pq->head = pq->tail = nil;
+ else{
+ pq->head = p->next;
+ p->next = nil;
+ }
+ pq->len--;
+ return p;
+}
+
+static void
+playerq_del(Playerq *pq, Player *p)
+{
+ Player *np;
+
+ if(pq->head == p){
+ pq->get(pq);
+ return;
+ }
+
+ for(np = pq->head; np != nil && np->next != nil; np = np->next)
+ if(np->next == p){
+ np->next = np->next->next;
+ p->next = nil;
+ pq->len--;
+ }
+}
+
+void
+initplayerq(Playerq *pq)
+{
+ pq->head = pq->tail = nil;
+ pq->len = 0;
+ pq->put = playerq_put;
+ pq->get = playerq_get;
+ pq->del = playerq_del;
+} \ No newline at end of file