public async Task <(ArmyDTO, BattleLog)> AttackAsync(ArmyDTO attacker, List <ArmyDTO> armies, int battleId, string jobId, CancellationToken cancellationToken) { if (attacker.Units < 1) { return(attacker, null); } _cancellationToken = cancellationToken; _attacker = attacker; if (cancellationToken.IsCancellationRequested) { return(ClearState(attacker), null); } // reload if entity is loaded from json on app crash whilst reloading if (attacker.ReloadTimeTotal > TimeSpan.Zero) { _logger.LogInformation($"{attacker.Name} is resuming reload with {attacker.ReloadTimeTotal - attacker.ElapsedReloadTime} ms remaining!"); await _reloadService.ReloadAsync(_attacker, cancellationToken); } InitiateAttack(armies, out var attackLogs); await _reloadService.ReloadAsync(_attacker, cancellationToken); return(ClearState(attacker), CreateBatteLog(armies, battleId, jobId, attackLogs)); }
public async Task ReloadAsync(ArmyDTO attacker, CancellationToken cancellationToken) { _logger.LogInformation($"{attacker.Name} started reloading attack..."); while (true) { if (cancellationToken.IsCancellationRequested) { break; } attacker.ReloadTimeTotal = attacker.Units * _options.Value.ArmyReloadPerUnit; if (attacker.ElapsedReloadTime <= attacker.ReloadTimeTotal) { await Task.Delay(_options.Value.ArmyReloadPerUnit); attacker.ElapsedReloadTime = attacker.ElapsedReloadTime.Add(_options.Value.ArmyReloadPerUnit); } else { _logger.LogInformation($"{attacker.Name} has reloaded..."); break; } } attacker.ElapsedReloadTime = TimeSpan.Zero; attacker.ReloadTimeTotal = TimeSpan.Zero; }
public List <ArmyDTO> MapDbArmiesToArmiesDtoList(List <Army> armies) { var result = new List <ArmyDTO>(); foreach (var army in armies) { var dto = new ArmyDTO { AttackStrategy = army.AttackStrategy, ElapsedReloadTime = TimeSpan.Zero, ReloadTimeTotal = TimeSpan.Zero, Name = army.Name, TargetName = string.Empty, Units = army.Units }; result.Add(dto); } return(result); }
private ArmyDTO ClearState(ArmyDTO attacker) { attacker.TargetName = string.Empty; return(attacker); }