private void DropNormal(GameObject target)
        {
            // no target no rockenroll
            if (target == null)
            {
                return;
            }

            Slot targetSlot = target.GetComponentInParent <Slot>();

            // same slot no rockenroll
            if (targetSlot == slot)
            {
                return;
            }

            ItemHolder    targetHolder = target.GetComponentInParent <ItemHolder>();
            StackableItem targetItem   = targetHolder.GetItem();

            // if target item is same type (add)
            if (targetItem != null && item.item.name == targetItem.item.name)
            {
                // Add amount
                int remaining = targetItem.AddAmount(item.Amount);

                // Remaining back
                item.Amount = remaining;

                targetHolder.SetItem(targetItem);

                if (remaining > 0)
                {
                    holder.SetItem(item);
                }
                else
                {
                    // nothing left
                    item = null;
                    holder.SetItem(null);
                }
            }
            else
            {
                // swap entire items
                holder.SetItem(targetItem);
                targetHolder.SetItem(item);
            }
        }
        private void DropSplit(GameObject target)
        {
            if (target == null)
            {
                // invalid middle drop, revert amount back
                StackableItem holdItem = placeHolder.GetComponent <ItemHolder>().GetItem();
                item.Amount += holdItem.Amount;
                return;
            }

            Slot targetSlot = target.GetComponentInParent <Slot>();

            if (targetSlot == slot)
            {
                // middle drop back to position, revert amount back
                StackableItem holdItem = placeHolder.GetComponent <ItemHolder>().GetItem();
                item.Amount += holdItem.Amount;
                return;
            }

            ItemHolder    targetHolder = target.GetComponentInParent <ItemHolder>();
            StackableItem targetItem   = targetHolder.GetItem();

            // if target item is same type (add)
            if (targetItem != null && item.item.name == targetItem.item.name)
            {
                // Add amount
                int remaining = targetItem.AddAmount(item.Amount);

                // Remaining add to placeholder (stand still on place)
                StackableItem holdItem = placeHolder.GetComponent <ItemHolder>().GetItem();
                holdItem.Amount += remaining;

                targetHolder.SetItem(targetItem);

                if (holdItem.Amount > 0)
                {
                    holder.SetItem(holdItem);
                }
                else
                {
                    // nothing left
                    item = null;
                    holder.SetItem(null);
                }
            }
            else
            {
                if (targetItem == null)
                {
                    holder.SetItem(placeHolder.GetComponent <ItemHolder>().GetItem());
                    targetHolder.SetItem(item);
                }
                else
                {
                    // drop is invalid, revert amount back
                    StackableItem holdItem = placeHolder.GetComponent <ItemHolder>().GetItem();
                    item.Amount += holdItem.Amount;
                    holder.SetItem(item);
                }
            }
        }