X-Git-Url: http://git.mutantstargoat.com/user/nuclear/?a=blobdiff_plain;f=src%2Flevel.c;h=d74d52f3cdcedccb7aead388328ccb57b2790b64;hb=7aad8db2edab014c0f750de76bc24bdab63aef2a;hp=d174ba6fd3370c32a6aa45af1ea0f5cd38db4be7;hpb=5e41feadc19dbc9cda954543cf2b2649ced835b4;p=gbajam22 diff --git a/src/level.c b/src/level.c index d174ba6..d74d52f 100644 --- a/src/level.c +++ b/src/level.c @@ -2,11 +2,12 @@ #include "debug.h" #include "level.h" #include "player.h" +#include "xgl.h" 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; @@ -40,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; @@ -51,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++; @@ -78,31 +92,45 @@ 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 */ - {{-2,-4}, {2,-4}, {-1,-4}, {1,-4}, {0,-4}, {-1,-3}, {1,-3}, {0,-3}, {-1,-2}, - {1,-2}, {0,-2}, {0,-1}, {0,0}}, + {{-4,-4}, {4,-4}, {-3,-4}, {3,-4}, {-2,-4}, {2,-4}, {-3,-3}, {3,-3}, {-1,-4}, + {1,-4}, {0,-4}, {-2,-3}, {2,-3}, {-1,-3}, {1,-3}, {0,-3}, {-2,-2}, {2,-2}, + {-1,-2}, {1,-2}, {0,-2}, {-1,-1}, {1,-1}, {0,-1}, {0,0}}, /* dir 1 */ - {{4,-4}, {3,-4}, {4,-3}, {2,-4}, {4,-2}, {3,-3}, {2,-3}, {3,-2}, {1,-3}, - {3,-1}, {2,-2}, {1,-2}, {2,-1}, {1,-1}, {0,0}}, + {{4,-4}, {3,-4}, {4,-3}, {2,-4}, {4,-2}, {3,-3}, {1,-4}, {4,-1}, {0,-4}, + {4,0}, {2,-3}, {3,-2}, {1,-3}, {3,-1}, {0,-3}, {3,0}, {2,-2}, {1,-2}, + {2,-1}, {0,-2}, {2,0}, {1,-1}, {0,-1}, {1,0}, {0,0}}, /* dir 2 */ - {{4,-2}, {4,2}, {4,-1}, {4,1}, {4,0}, {3,-1}, {3,1}, {3,0}, {2,-1}, {2,1}, - {2,0}, {1,0}, {0,0}}, + {{4,-4}, {4,4}, {4,-3}, {4,3}, {4,-2}, {4,2}, {3,-3}, {3,3}, {4,-1}, {4,1}, + {4,0}, {3,-2}, {3,2}, {3,-1}, {3,1}, {3,0}, {2,-2}, {2,2}, {2,-1}, {2,1}, + {2,0}, {1,-1}, {1,1}, {1,0}, {0,0}}, /* dir 3 */ - {{4,4}, {4,3}, {3,4}, {4,2}, {2,4}, {3,3}, {3,2}, {2,3}, {3,1}, {1,3}, - {2,2}, {2,1}, {1,2}, {1,1}, {0,0}}, + {{4,4}, {4,3}, {3,4}, {4,2}, {2,4}, {3,3}, {4,1}, {1,4}, {4,0}, {0,4}, + {3,2}, {2,3}, {3,1}, {1,3}, {3,0}, {0,3}, {2,2}, {2,1}, {1,2}, {2,0}, + {0,2}, {1,1}, {1,0}, {0,1}, {0,0}}, /* dir 4 */ - {{-2,4}, {2,4}, {-1,4}, {1,4}, {0,4}, {-1,3}, {1,3}, {0,3}, {-1,2}, {1,2}, - {0,2}, {0,1}, {0,0}}, + {{-4,4}, {4,4}, {-3,4}, {3,4}, {-2,4}, {2,4}, {-3,3}, {3,3}, {-1,4}, {1,4}, + {0,4}, {-2,3}, {2,3}, {-1,3}, {1,3}, {0,3}, {-2,2}, {2,2}, {-1,2}, {1,2}, + {0,2}, {-1,1}, {1,1}, {0,1}, {0,0}}, /* dir 5 */ - {{-4,4}, {-4,3}, {-3,4}, {-4,2}, {-2,4}, {-3,3}, {-3,2}, {-2,3}, {-3,1}, - {-1,3}, {-2,2}, {-2,1}, {-1,2}, {-1,1}, {0,0}}, + {{-4,4}, {-4,3}, {-3,4}, {-4,2}, {-2,4}, {-3,3}, {-4,1}, {-1,4}, {-4,0}, + {0,4}, {-3,2}, {-2,3}, {-3,1}, {-1,3}, {-3,0}, {0,3}, {-2,2}, {-2,1}, + {-1,2}, {-2,0}, {0,2}, {-1,1}, {-1,0}, {0,1}, {0,0}}, /* dir 6 */ - {{-4,-2}, {-4,2}, {-4,-1}, {-4,1}, {-4,0}, {-3,-1}, {-3,1}, {-3,0}, {-2,-1}, - {-2,1}, {-2,0}, {-1,0}, {0,0}}, + {{-4,-4}, {-4,4}, {-4,-3}, {-4,3}, {-4,-2}, {-4,2}, {-3,-3}, {-3,3}, {-4,-1}, + {-4,1}, {-4,0}, {-3,-2}, {-3,2}, {-3,-1}, {-3,1}, {-3,0}, {-2,-2}, {-2,2}, + {-2,-1}, {-2,1}, {-2,0}, {-1,-1}, {-1,1}, {-1,0}, {0,0}}, /* dir 7 */ - {{-4,-4}, {-3,-4}, {-4,-3}, {-2,-4}, {-4,-2}, {-3,-3}, {-2,-3}, {-3,-2}, - {-1,-3}, {-3,-1}, {-2,-2}, {-1,-2}, {-2,-1}, {-1,-1}, {0,0}} + {{-4,-4}, {-3,-4}, {-4,-3}, {-2,-4}, {-4,-2}, {-3,-3}, {-1,-4}, {-4,-1}, + {0,-4}, {-4,0}, {-2,-3}, {-3,-2}, {-1,-3}, {-3,-1}, {0,-3}, {-3,0}, {-2,-2}, + {-1,-2}, {-2,-1}, {0,-2}, {-2,0}, {-1,-1}, {0,-1}, {-1,0}, {0,0}} }; void upd_vis(struct level *lvl, struct player *p) @@ -110,18 +138,27 @@ void upd_vis(struct level *lvl, struct player *p) int dir, idx; int x, y; struct cell *cptr; + int32_t theta; pos_to_cell(lvl, p->x, p->y, &p->cx, &p->cy); lvl->numvis = 0; idx = -1; - dir = 0; /* TODO use p->theta */ + theta = X_2PI - p->theta + X_2PI / 16; + if(theta >= X_2PI) theta -= X_2PI; + dir = (theta << 3) / X_2PI; /* p->theta is always [0, 2pi) */ + if(dir < 0 || dir >= 8) { + panic(get_pc(), "dir: %d\ntheta: %d.%d (%d)\n", dir, p->theta >> 16, + p->theta & 0xffff, p->theta); + } do { idx++; 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); }