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(); } }
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 nofScout_Free::Walked() { switch(state) { default: break; case STATE_GOTOFLAG: { GoToFlag(); } break; case STATE_SCOUT_SCOUTING: { Scout(); } break; } }