예제 #1
0
        public async Task <ServiceResponse <AttackResultDto> > SkillAttack(SkillAttackDto request)
        {
            ServiceResponse <AttackResultDto> response = new ServiceResponse <AttackResultDto>();

            try
            {
                Character attacker = await this.context.Characters
                                     .Include(c => c.CharacterSkills).ThenInclude(cs => cs.Skill)
                                     .FirstOrDefaultAsync(c => c.Id == request.AttackerId);

                Character opponent = await this.context.Characters
                                     .FirstOrDefaultAsync(c => c.Id == request.OpponentId);

                CharacterSkill characterSkill =
                    attacker.CharacterSkills.FirstOrDefault(cs => cs.Skill.Id == request.SkillId);
                if (characterSkill == null)
                {
                    response.Success = false;
                    response.Message = $"{attacker.Name} doesn't know that skill.";
                    return(response);
                }
                int damage = DoSkillAttack(attacker, opponent, characterSkill);
                if (opponent.HitPoints <= 0)
                {
                    response.Message = $"{opponent.Name} has been defeated!";
                }

                this.context.Characters.Update(opponent);
                await this.context.SaveChangesAsync();

                response.Data = new AttackResultDto
                {
                    Attacker   = attacker.Name,
                    AttackerHP = attacker.HitPoints,
                    Opponent   = opponent.Name,
                    OpponentHP = opponent.HitPoints,
                    Damage     = damage
                };
            }
            catch (Exception ex)
            {
                response.Success = false;
                response.Message = ex.Message;
            }
            return(response);
        }
예제 #2
0
        public async Task <ServiceResponse <AttackResultDto> > SkillAttack(SkillAttackDto request)
        {
            ServiceResponse <AttackResultDto> response = new ServiceResponse <AttackResultDto>();

            try
            {
                Character attacker = await _dataContext.Characters
                                     .Include(c => c.CharacterSkills).ThenInclude(c => c.Skill)
                                     .FirstOrDefaultAsync(c => c.Id == request.AttackerId);

                Character opponent = await _dataContext.Characters
                                     .FirstOrDefaultAsync(c => c.Id == request.OpponentId);

                CharacterSkill characterSkill = attacker.CharacterSkills.FirstOrDefault(c => c.Skill.Id == request.SkillId);
                if (characterSkill == null)
                {
                    response.Success = false;
                    response.Message = string.Format("{0}  doesnt know that skill.", attacker.Name);
                    return(response);
                }

                var damage = DoSkillAttack(characterSkill, attacker, opponent);

                if (opponent.HitPoints < 0)
                {
                    response.Message = string.Format("{0} has been defeated.", opponent.Name);
                }

                _dataContext.Characters.Update(opponent);
                await _dataContext.SaveChangesAsync();

                response.Data = new AttackResultDto
                {
                    Attacker = attacker.Name, AttackerHp = attacker.HitPoints, Opponent = opponent.Name, OpponentHP = opponent.HitPoints, Damage = damage
                };
            }
            catch (Exception e)
            {
                response.Success = false;
                response.Message = e.Message;
            }

            return(response);
        }
예제 #3
0
        public async Task <ServiceResponse <AttackResultDto> > SkillAttack(SkillAttackDto request)
        {
            ServiceResponse <AttackResultDto> response = new ServiceResponse <AttackResultDto>();

            try
            {
                Character attacker = await _context.Characters
                                     .Include(c => c.CharacterSkills).ThenInclude(cs => cs.Skill)
                                     .FirstOrDefaultAsync(c => c.Id == request.AttackerId);

                Character Opponent = await _context.Characters.FirstOrDefaultAsync(c => c.Id == request.OpponentId);

                CharacterSkill skill = await _context.CharacterSkills.FirstOrDefaultAsync();

                int damage = attacker.weapon.Damage + (new Random().Next(attacker.Strength));
                damage -= new Random().Next(Opponent.Defense);
                if (damage > 0)
                {
                    Opponent.HitPoints -= damage;
                }
                if (Opponent.HitPoints <= 0)
                {
                    response.Message = $"{Opponent.Name} has been defeated";
                }
                _context.Characters.Update(Opponent);
                await _context.SaveChangesAsync();

                response.Data = new AttackResultDto
                {
                    Attacker   = attacker.Name,
                    AttackerHP = attacker.HitPoints,
                    Opponent   = Opponent.Name,
                    OpponentHP = Opponent.HitPoints,
                    Damage     = damage
                };
            }
            catch (Exception ex)
            {
                response.Success = false;
                response.Message = ex.Message;
            }
            return(response);
        }
예제 #4
0
        public async Task <ServiceResponse <AttackResultDto> > SkillAttack(SkillAttackDto skillAttack)
        {
            ServiceResponse <AttackResultDto> response = new ServiceResponse <AttackResultDto>();

            try
            {
                Character attacker = await _characterService.GetCharacterById(skillAttack.AttackerId, AuthType.WithAuth);

                if (attacker == null)
                {
                    throw new Exception("Attacker not found.");
                }

                Skill skill = attacker.CharacterSkills.Select(cs => cs.Skill).FirstOrDefault(s => s.Id == skillAttack.SkillId);
                if (skill == null)
                {
                    throw new Exception("Skill not found");
                }

                Character defender = await _characterService.GetCharacterById(skillAttack.DefenderId, AuthType.NoneAuth);

                if (defender == null)
                {
                    throw new Exception("Defender not found.");
                }

                int damage = DoSkillAttack(attacker, defender, skill);
                if (defender.Health <= 0)
                {
                    response.Message = $"{defender.Name} has fallen!";
                }

                response.Data = AttackResultHandler(attacker, defender, damage);
            }
            catch (Exception e)
            {
                response.Success = false;
                response.Message = e.Message;
            }

            return(response);
        }
