LOS by Odd

From RogueBasin
Jump to navigation Jump to search
#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]]