From bdaa63a1a4604ada3539aeb50e4af144da3ba6f0 Mon Sep 17 00:00:00 2001 From: rodri Date: Sun, 25 Jul 2021 20:59:58 +0000 Subject: implemented parties to hold PvP match info. started serializing game state through the wire. made some major changes to the Lobby struct, plus the ability to check the health of every connection. added some more debug statements, did some cleanup and put more checks. --- pack.c | 114 ++++++++++++++++++----------------------------------------------- 1 file changed, 31 insertions(+), 83 deletions(-) (limited to 'pack.c') diff --git a/pack.c b/pack.c index 5899dbd..d60800d 100644 --- a/pack.c +++ b/pack.c @@ -3,58 +3,37 @@ #include "dat.h" #include "fns.h" -/* - * these routines were taken directly from ssh(1). - * they serve as a reference. - */ +static ulong +get4(uchar *p) +{ + return p[0]<<24 | p[1]<<16 | p[2]<<8 | p[3]; +} + +static void +put4(uchar *p, ulong u) +{ + p[0] = u>>24, p[1] = u>>16, p[2] = u>>8, p[3] = u; +} static int vpack(uchar *p, int n, char *fmt, va_list a) { uchar *p0 = p, *e = p+n; - u32int u; -// mpint *m; - void *s; - int c; + FPdbleword d; for(;;){ - switch(c = *fmt++){ + switch(*fmt++){ case '\0': return p - p0; - case '_': - if(++p > e) goto err; - break; - case '.': - *va_arg(a, void**) = p; - break; - case 'b': - if(p >= e) goto err; - *p++ = va_arg(a, int); - break; - case 'm': -// m = va_arg(a, mpint*); -// u = (mpsignif(m)+8)/8; - if(p+4 > e) goto err; -// PUT4(p, u), p += 4; - if(u > e-p) goto err; -// mptober(m, p, u), p += u; - break; - case '[': - case 's': - s = va_arg(a, void*); - u = va_arg(a, int); - if(c == 's'){ - if(p+4 > e) goto err; -// PUT4(p, u), p += 4; - } - if(u > e-p) goto err; - memmove(p, s, u); - p += u; - break; - case 'u': - u = va_arg(a, int); - if(p+4 > e) goto err; -// PUT4(p, u), p += 4; + case 'd': + d.x = va_arg(a, double); + + if(p+8 > e) + goto err; + + put4(p, d.hi), p += 4; + put4(p, d.lo), p += 4; + break; } } @@ -66,51 +45,20 @@ static int vunpack(uchar *p, int n, char *fmt, va_list a) { uchar *p0 = p, *e = p+n; - u32int u; -// mpint *m; - void *s; + FPdbleword d; for(;;){ switch(*fmt++){ case '\0': return p - p0; - case '_': - if(++p > e) goto err; - break; - case '.': - *va_arg(a, void**) = p; - break; - case 'b': - if(p >= e) goto err; - *va_arg(a, int*) = *p++; - break; - case 'm': - if(p+4 > e) goto err; -// u = GET4(p), p += 4; - if(u > e-p) goto err; -// m = va_arg(a, mpint*); -// betomp(p, u, m), p += u; - break; - case 's': - if(p+4 > e) goto err; -// u = GET4(p), p += 4; - if(u > e-p) goto err; - *va_arg(a, void**) = p; - *va_arg(a, int*) = u; - p += u; - break; - case '[': - s = va_arg(a, void*); - u = va_arg(a, int); - if(u > e-p) goto err; - memmove(s, p, u); - p += u; - break; - case 'u': - if(p+4 > e) goto err; -// u = GET4(p); - *va_arg(a, int*) = u; - p += 4; + case 'd': + if(p+8 > e) + goto err; + + d.hi = get4(p), p += 4; + d.lo = get4(p), p += 4; + *va_arg(a, double*) = d.x; + break; } } -- cgit v1.2.3