void nofActiveSoldier::WalkingHome() { // Is our home military building destroyed? if(!building) { // Start wandering around state = STATE_FIGUREWORK; StartWandering(); Wander(); return; } // Walking home to our military building // Are we already at the flag? if(GetPos() == building->GetFlag()->GetPos()) { // Enter via the door StartWalking(1); return; } // or are we at the building? if(GetPos() == building->GetPos()) { // We're there! building->AddActiveSoldier(this); // Remove myself from the map gwg->RemoveFigure(this, pos); return; } unsigned char dir = gwg->FindHumanPath(pos, building->GetFlag()->GetPos(), 100); // Or we don't find a route? if(dir == 0xFF) { // Inform our home building that we're not coming anymore Abrogate(); // Start wandering around then StartWandering(); state = STATE_FIGUREWORK; Wander(); } // All ok? else { // Find all sorts of enemies (attackers, aggressive defenders..) nearby if(FindEnemiesNearby()) // Enemy found -> abort, because nofActiveSoldier handles all things now (inclusive one walking step) return; // Start walking StartWalking(dir); } }
/// Geht wieder zurück zur Flagge und dann nach Hause void nofFlagWorker::GoToFlag() { // Zur Flagge zurücklaufen // Bin ich an der Fahne? if(pos == flag->GetPos()) { // nach Hause gehen nobBaseWarehouse* wh = gwg->GetPlayer(player).FindWarehouse(*flag, FW::AcceptsFigure(job_), true, false); if(wh) { GoHome(wh); // Vorgaukeln, dass wir ein Stück Straße bereits geschafft haben // damit wir mit WalkToGoal weiter bis zum Ziel laufen können cur_rs = &emulated_wanderroad; rs_pos = 0; WalkToGoal(); } else { // Weg führt nicht mehr zum Lagerhaus, dann rumirren StartWandering(); Wander(); } // Da wir quasi "freiwillig" nach Hause gegangen sind ohne das Abreißen der Flagge, auch manuell wieder // "abmelden" gwg->GetPlayer(player).RemoveFlagWorker(this); state = STATE_FIGUREWORK; flag = NULL; } else { // Weg suchen unsigned char dir = gwg->FindHumanPath(pos, flag->GetPos(), 40); // Wenns keinen gibt, rumirren, ansonsten hinlaufen if(dir == 0xFF) { Abrogate(); StartWandering(); Wander(); state = STATE_FIGUREWORK; flag = NULL; } else { StartWalking(dir); } } }
/// Examines the route (maybe harbor, road destroyed?) before start shipping MapPoint noFigure::ExamineRouteBeforeShipping(unsigned char& newDir) { MapPoint next_harbor; // Calc new route newDir = gwg->FindHumanPathOnRoads(gwg->GetSpecObj<noRoadNode>(pos), goal_, NULL, &next_harbor); if(newDir == 0xff) Abrogate(); // Going by ship? if(newDir == SHIP_DIR) // All ok, return next harbor (could be another one!) return next_harbor; else return MapPoint(0, 0); }
/// Bricht einen Seeangriff ab void nofAttacker::CancelSeaAttack() { InformTargetsAboutCancelling(); RTTR_Assert(!huntingDefender); Abrogate(); }
void noFigure::WalkToGoal() { // Kein Ziel mehr --> Rumirren if(!goal_) { StartWandering(); Wander(); return; } // Straße abgelaufen oder noch gar keine Straße vorhanden? if(((cur_rs) ? (rs_pos == cur_rs->GetLength()) : true)) { // Ziel erreicht? // Bei dem Träger können das beide Flaggen sein! MapPoint goal1, goal2; if(GetGOT() == GOT_NOF_CARRIER && fs == FS_GOTOGOAL) { goal1 = static_cast<nofCarrier*>(this)->GetFirstFlag() ? static_cast<nofCarrier*>(this)->GetFirstFlag()->GetPos() : MapPoint(0xFFFF, 0xFFFF); goal2 = static_cast<nofCarrier*>(this)->GetSecondFlag() ? static_cast<nofCarrier*>(this)->GetSecondFlag()->GetPos() : MapPoint(0xFFFF, 0xFFFF); } else { goal1 = goal_->GetPos(); goal2 = MapPoint(0xFFFF, 0xFFFF); } if(goal1 == pos || goal2 == pos) { if(fs == FS_GOHOME) { // Mann im Lagerhaus angekommen gwg->RemoveFigure(this, pos); static_cast<nobBaseWarehouse*>(goal_)->AddFigure(this); } else { // Zeug nullen cur_rs = NULL; rs_dir = 0; rs_pos = 0; goal_ = NULL; // abgeleiteter Klasse sagen, dass das Ziel erreicht wurde fs = FS_JOB; GoalReached(); } } else { MapPoint next_harbor; // Neuen Weg berechnen unsigned char route = gwg->FindHumanPathOnRoads(gwg->GetSpecObj<noRoadNode>(pos), goal_, NULL, &next_harbor); // Kein Weg zum Ziel... nächstes Lagerhaus suchen if(route == 0xFF) { // Arbeisplatz oder Laghaus Bescheid sagen Abrogate(); // Wir gehen jetzt nach Hause GoHome(); // Evtl wurde kein Lagerhaus gefunden und wir sollen rumirren, dann tun wir das gleich if(fs == FS_WANDER) { Wander(); return; } // Nach Hause laufen... WalkToGoal(); return; } // Oder müssen wir das Schiff nehmen? else if(route == SHIP_DIR) { // Uns in den Hafen einquartieren noBase* nob; if((nob = gwg->GetNO(pos))->GetGOT() != GOT_NOB_HARBORBUILDING) { // Es gibt keinen Hafen mehr -> nach Hause gehen // Arbeisplatz oder Laghaus Bescheid sagen Abrogate(); // Wir gehen jetzt nach Hause GoHome(); // Evtl wurde kein Lagerhaus gefunden und wir sollen rumirren, dann tun wir das gleich if(fs == FS_WANDER) { Wander(); return; } // Nach Hause laufen... WalkToGoal(); return; } // Uns in den Hafen einquartieren cur_rs = NULL; // wir laufen nicht mehr auf einer Straße gwg->RemoveFigure(this, pos); static_cast<nobHarborBuilding*>(nob)->AddFigureForShip(this, next_harbor); return; } // Nächste Straße wollen, auf der man geht cur_rs = gwg->GetSpecObj<noRoadNode>(pos)->routes[route]; StartWalking(route); rs_pos = 0; rs_dir = (gwg->GetSpecObj<noRoadNode>(pos) == cur_rs->GetF1()) ? false : true; } } else { StartWalking(cur_rs->GetDir(rs_dir, rs_pos)); } }