#include "PowerDroid.h" #include "Engine.h" #include "Debris.h" PowerDroid::PowerDroid() { bStartDirection = false;//left iPowerUp = 0; } //================================================================================================// /******************* ** PowerDroid spawn ** ********************/ //================================================================================================// void PowerDroid::Spawn(Vec2 pos) { IsActive = true; oPos = Pos = pos; frame = 0; fStartLife = fLife = 1; mSphere = Sphere(16,pos+Vec2(28,24)); iTakeDamageTicks = 0; bIsTurning = false; bIsFlying = true; Vel = Vec2(0,0); bDirection = bStartDirection; bDirection? Vel.x=2.5f:Vel.x=-2.5f; if(gpEngine->bRecording && gpEngine->pRecordEnt == this) return; SelfControl(); mWaterticks = 0; } //================================================================================================// /******************* ** PowerDroid Clone ** ********************/ //================================================================================================// PowerDroid* PowerDroid::Clone()const { return new PowerDroid(*this); } //================================================================================================// /******************** ** PowerDroid update ** *********************/ //================================================================================================// void PowerDroid::Update() { iTakeDamageTicks--; oPos = Pos; if(!gpEngine->bRecording || gpEngine->bRecording && gpEngine->pRecordEnt != this) PlayBack(); InWater(); if(bIsTurning) { frame+=0.25f; if(frame>15) { bDirection = !bDirection; bIsTurning = false; frame = 0; } } else if(bIsFlying) { if(KEY_ATTACK2.state == PRESSED) { Vel.y-=0.15f; if(bDirection) Vel.x=2.5f; else Vel.x=-2.5f; } Pos.x+=Vel.x; frame<15? frame+=0.5f:frame=0; } else//standing or walking { if(bDirection)//right { if(KEY_RIGHT.state == PRESSED) { frame>15? frame-=15: frame+=0.25f; Pos.x+=1.5f; } if(KEY_LEFT.state == JUST_PRESSED) { bIsTurning = true; frame = 0; } } else//left { if(KEY_LEFT.state == PRESSED) { frame>15? frame-=15: frame+=0.25f; Pos.x-=1.5f; } if(KEY_RIGHT.state == JUST_PRESSED) { bIsTurning = true; frame = 0; } } if(KEY_ATTACK2.state == JUST_PRESSED) { frame = 0; bIsFlying = true; Pos.y-=3; } } //make fall Vel.y+=0.075f; Pos.y+=Vel.y; if((Pos.y+64)>0 && ((Pos.y+64)/32)<15 && Pos.x>0 && (Pos.x/32)<400) { int ID; if(bIsFlying)//if its flying make it stop if hits a wall { bool bHit=false; bDirection? ID = gpEngine->mTilesLayer1[(int)((Pos.x+32)/32)+1][(int)(Pos.y+32)/32].ID: ID = gpEngine->mTilesLayer1[(int)(Pos.x)/32][(int)(Pos.y+32)/32].ID; if(ID>=0 && ID<512) { Vel.x=0; bHit= true; } ID = gpEngine->mTilesLayer1[(int)(Pos.x+32)/32][(int)(Pos.y)/32].ID; if(ID>=0 && ID<512) { Vel.y=+1; bHit = true; } // if(bHit) // return; } ID = gpEngine->mTilesLayer1[(int)(Pos.x+32)/32][(int)(Pos.y+64)/32].ID; if(ID>=0 && ID<512) { Vel.y=0; Vel.x=0; Pos.y = oPos.y; if(bIsFlying) { bIsFlying = false; frame =0; } } } } //================================================================================================// /****************** ** PowerDroid draw ** *******************/ //================================================================================================// void PowerDroid::Draw(const float interp) { UTIL_GL::SetBlend(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA); 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); p.y+=4; if(bIsFlying) { bDirection? RenderSprite(gpEngine->sprPowerDroid,(int)frame,p.x,p.y,64,64): RenderSprite(gpEngine->sprPowerDroid,(int)frame,p.x+64,p.y,-64,64); } else if(bIsTurning) { bDirection? RenderSprite(gpEngine->sprPowerDroid,(int)frame+32,p.x,p.y,64,64): RenderSprite(gpEngine->sprPowerDroid,(int)frame+32,p.x+64,p.y,-64,64); } else { bDirection? RenderSprite(gpEngine->sprPowerDroid,(int)frame+16,p.x,p.y,64,64): RenderSprite(gpEngine->sprPowerDroid,(int)frame+16,p.x+64,p.y,-64,64); } glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); glDisable(GL_BLEND); /* glDisable(GL_TEXTURE_2D); glColor4f(1,1,0,1); GeoDraw2D::DrawSphere(mSphere, 15);//*/ /* Sphere s2(mSphere.r,Vec2(mSphere.p.x,mSphere.p.y+22)); GeoDraw2D::DrawSphere(s2, 15);//*/ } //================================================================================================// /********************************* ** if it goes offscreen kill it ** **********************************/ //================================================================================================// void PowerDroid::NeedsToBeRemoved() { if(Pos.x+64Scroll) IsActive = false; if(Pos.y>600) IsActive = false; } //================================================================================================// /**************** ** Take damage ** *****************/ //================================================================================================// bool PowerDroid::CheckCollided(Sphere s, float damage) { if(!IsActive) return false; Sphere s2(mSphere.r,Vec2(mSphere.p.x,mSphere.p.y+22)); if(!Collision::SphereSphereOverlap(s,mSphere) && !Collision::SphereSphereOverlap(s,s2)) return false; fLife -= damage; if(fLife<=0) { IsActive = false; gpEngine->SpawnExplosion(gpEngine->sprExplosionSmall,Pos+Vec2(32,32),90,0.75f, (float)(rand()%360),false); PowerUp* p = new PowerUp; p->iType = iPowerUp; p->Spawn(Pos); gpEngine->GiveEntityToList(p); SND_MEDEXPLODE; gpEngine->mPlayer.iScore+=30; float debRot = 0; float incRot = 360.0f/10.0f; Vec2 debUp,debRight; for(int n=0;n<10;n++) { Debris* deb = new Debris; UTIL_Misc::MakeVectors(debRot,debUp,debRight); deb->Spawn(mSphere.p); deb->Vel = debRight * ((float)(rand()%4)+1); gpEngine->GiveEntityToList(deb); debRot+=incRot; } } iTakeDamageTicks = 3; return true; } void PowerDroid::LoadFromFile(CFileIO &fIO) { fIO.ReadBinary(&bStartDirection,1); fIO.ReadBinary(&iPowerUp,1); ReadBufferFromFile(fIO); } void PowerDroid::WriteToFile(CFileIO &fIO) { fIO.WriteBinary(&bStartDirection,1); fIO.WriteBinary(&iPowerUp,1); WriteBufferToFile(fIO); } int PowerDroid::InWater() { mWaterticks++; if(mWaterticks<5) return 0; mWaterticks=0; int x = (int)(mSphere.p.x/32); int y = (int)(mSphere.p.y/32); if(x<0 || x>399 || y<0 || y>15) return 0; if(gpEngine->mTilesLayer1[x][y].ID==1018)//water surface gpEngine->SpawnSpriteEffect(1,Vec2(mSphere.p.x,(float)(y+1)*32),Vec2(64,32),gpEngine->sprWaterSplash,0.3f,true,NULL,true); return 0; }