bool sort_compare( const item_location &lhs, const item_location &rhs ) const override {
        const auto a = get_odds( lhs );
        const auto b = get_odds( rhs );

        if( a.first > b.first || ( a.first == b.first && a.second < b.second ) ) {
            return true;
        }

        return inventory_selector_preset::sort_compare( lhs, rhs );
    }
        gunmod_inventory_preset( const player &p, const item &gunmod ) : p( p ), gunmod( gunmod ) {
            append_cell( [ this ]( const item_location & loc ) {
                const auto odds = get_odds( loc );

                if( odds.first >= 100 ) {
                    return string_format( "<color_light_green>%s</color>", _( "always" ) );
                }

                return string_format( "<color_light_green>%d%%</color>", odds.first );
            }, _( "SUCCESS CHANCE" ) );

            append_cell( [ this ]( const item_location & loc ) {
                return good_bad_none( get_odds( loc ).second );
            }, _( "DAMAGE RISK" ) );
        }
    std::string get_denial( const item_location &loc ) const override {
        std::string incompatability;

        if( !loc->gunmod_compatible( gunmod, &incompatability ) ) {
            return incompatability;
        }

        if( !p.meets_requirements( gunmod, *loc ) ) {
            return string_format( _( "requires at least %s" ),
                                  p.enumerate_unmet_requirements( gunmod, *loc ).c_str() );
        }

        if( get_odds( loc ).first <= 0 ) {
            return _( "is too difficult for you to modify" );
        }

        return std::string();
    }
        std::string get_denial( const item_location &loc ) const override {
            const auto ret = loc->is_gunmod_compatible( gunmod );

            if( !ret.success() ) {
                return ret.str();
            }

            if( !p.meets_requirements( gunmod, *loc ) ) {
                return string_format( _( "requires at least %s" ),
                                      p.enumerate_unmet_requirements( gunmod, *loc ).c_str() );
            }

            if( get_odds( loc ).first <= 0 ) {
                return _( "is too difficult for you to modify" );
            }

            return std::string();
        }