void Stock::append(good::Stock& stock, const int iAmount) { if (stock.type() == none) { // nothing to add => nothing to do! return; } if (type() != none && type() != stock.type() ) { std::string errorStr = utils::format( 0xff, "GoodTypes do not match: %d vs %d", _type, stock._type ); Logger::warning( errorStr ); return; } int amount = iAmount; // not const if (amount == -1) { amount = stock._qty; } if (amount > stock._qty) { Logger::warning( "GoodStock:Not enough quantity in stock." ); return; } amount = math::clamp( amount, 0, _capacity - _qty ); if (amount+_qty > _capacity) { Logger::warning( "GoodStock: not enough free room for storage"); return; } _type = stock._type; // in case goodType was Good::none _qty += amount; stock._qty -= amount; }
bool Storage::applyStorageReservation(good::Stock &stock, const int reservationID) { good::Stock reservedStock = getStorageReservation(reservationID, true); if (stock.type() != reservedStock.type()) { Logger::warning( "SimpleGoodStore:GoodType does not match reservation"); return false; } if (stock.qty() < reservedStock.qty()) { Logger::warning( "SimpleGoodStore:Quantity does not match reservation"); return false; } int amount = reservedStock.qty(); _gsd->stocks[ reservedStock.type() ]->push( amount ); stock.pop( amount ); return true; }
bool Storage::applyRetrieveReservation(good::Stock& stock, const int reservationID) { good::Stock reservedStock = getRetrieveReservation(reservationID, true); if (stock.type() != reservedStock.type()) { Logger::warning( "SimpleGoodStore:GoodType does not match reservation"); return false; } if( stock.capacity() < stock.qty() + reservedStock.qty()) { Logger::warning( "SimpleGoodStore:Quantity does not match reservation"); return false; } int amount = reservedStock.qty(); good::Stock& currentStock = getStock(reservedStock.type()); currentStock.pop( amount ); stock.push( amount ); return true; }