PROGRAM churripong;
INCLUDE "DLL\import.prg";           		//Incluye las DLL necesarias para que todo funcione

global
int vol = 64;
int camb_pant; // cambio de pantalla, cambia el fondo segun la necesidad
int sort_tama; //tamaño de la bola, parametro del proceso bola()
int sort_tamao; //tamaño de la bola con respecto a la puntuacion
int tama_palo; //tamaño del palo con respecto a la puntuacion
int sort_altu; // altura donde se situará la bola, la del cañon
int frec_disp; // frecuencia de salida de bolas desde el cañon
int vel_bolay; // velocidad Y de la bola, avanzará con respecto a la puntuacion
int vel_bolax; // multiplicador para X de la bola, avanzará con respecto a la puntuacion
int puntos = 1; // marcador de puntos
int boing[5]; //array para cambiar los sonidos de la bola
int bola_perd; // contador de bolas perdidas segun nivel game over
int jueg_term; // activador para cuando el juego termine
int marc;

include "churripong/aud_gam.prg"
BEGIN
	set_mode(320,240,32,mode_window);
	load_fpg("churripong/grafics.fpg");	        //Carga el fichero para gráficos sonic.fpg de la carpeta images
	marc = load_fnt("churripong/huella.fnt");
	fondo(); puntero(); audiogame();
	rand_seed(time());
END					                    

process fondo()
begin
	graph = 401;
	x = 160;
	y = 120;
	z = 11;
	//text_z = 12;
	write_var(marc,160,30,1,puntos);
	write_var(0,20,180,1,frec_disp);
	write_var(0,20,190,1,camb_pant);
	write_var(0,20,200,1,bola_perd);
	loop
		if (camb_pant < 100) camb_pant ++; end
		//if (jueg_term == true) camb_pant = 50; graph = 801; camb_pant++; jueg_term = false; end
		switch (camb_pant)
			case 8: graph = 402; end
			case 18: graph = 401; camb_pant = 1; end
			case 100:
				z = 15;
				graph = 406; palo();
				bola(rand(40,200),rand(20,75));
				cano();
				toparri();
				topabaj();
				//cont_bola++;
				camb_pant = 101;
			end
		end
		if (mouse.left and camb_pant < 100) camb_pant = 100; end
		if (key(_esc)) exit(); end
		if (jueg_term == false)
			switch (puntos)
				case 0..249: sort_tamao = rand(10,90); tama_palo = 120; frec_disp = 50; vel_bolay = rand(1,2); vel_bolax = 2; end
				case 250..500: graph = 409; sort_tamao = rand(30,80); tama_palo = 100; frec_disp = 45; vel_bolay = rand(1,3); vel_bolax = 3; end
				case 501..999: graph = 404; sort_tamao = rand(25,75); tama_palo = 80; frec_disp = 40; vel_bolay = rand(1,5); vel_bolax = 3; end
				case 1000..1500: graph = 405; sort_tamao = rand(20,60); tama_palo = 70; frec_disp = 35; vel_bolay = rand(2,6); vel_bolax = 4; end
				case 1501..2000: graph = 407; sort_tamao = rand(15,50); tama_palo = 60; frec_disp = 30; vel_bolay = rand(2,9); vel_bolax = 4; end
				case 2001..2500: graph = 408; sort_tamao = rand(10,45); tama_palo = 50; frec_disp = 25; vel_bolay = rand(3,6); vel_bolax = 5; end
				case 2501..3000: graph = 406; sort_tamao = rand(5,15); tama_palo = 40; frec_disp = 15; vel_bolay = rand(4,9); vel_bolax = 6; end
				case 5000..9999: graph = rand(403,409); sort_tamao = 5; tama_palo = 25; frec_disp = 5; vel_bolay = rand(8,15); vel_bolax =7; end
			end
		else
			camb_pant = 1;
		end
		if (key(_h)) jueg_term = true; else jueg_term = false; end
		if (puntos =< 0) jueg_term = true; puntos = 1; end
		
		frame;
	end
end

