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