Roguelike-like Source (Tentative Title)

edit

#include "stdafx.h" //include this only if you are using windows.

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>
void refreshScreen(int screenx, int screeny);
int getMap(int x, int y);
int getDisc(int x, int y,int mode);
int getView(int sourceX,int sourceY, int pointX, int pointY, int viewDist, int fog);
int movePlayer(int screenx, int screeny);
void makePlayer();


struct PlayerChar
{
	char name[20];
	int maxhp;
	int hp;
	int x;
	int y;
} player;
int getMap(int x, int y)
{
	// _ is Floor
	// W is Wall
	// S is Solid (cannot walk over, but can see through)
	// t will be Torch (working on)
	register enum {_ = 0, 
				   W = 1,
				   S = 2};
	static int map1[20][20] =  {W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W, //1
					W,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,W,  //2
					W,_,_,_,_,W,_,W,_,_,S,S,S,S,S,S,S,_,_,W,  //3
					W,_,_,_,_,W,_,W,_,_,S,S,S,S,S,S,S,_,_,W,  //4
					W,_,_,_,_,W,_,W,_,_,S,S,S,S,S,S,S,_,_,W,  //5
					W,_,_,_,_,W,_,W,_,_,_,_,_,_,_,_,_,_,_,W,  //6
					W,W,W,W,W,W,_,W,W,W,W,W,W,W,W,W,W,W,W,W,  //7
					W,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,W,  //8
					W,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,W,  //9
					W,W,W,_,_,W,W,W,W,_,_,W,W,W,W,W,W,_,W,W,  //10
					W,_,_,_,_,_,W,W,_,_,_,_,_,W,W,_,_,_,_,W,  //11
					W,_,_,_,_,_,W,W,_,_,_,_,_,W,W,_,_,_,_,W,  //12
					W,_,_,_,_,_,W,W,_,_,_,_,_,W,W,_,_,_,_,W,  //13
					W,_,_,_,_,_,W,W,_,_,_,_,_,W,W,_,_,_,_,W,  //14
					W,_,_,_,_,_,W,W,_,_,_,_,_,W,W,_,_,_,_,W,  //15
					W,_,W,W,_,_,W,W,_,_,_,_,_,W,W,_,_,_,_,W,  //16
					W,_,_,W,_,_,W,W,_,_,_,_,_,W,W,_,_,_,_,W,  //17
					W,_,_,W,_,_,W,W,_,_,_,_,_,_,_,_,_,_,_,W,  //18
					W,_,_,W,_,_,W,W,_,_,_,_,_,W,W,_,_,_,_,W,  //19
					W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W,W};//20
	return map1[y][x];
}

int getDisc(int x, int y,int mode)
{
	static int Init = 1;
	static int disc[20][20];
	register int i, n, ret=1;
	if (Init == 1)
	{
		Init = 0;
		for (i=0; i<20; i++)
		{
			for (n=0; n<20; n++)
			{
				disc[i][n] = 1;
			}
		}
	}
	if (mode == -1)
	{
		ret = disc[x][y];
	}
	else
	{
		disc[x][y] = mode;
	}
	return ret;
}

int getView(int sourceX,int sourceY, int pointX, int pointY, int viewDist, int fog)
{
	register enum {viewDiscovered = 177,
		  viewFogDiscovered = 178,
		  viewSolidWall = 219,
		  viewFog = 176,
		  viewEmpty = ' '};

	register int rangeX,rangeY,range,ret,dirY,dirX;
	register int i = 0, n = 0;
	rangeX = pointX - sourceX;
	rangeY = pointY - sourceY;
	dirX = rangeX > 0 ? 1 : -1;
	dirY = rangeY > 0 ? 1 : -1;
	range = (rangeX*dirX) + (rangeY*dirY);
	if (getDisc(pointX,pointY,-1) == 0)
	{
		ret = viewDiscovered;
	}
	else if (getDisc(pointX,pointY,-1) == 2)
	{
		ret = viewFogDiscovered;
	}
	else
	{
		ret = viewSolidWall;
	}
	for (n=0;n<=(rangeY*dirY);n++)
	{
		if (getMap(sourceX,sourceY + (dirY*n))==1)
		{
			break;
		}
		for (i=0; i<=(rangeX*dirX); i++)
		{
			if (getMap(sourceX + (dirX*i),sourceY + (dirY*n))==1)
			{
				break;
			}
			else if ((i == (rangeX*dirX)) && (n == (rangeY*dirY)))
			{
				ret = viewEmpty;
				if (range <= viewDist)
				{
					getDisc(pointX,pointY,0);
				}
				else if ((range <= viewDist+fog) && getDisc(pointX,pointY,-1) != 0)
				{
					getDisc(pointX,pointY,2);
				}
			}
		}
	}
	if (ret != viewEmpty)
	{
		n = 0;
		i = 0;
		for (i=0;i<=(rangeX*dirX);i++)
		{
			if (getMap(sourceX + (dirX*i),sourceY)==1)
			{
				break;
			}
			for (n=0; n<=(rangeY*dirY); n++)
			{
				if (getMap(sourceX + (dirX*i),sourceY + (dirY*n))==1)
				{
					break;
				}
				else if ((i == (rangeX*dirX)) && (n == (rangeY*dirY)))
				{
					ret = viewEmpty;
					if (range <= viewDist)
					{
						getDisc(pointX,pointY,0);
					}
					else if ((range <= viewDist+fog) && getDisc(pointX,pointY,-1) != 0)
					{
						getDisc(pointX,pointY,2);
					}
				}
			}
		}
	}
	if (getMap(pointX,pointY))
	{
		ret = viewSolidWall;
	}
	else if (range > viewDist)
	{
		if ((range <= (viewDist+fog)) && (ret != viewSolidWall) && (ret != viewDiscovered) && (ret  != viewFogDiscovered))
		{
			ret = viewFog;
		}
		else if (getDisc(pointX,pointY,-1) == 0)
		{
			ret = viewDiscovered;
		}
		else if (getDisc(pointX,pointY,-1) == 2)
		{
			ret = viewFogDiscovered;
		}
		else
		{
			ret = viewSolidWall;
		}
	}
	return ret;
}