process toparri() // tope de arriba
begin
	graph = 100;
	x = 160;
	y = 4;
	z = -80;
	loop
		frame;
	end
end
process topabaj() // tope de abajo
begin
	graph = 100;
	x = 160;
	y = 235;	
	z = 10;
	loop
		if (key(_g)) jueg_term = true; end
		frame;
	end
end

process palo()
private

int cont_parp; // contador para cambio de esprite
begin

	graph = 1;
	x = 25;
	y = 120;	
	loop
		if (jueg_term == true) break; end
		size = tama_palo;		 
		if (!collision (type toparri))
			IF (key(_up))
				y-=8;
			end
		end
		if (!collision (type topabaj))
			IF (key(_down))
				y+=8;
			end
		end
		if (!collision (type toparri))
			IF (key(_y))
				y-=12;
			end
		end
		if (!collision (type topabaj))
			IF (key(_x))
				y+=12;
			end
		end
		if (key (_space)) bola(sort_altu,rand(20,75)); end
		switch (cont_parp)
			case 1: graph = 1; end
			case 2: graph = 2; cont_parp = 1; end
		end
		frame;
	end
end

process cano() // cañon
private
int movi_sube; // movimiento del cañon, sube si es verdadero o true 
int tira_bola; //contador para tirar bolas
begin
	graph = 10;
	x = 290;
	y = 120;
	loop
	if (jueg_term == true) break; end
		if (movi_sube == true) y+=vel_bolax+3; else y-=vel_bolax+2; end
		if (y >= 230) movi_sube = false; end
		if (y <= 10) movi_sube = true; end
		sort_altu = y;
		tira_bola++;
		if (tira_bola => frec_disp) bola(sort_altu,sort_tamao); tira_bola = 0; end
		frame;
	end
end
	

process bola(sort_altu, sort_tama)
private
int velo_bolax = 5; // velocidad de avance de x
int velo_bolay; // velocidad de avance de y
int camb_direx; // cambio de direccion en x
int camb_direy; // cambio de direccion en y

begin
	
	graph = 201;
	x = 270;
	y = sort_altu;
	size = sort_tamao;
	velo_bolay = vel_bolay;
	boing[0]=load_wav("churripong/rebote0.wav");
	boing[1]=load_wav("churripong/rebote1.wav");
	boing[2]=load_wav("churripong/rebote2.wav");
	boing[3]=load_wav("churripong/rebote3.wav");
	boing[4]=load_wav("churripong/salebola.wav");
	boing[5]=load_wav("churripong/fallo.wav");
	play_wav(boing[4],0);
	loop
		if (jueg_term == true) break; end
		angle += 10000;
		if (angle >= 360000) angle = 0; end
		if (camb_direy == false) y = y - velo_bolay; else y += velo_bolay; end
		if (collision (type toparri)) camb_direy = true; end
		if (collision (type topabaj)) camb_direy = false; end
		if (camb_direx == false) x = x - velo_bolax; else x += velo_bolax; end
		if (collision (type palo))
			camb_direx = true;
			play_wav(boing[rand(0,3)],0);
			velo_bolax *= vel_bolax;
			velo_bolay *= vel_bolax;
			z = -33;
		end
		
		if (x >= 370)
			
			puntos += angle/10000;
			break;
		end
		if (x< -40)
			play_wav(boing[5],0);
			puntos /=2;
			break;
		end
		if(key(_a) && vol>0) vol=vol-1; end
		if(key(_s) && vol<128) vol=vol+1; end
		set_wav_volume(boing[0],vol-30);
		set_wav_volume(boing[1],vol-30);
		set_wav_volume(boing[2],vol-30);
		set_wav_volume(boing[3],vol-30);
		set_wav_volume(boing[4],vol-30);
		set_wav_volume(boing[5],vol-30);
		frame;
	end
end

process puntero()
begin
	graph = 201;
	size = 25;
	z = -255;
	loop
		if (mouse.left) size = 33; end
		x = mouse.x;
		y = mouse.y;
		size -=5;
		if (size =< 0) size = 5; end // provisional para pc
		
		frame;
	end
end


