using Fantasy.Entitas; using Fantasy.Entitas.Interface; using Fantasy.Helper; namespace Fantasy.Equip; public class EquipComponentAwakeSystem : AwakeSystem { protected override void Awake(EquipComponent self) { self.Awake(); } } public sealed class EquipComponentDestroySystem : DestroySystem { 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 { 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(); 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(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(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; } }