LOS by Odd

From RogueBasin
Jump to navigation Jump to search
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.
#include <iostream.h>
#include <stdio.h>
#include <conio.h>
#include <math.h>
#include <windows.h>

/* by odd lobster@takas.lt
** map: 0-passable terrain(los can see), 1-block, 9-player start position(actualy this one isnt used), 5 - los can see, 3-player position
** ;)
*/
int myMap[20][20]=  {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
                     1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,
                     1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,
                     1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,
                     1,0,0,0,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,1,
                     1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,
                     1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,
                     1,0,0,0,0,0,0,0,9,0,0,0,0,0,0,0,0,0,0,1,
                     1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,
                     1,0,0,0,0,1,1,0,1,1,0,0,0,0,0,0,0,0,0,1,
                     1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,
                     1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,
                     1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,
                     1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,
                     1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,
                     1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,
                     1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,
                     1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,
                     1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,
                     1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1};

void drawline_mod(int map[20][20], int x, int y, int x2, int y2) {
    int dx = abs(x - x2);
    int dy = abs(y - y2);
    double s = double(.99/(dx>dy?dx:dy));
    double t = 0.0;
    while(t < 1.0) {
        dx = int((1.0 - t)*x + t*x2);
        dy = int((1.0 - t)*y + t*y2);
        if (map[dy][dx] != 1) {
			map[dy][dx] = 5;
		} else {
			return;
		}
        t += s; 
    }
}

void los(int map[20][20], int range, int plx, int ply) {
	int x, y;
	for (double f = 0; f < 3.14*2; f += 0.05) {
		x = int(range*cos(f)) + plx;
		y = int(range*sin(f)) + ply;
		drawline_mod(map,plx,ply,x,y);
	}
}

void draw_map(int map[20][20]) {
	for (int y=0; y<20; y++) {
		for (int x=0; x<20; x++) {
			if (map[y][x] == 0) {
				printf(" ");
			} else if (map[y][x] == 1) {
				printf("X");
			} else if (map[y][x] == 5) {
				printf(".");
			} else if (map[y][x] == 3) {
				printf("@");
			}
		}
		printf("\n");
	}
}

void main() {
	LARGE_INTEGER i1, i2, f;
	QueryPerformanceFrequency(&f);
	QueryPerformanceCounter(&i1); // start test
	los(myMap,99,8,6); // <- call los
	QueryPerformanceCounter(&i2); // end test
	int iii = 1000000*(i2.QuadPart - i1.QuadPart)/f.QuadPart;
	printf("Code executed in: %i/%i ms/ns\n", iii/1000, iii);
	myMap[6][8] = 3; // put player
	draw_map(myMap); // draw map ;)
	getch();
}


By Odd [[lobster@takas.lt]]