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 */
	}
}
Exemple #2
0
// ********** bresenham line drawing **********
void TCODLine::init(int xFrom, int yFrom, int xTo, int yTo) {
	TCOD_line_init(xFrom,yFrom,xTo,yTo);
}