void put_into_vehicle( player &p, const std::list<item> &items, vehicle &veh, int part ) { if( items.empty() ) { return; } const tripoint where = veh.global_part_pos3( part ); const std::string ter_name = g->m.name( where ); int fallen_count = 0; for( auto it : items ) { // cant use constant reference here because of the spill_contents() if( it.is_bucket_nonempty() && !it.spill_contents( p ) ) { p.add_msg_player_or_npc( _( "To avoid spilling its contents, you set your %1$s on the %2$s." ), _( "To avoid spilling its contents, <npcname> sets their %1$s on the %2$s." ), it.display_name().c_str(), ter_name.c_str() ); g->m.add_item_or_charges( where, it ); continue; } if( !veh.add_item( part, it ) ) { if( it.count_by_charges() ) { // Maybe we can add a few charges in the trunk and the rest on the ground. it.mod_charges( -veh.add_charges( part, it ) ); } g->m.add_item_or_charges( where, it ); ++fallen_count; } } const std::string part_name = veh.part_info( part ).name(); if( same_type( items ) ) { const item &it = items.front(); const int dropcount = items.size() * ( it.count_by_charges() ? it.charges : 1 ); p.add_msg_player_or_npc( ngettext( "You put your %1$s in the %2$s's %3$s.", "You put your %1$s in the %2$s's %3$s.", dropcount ), ngettext( "<npcname> puts their %1$s in the %2$s's %3$s.", "<npcname> puts their %1$s in the %2$s's %3$s.", dropcount ), it.tname( dropcount ).c_str(), veh.name.c_str(), part_name.c_str() ); } else { p.add_msg_player_or_npc( _( "You put several items in the %1$s's %2$s." ), _( "<npcname> puts several items in the %1$s's %2$s." ), veh.name.c_str(), part_name.c_str() ); } if( fallen_count > 0 ) { add_msg( m_warning, _( "The trunk is full, so some items fell to the %s." ), ter_name.c_str() ); } }
static int max_quality_from_vpart( const vehicle& veh, int part, const quality_id& qual ) { int res = INT_MIN; auto pos = veh.parts[ part ].mount; for( const auto &n : veh.parts_at_relative( pos.x, pos.y ) ) { // only unbroken parts can provide tool qualities if( !veh.parts[ n ].is_broken() ) { auto tq = veh.part_info( n ).qualities; auto iter = tq.find( qual ); // does the part provide this quality? if( iter != tq.end() ) { res = std::max( res, iter->second ); } } } return res; }
static int has_quality_from_vpart( const vehicle& veh, int part, const quality_id& qual, int level, int limit ) { int qty = 0; auto pos = veh.parts[ part ].mount; for( const auto &n : veh.parts_at_relative( pos.x, pos.y ) ) { // only unbroken parts can provide tool qualities if( !veh.parts[ n ].is_broken() ) { auto tq = veh.part_info( n ).qualities; auto iter = tq.find( qual ); // does the part provide this quality? if( iter != tq.end() && iter->second >= level ) { if( ++qty >= limit ) { break; } } } } return std::min( qty, limit ); }
void put_into_vehicle( Character &c, item_drop_reason reason, const std::list<item> &items, vehicle &veh, int part ) { if( items.empty() ) { return; } const tripoint where = veh.global_part_pos3( part ); const std::string ter_name = g->m.name( where ); int fallen_count = 0; int into_vehicle_count = 0; for( auto it : items ) { // cant use constant reference here because of the spill_contents() if( Pickup::handle_spillable_contents( c, it, g->m ) ) { continue; } if( veh.add_item( part, it ) ) { into_vehicle_count += it.count(); } else { if( it.count_by_charges() ) { // Maybe we can add a few charges in the trunk and the rest on the ground. auto charges_added = veh.add_charges( part, it ); it.mod_charges( -charges_added ); into_vehicle_count += charges_added; } g->m.add_item_or_charges( where, it ); fallen_count += it.count(); } } const std::string part_name = veh.part_info( part ).name(); if( same_type( items ) ) { const item &it = items.front(); const int dropcount = items.size() * it.count(); const std::string it_name = it.tname( dropcount ); switch( reason ) { case item_drop_reason::deliberate: c.add_msg_player_or_npc( ngettext( "You put your %1$s in the %2$s's %3$s.", "You put your %1$s in the %2$s's %3$s.", dropcount ), ngettext( "<npcname> puts their %1$s in the %2$s's %3$s.", "<npcname> puts their %1$s in the %2$s's %3$s.", dropcount ), it_name, veh.name, part_name ); break; case item_drop_reason::too_large: c.add_msg_if_player( ngettext( "There's no room in your inventory for the %s, so you drop it into the %s's %s.", "There's no room in your inventory for the %s, so you drop them into the %s's %s.", dropcount ), it_name, veh.name, part_name ); break; case item_drop_reason::too_heavy: c.add_msg_if_player( ngettext( "The %s is too heavy to carry, so you drop it into the %s's %s.", "The %s are too heavy to carry, so you drop them into the %s's %s.", dropcount ), it_name, veh.name, part_name ); break; case item_drop_reason::tumbling: c.add_msg_if_player( m_bad, ngettext( "Your %s tumbles into the %s's %s.", "Your %s tumble into the %s's %s.", dropcount ), it_name, veh.name, part_name ); break; } } else { switch( reason ) { case item_drop_reason::deliberate: c.add_msg_player_or_npc( _( "You put several items in the %1$s's %2$s." ), _( "<npcname> puts several items in the %1$s's %2$s." ), veh.name, part_name ); break; case item_drop_reason::too_large: case item_drop_reason::too_heavy: case item_drop_reason::tumbling: c.add_msg_if_player( m_bad, _( "Some items tumble into the %1$s's %2$s." ), veh.name, part_name ); break; } } if( fallen_count > 0 ) { if( into_vehicle_count > 0 ) { c.add_msg_if_player( m_warning, ngettext( "The %s is full, so something fell to the %s.", "The %s is full, so some items fell to the %s.", fallen_count ), part_name, ter_name ); } else { c.add_msg_if_player( m_warning, ngettext( "The %s is full, so it fell to the %s.", "The %s is full, so they fell to the %s.", fallen_count ), part_name, ter_name ); } } }