|
|
|
@ -29,6 +29,8 @@ namespace Build_God_Api.Services.Game |
|
|
|
public decimal CriticalRate { get; set; } |
|
|
|
public decimal BaseCriticalRate { get; set; } |
|
|
|
public decimal BonusCriticalRate { get; set; } |
|
|
|
public decimal BaseCriticalDamage { get; set; } |
|
|
|
public decimal BonusCriticalDamage { get; set; } |
|
|
|
} |
|
|
|
|
|
|
|
public class CharacterAttributeCalculateService(ISqlSugarClient context): ICharacterAttributeCalculateService |
|
|
|
@ -77,7 +79,7 @@ namespace Build_God_Api.Services.Game |
|
|
|
return (attackBonus, defendBonus, hpBonus); |
|
|
|
} |
|
|
|
|
|
|
|
private async Task<(decimal AttackBonus, decimal DefendBonus, decimal HPBonus, decimal CriticalBonus)> CalculateEquipmentBonusAsync(int characterBagId) |
|
|
|
private async Task<(decimal AttackBonus, decimal DefendBonus, decimal HPBonus, decimal CriticalBonus, decimal CriticalDamageBonus)> CalculateEquipmentBonusAsync(int characterBagId) |
|
|
|
{ |
|
|
|
var equipmentInstances = await _context.Queryable<EquipmentInstance>() |
|
|
|
.Where(x => x.CharacterBagId == characterBagId) |
|
|
|
@ -87,6 +89,7 @@ namespace Build_God_Api.Services.Game |
|
|
|
decimal defendBonus = 0; |
|
|
|
decimal hpBonus = 0; |
|
|
|
decimal criticalBonus = 0; |
|
|
|
decimal criticalDamage = 0; |
|
|
|
|
|
|
|
foreach (var instance in equipmentInstances) |
|
|
|
{ |
|
|
|
@ -117,9 +120,12 @@ namespace Build_God_Api.Services.Game |
|
|
|
break; |
|
|
|
case EquipmentAttributeType.HealthBonusPercent: |
|
|
|
break; |
|
|
|
case EquipmentAttributeType.CriticalPercent: |
|
|
|
case EquipmentAttributeType.CriticalRate: |
|
|
|
criticalBonus += attr.Value; |
|
|
|
break; |
|
|
|
case EquipmentAttributeType.CriticalDamage: |
|
|
|
criticalDamage += attr.Value; |
|
|
|
break; |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
@ -129,7 +135,7 @@ namespace Build_God_Api.Services.Game |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
return (attackBonus, defendBonus, hpBonus, criticalBonus); |
|
|
|
return (attackBonus, defendBonus, hpBonus, criticalBonus, criticalDamage); |
|
|
|
} |
|
|
|
|
|
|
|
public async Task<CharacterAttributes> CalculateAttributesAsync(Character character) |
|
|
|
@ -144,22 +150,25 @@ namespace Build_God_Api.Services.Game |
|
|
|
decimal baseAttack = CalculateAttack(character, profession); |
|
|
|
decimal baseDefend = CalculateDefend(character, profession); |
|
|
|
decimal baseCritical = 0; |
|
|
|
decimal baseCriticalDamage = 0; |
|
|
|
|
|
|
|
decimal bonusAttack = 0; |
|
|
|
decimal bonusDefend = 0; |
|
|
|
decimal bonusHP = 0; |
|
|
|
decimal bonusCritical = 0; |
|
|
|
decimal bonusCriticalDamage = 0; |
|
|
|
|
|
|
|
var characterBag = await _context.Queryable<CharacterBag>().FirstAsync(x => x.CharacterId == character.Id); |
|
|
|
if (characterBag != null) |
|
|
|
{ |
|
|
|
var (scrapAttack, scrapDefend, scrapHP) = await CalculateScrapBonusAsync(characterBag.Id); |
|
|
|
var (equipAttack, equipDefend, equipHP, equipCritical) = await CalculateEquipmentBonusAsync(characterBag.Id); |
|
|
|
var (equipAttack, equipDefend, equipHP, equipCritical,equipmentCriticalDamage) = await CalculateEquipmentBonusAsync(characterBag.Id); |
|
|
|
|
|
|
|
bonusAttack = scrapAttack + equipAttack; |
|
|
|
bonusDefend = scrapDefend + equipDefend; |
|
|
|
bonusHP = scrapHP + equipHP; |
|
|
|
bonusCritical = equipCritical; |
|
|
|
bonusCriticalDamage = equipmentCriticalDamage; |
|
|
|
} |
|
|
|
|
|
|
|
return new CharacterAttributes |
|
|
|
@ -176,7 +185,9 @@ namespace Build_God_Api.Services.Game |
|
|
|
BonusDefend = bonusDefend, |
|
|
|
CriticalRate = baseCritical + bonusCritical, |
|
|
|
BaseCriticalRate = baseCritical, |
|
|
|
BonusCriticalRate = bonusCritical |
|
|
|
BonusCriticalRate = bonusCritical, |
|
|
|
BaseCriticalDamage = baseCriticalDamage, |
|
|
|
BonusCriticalDamage = bonusCriticalDamage |
|
|
|
}; |
|
|
|
} |
|
|
|
|
|
|
|
|