//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); }
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); } }
//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); }