Example #1
0
unsigned char nofGeologist::GetNextNode()
{
    // Überhaupt noch Schilder zum Aufstellen
    if(!signs)
        return 0xFF;
    do
    {
        // Sind überhaupt Punkte verfügbar?
        while(!available_nodes.empty())
        {
            // Dann einen Punkt zufällig auswählen
            int randNode = RANDOM.Rand(__FILE__, __LINE__, GetObjId(), available_nodes.size());
            node_goal = available_nodes[randNode];
            // und aus der Liste entfernen
            available_nodes.erase(available_nodes.begin() + randNode);
            // Gucken, ob er gut ist und ob man hingehen kann und ob er noch nicht reserviert wurde!
            unsigned char ret_dir;
            if(IsNodeGood(node_goal) && (ret_dir = gwg->FindHumanPath(pos, node_goal, 20)) != 0xFF && !gwg->GetNode(node_goal).reserved)
            {
                // Reservieren
                gwg->GetNode(node_goal).reserved = true;;
                return ret_dir;
            }
        }


        // Nach neuen Punkten sucehn
        LookForNewNodes();
    }
    while(!available_nodes.empty());

    return 0xFF;
}
void nofGeologist::GoalReached()
{
    // An der Flagge angekommen

    // Geologe muss nun 15 Schildchen aufstellen

    signs = 15;

    // Für jeden Ressourcentyp nur einmal eine Post-Nachricht schicken
    std::fill(resAlreadyFound.begin(), resAlreadyFound.end(), false);

    // Umgebung absuchen
    LookForNewNodes();

    // ersten Punkt suchen
    GoToNextNode();
}
unsigned char nofGeologist::GetNextNode()
{
    // Überhaupt noch Schilder zum Aufstellen
    if(!signs)
    {
        node_goal = MapPoint::Invalid();
        return INVALID_DIR;
    }

    do
    {
        // Sind überhaupt Punkte verfügbar?
        while(!available_nodes.empty())
        {
            // Dann einen Punkt zufällig auswählen
            int randNode = RANDOM.Rand(__FILE__, __LINE__, GetObjId(), available_nodes.size());
            node_goal = available_nodes[randNode];
            // und aus der Liste entfernen
            available_nodes.erase(available_nodes.begin() + randNode);
            // Gucken, ob er gut ist und ob man hingehen kann und ob er noch nicht reserviert wurde!
            if(!IsNodeGood(node_goal) || gwg->GetNode(node_goal).reserved)
                continue;

            unsigned char ret_dir;
            if(pos == node_goal)
                ret_dir = INVALID_DIR;
            else
            {
                ret_dir = gwg->FindHumanPath(pos, node_goal, 20);
                if(ret_dir == INVALID_DIR)
                    continue;
            }
            // Reservieren
            gwg->SetReserved(node_goal, true);
            return ret_dir;
        }

        // Nach neuen Punkten sucehn
        LookForNewNodes();
    } while(!available_nodes.empty());

    node_goal = MapPoint::Invalid();
    return INVALID_DIR;
}
Example #4
0
void nofGeologist::GoalReached()
{
    // An der Flagge angekommen

    // Geologe muss nun 15 Schildchen aufstellen

    signs = 15;

    // Für jeden Ressourcentyp nur einmal eine Post-Nachricht schicken
    for(unsigned i = 0; i < 5; ++i)
        resAlreadyFound[i] = false;

    // Umgebung absuchen
    LookForNewNodes();

    // ersten Punkt suchen
    /*dir = GetNextNode();*/
    GoToNextNode();
}