using System.Collections;
|
|
using System.Collections.Generic;
|
|
using UnityEngine;
|
|
|
|
/// <summary>
|
|
/// Base class all logic blocks are derived from
|
|
/// </summary>
|
|
[System.Serializable]
|
|
public abstract class LogicBlock : ScriptableObject
|
|
{
|
|
|
|
#region Inspector Fields
|
|
[SerializeField]
|
|
[Header("UI Settings")]
|
|
[Tooltip("Color which will identify this element")]
|
|
public Color Color;
|
|
|
|
[SerializeField]
|
|
[Tooltip("Name which will appear in the UI")]
|
|
protected string _DisplayName;
|
|
|
|
[SerializeField]
|
|
[Header("Base Settings")]
|
|
[Tooltip("Wait until this block is resolved before moving to next")]
|
|
protected bool _WaitUntilFinished = false;
|
|
|
|
[SerializeField]
|
|
[Tooltip("Amount of times to run this Block before moving to next")]
|
|
protected int RepeatAmount = 1;
|
|
|
|
[SerializeField]
|
|
[Tooltip("Speed this block will be played back at. (Default = 1)")]
|
|
protected float SpeedMultiplier = 1;
|
|
|
|
#endregion Inspector Fields
|
|
|
|
#region ReadOnly Variables
|
|
public string DisplayName { get { return (string.IsNullOrEmpty(_DisplayName)) ? name : _DisplayName; } }
|
|
|
|
[HideInInspector]
|
|
public bool hasBeenRemoved = false;
|
|
|
|
public virtual bool WaitUntilFinished { get { return _WaitUntilFinished; } }
|
|
#endregion
|
|
|
|
#region private variables
|
|
|
|
/// <summary>
|
|
/// Amount of times this block has run
|
|
/// </summary>
|
|
protected int RepeatCount = 0;
|
|
|
|
#endregion private variables
|
|
|
|
#region Class Functions
|
|
/// <summary>
|
|
/// Runs the block
|
|
/// </summary>
|
|
/// <param name="player">Player which will be affected by the block</param>
|
|
/// <returns>returns true if block is finished</returns>
|
|
public virtual IEnumerator Run(Character player, float animationSpeed,bool useBlockDirection = false)
|
|
{
|
|
|
|
float TotalAnimationTime = animationSpeed / SpeedMultiplier;
|
|
|
|
|
|
if(GlobalVariables.playerMoves == true){
|
|
player.DisplayBlock(this);
|
|
}
|
|
|
|
if (WaitUntilFinished)
|
|
{
|
|
for (int i = 0; i < RepeatAmount; i++)
|
|
{
|
|
if (player.stuck)
|
|
yield break;
|
|
RepeatCount++;
|
|
yield return player.StartCoroutine(BlockLogic(player, TotalAnimationTime, useBlockDirection));
|
|
}
|
|
}
|
|
else
|
|
{
|
|
RepeatCount++;
|
|
yield return player.StartCoroutine(BlockLogic(player, TotalAnimationTime, useBlockDirection));
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// Returns the amount of space this logic block takes up
|
|
/// </summary>
|
|
/// <returns>Int which controlls how much space this takes up</returns>
|
|
public virtual int Size()
|
|
{
|
|
return 1;
|
|
}
|
|
|
|
/// <summary>
|
|
/// Where derived callses should implement the logic for their classes
|
|
/// </summary>
|
|
/// <param name="player">Player which will be affected by the block</param>
|
|
/// <returns>returns true if block is finished</returns>
|
|
protected abstract IEnumerator BlockLogic(Character player, float animationTime,bool useBlockDirection = false);
|
|
|
|
/// <summary>
|
|
/// Returns the block that the character will endUp on after they use this logic element
|
|
/// </summary>
|
|
/// <param name="startBlock">block character is on</param>
|
|
/// <param name="transform">transform function will be based off</param>
|
|
/// <param name="layerMask">layers to ignore</param>
|
|
/// <returns>block which character will finish on after performing this function </returns>
|
|
public abstract Block GetEndBlock(Block startBlock, Transform transform, LayerMask layerMask);
|
|
|
|
/// <summary>
|
|
/// Resets the block to be ready to used again
|
|
/// </summary>
|
|
public virtual void Reset()
|
|
{
|
|
RepeatCount = 0;
|
|
}
|
|
|
|
/// <summary>
|
|
/// False if this block needs to be run again
|
|
/// </summary>
|
|
/// <returns>bool false if block needs to be run again</returns>
|
|
public virtual bool isFinished()
|
|
{
|
|
return (RepeatCount == RepeatAmount);
|
|
}
|
|
|
|
#region Serialisation Functions
|
|
/// <summary>
|
|
/// Copies data from BlockToken to this Block
|
|
/// </summary>
|
|
/// <param name="token">Token to Copy</param>
|
|
public virtual void CopyToken(BlockToken token)
|
|
{
|
|
Color = token.Color;
|
|
_DisplayName = token._DisplayName;
|
|
_WaitUntilFinished = token.WaitUntilFinished;
|
|
RepeatAmount = token.RepeatAmount;
|
|
name = token.ObjectName;
|
|
SpeedMultiplier = token.SpeedMultiplier;
|
|
}
|
|
|
|
/// <summary>
|
|
/// Copies Block data to supplied token, if token is null creates new token
|
|
/// </summary>
|
|
/// <param name="token">token to copy data to</param>
|
|
/// <returns></returns>
|
|
public virtual BlockToken ToToken(BlockToken token = null)
|
|
{
|
|
if (token == null)
|
|
token = new BlockToken(this);
|
|
token.Color = Color;
|
|
token._DisplayName = _DisplayName;
|
|
token.WaitUntilFinished = WaitUntilFinished;
|
|
token.RepeatAmount = RepeatAmount;
|
|
token.ObjectName = name;
|
|
token.SpeedMultiplier = SpeedMultiplier;
|
|
|
|
return token;
|
|
}
|
|
#endregion Serialisation Functions
|
|
|
|
|
|
public bool isSameType(object other)
|
|
{
|
|
if (Object.ReferenceEquals(null, other))
|
|
return false;
|
|
|
|
if (Object.ReferenceEquals(other.GetType(), other))
|
|
return false;
|
|
|
|
LogicBlock otherLogic = other as LogicBlock;
|
|
return !Object.ReferenceEquals(null, otherLogic)
|
|
&& string.Equals(name, otherLogic.name);
|
|
}
|
|
|
|
public virtual LogicBlock Clone()
|
|
{
|
|
LogicBlock retVal = Instantiate(this);
|
|
retVal.name = this.name;
|
|
|
|
return retVal;
|
|
}
|
|
|
|
public virtual LogicBlock[] GetAllBlocks()
|
|
{
|
|
return new LogicBlock[] { this };
|
|
}
|
|
|
|
|
|
#endregion Class Functions
|
|
}
|
|
|
|
[System.Serializable]
|
|
public class BlockToken
|
|
{
|
|
|
|
public System.Type blockType;
|
|
|
|
public Color Color;
|
|
|
|
public string _DisplayName;
|
|
|
|
public string ObjectName;
|
|
|
|
public bool WaitUntilFinished;
|
|
|
|
public int RepeatAmount;
|
|
|
|
public float SpeedMultiplier;
|
|
|
|
public BlockToken(LogicBlock block)
|
|
{
|
|
blockType = block.GetType();
|
|
}
|
|
|
|
public LogicBlock ToLogicBlock()
|
|
{
|
|
|
|
LogicBlock retVal = (LogicBlock)ScriptableObject.CreateInstance(blockType);
|
|
retVal.CopyToken(this);
|
|
|
|
return retVal;
|
|
}
|
|
|
|
}
|