예제 #1
0
bool AISystem::MoveUnitAwayFromEnemyUntilOutsideMinRange(Entity* selectedUnit, Entity* enemy)
{
    World* world = engine->GetContext()->GetWorld();
    UnitComponent* auc = dynamic_cast<UnitComponent*>(selectedUnit->GetComponent(Component::UNIT));
    PositionComponent* apc = dynamic_cast<PositionComponent*>(selectedUnit->GetComponent(Component::POSITION));
    PositionComponent* dpc = dynamic_cast<PositionComponent*>(enemy->GetComponent(Component::POSITION));

    set<Entity*> moveOptions;
    unsigned int distanceToEnemy = world->CalcRange(apc, dpc);
    unsigned int minMoveDistance = auc->range_min - distanceToEnemy + 1;

    // make list of tiles around the enemy that the unit could move to
    for (unsigned int i = 0; i <= auc->range_max - distanceToEnemy; i++)
    {
        moveOptions = FindEntitiesAtDistanceAroundUnit(enemy, minMoveDistance + i);

        if (moveOptions.size() > 0)
        {
            break;
        }
    }

    // if walkable tiles were found
    if (moveOptions.size() > 0)
    {
        // find the one that's closest by
        Entity* moveOption = FilterNearestEntity(selectedUnit, moveOptions);

        if (moveOption != nullptr)
        {
            // and move the unit towards it
            return MoveUnitTowardsEntity(selectedUnit, moveOption);
        }
        else
        {
            return false;
        }
    }
    else
    {
        return false;
    }
}
예제 #2
0
set<Entity*> AISystem::FindEnemiesInsideRange(Entity* selectedUnit, unsigned int range)
{
    World* world = engine->GetContext()->GetWorld();
    PositionComponent* apc = dynamic_cast<PositionComponent*>(selectedUnit->GetComponent(Component::POSITION));
    PositionComponent* dpc;
    set<Entity*> enemies = FindUnitsByPlayer(Entity::HUMAN);
    set<Entity*> enemiesInsideRange;

    for (Entity* enemy : enemies)
    {
        dpc = dynamic_cast<PositionComponent*>(enemy->GetComponent(Component::POSITION));

        if (world->CalcRange(apc, dpc) <= range)
        {
            enemiesInsideRange.insert(enemy);
        }
    }

    return enemiesInsideRange;
}