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.

134 lines
3.5 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 Private Variables
  17. public override int Size()
  18. {
  19. if (!isEditable)
  20. return 1;
  21. int retVal = 1;
  22. foreach(LogicBlock block in blockReader.LogicChain)
  23. retVal += block.Size();
  24. return retVal;
  25. }
  26. #endregion Private Variables
  27. public override bool Run(Character player, float animationTime)
  28. {
  29. BlockLogic(player,animationTime);
  30. if (blockReader.Finished)
  31. {
  32. blockReader.Reset();
  33. RepeatCount++;
  34. }
  35. return isFinished();
  36. }
  37. protected override void BlockLogic(Character player, float animationTime)
  38. {
  39. blockReader.Read(player,animationTime);
  40. }
  41. /// <summary>
  42. /// Returns the block that the character will endUp on after they use this logic element
  43. /// </summary>
  44. /// <param name="startBlock">block character is on</param>
  45. /// <param name="layerMask">layers to ignore</param>
  46. /// <returns>block which character will finish on after performing this function </returns>
  47. public override Block GetEndBlock(Block startBlock, Transform transform, LayerMask layerMask)
  48. {
  49. return blockReader.CurrentBlock.GetEndBlock(startBlock, transform, layerMask);
  50. }
  51. /// <summary>
  52. /// Resets the block to be ready to used again
  53. /// </summary>
  54. public override void Reset()
  55. {
  56. base.Reset();
  57. blockReader.Reset();
  58. }
  59. public override LogicBlock[] GetAllBlocks()
  60. {
  61. if (!isEditable)
  62. return new LogicBlock[] { this };
  63. List<LogicBlock> retVal = new List<LogicBlock>();
  64. retVal.Add(this);
  65. foreach (LogicBlock block in blockReader.LogicChain)
  66. retVal.AddRange(block.GetAllBlocks());
  67. return retVal.ToArray();
  68. }
  69. public override LogicBlock Clone()
  70. {
  71. CombinedBlock retVal = base.Clone() as CombinedBlock;
  72. retVal.blockReader = new BlockReader();
  73. foreach (LogicBlock block in blockReader.LogicChain)
  74. retVal.blockReader.Add(block.Clone());
  75. return retVal;
  76. }
  77. #region Serialisation Functions
  78. public override void CopyToken(BlockToken token)
  79. {
  80. base.CopyToken(token);
  81. blockReader = new BlockReader();
  82. foreach (BlockToken subToken in ((CombinedToken)token).subBlocks)
  83. blockReader.Add(subToken.ToLogicBlock());
  84. }
  85. public override BlockToken ToToken(BlockToken token = null)
  86. {
  87. if (token == null)
  88. token = new CombinedToken(this);
  89. CombinedToken retVal = (CombinedToken)base.ToToken(token);
  90. retVal.subBlocks = new BlockToken[blockReader.LogicChain.Count];
  91. for (int i = 0; i < retVal.subBlocks.Length; i++)
  92. retVal.subBlocks[i] = blockReader.LogicChain[i].ToToken();
  93. return retVal;
  94. }
  95. #endregion Serialisation Functions
  96. }
  97. [System.Serializable]
  98. public class CombinedToken : BlockToken
  99. {
  100. public BlockToken[] subBlocks;
  101. public CombinedToken(LogicBlock block) : base(block)
  102. {
  103. }
  104. }