Files
Tabletop/Tabletop.Core/Calculators/Calculation.cs
2025-12-30 02:22:44 +01:00

91 lines
4.3 KiB
C#

using Tabletop.Core.Constants;
using Tabletop.Core.Models;
using Tabletop.Core.Services;
namespace Tabletop.Core.Calculators
{
public class Calculation
{
public static async Task<int> ForceAsync(Unit unit)
{
double unitForce = unit.Defense * 25 + unit.Moving * 5;
double primaryWeaponForce = 0;
double secondaryWeaponForce = 0;
unit.PrimaryWeapon = AppdataService.Weapons.FirstOrDefault(x => x.WeaponId == unit.PrimaryWeaponId)?.DeepCopyByExpressionTree();
unit.SecondaryWeapon = AppdataService.Weapons.FirstOrDefault(x => x.WeaponId == unit.SecondaryWeaponId)?.DeepCopyByExpressionTree();
unit.FirstAbility = AppdataService.Abilities.FirstOrDefault(x => x.AbilityId == unit.FirstAbilityId)?.DeepCopyByExpressionTree();
unit.SecondAbility = AppdataService.Abilities.FirstOrDefault(x => x.AbilityId == unit.SecondAbilityId)?.DeepCopyByExpressionTree();
if (unit.PrimaryWeapon != null)
{
primaryWeaponForce = unit.PrimaryWeapon.Attack * (unit.PrimaryWeapon.Quality + (unit.FirstAbility?.Quality ?? 0) + (unit.SecondAbility?.Quality ?? 0)) * (unit.PrimaryWeapon.Range / 10) * unit.PrimaryWeapon.Dices;
}
if (unit.SecondaryWeapon != null)
{
secondaryWeaponForce = (unit.SecondaryWeapon.Attack * unit.SecondaryWeapon.Quality + (unit.FirstAbility?.Quality ?? 0) + (unit.SecondAbility?.Quality ?? 0)) * (unit.SecondaryWeapon.Range / 10) * unit.SecondaryWeapon.Dices;
}
return await Task.FromResult(Convert.ToInt32(Math.Round((unitForce + primaryWeaponForce + secondaryWeaponForce) / 25) + (unit.FirstAbility?.Force ?? 0) + (unit.SecondAbility?.Force ?? 0)));
}
public static Task<double> RandomNumberAsync()
{
Random random = new();
double r = random.Next(1, 9);
return Task.FromResult(r);
}
public static async Task<double> ProbabilityAsync(int attackerId, int defenderId, CoverTypes cover)
{
var (value0, value1) = await AttackValueTranslatorAsync(AppdataService.Weapons.FirstOrDefault(x => x.WeaponId == AppdataService.Units.FirstOrDefault(x => x.UnitId == attackerId)?.PrimaryWeaponId)?.Attack ?? 0, AppdataService.Units.FirstOrDefault(x => x.UnitId == defenderId)?.Defense ?? 0);
double x = ((AppdataService.Weapons.FirstOrDefault(x => x.WeaponId == AppdataService.Units.FirstOrDefault(x => x.UnitId == attackerId)?.PrimaryWeaponId)?.Quality ?? 0) + ((AppdataService.Abilities.FirstOrDefault(x => x.AbilityId == AppdataService.Units.FirstOrDefault(x => x.UnitId == attackerId)?.FirstAbilityId)?.Quality ?? 0) + ((double)(AppdataService.Abilities.FirstOrDefault(x => x.AbilityId == AppdataService.Units.FirstOrDefault(x => x.UnitId == attackerId)?.SecondAbilityId)?.Quality ?? 0)))) / 8 * ((9 - (double)value0) / 8) * (AppdataService.Weapons.FirstOrDefault(x => x.WeaponId == AppdataService.Units.FirstOrDefault(x => x.UnitId == attackerId)?.PrimaryWeaponId)?.Dices ?? 1);
if (AppdataService.Weapons.FirstOrDefault(x => x.WeaponId == AppdataService.Units.FirstOrDefault(x => x.UnitId == attackerId)?.PrimaryWeaponId) == AppdataService.Weapons.FirstOrDefault(x => x.WeaponId == AppdataService.Units.FirstOrDefault(x => x.UnitId == attackerId)?.SecondaryWeaponId))
{
x *= 2;
}
if (value1 != 0)
{
x *= (9 - (double)value1) / 8;
}
if (Convert.ToInt32(cover) == 1)
{
x *= 0.75;
}
else if (Convert.ToInt32(cover) == 2)
{
x *= 0.625;
}
return x;
}
public static Task<(int, int)> AttackValueTranslatorAsync(int attacker, int defender)
{
int x = 5;
if (attacker > defender)
{
x -= attacker - defender;
}
else if (attacker < defender)
{
x += defender - attacker;
}
if (x > 8)
{
return Task.FromResult((8, x - 6));
}
if (x < 2)
{
x = 2;
}
return Task.FromResult((x, 0));
}
}
}