diff options
-rw-r--r-- | andy.c | 10 | ||||
-rw-r--r-- | btsd.c | 1 | ||||
-rw-r--r-- | fns.h | 2 | ||||
-rw-r--r-- | util.c | 28 |
4 files changed, 33 insertions, 8 deletions
@@ -39,7 +39,7 @@ Point2 nwes[] = { static char * getaname(void) { - return nametab[ntruerand(nelem(nametab))]; + return nametab[getrand(nelem(nametab))]; } static void @@ -69,21 +69,21 @@ Retry: switch(a->state){ case ASearching: do - cell = Pt2(ntruerand(MAPW), ntruerand(MAPH), 1); + cell = Pt2(getrand(MAPW), getrand(MAPH), 1); while(gettile(a, cell) != Twater); break; case ACalibrating: do cell = addpt2(a->firsthit, nwes[--a->ntries&3]); - while(gettile(a, cell) != Twater && a->ntries > 1); - if(a->ntries < 1 && gettile(a, cell) != Twater){ + while((gettile(a, cell) != Twater || isoob(cell)) && a->ntries > 1); + if(gettile(a, cell) != Twater || isoob(cell)){ a->disengage(a); goto Retry; } break; case ABombing: cell = addpt2(a->lastshot, a->passdir); - if(gettile(a, cell) != Twater){ + if(gettile(a, cell) != Twater || isoob(cell)){ turnaround(a); goto Retry; } @@ -388,7 +388,6 @@ aiproc(void *arg) if(ct == nil) goto Nocmd; -// sleep(ntruerand(5000)); switch(ct->index){ case ACMlayout: ai->layout(ai, newmsg(ai->ego, nil)); break; case ACMplay: ai->shoot(ai, newmsg(ai->ego, nil)); break; @@ -11,6 +11,7 @@ Image *eallocimage(Display*, Rectangle, ulong, int, ulong); /* * util */ +int isoob(Point2); char *cell2coords(Point2); Point2 coords2cell(char*); int gettile(Map*, Point2); @@ -26,6 +27,7 @@ int max(int, int); int bitpackmap(uchar*, ulong, Map*); int bitunpackmap(Map*, uchar*, ulong); int chanvprint(Channel*, char*, va_list); +ulong getrand(ulong); /* * menulist @@ -1,5 +1,7 @@ #include <u.h> #include <libc.h> +#include <mp.h> +#include <libsec.h> #include <thread.h> #include <draw.h> #include <mouse.h> @@ -33,13 +35,19 @@ static char *statenametab[] = { }; +int +isoob(Point2 cell) +{ + return cell.x < 0 || cell.x >= MAPW || + cell.y < 0 || cell.y >= MAPH; +} + char * cell2coords(Point2 cell) { static char s[3+1]; - assert(cell.x >= 0 && cell.x < MAPW - && cell.y >= 0 && cell.y < MAPH); + assert(!isoob(cell)); snprint(s, sizeof s, "%c%d", rowtab[(int)cell.y], (int)cell.x); return s; @@ -72,6 +80,7 @@ gettile(Map *m, Point2 cell) void settile(Map *m, Point2 cell, int type) { + assert(!isoob(cell)); m->map[(int)cell.x][(int)cell.y] = type; } @@ -84,6 +93,7 @@ settiles(Map *m, Point2 cell, int o, int ncells, int type) sv = o == OH? Vec2(1,0): Vec2(0,1); while(ncells-- > 0){ + assert(!isoob(cell)); settile(m, cell, type); cell = addpt2(cell, sv); } @@ -211,3 +221,17 @@ chanvprint(Channel *c, char *fmt, va_list arg) yield(); /* let recipient handle message immediately */ return n; } + +ulong +getrand(ulong max) +{ + mpint *n, *r; + ulong c; + + n = uitomp(max, nil); + r = mpnrand(n, genrandom, nil); + c = mptoui(r); + mpfree(n); + mpfree(r); + return c; +} |