public async Task <ServiceResponse <FightResultDTO> > Fight(FightRequestDTO request) { ServiceResponse <FightResultDTO> response = new ServiceResponse <FightResultDTO>(new FightResultDTO()); try { var chars = await _context.Characters .Include(c => c.Weapon) .Include(c => c.CharacterSkills).ThenInclude(cs => cs.Skills) .Where(c => request.CharacterIds.Contains(c.Id)).ToListAsync(); bool defeated = false; while (!defeated) { foreach (var attacker in chars) { List <Character> enemies = chars.Where(c => c.Id != attacker.Id).ToList(); Character enemy = enemies[new Random().Next(enemies.Count())]; int dmg = 0; string attackUsed = string.Empty; bool useWeapon = new Random().Next(2) == 0; if (attacker.Weapon != null && attacker.CharacterSkills.Count == 0) { useWeapon = true; } else if (attacker.Weapon == null && attacker.CharacterSkills.Count > 0) { useWeapon = false; } if (useWeapon) { attackUsed = attacker.Weapon.Name; dmg = WeaponAttackDamage(attacker, enemy); } else { int randomSkill = new Random().Next(attacker.CharacterSkills.Count); attackUsed = attacker.CharacterSkills[randomSkill].Skills.Name; dmg = SkillsAttackDamage(attacker, enemy, attacker.CharacterSkills[randomSkill]); } response.Data.Log.Add($"{attacker.Name} attacks {enemy.Name} with {(dmg > 0 ? dmg : 0)} damage."); if (enemy.HitPoints <= 0) { defeated = true; attacker.Victories++; enemy.Defeats++; response.Data.Log.Add($"{attacker.Name} defeats {enemy.Name}"); break; } } } chars.ForEach(c => { c.Fights++; c.HitPoints = 100; }); _context.Characters.UpdateRange(chars); await _context.SaveChangesAsync(); } catch (System.Exception ex) { response.Success = false; response.Message = ex.Message; } return(response); }
public async Task <ServiceResponce <FightResultDTO> > Fight(FightRequestDTO request) { ServiceResponce <FightResultDTO> responce = new ServiceResponce <FightResultDTO> { Data = new FightResultDTO() }; try { List <Charecter> charecters = await _context.Charecters.Include(cs => cs.Weapon) .Include(c => c.CharecterSkills).ThenInclude(cs => cs.Skill) .Where(c => request.CharecterIds.Contains(c.Id)).ToListAsync(); bool defeated = false; while (!defeated) { foreach (Charecter attacker in charecters) { List <Charecter> opponenets = charecters.Where(c => c.Id != attacker.Id).ToList(); Charecter opponent = opponenets[new Random().Next(opponenets.Count)]; int damage = 0; string attackUsed = string.Empty; bool useWeapon = new Random().Next(2) == 0; if (useWeapon) { attackUsed = attacker.Weapon.Name; damage = DoWeaponAttack(attacker, opponent); } else { int randomSkill = new Random().Next(attacker.CharecterSkills.Count); attackUsed = attacker.CharecterSkills[randomSkill].Skill.Name; damage = DoSkillAttack(attacker, opponent, attacker.CharecterSkills[randomSkill]); } responce.Data.Log.Add($"{attacker.Name} attcks {opponent.Name} using {attackUsed} with {(damage > 0 ? damage : 0)} damage."); if (opponent.HitPoints <= 0) { defeated = true; attacker.Victories++; opponent.Defeats++; responce.Data.Log.Add($"{opponent.Name} has been defeated!"); responce.Data.Log.Add($"{attacker.Name} wins with {attacker.HitPoints} HP left!"); break; } } } charecters.ForEach(c => { c.Fights++; c.HitPoints = 100; }); _context.Charecters.UpdateRange(charecters); await _context.SaveChangesAsync(); } catch (Exception ex) { responce.Success = false; responce.Message = ex.Message; } return(responce); }
public async Task <IActionResult> Fight(FightRequestDTO request) { return(Ok(await _fightService.Fight(request))); }
public async Task <serviceResponse <FightResultDTO> > Fight(FightRequestDTO request) { serviceResponse <FightResultDTO> response = new serviceResponse <FightResultDTO> { Data = new FightResultDTO() }; try { List <Character> Character = await _context.Characters .Include(c => c.Weapon) .Include(c => c.CharacterSkills).ThenInclude(c => c.Skill) .Where(c => request.CharacterIds.Contains(c.Id)).ToListAsync(); bool defeated = false; while (!defeated) { foreach (Character attacker in Character) { List <Character> opponents = Character.Where(c => c.Id != attacker.Id).ToList(); Character opponent = opponents[new Random().Next(opponents.Count)]; int damage = 0; string attackUsed = string.Empty; bool useWeapon = new Random().Next(2) == 0; if (useWeapon) { attackUsed = attacker.Weapon.Name; damage = DoWeaponAttack(attacker, opponent); } else { int randomSkill = new Random().Next(attacker.CharacterSkills.Count); attackUsed = attacker.CharacterSkills[randomSkill].Skill.Name; damage = SkillAttack(attacker, opponent, attacker.CharacterSkills[randomSkill]); } response.Data.Log.Add($"{attacker.Name} attacked {opponent.Name} with {attackUsed} with damage {(damage >= 0 ? damage : 0)} damage."); if (opponent.HitPoints <= 0) { defeated = true; attacker.Wins++; opponent.Defeats++; response.Data.Log.Add($"{opponent.Name} was defeated by {attacker.Name} "); break; } } } Character.ForEach(c => { c.Fights++; c.HitPoints = 100; }); _context.Characters.UpdateRange(Character); await _context.SaveChangesAsync(); } catch (Exception ex) { response.Success = false; response.Message = ex.Message; } return(response); }