std::vector<std::string> requirement_data::get_folded_list( int width, const inventory &crafting_inv, const std::vector< std::vector<T> > &objs, int batch ) const { // hack: ensure 'cached' availability is up to date can_make_with_inventory( crafting_inv ); std::vector<std::string> out_buffer; for( const auto &comp_list : objs ) { const bool has_one = any_marked_available( comp_list ); std::ostringstream buffer; for( auto a = comp_list.begin(); a != comp_list.end(); ++a ) { if( a != comp_list.begin() ) { buffer << "<color_white> " << _( "OR" ) << "</color> "; } const std::string col = a->get_color( has_one, crafting_inv, batch ); buffer << "<color_" << col << ">" << a->to_string( batch ) << "</color>"; } std::vector<std::string> folded = foldstring( buffer.str(), width - 2 ); for( size_t i = 0; i < folded.size(); i++ ) { if( i == 0 ) { out_buffer.push_back( std::string( "> " ).append( folded[i] ) ); } else { out_buffer.push_back( std::string( " " ).append( folded[i] ) ); } } } return out_buffer; }
bool repair_part( vehicle &veh, vehicle_part &pt, Character &who_c ) { // @todo: Get rid of this cast after moving relevant functions down to Character player &who = ( player & )who_c; int part_index = veh.index_of_part( &pt ); auto &vp = pt.info(); // @todo: Expose base part damage somewhere, don't recalculate it here const auto reqs = pt.is_broken() ? vp.install_requirements() : vp.repair_requirements() * pt.damage_level( 4 ); inventory map_inv; map_inv.form_from_map( who.pos(), PICKUP_RANGE ); if( !reqs.can_make_with_inventory( who.crafting_inventory() ) ) { who.add_msg_if_player( m_info, _( "You don't meet the requirements to repair the %s." ), pt.name().c_str() ); return false; } // consume items extracting any base item (which we will need if replacing broken part) item base( vp.item ); for( const auto &e : reqs.get_components() ) { for( auto &obj : who.consume_items( who.select_item_component( e, 1, map_inv ), 1 ) ) { if( obj.typeId() == vp.item ) { base = obj; } } } for( const auto &e : reqs.get_tools() ) { who.consume_tools( who.select_tool_component( e, 1, map_inv ), 1 ); } who.invalidate_crafting_inventory(); for( const auto &sk : pt.is_broken() ? vp.install_skills : vp.repair_skills ) { who.practice( sk.first, calc_xp_gain( vp, sk.first ) ); } // If part is broken, it will be destroyed and references invalidated std::string partname = pt.name(); if( pt.is_broken() ) { const int dir = pt.direction; point loc = pt.mount; auto replacement_id = pt.info().get_id(); g->m.spawn_items( who.pos(), pt.pieces_for_broken_part() ); veh.remove_part( part_index ); const int partnum = veh.install_part( loc, replacement_id, std::move( base ) ); veh.parts[partnum].direction = dir; veh.part_removal_cleanup(); } else { veh.set_hp( pt, pt.info().durability ); } // @todo: NPC doing that who.add_msg_if_player( m_good, _( "You repair the %1$s's %2$s." ), veh.name.c_str(), partname.c_str() ); return true; }
std::vector<std::string> requirement_data::get_folded_list( int width, const inventory &crafting_inv, const std::vector< std::vector<T> > &objs, int batch, std::string hilite ) const { // hack: ensure 'cached' availability is up to date can_make_with_inventory( crafting_inv ); std::vector<std::string> out_buffer; for( const auto &comp_list : objs ) { const bool has_one = any_marked_available( comp_list ); std::ostringstream buffer; std::vector<std::string> buffer_has; bool already_has; for( auto a = comp_list.begin(); a != comp_list.end(); ++a ) { already_has = false; for( auto cont : buffer_has ) { if( cont == a->to_string( batch ) + a->get_color( has_one, crafting_inv, batch ) ) { already_has = true; break; } } if( already_has ) { continue; } if( a != comp_list.begin() ) { buffer << "<color_white> " << _( "OR" ) << "</color> "; } const std::string col = a->get_color( has_one, crafting_inv, batch ); if( !hilite.empty() && lcmatch( a->to_string( batch ), hilite ) ) { buffer << get_tag_from_color( yellow_background( color_from_string( col ) ) ); } else { buffer << "<color_" << col << ">"; } buffer << a->to_string( batch ) << "</color>" << "</color>"; buffer_has.push_back( a->to_string( batch ) + a->get_color( has_one, crafting_inv, batch ) ); } std::vector<std::string> folded = foldstring( buffer.str(), width - 2 ); for( size_t i = 0; i < folded.size(); i++ ) { if( i == 0 ) { out_buffer.push_back( std::string( "> " ).append( folded[i] ) ); } else { out_buffer.push_back( std::string( " " ).append( folded[i] ) ); } } } return out_buffer; }