|
|
|
@ -44,8 +44,8 @@ INCLUDE_game |
|
|
|
|
INCLUDE_MONSTER_LIST |
|
|
|
|
INCLUDE_GFX |
|
|
|
|
|
|
|
|
|
FrogTongue::FrogTongue(vf2d pos,vf2d targetPos,float lifetime,int damage,bool upperLevel,bool friendly,Pixel col) |
|
|
|
|
:Bullet(pos,{},0,damage,upperLevel,friendly,col),targetPos(targetPos),tongueSpd(tongueSpd),tongueLength(0.f){ |
|
|
|
|
FrogTongue::FrogTongue(vf2d pos,vf2d targetPos,float lifetime,int damage,bool upperLevel,float knockbackStrength,bool friendly,Pixel col) |
|
|
|
|
:Bullet(pos,{},0,damage,upperLevel,friendly,col),targetPos(targetPos),tongueSpd(tongueSpd),tongueLength(0.f),knockbackStrength(knockbackStrength){ |
|
|
|
|
this->lifetime=lifetime; |
|
|
|
|
duration=lifetime; |
|
|
|
|
} |
|
|
|
@ -53,9 +53,9 @@ void FrogTongue::Update(float fElapsedTime){ |
|
|
|
|
geom2d::line<float>lineToTarget(pos,targetPos); |
|
|
|
|
vf2d drawVec=lineToTarget.vector().norm()*3; |
|
|
|
|
|
|
|
|
|
tongueLength=util::lerp(0,lineToTarget.length(),sin((lifetime*PI)/duration)); |
|
|
|
|
tongueLength=util::lerp(0,lineToTarget.length(),pow(sin((lifetime*PI)/duration),20.f)); |
|
|
|
|
|
|
|
|
|
vf2d tongueEndPos=geom2d::line<float>(pos+drawVec,targetPos).upoint(sin((lifetime*PI)/duration)); |
|
|
|
|
vf2d tongueEndPos=geom2d::line<float>(pos+drawVec,targetPos).upoint(pow(sin((lifetime*PI)/duration),20.f)); |
|
|
|
|
geom2d::line<float>tongueLine(pos+drawVec,tongueEndPos); |
|
|
|
|
|
|
|
|
|
if(!friendly&&geom2d::overlaps(game->GetPlayer()->Hitbox(),tongueLine)){ |
|
|
|
@ -73,19 +73,25 @@ void FrogTongue::Update(float fElapsedTime){ |
|
|
|
|
bool FrogTongue::PlayerHit(Player*player){ |
|
|
|
|
if(!deactivated){ |
|
|
|
|
player->Hurt(damage,OnUpperLevel(),0); |
|
|
|
|
geom2d::line<float>lineToTarget(pos,targetPos); |
|
|
|
|
vf2d drawVec=lineToTarget.vector().norm()*3; |
|
|
|
|
player->Knockback(geom2d::line<float>(pos+drawVec,targetPos).vector()*knockbackStrength); |
|
|
|
|
deactivated=true; |
|
|
|
|
} |
|
|
|
|
return false; |
|
|
|
|
} |
|
|
|
|
bool FrogTongue::MonsterHit(Monster&monster){ |
|
|
|
|
monster.Hurt(damage,OnUpperLevel(),0); |
|
|
|
|
geom2d::line<float>lineToTarget(pos,targetPos); |
|
|
|
|
vf2d drawVec=lineToTarget.vector().norm()*3; |
|
|
|
|
monster.Knockback(geom2d::line<float>(pos+drawVec,targetPos).vector()*knockbackStrength); |
|
|
|
|
return false; |
|
|
|
|
} |
|
|
|
|
void FrogTongue::Draw(){ |
|
|
|
|
geom2d::line<float>lineToTarget(pos,targetPos); |
|
|
|
|
vf2d drawVec=lineToTarget.vector().norm()*3; |
|
|
|
|
|
|
|
|
|
vf2d tongueEndPos=geom2d::line<float>(pos+drawVec,targetPos).upoint(sin((lifetime*PI)/duration)); |
|
|
|
|
vf2d tongueEndPos=geom2d::line<float>(pos+drawVec,targetPos).upoint(pow(sin((lifetime*PI)/duration),20.f)); |
|
|
|
|
|
|
|
|
|
game->view.DrawRotatedDecal(pos+drawVec,GFX["tongue.png"].Decal(),drawVec.polar().y,{0.f,1.f},{tongueLength,1.0f},col); |
|
|
|
|
game->view.DrawRotatedDecal(tongueEndPos,GFX["tongue_end.png"].Decal(),drawVec.polar().y,{2.f,2.f},{1.f,1.f},col); |
|
|
|
|