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.

120 lines
3.3 KiB

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