static void cast_ray(map_t *map, int xo, int yo, int xd, int yd, int r2,bool light_walls) { int curx=xo,cury=yo; bool in=false; bool blocked=false; bool end=false; int offset; TCOD_line_init(xo,yo,xd,yd); offset=curx+cury*map->width; if ( 0 <= offset && offset < map->nbcells ) { in=true; map->cells[offset].fov=1; } while (!end) { end = TCOD_line_step(&curx,&cury); /* reached xd,yd */ offset=curx+cury*map->width; if ( r2 > 0 ) { /* check radius */ int cur_radius=(curx-xo)*(curx-xo)+(cury-yo)*(cury-yo); if ( cur_radius > r2 ) return; } if ( 0 <= offset && offset < map->nbcells ) { in=true; if ( !blocked && ! map->cells[offset].transparent ) { blocked=true; } else if ( blocked ) { return; /* wall */ } if ( light_walls || ! blocked ) map->cells[offset].fov=1; } else if (in) return; /* ray out of map */ } }
bool TCODLine::step(int *xCur, int *yCur) { return TCOD_line_step(xCur,yCur) != 0; }