#include "Orb.h" #include "Engine.h" //================================================================================================// /************** ** Spawn Orb ** ***************/ //================================================================================================// void Orb::Spawn(Vec2 pos) { oPos = Pos = pos; frame = 0; bLockState = true; for(int n=0;n<6;n++) { mChain[n]=mOChain[n]=Pos; } rot = 270; fPulsate = 0; fGlowRotation = 0; iWeaponType = 0; mWaterticks = 0; } //================================================================================================// /**************************************************************** ** Give target to track, should pass this function after spawn ** *****************************************************************/ //================================================================================================// void Orb::GiveTarget(Vec2* target) { pTarget = target; mLockOffset.x = 48; mLockOffset.y = 0; mChain[0]=Pos+mLockOffset+Vec2(0,32); mChain[1]=Pos+mLockOffset+Vec2(1,32+4); mChain[2]=Pos+mLockOffset+Vec2(11,32+9); mChain[3]=Pos+mLockOffset+Vec2(22,32+11); mChain[4]=Pos+mLockOffset+Vec2(32,32+10); mChain[5]=Pos+mLockOffset+Vec2(41,32); for(int n=0;n<6;n++) { mOChain[n] = mChain[n] + Vec2(0,0.5f); mChainOffset[n] = mChain[n]-*pTarget; } oPos = Pos = mChain[5]-Vec2(32,32); mLockOffset = Pos - *pTarget; } //================================================================================================// /*************** ** Orb update ** ****************/ //================================================================================================// void Orb::Update() { InWater(); if(bLockState)//locked mode { oPos = Pos; Pos = *pTarget + mLockOffset; for(int n=0;n<6;n++) { mOChain[n] = mChain[n]; mChain[n] = *pTarget + mChainOffset[n]; } } else//chain mode { Vec2 r; mOChain[0]=mChain[0]; Vec2 p = *pTarget; p += Vec2(32+SCROLL_SPEED,32); float d; d=mChain[0].Distance(p); if(d>10) { d-=10; r = Normalize(mChain[0]-p); mChain[0] -= r*(d*0.5f); } for(int n=1;n<6;n++) { mOChain[n]=mChain[n]; mChain[n].x+=SCROLL_SPEED; d=mChain[n].Distance(mChain[n-1]); if(d>10) { d-=10; r = Normalize(mChain[n]-mChain[n-1]); mChain[n] -= r*(d*0.5f); } } Vec2 ray(Normalize(mChain[4]-mChain[5])); oPos = mOChain[5] - Vec2(32,32) - ray*16; Pos = mChain[5] - Vec2(32,32) - ray*16; } frame+=0.5f; if(frame>15)frame-=15; mSphere = Sphere(15,Pos+Vec2(32,32)); fPulsate += 0.15f; UTIL_Misc::Clamp(fPulsate,0,360); fGlowRotation += 1.5f; UTIL_Misc::Wrap(fGlowRotation,360); } //================================================================================================// /************************ ** Virtual constructor ** *************************/ //================================================================================================// Orb* Orb::Clone()const { return new Orb(*this); } //================================================================================================// /*********** ** Render ** ************/ //================================================================================================// void Orb::Draw(const float interp) { //orb float x=UTIL_Misc::Interpolate(Pos.x,oPos.x,interp); float y=UTIL_Misc::Interpolate(Pos.y,oPos.y,interp); float s = sin(fPulsate); glColor4f(1,1,1,1); if(gpEngine->mPlayer.bSpawnOrb) glColor4f(0,1,1,(float)gpEngine->mPlayer.iSpawnOrbTicks/25.0f); UTIL_GL::SetBlend(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA); RenderRotatedSprite(gpEngine->sprOrb1,(int)frame+(16*iWeaponType),x+32,y+32,20,20,rot); /* glDisable(GL_TEXTURE_2D); glColor4f(1,1,0,1); GeoDraw2D::DrawSphere(mSphere, 15);//*/ } //================================================================================================// /********************************* ** if it goes offscreen kill it ** **********************************/ //================================================================================================// void Orb::NeedsToBeRemoved() { } //================================================================================================// /**************** ** Take damage ** *****************/ //================================================================================================// bool Orb::CheckCollided(Sphere s, float damage) { if(!IsActive) return false; // fLife -= damage; return true; } void Orb::LoadFromFile(CFileIO &fIO) { } void Orb::WriteToFile(CFileIO &fIO) { } int Orb::InWater() { mWaterticks++; if(mWaterticks<5) return 0; mWaterticks=0; int x = (int)(mSphere.p.x/32); int y = (int)(mSphere.p.y/32); 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; }