#include <allegro.h>
#include <math.h>
#include <ctime>

#define MODE GFX_AUTODETECT_WINDOWED
#define WIDTH 640
#define HEIGHT 480

#define sWHITE makecol(255,255,255)

BITMAP *buffer;
int logic_time = 0;
void logic_timer() {logic_time++;}
END_OF_FUNCTION(logic_timer)

float lx,ly;
float yspeed;
float maxgrav;

int kxv;
int kyv;

bool ktake;

int wingang;
int wingval;

int score;

float letime;
int levnum;

void nextlevel();

bool collide()
{
	int kx=kxv;
	int ky=kyv;
	int difx=kx-lx;
	int dify=ky-ly;
	int totdif=sqrt(difx*difx+dify*dify);
	
	if(totdif<30)
	return true;

	return false;

}

void drawkey(BITMAP *buf)
{
	int dax, day;
	dax=kxv;
	day=kyv;
	circle(buf, dax, day, 3,sWHITE);
	line(buf,dax,day+3,dax,day+13,sWHITE);
	line(buf,dax,day+9,dax-3,day+9,sWHITE);
	line(buf,dax,day+13,dax-3,day+13,sWHITE);

}

void nextlevel()
{
	float seed = time(NULL)*levnum;
	srand(seed);
	int theykey=rand()%(470)+10;
	int thexkey=rand()%(630)+10;
	kxv=thexkey;
	kyv=theykey;
	levnum++;
}
	

void Drawman(BITMAP* buf)
{
	int dax, day;
	lx=mouse_x;
	dax=lx;
	day=ly;
	circle(buf, dax,day,10,makecol(255,255,255));
	line(buf, dax,day,dax+15,day+35,sWHITE);
	line(buf, dax,day,dax-15,day+35,sWHITE);
	line(buf, dax-15,day+35,dax+15,day+35,sWHITE);
	
	//LEGS
	line(buf, dax-6,day+35,dax-6,day+55,sWHITE);
	line(buf, dax+6,day+35,dax+6,day+55,sWHITE);
	
	//ARMS
	float deg=wingang*3.14/180;
	line(buf,dax+5,day+10,dax+5+sin(deg)*20,day+10+cos(deg)*20,sWHITE);
	line(buf,dax-5,day+10,dax-5-sin(deg)*20,day+10+cos(deg)*20,sWHITE);
}

void DrawAll(BITMAP *buf)
{
	clear_bitmap(buf);
	Drawman(buf);
	drawkey(buf);
	textprintf_ex(buf,font,10,10,sWHITE,0,"Time:%f",letime);
	textprintf_ex(buf,font,10,25,sWHITE,0,"Level:%d",levnum);
	blit(buf,screen,0,0,0,0,640,480);
}

bool glog()
{
	wingang+=wingval;
	if(wingang>135||wingang<45)
	{	
		wingang-=wingval;
		wingval=-wingval;
	}
	ly+=yspeed;
	
	if (!(mouse_b & 1))yspeed+=0.3;
	else yspeed-=0.4;
	
	if(yspeed>maxgrav)yspeed=maxgrav;

	if(collide())
	{
	nextlevel();
	score++;
	letime=20-(0.5*levnum);
	}

	letime-=0.03;
	if(letime<0)
	return false;
	else 
	return true;
}

int main()
{
    allegro_init();
    install_keyboard();
    install_mouse();
    install_timer();
    set_color_depth(32);
    set_gfx_mode(MODE, WIDTH, HEIGHT, 0, 0);
    //text_mode(-1);
    LOCK_VARIABLE(logic_time);
    LOCK_FUNCTION(logic_timer);
    install_int_ex(logic_timer, BPS_TO_TIMER(40));
    
    buffer = create_bitmap(WIDTH, HEIGHT);
    wingang=90;
	wingval=14;
	ly=100;
	letime=20;
	levnum=1;
	maxgrav=6;
	ktake=false;
	kxv=kyv=100;
    while (!key[KEY_ESC])
    {
		while(logic_time==0)rest(1);
		logic_time--;
		if(!glog())break;
		DrawAll(buffer);
		rest(0);
    }
    destroy_bitmap(buffer);
    return 0;
}
END_OF_MAIN()
