aboutsummaryrefslogblamecommitdiff
path: root/menus.h
blob: e9b285c2dbf0cd3d706512597445932874ee1331 (plain) (tree)
1
2
3
4
5
6

                               
                         
                                
                                                             
                                          



















                                                                     

















                            





                                        
                        


                                            

                        

                                                          
         
                               
         
                                                    








                                                                         
                    


                        
                                                                                                         
                                       
                                                            

                                                            













                                                                                            


                                                                                                                  








                                                                              

                                                     

                                                    

          









                                                         














                                                                    
                                                                         


                                                                         
                                                                       
                                                                      
                                                                         


                                                                         
                    




































                                                                                             


                                                                                                                  











                                                                                 





































































































































































































                                                                                                                                                                                   

                                                                                    



                                                                       
                                                                                       











                                               
                                                                                

                                                                                        















                                                                                       


                                                                                              
                                                                                            


                                                                                                      
                                                                  
                                                                        
                                                                              


                                                                
                                                   

                                                 

                                       
                               
                               

                                                                                              
                                                                                        






                                                                                                      

                                                                
                                               


                                                   


                                                                            
                                                                                              
                                                                            
                                                                                            

                                                                                                      
                                                                                     
                                                                  
                                                                        
                                                                              


                                                                

























                                                                                      
                                                          
                                                                                         























                                                                                                                                           
                                               



                                                   
                                       

























































                                                                                               




                                     



                                                                 

                      




                                                
                                                                                         





                                                          
                              




                                                                             

                                                                             

                     
                                                                 

                                                               
                                                                             
                                                   
                                                                             
                                           
                                                                             
                                                
                                                                             

                                 


                                                                                                             


            


                                                                                                 



                                                               
                                 









                                       

                                                                                           

























































                                                                                                                         
                                                                                                             
     
                                                                                                            

















                                                                                                                         
                                                                                                               
     
                                                                                                              




































                                                                                                                         
                                                      

                         
                                                                                                 
     
                                                                                                


                                                                                                                  
                                                        
                         
                                                                      




                                                                                                                  
                                                      

                         
                                                                                                 
     
                                                                                                


                                                                                                                  
                                                        
                         
                                                                      




                                                                                                                  
                                                       

                         
                                                                                                   
     
                                                                                                  


                                                                                                                  
                                                         
                         
                                                                      




                                                                                                                    
                                                        

                         
                                                                                                     
     
                                                                                                    


                                                                                                                  
                                                          
                         
                                                                      

































                                                                                                                                       
                                                                                    
                                                                                   
                                                                                            



















































































































                                                                                                      
                                   

                             














                                                                               


                                                                


































































































































                                                                                                                    
                                                                     




                                                                                 
                                                                                                                    

                                                      
                                                                        




                                                                                   
                                                                                                                    
                                                        
                                               





                                                                                           
                                                                                                                    



                                                      


                                                                                        






















                                                                                          
//Chrisoft Bullet Lab Remix HGE
//Menu Implementations
//Copyright Chrisoft 2014
//Now this is being rewritten...
//                                --Announcement from Chirsno
//static const char* MENUS_H_FN="menus.h";
//Here's where new code grows...
void ConfigureQuad(hgeQuad *quad,double x,double y,double w,double h)
{
	quad->tex=0;quad->blend=BLEND_ALPHABLEND;
	quad->v[0].tx=0;quad->v[0].ty=0;
	quad->v[1].tx=1;quad->v[1].ty=0;
	quad->v[2].tx=1;quad->v[2].ty=1;
	quad->v[3].tx=0;quad->v[3].ty=1;
	quad->v[0].x=x;quad->v[0].y=y;
	quad->v[1].x=x+w;quad->v[1].y=y;
	quad->v[2].x=x+w;quad->v[2].y=y+h;
	quad->v[3].x=x;quad->v[3].y=y+h;
}
static const char* MMStr[]={
"Start",
"Highscore",
"Options",
"About",
"Exit"
};
static const char* OMStr[]={
"Fullscreen",
"VSync",
"Clear Range Key",
"Resolution",
"Player Preference",
"Save and Exit",
"On",
"Off",
"X",
"Z",
"800x600",
"640x480",
"960x720",
"1024x768",
"1280x960",
"?"
};
class MainMenu
{
private:
	bool active,onIn,onOut;
	int selected;
	double xoffset,yoffset,dyoffset;
	hgeSprite *Ribb;
	hgeQuad UpperGradient,LowerGradient;
public:
	bool isActive(){return active;}
	void Init_Once()
	{
		Ribb=new hgeSprite(MenuTex,256,350,64,16);
		Ribb->SetColor(0xCCFFFFFF);
	}
	void Init(double start)
	{
		xoffset=start;onIn=true;active=true;
		selected=0;dyoffset=yoffset=-selected*30;
		ConfigureQuad(&UpperGradient,xoffset-140,100,320,50);
		UpperGradient.v[0].col=UpperGradient.v[1].col=0xFF888820;
		UpperGradient.v[2].col=UpperGradient.v[3].col=0x00888820;
		ConfigureQuad(&LowerGradient,xoffset-140,300,320,100);
		LowerGradient.v[0].col=LowerGradient.v[1].col=0x00888820;
		LowerGradient.v[2].col=LowerGradient.v[3].col=0xFF888820;
	}
	void Leave(){onOut=true;}
	int Update()
	{
		if(onIn)
		{
			if(fabs(xoffset-650)<hge->Timer_GetDelta()*1600)return xoffset=650,onIn=false,-1;
			if(xoffset<650)
			xoffset+=hge->Timer_GetDelta()*1600;
			else
			xoffset-=hge->Timer_GetDelta()*1600;
		}
		if(onOut)
		{
			xoffset+=hge->Timer_GetDelta()*1600;
			if(xoffset>=850)active=onOut=false;
		}
		ConfigureQuad(&UpperGradient,xoffset-140,250,320,100);
		ConfigureQuad(&LowerGradient,xoffset-140,400,320,110);
		if(hge->Input_GetKeyStateEx(HGEK_UP)==HGEKST_HIT&&selected>0)--selected;
		if(hge->Input_GetKeyStateEx(HGEK_DOWN)==HGEKST_HIT&&selected<5-1)++selected;
		yoffset=-selected*30;
		if(fabs(dyoffset-yoffset)<0.2)dyoffset=yoffset;
		if(dyoffset<yoffset)dyoffset+=hge->Timer_GetDelta()*200;
		if(dyoffset>yoffset)dyoffset-=hge->Timer_GetDelta()*200;
		if(hge->Input_GetKeyStateEx(HGEK_Z)==HGEKST_HIT||hge->Input_GetKeyStateEx(HGEK_ENTER)==HGEKST_HIT)
			return selected;
		return -1;
	}
	void Render()
	{
		for(int i=0;i<5;++i)
		{
			double calcy=i*30+dyoffset+360;
			if(calcy>249.9&&calcy<500.1)
			MenuFont->printf(xoffset,calcy,HGETEXT_LEFT,MMStr[i]);
		}
		Ribb->RenderEx(xoffset-50,355,0,3,1);
		Ribb->RenderEx(xoffset-50,382,0,3,1);
		hge->Gfx_RenderQuad(&UpperGradient);
		hge->Gfx_RenderQuad(&LowerGradient);
	}
}mainMenu;
class StartMenu
{
private:
	bool active,onIn,onOut;
	double xoffset,yoffset,moffset;
	int selected;
	hgeQuad LeftGradient,RightGradient,LowerGradient;
	hgeSprite *clzk,*azmt,*fpmd,*msel;
public:
	bool isActive(){return active;}
	void Init_Once()
	{
		clzk=new hgeSprite(MenuTex,0,0,256,128);
		azmt=new hgeSprite(MenuTex,256,0,256,128);
		fpmd=new hgeSprite(MenuTex,0,128,256,128);
		msel=new hgeSprite(MenuTex,256,128,256,64);
		clzk->SetHotSpot(128,64);
		azmt->SetHotSpot(128,64);
		fpmd->SetHotSpot(128,64);
	}
	void Init()
	{
		active=true;onIn=true;yoffset=275;
		selected=0;xoffset=-selected*300;moffset=450;
		ConfigureQuad(&LowerGradient,0,400+yoffset,800,120);
		LowerGradient.v[0].col=LowerGradient.v[1].col=0x01888820;
		LowerGradient.v[2].col=LowerGradient.v[3].col=0xFF888820;
		ConfigureQuad(&LeftGradient,0,320+yoffset,100,200);
		LeftGradient.v[0].col=LeftGradient.v[3].col=0xFF888820;
		LeftGradient.v[1].col=LeftGradient.v[2].col=0x01888820;
		ConfigureQuad(&RightGradient,700,320+yoffset,100,200);
		RightGradient.v[0].col=RightGradient.v[3].col=0x01888820;
		RightGradient.v[1].col=RightGradient.v[2].col=0xFF888820;
	}
	void Leave(){onOut=true;}
	int Update()
	{
		if(onIn)
		{
			bool alldone=true;
            if(fabs(yoffset-0)<hge->Timer_GetDelta()*800)
				yoffset=0;
			else
				alldone=false,yoffset-=hge->Timer_GetDelta()*800;
			if(fabs(moffset-0)<hge->Timer_GetDelta()*1200)
				moffset=0;
			else alldone=false,moffset-=hge->Timer_GetDelta()*1200;
			if(alldone)onIn=false;
		}
		if(onOut)
		{
            bool alldone=true;
            if(fabs(yoffset-275)<hge->Timer_GetDelta()*800)
				yoffset=275;
			else
				alldone=false,yoffset+=hge->Timer_GetDelta()*800;
			if(fabs(moffset-450)<hge->Timer_GetDelta()*1200)
				moffset=450;
			else alldone=false,moffset+=hge->Timer_GetDelta()*800;
			if(alldone)onOut=active=false;
		}
		if(hge->Input_GetKeyStateEx(HGEK_LEFT)==HGEKST_HIT&&selected>0)--selected;
		if(hge->Input_GetKeyStateEx(HGEK_RIGHT)==HGEKST_HIT&&selected<3-1)++selected;
		if(fabs(xoffset-(-selected*300))<hge->Timer_GetDelta()*1000)
			xoffset=-selected*300;
		else
		{
			if(xoffset<-selected*300)xoffset+=hge->Timer_GetDelta()*1000;
			if(xoffset>-selected*300)xoffset-=hge->Timer_GetDelta()*1000;
		}
		ConfigureQuad(&LowerGradient,0,400+yoffset,800,120);
		ConfigureQuad(&LeftGradient,0,320+yoffset,100,200);
		ConfigureQuad(&RightGradient,700,320+yoffset,100,200);
		if(hge->Input_GetKeyStateEx(HGEK_Z)==HGEKST_HIT||hge->Input_GetKeyStateEx(HGEK_ENTER)==HGEKST_HIT)
			return selected;
		return -1;
	}
	void Render()
	{
		clzk->Render(400+xoffset,fabs((xoffset+0))*0.075+400+yoffset);
		azmt->Render(700+xoffset,fabs((xoffset+300))*0.075+400+yoffset);
		fpmd->Render(1000+xoffset,fabs((xoffset+600))*0.075+400+yoffset);
		hge->Gfx_RenderQuad(&LowerGradient);
		hge->Gfx_RenderQuad(&LeftGradient);
		hge->Gfx_RenderQuad(&RightGradient);
		msel->Render(0,moffset+200);
	}
}startMenu;
class OptionsMenu
{
private:
	bool active,onIn,onOut,onSwitch,onSwitchi;
	int selected;
	double xoffset,yoffset,dyoffset,swoffset,moffset;
	hgeSprite *Ribb,*msel;
	hgeQuad UpperGradient,LowerGradient;
public:
	bool isActive(){return active;}
	void Init_Once()
	{
		Ribb=new hgeSprite(MenuTex,256,350,64,16);
		msel=new hgeSprite(MenuTex,256,192,256,64);
		Ribb->SetColor(0xCCFFFFFF);
	}
	void Init(double start)
	{
		xoffset=start;onIn=active=true;onSwitch=onSwitchi=false;
		selected=0;dyoffset=yoffset=-selected*30;moffset=350;
		ConfigureQuad(&UpperGradient,xoffset-140,250,500,50);
		UpperGradient.v[0].col=UpperGradient.v[1].col=0xFF888820;
		UpperGradient.v[2].col=UpperGradient.v[3].col=0x00888820;
		ConfigureQuad(&LowerGradient,xoffset-140,430,500,100);
		LowerGradient.v[0].col=LowerGradient.v[1].col=0x00888820;
		LowerGradient.v[2].col=LowerGradient.v[3].col=0xFF888820;
	}
	void Leave(){onOut=true;}
	int Update()
	{
		if(onIn)
		{
			bool alldone=true;
			if(fabs(xoffset-450)<hge->Timer_GetDelta()*1600)xoffset=450;else
			{
				alldone=false;
				if(xoffset<450)
				xoffset+=hge->Timer_GetDelta()*1600;
				else
				xoffset-=hge->Timer_GetDelta()*1600;
			}
			if(fabs(moffset-0)<hge->Timer_GetDelta()*1200)
				moffset=0;
			else alldone=false,moffset-=hge->Timer_GetDelta()*1200;
			if(alldone)return onIn=false,-1;
		}
		if(onOut)
		{
			bool alldone=true;
			xoffset+=hge->Timer_GetDelta()*1600;
			if(xoffset<850)alldone=false;
			if(fabs(moffset-450)<hge->Timer_GetDelta()*1200)
				moffset=450;
			else alldone=false,moffset+=hge->Timer_GetDelta()*800;
			if(alldone)active=onOut=false;
		}
		ConfigureQuad(&UpperGradient,xoffset-140,250,500,100);
		ConfigureQuad(&LowerGradient,xoffset-140,430,500,100);
		if(!onSwitch)
		{
			if(hge->Input_GetKeyStateEx(HGEK_UP)==HGEKST_HIT&&selected>0)--selected;
			if(hge->Input_GetKeyStateEx(HGEK_DOWN)==HGEKST_HIT&&selected<6-1)++selected;
		}
		yoffset=-selected*30;
		if(fabs(dyoffset-yoffset)<0.2)dyoffset=yoffset;
		if(dyoffset<yoffset)dyoffset+=hge->Timer_GetDelta()*200;
		if(dyoffset>yoffset)dyoffset-=hge->Timer_GetDelta()*200;
		if(hge->Input_GetKeyStateEx(HGEK_RIGHT)==HGEKST_HIT&&hge->Input_GetKeyStateEx(HGEK_LEFT)==HGEKST_HIT)return -1;
		if(hge->Input_GetKeyStateEx(HGEK_RIGHT)==HGEKST_HIT||hge->Input_GetKeyStateEx(HGEK_Z)==HGEKST_HIT||hge->Input_GetKeyStateEx(HGEK_ENTER)==HGEKST_HIT)
		{
			if(onSwitch||onSwitchi)return -1;
			if(selected<=3)
			{
				onSwitch=true;
				swoffset=100;
			}
			if(selected==0)tfs=!tfs;
			if(selected==1)
			{
				fpslvl=fpslvl==2?0:2;
				if(fpslvl==2)hge->System_SetState(HGE_FPS,HGEFPS_VSYNC);
				if(fpslvl==0)hge->System_SetState(HGE_FPS,61);
			}
			if(selected==2)diffkey=!diffkey;
			if(selected==3)
			{
				++VidMode;
				if(VidMode>4)VidMode=0;
			}
			return selected;
		}
		if(hge->Input_GetKeyStateEx(HGEK_LEFT)==HGEKST_HIT)
		{
			if(onSwitch||onSwitchi)return -1;
			if(selected<=2){onSwitch=true;swoffset=100;}
			if(selected==0)tfs=!tfs;
			if(selected==1)
			{
				fpslvl=fpslvl==2?0:2;
				if(fpslvl==2)hge->System_SetState(HGE_FPS,HGEFPS_VSYNC);
				if(fpslvl==0)hge->System_SetState(HGE_FPS,61);
			}
			if(selected==2)diffkey=!diffkey;
			if(selected==3)
			{
				--VidMode;onSwitchi=true;swoffset=0;
				if(VidMode<0)VidMode=4;
			}
			return selected;
		}
		return -1;
	}
	void Render()
	{
		for(int i=0;i<6;++i)
		{
			double calcy=i*30+dyoffset+360;
			if(calcy>249.9&&calcy<500.1)
			{
				MenuFont->SetColor(0xFFFFFFFF);
				MenuFont->printf(xoffset,calcy,HGETEXT_LEFT,OMStr[i]);
				if(i==0)
				{
					if(!onSwitch||selected!=0)
						MenuFont->printf(xoffset+200,calcy,HGETEXT_LEFT,OMStr[tfs?6:7]);
					else
					{
						MenuFont->SetColor(SETA(0xFFFFFF,255.0f*(swoffset/100.0f)));
						MenuFont->printf(xoffset+100+swoffset,calcy,HGETEXT_LEFT,OMStr[tfs?7:6]);
						MenuFont->SetColor(SETA(0xFFFFFF,255.0f-255.0f*(swoffset/100.0f)));
						MenuFont->printf(xoffset+200+swoffset,calcy,HGETEXT_LEFT,OMStr[tfs?6:7]);
						swoffset-=hge->Timer_GetDelta()*400;
						if(swoffset<0)swoffset=0,onSwitch=false;
					}
				}
				if(i==1)
				{
					if(!onSwitch||selected!=1)
						MenuFont->printf(xoffset+200,calcy,HGETEXT_LEFT,OMStr[fpslvl==2?6:7]);
					else
					{
						MenuFont->SetColor(SETA(0xFFFFFF,255.0f*(swoffset/100.0f)));
						MenuFont->printf(xoffset+100+swoffset,calcy,HGETEXT_LEFT,OMStr[fpslvl==2?7:6]);
						MenuFont->SetColor(SETA(0xFFFFFF,255.0f-255.0f*(swoffset/100.0f)));
						MenuFont->printf(xoffset+200+swoffset,calcy,HGETEXT_LEFT,OMStr[fpslvl==2?6:7]);
						swoffset-=hge->Timer_GetDelta()*400;
						if(swoffset<0)swoffset=0,onSwitch=false;
					}
				}
				if(i==2)
				{
					if(!onSwitch||selected!=2)
						MenuFont->printf(xoffset+200,calcy,HGETEXT_LEFT,OMStr[diffkey?8:9]);
					else
					{
						MenuFont->SetColor(SETA(0xFFFFFF,255.0f*(swoffset/100.0f)));
						MenuFont->printf(xoffset+100+swoffset,calcy,HGETEXT_LEFT,OMStr[diffkey?9:8]);
						MenuFont->SetColor(SETA(0xFFFFFF,255.0f-255.0f*(swoffset/100.0f)));
						MenuFont->printf(xoffset+200+swoffset,calcy,HGETEXT_LEFT,OMStr[diffkey?8:9]);
						swoffset-=hge->Timer_GetDelta()*400;
						if(swoffset<0)swoffset=0,onSwitch=false;
					}
				}
				if(i==3)
				{
					if(!(onSwitch||onSwitchi)||selected!=3)
						MenuFont->printf(xoffset+200,calcy,HGETEXT_LEFT,VidMode>=0&&VidMode<=4?OMStr[VidMode+10]:OMStr[15]);
					else
					{
						if(onSwitch)
						{
							MenuFont->SetColor(SETA(0xFFFFFF,255.0f*(swoffset/100.0f)));
							MenuFont->printf(xoffset+100+swoffset,calcy,HGETEXT_LEFT,VidMode>=0&&VidMode<=4?OMStr[VidMode==0?14:VidMode+9]:OMStr[15]);
							MenuFont->SetColor(SETA(0xFFFFFF,255.0f-255.0f*(swoffset/100.0f)));
							MenuFont->printf(xoffset+200+swoffset,calcy,HGETEXT_LEFT,VidMode>=0&&VidMode<=4?OMStr[VidMode+10]:OMStr[15]);
							swoffset-=hge->Timer_GetDelta()*400;
							if(swoffset<0)swoffset=0,onSwitch=false;
						}
						if(onSwitchi)
						{
							MenuFont->SetColor(SETA(0xFFFFFF,255.0f*(swoffset/100.0f)));
							MenuFont->printf(xoffset+100+swoffset,calcy,HGETEXT_LEFT,VidMode>=0&&VidMode<=4?OMStr[VidMode+10]:OMStr[15]);
							MenuFont->SetColor(SETA(0xFFFFFF,255.0f-255.0f*(swoffset/100.0f)));
							MenuFont->printf(xoffset+200+swoffset,calcy,HGETEXT_LEFT,VidMode>=0&&VidMode<=4?OMStr[VidMode==4?10:VidMode+11]:OMStr[15]);
							swoffset+=hge->Timer_GetDelta()*400;
							if(swoffset>100)swoffset=0,onSwitchi=false;
						}
					}
				}
			}
		}
		Ribb->RenderEx(xoffset-50,355,0,6,1);
		Ribb->RenderEx(xoffset-50,382,0,6,1);
		hge->Gfx_RenderQuad(&UpperGradient);
		hge->Gfx_RenderQuad(&LowerGradient);
		msel->Render(300,moffset+300);
	}
}optionMenu;
//==================================================================================
//Here's where old code dies...
hgeGUI			*StartGUI,*DeathGUI,*CompleteGUI,*HighScoreGUI;
hgeGUI			*HSViewGUI,*HSDetailGUI,*PauseGUI,*BkTTitleGUI;
hgeGUI			*OptionsGUI,*PlayerProfGUI;
char			ds1[255],ds2[255],ds3[255],ds4[255];
char			hs1[255],hs2[255],hs3[255],hs4[255],hs5[255],hs6[255],hs7[255];
char			HSVstr[7][255];
char			HSDetstr[10][255];
char			opt[10][255];
bool			toogleundl;
int				view,detv;
int				lastkeypressed;
void HSViewGUI_Init();
void HighScoreGUI_Init();
void PauseGUI_Init();
void StartGUI_Init()
{
	StartGUI=new hgeGUI();
	StartGUI->AddCtrl(new hgeGUIMenuItem(1,fnt,snd,400,200,0.0f,"Classic"));
	StartGUI->AddCtrl(new hgeGUIMenuItem(2,fnt,snd,400,240,0.1f,""));
	StartGUI->AddCtrl(new hgeGUIMenuItem(3,fnt,snd,400,280,0.2f,"Assessment Mode"));
	StartGUI->AddCtrl(new hgeGUIMenuItem(4,fnt,snd,400,320,0.3f,"Free Play Mode"));
	StartGUI->AddCtrl(new hgeGUIMenuItem(5,fnt,snd,400,360,0.4f,"Back"));
	StartGUI->SetCursor(spr);
	StartGUI->SetNavMode(HGEGUI_UPDOWN);
	StartGUI->SetFocus(1);
	StartGUI->Enter();
}
void StartGUI_FrameFnk()
{
	float dt=hge->Timer_GetDelta();
	int id=StartGUI->Update(dt);
	if (id)
	{
		switch (id)
		{
			case 1:
				playerpos.x=400,playerpos.y=400,playerrot=0;
				frameleft=ThirtySeconds;infofade=0xFF;Dis8ref=t8special=false;
				level=1,part=1;frms=0,averfps=0.0;bsscale=1;
				towcnt=bulcnt=0;whrcnt=12;skyactive=false;PlayerSplit=false;
				score=0;Mult_Init();//Music_Init("./Resources/Music/CanonTechno.ogg");
				lpst=4625568;lped=9234584;//Music_Play();
				coll=semicoll=clrusg=0;playerLockX=playerLockY=false;
				Lock.Init(2);IfShowTip=true;lsc=0;
				//Lock.SetTexture(SprSheet,151,264,2,8);
				clrrad=pi/2;clrrange=0;re.SetSeed(time(NULL));
				memset(tower,0,sizeof(tower));
				memset(bullet,0,sizeof(bullet));
				Complete=false;
				Current_Position=1;
				Level1Part1();
				IfCallLevel=true;
				mode=1;
				break;
			case 2:
			case 3:
				playerpos.x=400,playerpos.y=400,playerrot=0;
				frameleft=ThirtySeconds;infofade=0xFF;Dis8ref=t8special=false;
				level=-2,part=0;frms=0,averfps=0.0;bsscale=1;assetime=0;
				towcnt=bulcnt=0;whrcnt=12;skyactive=false;PlayerSplit=false;
				score=0;Mult_Init();//Music_Init("./Resources/Music/CanonTechno.ogg");
				lpst=4625568;lped=9234584;//Music_Play();
				coll=semicoll=clrusg=0;playerLockX=playerLockY=false;
				Lock.Init(2);IfShowTip=true;lsc=0;
				//Lock.SetTexture(SprSheet,151,264,2,8);
				clrrad=pi/2;clrrange=0;re.SetSeed(time(NULL));
				memset(tower,0,sizeof(tower));
				memset(bullet,0,sizeof(bullet));
				Complete=false;
				Current_Position=1;
				IfCallLevel=true;
				mode=2;
				break;
			case 4:
				playerpos.x=400,playerpos.y=400,playerrot=0;
				frameleft=ThirtySeconds;infofade=0xFF;Dis8ref=t8special=false;
				level=1,part=1;frms=0,averfps=0.0;bsscale=1;
				towcnt=bulcnt=0;whrcnt=12;skyactive=false;PlayerSplit=false;
				score=0;Mult_Init();//Music_Init("./Resources/Music/CanonTechno.ogg");
				lpst=4625568;lped=9234584;//Music_Play();
				coll=semicoll=clrusg=0;playerLockX=playerLockY=false;
				Lock.Init(2);IfShowTip=true;lsc=0;
				//Lock.SetTexture(SprSheet,151,264,2,8);
				clrrad=pi/2;clrrange=0;re.SetSeed(time(NULL));
				memset(tower,0,sizeof(tower));
				memset(bullet,0,sizeof(bullet));
				Complete=false;
				Current_Position=1;
				Level1Part1();
				IfCallLevel=true;
				mode=3;
				break;
			case 5:
				Current_Position=0;
				StartGUI->Leave();
				gui->Enter();
		}
	}
}
void DeathGUI_Init()
{
	DeathGUI=new hgeGUI();
	Current_Position=5;Music_Stop();
	DisableAllTower=true;DisablePlayer=true;
	DeathGUI->AddCtrl(new hgeGUIMenuItem(1,fnt,snd,400,160,0.0f,"You Are Dead!"));
#ifdef WIN32
	sprintf(ds1,"You scored %I64d at level %d",score,level);
#else
	sprintf(ds1,"You scored %lld at level %d",score,level);
#endif
	DeathGUI->AddCtrl(new hgeGUIMenuItem(2,fnt,snd,400,200,0.1f,ds1));
	switch (mode)
	{
		case 1:sprintf(ds2,"Mode: Classic");break;
		case 3:sprintf(ds2,"What Happened?! You died in Free Play Mode?!");break;
	}
	DeathGUI->AddCtrl(new hgeGUIMenuItem(3,fnt,snd,400,240,0.2f,ds2));
	sprintf(ds3,"Average FPS: %.2f",averfps);
	DeathGUI->AddCtrl(new hgeGUIMenuItem(4,fnt,snd,400,280,0.3f,ds3));
	DeathGUI->AddCtrl(new hgeGUIMenuItem(5,fnt,snd,400,320,0.3f,""));
	DeathGUI->AddCtrl(new hgeGUIMenuItem(6,fnt,snd,400,360,0.4f,"Continue from beginning of level? Your score will be set to minus!"));
	DeathGUI->AddCtrl(new hgeGUIMenuItem(7,fnt,snd,400,400,0.5f,"Continue!"));
	DeathGUI->AddCtrl(new hgeGUIMenuItem(8,fnt,snd,400,440,0.6f,"No thanks..."));
	for (int i=1;i<=6;++i)DeathGUI->EnableCtrl(i,false);
	DeathGUI->SetCursor(spr);
	DeathGUI->SetNavMode(HGEGUI_UPDOWN|HGEGUI_CYCLED);
	DeathGUI->SetFocus(7);
	DeathGUI->Enter();
}
void DeathGUI_FrameFnk()
{
	float dt=hge->Timer_GetDelta();
	int id=DeathGUI->Update(dt);
	if (id)
	{
		switch (id)
		{
			case 7:
				IfCallLevel=true;
				IfShowTip=true;
				Current_Position=1;
				DeathGUI->Leave();
				score=-abs(score);
				++restarts;
				part=0;
				clockrot=deltarot=0;
				coll=towcnt=bulcnt=0;
				DisableAllTower=DisablePlayer=false;
				break;
			case 8:Current_Position=0;gui->Enter();DeathGUI->Leave();break;
		}
	}
}
void NewHighScoreGUI_Init()
{
	Current_Position=7;
	memset(newname,0,sizeof(newname));newlen=0;tbframebrk=0;toogleundl=false;
	TipFont->SetColor(0xFFFFFFFF);
}
void nameins(char a)
{
	if (newlen<=14)
		newname[newlen++]=a;
}
void namedel()
{
	if (newlen>0)newname[--newlen]=0;
}
void NewHighScoreGUI_FrameFnk()
{
	int key=hge->Input_GetKey();
	if (key>=0x30&&key<=0x39)nameins('0'+key-0x30);
#ifdef WIN32
	if (key>=0x41&&key<=0x5A)
		if (GetKeyState(VK_CAPITAL)&1)nameins('A'+key-0x41);else nameins('a'+key-0x41);
#else
	if (key>=0x41&&key<=0x5A)
		nameins('A'+key-0x41);
#endif
	if (key==HGEK_SPACE)nameins('_');
	if (key==HGEK_BACKSPACE)namedel();
	if (key==HGEK_ENTER)
	{
		InsertHighScore();
		switch (mode)
		{
			case 4:view=1;HSViewGUI_Init();break;
			case 1:view=2;HSViewGUI_Init();break;
			case 2:view=3;HSViewGUI_Init();break;
			case 3:view=4;HSViewGUI_Init();break;
		}
	}
}
void NewHighScoreGUI_Render()
{
	if (LOWFPS)tbframebrk+=17;else ++tbframebrk;
	if (tbframebrk>=500)toogleundl=!toogleundl,tbframebrk=0;
	TipFont->printf(200,200,HGETEXT_LEFT,"Please Enter Your Honorable Name...");
	if (!toogleundl)
		TipFont->printf(200,240,HGETEXT_LEFT,"%s",newname);
	else
		TipFont->printf(200,240,HGETEXT_LEFT,"%s_",newname);
}
char *getRank()
{
	static char retval[256];
	//stub!
	//sprintf something to retval
	if(level<=3)sprintf(retval,"Try more...");
	if(level<=6)sprintf(retval,"Still need more effort!");
	if(level==7)sprintf(retval,"You've done it!");
	if(level==-1)sprintf(retval,"Why do you come to Earth?");
	return retval;
}
void CompleteGUI_Init()
{
	CompleteGUI=new hgeGUI();
	Current_Position=6;
	DisableAllTower=true;DisablePlayer=true;
	CompleteGUI->AddCtrl(new hgeGUIMenuItem(1,fnt,snd,400,120,0.0f,"It Ends Here!"));
#ifdef WIN32
	if (CheckHighScore()!=-1)
		sprintf(hs1,"New Highscore %I64d!",score);
	else
		sprintf(hs1,"Score %I64d",score);
#else
	if (~CheckHighScore())
		sprintf(hs1,"New Highscore %lld!",score);
	else
		sprintf(hs1,"Score %lld",score);
#endif
	CompleteGUI->AddCtrl(new hgeGUIMenuItem(2,fnt,snd,400,160,0.1f,hs1));
	sprintf(hs7,"Your Ranking: %s",getRank());
	CompleteGUI->AddCtrl(new hgeGUIMenuItem(3,fnt,snd,400,200,0.1f,hs7));
	switch (mode)
	{
		case 1:sprintf(hs2,"Restarts %d",restarts);break;
		case 3:sprintf(hs2,"Collisions %d",coll);break;
	}
	CompleteGUI->AddCtrl(new hgeGUIMenuItem(4,fnt,snd,400,240,0.2f,hs2));
	sprintf(hs3,"Semi-Collisions %d",semicoll);
	CompleteGUI->AddCtrl(new hgeGUIMenuItem(5,fnt,snd,400,280,0.3f,hs3));
	sprintf(hs4,"CLR usage %d",clrusg);
	CompleteGUI->AddCtrl(new hgeGUIMenuItem(6,fnt,snd,400,320,0.3f,hs4));
	sprintf(hs5,"Average FPS %.2f",averfps);
	CompleteGUI->AddCtrl(new hgeGUIMenuItem(7,fnt,snd,400,360,0.4f,hs5));
	if (CheckHighScore()!=-1)
	{
		CompleteGUI->AddCtrl(new hgeGUIMenuItem(8,fnt,snd,400,400,0.5f,"Keep this in your record?"));
		CompleteGUI->AddCtrl(new hgeGUIMenuItem(9,fnt,snd,400,440,0.6f,"Yes"));
		CompleteGUI->AddCtrl(new hgeGUIMenuItem(10,fnt,snd,400,480,0.7f,"No thanks..."));
	}
	else
	{
		CompleteGUI->AddCtrl(new hgeGUIMenuItem(8,fnt,snd,400,400,0.5f,""));
		CompleteGUI->AddCtrl(new hgeGUIMenuItem(9,fnt,snd,400,440,0.6f,""));
		CompleteGUI->AddCtrl(new hgeGUIMenuItem(10,fnt,snd,400,480,0.7f,"Back to menu"));
	}
	for (int i=1;i<=7;++i)CompleteGUI->EnableCtrl(i,false);
	CompleteGUI->SetCursor(spr);
	CompleteGUI->SetNavMode(HGEGUI_UPDOWN|HGEGUI_CYCLED);
	CompleteGUI->SetFocus(8);
	CompleteGUI->Enter();
}
void CompleteGUI_FrameFnk()
{
	float dt=hge->Timer_GetDelta();
	int id=CompleteGUI->Update(dt);
	if (id)
	{
		switch (id)
		{
			case 9:NewHighScoreGUI_Init();CompleteGUI->Leave();break;
			case 10:Current_Position=0;gui->Enter();CompleteGUI->Leave();break;
		}
	}
}
void HSDetGUI_Init()
{
	HSDetailGUI=new hgeGUI();
	Current_Position=10;
	switch (view)
	{
		case 1:
			memset(HSDetstr,0,sizeof(HSDetstr));
			if (!ERec[detv].score)sprintf(HSDetstr[1],"Nothing here...");
			else
			{
				sprintf(HSDetstr[1],"No. %d of Easy Mode",detv);
#ifdef WIN32
				sprintf(HSDetstr[2],"Scored %I64d by %s",ERec[detv].score,ERec[detv].name);
#else
				sprintf(HSDetstr[2],"Scored %lld by %s",ERec[detv].score,ERec[detv].name);
#endif
				sprintf(HSDetstr[3],"Restarts %d",ERec[detv].rescol);
				sprintf(HSDetstr[4],"Semi-Collisions %d",ERec[detv].scoll);
				sprintf(HSDetstr[5],"CLR Usage %d",ERec[detv].clrusg);
				sprintf(HSDetstr[6],"Average FPS %d.%d",ERec[detv].af_int,ERec[detv].af_fric);
			}
			for (int i=1;i<=6;++i)
				HSDetailGUI->AddCtrl(new hgeGUIMenuItem(i,fnt,snd,400,170+30*i,0.1f*i-0.1f,HSDetstr[i])),
				HSDetailGUI->EnableCtrl(i,false);
			HSDetailGUI->AddCtrl(new hgeGUIMenuItem(7,fnt,snd,400,380,0.6f,"Back"));
			break;
		case 2:
			memset(HSDetstr,0,sizeof(HSDetstr));
			if (!NRec[detv].score)sprintf(HSDetstr[1],"Nothing here...");
			else
			{
				sprintf(HSDetstr[1],"No. %d of Normal Mode",detv);
#ifdef WIN32
				sprintf(HSDetstr[2],"Scored %I64d by %s",NRec[detv].score,NRec[detv].name);
#else
				sprintf(HSDetstr[2],"Scored %lld by %s",NRec[detv].score,NRec[detv].name);
#endif
				sprintf(HSDetstr[3],"Restarts %d",NRec[detv].rescol);
				sprintf(HSDetstr[4],"Semi-Collisions %d",NRec[detv].scoll);
				sprintf(HSDetstr[5],"CLR Usage %d",NRec[detv].clrusg);
				sprintf(HSDetstr[6],"Average FPS %d.%d",NRec[detv].af_int,NRec[detv].af_fric);
			}
			for (int i=1;i<=6;++i)
				HSDetailGUI->AddCtrl(new hgeGUIMenuItem(i,fnt,snd,400,170+30*i,0.1f*i-0.1f,HSDetstr[i])),
				HSDetailGUI->EnableCtrl(i,false);
			HSDetailGUI->AddCtrl(new hgeGUIMenuItem(7,fnt,snd,400,380,0.6f,"Back"));
			break;
		case 3:
			memset(HSDetstr,0,sizeof(HSDetstr));
			if (!ExRec[detv].score)sprintf(HSDetstr[1],"Nothing here...");
			else
			{
				sprintf(HSDetstr[1],"No. %d of Extreme Mode",detv);
#ifdef WIN32
				sprintf(HSDetstr[2],"Scored %I64d by %s",ExRec[detv].score,ExRec[detv].name);
#else
				sprintf(HSDetstr[2],"Scored %lld by %s",ExRec[detv].score,ExRec[detv].name);
#endif
				sprintf(HSDetstr[3],"Restarts %d",ExRec[detv].rescol);
				sprintf(HSDetstr[4],"Semi-Collisions %d",ExRec[detv].scoll);
				sprintf(HSDetstr[5],"CLR Usage %d",ExRec[detv].clrusg);
				sprintf(HSDetstr[6],"Average FPS %d.%d",ExRec[detv].af_int,ExRec[detv].af_fric);
			}
			for (int i=1;i<=6;++i)
				HSDetailGUI->AddCtrl(new hgeGUIMenuItem(i,fnt,snd,400,170+30*i,0.1f*i-0.1f,HSDetstr[i])),
				HSDetailGUI->EnableCtrl(i,false);
			HSDetailGUI->AddCtrl(new hgeGUIMenuItem(7,fnt,snd,400,380,0.6f,"Back"));
			break;
		case 4:
			memset(HSDetstr,0,sizeof(HSDetstr));
			if (!FPMRec[detv].score)sprintf(HSDetstr[1],"Nothing here...");
			else
			{
				sprintf(HSDetstr[1],"No. %d of Free Play Mode",detv);
#ifdef WIN32
				sprintf(HSDetstr[2],"Scored %I64d by %s",FPMRec[detv].score,FPMRec[detv].name);
#else
				sprintf(HSDetstr[2],"Scored %lld by %s",FPMRec[detv].score,FPMRec[detv].name);
#endif
				sprintf(HSDetstr[3],"Collisions %d",FPMRec[detv].rescol);
				sprintf(HSDetstr[4],"Semi-Collisions %d",FPMRec[detv].scoll);
				sprintf(HSDetstr[5],"CLR Usage %d",FPMRec[detv].clrusg);
				sprintf(HSDetstr[6],"Average FPS %d.%d",FPMRec[detv].af_int,FPMRec[detv].af_fric);
			}
			for (int i=1;i<=6;++i)
				HSDetailGUI->AddCtrl(new hgeGUIMenuItem(i,fnt,snd,400,170+30*i,0.1f*i-0.1f,HSDetstr[i])),
				HSDetailGUI->EnableCtrl(i,false);
			HSDetailGUI->AddCtrl(new hgeGUIMenuItem(7,fnt,snd,400,380,0.6f,"Back"));
			break;
	}
	HSDetailGUI->SetCursor(spr);
	HSDetailGUI->SetNavMode(HGEGUI_UPDOWN);
	HSDetailGUI->SetFocus(7);
	HSDetailGUI->Enter();
}
void HSDetGUI_FrameFnk()
{
	float dt=hge->Timer_GetDelta();
	int id=HSDetailGUI->Update(dt);
	if (id)
	{
		switch (id)
		{
			case 7:Current_Position=9;HSDetailGUI->Leave();HSViewGUI->Enter();break;
		}
	}
}
void HSViewGUI_Init()
{
	Current_Position=9;
	HSViewGUI=new hgeGUI();
	switch (view)
	{
		case 1:
			HSViewGUI->AddCtrl(new hgeGUIMenuItem(1,fnt,snd,400,200,0.0f,"Highscore - Easy"));
			for (unsigned i=1;i<=Ecnt;++i)
			{
#ifdef WIN32
				sprintf(HSVstr[i],"%u. %s - %I64d",i,ERec[i].name,ERec[i].score);
#else
				sprintf(HSVstr[i],"%u. %s - %lld",i,ERec[i].name,ERec[i].score);
#endif
				HSViewGUI->AddCtrl(new hgeGUIMenuItem(i+1,fnt,snd,400,200+30*i,0.1f*i,HSVstr[i]));
			}
			for (unsigned i=Ecnt+1;i<=5;++i)
			{
				sprintf(HSVstr[i],"%u. ----------",i);
				HSViewGUI->AddCtrl(new hgeGUIMenuItem(i+1,fnt,snd,400,200+30*i,0.1f*i,HSVstr[i]));
			}
			break;
		case 2:
			HSViewGUI->AddCtrl(new hgeGUIMenuItem(1,fnt,snd,400,200,0.0f,"Highscore - Normal"));
			for (unsigned i=1;i<=Ncnt;++i)
			{
#ifdef WIN32
				sprintf(HSVstr[i],"%u. %s - %I64d",i,NRec[i].name,NRec[i].score);
#else
				sprintf(HSVstr[i],"%u. %s - %lld",i,NRec[i].name,NRec[i].score);
#endif
				HSViewGUI->AddCtrl(new hgeGUIMenuItem(i+1,fnt,snd,400,200+30*i,0.1f*i,HSVstr[i]));
			}
			for (unsigned i=Ncnt+1;i<=5;++i)
			{
				sprintf(HSVstr[i],"%u. ----------",i);
				HSViewGUI->AddCtrl(new hgeGUIMenuItem(i+1,fnt,snd,400,200+30*i,0.1f*i,HSVstr[i]));
			}
			break;
		case 3:
			HSViewGUI->AddCtrl(new hgeGUIMenuItem(1,fnt,snd,400,200,0.0f,"Highscore - Extreme"));
			for (unsigned i=1;i<=Excnt;++i)
			{
#ifdef WIN32
				sprintf(HSVstr[i],"%u. %s - %I64d",i,ExRec[i].name,ExRec[i].score);
#else
				sprintf(HSVstr[i],"%u. %s - %lld",i,ExRec[i].name,ExRec[i].score);
#endif
				HSViewGUI->AddCtrl(new hgeGUIMenuItem(i+1,fnt,snd,400,200+30*i,0.1f*i,HSVstr[i]));
			}
			for (unsigned i=Excnt+1;i<=5;++i)
			{
				sprintf(HSVstr[i],"%u. ----------",i);
				HSViewGUI->AddCtrl(new hgeGUIMenuItem(i+1,fnt,snd,400,200+30*i,0.1f*i,HSVstr[i]));
			}
			break;
		case 4:
			HSViewGUI->AddCtrl(new hgeGUIMenuItem(1,fnt,snd,400,200,0.0f,"Highscore - Free Play Mode"));
			for (unsigned i=1;i<=FPMcnt;++i)
			{
#ifdef WIN32
				sprintf(HSVstr[i],"%u. %s - %I64d",i,FPMRec[i].name,FPMRec[i].score);
#else
				sprintf(HSVstr[i],"%u. %s - %lld",i,FPMRec[i].name,FPMRec[i].score);
#endif
				HSViewGUI->AddCtrl(new hgeGUIMenuItem(i+1,fnt,snd,400,200+30*i,0.1f*i,HSVstr[i]));
			}
			for (unsigned i=FPMcnt+1;i<=5;++i)
			{
				sprintf(HSVstr[i],"%u. ----------",i);
				HSViewGUI->AddCtrl(new hgeGUIMenuItem(i+1,fnt,snd,400,200+30*i,0.1f*i,HSVstr[i]));
			}
			break;
	}
	HSViewGUI->AddCtrl(new hgeGUIMenuItem(7,fnt,snd,400,380,0.6f,"Select one record to view details."));
	HSViewGUI->AddCtrl(new hgeGUIMenuItem(8,fnt,snd,400,410,0.7f,"Back"));
	HSViewGUI->EnableCtrl(1,false);HSViewGUI->EnableCtrl(7,false);
	HSViewGUI->SetCursor(spr);
	HSViewGUI->SetNavMode(HGEGUI_UPDOWN|HGEGUI_CYCLED);
	HSViewGUI->SetFocus(2);
	HSViewGUI->Enter();
}
void HSViewGUI_FrameFnk()
{
	float dt=hge->Timer_GetDelta();
	int id=HSViewGUI->Update(dt);
	if (id)
	{
		switch (id)
		{
			case 2:detv=1;HSDetGUI_Init();break;
			case 3:detv=2;HSDetGUI_Init();break;
			case 4:detv=3;HSDetGUI_Init();break;
			case 5:detv=4;HSDetGUI_Init();break;
			case 6:detv=5;HSDetGUI_Init();break;
			case 8:Current_Position=8;HSViewGUI->Leave();if (!HighScoreGUI)HighScoreGUI_Init();HighScoreGUI->Enter();break;
		}
	}
}
void HighScoreGUI_Init()
{
	HighScoreGUI=new hgeGUI();
	Current_Position=8;
	HighScoreGUI->AddCtrl(new hgeGUIMenuItem(1,fnt,snd,350,200,0.0f,"View Highscores && Records for..."));
	HighScoreGUI->AddCtrl(new hgeGUIMenuItem(2,fnt,snd,400,240,0.1f,"Classic"));
	HighScoreGUI->AddCtrl(new hgeGUIMenuItem(3,fnt,snd,400,280,0.2f,"Normal"));
	HighScoreGUI->AddCtrl(new hgeGUIMenuItem(4,fnt,snd,400,320,0.3f,"Assessment Mode"));
	HighScoreGUI->AddCtrl(new hgeGUIMenuItem(5,fnt,snd,400,360,0.4f,"Free Play Mode"));
	HighScoreGUI->AddCtrl(new hgeGUIMenuItem(6,fnt,snd,400,400,0.5f,"Back"));
	HighScoreGUI->EnableCtrl(1,false);
	HighScoreGUI->SetCursor(spr);
	HighScoreGUI->SetNavMode(HGEGUI_UPDOWN|HGEGUI_CYCLED);
	HighScoreGUI->SetFocus(7);
	HighScoreGUI->Enter();
}
void HighScoreGUI_FrameFnk()
{
	float dt=hge->Timer_GetDelta();
	int id=HighScoreGUI->Update(dt);
	if (id)
	{
		switch (id)
		{
			case 2:view=1;HSViewGUI_Init();break;
			case 3:view=2;HSViewGUI_Init();break;
			case 4:view=3;HSViewGUI_Init();break;
			case 5:view=4;HSViewGUI_Init();break;
			case 6:Current_Position=0;HighScoreGUI->Leave();gui->Enter();break;
		}
	}

}
void BkTTitleGUI_Init()
{
	BkTTitleGUI=new hgeGUI();
	Current_Position=12;
	BkTTitleGUI->AddCtrl(new hgeGUIMenuItem(1,fnt,snd,400,200,0.0f,"Really?"));
	BkTTitleGUI->AddCtrl(new hgeGUIMenuItem(2,fnt,snd,200,250,0.1f,"I've pressed the wrong key"));
	BkTTitleGUI->AddCtrl(new hgeGUIMenuItem(3,fnt,snd,600,250,0.2f,"Do return to menu!"));
	BkTTitleGUI->EnableCtrl(1,false);
	BkTTitleGUI->SetCursor(spr);
	BkTTitleGUI->SetNavMode(HGEGUI_LEFTRIGHT|HGEGUI_CYCLED);
	BkTTitleGUI->SetFocus(2);
	BkTTitleGUI->Enter();
}
void BkTTitleGUI_FrameFnk()
{
	float dt=hge->Timer_GetDelta();
	int id=BkTTitleGUI->Update(dt);
	if (id)
	{
		switch (id)
		{
			case 2:
				BkTTitleGUI->Leave();
				Current_Position=11;
				PauseGUI_Init();
				break;
			case 3:
				Current_Position=0;BkTTitleGUI->Leave();gui->Enter();Music_Stop();
				break;
		}
	}
}
void PauseGUI_Init()
{
	PauseGUI=new hgeGUI();Music_Pause();
	Current_Position=11;
	DisableAllTower=DisablePlayer=true;
	PauseGUI->AddCtrl(new hgeGUIMenuItem(1,fnt,snd,400,200,0.0f,"Paused..."));
	PauseGUI->AddCtrl(new hgeGUIMenuItem(2,fnt,snd,400,240,0.1f,"Return to Game"));
	PauseGUI->AddCtrl(new hgeGUIMenuItem(3,fnt,snd,400,280,0.2f,"Return to Title"));
	PauseGUI->EnableCtrl(1,false);
	PauseGUI->SetCursor(spr);
	PauseGUI->SetNavMode(HGEGUI_UPDOWN|HGEGUI_CYCLED);
	PauseGUI->SetFocus(2);
	PauseGUI->Enter();
}
void PauseGUI_FrameFnk()
{
	float dt=hge->Timer_GetDelta();
	int id=PauseGUI->Update(dt);
	if (id)
	{
		switch (id)
		{
			case 2:
				PauseGUI->Leave();
				Current_Position=1;Music_Resume();
				DisableAllTower=DisablePlayer=false;
				break;
			case 3:
				BkTTitleGUI_Init();
				break;
		}
	}
}
int AP_Update(int plrspd,int plrslospd,int clrbns)
{
	int res=0;
	if (plrspd<=4)res+=plrspd*1200;else res+=5000;
	switch (plrslospd)
	{
		case 1:res+=4000;break;
		case 2:res+=3200;break;
		case 3:res+=2000;break;
		case 4:res+=1500;break;
		case 5:res+=700;break;
	}
	switch (clrbns)
	{
		case 0:break;
		case 1:res+=1500;break;
		case 2:res+=2700;break;
		case 3:res+=4000;break;
		case 4:res+=5500;break;
	}
	return res;
}
void Options_Writeback()
{
	freopen("blr.cfg","w",stdout);
	printf(";CBL");
	printf("%c",fpslvl==2?1:0);
	printf("%c",tfs?1:0);
	printf("%c",VidMode);
	printf("%c",diffkey?1:0);
	printf("%c%c%c%c",plrspd,plrslospd,clrbns,clrmode);
	fclose(stdout);
}
void OptionsGUI_Init()
{
	OptionsGUI=new hgeGUI();
	Current_Position=13;
	if (!tfs)
		sprintf(opt[0],"Fullscreen: Off");
	else
		sprintf(opt[0],"Fullscreen: On");
	OptionsGUI->AddCtrl(new hgeGUIMenuItem(1,fnt,snd,400,200,0.0f,opt[0]));
	switch (fpslvl)
	{
		case 0:sprintf(opt[1],"FPS Level: 60");break;
		case 1:sprintf(opt[1],"FPS Level: ?");break;
		case 2:sprintf(opt[1],"FPS Level: Vsync");break;
	}
	OptionsGUI->AddCtrl(new hgeGUIMenuItem(2,fnt,snd,400,240,0.1f,opt[1]));
	if (diffkey)
		sprintf(opt[2],"Use Key X for Clear Range");
	else
		sprintf(opt[2],"Use Key Z for Clear Range");
	OptionsGUI->AddCtrl(new hgeGUIMenuItem(3,fnt,snd,400,280,0.2f,opt[2]));
	OptionsGUI->AddCtrl(new hgeGUIMenuItem(4,fnt,snd,400,320,0.3f,"Player Profile"));
	OptionsGUI->AddCtrl(new hgeGUIMenuItem(5,fnt,snd,400,360,0.4f,"Save and Exit"));
	OptionsGUI->SetNavMode(HGEGUI_UPDOWN);
	OptionsGUI->SetCursor(spr);
	OptionsGUI->SetFocus(1);
	OptionsGUI->Enter();
}
void PlayerProfGUI_Init()
{
	PlayerProfGUI=new hgeGUI();
	Current_Position=14;
	sprintf(opt[3],"Moving Speed: -%d+",plrspd);
	sprintf(opt[4],"Precise Moving Speed: -%d+",plrslospd);
	sprintf(opt[5],"Clear Range Bonus: -%d+",clrbns);
	sprintf(opt[6],"Clear Range Mode: %s",clrmode?"Rotate":"Expand");
	sprintf(opt[7],"Ability Point %d/10000",AP_Update(plrspd,plrslospd,clrbns));
	PlayerProfGUI->AddCtrl(new hgeGUIMenuItem(1,fnt,snd,400,200,0.0f,opt[3]));
	PlayerProfGUI->AddCtrl(new hgeGUIMenuItem(2,fnt,snd,400,240,0.1f,opt[4]));
	PlayerProfGUI->AddCtrl(new hgeGUIMenuItem(3,fnt,snd,400,280,0.2f,opt[5]));
	PlayerProfGUI->AddCtrl(new hgeGUIMenuItem(4,fnt,snd,400,320,0.3f,opt[6]));
	PlayerProfGUI->AddCtrl(new hgeGUIMenuItem(5,fnt,snd,400,360,0.4f,opt[7]));
	PlayerProfGUI->AddCtrl(new hgeGUIMenuItem(6,fnt,snd,400,400,0.5f,"Back"));
	PlayerProfGUI->SetNavMode(HGEGUI_UPDOWN);
	PlayerProfGUI->SetCursor(spr);
	PlayerProfGUI->SetFocus(1);
	PlayerProfGUI->Enter();
}
void PlayerProfGUI_FrameFnk()
{
	float dt=hge->Timer_GetDelta();
	int id=PlayerProfGUI->Update(dt);
	if (id==6&&AP_Update(plrspd,plrslospd,clrbns)<=10000)
	{PlayerProfGUI->Leave();OptionsGUI_Init();}
	if (id==4)
	{
		clrmode=!clrmode;
		sprintf(opt[6],"Clear Range Mode: %s",clrmode?"Rotate":"Expand");
		((hgeGUIMenuItem*)PlayerProfGUI->GetCtrl(4))->RePos(400,320);
	}
	if (hge->Input_GetKeyState(HGEK_LEFT))
	{
		if (!LOWFPS)++lastkeypressed;else lastkeypressed+=17;
		if (lastkeypressed>=100)
		{
			switch (PlayerProfGUI->GetFocus())
			{
				case 1:
					if (plrspd>1)--plrspd;
					sprintf(opt[3],"Moving Speed: -%d+",plrspd);
					((hgeGUIMenuItem*)PlayerProfGUI->GetCtrl(1))->RePos(400,200);
					sprintf(opt[7],"Ability Point %d/10000",AP_Update(plrspd,plrslospd,clrbns));
					((hgeGUIMenuItem*)PlayerProfGUI->GetCtrl(5))->RePos(400,360);
					break;
				case 2:
					if (plrslospd>1)--plrslospd;
					sprintf(opt[4],"Precise Moving Speed: -%d+",plrslospd);
					((hgeGUIMenuItem*)PlayerProfGUI->GetCtrl(2))->RePos(400,240);
					sprintf(opt[7],"Ability Point %d/10000",AP_Update(plrspd,plrslospd,clrbns));
					((hgeGUIMenuItem*)PlayerProfGUI->GetCtrl(5))->RePos(400,360);
					break;
				case 3:
					if (clrbns>0)--clrbns;
					sprintf(opt[5],"Clear Range Bonus: -%d+",clrbns);
					((hgeGUIMenuItem*)PlayerProfGUI->GetCtrl(3))->RePos(400,280);
					sprintf(opt[7],"Ability Point %d/10000",AP_Update(plrspd,plrslospd,clrbns));
					((hgeGUIMenuItem*)PlayerProfGUI->GetCtrl(5))->RePos(400,360);
					break;
			}
			lastkeypressed=0;
		}
	}
	if (hge->Input_GetKeyState(HGEK_RIGHT))
	{
		if (!LOWFPS)++lastkeypressed;else lastkeypressed+=17;
		if (lastkeypressed>=100)
		{
			switch (PlayerProfGUI->GetFocus())
			{
				case 1:
					if (plrspd<5)++plrspd;
					sprintf(opt[3],"Moving Speed: -%d+",plrspd);
					((hgeGUIMenuItem*)PlayerProfGUI->GetCtrl(1))->RePos(400,200);
					sprintf(opt[7],"Ability Point %d/10000",AP_Update(plrspd,plrslospd,clrbns));
					((hgeGUIMenuItem*)PlayerProfGUI->GetCtrl(4))->RePos(400,320);
					break;
				case 2:
					if (plrslospd<5)++plrslospd;
					sprintf(opt[4],"Precise Moving Speed: -%d+",plrslospd);
					((hgeGUIMenuItem*)PlayerProfGUI->GetCtrl(2))->RePos(400,240);
					sprintf(opt[7],"Ability Point %d/10000",AP_Update(plrspd,plrslospd,clrbns));
					((hgeGUIMenuItem*)PlayerProfGUI->GetCtrl(4))->RePos(400,320);
					break;
				case 3:
					if (clrbns<4)++clrbns;
					sprintf(opt[5],"Clear Range Bonus: -%d+",clrbns);
					((hgeGUIMenuItem*)PlayerProfGUI->GetCtrl(3))->RePos(400,280);
					sprintf(opt[7],"Ability Point %d/10000",AP_Update(plrspd,plrslospd,clrbns));
					((hgeGUIMenuItem*)PlayerProfGUI->GetCtrl(4))->RePos(400,320);
					break;
			}
			lastkeypressed=0;
		}
	}
}
void OptionsGUI_FrameFnk()
{
	float dt=hge->Timer_GetDelta();
	int id=OptionsGUI->Update(dt);
	if (id)
	{
		switch (id)
		{
			case 1:
				tfs=!tfs;
				if (!tfs)
					sprintf(opt[0],"Fullscreen: Off");
				else
					sprintf(opt[0],"Fullscreen: On");
				((hgeGUIMenuItem*)OptionsGUI->GetCtrl(1))->RePos(400,200);
				break;
			case 2:
				switch (fpslvl)
				{
					case 0:
						fpslvl=2;LOWFPS=true;
						hge->System_SetState(HGE_FPS,61);
						TenSeconds=600;
						TwentySeconds=1200;
						ThirtySeconds=1800;
						AMinute=3600;
						if(fFast)TenSeconds/=2,TwentySeconds/=2,ThirtySeconds/=2,AMinute/=2;
						break;
					case 1:
						/*fpslvl=2;LOWFPS=false;
						hge->System_SetState(HGE_FPS,1000);
						TenSeconds=10000;
						TwentySeconds=20000;
						ThirtySeconds=30000;
						AMinute=60000;
						if(fFast)TenSeconds/=2,TwentySeconds/=2,ThirtySeconds/=2,AMinute/=2;
						break;*/
					case 2:
						fpslvl=0;LOWFPS=true;
						hge->System_SetState(HGE_FPS,HGEFPS_VSYNC);
						TenSeconds=600;
						TwentySeconds=1200;
						ThirtySeconds=1800;
						AMinute=3600;
						if(fFast)TenSeconds/=2,TwentySeconds/=2,ThirtySeconds/=2,AMinute/=2;
						break;
				}
				switch (fpslvl)
				{
					case 0:sprintf(opt[1],"FPS Level: 60");break;
					case 1:sprintf(opt[1],"FPS Level: ?");break;
					case 2:sprintf(opt[1],"FPS Level: Vsync");break;
				}
				((hgeGUIMenuItem*)OptionsGUI->GetCtrl(2))->RePos(400,240);
				break;
			case 3:
				diffkey=!diffkey;
				if (diffkey)
					sprintf(opt[2],"Use Key X for Clear Range");
				else
					sprintf(opt[2],"Use Key Z for Clear Range");
				((hgeGUIMenuItem*)OptionsGUI->GetCtrl(3))->RePos(400,280);
				break;
			case 4:
				PlayerProfGUI_Init();
				break;
			case 5:
				Options_Writeback();
				OptionsGUI->Leave();
				gui->Enter();
				Current_Position=0;
				break;
		}
	}
}