PROGRAM juego;

CONST
	LADO_MAPA = 64;

GLOBAL
	int gCuadro;
	int gMapa;
	int fuente;
	int logFile;
	string logFileName;
	
	struct consola
		string linea[24];
		int lineaActual;
	end
	
	struct partida
		string nombre;
		string nombreMalo;
		string nombrePareja;
		string nombreArma;
		string nombreMascota;
		string arma;
		int habitaciones;
	end
	
	struct logros
		int partidaEmpezada;
		int objetoRecogido;
		int combateGanado;
		int moverte;
		int teclaR;
		int tiempoPerdido;
		int numLogros;
	end
	
	string objeto[40];
	string enemigo[100];
	
BEGIN
	set_title("Legend of the crystal of the legend");
	set_mode(1024, 768, 16);
	set_fps(60, 0);
	alpha_steps = 128;
	bg();
	gMapa = new_map(LADO_MAPA, LADO_MAPA, 8);
	
	play_song(load_song("datos/battle2.ogg"), -1);
	fuente=load_fnt("datos/fuente.fnt");
	
	write_int(fuente, 1024, 0, 2, &fps);
	
	gCuadro = new_map(320,24,16);
	from x = 0 to 320;
		map_put_pixel(0, gCuadro, x, 0, rgb(255,255,0));
		map_put_pixel(0, gCuadro, x, 1, rgb(255,255,0));
		map_put_pixel(0, gCuadro, x, 22, rgb(255,255,0));
		map_put_pixel(0, gCuadro, x, 23, rgb(255,255,0));
	end

	y = fopen("datos/enemigos.txt", O_READ);
	from x = 0 to 99;
		enemigo[x] = fgets(y);
	end
	fclose(y);
	
	y = fopen("datos/objetos.txt", O_READ);
	from x = 0 to 39;
		objeto[x] = fgets(y);
	end
	fclose(y);
	
	
	getLinea("Pon tu nombre", &partida.nombre);
	getLinea("Pon el nombre de tu enemigo mortal", &partida.nombreMalo);
	getLinea("Pon el nombre de tu pareja", &partida.nombrePareja);
	getLinea("Pon el nombre de tu mascota", &partida.nombreMascota);
	getLinea("Pon el nombre de tu arma", &partida.arma);

	logFileName = "Diario de " + partida.nombre + " contra " + partida.nombreMalo + " para rescatar a " + partida.nombrePareja + ".txt";
	logFile = fopen(logFileName, O_WRITE);
	
	from y = 0 to 23;
		write_string(fuente, 32, 100 + 24*y, 0, &consola.linea[y]);
	end

	mapa();
	
	addLineaConsola("Hola, " + partida.nombre + ".");
	addLineaConsola("Resulta que " + partida.nombreMalo + " ha asesinado a tu familia.");
	addLineaConsola("Ademas ha quemado a " + partida.nombreMascota + " con cerillas, lentamente,");
	addLineaConsola("y le ha tocado el culo a " + partida.nombrePareja + " delante de tus narices.");
	addLineaConsola(partida.nombreMalo + " se esconde en esta mazmorra. Hora de la venganza!");
	addLineaConsola("...");
	addLineaConsola("Ah, si, muevete con las flechas " + partida.nombre + ".");

	jugador();
	
	write(fuente, 800, 350, 2, "Logros:");
	write_int(fuente, 810, 350, 0, &logros.numLogros);
	write(fuente, 800, 370, 2, "Habitaciones visitadas:");
	write_int(fuente, 810, 370, 0, &partida.habitaciones);
	
	logros.partidaEmpezada = 1;
	logros.numLogros++;
	addLineaConsola(":::[ LOGRO DESBLOQUEADO: Comenzar la partida. ]:::");
	
	repeat
		frame;
	until(key(_esc));
	
	exit(0,0);
END

PROCESS jugador();

PRIVATE
	int movido;
	int nuevaCasilla;
	int proximaAccion;
	int nTurnos;
	int proximoEnemigo;
	
