Пример #1
0
void game::item_action_menu()
{
    item_action_map iactions = map_actions_to_items( u );
    if( iactions.empty() ) {
        popup( _("You don't have any items with registered uses") );
    }

    uimenu kmenu;
    kmenu.text = _( "Execute which action?" );
    input_context ctxt("ITEM_ACTIONS");
    actmenu_cb callback;
    kmenu.callback = &callback;
    int num = 0;
    for( auto &p : iactions ) {
        it_tool *tool = dynamic_cast<it_tool*>( p.second->type );
        int would_use_charges = tool == nullptr ? 0 : tool->charges_per_use;
        
        std::stringstream ss;
        ss << _( item_actions[p.first].name.c_str() ) << " [" << p.second->type_name( 1 );
        if( would_use_charges > 0 ) {
            ss << " (" << would_use_charges << '/' << p.second->charges << ')';
        }
        ss << "]";
        
        char bind = key_bound_to( ctxt, p.first );
        kmenu.addentry( num, true, bind, ss.str() );
        num++;
    }

    std::set< item_action_id > itemless;
    for( auto &p : item_actions ) {
        if( iactions.find( p.first ) == iactions.end() ) {
            char bind = key_bound_to( ctxt, p.first );
            kmenu.addentry( num, false, bind, _( item_actions[p.first].name.c_str() ) );
            num++;
        }
    }
    
    kmenu.addentry( num, true, key_bound_to( ctxt, "QUIT" ), _("Cancel") );

    kmenu.query();
    if( kmenu.ret < 0 || kmenu.ret >= (int)iactions.size() ) {
        return;
    }
    
    auto iter = iactions.begin();
    for( int i = 0; i < kmenu.ret; i++) {
        iter++;
    }
    int invpos = u.inv.position_by_item( iter->second );
    draw_ter();
    if( invpos != INT_MIN ) {
        u.use( invpos );
    }
}
Пример #2
0
item_action_map item_action_generator::map_actions_to_items( player &p ) const
{
    return map_actions_to_items( p, std::vector<item *>() );
}