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 ); } }
item_action_map item_action_generator::map_actions_to_items( player &p ) const { return map_actions_to_items( p, std::vector<item *>() ); }