X-Git-Url: http://git.mutantstargoat.com/user/nuclear/?a=blobdiff_plain;f=src%2Flevel.c;h=d74d52f3cdcedccb7aead388328ccb57b2790b64;hb=7aad8db2edab014c0f750de76bc24bdab63aef2a;hp=f7c54a186ffdb1894c79501281225e64b2636508;hpb=0ff927162004fe6b5d0022000284a1bdb306960e;p=gbajam22 diff --git a/src/level.c b/src/level.c index f7c54a1..d74d52f 100644 --- a/src/level.c +++ b/src/level.c @@ -7,7 +7,7 @@ struct level *init_level(const char *descstr) { const char *str, *line; - int i, j, ncols = 0, nrows = 0; + int i, j, x, ncols = 0, nrows = 0; struct level *lvl; struct cell *cell; @@ -41,6 +41,13 @@ struct level *init_level(const char *descstr) lvl->mobs = 0; lvl->items = 0; + lvl->xshift = 0; + x = ncols - 1; + while(x) { + x >>= 1; + lvl->xshift++; + } + str = descstr; cell = lvl->cells; @@ -52,6 +59,12 @@ struct level *init_level(const char *descstr) cell->type = CELL_SOLID; } else { cell->type = CELL_WALK; + switch(*str) { + case 's': + lvl->orgx = j; + lvl->orgy = i; + break; + } } cell++; while(*++str == '\n') str++; @@ -79,6 +92,12 @@ void free_level(struct level *lvl) } } +struct cell *level_cell(struct level *lvl, int cx, int cy) +{ + return lvl->cells + (cy << lvl->xshift) + cx; +} + +/* generated with tools/vistab */ struct {int dx, dy;} visoffs[8][32] = { /* dir 0 */ {{-4,-4}, {4,-4}, {-3,-4}, {3,-4}, {-2,-4}, {2,-4}, {-3,-3}, {3,-3}, {-1,-4}, @@ -137,7 +156,9 @@ void upd_vis(struct level *lvl, struct player *p) x = p->cx + visoffs[dir][idx].dx; y = p->cy + visoffs[dir][idx].dy; cptr = lvl->cells + y * lvl->width + x; - lvl->vis[lvl->numvis++] = cptr; + if(cptr->type != CELL_SOLID) { + lvl->vis[lvl->numvis++] = cptr; + } } while(visoffs[dir][idx].dx | visoffs[dir][idx].dy); }