예제 #1
0
//Execute reaction
void Enemy::execute(const Reaction& reaction)
{
	move(reaction.move);

	if (reaction.fire)
		fireAt(reaction.look, accuracy_[brainStem_.weapon_training]); //*// Weapon training

	else orient(reaction.look);
}
예제 #2
0
void DonutEnemy::update()
{
	Enemy::update();
	updateTurret();
	_turret->update();
	if (!isDead() && (currentLevel->rythm->tap(0)))
    {
		Foliage::Point turret = getPosition() + turret_position[_cran];
		fireAt(turret, currentLevel->playerShip->getCenter(), Foliage::Fixed(Sint16(2)), F_0, Bullet_Green_0);
    }
}
예제 #3
0
//Lennard-Jones based AI
void Enemy::ljpTest()
{
	b2Vec2 sum(0, 0);
	b2Vec2 flock(0, 0);
	b2Vec2 chase(0, 0);
	b2Vec2 fire(0, 0);

	//Chase and fire at player?
	Shape* player = getPlayer_();
	if (player)
	{
		b2Vec2 myPos = getPosition();
		b2Vec2 pPos = player->getPosition();
		b2Vec2 between = (pPos - myPos);
		float dist = between.Length();

		if (!chasing_ && dist < chaseRange_[3])
		{
			chasing_ = true;
		}

		if (chasing_ && dist < chaseRangeMAX_[4])
		{
			chase = LJP(pPos, 100.f, 200.f, 1.0, 1.8);
		}

		else chasing_ = false;

		//Fire if in visible range
		if (dist < visRange_[3])
		{
			fire = LJP(pPos, 100, 0, 2.0, 0);
		}
	}

	if (chasing_) orient(chase);

	//Swarm to shapes
	int count = 0;
	for (Enemy* v : swarm_)
	{
		if (v != this)
		{
			b2Vec2 myPos = getPosition();
			b2Vec2 theirPos = v->getPosition();
			b2Vec2 between = theirPos - myPos;
			float minDist = v->getSize() + size_;
			float dist = between.Length();

			if (between.Length() < flockRange_)
			{
				b2Vec2 steer(0, 0);
				if (!chasing_) steer = LJP(theirPos, 75.f, 300.f, 1.0f, 1.8f);

				else if (v->getVertices() == vertices_) 
					 steer = LJP(theirPos, 0, 100.f, 0, 1.8f);

				else steer = LJP(theirPos, 0, 100.f, 0, 1.8f);

				if (steer.x != 0 && steer.y != 0)
				{
					sum += steer;
					count++;
				}
			}
		}
	}


	//get average
	if (count > 0)
	{
		sum.x /= static_cast<float>(count);
		sum.y /= static_cast<float>(count);
	}

	else sum = b2Vec2_zero;

	//If we didn't want to fire
	float seePlayer = fire.Length();
	if (seePlayer == 0)
	{
		angry_ -= angryMAX_ / triggerSatisfaction_[4];
	}

	else
	{
		orient(fire);
		chill_ = 0;
		angry_ += seePlayer;
	}

	//If we're mad enough
	float ammo = (float)getWeaponBar() / (float)getWeaponBarMAX();
	if (angry_ > angryMAX_ && seePlayer != 0)
	{
		if (fireAt(fire, 0.2f))
		{
			angry_ -= triggerSatisfaction_[4];
		}
		else release();

		
		if (ammo< 0.1f)
			reup();
	}
	angry_ = fmax(angry_, 0);

	//Chill out when idle
	if (angry_ == 0 && seePlayer == 0)
	{
		chill_ -= 1;

		if (chill_ <= chillMIN_)
		{
			if (ammo < 1.f)
				reup();

			spin(-0.05f);
		}
	}
	chill_ = fmax(chill_, chillMIN_);

	move(chase + sum);
}