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()); }
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()); }
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); }
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()); }
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); }
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)); }