using FL.Battle.Buffs; using System.Collections.Generic; using UnityEngine; using XGame.Database; namespace FL.Battle.Components { /// /// 该脚本主要处理属性类Buff /// public partial class BuffsComponent { /// /// 加速buff /// private List _speedUpBuffs; /// /// 减速buff /// private List _speedCutBuffs; /// /// key:buffId /// value:buff增加/减少的属性值 /// private Dictionary _buffAttributeMap; private EAttributeType GetAttributeType(Buff buff) { return (EAttributeType)buff.Table.BuffTypeNum[0]; } private int GetAttributeValue(Buff buff) { return buff.Table.BuffTypeNum[1] * buff.Layers; } /// /// 增加属性buff /// /// private void AddAttributeBuff(Buff buff) { //if (buff.BuffType != EBuffType.Attribute) // return; var attrType = GetAttributeType(buff); if (attrType == EAttributeType.SpeedAdd) { // 加/减速的buff同时只能各有一个生效 AddSpeedBuff(buff); return; } SaveAttributeValue(buff); } /// /// 移除属性buff /// /// private void RemoveAttributeBuff(Buff buff) { //if (buff.BuffType != EBuffType.Attribute) // return; var attrType = GetAttributeType(buff); if (attrType == EAttributeType.SpeedAdd) { // 加/减速的buff同时只能各有一个生效 RemoveSpeedBuff(buff); return; } RemoveAttributeValue(buff); } private void SaveAttributeValue(Buff buff) { var buffId = buff.TableId; var addVal = GetAttributeValue(buff); var result = addVal; if (_buffAttributeMap == null) _buffAttributeMap = new Dictionary(); else if (_buffAttributeMap.TryGetValue(buffId, out var lastVal)) { result -= lastVal; } _buffAttributeMap[buffId] = addVal; var attrType = GetAttributeType(buff); Context.Entity.Attr.Dynamic.AddValue(attrType, result); } private void RemoveAttributeValue(Buff buff) { if (_buffAttributeMap?.TryGetValue(buff.TableId, out var value) ?? false) { _buffAttributeMap.Remove(buff.TableId); Context.Entity.Attr.Dynamic.AddValue(GetAttributeType(buff), -value); } } private void AddSpeedBuff(Buff buff) { var buffId = buff.TableId; var addVal = GetAttributeValue(buff); var speedBuffs = GetSpeedBuffs(addVal > 0); if (speedBuffs.Count > 0) { // 已有buff var firstLast = speedBuffs[0]; var buffIdx = speedBuffs.FindIndex((a) => a.TableId == buffId); if (buffIdx != -1) { speedBuffs.RemoveAt(buffIdx); } buffIdx = -1; for (int i = 0; i < speedBuffs.Count; i++) { var tempBuff = speedBuffs[i]; var tempVal = GetAttributeValue(tempBuff); if (Mathf.Abs(tempVal) < Mathf.Abs(addVal)) { // 找到第一个数值比当前小的,数值一样的,新的在后面 speedBuffs.Insert(i, buff); buffIdx = i; break; } } if (buffIdx == -1) { speedBuffs.Add(buff); buffIdx = speedBuffs.Count - 1; } var firstNext = speedBuffs[0]; if (firstNext.TableId == firstLast.TableId) { // 第一位的buff没变化,是同一个buff则需要刷新数值,否则不刷新 if (buffIdx > 0) { return; } } else { // 先删除旧buff的数值 RemoveAttributeValue(firstLast); SaveAttributeValue(firstNext); RefreshMoveTimeScale(); return; } } else { speedBuffs.Add(buff); } SaveAttributeValue(buff); RefreshMoveTimeScale(); } private void RemoveSpeedBuff(Buff buff) { var buffId = buff.TableId; var addVal = GetAttributeValue(buff); var speedBuffs = GetSpeedBuffs(addVal > 0); var buffIdx = speedBuffs.FindIndex((a) => a.TableId == buffId); if (buffIdx < 0) { return; } speedBuffs.RemoveAt(buffIdx); if (buffIdx > 0) { // 删除的不是第一个 return; } //删除的是第一个buff RemoveAttributeValue(buff); if (speedBuffs.Count > 0) { // 还有加/减速buff SaveAttributeValue(speedBuffs[0]); } RefreshMoveTimeScale(); } private List GetSpeedBuffs(bool isSpeedUp) { if (isSpeedUp) return _speedUpBuffs ??= new List(); return _speedCutBuffs ??= new List(); } private void ClearAttributes() { _buffAttributeMap?.Clear(); _speedUpBuffs?.Clear(); _speedCutBuffs?.Clear(); } private void RefreshMoveTimeScale() { Context.Move.TimeScale = Context.Entity.Attr.MoveSpeedScale; } } }