aboutsummaryrefslogblamecommitdiff
path: root/main.cpp
blob: 3fa99b95103cac388220dca6ad62be589752121e (plain) (tree)
1
2
3


                                            





























                                                                           





                       
                  


                  
                  
                 
                  


                   

                     


                     


                                              
                   
                  









                                          
                                                








                                                                                                        
                                                                     
                         
            
                         



                                                                                  
                                
                                                                  



                                                                                    
     

                   
                                               
                                                                  
                                                                                              









                               
               

                                   
                                                      


                                                                       
                 


                                                                                     
                                                                  

                                                                                           















                                                                      
                                                      


                                                                                                                                         
                                      
                                                                                                                                     







                                                                                        

















                                                                                                                                                                         






                                                                


                                                        
                                                                                        













                                                                                                 
                        
                                                                             




                                                                                                                   
                                 
                                 

                                               
                                                                     
            
                                                                  
                                                            
                                                        
                                                             
                                                                                                         
                                                          
                                                        
                                                            
                                                                                                         

                          
         


                                                                                                
                 





                                                                                                                                       
                 
                                                                                            
                 

                                            
                         


                                                                                           
                         




























                                                                                                                                                  
                         











                                                                                                                                                                 
                 
                                                                 



                   
                         
                                
                         
                       
                                                         


                              
               
                                                                     



                                            
                                                            
                                                                                                          

                                                   
                             


















































































































































































                                                    
 

                                            
         

                                                                        

                               
                             
         

                                                                        

                               
                              
         

                                                                        

                               
                              
         

                                                                        

                               
                              
         

                                                                        

                               
                              
         

                                                                        

                                

                                                                



                                             
                       
                                       


                                                      
                                                  
                                                      


                                                                            
         

                                                                                       
                                                                  
                                       
                                                                






                                                                              
                                                                
                                             
                                                                                                                        

                                   
                                   
                             

         






































                                                                                          

              
                                                    






                                       
                                                                                          
                                                                                                 


                                                          


                                                                               


                                                                


                                                                                

                                
                                                    
                        
                 








                                                                                                          





                                                                                



                                                                                      
                                                                 
                                                                                           
                                                                             


                                                           
                                             


                                         







                                                                     
                        

                                          
                                   




                                                                                                      
                                                                             

                                                                                                              
                                                                                 

                                                                                             
                                                                                      
                                                                                        
                                                                      








                                                                                                      
                                                                                                     
                                                                             
                                                                                                    

                                                                                                            

                                                                                             
                                                                                      
                                                                                        
                                                                      








                                                                                                      
                                                                             

                                                                                                              
                                                                                 

                                                                                             
                                                                                      
                                                                                        
                                                                      





                                                           
                         
                                     
                 
         

































                                                                    

































                                                                                                             

                                 

                                                                                            



                                                                                   
                                            











                                                                           



                                 

                                                             



                                                                
                                  







                                                    














                                                                             










                                                                                                      




                                                       


                                                   
                                   
                       




                                                                                                                      
                                                    
                                                  
                                            
                        
                               












                                           
                                                      



                                                               





                                                               

                                                                      


                                                                   
                                                     
                                


                                                                                      


                                                             
                 
                                               
















                                                                                               
                                                                                    








                                                                         


                                                                         
                                                                 

                                                                                                 


                                        
                                                 
                                             
                                  
                                                                     
                                                 

                                                     

                                                              









                                                                

                                                                             


                                                                                          
                                                                                                                                           
                                                                                                              
                 

                                                                              
                                                                      


                                                                                

                                                                                         


                                                                                  
                           
                                                                                    




                                                                                                 

                            
                                                                                                    

                     

                                             
                                                












                                                                                                             
                                                                                                          

                                                                                                        
            
                                                         
      










                                                                      
                                                             















                                                                                                               









                                                                                                          


















                                                                                           
      







                                                                                  
 
                                   



                                        

                                   


                                                    


                                                                     







                                                                        
                                                                  
                                                                    
            

                                                                                                                                                 
                                                                         

                                                 
                                                                                








                                                            
                                                             


                                                           
                                       



                                                                                                 
                                        
                                                               
                                    








                           
                                                               

                                         

                   

                                                           
         
                                                                            



                                                           

                                                                             


                                   
         
















                                                                    
         



                                                                                       

                                   
                                          
                             
                                 

                                 
                                    





                                       
                                                                                                                                  





                                                              
                           


                                  
                                                                        
                                                                     




                                                                        
                                                                   
                                                                  
                           
                                                            

                                                                    

                                                                

                                                             
                                             



                                                     
                                                                              
                                    








                                                 
                                                                    
            
                                                                              
     

                                                                                           
      
                                                           
                                                                

                                                               

                                                         



                                        
                                                        

                                                                     



                                                            













                                                                                           

                                                                      
                                                                    
                                                               

                                                                               



                                                                                                         

                                                                                      
                                                                                                      
                                                             
                                                                                    

                                                                                          



                                                                             



                                                          
                                    

                                            





                                                     

                                                               


                                                                          
                                                     
         


                               
                                                         




                                    
// Chrisoft Bullet Lab Remix HGE -*- C++ -*-
// Main Code
// Copyright Chrisoft 2014
//Now that we use BSD license, so let's paste it here.
//(although it may be awful)
/*
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are
 * met:
 *
 * * Redistributions of source code must retain the above copyright
 *   notice, this list of conditions and the following disclaimer.
 * * Redistributions in binary form must reproduce the above
 *   copyright notice, this list of conditions and the following disclaimer
 *   in the documentation and/or other materials provided with the
 *   distribution.
 * * Neither the name of the  nor the names of its
 *   contributors may be used to endorse or promote products derived from
 *   this software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 *
 */
