|
|
|
@ -10,7 +10,37 @@ namespace Build_God_Api.Services.Game |
|
|
|
} |
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
/// 从装备属性 JSON(与 EquipmentInstance.Attributes 同格式)累加固定类加成
|
|
|
|
/// 单件装备 JSON 或背包多件的属性总和(固定值 + 百分比累加)。百分比为「百分点」累加,如两件 +10% 攻 = 20,参与公式 (基础+固定)×(1+总和/100)。
|
|
|
|
/// </summary>
|
|
|
|
public sealed class EquipmentAttributeTotals |
|
|
|
{ |
|
|
|
public decimal AttackFixed { get; set; } |
|
|
|
public decimal AttackPercent { get; set; } |
|
|
|
public decimal DefendFixed { get; set; } |
|
|
|
public decimal DefendPercent { get; set; } |
|
|
|
public decimal HealthFixed { get; set; } |
|
|
|
public decimal HealthPercent { get; set; } |
|
|
|
public decimal CriticalRate { get; set; } |
|
|
|
public decimal CriticalDamage { get; set; } |
|
|
|
|
|
|
|
public static EquipmentAttributeTotals operator +(EquipmentAttributeTotals a, EquipmentAttributeTotals b) |
|
|
|
{ |
|
|
|
return new EquipmentAttributeTotals |
|
|
|
{ |
|
|
|
AttackFixed = a.AttackFixed + b.AttackFixed, |
|
|
|
AttackPercent = a.AttackPercent + b.AttackPercent, |
|
|
|
DefendFixed = a.DefendFixed + b.DefendFixed, |
|
|
|
DefendPercent = a.DefendPercent + b.DefendPercent, |
|
|
|
HealthFixed = a.HealthFixed + b.HealthFixed, |
|
|
|
HealthPercent = a.HealthPercent + b.HealthPercent, |
|
|
|
CriticalRate = a.CriticalRate + b.CriticalRate, |
|
|
|
CriticalDamage = a.CriticalDamage + b.CriticalDamage |
|
|
|
}; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
/// 从装备属性 JSON(与 EquipmentInstance.Attributes 同格式)累加属性
|
|
|
|
/// </summary>
|
|
|
|
public static class EquipmentAttributeBonus |
|
|
|
{ |
|
|
|
@ -19,45 +49,43 @@ namespace Build_God_Api.Services.Game |
|
|
|
PropertyNameCaseInsensitive = true |
|
|
|
}; |
|
|
|
|
|
|
|
public static (decimal AttackBonus, decimal DefendBonus, decimal HPBonus, decimal CriticalBonus, decimal CriticalDamageBonus) SumFromJson(string? attributesJson) |
|
|
|
public static EquipmentAttributeTotals SumFromJson(string? attributesJson) |
|
|
|
{ |
|
|
|
decimal attackBonus = 0; |
|
|
|
decimal defendBonus = 0; |
|
|
|
decimal hpBonus = 0; |
|
|
|
decimal criticalBonus = 0; |
|
|
|
decimal criticalDamage = 0; |
|
|
|
|
|
|
|
if (string.IsNullOrWhiteSpace(attributesJson)) return (attackBonus, defendBonus, hpBonus, criticalBonus, criticalDamage); |
|
|
|
var totals = new EquipmentAttributeTotals(); |
|
|
|
if (string.IsNullOrWhiteSpace(attributesJson)) return totals; |
|
|
|
|
|
|
|
try |
|
|
|
{ |
|
|
|
var attributes = JsonSerializer.Deserialize<List<EquipmentAttributeDto>>(attributesJson, JsonOptions); |
|
|
|
if (attributes == null) return (attackBonus, defendBonus, hpBonus, criticalBonus, criticalDamage); |
|
|
|
if (attributes == null) return totals; |
|
|
|
|
|
|
|
foreach (var attr in attributes) |
|
|
|
{ |
|
|
|
switch (attr.Type) |
|
|
|
{ |
|
|
|
case EquipmentAttributeType.AttackFixed: |
|
|
|
attackBonus += attr.Value; |
|
|
|
totals.AttackFixed += attr.Value; |
|
|
|
break; |
|
|
|
case EquipmentAttributeType.AttackPercent: |
|
|
|
totals.AttackPercent += attr.Value; |
|
|
|
break; |
|
|
|
case EquipmentAttributeType.DefendFixed: |
|
|
|
defendBonus += attr.Value; |
|
|
|
totals.DefendFixed += attr.Value; |
|
|
|
break; |
|
|
|
case EquipmentAttributeType.DefendPercent: |
|
|
|
totals.DefendPercent += attr.Value; |
|
|
|
break; |
|
|
|
case EquipmentAttributeType.HealthBonusFixed: |
|
|
|
hpBonus += attr.Value; |
|
|
|
totals.HealthFixed += attr.Value; |
|
|
|
break; |
|
|
|
case EquipmentAttributeType.HealthBonusPercent: |
|
|
|
totals.HealthPercent += attr.Value; |
|
|
|
break; |
|
|
|
case EquipmentAttributeType.CriticalRate: |
|
|
|
criticalBonus += attr.Value; |
|
|
|
totals.CriticalRate += attr.Value; |
|
|
|
break; |
|
|
|
case EquipmentAttributeType.CriticalDamage: |
|
|
|
criticalDamage += attr.Value; |
|
|
|
totals.CriticalDamage += attr.Value; |
|
|
|
break; |
|
|
|
} |
|
|
|
} |
|
|
|
@ -67,22 +95,25 @@ namespace Build_God_Api.Services.Game |
|
|
|
// ignore parse errors — same as character path
|
|
|
|
} |
|
|
|
|
|
|
|
return (attackBonus, defendBonus, hpBonus, criticalBonus, criticalDamage); |
|
|
|
return totals; |
|
|
|
} |
|
|
|
|
|
|
|
public static (decimal AttackBonus, decimal DefendBonus, decimal HPBonus, decimal CriticalBonus, decimal CriticalDamageBonus) SumFromManyJson(IEnumerable<string?> jsonList) |
|
|
|
public static EquipmentAttributeTotals SumFromManyJson(IEnumerable<string?> jsonList) |
|
|
|
{ |
|
|
|
decimal a = 0, d = 0, h = 0, c = 0, cd = 0; |
|
|
|
var acc = new EquipmentAttributeTotals(); |
|
|
|
foreach (var j in jsonList) |
|
|
|
{ |
|
|
|
var t = SumFromJson(j); |
|
|
|
a += t.AttackBonus; |
|
|
|
d += t.DefendBonus; |
|
|
|
h += t.HPBonus; |
|
|
|
c += t.CriticalBonus; |
|
|
|
cd += t.CriticalDamageBonus; |
|
|
|
acc += SumFromJson(j); |
|
|
|
} |
|
|
|
return acc; |
|
|
|
} |
|
|
|
return (a, d, h, c, cd); |
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
/// (基础 + 固定加成)× (1 + 百分比/100)。百分比为装备上累加的百分点之和。
|
|
|
|
/// </summary>
|
|
|
|
public static decimal ApplyPercentToBaseAndFlat(decimal baseValue, decimal flatBonus, decimal totalPercentPoints) |
|
|
|
{ |
|
|
|
return (baseValue + flatBonus) * (1 + totalPercentPoints / 100m); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|