本文整理汇总了C++中inventory::has_tools方法的典型用法代码示例。如果您正苦于以下问题:C++ inventory::has_tools方法的具体用法?C++ inventory::has_tools怎么用?C++ inventory::has_tools使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类inventory
的用法示例。
在下文中一共展示了inventory::has_tools方法的11个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: switch
std::vector<comp_selection<tool_comp>> craft_command::check_tool_components_missing(
const inventory &map_inv ) const
{
std::vector<comp_selection<tool_comp>> missing;
for( const auto &tool_sel : tool_selections ) {
itype_id type = tool_sel.comp.type;
if( tool_sel.comp.count > 0 ) {
long count = tool_sel.comp.count * batch_size;
switch( tool_sel.use_from ) {
case use_from_player:
if( !crafter->has_charges( type, count ) ) {
missing.push_back( tool_sel );
}
break;
case use_from_map:
if( !map_inv.has_charges( type, count ) ) {
missing.push_back( tool_sel );
}
break;
case use_from_both:
case use_from_none:
case cancel:
break;
}
} else if( !crafter->has_amount( type, 1 ) && !map_inv.has_tools( type, 1 ) ) {
missing.push_back( tool_sel );
}
}
return missing;
}
示例2: has
bool tool_comp::has( const inventory &crafting_inv, int batch ) const
{
if( !by_charges() ) {
return crafting_inv.has_tools( type, std::abs( count ) );
} else {
return crafting_inv.has_charges( type, count * batch );
}
}
示例3: player_can_build
static bool player_can_build(player &p, inventory pinv, construction *con)
{
if (p.skillLevel(con->skill) < con->difficulty) {
return false;
}
bool has_tool = false;
bool has_component = false;
bool tools_required = false;
bool components_required = false;
for (int j = 0; j < con->tools.size(); j++) {
if (con->tools[j].size() > 0) {
tools_required = true;
has_tool = false;
for (unsigned k = 0; k < con->tools[j].size(); k++) {
if (pinv.has_tools(con->tools[j][k].type, 1)) {
has_tool = true;
con->tools[j][k].available = 1;
} else {
con->tools[j][k].available = -1;
}
}
if (!has_tool) { // missing one of the tools for this stage
break;
}
}
}
for (int j = 0; j < con->components.size(); ++j) {
if (con->components[j].size() > 0) {
components_required = true;
has_component = false;
for (unsigned k = 0; k < con->components[j].size(); k++) {
if (( item_controller->find_template(con->components[j][k].type)->is_ammo() &&
pinv.has_charges(con->components[j][k].type,
con->components[j][k].count) ) ||
(!item_controller->find_template(con->components[j][k].type)->is_ammo() &&
pinv.has_components (con->components[j][k].type,
con->components[j][k].count) )) {
has_component = true;
con->components[j][k].available = 1;
} else {
con->components[j][k].available = -1;
}
}
if (!has_component) { // missing one of the comps for this stage
break;
}
}
}
return (has_component || !components_required) &&
(has_tool || !tools_required);
}
示例4: get_color
std::string tool_comp::get_color( bool has_one, const inventory &crafting_inv, int batch ) const
{
if( available == a_insufficent ) {
return "brown";
} else if( !by_charges() && crafting_inv.has_tools( type, std::abs( count ) ) ) {
return "green";
} else if( by_charges() && crafting_inv.has_charges( type, count * batch ) ) {
return "green";
}
return has_one ? "dkgray" : "red";
}
示例5: has
bool tool_comp::has( const inventory &crafting_inv, int batch ) const
{
if( g->u.has_trait( "DEBUG_HS" ) ) {
return true;
}
if( !by_charges() ) {
return crafting_inv.has_tools( type, std::abs( count ) );
} else {
return crafting_inv.has_charges( type, count * batch );
}
}
示例6: has
bool tool_comp::has( const inventory &crafting_inv, int batch ) const
{
if( type == "goggles_welding" ) {
if( g->u.has_bionic( "bio_sunglasses" ) || g->u.is_wearing( "rm13_armor_on" ) ) {
return true;
}
}
if( !by_charges() ) {
return crafting_inv.has_tools( type, std::abs( count ) );
} else {
return crafting_inv.has_charges( type, count * batch );
}
}
示例7: get_color
std::string tool_comp::get_color( bool has_one, const inventory &crafting_inv, int batch ) const
{
if( type == "goggles_welding" ) {
if( g->u.has_bionic( "bio_sunglasses" ) || g->u.is_wearing( "rm13_armor_on" ) ) {
return "cyan";
}
}
if( available == a_insufficent ) {
return "brown";
} else if( !by_charges() && crafting_inv.has_tools( type, std::abs( count ) ) ) {
return "green";
} else if( by_charges() && crafting_inv.has_charges( type, count * batch ) ) {
return "green";
}
return has_one ? "dkgray" : "red";
}
示例8: check_enough_materials
bool requirements::check_enough_materials( const item_comp& comp, const inventory& crafting_inv ) const
{
if( comp.available != a_true ) {
return false;
}
const itype *it = item_controller->find_template( comp.type );
const tool_comp *tq = find_by_type( tools, comp.type );
if( tq != nullptr ) {
// The very same item type is also needed as tool!
// Use charges of it, or use it by count?
const int tc = tq->count < 0 ? std::abs( tq->count ) : 1;
// Check for components + tool count. Check item amount (excludes
// pseudo items) and tool amount (includes pseudo items)
// Imagine: required = 1 welder (component) + 1 welder (tool),
// available = 1 welder (real item), 1 welding rig (creates
// a pseudo welder item). has_components(welder,2) returns false
// as there is only one real welder available, but has_tools(welder,2)
// returns true.
// Keep in mind that both requirements (tool+component) are checked
// before this. That assures that one real item is actually available,
// two welding rigs (and no real welder) would make this component
// non-available even before this function is called.
// Only ammo and (some) food is counted by charges, both are unlikely
// to appear as tool, but it's possible /-:
bool has_comps;
if( it->count_by_charges() && comp.count > 0 ) {
has_comps = crafting_inv.has_charges( comp.type, comp.count + tc );
} else {
has_comps = crafting_inv.has_components( comp.type, abs( comp.count ) + tc );
}
if( !has_comps && !crafting_inv.has_tools( comp.type, comp.count + tc ) ) {
comp.available = a_insufficent;
}
}
for( const auto &ql : it->qualities ) {
const quality_requirement *qr = find_by_type( qualities, ql.first );
if( qr == nullptr || qr->level > ql.second ) {
continue;
}
// This item can be used for the quality requirement, same as above for specific
// tools applies.
if( !crafting_inv.has_items_with_quality( qr->type, qr->level, qr->count + abs(comp.count) ) ) {
comp.available = a_insufficent;
}
}
return comp.available == a_true;
}
示例9: has
bool tool_comp::has( const inventory &crafting_inv, int batch,
std::function<void( int )> visitor ) const
{
if( g->u.has_trait( trait_DEBUG_HS ) ) {
return true;
}
if( !by_charges() ) {
return crafting_inv.has_tools( type, std::abs( count ) );
} else {
int charges_found = crafting_inv.charges_of( type, count * batch );
if( charges_found == count * batch ) {
return true;
}
const auto &binned = crafting_inv.get_binned_items();
const auto iter = binned.find( type );
if( iter == binned.end() ) {
return false;
}
bool has_UPS = false;
for( const item *it : iter->second ) {
it->visit_items( [&has_UPS]( const item * e ) {
if( e->has_flag( "USE_UPS" ) ) {
has_UPS = true;
return VisitResponse::ABORT;
}
return VisitResponse::NEXT;
} );
}
if( has_UPS ) {
int UPS_charges_used =
crafting_inv.charges_of( "UPS", ( count * batch ) - charges_found );
if( visitor && UPS_charges_used + charges_found >= ( count * batch ) ) {
visitor( UPS_charges_used );
}
charges_found += UPS_charges_used;
}
return charges_found == count * batch;
}
}
示例10: can_disassemble
bool player::can_disassemble( const item &obj, const inventory &inv, std::string *err ) const
{
const auto error = [&err]( const std::string & message ) {
if( err != nullptr ) {
*err = message;
}
return false;
};
const auto &r = recipe_dictionary::get_uncraft( obj.typeId() );
if( !r ) {
return error( string_format( _( "You cannot disassemble this." ) ) );
}
// check sufficient light
if( lighting_craft_speed_multiplier( r ) == 0.0f ) {
return error( _( "You can't see to craft!" ) );
}
// refuse to disassemble rotten items
if( obj.goes_bad() || ( obj.is_food_container() && obj.contents.front().goes_bad() ) ) {
if( obj.rotten() || ( obj.is_food_container() && obj.contents.front().rotten() ) ) {
return error( _( "It's rotten, I'm not taking that apart." ) );
}
}
if( obj.count_by_charges() && !r.has_flag( "UNCRAFT_SINGLE_CHARGE" ) ) {
// Create a new item to get the default charges
int qty = r.create_result().charges;
if( obj.charges < qty ) {
auto msg = ngettext( "You need at least %d charge of %s.",
"You need at least %d charges of %s.", qty );
return error( string_format( msg, qty, obj.tname().c_str() ) );
}
}
const auto &dis = r.disassembly_requirements();
for( const auto &opts : dis.get_qualities() ) {
for( const auto &qual : opts ) {
if( !qual.has( inv ) ) {
// Here should be no dot at the end of the string as 'to_string()' provides it.
return error( string_format( _( "You need %s" ), qual.to_string().c_str() ) );
}
}
}
for( const auto &opts : dis.get_tools() ) {
const bool found = std::any_of( opts.begin(), opts.end(),
[&]( const tool_comp & tool ) {
return ( tool.count <= 0 && inv.has_tools( tool.type, 1 ) ) ||
( tool.count > 0 && inv.has_charges( tool.type, tool.count ) );
} );
if( !found ) {
if( opts.front().count <= 0 ) {
return error( string_format( _( "You need %s." ),
item::nname( opts.front().type ).c_str() ) );
} else {
return error( string_format( ngettext( "You need a %s with %d charge.",
"You need a %s with %d charges.",
opts.front().count ),
item::nname( opts.front().type ).c_str(), opts.front().count ) );
}
}
}
return true;
}
示例11: tmenu
comp_selection<tool_comp>
player::select_tool_component( const std::vector<tool_comp> &tools, int batch, inventory &map_inv,
const std::string &hotkeys, bool can_cancel )
{
comp_selection<tool_comp> selected;
bool found_nocharge = false;
std::vector<tool_comp> player_has;
std::vector<tool_comp> map_has;
// Use charges of any tools that require charges used
for( auto it = tools.begin(); it != tools.end() && !found_nocharge; ++it ) {
itype_id type = it->type;
if( it->count > 0 ) {
long count = it->count * batch;
if( has_charges( type, count ) ) {
player_has.push_back( *it );
}
if( map_inv.has_charges( type, count ) ) {
map_has.push_back( *it );
}
} else if( has_amount( type, 1 ) || map_inv.has_tools( type, 1 ) ) {
selected.comp = *it;
found_nocharge = true;
}
}
if( found_nocharge ) {
selected.use_from = use_from_none;
return selected; // Default to using a tool that doesn't require charges
}
if( player_has.size() + map_has.size() == 1 ) {
if( map_has.empty() ) {
selected.use_from = use_from_player;
selected.comp = player_has[0];
} else {
selected.use_from = use_from_map;
selected.comp = map_has[0];
}
} else { // Variety of options, list them and pick one
// Populate the list
uimenu tmenu( hotkeys );
for( auto &map_ha : map_has ) {
std::string tmpStr = item::nname( map_ha.type ) + _( " (nearby)" );
tmenu.addentry( tmpStr );
}
for( auto &player_ha : player_has ) {
tmenu.addentry( item::nname( player_ha.type ) );
}
if( tmenu.entries.empty() ) { // This SHOULD only happen if cooking with a fire,
selected.use_from = use_from_none;
return selected; // and the fire goes out.
}
if( can_cancel ) {
tmenu.addentry( -1, true, 'q', _( "Cancel" ) );
}
// Get selection via a popup menu
tmenu.title = _( "Use which tool?" );
tmenu.query();
if( tmenu.ret == static_cast<int>( map_has.size() + player_has.size() ) ) {
selected.use_from = cancel;
return selected;
}
size_t uselection = static_cast<size_t>( tmenu.ret );
if( uselection < map_has.size() ) {
selected.use_from = use_from_map;
selected.comp = map_has[uselection];
} else {
uselection -= map_has.size();
selected.use_from = use_from_player;
selected.comp = player_has[uselection];
}
}
return selected;
}