Files
2026-03-05 11:39:06 +08:00

162 lines
6.0 KiB
C#
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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;
}
}