item &inventory::add_item(item newit, bool keep_invlet, bool assign_invlet) { bool reuse_cached_letter = false; // Check how many stacks of this type already are in our inventory. if(!keep_invlet && assign_invlet) { // Do we have this item in our inventory favourites cache? char temp_invlet = get_invlet_for_item( newit.typeId() ); if( temp_invlet != 0 ) { newit.invlet = temp_invlet; reuse_cached_letter = true; } // If it's not in our cache and not a lowercase letter, try to give it a low letter. if(!reuse_cached_letter && (newit.invlet < 'a' || newit.invlet > 'z')) { assign_empty_invlet(newit); } // Make sure the assigned invlet doesn't exist already. if(this == &g->u.inv && g->u.invlet_to_position(newit.invlet) != INT_MIN) { assign_empty_invlet(newit); } } // See if we can't stack this item. for (invstack::iterator iter = items.begin(); iter != items.end(); ++iter) { std::list<item>::iterator it_ref = iter->begin(); if( it_ref->stacks_with( newit ) ) { if( it_ref->merge_charges( newit ) ) { return *it_ref; } newit.invlet = it_ref->invlet; iter->push_back( newit ); return iter->back(); } else if( keep_invlet && assign_invlet && it_ref->invlet == newit.invlet ) { // If keep_invlet is true, we'll be forcing other items out of their current invlet. assign_empty_invlet(*it_ref); } } // Couldn't stack the item, proceed. if(!reuse_cached_letter) { update_cache_with_item(newit); } std::list<item> newstack; newstack.push_back(newit); items.push_back(newstack); return items.back().back(); }
item& inventory::add_item(item newit, bool keep_invlet, bool assign_invlet) { //dprint("inv.add_item(%d): [%c] %s", keep_invlet, newit.invlet, newit.typeId().c_str() ); bool reuse_cached_letter = false; // Check how many stacks of this type already are in our inventory. if(!keep_invlet && assign_invlet) { // Do we have this item in our inventory favourites cache? char temp_invlet = get_invlet_for_item( newit.typeId() ); if( temp_invlet != 0 ) { newit.invlet = temp_invlet; reuse_cached_letter = true; } // If it's not in our cache and not a lowercase letter, try to give it a low letter. if(!reuse_cached_letter && (newit.invlet < 'a' || newit.invlet > 'z')) { assign_empty_invlet(newit); } // Make sure the assigned invlet doesn't exist already. if(g->u.has_item(newit.invlet)) { assign_empty_invlet(newit); } } // See if we can't stack this item. for (invstack::iterator iter = items.begin(); iter != items.end(); ++iter) { std::list<item>::iterator it_ref = iter->begin(); if (it_ref->type->id == newit.type->id) { if (newit.charges != -1 && (newit.is_food() || newit.is_ammo())) { it_ref->charges += newit.charges; return *it_ref; } else if (it_ref->stacks_with(newit)) { if (it_ref->is_food() && it_ref->has_flag("HOT")) { int tmpcounter = (it_ref->item_counter + newit.item_counter) / 2; it_ref->item_counter = tmpcounter; newit.item_counter = tmpcounter; } newit.invlet = it_ref->invlet; iter->push_back(newit); return iter->back(); } else if (keep_invlet && assign_invlet && it_ref->invlet == newit.invlet) { assign_empty_invlet(*it_ref); } } // If keep_invlet is true, we'll be forcing other items out of their current invlet. else if (keep_invlet && assign_invlet && it_ref->invlet == newit.invlet) { assign_empty_invlet(*it_ref); } } // Couldn't stack the item, proceed. if(!reuse_cached_letter) { update_cache_with_item(newit); } std::list<item> newstack; newstack.push_back(newit); items.push_back(newstack); return items.back().back(); }