Exemple #1
0
/// Erkundet (quasi ein Umherirren)
void nofScout_Free::Scout()
{
    // Erkundet er noch, ist aber schon seine maximale Wegstrecke abgelaufen?
    if(--rest_way == 0)
    {
        // Wieder zur Flagge zurückgehen
        state = STATE_GOTOFLAG;
        GoToFlag();
        return;
    }

    // Bin ich schon an dem Punkt angekommen?
    if(pos == nextPos)
    {
        // Nächsten Punkt suchen
        GoToNewNode();
    }
    else
    {
        // Weg suchen
        dir = gwg->FindHumanPath(pos, nextPos, 30);

        // Wenns keinen gibt, neuen suchen, ansonsten hinlaufen
        if(dir == 0xFF)
            // Neuen Punkt suchen
            GoToNewNode();

        else
            StartWalking(dir);
    }
}
Exemple #2
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();
    }
}
Exemple #3
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();
    }
}
void nofGeologist::Walked()
{
    if(state == STATE_GEOLOGIST_GOTONEXTNODE)
    {
        // Ist mein Zielpunkt überhaupt noch geeignet zum Graben (kann ja mittlerweile auch was drauf gebaut worden sein)
        if(!IsNodeGood(node_goal))
        {
            // alten Punkt wieder freigeben
            gwg->GetNode(node_goal).reserved = false;;
            // wenn nicht, dann zu einem neuen Punkt gehen
            GoToNextNode();
            return;
        }

        // Bin ich am Zielpunkt?
        if(pos == node_goal)
        {
            // anfangen zu graben
            current_ev = em->AddEvent(this, 100, 1);
            state = STATE_GEOLOGIST_DIG;
        }
        else
        {
            // Weg zum nächsten Punkt suchen
            unsigned char dir = gwg->FindHumanPath(pos, node_goal, 20);

            // Wenns keinen gibt
            if(dir == 0xFF)
            {
                // alten Punkt wieder freigeben
                gwg->GetNode(node_goal).reserved = false;
                // dann neuen Punkt suchen
                dir = GetNextNode();
                // falls es keinen gibt, dann zurück zur Flagge gehen und es übernimmt der andere "Walked"-Zweig
                if(dir == 0xFF)
                {
                    state = STATE_GOTOFLAG;
                    Walked();
                    return;
                }
            }
            
            StartWalking(dir);
        }
    }
    else if(state == STATE_GOTOFLAG)
    {
        GoToFlag();
    }
}
Exemple #5
0
void nofScout_Free::Walked()
{
    switch(state)
    {
        default: break;
        case STATE_GOTOFLAG:
        {
            GoToFlag();
        } break;
        case STATE_SCOUT_SCOUTING:
        {
            Scout();
        } break;
    }
}
void nofGeologist::Walked()
{
    if(state == STATE_GEOLOGIST_GOTONEXTNODE)
    {
        // Check if the flag still exists (not destroyed) and the goal node is still available (something could be build there)
        if(!flag || !IsNodeGood(node_goal))
        {
            // alten Punkt wieder freigeben
            gwg->SetReserved(node_goal, false);
            // wenn nicht, dann zu einem neuen Punkt gehen
            GoToNextNode();
            return;
        }

        // Bin ich am Zielpunkt?
        if(pos == node_goal)
        {
            // anfangen zu graben
            current_ev = GetEvMgr().AddEvent(this, 100, 1);
            state = STATE_GEOLOGIST_DIG;
        } else
        {
            // Weg zum nächsten Punkt suchen
            unsigned char dir = gwg->FindHumanPath(pos, node_goal, 20);

            // Wenns keinen gibt
            if(dir == INVALID_DIR)
                GoToNextNode();
            else
                StartWalking(Direction::fromInt(dir));
        }
    } else if(state == STATE_GOTOFLAG)
    {
        GoToFlag();
    }
}