WearerPtr Wearer::create(DescriptionPtr dsc) { /* REMEBER TO UPDATE CLONE, WHEN ADDING NEW ELEMENTS */ WearerPtr w = nullptr; WearerDescriptionPtr wearerDsc = std::dynamic_pointer_cast<WearerDescription>(dsc); if ( wearerDsc != nullptr ) { w.reset( new Wearer ); wearerDsc->eqItems->maxSize = wearerDsc->itemSlots.size(); std::for_each(wearerDsc->itemSlots.begin(), wearerDsc->itemSlots.end(), [&](ItemSlotType slot) { w->_itemSlots[slot] = nullptr; }); w->_equippedItems = Container::create(wearerDsc->eqItems); if ( w->_equippedItems ) { assignItemsToSlots( w ); } }else throw creation_error("Wrong wearer description!"); return w; }
ActorFeaturePtr Wearer::clone() { WearerPtr cloned( new Wearer ); for(auto i : _itemSlots) { cloned->_itemSlots[ i.first ] = nullptr; } cloned->_equippedItems = std::dynamic_pointer_cast<Container>(_equippedItems->clone()); assignItemsToSlots(cloned); return cloned; }
Wearer::Wearer(DescriptionPtr dsc) : _equippedItems( new ActorContainer ) { upgrade(dsc); if ( _equippedItems ) assignItemsToSlots(); }