int movePlayer(int screenx, int screeny)
{
	register int ret;
	char playerKeys[10];

	scanf("%10s", &playerKeys);

	switch(playerKeys[0])
	{
	case 'l': ;
	case 'L':
		if ((player.x > 0) && (getMap(player.x-1,player.y) == 0))
		{
			player.x -= 1;
		}
		break;

	case 'r': ;
	case 'R':
		if ((player.x < screenx-1) &&   (getMap(player.x+1,player.y)==0))
		{
			player.x += 1;
		}
		break;

	case 'u': ;
	case 'U':
		if ((player.y > 0) && (getMap(player.x,player.y-1)==0))
		{
			player.y -= 1;
		}
		break;

	case 'd': ;
	case 'D':
		if ((player.y < screeny -1) &&   (getMap(player.x,player.y+1)==0))
	 	{
			player.y += 1;
		}
		break;

	case 'e': ;
	case 'Q': ;
	case 'E': ;
	case 'q':
		ret = 1; 
		break;
	default:;
	}
	return ret;
}

void refreshScreen(int screenx, int screeny)
{
	register int i = 0;
	register int n = 0;
	char newScreen[1000] = "Type l/r/u/d to move. Type 'Q' to exit.\n";
	//char newScreen[1000] = {"Type l/r/u/d to move. Type 'Q' to exit.\n",'H','P',
	//						':',' ',;
	register int at = 40;
	newScreen[at++] = '\n';
	for (n=0;n<screeny;n++)
	{
		for (i=0; i<screenx; i++)
		{
			if ((player.x == i) && (player.y == n))
			{
				//Player
				newScreen[at++] = 1; //241 kinda looks like a person.
			}
			else
			{
				newScreen[at++] = getView(player.x,player.y,i,n,4,2);
			}
		}
		newScreen[at++] = '\n';
	}
	newScreen[at++] = '\n';
	newScreen[at++] = '\n';
	newScreen[at++] = '\0';
	printf("%s",newScreen);
}
void makePlayer ()
{
	FILE *fchar;
	fchar = fopen("Character.txt", "r");
	fgets(player.name,20,fchar);
	player.hp = fgetc(fchar);
	player.maxhp = fgetc(fchar);
	printf("Before: \n Name: %s HP: %i / %i \n",player.name,player.hp,player.maxhp);
	printf("Hello, please enter your name:\n");
	gets(player.name);
	printf("I see, %s, what an odd name. It is so stupid,\n",player.name);
	printf("that I will throw you into a generic room! Ha ha ha!\n");
	player.hp = 10;
	player.maxhp = 10;
	printf("After: Name: %s\nHP: %i/%i\n",player.name,player.hp,player.maxhp);
	fchar = fopen("Character.txt", "w");
	fputs(player.name, fchar);
	fputc('\n', fchar);
	fputc((int) player.hp, fchar);
	fputc((int) player.maxhp, fchar);
	fclose(fchar);
}

void main()
{
	register int GExit = 0;
	register int roomx = 20;
	register int roomy = 20;
	makePlayer();
	player.x = 1;
	player.y = 1;
	refreshScreen ( roomx , roomy );
	while (1)
	{	
		GExit = movePlayer ( roomx , roomy );
		refreshScreen ( roomx , roomy );
		if (GExit != 0)
		{
			break;
		}
	}
}