void UnitAiMoonGuard::chooseTarget(const WorldInterface& world) { const Vector3& ship_position = getShip().getPosition(); const Vector3& ship_forward = getShip().getForward(); unsigned int ship_fleet = getShipId().m_fleet; vector<PhysicsObjectId> v_ids = world.getShipIds(ship_position, SCAN_RADIUS); m_id_target = PhysicsObjectId::ID_NOTHING; double best_angle = VERY_LARGE_ANGLE; for (unsigned int i = 0; i < v_ids.size(); i++) { PhysicsObjectId other_id = v_ids[i]; if (other_id.m_fleet != ship_fleet) { // we found an enemy ship Vector3 other_position = world.getPosition(other_id); Vector3 direction_to_other = other_position - ship_position; double angle_to_other = direction_to_other.getAngleSafe(ship_forward); if (angle_to_other < best_angle) { m_id_target = other_id; best_angle = angle_to_other; } } // else ship is part of our fleet, so ignore it } }
Vector3 UnitAiMoonGuard::avoidShips(const WorldInterface& world, const Vector3& originalVelocity) { Vector3 agentPosition = getShip().getPosition(); vector<PhysicsObjectId> shipIDs = world.getShipIds(agentPosition, SAFE_DISTANCE); unsigned int amount = shipIDs.size(); if (amount == 1) { return originalVelocity; } PhysicsObjectId closestID = PhysicsObjectId::ID_NOTHING; double closestDistance = -1; PhysicsObjectId agentID = getShip().getId(); for (unsigned int i = 0; i < amount; i++) { PhysicsObjectId shipID = shipIDs[i]; if (agentID != shipID) { Vector3 shipPosition = world.getPosition(shipIDs[i]); double distance = agentPosition.getDistanceSquared(shipPosition); if (closestDistance < 0) { closestDistance = distance; closestID = shipIDs[i]; } else if (distance <= closestDistance) { closestDistance = distance; closestID = shipIDs[i]; } } } if (closestDistance == -1) { return originalVelocity; } return m_steering_behaviour.evade(world, closestID); }
void UnitAiMoonGuard::scan(const WorldInterface& world) { scanCount++; if (scanCount == SCAN_COUNT_MAX) { //printf("Scanning...\n"); Vector3 ship_pos = getShip().getPosition(); nearbyShips = world.getShipIds(ship_pos, SCAN_DISTANCE_SHIP); getClosestShip(world); getClosestEnemyShip(world); Vector3 position = ship_pos + (getShip().getForward() * 500.f); nearbyRingParticles = world.getRingParticles(position, SCAN_DISTANCE_RING_PARTICLE); nearestPlanetoid = world.getNearestPlanetoidId(ship_pos); scanCount = 0; } }