void CartSupplier::onDestination() { Walker::onDestination(); CityHelper helper( _d->city ); if( _getPathway().isReverse() ) { // walker is back in the market deleteLater(); // put the content of the stock to receiver BuildingPtr building = helper.find<Building>( _d->baseBuildingPos ); GoodStore* storage = 0; if( building.is<Factory>() ) { storage = &building.as<Factory>()->getGoodStore(); } else if( building.is<Granary>() ) { storage = &building.as<Granary>()->getGoodStore(); } else if( building.is<Warehouse>() ) { storage = &building.as<Warehouse>()->getGoodStore(); } if( storage ) { storage->applyStorageReservation( _d->stock, _d->rcvReservationID ); storage->store( _d->stock, _d->stock._currentQty ); } } else { // walker is near the granary/warehouse _getPathway().rbegin(); computeDirection(); go(); // get goods from destination building BuildingPtr building = helper.find<Building>( _d->storageBuildingPos ); if( building.is<Granary>() ) { GranaryPtr granary = building.as<Granary>(); // this is a granary! // std::cout << "MarketBuyer arrives at granary, res=" << _reservationID << std::endl; granary->getGoodStore().applyRetrieveReservation( _d->stock, _d->reservationID ); } else if( building.is<Warehouse>() ) { WarehousePtr warehouse = building.as<Warehouse>(); // this is a warehouse! // std::cout << "Market buyer takes IRON from warehouse" << std::endl; // warehouse->retrieveGoods(_basket.getStock(G_IRON)); warehouse->getGoodStore().applyRetrieveReservation(_d->stock, _d->reservationID); } } }
GranarySpecialOrdersWindow::GranarySpecialOrdersWindow( Widget* parent, const Point& pos, GranaryPtr granary ) : BaseSpecialOrdersWindow( parent, pos, defaultHeight ), __INIT_IMPL(GranarySpecialOrdersWindow) { __D_IMPL(d, GranarySpecialOrdersWindow) setupUI( ":/gui/granaryspecial.gui" ); setTitle( _("##granary_orders##") ); int index=0; d->granary = granary; for( auto& goodType : good::foods() ) { const good::Orders::Order rule = granary->store().getOrder( goodType ); if( rule != good::Orders::none ) { OrderGoodWidget::create( index, goodType, _ordersArea(), granary->store() ); index++; } } d->btnToggleDevastation = new PushButton( this, Rect( 80, height() - 45, width() - 80, height() - 25 ), "", -1, false, PushButton::whiteBorderUp ); CONNECT( d->btnToggleDevastation, onClicked(), this, GranarySpecialOrdersWindow::toggleDevastation ); _updateBtnDevastation(); }
void CartPusher::_reachedPathway() { Walker::_reachedPathway(); _d->anim = CartAnimation(); if( _d->consumerBuilding != NULL ) { GranaryPtr granary = ptr_cast<Granary>(_d->consumerBuilding); WarehousePtr warehouse = ptr_cast<Warehouse>(_d->consumerBuilding); FactoryPtr factory = ptr_cast<Factory>(_d->consumerBuilding); good::Store* goodStore = 0; if( granary.isValid() ) { goodStore = &granary->store(); } else if( warehouse.isValid() ) { goodStore = &warehouse->store(); } else if( factory.isValid() ) { goodStore = &factory->store(); } if( goodStore ) { int saveQty = _d->stock.qty(); wait( _d->stock.qty() ); goodStore->applyStorageReservation(_d->stock, _d->reservationID); _d->reservationID = 0; _d->cantUnloadGoods = (saveQty == _d->stock.qty()); } } // if( !_pathway().isReverse() ) { _pathway().toggleDirection(); _centerTile(); go(); _d->consumerBuilding = NULL; } else { deleteLater(); } }
void CartPusher::onDestination() { Walker::onDestination(); _d->cartPicture = NULL; if( _d->consumerBuilding != NULL ) { GranaryPtr granary = _d->consumerBuilding.as<Granary>(); WarehousePtr warehouse = _d->consumerBuilding.as<Warehouse>(); FactoryPtr factory = _d->consumerBuilding.as<Factory>(); if( granary != NULL ) { granary->getGoodStore().applyStorageReservation(_d->stock, _d->reservationID); granary->computePictures(); _d->reservationID = 0; } else if ( warehouse != NULL ) { warehouse->getGoodStore().applyStorageReservation(_d->stock, _d->reservationID); warehouse->computePictures(); _d->reservationID = 0; } else if( factory != NULL ) { factory->getGoodStore().applyStorageReservation(_d->stock, _d->reservationID); // factory->computePictures(); _d->reservationID = 0; } } // if( !_pathWay.isReverse() ) { _pathWay.toggleDirection(); _action._action=WA_MOVE; computeDirection(); _d->consumerBuilding = 0; } else { deleteLater(); } }
GranarySpecialOrdersWindow::GranarySpecialOrdersWindow( Widget* parent, const Point& pos, GranaryPtr granary ) : BaseSpecialOrdersWindow( parent, pos, defaultHeight ) { setTitle( _("##granary_orders##") ); int index=0; _granary = granary; for( int goodType=Good::wheat; goodType <= Good::vegetable; goodType++ ) { const GoodOrders::Order rule = granary->store().getOrder( (Good::Type)goodType ); if( rule != GoodOrders::none ) { addOrderWidget<GranaryPtr>( index, (Good::Type)goodType, _ordersArea(), granary ); index++; } } _btnToggleDevastation = new PushButton( this, Rect( 80, height() - 45, width() - 80, height() - 25 ), "", -1, false, PushButton::whiteBorderUp ); CONNECT( _btnToggleDevastation, onClicked(), this, GranarySpecialOrdersWindow::toggleDevastation ); _updateBtnDevastation(); }
void MarketLady::onDestination() { Walker::onDestination(); if( _getPathway().isReverse() ) { // walker is back in the market deleteLater(); // put the content of the basket in the market _d->market->getGoodStore().storeAll( _d->basket ); } else { // walker is near the granary/warehouse _getPathway().rbegin(); _setAction( WA_MOVE ); computeDirection(); // get goods from destination building LandOverlayPtr building = _d->city->getTilemap().at( _d->destBuildingPos ).getTerrain().getOverlay(); if( building.is<Granary>() ) { GranaryPtr granary = building.as<Granary>(); // this is a granary! // std::cout << "MarketLady arrives at granary, res=" << _reservationID << std::endl; granary->getGoodStore().applyRetrieveReservation(_d->basket, _d->reservationID); // take other goods if possible for (int n = 1; n<G_MAX; ++n) { // for all types of good (except G_NONE) GoodType goodType = (GoodType) n; int qty = _d->market->getGoodDemand(goodType) - _d->basket.getCurrentQty(goodType); if (qty != 0) { qty = std::min(qty, granary->getGoodStore().getMaxRetrieve(goodType)); qty = std::min(qty, _d->basket.getMaxQty(_d->priorityGood) - _d->basket.getCurrentQty(_d->priorityGood)); if (qty != 0) { // std::cout << "extra retrieve qty=" << qty << " basket=" << _basket.getStock(goodType)._currentQty << std::endl; GoodStock& stock = _d->basket.getStock(goodType); granary->getGoodStore().retrieve(stock, qty); } } } } else if( building.is<Warehouse>() ) { WarehousePtr warehouse = building.as<Warehouse>(); // this is a warehouse! // std::cout << "Market buyer takes IRON from warehouse" << std::endl; // warehouse->retrieveGoods(_basket.getStock(G_IRON)); warehouse->getGoodStore().applyRetrieveReservation(_d->basket, _d->reservationID); // take other goods if possible for (int n = 1; n<G_MAX; ++n) { // for all types of good (except G_NONE) GoodType goodType = (GoodType) n; int qty = _d->market->getGoodDemand(goodType) - _d->basket.getCurrentQty(goodType); if (qty != 0) { qty = std::min(qty, warehouse->getGoodStore().getMaxRetrieve(goodType)); qty = std::min(qty, _d->basket.getMaxQty(_d->priorityGood) - _d->basket.getCurrentQty(_d->priorityGood)); if (qty != 0) { // std::cout << "extra retrieve qty=" << qty << " basket=" << _basket.getStock(goodType)._currentQty << std::endl; GoodStock& stock = _d->basket.getStock(goodType); warehouse->getGoodStore().retrieve(stock, qty); } } } } unsigned long delay = 20; while( _d->basket.getCurrentQty() > 100 ) { for( int gtype=G_WHEAT; gtype <= G_WINE; gtype++ ) { GoodStock& currentStock = _d->basket.getStock( (GoodType)gtype ); if( currentStock._currentQty > 0 ) { MarketLadyHelperPtr boy = MarketLadyHelper::create( this ); GoodStock& boyBasket = boy->getBasket(); boyBasket._goodType = (GoodType)gtype; boyBasket._maxQty = 100; _d->basket.retrieve( boyBasket, math::clamp( currentStock._currentQty, 0, 100 ) ); boy->setDelay( delay ); delay += 20; boy->send2City( _d->city, _d->market ); } } } } }