//#define Debug
#include <hge.h>
#include <hgefont.h>
#include <hgegui.h>
#include <hgedistort.h>
#include <hgerect.h>
#include <cassert>
#include <cmath>
#include <ctime>
#include <cstdlib>
#include <cstring>
#include <cstdio>
#include <csignal>
#ifdef WIN32
#include <io.h>
#include <direct.h>
#include <shlwapi.h>
#include <shellapi.h>
#include <windows.h>
#include <mmsystem.h>
#endif
#if defined(__GNUC__) && !defined(MINGW_BUILD)
#include <execinfo.h>
#endif
#include "libcgh.h"
#include "hgeft.h"
#include "global.h"
#include "music.h"
#include "scoresystem.h"
#include "towernbullet.h"
#include "background.h"
#include "levels.h"
#include "scorec.h"
#include "menus.h"
static const char* MAIN_SRC_FN="main.cpp";
#ifdef WIN32
void Expand(const char *source,const char *dist)
{
	char cmd[255];
	sprintf(cmd,"%s -F:* %s",source,dist);
	int res=(int)ShellExecuteA(NULL,"open","expand.exe",cmd,NULL,SW_HIDE);
	if (res<32) Error("Error while decompressing resources!\nCheck if expand.exe works correctly.");
}
void firststartup()
{
	if (MessageBoxA(NULL,"It seems that you are running BLR for the First time!\nLet's do some \
basic settings first!\n\nUse vsync?","First Start Up",0x00000024)==6)
		fpslvl=2;
	else
		fpslvl=0;
	if (MessageBoxA(NULL,"Enable Fullscreen?","First Start Up",0x00000024)==6)
		tfs=1;
	else
		tfs=0;
	diffkey=false;VidMode=0;
	plrspd=3;plrslospd=3;clrbns=clrmode=0;bgmvol=15;sfxvol=10;
	hge->System_Log("%s: Finishing first start up configuraion...",MAIN_SRC_FN);
	Options_Writeback();
	Score_Initailize();
}
#else
void firststartup()
{
	fpslvl=2;tfs=0;VidMode=0;diffkey=false;
	plrspd=3;plrslospd=3;clrbns=clrmode=0;bgmvol=15;sfxvol=10;
	hge->System_Log("%s: Finishing (stubbed) first start up configuraion...",MAIN_SRC_FN);
	Options_Writeback();
	Score_Initailize();
}
#endif
void Player_Clear_Expand()
{
	if (LOWFPS)
		clrrange+=13.6;
	else
		clrrange+=0.8;
	int ds;
	for (int i=1;i<=bulcnt;++i)
	{
		if(bullet[i].bullettype>=253)continue;
		double dis=GetDist(bullet[i].bulletpos,playerpos);ds=0;
		if(PlayerSplit)
		for(int j=1;j<4;++j)
		{
			if(dis>GetDist(bullet[i].bulletpos,playerpos+splitData[j]))
			dis=GetDist(bullet[i].bulletpos,playerpos+splitData[j]),ds=j;
		}
		if(dis<=clrrange&&bullet[i].exist&&!bullet[i].inv)
		{
			CreateBullet255(bullet[i].bulletpos.x,bullet[i].bulletpos.y,10,ds);
			bullet[i].exist=false;
			bullet[i].bulletpos.x=bullet[i].bulletpos.y=0;
			bullet[i].bulletdir.x=bullet[i].bulletdir.y=0;
			bullet[i].dist=0;
			bullet[i].bullettype=0;
		}
	}
}
void Player_Clear_Rotate()
{
	if (LOWFPS)
		clrrad+=pi/450*17;
	else
		clrrad+=pi/450;
	for (int i=1;i<=bulcnt;++i)
	{
		if(bullet[i].bullettype>=253)continue;
		double dis=GetDist(bullet[i].bulletpos,playerpos);
		double rad=atan2l(bullet[i].bulletpos.y-playerpos.y,bullet[i].bulletpos.x-playerpos.x);
		hge->Gfx_RenderLine(playerpos.x+8,playerpos.y+8,playerpos.x+cos(clrrad)*clrmaxrange,playerpos.y+sin(clrrad)*clrmaxrange);
		rad=normalizerad(rad);
		if(dis<=clrmaxrange&&bullet[i].exist&&!bullet[i].inv&&rad>normalizerad(clrrad)-pi/12&&rad<normalizerad(clrrad)+pi/12)
		{
			CreateBullet255(bullet[i].bulletpos.x,bullet[i].bulletpos.y,10);
			bullet[i].exist=false;
			bullet[i].bulletpos.x=bullet[i].bulletpos.y=0;
			bullet[i].bulletdir.x=bullet[i].bulletdir.y=0;
			bullet[i].dist=0;
			bullet[i].bullettype=0;
		}
		if(PlayerSplit)
		for(int j=1;j<4;++j)
		{
			vector2d plsp=playerpos+splitData[j];
			double dis=GetDist(bullet[i].bulletpos,plsp);
			double rad=atan2l(bullet[i].bulletpos.y-plsp.y,bullet[i].bulletpos.x-plsp.x);
			hge->Gfx_RenderLine(plsp.x+8,plsp.y+8,plsp.x+cos(clrrad)*clrmaxrange,plsp.y+sin(clrrad)*clrmaxrange);
			while (rad<0)rad+=2*pi;
			if (bullet[i].bullettype!=255&&dis<=clrmaxrange&&bullet[i].exist&&!bullet[i].inv&&rad>normalizerad(clrrad)-pi/12&&rad<normalizerad(clrrad)+pi/12)
			{
				CreateBullet255(bullet[i].bulletpos.x,bullet[i].bulletpos.y,10,j);
				bullet[i].exist=false;
				bullet[i].bulletpos.x=bullet[i].bulletpos.y=0;
				bullet[i].bulletdir.x=bullet[i].bulletdir.y=0;
				bullet[i].dist=0;
				bullet[i].bullettype=0;
			}
		}
	}
}
void ProcessPlayer()
{
	if (!clrcircle)
	{
		clrcircle=new hgeSprite(SprSheet,63,71,193,193);
		clrcircle->SetHotSpot(96.5f,96.5f);
		clrcircle->SetBlendMode(BLEND_ALPHAADD);
	}
	if(clrmode)clrcircle->SetColor(0x30008080);else clrcircle->SetColor(0x30800000);
	if (playerLockX)
	{
		Lock.Setdata(0,vector2d(playerpos.x-1,0),vector2d(playerpos.x-1,600),0xC0FFFFFF);
		for (int i=1;i<80;++i)
		Lock.Setdata(i,vector2d(playerpos.x+1,0),vector2d(playerpos.x+1,600),0xC0FFFFFF);
		Lock.Render();
	}
	if (playerLockY)
	{
		Lock.Setdata(0,vector2d(0,playerpos.y+5),vector2d(800,playerpos.y+5),0xC0FFFFFF);
		for (int i=1;i<80;++i)
		Lock.Setdata(i,vector2d(0,playerpos.y+7),vector2d(800,playerpos.y+7),0xC0FFFFFF);
		Lock.Render();
	}
	if(!PlayerSplit)
	playerspr->RenderEx(playerpos.x+8.4,playerpos.y+8.4,playerrot,0.7,0);
	else
	{
		for(int i=0;i<4;++i)
		playerspr->RenderEx(playerpos.x+splitData[i].x+8.4,playerpos.y+splitData[i].y+8.4,playerrot,0.7,0);
	}
	if (DisablePlayer)return;
	playerrot+=0.00174533*17;
	double realspd;
	if (hge->Input_GetKeyState(HGEK_SHIFT))
		realspd=playerslospeed*(1000.0f/hge->Timer_GetFPS());
	else
		realspd=playerspeed*(1000.0f/hge->Timer_GetFPS());
	if (hge->Input_GetKeyState(HGEK_LEFT)&&!playerLockX)
		if (playerpos.x>10)playerpos.x-=realspd;
	if (hge->Input_GetKeyState(HGEK_RIGHT)&&!playerLockX)
		if ((playerpos.x<770&&!PlayerSplit)||(playerpos.x<370&&PlayerSplit))playerpos.x+=realspd;
	if (hge->Input_GetKeyState(HGEK_UP)&&!playerLockY)
		if (playerpos.y>10)playerpos.y-=realspd;
	if (hge->Input_GetKeyState(HGEK_DOWN)&&!playerLockY)
		if ((playerpos.y<570&&!PlayerSplit)||(playerpos.y<270&&PlayerSplit))playerpos.y+=realspd;
	if(mode==2)return;
	if (!clrmode)
	{
		if (hge->Input_GetKeyStateEx(diffkey?HGEK_X:HGEK_Z)==HGEKST_HIT&&clrmaxrange==0)
		{clrind=0;charge=1;}
		if (hge->Input_GetKeyStateEx(diffkey?HGEK_X:HGEK_Z)==HGEKST_KEEP&&charge)
		{
			if (clrmaxrange<=400)
			{if (LOWFPS)clrmaxrange+=1.6;else clrmaxrange+=0.1;}
			if (!LOWFPS)clrind+=0.001*pi;else clrind+=0.016*pi;
			clrcircle->RenderEx(playerpos.x+7.2,playerpos.y+7.2,clrind,2*clrmaxrange/193.0f);
			if(PlayerSplit)for(int i=1;i<4;++i)
			clrcircle->RenderEx(playerpos.x+splitData[i].x+7.2,playerpos.y+splitData[i].y+7.2,clrind,2*clrmaxrange/193.0f);
		}
		if (hge->Input_GetKeyStateEx(diffkey?HGEK_X:HGEK_Z)==HGEKST_RELEASE&&charge)
		{
			charge=0;
			if (clrmaxrange<=50)
			{
				if (clrtime+clrbns>0)
				{--clrtime;clrmaxrange=350;Player_Clear_Expand();++clrusg;}
				else clrmaxrange=0;
			}
			else{Player_Clear_Expand();++clrusg;}
		}
		if (clrrange!=0)
		{
			Player_Clear_Expand();
			clrcircle->RenderEx(playerpos.x+7.2,playerpos.y+7.2,clrind,2*(clrmaxrange-clrrange)/193.0f);
			if(PlayerSplit)for(int i=1;i<4;++i)
			clrcircle->RenderEx(playerpos.x+splitData[i].x+7.2,playerpos.y+splitData[i].y+7.2,clrind,2*(clrmaxrange-clrrange)/193.0f);
			clrind+=(LOWFPS?0.016*pi:0.001*pi);
		}
		if (clrrange>=clrmaxrange)clrrange=clrmaxrange=0;
	}
	else
	{
		if (hge->Input_GetKeyStateEx(diffkey?HGEK_X:HGEK_Z)==HGEKST_HIT&&clrmaxrange==0)
		{clrind=0;charge=1;}
		if (hge->Input_GetKeyStateEx(diffkey?HGEK_X:HGEK_Z)==HGEKST_KEEP&&charge)
		{
			if (clrmaxrange<=400)
			{if (LOWFPS)clrmaxrange+=1.6;else clrmaxrange+=0.1;}
			if (!LOWFPS)clrind+=0.001*pi;else clrind+=0.016*pi;
			clrcircle->RenderEx(playerpos.x+7.2,playerpos.y+7.2,clrind,2*clrmaxrange/193.0f);
			if(PlayerSplit)for(int i=1;i<4;++i)
			clrcircle->RenderEx(playerpos.x+splitData[i].x+7.2,playerpos.y+splitData[i].y+7.2,clrind,2*clrmaxrange/193.0f);
		}
		if (hge->Input_GetKeyStateEx(diffkey?HGEK_X:HGEK_Z)==HGEKST_RELEASE&&charge)
		{
			charge=0;
			if (clrmaxrange<=50)
			{
				if(clrtime+clrbns>0)
				{--clrtime;clrmaxrange=350;Player_Clear_Rotate();++clrusg;}
				else clrmaxrange=0;
			}else{Player_Clear_Rotate();++clrusg;}
		}
		if (clrrad-pi/2>1e-7)
		{
			Player_Clear_Rotate();
			clrcircle->RenderEx(playerpos.x+7.2,playerpos.y+7.2,clrind,2*clrmaxrange/193.0f*(5*pi/2.0f-clrrad)/(2*pi));
			if(PlayerSplit)for(int i=1;i<4;++i)
			clrcircle->RenderEx(playerpos.x+splitData[i].x+7.2,playerpos.y+splitData[i].y+7.2,clrind,2*clrmaxrange/193.0f*(5*pi/2.0f-clrrad)/(2*pi));
			clrind+=(LOWFPS?0.016*pi:0.001*pi);
		}
		if (5*pi/2-clrrad<1e-7)clrrad=pi/2,clrmaxrange=0;
	}
}
void RefreshScore()
{
	Mult_FrameFunc();
	if(DisablePlayer)return;
	mult+=0.01f*dsmc;
	score+=16*mult;
	if(scminus){if(mult/2>0.1)mult/=2;else mult=0.1;}
	score+=100*shots*mult;
	score-=scminus*mult;
	score+=2000*dsmc*mult;
	++frms;
	averfps=(averfps*(frms-1)+hge->Timer_GetFPSf())/(double)frms;
}
void CallLevels()
{
	//Use this to call level procedures.
	if((mode==1)&&coll!=0){deathMenu.Init(-200);return;}
	if((mode==2)&&coll!=0){asts+=assetime;assetime=0;++part;coll=0;IfCallLevel=IfShowTip=true;return;}
	if(!IfCallLevel) return;
	if(mode==2)assetime+=hge->Timer_GetDelta();
	//Check Complete here
	if(level==1&&part==0)Level1Part0();
	if(level==1&&part==1)Level1Part1();
	if(level==1&&part==2)Level1Part2();
	if(level==1&&part==3)Level1Part3();
	if(level==1&&part==4)Level1Part4();
	if(level==2&&part==0)Level2Part0();
	if(level==2&&part==1)Level2Part1();
	if(level==2&&part==2)Level2Part2();
	if(level==2&&part==3)Level2Part3();
	if(level==2&&part==4)Level2Part4();
	if(level==2&&part==5)Level2Part5();
	if(level==2&&part==6)Level2Part6();
	if(level==2&&part==7)Level2Part7();
	if(level==2&&part==8)Level2Part8();
	if(level==2&&part==9)Level2Part9();
	if(level==3&&part==0)Level3Part0();
	if(level==3&&part==1)Level3Part1();
	if(level==3&&part==2)Level3Part2();
	if(level==3&&part==3)Level3Part3();
	if(level==3&&part==4)Level3Part4();
	if(level==3&&part==5)Level3Part5();
	if(level==3&&part==6)Level3Part6();
	if(level==4&&part==0)Level4Part0();
	if(level==4&&part==1)Level4Part1();
	if(level==4&&part==2)Level4Part2();
	if(level==4&&part==3)Level4Part3();
	if(level==4&&part==4)Level4Part4();
	if(level==4&&part==5)Level4Part5();
	if(level==4&&part==6)Level4Part6();
	if(level==4&&part==7)Level4Part7();
	if(level==4&&part==8)Level4Part8();
	if(level==4&&part==9)Level4Part9();
	if(level==4&&part==10)Level4Part10();
	if(level==4&&part==11)Level4Part11();
	if(level==4&&part==12)Level4Part12();
	if(level==4&&part==13)Level4Part13();
	if(level==4&&part==14)Level4Part14();
	if(level==4&&part==15)Level4Part15();
	if(level==4&&part==16)Level4Part16();
	if(level==4&&part==17)Level4Part17();
	if(level==4&&part==18)Level4Part18();
	if(level==4&&part==19)Level4Part19();
	if(level==4&&part==20)Level4Part20();
	if(level==4&&part==21)Level4Part21();
	if(level==4&&part==22)Level4Part22();
	if(level==4&&part==23)Level4Part23();
	if(level==4&&part==24)Level4Part24();
	if(level==4&&part==25)Level4Part25();
	if(level==5&&part==0)Level5Part0();
	if(level==5&&part==1)Level5Part1();
	if(level==5&&part==2)Level5Part2();
	if(level==5&&part==3)Level5Part3();
	if(level==5&&part==4)Level5Part4();
	if(level==5&&part==5)Level5Part5();
	if(level==5&&part==6)Level5Part6();
	if(level==5&&part==7)Level5Part7();
	if(level==5&&part==8)Level5Part8();
	if(level==5&&part==9)Level5Part9();
	if(level==5&&part==10)Level5Part10();
	if(level==5&&part==11)Level5Part11();
	if(level==5&&part==12)Level5Part12();
	if(level==5&&part==13)Level5Part13();
	if(level==5&&part==14)Level5Part14();
	if(level==5&&part==15)Level5Part15();
	if(level==5&&part==16)Level5Part16();
	if(level==5&&part==17)Level5Part17();
	if(level==5&&part==18)Level5Part18();
	if(level==5&&part==19)Level5Part19();
	if(level==5&&part==20)Level5Part20();
	if(level==5&&part==21)Level5Part21();
	if(level==5&&part==22)Level5Part22();
	if(level==6&&part==0)Level6Part0();
	if(level==6&&part==1)Level6Part1();
	if(level==6&&part==2)Level6Part2();
	if(level==6&&part==3)Level6Part3();
	if(level==6&&part==4)Level6Part4();
	if(level==6&&part==5)Level6Part5();
	if(level==6&&part==6)Level6Part6();
	if(level==6&&part==7)Level6Part7();
	if(level==6&&part==8)Level6Part8();
	if(level==6&&part==9)Level6Part9();
	if(level==6&&part==10)Level6Part10();
	if(level==6&&part==11)Level6Part11();
	if(level==6&&part==12)Level6Part12();
	if(level==6&&part==13)Level6Part13();
	if(level==6&&part==14)Level6Part14();
	if(level==6&&part==15)Level6Part15();
	if(level==6&&part==16)Level6Part16();
	if(level==6&&part==17)Level6Part17();
	if(level==6&&part==18)Level6Part18();
	if(level==6&&part==19)Level6Part19();
	if(level==6&&part==20)Level6Part20();
	if(level==6&&part==21)Level6Part21();
	if(level==6&&part==22)Level6Part22();
	if(level==6&&part==23)Level6Part23();
	if(level==6&&part==24)Level6Part24();
	if(level==6&&part==25)Level6Part25();
	if(level==6&&part==26)Level6Part26();
	if(level==6&&part==27)Level6Part27();
	if(level==6&&part==28)Level6Part28();
	if(level==6&&part==29)Level6Part29();
	if(level==6&&part==30)Level6Part30();
	if(level==6&&part==31)Level6Part999999999();
	if(level==7&&part==0)Level7Part0();
	if(level==7&&part==1)Level7Part1();
	if(level==7&&part==2)Level7Part2();
	if(level==7&&part==3)Level7Part3();
	if(level==7&&part==4)Level7Part4();
	if(level==7&&part==5)Level7Part5();
	if(level==7&&part==6)Level7Part6();
	if(level==7&&part==7)Level7Part7();
	if(level==7&&part==8)Level7Part8();
	if(level==7&&part==9)Level7Part9();
	if(level==7&&part==10)Level7Part10();
	if(level==7&&part==11)Level7Part11();
	if(level==7&&part==12)Level7Part12();
	if(level==7&&part==13)Level7Part13();
	if(level==7&&part==14)Level7Part14();
	if(level==7&&part==15)Level7Part15();
	if(level==7&&part==16)Level7Part16();
	if(level==7&&part==17)Level7Part17();
	if(level==7&&part==18)Level7Part18();
	if(level==7&&part==19)Level7Part19();
	if(level==7&&part==20)Level7Part20();
	if(level==7&&part==21)Level7Part21();
	if(level==7&&part==22)Level7Part22();
	if(level==7&&part==23)Level7Part23();
	if(level==7&&part==24)Level7Part24();
	if(level==7&&part==25)Level7Part25();
	if(level==7&&part==26)Level7Part26();
	if(level==-1&&part==0)Levelm1Part0();
	if(level==-1&&part==1)Levelm1Part1();
	if(level==-1&&part==2)Levelm1Part2();
	if(level==-1&&part==3)Levelm1Part3();
	if(level==-1&&part==4)Levelm1Part4();
	if(level==-1&&part==5)Levelm1Part5();
	if(level==-1&&part==6)Levelm1Part6();
	if(level==-1&&part==7)Levelm1Part7();
	if(level==-1&&part==8)Levelm1Part8();
	if(level==-1&&part==9)Levelm1Part9();
	if(level==-1&&part==10)Levelm1Part10();
	if(level==-1&&part==11)Levelm1Part11();
	if(level==-1&&part==12)Levelm1Part12();
	if(level==-1&&part==13)Levelm1Part13();
	if(level==-1&&part==14)Levelm1Part14();
	if(level==-1&&part==15)Levelm1Part15();
	if(level==-1&&part==16)Levelm1Part16();
	if(level==-1&&part==17)Levelm1Part17();
	if(level==-1&&part==18)Levelm1Part18();
	if(level==-1&&part==19)Levelm1Part19();
	if(level==-1&&part==20)Levelm1Part20();
	if(level==-1&&part==21)Levelm1Part21();
	if(level==-2&&part==0)Levelm2Part0();
	if(level==-2&&part==1)Levelm2Part1();
	if(level==-2&&part==2)Levelm2Part2();
	if(level==-2&&part==3)Levelm2Part3();
	if(level==-2&&part==4)Levelm2Part4();
	if(level==-2&&part==5)Levelm2Part5();
	if(level==-2&&part==6)Levelm2Part6();
	if(level==-2&&part==7)Levelm2Part7();
	if(level==-2&&part==8)Levelm2Part8();
	if(level==-2&&part==9)Levelm2Part9();
	if(level==-2&&part==10)Levelm2Part10();
	if(level==-2&&part==11)Levelm2Part11();
	if(level==-2&&part==12)Levelm2Part12();
	if(level==-2&&part==13)Levelm2Part13();
	if(level==-2&&part==14)Levelm2Part14();
	if(level==-2&&part==15)Levelm2Part15();
	if(level==-2&&part==16)Levelm2Part16();
	if(level==-2&&part==17)Levelm2Part17();
	if(level==-2&&part==18)Levelm2Part18();
	if(level==-2&&part==19)Levelm2Part19();
	if(level==-2&&part==20)Levelm2Part20();
	if(level==-2&&part==21)Levelm2Part21();
	if(level==-2&&part==22)Levelm2Part22();
	if(level==-2&&part==23)Levelm2Part23();
	if(level==-2&&part==24)Levelm2Part24();
	if(level==-2&&part==25)Levelm2Part25();
	if(level==-2&&part==26)Levelm2Part26();

	if(level==1&&part==5)level=2,part=0;
	if(level==2&&part==10)
	{
		if(mode==3&&coll>10){completeMenu.Init(-200);return;}
		if(mode==1&&restarts>1){completeMenu.Init(-200);return;}
		level=3,part=0;
	}
	if(level==3&&part==7)
	{
		if(mode==3&&coll>40){completeMenu.Init(-200);return;}
		if(mode==1&&restarts>2){completeMenu.Init(-200);return;}
		level=4,part=0;
	}
	if(level==4&&part==26)
	{
		if(mode==3&&coll>75){completeMenu.Init(-200);return;}
		if(mode==1&&restarts>3){completeMenu.Init(-200);return;}
		level=5,part=0;
	}
	if(level==5&&part==23)
	{
		if(mode==3&&coll>125){completeMenu.Init(-200);return;}
		if(mode==1&&restarts>5){completeMenu.Init(-200);return;}
		level=6,part=0;
	}
	if(level==6&&part==32)
	{
		if(mode==3&&coll>200){completeMenu.Init(-200);return;}
		if(mode==1&&restarts>8){completeMenu.Init(-200);return;}
		level=7,part=0;
	}
	if(level==7&&part==27)
	{
		if(mode==3&&coll>50){completeMenu.Init(-200);return;}
		if(mode==1&&restarts>2){completeMenu.Init(-200);return;}
		level=-1,part=0;
	}
	if(level==-1&&part==22){completeMenu.Init(-200);return;}
	if(level==-2&&part>26){completeMenu.Init(-200);return;}
}
bool ProcessCurCred()
{
	CreditsRail->RenderEx(400,300,0,4,1);
	if(creditsp!=1)
	Credits->Render(creditfly,300);
	else
	{
		Credits->SetTextureRect(4,209,230,76);
		Credits->Render(creditfly-30,330);
		Credits->SetTextureRect(9,290,140,47);
		Credits->Render(creditfly-30,400);
		vdig->printf(creditfly-50,240,HGETEXT_LEFT,"%s",BLRVERSION);
		bdig->printf(creditfly-50,310,HGETEXT_LEFT,"%s",BuiltDate);
	}
	if (credstop)credbrk+=hge->Timer_GetDelta();
	if (credbrk>=4.5&&!creddone)creddone=true,credstop=false,creditacc=0,credbrk=0;
	if (!credstop)for (int i=1;i<=17;++i)creditfly-=creditacc;
	if (creditfly<-300)return true;
	for (int i=1;i<=17;++i)if (creditacc<2)creditacc+=0.015;
	if (abs(creditfly-400)<5&&!creddone&&!credstop)credstop=true;
	return false;
}
void AboutScene()
{
	if (ProcessCurCred())
		creditfly=1200,creditacc=0,credstop=creddone=false,++creditsp,
		Credits->SetTextureRect(0,creditsp*200,600,200),
		Credits->SetHotSpot(300,100);
	if(hge->Input_GetKeyStateEx(HGEK_Z)==HGEKST_HIT||hge->Input_GetKeyStateEx(HGEK_ESCAPE)==HGEKST_HIT||creditsp>11)
	{
		Current_Position=0;
		mainMenu.Init(850);
		Music_Stop();
	}
}
void HelpScene(bool fake=false)
{
	if(!fake)if(Hlpyofst>0)Hlpyofst-=40;else Hlpyofst=0;
	else if(Hlpyofst<400)Hlpyofst+=40;else Hlpyofst=400,hshl=0;
	if(Helpslide>1)MenuFont->Render(30,80+Hlpyofst,HGETEXT_LEFT,"Last"),
		HlpL->Render(0,85+Hlpyofst);
	if(Helpslide<6)MenuFont->Render(770,80+Hlpyofst,HGETEXT_RIGHT,"Next"),
		HlpR->Render(775,85+Hlpyofst);
	if(Helpscroll==0)Helpspr->Render(0,100+Hlpyofst);
	else
	{
		Helpspr->Render(Helpscroll,100+Hlpyofst);
		if(Helpscroll>0)NHelpspr->Render(Helpscroll-800,100+Hlpyofst);
		else NHelpspr->Render(Helpscroll+800,100+Hlpyofst);
		if(Helpscroll>0)Helpscroll+=30;else Helpscroll-=30;
		if(fabs(Helpscroll)>=800)
		{
			Helpscroll=0;Helpspr->SetTextureRect(0,400*(Helpslide-1),800,400);
		}
	}
	if(fake)return;
	if(Helpscroll==0)
	{
		if(hge->Input_GetKeyStateEx(HGEK_LEFT)==HGEKST_HIT&&Helpslide>1)
		{
			--Helpslide;NHelpspr->SetTextureRect(0,400*(Helpslide-1),800,400);
			Helpscroll=1;
		}
		if(hge->Input_GetKeyStateEx(HGEK_RIGHT)==HGEKST_HIT&&Helpslide<6)
		{
			++Helpslide;NHelpspr->SetTextureRect(0,400*(Helpslide-1),800,400);
			Helpscroll=-1;
		}
		if(hge->Input_GetKeyStateEx(HGEK_ESCAPE)==HGEKST_HIT)
		{
			Current_Position=0;mainMenu.Init(1000);hshl=1;
		}
	}
}
bool Foclost()
{
	if(Current_Position==1)pauseMenu.Init(-200);
	return false;
}
bool FrameFunc()
{
	float dt=hge->Timer_GetDelta();
	static float t=0.0f;
	float tx,ty;
	if (Current_Position==1&&hge->Input_GetKeyState(HGEK_ESCAPE))pauseMenu.Init(-200);
	int MMR=-1,SMR=-1,OMR=-1,PPMR=-1,PMR=-1,RTTMR=-1,DMR=-1,CMR=-1,HSMR=-1,HSVMR=-1,HSDMR=-1;
	if (mainMenu.isActive())MMR=mainMenu.Update();
	if (startMenu.isActive())SMR=startMenu.Update();
	if (optionMenu.isActive())OMR=optionMenu.Update();
	if (playerPreferenceMenu.isActive())PPMR=playerPreferenceMenu.Update();
	if (pauseMenu.isActive())PMR=pauseMenu.Update();
	if (returnToTitleMenu.isActive())RTTMR=returnToTitleMenu.Update();
	if (deathMenu.isActive())DMR=deathMenu.Update();
	if (completeMenu.isActive())CMR=completeMenu.Update();
	if (newHighScoreGUI.isActive())newHighScoreGUI.Update();
	if (highScoreMenu.isActive())HSMR=highScoreMenu.Update();
	if (highScoreViewMenu.isActive())HSVMR=highScoreViewMenu.Update();
	if (highScoreDetailsMenu.isActive())HSDMR=highScoreDetailsMenu.Update();
	if (Current_Position==0)
	{
		if(!mainMenu.isActive())return true;
		if(~MMR)
		{
			switch(MMR)
			{
				case 0:Current_Position=3;startMenu.Init();mainMenu.Leave();break;
				case 1:Current_Position=8;highScoreMenu.Init(-200);mainMenu.Leave();break;
				case 2:
					Current_Position=13;
					optionMenu.Init(-200);
					break;
				case 3:
					Current_Position=15;
					Helpspr->SetTextureRect(0,0,800,400);
					NHelpspr->SetTextureRect(0,400,800,400);
					Helpslide=1;Hlpyofst=400;Helpscroll=0;
					break;
				case 4:
					Credits->SetHotSpot(300,100);
					CreditsRail->SetHotSpot(300,100);
					creditsp=0;
					Music_Init("./Resources/Music/BLR2_TR09.ogg");
					lpst=lped=0;Music_Play();
					creditfly=1200;creditacc=0;credstop=creddone=false;
					Credits->SetTextureRect(0,0,600,200);
					Current_Position=4;
					mainMenu.Leave();
					break;
				case 5:break;
			}
			mainMenu.Leave();
			return false;
		}
	}
	if (Current_Position==3)
	{
		if(hge->Input_GetKeyStateEx(HGEK_ESCAPE)==HGEKST_HIT)
		{
            startMenu.Leave();mainMenu.Init(800);Current_Position=0;
		}
		if(~SMR)
		{
			startMenu.Leave();
			switch(SMR)
			{
                case 0:
					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;
					if(bullet){free(bullet);bullet=NULL;}
					towcnt=bulcnt=0;whrcnt=12;skyactive=false;PlayerSplit=false;
					score=0;Mult_Init();//Music_Init("./Resources/Music/CanonTechno.ogg");
					lpst=4607901;lped=9215893;//Music_Play();
					coll=semicoll=clrusg=0;playerLockX=playerLockY=false;
					Lock.Init(2);IfShowTip=true;lsc=0;
					clrrad=pi/2;clrrange=0;re.SetSeed(time(NULL));
					FadeTip=false;memset(lasttip,0,sizeof(lasttip));
					memset(tower,0,sizeof(tower));
					Complete=false;
					Current_Position=1;
					Level1Part1();
					IfCallLevel=true;
					mode=1;
				break;
				case 1:
					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=asts=0;
					if(bullet){free(bullet);bullet=NULL;}
					towcnt=bulcnt=0;whrcnt=12;skyactive=false;PlayerSplit=false;
					score=0;Mult_Init();Music_Init("./Resources/Music/CanonTechno.ogg");
					lpst=4607901;lped=9215893;Music_Play();
					coll=semicoll=clrusg=0;playerLockX=playerLockY=false;
					Lock.Init(2);IfShowTip=true;lsc=0;
					clrrad=pi/2;clrrange=0;re.SetSeed(time(NULL));
					FadeTip=false;memset(lasttip,0,sizeof(lasttip));
					memset(tower,0,sizeof(tower));
					Complete=false;
					Current_Position=1;
					IfCallLevel=true;
					mode=2;
				break;
				case 2:
					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;
					if(bullet){free(bullet);bullet=NULL;}
					towcnt=bulcnt=0;whrcnt=12;skyactive=false;PlayerSplit=false;
					score=0;Mult_Init();//Music_Init("./Resources/Music/CanonTechno.ogg");
					lpst=4607901;lped=9215893;//Music_Play();
					coll=semicoll=clrusg=0;playerLockX=playerLockY=false;
					Lock.Init(2);IfShowTip=true;lsc=0;
					clrrad=pi/2;clrrange=0;re.SetSeed(time(NULL));
					FadeTip=false;memset(lasttip,0,sizeof(lasttip));
					memset(tower,0,sizeof(tower));
					Complete=false;
					Current_Position=1;
					Level1Part1();
					IfCallLevel=true;
					mode=3;
				break;
			}
			return false;
		}
	}
	if (Current_Position==5)
	{
		if(~DMR)
		{
			if(DMR==1)
			{
				IfCallLevel=true;
				IfShowTip=true;
				Current_Position=1;
				score=-abs(score);
				mult=1;multbat=1;multbrk=TenSeconds;
				++restarts;part=0;
				clockrot=deltarot=0;
				coll=towcnt=bulcnt=0;
				DisableAllTower=DisablePlayer=false;
			}
			if(DMR==2)
			{Current_Position=0;mainMenu.Init(-200);}
			deathMenu.Leave();
			return false;
		}
	}
	if (Current_Position==6)
	{
		if(~CMR)
		{
			if(CMR==1)
			{Current_Position=7;newHighScoreGUI.Init();}
			if(CMR==2)
			{Current_Position=0;mainMenu.Init(-200);}
			completeMenu.Leave();
			return false;
		}
	}
	if (Current_Position==8)
	{
		if(~HSMR)
		{
			if(HSMR<=2)
			{Current_Position=9;highScoreViewMenu.Init(-200,HSMR);}
			if(HSMR==3)
			{Current_Position=0;mainMenu.Init(-200);}
			highScoreMenu.Leave();
			return false;
		}
	}
	if (Current_Position==9)
	{
		if(~HSVMR)
		{
			if(HSVMR<=highScoreViewMenu.GetViewCount()&&HSVMR)
			{Current_Position=10;highScoreDetailsMenu.Init(-200,highScoreViewMenu.View(),HSVMR);}
			if(HSVMR==6)
			{Current_Position=8;highScoreMenu.Init(-200);}
			if(HSVMR&&(HSVMR<=highScoreViewMenu.GetViewCount()||HSVMR==6))
			highScoreViewMenu.Leave();
			return false;
		}
	}
	if (Current_Position==10)
	{
		if(~HSDMR)
		{
			highScoreViewMenu.Init(-200,highScoreDetailsMenu.View());
			highScoreDetailsMenu.Leave();Current_Position=9;
			return false;
		}
	}
	if (Current_Position==11)
	{
		//I am cornered!!
		if(!pauseMenu.isActive())Current_Position=1,DisableAllTower=DisablePlayer=0;
        if(~PMR)
		{
			pauseMenu.Leave();
			if(PMR==2)returnToTitleMenu.Init(-200),Current_Position=12;
			else Music_Resume();
			return false;
		}
	}
	if (Current_Position==12)
	{
		if(~RTTMR)
		{
			returnToTitleMenu.Leave();
			if(RTTMR==1)pauseMenu.Init(-200);
			if(RTTMR==2)mainMenu.Init(-200),Current_Position=0;
		}
	}
	if (Current_Position==13)
	{
		if(~OMR)
		{
			if(OMR==6||OMR==7)optionMenu.Leave();
			if(OMR==6)
			{
				playerPreferenceMenu.Init(-200);
				Current_Position=14;
			}
			if(OMR==7)
			{
				Options_Writeback();
				mainMenu.Init(-200);
				Current_Position=0;
			}
			return false;
		}
	}
	if (Current_Position==14)
	{
		if(~PPMR)
		{
			if(PPMR==5)
			{
				if(AP_Update(plrspd,plrslospd,clrbns)<=10000)
					optionMenu.Init(850),
					Current_Position=13,
					playerPreferenceMenu.Leave();
				else playerPreferenceMenu.Shake();
			}
			return false;
		}
	}
	t+=dt;
	tx=50*cosf(t/60);
	ty=50*sinf(t/60);
	quad.v[0].tx=tx;        quad.v[0].ty=ty;
	quad.v[1].tx=tx+800/64; quad.v[1].ty=ty;
	quad.v[2].tx=tx+800/64; quad.v[2].ty=ty+600/64;
	quad.v[3].tx=tx;        quad.v[3].ty=ty+600/64;
	//Rendering***********************************************************************************
	//Super Spliter!*****Super Spliter!*****Super Spliter!*****Super Spliter!*****Super Spliter!**
	//******Super Spliter!*****Super Spliter!*****Super Spliter!*****Super Spliter!***************
	hge->Gfx_BeginScene();
#ifndef WIN32
	hge->Gfx_SetTransform(0,0,0,yos,0,scale,scale);
#else
	hge->Gfx_SetTransform(0,0,0,0,0,scale,scale);
#endif
	for(int i=0;i<4;i++)quad.v[i].col=DBGColor;
	hge->Gfx_Clear(SETA(DBGColor,0xFF));
	if (skyactive)sky.Update(),sky.Render();
	hge->Gfx_RenderQuad(&quad);
	int bulinuse=0;
	if (Current_Position==1||Current_Position==2||Current_Position==5||Current_Position==11||Current_Position==12)
	{
	//If we are at the main scene or tip scene(which towers and bullets should still appear..)
	//Render towers, bullets and player.
		if (Leaves.IsActive())Leaves.Update();
		if (binter.active())binter.Update();
		if (bdiff.active())bdiff.Update();
		if (LE_Active)Leaf.Update();
		shots=0;
		dsmc=scminus=0;
		Music_Update();
		ProcessTower1();
		ProcessTower2();
		ProcessTower3();
		ProcessTower4();
		ProcessTower5();
		ProcessTower6();
		ProcessTower7();
		ProcessTower8();
		ProcessTower9();
		ProcessLaser();
		for (int i=1;i<=bulcnt;++i)
		{
			if(bullet[i].exist)++bulinuse;
			switch (bullet[i].bullettype)
			{
				case 1:ProcessBullet1(i);break;
				case 2:ProcessBullet2(i);break;
				case 4:ProcessBullet4(i);break;
				case 5:ProcessBullet5(i);break;
				case 6:ProcessBullet6(i);break;
				case 7:ProcessBullet7(i);break;
				case 8:ProcessBullet8(i);break;
				case 9:ProcessBullet9(i);break;
				case 253:BulletDeath_Process(i);break;
				case 254:SCEffect_Process(i);break;
				case 255:ProcessBullet255(i);break;
			}
		}
		if (Current_Position==1)CallLevels();
		ProcessPlayer();
		RefreshScore();
		{
			if (ATarg.visible)ATarg.TargFollowPlayer(),ATarg.TargRender();
		}
		{
			if (BTarg.visible)BTarg.TargRender();
		}
		if (!DisablePlayer)--frameleft;
		if (!LOWFPS)
		{
			if (playerspeed<playerfulspd)playerspeed+=playerfulspd/400;
			if (playerslospeed<playerfulslospd)playerslospeed+=playerfulslospd/400;
		}
		else
		{
			if (playerspeed<playerfulspd)playerspeed+=playerfulspd/25;
			if (playerslospeed<playerfulslospd)playerslospeed+=playerfulslospd/25;
		}
	}
	if (frameleft==0&&Current_Position==1)
	{
		IfCallLevel=true;
		++part;
		IfShowTip=true;
	}
	if(Current_Position==1&&shots)hge->Effect_PlayEx(snd,sfxvol/15.0,0,1,false);
	if(mainMenu.isActive())mainMenu.Render();
	if(startMenu.isActive())startMenu.Render();
	if(optionMenu.isActive())optionMenu.Render();
	if(playerPreferenceMenu.isActive())playerPreferenceMenu.Render();
	if(pauseMenu.isActive())pauseMenu.Render();
	if(returnToTitleMenu.isActive())returnToTitleMenu.Render();
	if(deathMenu.isActive())deathMenu.Render();
	if(completeMenu.isActive())completeMenu.Render();
	if(newHighScoreGUI.isActive())newHighScoreGUI.Render();
	if(highScoreMenu.isActive())highScoreMenu.Render();
	if(highScoreViewMenu.isActive())highScoreViewMenu.Render();
	if(highScoreDetailsMenu.isActive())highScoreDetailsMenu.Render();
	if(Current_Position==15)HelpScene();if(hshl)HelpScene(1);
	if(Current_Position==0||Current_Position==3||Current_Position==8||
	   Current_Position==9||Current_Position==10||Current_Position==13||Current_Position==14)
	{
		titlespr->Render(160,0);
	}
	if (Current_Position==2)ShowTip(lasttip);
	if (Current_Position==4)AboutScene();
	fnt->SetColor(0xFFFFFFFF);
	rbPanelFont.UpdateString(L" FPS: %.2f",hge->Timer_GetFPSf());
	rbPanelFont.Render(785,595,0xFFFFFFFF,1);
	if (Current_Position==1||Current_Position==2)
	{
		rbPanelFont.UpdateString(L"AF: %.2f",averfps);
		rbPanelFont.Render(785,575,0xFFFFFFFF,1);
		if (playerpos.x<220&&playerpos.y<200)
		{
			if (!LOWFPS&&infofade>=0x33)--infofade;
			if (LOWFPS&&infofade>0x33)infofade-=16;
		}
		else
		{
			if (!LOWFPS&&infofade<0xFF)++infofade;
			if (LOWFPS&&infofade<=0xEF)infofade+=16;
		}
		if(hge->Input_GetKeyStateEx(HGEK_A)==HGEKST_HIT)showdebug^=1;
		if(showdebug)
		{
			fnt->SetColor(0xFFFFFFFF);
			fnt->printf(795, 0, HGETEXT_RIGHT, "Allocated bullets %d",bulcnt);
			fnt->printf(795, 25, HGETEXT_RIGHT, bulcnt?"%d in use (%.2f%%)":"%d in use (?%)",bulinuse,(double)bulinuse/bulcnt);
			fnt->printf(795, 50, HGETEXT_RIGHT, "Player pos (%.2f,%.2f)",playerpos.x,playerpos.y);
		}
		fnt->SetColor(SETA(0xFFFFFF,infofade));
		fnt->printf(5, 0, HGETEXT_LEFT, "Frames to go: %d",frameleft);
		fnt->printf(5, 25, HGETEXT_LEFT, "Score: %lld",score);
		fnt->printf(5, 50, HGETEXT_LEFT, "Level %d",level);
		if (mode==3)
			fnt->printf(5, 75, HGETEXT_LEFT, "Collisions: %d",coll);
		else if (mode==2)
			fnt->printf(5, 75, HGETEXT_LEFT, "Elapsed Time: %.2lf",assetime);
		else
			fnt->printf(5, 75, HGETEXT_LEFT, "Restarts: %d",restarts);
		fnt->printf(5, 100, HGETEXT_LEFT, "Semi-Collisions: %d",semicoll);
		if(mode==2)
			fnt->printf(5, 125, HGETEXT_LEFT, "Multiplier: %.2lf",mult);
		else
		{
			fnt->printf(5, 125, HGETEXT_LEFT, "Clear Range Left: %d",clrtime+clrbns);
			fnt->printf(5, 150, HGETEXT_LEFT, "Multiplier: %.2lf",mult);
		}
	}
	hge->Gfx_EndScene();
	if(hge->Input_GetKeyStateEx(HGEK_S)==HGEKST_HIT&&Current_Position!=7)hge->System_Snapshot();
	return false;
}
void printHelp(char *exec,const char* str="")
{
	printf("Usage: %s [options]...\n",exec);
	puts("To run the game normally, just start without arguments.");
	puts("Options:");
	puts("--help            Print this help and exit.");
	puts("--version         Print version and exit.");
	puts("--start=x,y       Start free play mode directly from level x part y. The part must be valid.");
	puts("--nosound         Forcibly use no sound.");
	puts("--fullscreen=1/0  Forcibly use fullscreen/windowed. This will override your configuration.");
	puts("--vidmode=0~4     Forcibly use specific video mode instead the one in the configuration.");
	puts("          0       800x600 (native resolution)");
	puts("          1       640x480");
	puts("          2       960x720");
	puts("          3       1024x768");
	puts("          4       1280x960");
	puts("--firststartup    Forcibly run first start up. The score file will be preserved if exist.");
	puts("--fast            Fast mode. All levels are two times shorter.");
	puts("--logfile=...     Use an alternate log file name instead of the default \"BLRLOG.txt\".");
#ifdef WIN32
	puts("--nohideconsole   Do not hide console.\n");
#endif
	if(strcmp(str,""))printf("%s\n",str);
	exit(0);
}
void parseArgs(int argc,char *argv[])
{
	for(int i=1;i<argc;++i)
	{
		if(!strcmp(argv[i],"--help"))printHelp(argv[0]);
		if(!strcmp(argv[i],"--version"))
		{
			printf("Bullet Lab Remix II %s\n",BLRVERSION);
			printf("Built Date: %s\n",BuiltDate);
			exit(0);
		}
		bool valid=false;
		if(!strcmp(argv[i],"--nosound"))fNoSound=true,valid=true;
		if(!strcmp(argv[i],"--fast"))fFast=true,valid=true;
		if(!strcmp(argv[i],"--firststartup"))fFristStartUp=true,valid=true;
		if(!strncmp(argv[i],"--fullscreen",12))
		{
			char *ptr=argv[i];while(*ptr!='='&&*ptr)++ptr;
			if(!*ptr)printHelp(argv[0],"--fullscreen need a parameter!\n");
			++ptr;
			int para=strtol(ptr,&ptr,10);
			if(*ptr||(para!=1&&para!=0))printHelp(argv[0],"Invalid parameter for --fullscreen!\n");
			if(para)fFullScreen=2;else fFullScreen=1;
			valid=true;
		}
		if(!strncmp(argv[i],"--vidmode",9))
		{
			char *ptr=argv[i];while(*ptr!='='&&*ptr)++ptr;
			if(!*ptr)printHelp(argv[0],"--vidmode need a parameter!\n");
			++ptr;
			int para=strtol(ptr,&ptr,10);
			if(*ptr||(para<0||para>4))printHelp(argv[0],"Invalid parameter for --vidmode!\n");
			if(para)VidMode=para;
			valid=true;
		}
		if(!strncmp(argv[i],"--start",7))
		{
			char *ptr=argv[i];while(*ptr!='='&&*ptr)++ptr;
			if(!*ptr)printHelp(argv[0],"--start need two parameters!");
			++ptr;startLvl=strtol(ptr,&ptr,10);
			if(*ptr!=',')printHelp(argv[0],"Invalid parameter for --start!\n");
			++ptr;startPrt=strtol(ptr,&ptr,10);
			if(*ptr)printHelp(argv[0],"Invalid parameter for --start!\n");
			valid=true;
		}
		if(!strncmp(argv[i],"--logfile",9))
		{
			char *ptr=argv[i];while(*ptr!='='&&*ptr)++ptr;
			if(!*ptr)printHelp(argv[0],"--logfile need a parameter!");
			++ptr;strcpy(alterLog,ptr);
			valid=true;
		}
#ifdef WIN32
		if(!strncmp(argv[i],"--nohideconsole",15))noHideConsole=true,valid=true;
#endif
		if(!valid)
		{
			char err[256];sprintf(err,"Unknown option: %s\n",argv[i]);
			printHelp(argv[0],err);
		}
	}
}
int main(int argc,char *argv[])
{
	signal(SIGSEGV,SigHandler);
	parseArgs(argc,argv);
#ifdef WIN32
	if(!noHideConsole)FreeConsole();
#endif
	srand(time(NULL));
	hge=hgeCreate(HGE_VERSION);
	if(alterLog[0])
	hge->System_SetState(HGE_LOGFILE, alterLog);
	else
	hge->System_SetState(HGE_LOGFILE, "BLRLOG.txt");
	hge->System_Log("%s: Bullet Lab Remix Log File",MAIN_SRC_FN);
#ifdef WIN32
#ifdef MINGW_BUILD
	hge->System_Log("%s: Build: MinGW_w64 cross build",MAIN_SRC_FN);
#else
	hge->System_Log("%s: Build: Win32 build",MAIN_SRC_FN);
#endif
#else
	hge->System_Log("%s: Build: Unix build",MAIN_SRC_FN);
#endif
	hge->System_Log("%s: Version: %s",MAIN_SRC_FN,BLRVERSION);
	hge->System_Log("%s: Built Date: %s",MAIN_SRC_FN,BuiltDate);
#ifdef WIN32
	if (_mkdir("./Resources")!=0||_mkdir("./Resources/Music")!=0)
		Error("Cannot decompress resources!\nDetailed Information: An error occured while creating folder.\n\nTry restarting the game.");
	hge->System_Log("%s: Folders created successfully.",MAIN_SRC_FN);
	Expand("BLRData.dtp","Resources");
	Expand("BLRMusic.dtp","Resources/Music");
	hge->System_Log("%s: Resources decompressed successfully.",MAIN_SRC_FN);
#endif
	hge->System_SetState(HGE_FRAMEFUNC, FrameFunc);
	hge->System_SetState(HGE_FOCUSLOSTFUNC, Foclost);
	hge->System_SetState(HGE_DONTSUSPEND, true);
	hge->System_SetState(HGE_TITLE, "Bullet Lab Remix");
	hge->System_SetState(HGE_WINDOWED, true);
	hge->System_SetState(HGE_SCREENWIDTH, 800);
	hge->System_SetState(HGE_SCREENHEIGHT, 600);
	hge->System_SetState(HGE_SCREENBPP, 32);
	if(fNoSound)hge->System_SetState(HGE_USESOUND,false);
#ifdef WIN32
	hge->System_SetState(HGE_ICON, MAKEINTRESOURCE(1));
#endif
	if((access(".blrrc",R_OK))==-1)
	{
		hge->System_Log("%s: Config file not found. Calling first startup.",MAIN_SRC_FN);
		firststartup();
	}
	if(fFristStartUp)firststartup();
	hge->System_Log("%s: Loading config file",MAIN_SRC_FN);
	freopen(".blrrc","r",stdin);
	char tch=getchar();
	if (tch!=';'){}
	tch=getchar();
	if (tch!='C'){}
	tch=getchar();
	if (tch!='B'){}
	tch=getchar();
	if (tch!='L'){}
	fpslvl=0;
	LOWFPS=true;//always LowFPS, deprecate 1000 FPS mode...
	hge->System_SetState(HGE_FPS,61);
	tch=getchar();//VSync
	if (tch==1)
	{
		hge->System_SetState(HGE_FPS,HGEFPS_VSYNC);
		fpslvl=2;
	}
	if(fFast)TenSeconds/=2,TwentySeconds/=2,ThirtySeconds/=2,AMinute/=2;
	tch=getchar();//FULLSCRREEN
	tfs=false;
	if (tch==1)
	hge->System_SetState(HGE_WINDOWED, false),tfs=true;
	if(fFullScreen==2)hge->System_SetState(HGE_WINDOWED, false),tfs=true;
	if(fFullScreen==1)hge->System_SetState(HGE_WINDOWED, true),tfs=false;
	tch=getchar();//resolution
	if(VidMode==-1)VidMode=tch;
	switch(VidMode)
	{
		case 0:break;
		case 1:
			hge->System_SetState(HGE_SCREENWIDTH, 640);
			hge->System_SetState(HGE_SCREENHEIGHT, 480);
			break;
		case 2:
			hge->System_SetState(HGE_SCREENWIDTH, 960);
			hge->System_SetState(HGE_SCREENHEIGHT, 720);
			break;
		case 3:
			hge->System_SetState(HGE_SCREENWIDTH, 1024);
			hge->System_SetState(HGE_SCREENHEIGHT, 768);
			break;
		case 4:
			hge->System_SetState(HGE_SCREENWIDTH, 1280);
			hge->System_SetState(HGE_SCREENHEIGHT, 960);
			break;
	}
	scale=VidMode?VidMode==1?0.8:VidMode==2?1.2:VidMode==3?1.28:VidMode==4?1.6:0:1;
#ifndef WIN32
	yos=VidMode?VidMode==1?120:VidMode==2?-120:VidMode==3?-168:VidMode==4?-360:0:0;
#endif
	tch=getchar();//Key binding
	if (tch==1)diffkey=true;
	bgmvol=getchar();sfxvol=getchar();
	plrspd=tch=getchar();
	playerfulspd=(tch)*0.08f;
	playerspeed=playerfulspd;
	plrslospd=tch=getchar();
	playerfulslospd=(tch)*0.02f;
	playerslospeed=playerfulslospd;
	tch=getchar();
	clrbns=tch;
	tch=getchar();
	clrmode=tch;
	fclose(stdin);
	if (AP_Update(plrspd,plrslospd,clrbns)>10000)Error("Invalid configuration!\nTry removing .blrrc and run the game again.");
	hge->System_Log("%s: Loading Score file",MAIN_SRC_FN);
	Score_Init();
#ifdef Debug
	playerspeed=playerfulspd=0.2;
	playerslospeed=playerfulslospd=0.05;
#endif
	Current_Position=0;
	LE_Active=false;
	if(hge->System_Initiate())
	{
		hge->System_Log("%s: Loading Resources...",MAIN_SRC_FN);
		quad.tex=hge->Texture_Load("./Resources/b_null.png");
		SprSheet=hge->Texture_Load("./Resources/ss.png");
		TLeaf=hge->Texture_Load("./Resources/e_leaf.png");
		TSflake=hge->Texture_Load("./Resources/e_sflake.png");
		TexTitle=hge->Texture_Load("./Resources/title.png");
		TexCredits=hge->Texture_Load("./Resources/credits.png");
		MenuTex=hge->Texture_Load("./Resources/menus.png");
		HelpTex=hge->Texture_Load("./Resources/help.png");
		sky.Init();
		snd=hge->Effect_Load("./Resources/tap.ogg");
		menuin=hge->Effect_Load("./Resources/menuin.ogg");
		menuout=hge->Effect_Load("./Resources/menuout.ogg");
		if(!quad.tex||!SprSheet||!TexTitle||!TexCredits)
		Error("Error Loading Resources!",true);
		titlespr=new hgeSprite(TexTitle,0,0,640,320);
		playerspr=new hgeSprite(SprSheet,0,24,24,24);
		playerspr->SetHotSpot(12,12);
		playerspr->SetColor(0xC0FFFFFF);
		ATarg.Init(-0.001,vector2d(400,300));
		BTarg.Init(-0.001,vector2d(400,300));
		BTarg.targspr->SetColor(0xFFC00000);
		quad.blend=BLEND_ALPHABLEND | BLEND_COLORMUL | BLEND_NOZWRITE;
		DBGColor=0xFFFFFFFF;
		for(int i=0;i<4;i++)
		{
			quad.v[i].z=0.5f;
			quad.v[i].col=DBGColor;
		}
		quad.v[0].x=0; quad.v[0].y=0;
		quad.v[1].x=800; quad.v[1].y=0;
		quad.v[2].x=800; quad.v[2].y=600;
		quad.v[3].x=0; quad.v[3].y=600;
		hge->System_Log("%s: Loading Fonts...",MAIN_SRC_FN);
#ifdef WIN32
		if(!rbPanelFont.Init("C:/Windows/Fonts/cour.ttf",18))return 1;
#else
		if(!rbPanelFont.Init("/usr/share/fonts/truetype/freefont/FreeMono.ttf",18))
		if(!rbPanelFont.Init("/usr/share/fonts/TTF/FreeMono.ttf",18))return 1;
#endif
		fnt=new hgeFont("./Resources/charmap.fnt");
		MenuFont=new hgeFont("./Resources/charmap.fnt");
		TipFont=new hgeFont("./Resources/charmap.fnt");
		MultFnt=new hgeFont("./Resources/charmap.fnt");
		vdig=new hgeFont("./Resources/vdig.fnt");
		bdig=new hgeFont("./Resources/bdig.fnt");
		fnt->SetScale(0.8);
		MenuFont->SetScale(0.8);
		TipFont->SetScale(0.8);
		MultFnt->SetScale(0.8);
		spr=new hgeSprite(SprSheet,216,0,24,24);
		Credits=new hgeSprite(TexCredits,0,0,600,200);
		CreditsRail=new hgeSprite(TexCredits,0,2400,600,200);
		Helpspr=new hgeSprite(HelpTex,0,0,800,400);
		NHelpspr=new hgeSprite(HelpTex,0,0,800,400);
		HlpL=new hgeSprite(MenuTex,256,320,26,15);
		HlpR=new hgeSprite(MenuTex,256,335,26,15);
		for (int ii=0;ii<COLOR_COUNT;++ii)
		{
			TColors i=(TColors)ii;
			TextureRect a=GetTextureRect(0,i);
			bulletspr[i]=new hgeSprite(SprSheet,a.x,a.y,a.w,a.h);
			bulletspr[i]->SetHotSpot(12,12);bulletspr[i]->SetColor(0x80FFFFFF);
		}
		for (int ii=0;ii<grey;++ii)
		{
			TColors i=(TColors)ii;
			TextureRect a=GetTextureRect(1,i);
			towerspr[i]=new hgeSprite(SprSheet,a.x,a.y,a.w,a.h);
			towerspr[i]->SetHotSpot(22,22);bulletspr[i]->SetColor(0x80FFFFFF);
		}
		mainMenu.Init_Once();if(!startLvl)mainMenu.Init(-200);
		startMenu.Init_Once();optionMenu.Init_Once();
		pauseMenu.Init_Once();returnToTitleMenu.Init_Once();
		deathMenu.Init_Once();completeMenu.Init_Once();
		playerPreferenceMenu.Init_Once();highScoreMenu.Init_Once();
		highScoreViewMenu.Init_Once();highScoreDetailsMenu.Init_Once();
		if(fNoSound)hge->System_Log("%s: Sound is disabled.",MAIN_SRC_FN);
		if(startLvl)
		{
			hge->System_Log("%s: Starting from Level%dPart%d",MAIN_SRC_FN,startLvl,startPrt);
			playerpos.x=400,playerpos.y=400,playerrot=0;
			frameleft=ThirtySeconds;infofade=0xFF;Dis8ref=t8special=false;
			level=startLvl,part=startPrt;frms=0,averfps=0.0;bsscale=1;DBGColor=0xFF000000;
			if(bullet){free(bullet);bullet=NULL;}
			towcnt=bulcnt=0;whrcnt=12;skyactive=false;PlayerSplit=false;
			score=0;Mult_Init();Music_Init("./Resources/Music/BLR2_TR07.ogg");
			lpst=0;lped=0;Music_Play();
			coll=semicoll=clrusg=0;playerLockX=playerLockY=false;
			Lock.Init(2);IfShowTip=true;lsc=0;
			clrrad=pi/2;clrrange=0;re.SetSeed(time(NULL));
			memset(tower,0,sizeof(tower));
			Complete=false;Current_Position=1;
			IfCallLevel=true;
			mode=3;
		}
		hge->System_Start();
		delete titlespr;delete fnt;
		delete playerspr;delete spr;
		for (int ii=0;ii<COLOR_COUNT;++ii)
		{
			TColors i=(TColors)ii;
			delete bulletspr[i];
			if(i<grey)delete towerspr[i];
		}
		hge->Effect_Free(snd);hge->Effect_Free(menuin);
		hge->Effect_Free(menuout);
		hge->Texture_Free(SprSheet);hge->Texture_Free(TLeaf);
		hge->Texture_Free(quad.tex);hge->Texture_Free(TSflake);
		hge->Texture_Free(TexTitle);hge->Texture_Free(TexCredits);
		if(bullet){free(bullet);bullet=NULL;}
	}
	hge->System_Shutdown();
	hge->Release();
#ifdef WIN32
	for(int i=0;i<arFilecount;++i)remove(archive[i]);
	_rmdir("./Resources/Music");
	_rmdir("./Resources");
#endif
	return 0;
}