162 lines
6.0 KiB
C#
162 lines
6.0 KiB
C#
using Fantasy.Entitas;
|
||
using Fantasy.Entitas.Interface;
|
||
using Fantasy.Helper;
|
||
|
||
namespace Fantasy.Equip;
|
||
|
||
public class EquipComponentAwakeSystem : AwakeSystem<EquipComponent>
|
||
{
|
||
protected override void Awake(EquipComponent self)
|
||
{
|
||
self.Awake();
|
||
}
|
||
}
|
||
|
||
public sealed class EquipComponentDestroySystem : DestroySystem<EquipComponent>
|
||
{
|
||
protected override void Destroy(EquipComponent self)
|
||
{
|
||
foreach (var (_, value) in self.MainAttrs)
|
||
{
|
||
value.Dispose();
|
||
}
|
||
foreach (var (_, value) in self.EntryAttrs)
|
||
{
|
||
value.Dispose();
|
||
}
|
||
self.Affixs.Clear();
|
||
self.MainAttrs.Clear();
|
||
self.EntryAttrs.Clear();
|
||
self.Durable = 0;
|
||
self.DurableMax = 0;
|
||
}
|
||
}
|
||
|
||
public sealed class EquipAttrDestroySystem : DestroySystem<EquipAttr>
|
||
{
|
||
protected override void Destroy(EquipAttr self)
|
||
{
|
||
self.Key = 0;
|
||
self.Value = 0;
|
||
self.SValue = 0;
|
||
}
|
||
}
|
||
|
||
public static class EquipComponentSystem
|
||
{
|
||
public static void Awake(this EquipComponent self)
|
||
{
|
||
var item = self.GetParent<Item>();
|
||
var itemConfig = item.Config;
|
||
// 设置装备的耐久
|
||
self.Durable = itemConfig.Durable;
|
||
self.DurableMax = self.Durable;
|
||
// 获取装备品质主属性方案
|
||
if (!EquipValueConfigData.Instance.TryGetValue(itemConfig.Id, itemConfig.Quality, out var equipValueConfig))
|
||
{
|
||
// 没有找到主属性方案,需要检查代码或配置表是否正确。
|
||
// 到这里的话就不需要继续执行了。
|
||
return;
|
||
}
|
||
// 设置主属性
|
||
self.InitMainAttrs(itemConfig, equipValueConfig);
|
||
// 设置附加(副)属性
|
||
self.InitEntryAttrs(itemConfig, equipValueConfig);
|
||
// 设置词缀
|
||
self.InitAffix(itemConfig, equipValueConfig);
|
||
}
|
||
|
||
private static void InitMainAttrs(this EquipComponent self, ItemConfig itemConfig, EquipValueConfig equipValueConfig)
|
||
{
|
||
self.MainAttrs.Clear();
|
||
// 循环遍历主属性。
|
||
foreach (var (key, value) in equipValueConfig.MainAttrs.Dic)
|
||
{
|
||
var equipAttr = Entity.Create<EquipAttr>(self.Scene, true, true);
|
||
equipAttr.Key = key;
|
||
equipAttr.Value = value;
|
||
self.MainAttrs.Add(key, equipAttr);
|
||
}
|
||
// 这里还可以加一些其他的需求。
|
||
}
|
||
|
||
private static void InitEntryAttrs(this EquipComponent self, ItemConfig itemConfig, EquipValueConfig equipValueConfig)
|
||
{
|
||
var equipEntryConfigId = equipValueConfig.EquipEntryConfigId;
|
||
// 很有可能当前的装备没有附加(副)属性,所以如果为默认值的情况下就不进行下面的逻辑。
|
||
if (equipEntryConfigId == 0)
|
||
{
|
||
return;
|
||
}
|
||
// 还有一种可能是设置的副(附加)属性不存在,一般这样的情况下都是策划配置的错误,这里的话也不进行下面的逻辑了。
|
||
if (!EquipEntryConfigData.Instance.TryGet(equipEntryConfigId, out var equipEntryConfig))
|
||
{
|
||
// 也可以在这里打印出一个错误,方便排查,找到这个错误告诉策划,让策划修改下。
|
||
// (推荐做法)也可以一个单独的Scene,在这里Scene里把这些所有配置加载出来,按个的排查,如果有错误就打印出来。
|
||
return;
|
||
}
|
||
self.EntryAttrs.Clear();
|
||
// 这里可以用权重来控制随机的数量和属性,但是这里就不演示的。
|
||
// 这里就是用直接的随机来做来了。
|
||
var entryCount = RandomHelper.RandomNumber(equipEntryConfig.Min, equipEntryConfig.Max);
|
||
// 获得当前随机附加属性的列表
|
||
var configAttrs = equipEntryConfig.Attrs;
|
||
var entryIndex = 0;
|
||
for (var i = 0; i < entryCount; i++)
|
||
{
|
||
var equipAttr = Entity.Create<EquipAttr>(self.Scene, true, true);
|
||
equipAttr.Key = configAttrs[entryIndex];
|
||
equipAttr.Value = RandomHelper.RandomNumber(configAttrs[entryIndex + 1], configAttrs[entryIndex + 2]);
|
||
self.EntryAttrs.Add(equipAttr.Key, equipAttr);
|
||
}
|
||
}
|
||
|
||
private static void InitAffix(this EquipComponent self, ItemConfig itemConfig, EquipValueConfig equipValueConfig)
|
||
{
|
||
var equipEntryConfigId = equipValueConfig.EquipEntryConfigId;
|
||
|
||
if (equipEntryConfigId == 0)
|
||
{
|
||
return;
|
||
}
|
||
|
||
if (!EquipEntryConfigData.Instance.TryGet(equipEntryConfigId, out var equipEntryConfig))
|
||
{
|
||
// 也可以在这里打印出一个错误,方便排查,找到这个错误告诉策划,让策划修改下。
|
||
// (推荐做法)也可以一个单独的Scene,在这里Scene里把这些所有配置加载出来,按个的排查,如果有错误就打印出来。
|
||
return;
|
||
}
|
||
|
||
if (equipEntryConfig.Affix.Length == 0)
|
||
{
|
||
// 有可能没有词缀,所以这里就不进行下面的逻辑了。
|
||
return;
|
||
}
|
||
|
||
// 随机词缀的数量
|
||
// 这里还是只做最简单的随机,如果想加权重的随机,可以自己实现下。
|
||
var configAffix = equipEntryConfig.Affix;
|
||
var affixCount = RandomHelper.RandomNumber(equipEntryConfig.AffixMin, equipEntryConfig.AffixMax);
|
||
for (var i = 0; i < affixCount; i++)
|
||
{
|
||
self.Affixs.Add(configAffix[i]);
|
||
}
|
||
}
|
||
|
||
public static EquipInfo ToEquipInfo(this EquipComponent self)
|
||
{
|
||
var equipInfo = new EquipInfo();
|
||
equipInfo.Durable = self.Durable;
|
||
equipInfo.DurableMax = self.DurableMax;
|
||
|
||
foreach (var (key,equipAttr) in self.MainAttrs)
|
||
{
|
||
equipInfo.MainKeys.Add(key);
|
||
equipInfo.EquipAttrKeys.Add(key);
|
||
equipInfo.EquipAttrValues.Add(equipAttr.Value);
|
||
equipInfo.EquipAttrSValues.Add(equipAttr.SValue);
|
||
}
|
||
|
||
return equipInfo;
|
||
}
|
||
} |