BEGIN

	x = rand(0, LADO_MAPA-1);
	y = rand(0, LADO_MAPA-1);

	map_put_pixel(0, gMapa, x, y, 30);

	loop
		movido = 0;
		nuevaCasilla = 0;
		
		if(key(_left) && x>0)
			map_put_pixel(0, gMapa, x, y, 10);
			x--;
			if(map_get_pixel(0, gMapa, x, y)!=10)nuevaCasilla = 1;end
			map_put_pixel(0, gMapa, x, y, 30);
			movido = 1;
			repeat frame; until(!key(_left));
		end

		if(key(_right) && x<LADO_MAPA-1)
			map_put_pixel(0, gMapa, x, y, 10);
			x++;
			if(map_get_pixel(0, gMapa, x, y)!=10)nuevaCasilla = 1;end
			map_put_pixel(0, gMapa, x, y, 30);
			movido = 1;
			repeat frame; until(!key(_right));
		end

		if(key(_down) && y<LADO_MAPA-1)
			map_put_pixel(0, gMapa, x, y, 10);
			y++;
			if(map_get_pixel(0, gMapa, x, y)!=10)nuevaCasilla = 1;end
			map_put_pixel(0, gMapa, x, y, 30);
			movido = 1;
			repeat frame; until(!key(_down));
		end
		
		if(key(_up) && y>0)
			map_put_pixel(0, gMapa, x, y, 10);
			y--;
			if(map_get_pixel(0, gMapa, x, y)!=10)nuevaCasilla = 1;end
			map_put_pixel(0, gMapa, x, y, 30);
			movido = 1;
			repeat frame; until(!key(_up));
		end
		
		if(movido)
			if(logros.moverte==0)
				logros.moverte = 1;
				logros.numLogros++;
				addLineaConsola(":::[ LOGRO DESBLOQUEADO: Moviendo el culo. ]:::");
			end
		end
		
		if(key(_r) && !logros.teclaR)
				logros.teclaR = 1;
				logros.numLogros++;
				addLineaConsola(":::[ LOGRO DESBLOQUEADO: Pulsar la tecla R sin venir a cuento. ]:::");		
		end
		
		if(nuevaCasilla)
			partida.habitaciones++;
			proximaAccion = rand(0,2);
			
			if(proximaAccion == 0)
				addLineaConsola("No hay nada en esta habitacion. Sigamos.");	
			end
			
			if(proximaAccion == 1)
				if(logros.combateGanado==0)
					logros.combateGanado = 1;
					logros.numLogros++;
					addLineaConsola(":::[ LOGRO DESBLOQUEADO: Combatiente. ]:::");
				end
				proximoEnemigo=rand(0,99);
				nTurnos = rand(1,10);
				addLineaConsola("DUELO ALEATORIO!!! " + enemigo[proximoEnemigo] + " aparece ante " + partida.nombre);				
				while(nTurnos>0)
					textoAtaqueEnemigo(proximoEnemigo);
					textoAtaqueJugador(proximoEnemigo);
					nTurnos--;
				end
				addLineaConsola("Has derrotado a " + enemigo[proximoEnemigo] + " gracias a tu " + partida.arma);				
			end
			
			if(proximaAccion == 2)
				textoObjeto();				
				if(logros.objetoRecogido==0)
					logros.objetoRecogido = 1;
					logros.numLogros++;
					addLineaConsola(":::[ LOGRO DESBLOQUEADO: Conseguir un objeto. ]:::");
				end
			end
			
			if(partida.habitaciones>10 && logros.tiempoPerdido==0)
				logros.tiempoPerdido=1;
				logros.numLogros++;
				addLineaConsola("Anda...");
				addLineaConsola("Resulta que me habia equivocado...");
				addLineaConsola(partida.nombre + " esta en la mazmorra que no es, " + partida.nombreMalo + " no esta aqui.");
				addLineaConsola(partida.nombreMalo + " se ha llevado a " + partida.nombrePareja + " a una mazmorra, pero es otra.");
				addLineaConsola("Bueno, un error lo comete cualquiera.");
				addLineaConsola(partida.nombrePareja + " ya debe haber muerto a estas horas, pero miralo por el lado bueno...");		
				addLineaConsola(partida.nombre + " encontrado muchos objetos muy chulos...");
				addLineaConsola("Verdad?");
				addLineaConsola("Verdaaaad?");
				addLineaConsola("Que no?");
				addLineaConsola("Bueno, da igual. Yo me piro.");
				addLineaConsola("...");				
				addLineaConsola(":::[ LOGRO DESBLOQUEADO: Tiempo perdido. ]:::");
				addLineaConsola("...");				
				addLineaConsola("....");				
				addLineaConsola(".......");				
				addLineaConsola("Bueno va, te cuento un chiste o algo...");	
				addLineaConsola("...");				
				addLineaConsola("Esto es un cowboy que llega a un pueblo de esos del viejo oeste");
				addLineaConsola("y entra al bar, y se pide una copa tranquilamente. De repente, ");				
				addLineaConsola("entra uno de los pueblerinos, agitado, gritando:");				
				addLineaConsola("QUE VIENE EL INDIO GORRON! QUE VIENE EL INDIO GORRON!");				
				addLineaConsola("Toda la gente del pueblo se esconde, clavando incluso puertas y ventanas, menos el forastero.");				
				addLineaConsola("Entonces entra un indio muy canijo, y se le acerca.");
				addLineaConsola("Has visto a Tomas? - dice el indio.");				
				addLineaConsola("Que Tomas? - contesta el forastero.");				
				addLineaConsola("Un whiskito! - grita el indio.");				
				addLineaConsola("El forastero, cabreado por haber sido gorroneado, desafia al indio");				
				addLineaConsola("a una partida de poker. El indio acepta.");				
				addLineaConsola("Picas. - Dice el indio sin venir a cuento.");				
				addLineaConsola("Picas? Que picas? - dice el forastero confuso.");				
				addLineaConsola("Unas almendricas! - contesta el indio, entusiasmado. ");				
				addLineaConsola("El forastero, harto de ser gorroneado, saca su arma, " + partida.arma + " y mata al indio.");
				addLineaConsola("Al oir disparos, la gente del pueblo vuelve al bar");				
				addLineaConsola("Todos celebran con bebida y bailes la muerte del indio gorron, hasta que llega uno gritando:");
				addLineaConsola("LA HEMOS LIADO! VIENE LA TRIBU DEL INDIO GORRON!!!");				
				addLineaConsola("Salen todos fuera, y ven una humareda acercarse.");
				addLineaConsola("Cuando se disipa, ven a toda la tribu, con el jefe al frente.");
				addLineaConsola("Quien haber matado indio gorron? - Dice el jefe.");
				addLineaConsola("Ante el silencio de los pueblerinos asustados, el forastero da un paso al frente.");
				addLineaConsola("Haber sido tu? tu solo? - dice el jefe indio.");				
				addLineaConsola("Si! He sido yo! Yo SOLO!");
				addLineaConsola("A lo que contestan los indios al unisono:");
				addLineaConsola("Pues nosotros CON LECHE!");				
				addLineaConsola("...");				
				addLineaConsola("Eso es todo. Puedes seguir explorando o salir.");				

			end
			
		end
		
		frame;
	end
