public override ItemBase Clone(ItemBase itemToClone)
        {
            ItemTool itemTool = itemToClone as ItemTool;
            ItemTool newItem  = base.Clone(itemToClone) as ItemTool;

            if (newItem == null)
            {
                return(null);
            }
            newItem.Power         = itemTool.Power;
            newItem.Level         = itemTool.Level;
            newItem.UseInterval   = itemTool.UseInterval;
            newItem.MaxDistance   = itemTool.MaxDistance;
            newItem.EnergyCost    = itemTool.EnergyCost;
            newItem.PlayerTrigger = itemTool.PlayerTrigger;
            newItem.ToolTrigger   = itemTool.ToolTrigger;
            newItem.CropName      = itemTool.CropName;
            newItem.MaxCharge     = itemTool.MaxCharge;
            newItem.CurrentCharge = itemTool.CurrentCharge;
            newItem.UsedItems     = itemTool.UsedItems;
            newItem.Cursors       = itemTool.Cursors;
            if (itemTool.Controller != null)
            {
                newItem.Controller = itemTool.Controller;
            }



            return(newItem);
        }
        void PopulateObjects()
        {
            SpriteAtlas atlas = EditorGUIUtility.Load(AtlasPath) as SpriteAtlas;

            SetIndexes();

            for (int row = 2; row < Spreadsheet.RowCount; row++)
            {
                if (Spreadsheet.GetCell <string>(0, row) == string.Empty)
                {
                    continue;
                }
                int    ID                = -1;
                string itemName          = string.Empty;
                string description       = string.Empty;
                string iconName          = string.Empty;
                string spriteName        = string.Empty;
                float  value             = -1;
                int    markup            = -1;
                float  weight            = -1;
                string type              = string.Empty;
                bool   sellable          = false;
                bool   consumable        = false;
                bool   usableFromToolbar = false;
                Sprite itemIcon          = null;
                Sprite itemSprite        = null;
                bool   itemExists        = false;

                if (IDIndex != -1)
                {
                    ID = Spreadsheet.GetCell <int>(IDIndex, row);
                }
                if (NameIndex != -1)
                {
                    itemName = Spreadsheet.GetCell <string>(NameIndex, row);
                }
                if (DescriptionIndex != -1)
                {
                    description = Spreadsheet.GetCell <string>(DescriptionIndex, row);
                }
                if (IconNameIndex != -1)
                {
                    iconName = Spreadsheet.GetCell <string>(IconNameIndex, row);

                    string guid   = string.Empty;
                    Sprite sprite = null;

                    if (AssetDatabase.FindAssets(iconName, IconPaths).Length > 0)
                    {
                        guid = AssetDatabase.FindAssets(iconName, IconPaths)[0];
                    }

                    if (guid != string.Empty)
                    {
                        string path = AssetDatabase.GUIDToAssetPath(guid);
                        sprite = AssetDatabase.LoadAssetAtPath <Sprite>(path);
                    }

                    if (sprite != null)
                    {
                        itemIcon = sprite;
                    }
                }
                if (ValueIndex != -1)
                {
                    value = Spreadsheet.GetCell <float>(ValueIndex, row);
                }
                if (MarkupIndex != -1)
                {
                    markup = Spreadsheet.GetCell <int>(MarkupIndex, row);
                }
                if (WeightIndex != -1)
                {
                    weight = Spreadsheet.GetCell <float>(WeightIndex, row);
                }
                if (TypeIndex != -1)
                {
                    type = Spreadsheet.GetCell <string>(TypeIndex, row);
                }
                if (SellableIndex != -1)
                {
                    sellable = Spreadsheet.GetCell <bool>(SellableIndex, row);
                }
                if (ConsumableIndex != -1)
                {
                    consumable = Spreadsheet.GetCell <bool>(ConsumableIndex, row);
                }
                if (ToolbarIndex != -1)
                {
                    usableFromToolbar = Spreadsheet.GetCell <bool>(ToolbarIndex, row);
                }

                if (type != string.Empty)
                {
                    ItemBase item = null;
                    item = Items.Find(x => x.ID == ID);
                    switch (type)
                    {
                    case "Generic":
                    case "Recipe":
                        ItemBase newItem = null;

                        if (item != null)
                        {
                            itemExists = true;
                        }

                        if (itemExists == false)
                        {
                            newItem = ScriptableObject.CreateInstance <ItemBase>();
                        }
                        else
                        {
                            newItem = item;
                        }
                        ApplyGenericProperties(newItem, ID, itemName, description, itemIcon, value, markup, weight, sellable, consumable, usableFromToolbar, type);
                        if (itemExists == false)
                        {
                            Items.Add(newItem);
                            Debug.Log("Creating: " + itemName);
                            AssetDatabase.CreateAsset(newItem, ObjectPath + "/" + type + "/" + itemName + ".asset");
                        }
                        break;

                    case "Prop":
                        ItemProp newItemProp = null;
                        if (SpriteNameIndex != -1)
                        {
                            spriteName = Spreadsheet.GetCell <string>(SpriteNameIndex, row);
                        }
                        if (item != null)
                        {
                            itemExists = true;
                        }
                        if (itemExists == false)
                        {
                            newItemProp = ScriptableObject.CreateInstance <ItemProp>();
                        }
                        else
                        {
                            newItemProp = item as ItemProp;
                        }
                        ApplyGenericProperties(newItemProp, ID, itemName, description, itemIcon, value, markup, weight, sellable, consumable, usableFromToolbar, type);
                        newItemProp.PropSprite = itemSprite;
                        if (itemExists == false)
                        {
                            Items.Add(newItemProp);
                            AssetDatabase.CreateAsset(newItemProp, ObjectPath + "/" + type + "/" + itemName + ".asset");
                        }
                        break;

                    case "Food":
                        float energyRegen = -1;
                        bool  edible      = false;
                        bool  blossomFeed = false;
                        if (EnergyRegenIndex != -1)
                        {
                            energyRegen = Spreadsheet.GetCell <float>(EnergyRegenIndex, row);
                        }
                        if (FoodEdibleIndex != -1)
                        {
                            edible = Spreadsheet.GetCell <bool>(FoodEdibleIndex, row);
                        }
                        if (BlossomFeedIndex != -1)
                        {
                            blossomFeed = Spreadsheet.GetCell <bool>(BlossomFeedIndex, row);
                        }

                        ItemFood newItemFood = null;
                        if (item != null)
                        {
                            itemExists = true;
                        }
                        if (itemExists == false)
                        {
                            newItemFood = ScriptableObject.CreateInstance <ItemFood>();
                        }
                        else
                        {
                            newItemFood = item as ItemFood;
                        }
                        ApplyGenericProperties(newItemFood, ID, itemName, description, itemIcon, value, markup, weight, sellable, consumable, usableFromToolbar, type);
                        newItemFood.EnergyRegen = energyRegen;
                        newItemFood.Edible      = edible;
                        newItemFood.BlossomFeed = blossomFeed;

                        if (itemExists == false)
                        {
                            Items.Add(newItemFood);
                            AssetDatabase.CreateAsset(newItemFood, ObjectPath + "/" + type + "/" + itemName + ".asset");
                        }
                        break;

                    case "Tool":
                        float  power         = -1;
                        int    level         = -1;
                        float  useInterval   = -1;
                        float  energyCost    = -1;
                        string playerTrigger = string.Empty;
                        string toolTrigger   = string.Empty;
                        int    toolMaxCharge = -1;
                        string cropName      = string.Empty;
                        if (PowerIndex != -1)
                        {
                            power = Spreadsheet.GetCell <float>(PowerIndex, row);
                        }
                        if (LevelIndex != -1)
                        {
                            level = Spreadsheet.GetCell <int>(LevelIndex, row);
                        }
                        if (IntervalIndex != -1)
                        {
                            useInterval = Spreadsheet.GetCell <float>(IntervalIndex, row);
                        }
                        if (EnergyCostIndex != -1)
                        {
                            energyCost = Spreadsheet.GetCell <float>(EnergyCostIndex, row);
                        }
                        if (PlayerTriggerIndex != -1)
                        {
                            playerTrigger = Spreadsheet.GetCell <string>(PlayerTriggerIndex, row);
                        }
                        if (ToolTriggerIndex != -1)
                        {
                            toolTrigger = Spreadsheet.GetCell <string>(ToolTriggerIndex, row);
                        }
                        if (ToolMaxChargeIndex != -1)
                        {
                            toolMaxCharge = Spreadsheet.GetCell <int>(ToolMaxChargeIndex, row);
                        }
                        if (CropNameIndex != -1)
                        {
                            cropName = Spreadsheet.GetCell <string>(CropNameIndex, row);
                        }


                        ItemTool newItemTool = null;
                        if (item != null)
                        {
                            itemExists = true;
                        }
                        if (itemExists == false)
                        {
                            newItemTool = ScriptableObject.CreateInstance <ItemTool>();
                        }
                        else
                        {
                            newItemTool = item as ItemTool;
                        }
                        ApplyGenericProperties(newItemTool, ID, itemName, description, itemIcon, value, markup, weight, sellable, consumable, usableFromToolbar, type);

                        newItemTool.Power         = power;
                        newItemTool.Level         = level;
                        newItemTool.UseInterval   = useInterval;
                        newItemTool.EnergyCost    = energyCost;
                        newItemTool.PlayerTrigger = playerTrigger;
                        newItemTool.ToolTrigger   = toolTrigger;
                        newItemTool.MaxCharge     = toolMaxCharge;
                        newItemTool.CurrentCharge = newItemTool.MaxCharge;
                        newItemTool.CropName      = cropName;
                        if (itemExists == false)
                        {
                            Items.Add(newItemTool);
                            AssetDatabase.CreateAsset(newItemTool, ObjectPath + "/" + type + "/" + itemName + ".asset");
                        }
                        break;

                    case "Bottle":
                        int bottleMaxCharge = -1;
                        if (BottleMaxChargeIndex != -1)
                        {
                            bottleMaxCharge = Spreadsheet.GetCell <int>(BottleMaxChargeIndex, row);
                        }

                        ItemBottle newItemBottle = null;
                        if (item != null)
                        {
                            itemExists = true;
                        }
                        if (itemExists == false)
                        {
                            newItemBottle = ScriptableObject.CreateInstance <ItemBottle>();
                        }
                        else
                        {
                            newItemBottle = item as ItemBottle;
                        }
                        ApplyGenericProperties(newItemBottle, ID, itemName, description, itemIcon, value, markup, weight, sellable, consumable, usableFromToolbar, type);

                        newItemBottle.MaxCharge     = bottleMaxCharge;
                        newItemBottle.CurrentCharge = newItemBottle.MaxCharge;

                        if (itemExists == false)
                        {
                            Items.Add(newItemBottle);
                            AssetDatabase.CreateAsset(newItemBottle, ObjectPath + "/" + type + "/" + itemName + ".asset");
                        }
                        break;

                    case "Material":
                        float burnTime = -1;
                        if (BurnTimeIndex != -1)
                        {
                            burnTime = Spreadsheet.GetCell <float>(BurnTimeIndex, row);
                        }

                        ItemMaterial newItemMat = null;
                        if (item != null)
                        {
                            itemExists = true;
                        }
                        if (itemExists == false)
                        {
                            newItemMat = ScriptableObject.CreateInstance <ItemMaterial>();
                        }
                        else
                        {
                            newItemMat = item as ItemMaterial;
                        }
                        ApplyGenericProperties(newItemMat, ID, itemName, description, itemIcon, value, markup, weight, sellable, consumable, usableFromToolbar, type);

                        newItemMat.BurnTime = burnTime;
                        if (itemExists == false)
                        {
                            Items.Add(newItemMat);
                            AssetDatabase.CreateAsset(newItemMat, ObjectPath + "/" + type + "/" + itemName + ".asset");
                        }
                        break;

                    default:
                        break;
                    }
                }
            }
            AssetDatabase.SaveAssets();
            AssetDatabase.Refresh();
        }