You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

106 lines
2.6 KiB

5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
  1. using System.Linq;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. [CreateAssetMenu(menuName = "Major Project/Inventory", order = 150)]
  5. public class Inventory : ScriptableObject
  6. {
  7. public string test;
  8. public List<Data> BagItems { get { if (_bagItems == null) _bagItems = new List<Data>(); return _bagItems; } }
  9. [SerializeField]
  10. protected List<Data> _bagItems = new List<Data>();
  11. public System.Action OnItemsUpdated;
  12. public void Add(LogicBlock element, int count = 1, bool isInfinit = false)
  13. {
  14. Data data = new Data
  15. {
  16. element = element,
  17. Count = count,
  18. isInfinit = isInfinit
  19. };
  20. Add(data);
  21. }
  22. public void Add(Data data)
  23. {
  24. if (_bagItems.Exists(p => p.element.isSameType(data.element)))
  25. {
  26. Data bagData = BagItems.Find(p => p.element.isSameType(data.element));
  27. bagData.Count += data.Count;
  28. bagData.isInfinit = (data.isInfinit || bagData.isInfinit);
  29. }
  30. else
  31. _bagItems.Add(data);
  32. OnItemsUpdated?.Invoke();
  33. }
  34. public void Remove(LogicBlock element)
  35. {
  36. if (!_bagItems.Exists(p => p.element.isSameType(element)))
  37. {
  38. return;
  39. }
  40. Data data = _bagItems.First(p => p.element.isSameType(element));
  41. if (!data.isInfinit)
  42. {
  43. if (data.Count > data.minCount)
  44. data.Count--;
  45. if (data.Count <= 0)
  46. _bagItems.Remove(data);
  47. }
  48. OnItemsUpdated?.Invoke();
  49. }
  50. public void Reset()
  51. {
  52. _bagItems = new List<Data>();
  53. OnItemsUpdated = null;
  54. }
  55. public void SetItems(Data[] bagItems)
  56. {
  57. _bagItems = new List<Data>(bagItems);
  58. OnItemsUpdated?.Invoke();
  59. }
  60. public static Inventory Clone(Inventory copy)
  61. {
  62. Inventory retVal = ScriptableObject.CreateInstance<Inventory>();
  63. retVal._bagItems = new List<Data>();
  64. foreach (Data data in copy.BagItems)
  65. {
  66. Data dataCopy = new Data(data.element, data.Count, data.isInfinit,data.minCount);
  67. retVal._bagItems.Add(dataCopy);
  68. }
  69. return retVal;
  70. }
  71. [System.Serializable]
  72. public class Data
  73. {
  74. public LogicBlock element;
  75. public int Count;
  76. public int minCount;
  77. public bool isInfinit = false;
  78. public Data() { }
  79. public Data(LogicBlock element, int Count, bool isInfinit, int minCount = 0)
  80. {
  81. this.element = element;
  82. this.Count = Count;
  83. this.isInfinit = isInfinit;
  84. this.minCount = minCount;
  85. }
  86. }
  87. }