void nobBaseWarehouse::OrderCarrier(noRoadNode& goal, RoadSegment& workplace) { RTTR_Assert(workplace.getCarrier(0) == NULL); const bool isBoatRequired = workplace.GetRoadType() == RoadSegment::RT_BOAT; // We assume, that the caller already checked, if this is possible RTTR_Assert(inventory[JOB_HELPER]); if(isBoatRequired) RTTR_Assert(inventory[GD_BOAT]); nofCarrier* carrier = new nofCarrier(isBoatRequired ? nofCarrier::CT_BOAT : nofCarrier::CT_NORMAL, pos, player, &workplace, &goal); workplace.setCarrier(0, carrier); if(!UseFigureAtOnce(carrier, goal)) AddLeavingFigure(carrier); inventory.real.Remove(JOB_HELPER); if(isBoatRequired) inventory.real.Remove(GD_BOAT); // Evtl. kein Gehilfe mehr, sodass das Rekrutieren gestoppt werden muss TryStopRecruiting(); }
void nofCarrier::RoadSplitted(RoadSegment* rs1, RoadSegment* rs2) { // Bin ich schon auf meinem Arbeitsplatz (=Straße) oder bin ich erst noch auf dem Weg dorthin? if(state == CARRS_FIGUREWORK) { // ich gehe erst noch hin, also gucken, welche Flagge ich anvisiert habe und das jeweilige Teilstück dann als Arbeitsstraße if(GetGoal() == rs1->GetF1()) workplace = rs1; else workplace = rs2; } else if(state == CARRS_CARRYWARETOBUILDING || state == CARRS_LEAVEBUILDING) { // Wenn ich in ein Gebäude gehen oder rauskomme, auf den Weg gehen, der an dieses Gebäude grenzt if(cur_rs->GetF1() == rs1->GetF1() || cur_rs->GetF1() == rs1->GetF2()) workplace = rs1; else workplace = rs2; } else { // sonst wurde es ja schon entschieden workplace = (cur_rs == rs1) ? rs1 : rs2; } // Sonstige Sachen für jeweilige States unternehmen switch(state) { default: break; case CARRS_WAITFORWARE: { // Wenn wir stehen, müssen wir in die Mitte laufen state = CARRS_GOTOMIDDLEOFROAD; Walked(); } break; case CARRS_FETCHWARE: { // Wenn wir zur 2. Flagge vom 1. Wegstück gelaufen sind, können wir das nun vergessen if(!workplace->AreWareJobs(!rs_dir, ct, false)) state = CARRS_GOTOMIDDLEOFROAD; } break; } RoadSegment* otherRoad = (workplace == rs1) ? rs2 : rs1; unsigned char carrierNr = ct == CT_DONKEY ? 1 : 0; // Switch road if required if(workplace->getCarrier(carrierNr) != this) { RTTR_Assert(otherRoad->getCarrier(carrierNr) == this); // I should have been on other road // Mich als Träger für meinen neuen Arbeitsplatz zuweisen workplace->setCarrier(carrierNr, this); // Für andere Straße neuen Träger/Esel rufen otherRoad->setCarrier(carrierNr, NULL); }else RTTR_Assert(otherRoad->getCarrier(carrierNr) == NULL); // No carrier expected if(ct == CT_NORMAL) gwg->GetPlayer(player).FindCarrierForRoad(otherRoad); else if(ct == CT_DONKEY) otherRoad->setCarrier(1, gwg->GetPlayer(player).OrderDonkey(otherRoad)); }