/// Sagt Bescheid, dass ein Schiffsangreifer nicht mehr mit nach Hause fahren will void noShip::SeaAttackerWishesNoReturn() { assert(remaining_sea_attackers); --remaining_sea_attackers; // Alle Soldaten an Bord if(remaining_sea_attackers == 0) { // Andere Events ggf. erstmal abmelden em->RemoveEvent(current_ev); if(!figures.empty()) { //set it to 1 so we "know" that we are driving back not any transport but a group of sea attackers (reset @ handleevent unload transport, used when target harbor dies to set the soldiers goal to 0) remaining_sea_attackers = 1; // Wieder nach Hause fahren goal_harbor_id = home_harbor; StartDrivingToHarborPlace(); state = STATE_TRANSPORT_DRIVING; HandleState_TransportDriving(); for(std::list<noFigure*>::iterator it = figures.begin(); it != figures.end(); ++it) (*it)->StartShipJourney(gwg->GetHarborPoint(goal_harbor_id)); } else { // Wenn keine Soldaten mehr da sind können wir auch erstmal idlen StartIdling(); players->getElement(player)->GetJobForShip(this); } } }
/// Sagt dem Schiff, dass ein neuer Hafen erbaut wurde void noShip::NewHarborBuilt(nobHarborBuilding* hb) { if(lost) { // Liegt der Hafen auch am Meer von diesem Schiff? if(!gwg->IsAtThisSea(hb->GetHarborPosID(), seaId_)) return; //LOG.lprintf("lost ship has new goal harbor player %i state %i pos %u,%u \n",player,state,x,y); home_harbor = goal_harbor_id = hb->GetHarborPosID(); lost = false; StartDrivingToHarborPlace(); switch(state) { case STATE_EXPLORATIONEXPEDITION_DRIVING: case STATE_EXPEDITION_DRIVING: case STATE_TRANSPORT_DRIVING: { Driven(); } break; default: assert(false); // Das darf eigentlich nicht passieren } } }
/// Weist das Schiff an, eine Expedition abzubrechen (nur wenn es steht) und zum /// Hafen zurückzukehren void noShip::CancelExpedition() { // Protect against double execution if(state != STATE_EXPEDITION_WAITING) return; // We are waiting. There should be no event! RTTR_Assert(!current_ev); // Zum Heimathafen zurückkehren // Oder sind wir schon dort? if(goal_harborId == home_harbor) { route_.clear(); curRouteIdx = 0; state = STATE_EXPEDITION_DRIVING; //just in case the home harbor was destroyed HandleState_ExpeditionDriving(); } else { state = STATE_EXPEDITION_DRIVING; goal_harborId = home_harbor; StartDrivingToHarborPlace(); HandleState_ExpeditionDriving(); } }
/// Sagt dem Schiff, dass ein neuer Hafen erbaut wurde void noShip::NewHarborBuilt(nobHarborBuilding* hb) { if(!lost) return; // Liegt der Hafen auch am Meer von diesem Schiff? if(!gwg->IsHarborAtSea(hb->GetHarborPosID(), seaId_)) return; //LOG.write(("lost ship has new goal harbor player %i state %i pos %u,%u \n",player,state,x,y); home_harbor = goal_harborId = hb->GetHarborPosID(); lost = false; StartDrivingToHarborPlace(); switch(state) { case STATE_EXPLORATIONEXPEDITION_DRIVING: case STATE_EXPEDITION_DRIVING: case STATE_TRANSPORT_DRIVING: case STATE_SEAATTACK_RETURN_DRIVING: Driven(); break; default: RTTR_Assert(false); // Das darf eigentlich nicht passieren LOG.write("Bug detected: Invalid state in NewHarborBuilt"); break; } }
/// Sagt Bescheid, dass ein Schiffsangreifer nicht mehr mit nach Hause fahren will void noShip::SeaAttackerWishesNoReturn() { RTTR_Assert(remaining_sea_attackers); RTTR_Assert(state == STATE_SEAATTACK_WAITING); --remaining_sea_attackers; // Alle Soldaten an Bord if(remaining_sea_attackers == 0) { // Andere Events ggf. erstmal abmelden GetEvMgr().RemoveEvent(current_ev); if(!figures.empty()) { // Go back home. Note: home_harbor can be 0 if it was destroyed, allow this and let the state handlers handle that case later goal_harborId = home_harbor; state = STATE_SEAATTACK_RETURN_DRIVING; StartDrivingToHarborPlace(); HandleState_SeaAttackReturn(); } else { // Wenn keine Soldaten mehr da sind können wir auch erstmal idlen StartIdling(); gwg->GetPlayer(player).GetJobForShip(this); } } }
/// Startet die eigentliche Transportaktion, nachdem das Schiff beladen wurde void noShip::StartTransport() { state = STATE_TRANSPORT_DRIVING; StartDrivingToHarborPlace(); // Einfach weiterfahren HandleState_TransportDriving(); }
/// Weist das Schiff an, eine Expedition abzubrechen (nur wenn es steht) und zum /// Hafen zurückzukehren void noShip::CancelExpedition() { // Zum Heimathafen zurückkehren // Oder sind wir schon dort? if(goal_harbor_id == home_harbor) { route_.clear(); curRouteIdx = 0; state = STATE_EXPEDITION_DRIVING; //just in case the home harbor was destroyed HandleState_ExpeditionDriving(); } else { state = STATE_EXPEDITION_DRIVING; goal_harbor_id = home_harbor; StartDrivingToHarborPlace(); HandleState_ExpeditionDriving(); } }
/// Weist das Schiff an, seine Erkundungs-Expedition fortzusetzen void noShip::ContinueExplorationExpedition() { // Sind wir schon über unserem Limit, also zu weit gefahren if(covered_distance >= MAX_EXPLORATION_EXPEDITION_DISTANCE) { // Ggf. sind wir schon da? if(goal_harbor_id == home_harbor) { // Dann sind wir fertig -> wieder entladen state = STATE_EXPLORATIONEXPEDITION_UNLOADING; current_ev = em->AddEvent(this, UNLOADING_TIME, 1); return; } // Dann steuern wir unseren Heimathafen an! goal_harbor_id = home_harbor; } else { // Nächsten Zielpunkt bestimmen std::vector<unsigned> hps; gwg->GetHarborPointsWithinReach(goal_harbor_id, hps); // Keine möglichen Häfen gefunden? if(hps.size() == 0) // Dann wieder Heimathafen ansteuern goal_harbor_id = home_harbor; else // Zufällig den nächsten Hafen auswählen goal_harbor_id = hps[RANDOM.Rand(__FILE__, __LINE__, GetObjId(), hps.size())]; } StartDrivingToHarborPlace(); state = STATE_EXPLORATIONEXPEDITION_DRIVING; HandleState_ExplorationExpeditionDriving(); }
/// Startet Schiffs-Angreiff void noShip::StartSeaAttack() { state = STATE_SEAATTACK_DRIVINGTODESTINATION; StartDrivingToHarborPlace(); HandleState_SeaAttackDriving(); }