item *inventory::most_loaded_gun() { item *ret = &null_item_reference(); int max = 0; for( auto &elem : items ) { item &gun = elem.front(); if( !gun.is_gun() ) { continue; } const auto required = gun.ammo_required(); int cur = 0; if( required <= 0 ) { // Arbitrary cur = 5; } else { cur = gun.ammo_remaining() / required; } if( cur > max ) { ret = &gun; max = cur; } } return ret; }
item *inventory::most_appropriate_painkiller( int pain ) { int difference = 9999; item *ret = &null_item_reference(); for( auto &elem : items ) { int diff = 9999; itype_id type = elem.front().typeId(); if( type == "aspirin" ) { diff = abs( pain - 15 ); } else if( type == "codeine" ) { diff = abs( pain - 30 ); } else if( type == "oxycodone" ) { diff = abs( pain - 60 ); } else if( type == "heroin" ) { diff = abs( pain - 100 ); } else if( type == "tramadol" ) { diff = abs( pain - 40 ) / 2; // Bonus since it's long-acting } if( diff < difference ) { difference = diff; ret = &( elem.front() ); } } return ret; }
const item &inventory::find_item( int position ) const { if( position < 0 || position >= static_cast<int>( items.size() ) ) { return null_item_reference(); } invstack::const_iterator iter = items.begin(); for( int j = 0; j < position; ++j ) { ++iter; } return iter->front(); }
item *inventory::best_for_melee( player &p, double &best ) { item *ret = &null_item_reference(); for( auto &elem : items ) { auto score = p.melee_value( elem.front() ); if( score > best ) { best = score; ret = &( elem.front() ); } } return ret; }
item &item_at( player &p, int pos, inventory_location loc ) { switch( loc ) { case GROUND: return g->m.i_at( p.pos() )[pos]; case INVENTORY: return p.i_at( pos ); case WORN: return p.i_at( -2 - pos ); case WIELDED_OR_WORN: return p.i_at( -1 - pos ); default: FAIL( "unimplemented" ); break; } return null_item_reference(); }