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.

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