void Pickup::do_pickup( const tripoint &pickup_target_arg, bool from_vehicle, std::list<int> &indices, std::list<int> &quantities, bool autopickup ) { bool got_water = false; int cargo_part = -1; vehicle *veh = nullptr; bool weight_is_okay = (g->u.weight_carried() <= g->u.weight_capacity()); bool volume_is_okay = (g->u.volume_carried() <= g->u.volume_capacity()); bool offered_swap = false; // Convert from player-relative to map-relative. tripoint pickup_target = pickup_target_arg + g->u.pos(); // Map of items picked up so we can output them all at the end and // merge dropping items with the same name. PickupMap mapPickup; if( from_vehicle ) { int veh_root_part = -1; veh = g->m.veh_at( pickup_target, veh_root_part ); cargo_part = veh->part_with_feature( veh_root_part, "CARGO", false ); } while( g->u.moves >= 0 && !indices.empty() ) { // Pulling from the back of the (in-order) list of indices insures // that we pull from the end of the vector. int index = indices.back(); int quantity = quantities.back(); // Whether we pick the item up or not, we're done trying to do so, // so remove it from the list. indices.pop_back(); quantities.pop_back(); item *target = nullptr; if( from_vehicle ) { target = g->m.item_from( veh, cargo_part, index ); } else { target = g->m.item_from( pickup_target, index ); } if( target == nullptr ) { continue; // No such item. } pick_one_up( pickup_target, *target, veh, cargo_part, index, quantity, got_water, offered_swap, mapPickup, autopickup ); } if( !mapPickup.empty() ) { show_pickup_message(mapPickup); } if (got_water) { add_msg(m_info, _("You can't pick up a liquid!")); } if (weight_is_okay && g->u.weight_carried() > g->u.weight_capacity()) { add_msg(m_bad, _("You're overburdened!")); } if (volume_is_okay && g->u.volume_carried() > g->u.volume_capacity()) { add_msg(m_bad, _("You struggle to carry such a large volume!")); } }
void Pickup::do_pickup( point pickup_target, bool from_vehicle, std::list<int> &indices, std::list<int> &quantities, bool autopickup ) { bool got_water = false; int cargo_part = -1; vehicle *veh = nullptr; bool weight_is_okay = (g->u.weight_carried() <= g->u.weight_capacity()); bool volume_is_okay = (g->u.volume_carried() <= g->u.volume_capacity() - 2); bool offered_swap = false; // Convert from player-relative to map-relative. pickup_target.x += g->u.xpos(); pickup_target.y += g->u.ypos(); // Map of items picked up so we can output them all at the end and // merge dropping items with the same name. std::map<std::string, int> mapPickup; std::map<std::string, item> item_info; if( from_vehicle ) { int veh_root_part = -1; veh = g->m.veh_at( pickup_target.x, pickup_target.y, veh_root_part ); cargo_part = veh->part_with_feature( veh_root_part, "CARGO", false ); } std::vector<item> &here = from_vehicle ? veh->parts[cargo_part].items : g->m.i_at_mutable( pickup_target.x, pickup_target.y ); // Grow here vector if needed to avoid resize operations invalidating pointers during operation. here.reserve( here.size() + 1 ); while( g->u.moves >= 0 && !indices.empty() ) { // Pulling from the back of the (in-order) list of indices insures // that we pull from the end of the vector. int index = indices.back(); int quantity = quantities.back(); // Whether we pick the item up or not, we're done trying to do so, // so remove it from the list. indices.pop_back(); quantities.pop_back(); pick_one_up( pickup_target, here[index], veh, cargo_part, index, quantity, got_water, offered_swap, mapPickup, item_info, autopickup ); } if( !mapPickup.empty() ) { show_pickup_message(mapPickup, item_info); } if (got_water) { add_msg(m_info, _("You can't pick up a liquid!")); } if (weight_is_okay && g->u.weight_carried() >= g->u.weight_capacity()) { add_msg(m_bad, _("You're overburdened!")); } if (volume_is_okay && g->u.volume_carried() > g->u.volume_capacity() - 2) { add_msg(m_bad, _("You struggle to carry such a large volume!")); } }