using System.Collections.Generic;
using System.Linq;
using UnityEngine;
using AibisDream.Utility;
namespace AibisDream
{
[CreateAssetMenu(fileName = "BlockPuzzleValidator", menuName = "Block Puzzle/BlockPuzzleValidator")]
public class BlockPuzzleValidator : ScriptableObject
{
[Tooltip("基础条件, 不满足无法提交")]
public ValidateItem[] baseConditions;
[Tooltip("额外条件, 不满足也可以提交")]
public ValidateItem[] extraConditions;
///
/// 验证是否可以完成拼图
///
///
///
public ValidateResult Validate(List shapeInGrid)
{
var result = new ValidateResult();
var shapePropertyValues = new Dictionary();
// 统计每个Shape的属性值
foreach (var shape in shapeInGrid)
{
foreach (var property in shape.BlockShapeData.shapeProperties)
{
if (shapePropertyValues.ContainsKey(property.property))
{
shapePropertyValues[property.property] += property.value;
}
else
{
shapePropertyValues.Add(property.property, property.value);
}
}
}
// 先校验基础条件
foreach (var condition in baseConditions)
{
var itemResult = condition.Validate(shapePropertyValues);
result.baseConditionResults.Add((condition.name, itemResult));
result.isPass = result.isPass && itemResult;
}
// 再校验额外条件
foreach (var condition in extraConditions)
{
var itemResult = condition.Validate(shapePropertyValues);
result.extraConditionResults.Add((condition.name, itemResult));
result.isExtraConditionPass = result.isExtraConditionPass && itemResult;
}
result.shapePropertiesResult = shapePropertyValues
.Select(item => new ShapeProperty { property = item.Key, value = item.Value })
.OrderBy(item => item.property)
.ToArray();
return result;
}
[System.Serializable]
public struct ValidateItem
{
[Tooltip("名称, 仅用于显示")]
public string name;
public string property;
public Vector2Int range;
public bool isOutRange;
public bool Validate(Dictionary shapePropertyValues)
{
int totalValue = 0;
if (shapePropertyValues.ContainsKey(property))
{
totalValue = shapePropertyValues[property];
}
return CommonUtil.IsInRange(totalValue, range.x, range.y) != isOutRange;
}
}
}
public class ValidateResult
{
public bool isPass;
public bool isExtraConditionPass;
public ShapeProperty[] shapePropertiesResult;
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)>();
}
}
}