using System;
using System.Collections.Generic;
using cfg;
using PhxhSDK;
using static Framework.EventManager;
namespace Framework.Condition
{
public interface ICondition
{
public EventName SignalName { get; }
///
/// 检查条件是否满足
///
///
///
bool Check(List args);
///
/// 获取条件参数对应的本地化文本数组
///
///
///
string[] GetArgLocalizations(List args);
}
public class ConditionException : Exception
{
public ConditionException(string message) : base(message)
{
}
}
public sealed class ConditionManager : Singlenton, IInitable
{
private const string CONDITION_PREFIX = "Condition";
private const string CONDITION_DESC_PREFIX = "condition_desc_";
//避免GC
private List _tempConditionArgs = new();
private ICondition[] m_conditions;
#region MainLife
public void Init()
{
m_conditions = new ICondition[(int)ConditionType.Max];
foreach (ConditionType conditionType in Enum.GetValues(typeof(ConditionType)))
{
if (conditionType == ConditionType.None || conditionType == ConditionType.Max)
continue;
string typeName = $"{CONDITION_PREFIX}{conditionType}";
Type type = CommonUtilsFramework.GamePlayAssembly.GetType(typeName);
if (type == null)
{
DebugUtil.LogError($"Cant find Type,name:{typeName}");
continue;
}
if (Activator.CreateInstance(type) is ICondition condition)
m_conditions[(int)conditionType] = condition;
else
DebugUtil.LogError($"cant construct condition,type:{type},please check if your type is correctly implement ICondition");
}
}
public void Release()
{
m_conditions = null;
_tempConditionArgs = null;
}
#endregion
#region API
public bool CheckCondition(int conditionID)
{
DataCondition conditionCfg = GetConditionCfg(conditionID);
GetConditionCfgArgs(conditionCfg, ref _tempConditionArgs);
return CheckCondition(conditionCfg.Type, _tempConditionArgs);
}
public bool CheckCondition(int[] conditionGroup, bool useAnd = true)
{
foreach (var conditionID in conditionGroup)
{
var isSuccess = CheckCondition(conditionID);
if (useAnd)
{
if (!isSuccess)
{
return false;
}
}
else
{
if (isSuccess)
return true;
}
}
return useAnd;
}
///
/// 检查条件是否满足条件
///
///
///
///
///
public bool CheckCondition(ConditionType conditionType, List conditionArg)
{
if (m_conditions[(int)conditionType] == null)
throw new Exception($"condition type is outside of range!condition type:{conditionType}");
return m_conditions[(int)conditionType].Check(conditionArg);
}
///
/// 获取条件参数的本地化文本数组
///
///
///
///
///
public string[] GetArgLocalizations(ConditionType conditionType, List listArg)
{
ICondition iCondition = m_conditions[(int)conditionType] ?? throw new Exception($"条件类型超出范围!类型:{conditionType}");
return iCondition.GetArgLocalizations(listArg);
}
public EventName GetConditionSignal(int conditionID)
{
var conditionCfg = GetConditionCfg(conditionID);
if (conditionCfg != null)
{
return GetConditionSignal(conditionCfg.Type);
}
DebugUtil.LogError($"cant find condition!conditionID:{conditionID}");
return EventName.None;
}
public EventName GetConditionSignal(ConditionType conditionType)
{
var condition = GetConditionByType(conditionType);
if (condition != null)
{
return condition.SignalName;
}
DebugUtil.LogError($"cant find condition!conditionType:{conditionType}");
return EventName.None;
}
public string GetConditionLocalization(int conditionID)
{
var conditionCfg = GetConditionCfg(conditionID);
if (conditionCfg != null)
{
GetConditionCfgArgs(conditionCfg, ref _tempConditionArgs);
return GetConditionLocalization(conditionCfg.Type, _tempConditionArgs);
}
DebugUtil.LogError($"cant find condition!conditionID:{conditionID}");
return null;
}
public string GetConditionLocalization(ConditionType conditionType, List args)
{
string key = $"{CONDITION_DESC_PREFIX}{conditionType}";
return StringManager.Instance.GetLocalizeTextByKeyAndList(key, GetArgLocalizations(conditionType, args));
}
#endregion
#region InnerFunction
private DataCondition GetConditionCfg(int conditionID)
{
return TableManager.Instance.Tables.ConditionConfig.Get(conditionID);
}
private ICondition GetConditionByType(ConditionType conditionType)
{
var index = (int)conditionType;
if (index < 0 || index >= m_conditions.Length)
{
DebugUtil.LogError("cant find condition!");
return null;
}
return m_conditions[index];
}
private void GetConditionCfgArgs(DataCondition conditionCfg, ref List _args)
{
_args.Clear();
_args.Add(conditionCfg.Param1);
_args.Add(conditionCfg.Param2);
_args.Add(conditionCfg.Param3);
}
#endregion
}
}