/// <summary> /// 计算指定属性的值 /// </summary> /// <param name="attrId"></param> /// <returns></returns> protected double CalcTotalAttribute(T attrId) { if (!GAttr.IsAttrType(attrId)) { return(0); } var attrIdIndex = Convert.ToInt32(attrId); var valueAttr = (T)Enum.ToObject(ATTR_TYPE, attrIdIndex + GAttr.ATTR_ID_ABL); var percentAttr = (T)Enum.ToObject(ATTR_TYPE, attrIdIndex + GAttr.ATTR_ID_PCT); var value = baseAttr[valueAttr] * (1.0f + baseAttr[percentAttr] / 100.0f); return(Math.Max(0, value)); }
/// <summary> /// 重新计算属性 /// </summary> /// <param name="isInit"></param> public void Rebuild(bool isInit = false) { if (isInit) { finalAttr.Clear(); } Dictionary <T, AttrChangeUnit> changeMap = new Dictionary <T, AttrChangeUnit>(); //先计算一级属性 foreach (var attrId in Config.OneLevelAttrs) { var value = CalcLevelOneAttr(attrId); var oldValue = finalAttr[attrId]; finalAttr.Set(attrId, value); if (!GAttr.Equal(value, oldValue)) { //有变化 if (Config.oneLevelRelationMap.TryGetValue(attrId, out Dictionary <T, double> relations)) { foreach (var entry in relations) { AddChange(entry.Key); } } changeMap.Add(attrId, new AttrChangeUnit(oldValue, value)); } } //再计算二级属性 foreach (var entry in changeAttrList) { var attrId = GAttr.GetAttrType(entry); //不是一级属性,并且不是属性类型,另外非初始化时不在变化列表里 if (Config.IsLevelOneAttr(attrId) || (!isInit && !changeAttrList.Contains(attrId))) { continue; } var value = CalcLevelTwoAttr(attrId); var oldValue = finalAttr[attrId]; finalAttr.Set(attrId, value); changeMap.Add(attrId, new AttrChangeUnit(oldValue, value)); } changeAttrList.Clear(); OnRebuildFinish(changeMap, isInit); }
protected void AddChange(T attrId) { changeAttrList.Add(GAttr.GetAttrType(attrId)); }