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; }
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(); }