using System; using System.Collections.Generic; using System.Text; using SepCore.Definition; using SepCore.Entity; using UnityGameFramework.Runtime; namespace SepCore.CustomUtility { public static class ItemDescUtility { private static readonly Dictionary _paramTypeNames = new() { { ParamType.HitRadius, "攻击半宽" }, { ParamType.SectorAngle, "攻击角度" }, { ParamType.HitHalfWidth, "横向半宽" }, { ParamType.PierceLength, "前戳距离" }, { ParamType.HitHeight, "判定高度" }, }; private static readonly string[] _statTypeNames = { "无效", // None = 0 "最大生命", // MaxHp = 1 "生命恢复", // HpRegen = 2 "生命窃取", // LifeSteal = 3 "伤害加成", // DamagePercent = 4 "近战伤害", // MeleeDamage = 5 "远程伤害", // RangedDamage = 6 "元素伤害", // ElementalDamage = 7 "攻击速度", // AttackSpeed = 8 "暴击率", // CritChance = 9 "工程学", // Engineering = 10 "攻击范围", // Range = 11 "护甲", // Armor = 12 "闪避率", // Dodge = 13 "移动速度", // MoveSpeed = 14 "收获", // Harvesting = 15 "幸运" // Luck = 16 }; public static string Describe(StatModifierConfig statModifierConfig) { if (statModifierConfig == null) { return string.Empty; } int index = (int)statModifierConfig.StatType; string name = (index >= 0 && index < _statTypeNames.Length) ? _statTypeNames[index] : statModifierConfig.StatType.ToString(); string colorTag = statModifierConfig.Value >= 0 ? "green" : "red"; string sign = statModifierConfig.Value >= 0 ? "+" : ""; if (statModifierConfig.ModifierType == ModifierType.PercentAdd) { float displayPercent = statModifierConfig.Value * 100f; return $"{name}: {sign}{displayPercent:0.##}%"; } if (statModifierConfig.ModifierType == ModifierType.PercentMult) { return $"{name}: x{statModifierConfig.Value:0.##}"; } return $"{name}: {sign}{statModifierConfig.Value:0.##}"; } public static string CreatePropDescription(IEnumerable modifiers) { if (modifiers == null) { return null; } StringBuilder sb = new StringBuilder(); foreach (StatModifierConfig modifier in modifiers) { sb.Append(Describe(modifier)); sb.Append('\n'); } return sb.ToString(); } public static string CreateWeaponDescription(WeaponConfig weaponConfig) { if (weaponConfig == null) { return null; } return CreateWeaponDescription(weaponConfig.Attack, weaponConfig.Cooldown / 1000f, weaponConfig.AttackRange / 1000f, weaponConfig.StatModifierConfigs, weaponConfig.Parameters); } public static string CreateWeaponDescription(WeaponBase weapon) { if (weapon == null || weapon.WeaponData == null) { return null; } return CreateWeaponDescription(weapon.WeaponData); } public static string CreateWeaponDescription(WeaponData weaponData) { if (weaponData == null) { return null; } return CreateWeaponDescription(weaponData.Attack, weaponData.Cooldown, weaponData.AttackRange, weaponData.Modifiers, weaponData.Parameters); } public static string CreatePropDescription(PropItem prop) { if (prop == null) { return null; } return CreatePropDescription(prop.Modifiers); } private static string CreateWeaponDescription(int attack, float cooldown, float attackRange, IEnumerable modifiers, IReadOnlyDictionary parameters) { StringBuilder sb = new StringBuilder(); sb.AppendLine($"攻击: {attack}"); sb.AppendLine($"冷却: {cooldown}"); sb.AppendLine($"范围: {attackRange}"); string modifiersDesc = CreatePropDescription(modifiers); if (!string.IsNullOrEmpty(modifiersDesc)) { sb.Append(modifiersDesc); } if (parameters == null || parameters.Count == 0) { return sb.ToString(); } foreach (var kvp in parameters) { if (!_paramTypeNames.TryGetValue(kvp.Key, out string paramName)) { paramName = kvp.Key.ToString(); } string valStr = kvp.Key == ParamType.SectorAngle ? kvp.Value.ToString() : (kvp.Value / 1000f).ToString("0.##"); sb.AppendLine($"{paramName}: {valStr}"); } return sb.ToString(); } } }