Beispiel #1
0
        public async Task <DougResponse> Steal(User user, User target, string channel)
        {
            if (user.IsStealOnCooldown())
            {
                return(new DougResponse(string.Format(DougMessages.CommandOnCooldown, user.CalculateStealCooldownRemaining())));
            }

            var channelType = _channelRepository.GetChannelType(channel);

            if (channelType != ChannelType.Common && channelType != ChannelType.Pvp)
            {
                return(new DougResponse(DougMessages.NotInRightChannel));
            }

            var usersInChannel = await _slack.GetUsersInChannel(channel);

            if (usersInChannel.All(usr => usr != target.Id))
            {
                return(new DougResponse(DougMessages.UserIsNotInPvp));
            }

            var energy = user.Energy - StealEnergyCost;

            if (energy < 0)
            {
                return(new DougResponse(DougMessages.NotEnoughEnergy));
            }

            _statsRepository.UpdateEnergy(user.Id, energy);
            _userRepository.SetStealCooldown(user.Id, user.GetStealCooldown());

            var userChance   = _eventDispatcher.OnStealingChance(user, user.BaseStealSuccessRate());
            var targetChance = _eventDispatcher.OnGettingStolenChance(target, target.BaseOpponentStealSuccessRate());

            var rollSuccessful = _randomService.RollAgainstOpponent(userChance, targetChance);

            var amount = _eventDispatcher.OnStealingAmount(user, user.BaseStealAmount());

            if (target.Credits - amount < 0)
            {
                amount = target.Credits;
            }

            if (rollSuccessful)
            {
                _userRepository.RemoveCredits(target.Id, amount);
                _userRepository.AddCredits(user.Id, amount);

                var message = string.Format(DougMessages.StealCredits, _userService.Mention(user), amount, _userService.Mention(target));
                await _slack.BroadcastMessage(message, channel);
            }
            else
            {
                var message = string.Format(DougMessages.StealFail, _userService.Mention(user), _userService.Mention(target));
                await _slack.BroadcastMessage(message, channel);
            }

            return(new DougResponse());
        }
Beispiel #2
0
        public async Task <DougResponse> Attack(User user, User target, string channel)
        {
            if (user.IsAttackOnCooldown())
            {
                return(new DougResponse(string.Format(DougMessages.CommandOnCooldown, user.CalculateAttackCooldownRemaining())));
            }

            var channelType = _channelRepository.GetChannelType(channel);

            if (channelType != ChannelType.Pvp)
            {
                return(new DougResponse(DougMessages.NotInRightChannel));
            }

            var usersInChannel = await _slack.GetUsersInChannel(channel);

            if (usersInChannel.All(usr => usr != target.Id))
            {
                return(new DougResponse(DougMessages.UserIsNotInPvp));
            }

            _statsRepository.SetAttackCooldown(user.Id, user.GetAttackCooldown());

            var attack = user.AttackTarget(target, _eventDispatcher);

            await DealDamageToUser(user, attack, target, channel);

            return(new DougResponse());
        }
Beispiel #3
0
        protected override bool CanActivateSkill(User user, ICombatable target, string channel, out DougResponse response)
        {
            var totalCooldown = Cooldown * (1 - user.CooldownReduction());

            if (target is User targetUser)
            {
                var usersInChannel = _slack.GetUsersInChannel(channel).Result;
                if (usersInChannel.All(usr => usr != targetUser.Id))
                {
                    response = new DougResponse(DougMessages.UserNotInChannel);
                    return(false);
                }
            }

            if (user.IsSkillOnCooldown())
            {
                response = new DougResponse(string.Format(DougMessages.CommandOnCooldown, user.CalculateStealCooldownRemaining()));
                return(false);
            }

            if (!user.HasEnoughEnergyForCost(EnergyCost))
            {
                response = new DougResponse(DougMessages.NotEnoughEnergy);
                return(false);
            }

            user.Energy -= EnergyCost;
            StatsRepository.FireSkill(user.Id, TimeSpan.FromSeconds(totalCooldown), user.Energy);
            response = new DougResponse();
            return(true);
        }
Beispiel #4
0
        public async Task <DougResponse> Attack(User user, User target, string channel)
        {
            var energy = user.Energy - AttackEnergyCost;

            if (user.IsAttackOnCooldown())
            {
                return(new DougResponse(string.Format(DougMessages.CommandOnCooldown, user.CalculateAttackCooldownRemaining())));
            }

            if (energy < 0)
            {
                return(new DougResponse(DougMessages.NotEnoughEnergy));
            }

            var channelType = _channelRepository.GetChannelType(channel);

            if (channelType != ChannelType.Pvp)
            {
                return(new DougResponse(DougMessages.NotInRightChannel));
            }

            var usersInChannel = await _slack.GetUsersInChannel(channel);

            if (usersInChannel.All(usr => usr != target.Id))
            {
                return(new DougResponse(DougMessages.UserIsNotInPvp));
            }

            _statsRepository.UpdateEnergy(user.Id, energy);
            _statsRepository.SetAttackCooldown(user.Id, user.GetAttackCooldown());

            await DealDamage(user, target, channel);

            return(new DougResponse());
        }
Beispiel #5
0
        public override async Task <DougResponse> Activate(User user, ICombatable target, string channel)
        {
            if (!CanActivateSkill(user, out var response))
            {
                return(response);
            }

            if (target == null)
            {
                return(new DougResponse());
            }

            if (target is User targetUser)
            {
                var channelType = _channelRepository.GetChannelType(channel);
                if (channelType != ChannelType.Common && channelType != ChannelType.Pvp)
                {
                    return(new DougResponse(DougMessages.NotInRightChannel));
                }

                var usersInChannel = await _slack.GetUsersInChannel(channel);

                if (usersInChannel.All(usr => usr != targetUser.Id))
                {
                    return(new DougResponse(DougMessages.UserIsNotInPvp));
                }

                response = await StealFromUser(user, targetUser, channel);
            }

            return(response);
        }
Beispiel #6
0
        protected override bool CanActivateSkill(User user, ICombatable target, string channel, out DougResponse response)
        {
            if (target is User targetUser)
            {
                _eventDispatcher.OnAttacking(user, target, 0);

                var channelType = _channelRepository.GetChannelType(channel);
                if (channelType != ChannelType.Pvp)
                {
                    response = new DougResponse(DougMessages.NotInRightChannel);
                    return(false);
                }

                var usersInChannel = _slack.GetUsersInChannel(channel).Result;
                if (usersInChannel.All(usr => usr != targetUser.Id))
                {
                    response = new DougResponse(DougMessages.UserIsNotInPvp);
                    return(false);
                }
            }

            return(base.CanActivateSkill(user, target, channel, out response));
        }