END

FUNCTION textoAtaqueEnemigo(int x);

BEGIN
	y = rand(0, 10);
	
	SWITCH(y)
		case 0:
			addLineaConsola(enemigo[x] + " da un puntapie a " + partida.nombre);
		end
		case 1:
			addLineaConsola(enemigo[x] + " lanza mordiscos al aire.");
		end
		case 2:
			addLineaConsola(enemigo[x] + " abofetea a " + partida.nombre);
		end
		case 3:
			addLineaConsola(enemigo[x] + " mira con deseo a " + partida.nombre);
		end
		case 4:
			addLineaConsola(enemigo[x] + " escupe a " + partida.nombre);
		end
		case 5:
			addLineaConsola(enemigo[x] + " golpea a " + partida.nombre);
		end
		case 6:
			addLineaConsola(enemigo[x] + " se rasca el trasero con vigor. Deja todo perdido de restos organicos.");
		end
		case 7:
			addLineaConsola(enemigo[x] + " empuja a " + partida.nombre);
		end
		case 8:
			addLineaConsola(enemigo[x] + " se restriega contra " + partida.nombre + " impregnando su cuerpo con sudor.");
		end
		case 9:
			addLineaConsola(enemigo[x] + " vomita sobre " + partida.nombre);
		end
		case 10:
			addLineaConsola(enemigo[x] + " azota el trasero de " + partida.nombre);
		end
		
	END
	
	addLineaConsola(partida.nombre + " pierde " + rand(1,100) + " PV");
	
