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( 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; }