// -*- C++ -*-
//Chrisoft Bullet Lab Remix HGE
//Global varibles and implementations
//"Copyleft" Chrisoft 2013
#include "hge.h"
#include "hgefont.h"
#include "hgegui.h"
HGE *hge=0;
HEFFECT snd;
HTEXTURE tex;
hgeQuad quad;
hgeGUI *gui;
hgeFont *fnt;
hgeSprite *spr,*titlespr;
//Here are some Varibles in Bullet Lab
int Current_Position;//Where are we now.
/*Scenes:
0: main menu
1: game scene
2: tip scene
3: start menu
4: about scene
5: death scene
6: complete scene
7: new highscore scene
8: highscore scene
9: highscore view scene
10: highscore details scene
11: Pause scene
12: BackToTitle Confirm
13: Options scene
14: Player Profile scene
*/
HTEXTURE SprSheet1,SprSheet2,TexTitle,TexCredits;
/*
Texture Mapping:
SprSheet1:
Player 47,46,24,24
Cursor 24,46,24,24
Blue 0,0,24,24
Green 23,0,24,24
Pnt 46,0,24,24
Purple 0,23,24,24
Red 23,23,24,24
White 46,23,24,24
Yellow 0,46,24,24
SprSheet2:
Blue 0,0,44,44
Green 44,0,44,44
Purple 88,0,44,44
Red 0,44,44,44
White 44,44,44,44
Yellow 88,44,44,44
*/
const double zero=1e-3;
struct vector2d
{
double x,y;
};
struct Bullet
{
hgeSprite *bulletspr;
vector2d bulletpos;
vector2d bulletdir;
double dist;
int bullettype;
int redexplo,redattrib,oriexplo,whicnt;
double bulletspeed;
bool exist;
double scale;
int whirem,whiskp,yelbrk;
int lifetime;
bool scollable;
int effbrk;
}bullet[10000];
//Something about bullets:
//bullettype:
//1: dir-based green bullet
//2: degree-based blue bullet (for clocks only)
//3: 12direction-based blue bullet
//4: yellow chaser bullet
//5: purple slow down bullet
//6: red exploding bullet
//7: white stalled bullet
//8: black shading bullet (dummy in version 1)
//254: Semi-collision effect
//255: Score point
struct Tower
{
hgeSprite *towerspr;
vector2d towerpos;
int towertype;
int towertimer,curtimer;
double bulletspeed;
int redexplo,whicnt,yelbrk;
int t3t;
bool exist;
bool effect;
}tower[100];
//t3t is for Tower3
//0:All 12 directions
//1:four default directions
//2:random left/right
//3:random up/down
struct Line
{
vector2d pos;
double radian;
DWORD color;
bool exist;
}line[12];
//Line is currently dummy.
int bulcnt=0,towcnt=0,linecnt=0;
vector2d playerpos;
double playerrot;
double playerspeed;
double playerslospeed;
double playerfulspd=0.2;
double playerfulslospd=0.05;
double clockrot,deltarot,deltadelta;
double whirot,dwhirot;
hgeSprite *playerspr;
int frameleft;
int level,part,clrtime,clrbns;
int coll,semicoll,mode,dsmc,restarts;
double clrrange;
bool IfCallLevel;
bool DisableAllTower=false;
bool DisablePlayer=false;
int frameskips=0,stepskips=0;
bool IfShowTip=false,FadeTip=false;
hgeFont *TipFont;
char lasttip[200];
int p2t1,p2t2,p2t3,p2t4;
int whicnt,shots,clrusg;
bool yelattrib;
bool LOWFPS=false,diffkey=false;
bool Complete=false;
bool Refliction=false;
double linerad=0;
double bsscale;
long long score,scminus;
int frms;double averfps;
int plrspd,plrslospd;
int TenSeconds=10000,TwentySeconds=20000,ThirtySeconds=30000,AMinute=60000;
int effskp=0;
hgeSprite *Credits,*CreditsRail;
double scroll;
bool tfs;
int fpslvl;
void Error(char EC[],bool hgecreated=false)
{
fprintf(stderr,EC);
hge->System_Log(EC);
if (hgecreated)
{
hge->System_Shutdown();
hge->Release();
}
exit(0);
}
inline double GetDist(const vector2d a,const vector2d b)
{
return sqrtf((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
}
void ShowTip(char tip[])
{
if (strcmp(tip,lasttip)!=0)
{
TipFont->SetColor(0x00FFFFFF);
}
memcpy(lasttip,tip,sizeof(lasttip));
DisableAllTower=true;
DisablePlayer=true;
if (hge->Input_GetKeyStateEx(HGEK_Z)==HGEKST_HIT)
{
//DisableAllTower=false;
//DisablePlayer=false;
//Current_Position=1;
FadeTip=true;
}
double width=TipFont->GetStringWidth(tip);
TipFont->printf(400-width/2,400,HGETEXT_LEFT,tip);
if (FadeTip)
{
if (LOWFPS)
{
if (TipFont->GetColor()>>24>=0x08)
TipFont->SetColor(TipFont->GetColor()-0x8000000);
else
{
DisableAllTower=false;
DisablePlayer=false;
Current_Position=1;
}
}
else
{
if (TipFont->GetColor()>>24>=0x01)
TipFont->SetColor(TipFont->GetColor()-0x1000000);
else
{
DisableAllTower=false;
DisablePlayer=false;
Current_Position=1;
}
}
return;
}
if (!LOWFPS)
{
if (TipFont->GetColor()>>24<=0xFE)
TipFont->SetColor(TipFont->GetColor()+0x01000000);
}
else
{
if (TipFont->GetColor()>>24<=0xF7)
TipFont->SetColor(TipFont->GetColor()+0x08000000);
}
}
void ClearAll()
{
DisableAllTower=true;
bool none=true;
for (int i=1;i<=towcnt;++i)
{
if (!tower[i].exist)continue;
if (LOWFPS)
{
if (tower[i].towerspr->GetColor()>>24>=0x08)
{
tower[i].towerspr->SetColor(tower[i].towerspr->GetColor()-0x8000000);
none=false;
}
}
else
{
if (tower[i].towerspr->GetColor()>>24>=0x01)
{
tower[i].towerspr->SetColor(tower[i].towerspr->GetColor()-0x1000000);
none=false;
}
}
}
if (none)
{
towcnt=0;
memset(tower,0,sizeof(tower));
}
none=true;
for (int i=1;i<=bulcnt;++i)
{
if (LOWFPS)
{
if (bullet[i].bulletspr->GetColor()>>24>=0x08)
{
bullet[i].bulletspr->SetColor(bullet[i].bulletspr->GetColor()-0x8000000);
none=false;
}
}
else
{
if (bullet[i].bulletspr->GetColor()>>24>=0x01)
{
bullet[i].bulletspr->SetColor(bullet[i].bulletspr->GetColor()-0x1000000);
none=false;
}
}
}
if (none)
{
bulcnt=0;
memset(bullet,0,sizeof(bullet));
}
none=true;
for (int i=1;i<=bulcnt;++i)if (bullet[i].bulletspr->GetColor()>>24>=0x3F){none=false;break;}
if (none)
bulcnt=0,memset(bullet,0,sizeof(bullet));
}
void SaySomethingAndBye(char *text)
{
ClearAll();
DisableAllTower=false;
if (IfShowTip)
{
IfShowTip=false;
FadeTip=false;
Current_Position=2;
ShowTip(text);
return;
}
Current_Position=0;
towcnt=bulcnt=0;
memset(tower,0,sizeof(tower));
memset(bullet,0,sizeof(bullet));
gui->Enter();
}