예제 #5
0
 public async Task <IActionResult> SkillAttack(SkillAttackDto request)
 {
     return(Ok(await _fightService.SkillAttack(request)));
 }
예제 #6
0
        public async Task <ServiceResponse <AttackResultDto> > SkillAttack(SkillAttackDto request)
        {
            ServiceResponse <AttackResultDto> serviceResponse = new ServiceResponse <AttackResultDto>();

            try
            {
                Character attacker = await _context.Characters
                                     .Include(c => c.CharacterSkills).ThenInclude(cs => cs.Skill)
                                     .FirstOrDefaultAsync(c => c.Id == request.AttackerId);

                Character opponent = await _context.Characters
                                     .FirstOrDefaultAsync(c => c.Id == request.OpponentId);



                //getting the skills of the character (Attacker)
                CharacterSkill characterSkill = attacker.CharacterSkills.FirstOrDefault(cs => cs.Skill.Id == request.SkillId);

                //to check if the skills of characters are null or not
                if (characterSkill == null)
                {
                    serviceResponse.Success = false;
                    serviceResponse.Message = "Character donot know this skill";
                    return(serviceResponse);
                }


                //To check if the user is attacking itseld or not because self attacking is not allowed
                if (request.AttackerId == request.OpponentId)
                {
                    serviceResponse.Success = false;
                    serviceResponse.Message = "Character cannot attack itself";
                    return(serviceResponse);
                }

                /*
                 * Damage formula
                 * We can write the formula of our own choice
                 */
                int damage = SkillAttack(attacker, opponent, characterSkill);
                if (opponent.HitPoints <= 0)
                {
                    serviceResponse.Message = $"{opponent.Name} has been defeated by the attacker {attacker.Name}";
                }

                _context.Characters.Update(opponent);
                await _context.SaveChangesAsync();


                serviceResponse.Data = new AttackResultDto
                {
                    Attacker   = attacker.Name,
                    AttackerHP = attacker.HitPoints,
                    Opponent   = opponent.Name,
                    OpponentHP = opponent.HitPoints,
                    Damage     = damage
                };
            }
            catch (Exception e)
            {
                serviceResponse.Success = false;
                serviceResponse.Message = e.Message;
            }
            return(serviceResponse);
        }
예제 #7
0
 public async Task <ActionResult <ServiceResponse <AttackResultDto> > > SkillAttack(SkillAttackDto request)
 {
     return(Ok(await _fightService.SkillAttack(request)));
 }
예제 #8
0
        public async Task <ServiceResponse <AttackResultDto> > SkillAttack(SkillAttackDto skillAttackDto)
        {
            ServiceResponse <AttackResultDto> serviceResponse = new ServiceResponse <AttackResultDto>();

            try
            {
                Character attacker = await _context.Characters
                                     .Include(c => c.CharacterSkills).ThenInclude(cs => cs.Skill)
                                     .FirstOrDefaultAsync(c => c.Id == skillAttackDto.AttackerID);

                if (attacker == null)
                {
                    serviceResponse.Success = false;
                    serviceResponse.Message = "Attacker not found";
                    return(serviceResponse);
                }

                Character opponent = await _context.Characters
                                     .FirstOrDefaultAsync(c => c.Id == skillAttackDto.OpponentId);

                if (opponent == null)
                {
                    serviceResponse.Success = false;
                    serviceResponse.Message = "Opponent not found";
                    return(serviceResponse);
                }

                CharacterSkill characterSkill = attacker.CharacterSkills.FirstOrDefault(cs => cs.Skill.Id == skillAttackDto.SkillId);
                if (characterSkill == null)
                {
                    serviceResponse.Success = false;
                    serviceResponse.Message = $"{attacker.Name} doesn't know that skill";
                    return(serviceResponse);
                }

                int damage = DoSkillAttack(attacker, opponent, characterSkill);

                if (opponent.HitPoints <= 0)
                {
                    serviceResponse.Message = $"{opponent.Name} has been defeated";
                }

                _context.Characters.Update(opponent);
                await _context.SaveChangesAsync();

                serviceResponse.Data = new AttackResultDto()
                {
                    Attacker    = attacker.Name,
                    Opponent    = opponent.Name,
                    AttackerHP  = attacker.HitPoints,
                    OpponenetHP = opponent.HitPoints,
                    Damage      = damage
                };
            }
            catch (System.Exception ex)
            {
                serviceResponse.Success = false;
                serviceResponse.Message = ex.Message;
            }

            return(serviceResponse);
        }
예제 #9
0
 public async Task <IActionResult> SkillAttack(SkillAttackDto skillAttack) =>
 ActionResultHandler(await _fightService.SkillAttack(skillAttack));