END

FUNCTION textoAtaqueJugador(int x);

BEGIN
	y = rand(0, 10);
	
	SWITCH(y)
		case 0:
			addLineaConsola(partida.nombre + " abofetea a " + enemigo[x]);
		end
		case 1:
			addLineaConsola(partida.nombre + " golpea a " + enemigo[x] + " con " + partida.arma);
		end
		case 2:
			addLineaConsola(partida.nombre + " pone la zancadilla a " + enemigo[x] + " con " + partida.arma);
		end
		case 3:
			addLineaConsola(partida.nombre + " lanza una bola de fuego a " + enemigo[x]);
		end
		case 4:
			addLineaConsola(partida.nombre + " eructa con vigor.");
		end
		case 5:
			addLineaConsola(partida.nombre + " se quita los calcetines.");
		end
		case 6:
			addLineaConsola(partida.nombre + " lanza chinchetas a los pies de " + enemigo[x]);
		end
		case 7:
			addLineaConsola(enemigo[x] + " pisa una mierda." );
		end
		case 8:
			addLineaConsola(enemigo[x] + " esta confuso! tan confuso esta que se hiere a si mismo!");
		end
		case 9:
			addLineaConsola(partida.nombre + " da un cabezazo a " + enemigo[x]);
		end
		case 10:
			addLineaConsola(partida.nombre + " muerde a " + enemigo[x]);
		end

	END
	
	addLineaConsola(enemigo[x] + " pierde " + rand(1,100) + " PV");
	
END

FUNCTION textoObjeto();

PRIVATE string texto;

BEGIN
	// frase
	x = rand(0,20);
	// objeto
	y = rand(0,39);
	
	SWITCH(x)
	
		case 0:
			texto = partida.nombre + " ha encontrado " + objeto[y] + " en el suelo.";
		end

		case 1:
			texto = partida.nombre + " ha mangado " + objeto[y] + " a un esbirro de ." + partida.nombreMalo;
		end

		case 2:
			texto = partida.nombre + " encuentra " + objeto[y] + " en un estante mugriento. Pa la saca!";
		end

		case 3:
			texto = partida.nombre + " se hace con " + objeto[y] + ". Que suerte!";
		end
		
		case 4:
			texto = partida.nombre + " ha comprado " + objeto[y] + " a un vendedor.";
		end

		case 5:
			texto = partida.nombre + " encuentra " + objeto[y] + ", que pertenecia a " + partida.nombrePareja;
		end

		case 6:
			texto = objeto[y] + " aparece frente a " + partida.nombre + ". " + objeto[y] + " gratis! toma ya!";
		end

		case 7:
			texto = partida.nombre + " se encuentra " + objeto[y] + ", pero al rato se le cae.";
		end
		
		case 8:
			texto = partida.nombre + " encuentra " + objeto[y] + ", pero no lo quiere.";
		end
		
		case 9:
			texto = partida.nombre + " se tropieza con " + objeto[y] + ".";
		end
		
		case 10:
			texto = partida.nombre + " le da una patada a " + objeto[y] + " del suelo.";
		end
		
		case 11:
			texto = partida.nombre + " saca " + objeto[y] + " de una caja que hay en la habitacion.";
		end

		case 12:
			texto = partida.nombre + " encuentra " + objeto[y] + " en un monton de estiercol.";
		end
		
		case 13:
			texto = partida.nombre + " encuentra " + objeto[y] + " en un cadaver.";
		end		
			
		case 14:
			texto = partida.nombre + " pisa una mierda, y encuentra " + objeto[y] + " dentro.";
		end

		case 15:
			addLineaConsola(partida.nombre + " encuentra una lampara magica. Un genio aparece.");				
			texto = partida.nombre + " recibe " + objeto[y] + "como deseo.";
		end		

		case 16:
			addLineaConsola("El espiritu de " + partida.nombreMascota + " aparece ante " + partida.nombre);				
			texto = partida.nombre + " recibe " + objeto[y] + ".";
		end

		case 17:
			addLineaConsola(partida.nombre + " encuentra un cofre cubierto de caca. ");
			addLineaConsola(partida.nombre + " encuentra " + objeto[y] + " en su interior.");
			addLineaConsola(partida.nombre + " guarda " + objeto[y] + " en su mochila.");
			texto = partida.nombre + " se lame las manos para limpiarse. Nada volvera a ser igual.";
		end

		case 18:
			addLineaConsola(partida.nombre + " llega a una taberna. ");
			addLineaConsola(partida.nombre + " liga con la camarera.");
			addLineaConsola(partida.nombre + " recibe " + objeto[y] + " como muestra de amor correspondido.");
			texto = "Unos rusos muy grandes apalean a " + partida.nombre + " hasta el exterior del local.";
		end

		case 19:
			addLineaConsola(partida.nombre + " llega a una posada. ");
			addLineaConsola(partida.nombre + " duerme 20 horas.");
			texto = partida.nombre + " encuentra " + objeto[y] + " sobre su regazo al despertar.";
		end

		case 20:
			addLineaConsola(partida.nombre + " ve a una manada de trasgos durmientes.");
			addLineaConsola(partida.nombre + " entra en modo sigilo.");
			addLineaConsola(partida.nombre + " encuentra " + objeto[y] + " y se lo lleva.");
			addLineaConsola(partida.nombre + " tropieza con una pila de copas de cristal en un acto de torpeza.");
			texto = partida.nombre + " es atacado por los trasgos y huye cobardemente.";
		end

		
	END
	
	addLineaConsola(texto);		
	addLineaConsola("[[ OBJETO ENCONTRADO: " + objeto[y] + " ]]" );
	
