diff --git a/Bot/Thief.fs b/Bot/Thief.fs index fa67294..1dc974f 100644 --- a/Bot/Thief.fs +++ b/Bot/Thief.fs @@ -43,10 +43,8 @@ let payout defenderBank chance = let getStealEmbed amount (chance : double) prize (target : PlayerData) = let chance = int (chance * 100.0) let buttons = -// let yes , no = getRandomStealBtnLabels () let btnId = $"Steal-yes-{target.DiscordId}-{target.Name}-{amount}" [ DiscordButtonComponent(ButtonStyle.Success, btnId, "Do it") ] -// DiscordButtonComponent(ButtonStyle.Danger, $"Steal-no", no) ] |> Seq.cast let embed = DiscordEmbedBuilder() @@ -59,6 +57,7 @@ let getStealEmbed amount (chance : double) prize (target : PlayerData) = .AddComponents(buttons) .AsEphemeral(true) + let getResultEmbed chance prize (bank : int) thief (victim : DiscordPlayer) result = let embed = DiscordEmbedBuilder() @@ -118,23 +117,42 @@ let checkThiefCooldown attacker = let calculateWinPercentage amountRequested bank attackerStrength defenderStrength = let powerPercentage = float (attackerStrength - defenderStrength) * 0.005 + 0.1 let cappedAmount = float bank * 0.5 - let cappedRequest = min amountRequested (cappedAmount |> ceil) + let cappedRequest , wasCapped = if amountRequested > cappedAmount then ( cappedAmount , true ) else ( amountRequested , false ) let wagerPercentage = 1.0 - (cappedRequest / cappedAmount) // Max chance of success is 90.0% - ( cappedRequest , max 0.0 (wagerPercentage * 0.7 + powerPercentage * 1.3 ) / 2.0 ) + ( int cappedRequest , max 0.0 (wagerPercentage * 0.7 + powerPercentage * 1.3 ) / 2.0 , wasCapped ) //calculateWinPercentage 50 200 100 85 let steal target amount (ctx : IDiscordContext) = - Game.executePlayerActionWithTarget target ctx (fun attacker defender -> async { do! - attacker - |> checkVictimStealingCooldown defender + Game.executePlayerActionWithTarget target ctx (fun thief victim -> async { do! + thief + |> checkVictimStealingCooldown victim >>= checkThiefCooldown |> handleResultWithResponse ctx (fun _ -> async { - let cappedPrize , winPercentage = calculateWinPercentage amount (int defender.Bank) attacker.Traits.Strength defender.Traits.Strength - let embed = getStealEmbed amount winPercentage cappedPrize defender + let cappedPrize , winPercentage , wasCapped = + calculateWinPercentage amount (int victim.Bank) thief.Traits.Strength victim.Traits.Strength - do! ctx.FollowUp(embed) |> Async.AwaitTask + let chance = int (winPercentage * 100.0) + let buttons = + let btnId = $"Steal-yes-{victim.DiscordId}-{victim.Name}-{cappedPrize}" + [ DiscordButtonComponent(ButtonStyle.Success, btnId, $"Steal {cappedPrize} $GBT") ] + |> Seq.cast + + let cappedMsg = if wasCapped then $"They only have {cappedPrize} $GBT though... " else "" + let strengthMsg = + match thief.Traits.Strength - victim.Traits.Strength with + | diff when diff < -50 -> "much stronger" + | diff when diff < 0 -> "stronger" + | diff when diff < 50 -> "weaker" + | _ -> "much weaker" + let msg = + DiscordFollowupMessageBuilder() + .WithContent($"Want to steal from <@{victim.DiscordId}>? They look {strengthMsg} than us so we have a **{chance}%% of success**. {cappedMsg}What do you say?") + .AddComponents(buttons) + .AsEphemeral(true) + + do! ctx.FollowUp(msg) |> Async.AwaitTask }) }) @@ -146,7 +164,7 @@ let handleSteal (ctx : IDiscordContext) = let targetId = uint64 split.[2] let targetName = split.[3] let amount = int split.[4] - let prize , winPercentage = calculateWinPercentage amount (int victim.Bank) thief.Traits.Strength victim.Traits.Strength + let prize , winPercentage , _ = calculateWinPercentage amount (int victim.Bank) thief.Traits.Strength victim.Traits.Strength let prize = int prize * 1 let rand = Random(Guid.NewGuid().GetHashCode()) @@ -231,15 +249,6 @@ let handleSteal (ctx : IDiscordContext) = type StealGame() = inherit ApplicationCommandModule () - let enforceChannel (ctx : IDiscordContext) (storeFn : IDiscordContext -> Task) = - match ctx.GetChannel().Id with - | id when id = GuildEnvironment.channelThievery -> storeFn ctx - | _ -> - task { - let msg = $"You must go to <#{GuildEnvironment.channelThievery}> channel if you want to mug some unsuspecting doofs" - do! Messaging.sendSimpleResponse ctx msg - } - [] member this.Steal (ctx : InteractionContext, [] target : DiscordUser,