#include "BrainBoss.h" #include "BrainCell.h" #include "Engine.h" BrainBoss::BrainBoss() { } //================================================================================================// /******************* ** BrainBoss spawn ** ********************/ //================================================================================================// void BrainBoss::Spawn(Vec2 pos) { IsActive = true; oPos = Pos = pos; frame = 0; fStartLife = fLife = 500; mBodySphere = Sphere(60,pos+Vec2(128,128)); mSphere = Sphere(20,pos+Vec2(68,128)); iTakeDamageTicks = 0; iAttackWave = 0; iAttackTicks = 0; bJustSpawned = true; fRateOfSpawn = gpEngine->mTimer.GetTime(); bIsDead = false; iDeathTicks = 0; } //================================================================================================// /******************* ** BrainBoss Clone ** ********************/ //================================================================================================// BrainBoss* BrainBoss::Clone()const { return new BrainBoss(*this); } //================================================================================================// /******************** ** BrainBoss update ** *********************/ //================================================================================================// void BrainBoss::Update() { iTakeDamageTicks--; oPos = Pos; if(bIsDead) { iDeathTicks++; if(iDeathTicks>150) { IsActive = false; gpEngine->StartCompleted(); } return; } iAttackTicks++; if(bJustSpawned) { if(iAttackTicks>50) { bJustSpawned = false; iAttackTicks = 0; } return; } if(iAttackWave==0) { float r = UTIL_Misc::TimeRamp(0,2*PI,0,150,(float)iAttackTicks); Pos.x-=sin(r)*11; Pos.y+=cos(r)*9.5f; if(iAttackTicks>=150) { iAttackTicks=0; iAttackWave=1; fRateOfFire = gpEngine->mTimer.GetTime(); } if(gpEngine->mTimer.GetTime()>fRateOfSpawn) { fRateOfSpawn = gpEngine->mTimer.GetTime()+0.25f; BrainCell* cell = new BrainCell; cell->Spawn(mSphere.p); gpEngine->GiveEntityToList((Entity*)cell); } } if(iAttackWave==1) { if(iAttackTicks>=100 && iAttackTicks<=130|| iAttackTicks<=30) if(gpEngine->mTimer.GetTime()>fRateOfFire) { fRateOfFire = gpEngine->mTimer.GetTime()+0.1f; Bullet b; b.pSpawn = Spawn_PowerBullet; b.pUpdate = Update_BasicBullet; b.pRender = Render_BossPowerBullet; b.pCollide = Collide_PowerBullet; Vec2 p(mSphere.p); Vec2 v = FireAtTarget(p,gpEngine->mPlayer.mSphere.p,7.5f); (*b.pSpawn)(b,p,v); Line l1(gpEngine->mPlayer.mSphere.p,p); Line l2(p,Vec2(p.x,p.y+Distance(gpEngine->mPlayer.mSphere.p,p))); if(p.x>gpEngine->mPlayer.mSphere.p.x) b.rot = -(RAD2DEG(l1.Angle(l2))-90); else b.rot = (RAD2DEG(l1.Angle(l2))+90); gpEngine->SpawnBullet(b,false); SND_LASER4; } if(iAttackTicks>=200) { iAttackTicks=0; iAttackWave=0; fRateOfSpawn = gpEngine->mTimer.GetTime(); } } mBodySphere.p = Pos+Vec2(128,128); } //================================================================================================// /****************** ** BrainBoss draw ** *******************/ //================================================================================================// void BrainBoss::Draw(const float interp) { if(bIsDead) return; if(iTakeDamageTicks>0) { glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_ADD); glColor4f(1,1,0,1); } else glColor4f(1,1,1,1); Vec2 p = UTIL_Misc::Interpolate(Pos,oPos,interp); UTIL_GL::SetBlend(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); UTIL_GL::BindTexture(GL_TEXTURE_2D,gpEngine->imgBossBrain); UTIL_GL::GL2D::DrawTextureQuad(Pos.x,Pos.y+256,Pos.x+256,Pos.y); glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); /* glDisable(GL_TEXTURE_2D); glColor4f(1,1,0,1); GeoDraw2D::DrawSphere(mSphere, 25);//*/ } //================================================================================================// /********************************* ** if it goes offscreen kill it ** **********************************/ //================================================================================================// void BrainBoss::NeedsToBeRemoved() { } //================================================================================================// /**************** ** Take damage ** *****************/ //================================================================================================// bool BrainBoss::CheckCollided(Sphere s, float damage) { if(!IsActive || bIsDead) return false; if(Collision::SphereSphereOverlap(s,mSphere)) { fLife -= damage; if(fLife<=0) { bIsDead = true; int RotAngle = rand()%360; gpEngine->SpawnExplosion(gpEngine->sprExplosionSmall,mSphere.p,290,0.75f, (float)(RotAngle),false); gpEngine->SpawnExplosion(gpEngine->sprExplosion2,mSphere.p,220,0.5f, (float)(RotAngle),true); SND_SMALLEXPLODE; gpEngine->mPlayer.iScore+=500; gpEngine->mFade.StartFade(gpEngine->mTimer.GetTime(),1.5f); gpEngine->mFade.SetSrcColor(1,0,0,1); gpEngine->mFade.SetDstColor(1,0,0,0); list::iterator i; for(i=gpEngine->mGameEnts.begin();i!=gpEngine->mGameEnts.end();i++) { if((*i)==this) continue; (*i)->CheckCollided((*i)->mSphere,100000);//kill all ents } gpEngine->bWimpMode = true; } iTakeDamageTicks = 3; return true; } if(Collision::SphereSphereOverlap(s,mBodySphere)) { return true; } return false; } void BrainBoss::LoadFromFile(CFileIO &fIO) { } void BrainBoss::WriteToFile(CFileIO &fIO) { } int BrainBoss::InWater() { return 0; }