END

PROCESS bg()

BEGIN
	graph = load_png("datos/background.png");
	z = 1;
	set_center(0, graph, 0, 0);
	
	loop
		alpha = 205 + 50*sin(timer*1000);
		if(key(_esc) ||exit_status)exit(0,0);end
		frame;
	end
END

FUNCTION getLinea(string titulo, string * cad);

PRIVATE
	string linea;
	byte last_ascii;
	int miTexto;
	int miTitulo;
	
BEGIN
	x = 1024/2;
	y = 768/2;
	graph = gCuadro;
	miTitulo = write_string(fuente, x-160, y-12, 6, &titulo);
	miTexto = write_string(fuente, x, y, 4, &linea);
	linea = "";
	flags = 4;
	
	while(!key(_enter) || (len(linea)==0))
	
		if(ascii>=32 && ascii!=last_ascii && len(linea)<32)
				linea = linea + ucase(chr(ascii));
				last_ascii=ascii;
				timer=0;
		end

		if(key(_backspace) && timer>8 && len(linea)==1)
			linea = "";
			timer=0;
		end

		if(key(_backspace) && timer>8)
			linea = substr(linea, 0, len(linea)-1);timer=0;
		end


		if(timer>20)last_ascii=0;end

		
		frame;	
	end
	
	while(key(_enter))frame;end
	flags=0;
	while(alpha>10)
		alpha = (alpha - alpha*0.1);frame;
	end
	
	delete_text(miTexto);
	delete_text(miTitulo);
	say(linea);
	*cad = linea;

END

FUNCTION string addLineaConsola(string linea)

BEGIN
	fputs(logFile, linea);
	
	if(consola.lineaActual==23)
		from x = 0 to 22;
			consola.linea[x] = consola.linea[x+1];
		end
	end
	
	from x = 0 to len(linea);
		consola.linea[consola.lineaActual] = substr(linea,0,x);
		frame;
	end
	if(consola.lineaActual<23) consola.lineaActual++; end
	frame(8000);
END

PROCESS mapa();

BEGIN
	graph = gMapa;
	set_center(0, graph, LADO_MAPA, 0);
	size = 400;
	flags = 4;
	
	from x = 0 to LADO_MAPA-1;
		from y = 0 to LADO_MAPA-1;
			map_put_pixel(0, graph, x, y, 1);
		end
	end
		
	x = 1024 - 32;
	y = 80;

	loop
		frame;
	end
	
END