Files
aibis-dream/Assets/Scripts/MiniGame/BlockPuzzle/Class/BlockPuzzleValidator.cs
T
2025-12-08 19:54:35 +08:00

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)>();
}
}
}