void CIdleEnemy::Update(float fElapsedTime) { CBaseEnemy::Update(fElapsedTime); if(GetCurrentHP() <= 0) ChangeAIState(iDead); else { tVector2D Result; Result.fX = GetTargetPosition().fX - GetPosX(); Result.fY = GetTargetPosition().fY - GetPosY(); int Distance = int(sqrt(Result.fX*Result.fX + Result.fY*Result.fY)); if(Distance <= GetSightRange()) { ChangeAIState(iActive); } else ChangeAIState(Idle); } if( ReturnAIState() == iDead ) { } }
void Unit::Order_NukeGround() { unk_move_waypoint = order_target_pos; int sight_range = GetSightRange(false) * 32; int dist = Distance(exact_position, Point32(order_target_pos) * 256 + Point32(128, 128)) / 256; if (ai && dist <= sight_range * 3) Ai_Cloak(); if (dist > sight_range) { if (move_target_update_timer == 0) ChangeMovementTarget(order_target_pos); // What, it is not moving? } else { bw::StopMoving(this); if (position != unk_move_waypoint) { auto pos = sprite->position; int diff = facing_direction - bw::GetFacingDirection(pos.x, pos.y, unk_move_waypoint.x, unk_move_waypoint.y); if (diff < -1 || diff > 1) return; } Unit *silo = nullptr; for (Unit *unit : bw::first_player_unit[player]) { if (unit->Type() == UnitId::NuclearSilo && unit->silo.has_nuke) { silo = unit; break; } } if (!silo) { OrderDone(); return; } Unit *nuke = silo->silo.nuke; silo->silo.nuke = nullptr; silo->silo.has_nuke = 0; bw::PlaySound(Sound::NukeLaser, this, 1, 0); nuke->IssueOrderTargetingGround(OrderId::NukeLaunch, order_target_pos); related = nuke; nuke->related = this; nuke->sprite->SetDirection32(0); bw::ShowUnit(nuke); IssueOrderTargetingGround(OrderId::NukeTrack, sprite->position); if (!IsDisabled() || Type().IsBuilding()) // Huh? buttons = 0xed; RefreshUi(); } }
void CPatrolEnemy::Update(float fElapsedTime) { CBaseEnemy::Update(fElapsedTime); if(GetCurrentHP() <= 0) ChangeAIState(pDead); else { tVector2D Result; Result.fX = GetTargetPosition().fX - GetPosX(); Result.fY = GetTargetPosition().fY - GetPosY(); float Distance = sqrt(Result.fX*Result.fX + Result.fY*Result.fY); if(Distance <= GetSightRange()) { ChangeAIState(pActive); this->ReturnAIState(); } else ChangeAIState(Patrol); switch(ReturnAIState()) { case Patrol: { SetPosX((GetPosX() + GetBaseVelX() * fElapsedTime)); if(GetPosX() <= 0) { SetPosX(0); SetCurrentDist(0); SetSpeed(-1*GetSpeed()); } SetCurrentDist(GetCurrentDist() + (fabs(GetBaseVelX()) * fElapsedTime)); if(GetCurrentDist() >= GetMaxDist()) { SetCurrentDist(0); SetSpeed(-1*GetSpeed()); } SetBaseVelX(GetBaseVelX() + GetSpeed() * fElapsedTime); if(GetBaseVelX() > 50) SetBaseVelX(50); else if(GetBaseVelX() < -50) SetBaseVelX(-50); } break; case pActive: { SetSpeed(-1*GetSpeed()); SetBaseVelX(0); } break; case pDead: { } break; }; } }