Beispiel #1
0
void nofScout_Free::GoToNewNode()
{
    list< Point<MapCoord> > available_points;

    for(MapCoord tx = gwg->GetXA(flag->GetX(), flag->GetY(), 0), r = 1; r < SCOUT_RANGE; tx = gwg->GetXA(tx, flag->GetY(), 0), ++r)
    {
        MapCoord tx2 = tx, ty2 = flag->GetY();
        for(unsigned i = 2; i < 8; ++i)
        {
            for(MapCoord r2 = 0; r2 < r; gwg->GetPointA(tx2, ty2, i % 6), ++r2)
            {
                // Liegt Punkt im Nebel und für Figuren begehbar?
                if(gwg->GetNode(tx2, ty2).fow[player].visibility != VIS_VISIBLE
                        && gwg->IsNodeForFigures(tx2, ty2))
                {
                    Point<MapCoord> p (tx2, ty2);
                    available_points.push_back(p);
                }
            }
        }
    }

    // Ein Objekt zufällig heraussuchen
    bool found_point = false;
    while(available_points.size() && !found_point)
    {
        list< Point<MapCoord> >::iterator p = available_points[RANDOM.Rand(__FILE__, __LINE__, obj_id, available_points.size())];

        // Existiert ein Weg zu diesem Punkt und ist dieser Punkt auch noch von der Flagge noch in
        // einigermaßen vernünftiger Entfernung zu erreichen, um das Drumherumlaufen um Berge usw. zu
        // verhindern
        if(gwg->FindHumanPath(x, y, p->x, p->y, SCOUT_RANGE * 2) != 0xFF && gwg->FindHumanPath(flag->GetX(), flag->GetY(), p->x, p->y, SCOUT_RANGE + SCOUT_RANGE / 4) != 0xFF)
        {
            // Als neues Ziel nehmen
            next_x = p->x;
            next_y = p->y;

            Scout();

            found_point = true;

            break;
        }

        available_points.erase(p);


    }

    // Gibt es überhaupt einen Punkt, wo ich hingehen kann?
    if(!found_point)
    {
        // Wieder zur Flagge zurückgehen
        state = STATE_GOTOFLAG;
        GoToFlag();
    }
}
Beispiel #2
0
void nofScout_Free::GoToNewNode()
{
    std::list< MapPoint > available_points;

    for(MapCoord tx = gwg->GetXA(flag->GetPos(), 0), r = 1; r < SCOUT_RANGE; tx = gwg->GetXA(tx, flag->GetY(), 0), ++r)
    {
        MapPoint t2(tx, flag->GetY());
        for(unsigned i = 2; i < 8; ++i)
        {
            for(MapCoord r2 = 0; r2 < r; t2 = gwg->GetNeighbour(t2,  i % 6), ++r2)
            {
                // Liegt Punkt im Nebel und für Figuren begehbar?
                if(gwg->GetNode(t2).fow[player].visibility != VIS_VISIBLE && gwg->IsNodeForFigures(t2))
                {
                    available_points.push_back(t2);
                }
            }
        }
    }

    // Ein Objekt zufällig heraussuchen
    bool found_point = false;
    size_t numPointsLeft = available_points.size();
    while(numPointsLeft && !found_point)
    {
        std::list< MapPoint >::iterator p = available_points.begin();
        std::advance(p, RANDOM.Rand(__FILE__, __LINE__, obj_id, numPointsLeft));

        // Existiert ein Weg zu diesem Punkt und ist dieser Punkt auch noch von der Flagge noch in
        // einigermaßen vernünftiger Entfernung zu erreichen, um das Drumherumlaufen um Berge usw. zu
        // verhindern
        if(gwg->FindHumanPath(pos, *p, SCOUT_RANGE * 2) != 0xFF && gwg->FindHumanPath(flag->GetPos(), *p, SCOUT_RANGE + SCOUT_RANGE / 4) != 0xFF)
        {
            // Als neues Ziel nehmen
            nextPos = *p;

            Scout();

            found_point = true;
            break;
        }

        available_points.erase(p);
        numPointsLeft--;
    }

    // Gibt es überhaupt einen Punkt, wo ich hingehen kann?
    if(!found_point)
    {
        // Wieder zur Flagge zurückgehen
        state = STATE_GOTOFLAG;
        GoToFlag();
    }
}
Beispiel #3
0
void nofScout_Free::Walked()
{
    switch(state)
    {
        default: break;
        case STATE_GOTOFLAG:
        {
            GoToFlag();
        } break;
        case STATE_SCOUT_SCOUTING:
        {
            Scout();
        } break;
    }
}