using UnityEngine; namespace Continentis.MainGame.Character { #region Fraction public partial class CharacterBase { public bool IsOpponent(CharacterBase other) { if (this.fraction is Fraction.Player or Fraction.Ally) { return other.fraction is Fraction.Enemy or Fraction.Neutral; } else if (this.fraction is Fraction.Enemy) { return other.fraction is Fraction.Player or Fraction.Ally or Fraction.Neutral; } else // Neutral { return other.fraction is Fraction.Player or Fraction.Ally or Fraction.Enemy; } } public bool IsAlly(CharacterBase other) { if (this.fraction is Fraction.Player or Fraction.Ally) { return other.fraction is Fraction.Player or Fraction.Ally; } else if (this.fraction is Fraction.Enemy) { return other.fraction is Fraction.Enemy; } else // Neutral { return other.fraction is Fraction.Neutral; } } } #endregion #region Attributes public partial class CharacterBase { /// /// 获取角色的属性值 /// public int GetAttribute(string attributeName, int defaultValue = 0) { if (attributeSubmodule.generalAttributeGroup.current.ContainsKey(attributeName)) { return attributeSubmodule.GetGeneralAttribute(attributeName); } Debug.LogWarning($"Attribute {attributeName} not found in attribute group."); return defaultValue; } /// /// 获取角色的原始属性值 /// 如果属性名包含“Multiplier”,默认值改为1 /// public float GetRawAttribute(string attributeName, float defaultValue = 0) { if (attributeSubmodule.generalAttributeGroup.current.TryGetValue(attributeName, out float attribute)) { return attribute; } Debug.LogWarning($"Attribute {attributeName} not found in attribute group."); if(attributeName.Contains("Multiplier")) { defaultValue = 1f; } return defaultValue; } /// /// 设置角色的属性值 /// public void SetAttribute(string attributeName, int value) { if (attributeSubmodule.generalAttributeGroup.current.ContainsKey(attributeName)) { attributeSubmodule.generalAttributeGroup.current[attributeName] = value; return; } Debug.LogWarning($"Attribute {attributeName} not found in attribute group."); } /// /// 修改角色的属性值 /// public void ModifyAttribute(string attributeName, int delta) { if (attributeSubmodule.generalAttributeGroup.current.ContainsKey(attributeName)) { attributeSubmodule.generalAttributeGroup.current[attributeName] += delta; return; } Debug.LogWarning($"Attribute {attributeName} not found in attribute group."); } /// /// 修改角色的属性值并进行范围限制 /// /// 实际的添加或减少的数值(可能因为范围限制而小于 delta) public int ModifyAndClampAttribute(string attributeName, int delta, int min = 0, int max = int.MaxValue) { int currentAttribute = GetAttribute(attributeName); int actualModifiedValue = delta; if (delta < 0) { actualModifiedValue = Mathf.Min(-delta, currentAttribute - min); } else if (delta > 0) { actualModifiedValue = Mathf.Min(delta, max - currentAttribute); } ModifyAttribute(attributeName, delta); ClampAttribute(attributeName, min, max); return actualModifiedValue; } public void ClampAttribute(string attributeName, int min, int max) { if (GetAttribute(attributeName) < min) { SetAttribute(attributeName, min); } else if (GetAttribute(attributeName) > max) { SetAttribute(attributeName, max); } } } #endregion }