item Single_item_creator::create_single(int birthday, RecursionList &rec) const { item tmp; if (type == S_ITEM) { if (id == "corpse") { tmp = item::make_corpse( NULL_ID, birthday ); } else { tmp = item(id, birthday); } } else if (type == S_ITEM_GROUP) { if (std::find(rec.begin(), rec.end(), id) != rec.end()) { debugmsg("recursion in item spawn list %s", id.c_str()); return item(null_item_id, birthday); } rec.push_back(id); Item_spawn_data *isd = item_controller->get_group(id); if (isd == NULL) { debugmsg("unknown item spawn list %s", id.c_str()); return item(null_item_id, birthday); } tmp = isd->create_single(birthday, rec); rec.erase( rec.end() - 1 ); } else if (type == S_NONE) { return item(null_item_id, birthday); } if( one_in( 3 ) && tmp.has_flag( "VARSIZE" ) ) { tmp.item_tags.insert( "FIT" ); } if (modifier.get() != NULL) { modifier->modify(tmp); } // TODO: change the spawn lists to contain proper references to containers tmp = tmp.in_its_container(); return tmp; }
Item_spawn_data::ItemList Single_item_creator::create(int birthday, RecursionList &rec) const { ItemList result; int cnt = 1; if (modifier.get() != NULL) { cnt = (modifier->count.first == modifier->count.second) ? modifier->count.first : rng( modifier->count.first, modifier->count.second); } for( ; cnt > 0; cnt--) { if (type == S_ITEM) { result.push_back(create_single(birthday, rec)); } else { if (std::find(rec.begin(), rec.end(), id) != rec.end()) { debugmsg("recursion in item spawn list %s", id.c_str()); return result; } rec.push_back(id); Item_spawn_data *isd = item_controller->get_group(id); if (isd == NULL) { debugmsg("unknown item spawn list %s", id.c_str()); return result; } ItemList tmplist = isd->create(birthday, rec); if (modifier.get() != NULL) { for(ItemList::iterator a = tmplist.begin(); a != tmplist.end(); ++a) { modifier->modify(*a); } } result.insert(result.end(), tmplist.begin(), tmplist.end()); } } return result; }
bool Single_item_creator::remove_item(const Item_tag &itemid) { if (modifier.get() != NULL) { if (modifier->remove_item(itemid)) { type = S_NONE; return true; } } if (type == S_ITEM) { if (itemid == id) { type = S_NONE; return true; } } else if (type == S_ITEM_GROUP) { Item_spawn_data *isd = item_controller->get_group(id); if (isd != NULL) { isd->remove_item(itemid); } } return type == S_NONE; }
Item_spawn_data::ItemList Single_item_creator::create( const time_point &birthday, RecursionList &rec ) const { ItemList result; int cnt = 1; if( modifier ) { auto modifier_count = modifier->count; cnt = ( modifier_count.first == modifier_count.second ) ? modifier_count.first : rng( modifier_count.first, modifier_count.second ); } for( ; cnt > 0; cnt-- ) { if( type == S_ITEM ) { const auto itm = create_single( birthday, rec ); if( !itm.is_null() ) { result.push_back( itm ); } } else { if( std::find( rec.begin(), rec.end(), id ) != rec.end() ) { debugmsg( "recursion in item spawn list %s", id.c_str() ); return result; } rec.push_back( id ); Item_spawn_data *isd = item_controller->get_group( id ); if( isd == nullptr ) { debugmsg( "unknown item spawn list %s", id.c_str() ); return result; } ItemList tmplist = isd->create( birthday, rec ); rec.erase( rec.end() - 1 ); if( modifier ) { for( auto &elem : tmplist ) { modifier->modify( elem ); } } result.insert( result.end(), tmplist.begin(), tmplist.end() ); } } return result; }