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.

112 lines
3.4 KiB

4 years ago
4 years ago
  1. using System.Collections;
  2. using UnityEngine;
  3. [CreateAssetMenu(menuName = "Major Project/Combined Block")]
  4. [System.Serializable]
  5. public class CombinedBlock : LogicBlock
  6. {
  7. #region Inspector Variables
  8. [SerializeField]
  9. [Tooltip("Blocks this will run through")]
  10. public BlockReader blockReader = new BlockReader();
  11. #endregion Inspector Variables
  12. #region ReadOnly Variables
  13. public override bool WaitUntilFinished { get { if (blockReader != null && blockReader.CurrentBlock != null) return (blockReader.CurrentBlock.WaitUntilFinished || base.WaitUntilFinished); else return base.WaitUntilFinished; } }
  14. #endregion
  15. public override IEnumerator Run(Character player, float animationTime, bool useBlockDirection = false)
  16. {
  17. BlockLogic(player,animationTime);
  18. if (WaitUntilFinished)
  19. {
  20. for (int i = 0; i < blockReader.Length; i++)
  21. {
  22. yield return player.StartCoroutine(blockReader.Read(player, animationTime / SpeedMultiplier));
  23. }
  24. }
  25. else
  26. {
  27. yield return player.StartCoroutine(blockReader.Read(player, animationTime / SpeedMultiplier));
  28. }
  29. if (blockReader.Finished)
  30. {
  31. blockReader.Reset();
  32. RepeatCount++;
  33. }
  34. }
  35. protected override IEnumerator BlockLogic(Character player, float animationTime, bool useBlockDirection = false)
  36. {
  37. yield break;
  38. }
  39. /// <summary>
  40. /// Returns the block that the character will endUp on after they use this logic element
  41. /// </summary>
  42. /// <param name="startBlock">block character is on</param>
  43. /// <param name="layerMask">layers to ignore</param>
  44. /// <returns>block which character will finish on after performing this function </returns>
  45. public override Block GetEndBlock(Block startBlock, Transform transform, LayerMask layerMask)
  46. {
  47. return blockReader.CurrentBlock.GetEndBlock(startBlock, transform, layerMask);
  48. }
  49. /// <summary>
  50. /// Resets the block to be ready to used again
  51. /// </summary>
  52. public override void Reset()
  53. {
  54. base.Reset();
  55. blockReader.Reset();
  56. }
  57. public override LogicBlock Clone()
  58. {
  59. CombinedBlock retVal = base.Clone() as CombinedBlock;
  60. retVal.blockReader = new BlockReader();
  61. foreach (LogicBlock block in blockReader.LogicChain)
  62. retVal.blockReader.Add(block.Clone());
  63. return retVal;
  64. }
  65. #region Serialisation Functions
  66. public override void CopyToken(BlockToken token)
  67. {
  68. base.CopyToken(token);
  69. blockReader = new BlockReader();
  70. foreach (BlockToken subToken in ((CombinedToken)token).subBlocks)
  71. blockReader.Add(subToken.ToLogicBlock());
  72. }
  73. public override BlockToken ToToken(BlockToken token = null)
  74. {
  75. if (token == null)
  76. token = new CombinedToken(this);
  77. CombinedToken retVal = (CombinedToken)base.ToToken(token);
  78. retVal.subBlocks = new BlockToken[blockReader.LogicChain.Count];
  79. for (int i = 0; i < retVal.subBlocks.Length; i++)
  80. retVal.subBlocks[i] = blockReader.LogicChain[i].ToToken();
  81. return retVal;
  82. }
  83. #endregion Serialisation Functions
  84. }
  85. [System.Serializable]
  86. public class CombinedToken : BlockToken
  87. {
  88. public BlockToken[] subBlocks;
  89. public CombinedToken(LogicBlock block) : base(block)
  90. {
  91. }
  92. }