106 lines
3.4 KiB
C#
106 lines
3.4 KiB
C#
using System.Collections.Generic;
|
|
using System.Linq;
|
|
using UnityEngine;
|
|
|
|
namespace AibisDream
|
|
{
|
|
[CreateAssetMenu(fileName = "BlockPuzzleValidator", menuName = "Block Puzzle/BlockPuzzleValidator")]
|
|
public class BlockPuzzleValidator : ScriptableObject
|
|
{
|
|
[Tooltip("基础条件, 不满足无法提交")]
|
|
public ValidateItem[] baseConditions;
|
|
[Tooltip("额外条件, 不满足也可以提交")]
|
|
public ValidateItem[] extraConditions;
|
|
|
|
/// <summary>
|
|
/// 验证是否可以完成拼图
|
|
/// </summary>
|
|
/// <param name="shapeInGrid"></param>
|
|
/// <returns></returns>
|
|
public ValidateResult Validate(List<BlockShape> shapeInGrid)
|
|
{
|
|
var result = new ValidateResult();
|
|
|
|
string[] shapeNames = shapeInGrid.Select(s => s.ShapeName).ToArray();
|
|
// 先校验基础条件
|
|
foreach (var condition in baseConditions)
|
|
{
|
|
var itemResult = condition.Validate(shapeNames);
|
|
|
|
result.baseConditionResults.Add((condition.name, itemResult));
|
|
result.isPass = result.isPass && itemResult;
|
|
}
|
|
|
|
// 再校验额外条件
|
|
foreach (var condition in extraConditions)
|
|
{
|
|
var itemResult = condition.Validate(shapeNames);
|
|
|
|
result.extraConditionResults.Add((condition.name, itemResult));
|
|
result.isExtraConditionPass = result.isExtraConditionPass && itemResult;
|
|
}
|
|
|
|
return result;
|
|
}
|
|
|
|
[System.Serializable]
|
|
public struct ValidateItem
|
|
{
|
|
[Tooltip("名称, 仅用于显示")]
|
|
public string name;
|
|
|
|
[Tooltip("规则要求的组件,多种组件则合并后判断")]
|
|
public string[] targetNames;
|
|
public CompareSign compareSign;
|
|
public int count;
|
|
|
|
public bool Validate(string[] shapeNames)
|
|
{
|
|
var targetNames = this.targetNames;
|
|
|
|
if (targetNames.Length == 0) return true;
|
|
|
|
var totalCount = shapeNames.Where(name => targetNames.Contains(name)).Count();
|
|
return compareSign switch
|
|
{
|
|
CompareSign.Equal => totalCount == count,
|
|
CompareSign.NotEqual => totalCount != count,
|
|
CompareSign.GreaterThan => totalCount > count,
|
|
CompareSign.LessThan => totalCount < count,
|
|
CompareSign.GreaterThanOrEqual => totalCount >= count,
|
|
CompareSign.LessThanOrEqual => totalCount <= count,
|
|
_ => false,
|
|
};
|
|
}
|
|
}
|
|
|
|
// 比较符
|
|
public enum CompareSign
|
|
{
|
|
Equal,
|
|
NotEqual,
|
|
GreaterThan,
|
|
LessThan,
|
|
GreaterThanOrEqual,
|
|
LessThanOrEqual,
|
|
}
|
|
}
|
|
|
|
public class ValidateResult
|
|
{
|
|
public bool isPass;
|
|
public bool isExtraConditionPass;
|
|
|
|
public List<(string name, bool isPass)> baseConditionResults;
|
|
public List<(string name, bool isPass)> extraConditionResults;
|
|
|
|
public ValidateResult()
|
|
{
|
|
isPass = true;
|
|
isExtraConditionPass = true;
|
|
|
|
baseConditionResults = new List<(string name, bool isPass)>();
|
|
extraConditionResults = new List<(string name, bool isPass)>();
|
|
}
|
|
}
|
|
} |