Ware* nobBaseWarehouse::OrderWare(const GoodType good, noBaseBuilding* const goal) { RTTR_Assert(goal); // Ware überhaupt hier vorhanden (Abfrage eigentlich nicht nötig, aber erstmal zur Sicherheit) if(!inventory[good]) { LOG.lprintf("nobBaseWarehouse::OrderWare: WARNING: No ware type %u in warehouse!\n", static_cast<unsigned>(good)); return NULL; } Ware* ware = new Ware(good, goal, this); inventory.Remove(good); // Abgeleitete Klasse fragen, ob die irgend etwas besonderes mit dieser Ware anfangen will if(!UseWareAtOnce(ware, *goal)) { // Add to wating ware, but use copy of pointer, as AddWaitingWare takes ownership Ware* tmpWare = ware; AddWaitingWare(tmpWare); } // Evtl. keine Waffen/Bier mehr da, sodass das Rekrutieren gestoppt werden muss TryStopRecruiting(); return ware; }
/// Legt eine Ware im Lagerhaus ab void nobHarborBuilding::AddWare(Ware*& ware) { if(ware->GetGoal() && ware->GetGoal() != this) { // This is not the goal but we have one -> Get new route ware->RecalcRoute(); // Will diese Ware mit dem Schiff irgendwo hin fahren? if(ware->GetNextDir() == SHIP_DIR) { // Dann fügen wir die mal bei uns hinzu AddWareForShip(ware); return; }else if(ware->GetNextDir() != INVALID_DIR) { // Travel on roads -> Carry out RTTR_Assert(ware->GetGoal() != this); AddWaitingWare(ware); return; }else { // Pathfinding failed -> Ware would want to go here RTTR_Assert(ware->GetGoal() == this); // Regular handling below } } // Brauchen wir die Ware? if(expedition.active) { if((ware->type == GD_BOARDS && expedition.boards < BUILDING_COSTS[nation][BLD_HARBORBUILDING].boards) || (ware->type == GD_STONES && expedition.stones < BUILDING_COSTS[nation][BLD_HARBORBUILDING].stones)) { if(ware->type == GD_BOARDS) ++expedition.boards; else ++expedition.stones; // Ware nicht mehr abhängig if(ware->GetGoal()) RemoveDependentWare(ware); // Dann zweigen wir die einfach mal für die Expedition ab gwg->GetPlayer(player).RemoveWare(ware); deletePtr(ware); // Ggf. ist jetzt alles benötigte da CheckExpeditionReady(); return; } } nobBaseWarehouse::AddWare(ware); }