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.

147 lines
4.3 KiB

  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. /// <summary>
  5. /// Class which reads a a list of logic blocks and applies to a character
  6. /// </summary>
  7. [System.Serializable]
  8. public class BlockReader
  9. {
  10. #region Inspector Variables
  11. [SerializeField]
  12. [Tooltip("List of LogicBlocks which will affected this character")]
  13. public List<LogicBlock> LogicChain = new List<LogicBlock>();
  14. #endregion Inspector Variables
  15. #region Read-only Variables
  16. /// <summary>
  17. /// returns true if all LogicBlocks in LogicChain have been completed
  18. /// </summary>
  19. public bool Finished { get { return currentBlockIndex >= LogicChain.Count; } }
  20. /// <summary>
  21. /// Fired whenever the logic chain is updated, useful for UI
  22. /// </summary>
  23. public event System.Action OnUpdate;
  24. /// <summary>
  25. /// Gets the current block in the logic chain
  26. /// </summary>
  27. public LogicBlock CurrentBlock { get { return ((currentBlockIndex < LogicChain.Count) ? LogicChain[currentBlockIndex] : null); } }
  28. /// <summary>
  29. /// Sum of size of all Blocks in the chain
  30. /// </summary>
  31. public int Length { get { int retVal = 0; LogicChain.ForEach(p => retVal += p.Size()); return retVal; } }
  32. #endregion Read-only Variables
  33. #region Private Variables
  34. private int currentBlockIndex;//Block currently on
  35. #endregion Private Variables
  36. #region Class Implementation
  37. /// <summary>
  38. /// Resets Block reader;
  39. /// </summary>
  40. public void Reset()
  41. {
  42. currentBlockIndex = 0;
  43. }
  44. /// <summary>
  45. /// Reads the current block in the logic chain
  46. /// </summary>
  47. /// <param name="character">Character to control</param>
  48. /// <returns>Returns false if other readers should wait for this one to run again</returns>
  49. public bool Read(Character character,float speedMultiplier, out float TotalAnimationTime)
  50. {
  51. //If the character has become stuck, they forfeit their remaining moves - we skip directly to their end of their chain
  52. if (character.stuck == true)
  53. {
  54. Debug.Log("Character is stuck! No moving!");
  55. TotalAnimationTime = 0;
  56. //return true;
  57. currentBlockIndex = LogicChain.Count;
  58. }
  59. else
  60. {
  61. Debug.Log("Character is not stuck");
  62. }
  63. //return that this is done if no more blocks left in chain
  64. if (LogicChain.Count <= currentBlockIndex)
  65. {
  66. TotalAnimationTime = 0;
  67. return true;
  68. }
  69. //get current Block
  70. LogicBlock currentBlock = LogicChain[currentBlockIndex];
  71. //apply blocks to character
  72. bool runAgainNot = currentBlock.Run(character, speedMultiplier,out TotalAnimationTime);
  73. //if the block is finished reset it and move on to next one
  74. //(it might not be finished if it is a for loop or something)
  75. bool isFinished = currentBlock.isFinished();
  76. if (isFinished)
  77. {
  78. currentBlock.Reset();
  79. currentBlockIndex++;
  80. }
  81. //Should other readers wait for this one
  82. return (runAgainNot || !currentBlock.WaitUntilFinished);
  83. }
  84. /// <summary>
  85. /// Clears all elements out of the Block Reader
  86. /// </summary>
  87. public void Clear()
  88. {
  89. LogicChain.Clear();
  90. if (OnUpdate != null)
  91. OnUpdate.Invoke();
  92. }
  93. /// <summary>
  94. /// Removes the first instance found in the Block Reader
  95. /// </summary>
  96. /// <param name="item">LogicElement to remove</param>
  97. public void Remove(LogicBlock item)
  98. {
  99. LogicChain.Remove(item);
  100. if (OnUpdate != null)
  101. OnUpdate.Invoke();
  102. }
  103. /// <summary>
  104. /// Addes item to the end of the BlockReader
  105. /// </summary>
  106. /// <param name="item">item to add</param>
  107. public void Add(LogicBlock item)
  108. {
  109. LogicChain.Add(item);
  110. if (OnUpdate != null)
  111. OnUpdate.Invoke();
  112. }
  113. /// <summary>
  114. /// Inserts item at index of the Block Reader
  115. /// </summary>
  116. /// <param name="index">index to insert at</param>
  117. /// <param name="item">item to insert</param>
  118. public void Insert(int index, LogicBlock item)
  119. {
  120. LogicChain.Insert(index, item);
  121. if (OnUpdate != null)
  122. OnUpdate.Invoke();
  123. }
  124. #endregion
  125. }