diff options
author | rodri <rgl@antares-labs.eu> | 2023-06-05 20:23:26 +0000 |
---|---|---|
committer | rodri <rgl@antares-labs.eu> | 2023-06-05 20:23:26 +0000 |
commit | 9c20abc1ab976cab00040a32299896dc8ea71e6c (patch) | |
tree | 5037406ea18c55dc0be2001c1d27e2d89edc16f7 /player.c | |
parent | 0625897dd0194986b02988eb5a9c2969e24adf0c (diff) | |
download | musw-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.c | 91 |
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 |