From 56525f2ac23ce42da2a5dcaa47ad95a971224218 Mon Sep 17 00:00:00 2001 From: Joseph Ferano Date: Wed, 1 Jun 2022 16:50:53 +0700 Subject: [PATCH] Embeds for bonus --- Bot/Embeds.fs | 20 +++++++++++++++----- Bot/Games/HackerBattle.fs | 27 +++++++++++++++------------ Bot/Games/Trainer.fs | 5 +++-- 3 files changed, 33 insertions(+), 19 deletions(-) diff --git a/Bot/Embeds.fs b/Bot/Embeds.fs index 103b949..0fc5700 100644 --- a/Bot/Embeds.fs +++ b/Bot/Embeds.fs @@ -49,7 +49,7 @@ let pickDefense actionId player isTrainer = .AddEmbeds([ DiscordEmbedBuilder().WithImageUrl(shieldGif).Build() ; embed.Build() ]) .AsEphemeral(true) -let pickHack actionId attacker defender isTrainer = +let pickHack actionId attacker defender bonus isTrainer = let hackItems = attacker.Inventory |> Inventory.getItemsByType ItemType.Hack @@ -57,10 +57,11 @@ let pickHack actionId attacker defender isTrainer = let buttons = constructButtons actionId $"{defender.DiscordId}-{defender.Name}" attacker hackItems isTrainer let stealMsg = if not isTrainer then $"{defender.Name} has **{defender.Bank} $GBT** we can take from them. " else "" + let strengthMsg = $"You have `{attacker.Stats.Strength.Amount}` strength, while they have `{defender.Stats.Strength.Amount}`\n**Bonus:** `{bonus} 💰$GBT`" let embed = DiscordEmbedBuilder() .WithTitle("Hack Attack") - .WithDescription($"{stealMsg}Pick the hack you want to use.") + .WithDescription($"{stealMsg}\n\n{strengthMsg}\n\nPick the hack you want to use.") if not isTrainer then for hack in Inventory.getHacks attacker.Inventory do @@ -72,14 +73,23 @@ let pickHack actionId attacker defender isTrainer = .AddEmbeds([ DiscordEmbedBuilder().WithImageUrl(hackGif).Build() ; embed.Build() ]) .AsEphemeral true -let responseSuccessfulHack earnedMoney (targetId : uint64) amountTaken (hack : HackItem) = +let responseSuccessfulHack (hacker : PlayerData) (target : PlayerData) totalTaken bonus (hack : HackItem) = + let earnedMoney = totalTaken > 0 let embed = DiscordEmbedBuilder() .WithImageUrl(hack.ImageUrl) .WithTitle("Hack Attack") - .WithDescription($"You successfully hacked <@{targetId}> using {hack.Name}" - + (if earnedMoney then $", and took {amountTaken} 💰$GBT from them!" else "!")) + .WithDescription($"You successfully hacked <@{target.DiscordId}> using {hack.Name}" + + (if earnedMoney then $", and took {totalTaken} 💰$GBT from them!" else "!")) + embed.AddField("Prize", $"`{totalTaken} 💰$GBT`", true) |> ignore + let bonusMsg = + if bonus > 0 + then $"{hacker.Stats.Strength.Amount} **VS** {target.Stats.Strength.Amount} -> `+{bonus} $GBT`" + else "None" + embed.AddField("Strength Bonus", bonusMsg, true) |> ignore + + embed.AddField("New $GBT Balance", $"`💰` {hacker.Bank} ⋙ `💰` {hacker.Bank + totalTaken} `(+{totalTaken} $GBT)`") |> ignore DiscordFollowupMessageBuilder() .AddEmbed(embed.Build()) .AsEphemeral(true) diff --git a/Bot/Games/HackerBattle.fs b/Bot/Games/HackerBattle.fs index eb19b6b..c693712 100644 --- a/Bot/Games/HackerBattle.fs +++ b/Bot/Games/HackerBattle.fs @@ -69,6 +69,14 @@ let checkTargetHasFunds target player = | true -> Error $"Looks like the poor bastard has no $GBT... pick a different victim." | false -> Ok player +let strengthBonus attacker defender = + attacker - defender + |> max 0 + |> float + |> (*) 0.01 + |> (*) 200.0 // Bonus + |> int + let runHackerBattle defender (hack : HackItem) = defender |> Player.removeExpiredActions @@ -102,19 +110,13 @@ let updateCombatants successfulHack (attacker : PlayerData) (defender : PlayerDa |> Async.Ignore let successfulHack (ctx : IDiscordContext) attacker defender (hack : HackItem) = - let strengthBonus attacker defender = - attacker - defender - |> max 0 - |> float - |> (*) 0.01 - |> (*) 200.0 // Bonus - |> int async { - let bonus = strengthBonus attacker.Stats.Strength.Amount defender.Stats.Strength.Amount - let prizeAmount = if hack.Power + bonus < int defender.Bank then hack.Power + bonus else int defender.Bank - do! updateCombatants true attacker defender hack (prizeAmount * 1) + let bonus = strengthBonus attacker.Stats.Strength.Amount defender.Stats.Strength.Amount |> (*) 1 + let basePrize = hack.Power * 1 + let prizeAmount = if basePrize + bonus < defender.Bank then basePrize + bonus else defender.Bank + do! updateCombatants true attacker defender hack prizeAmount - let embed = Embeds.responseSuccessfulHack true defender.DiscordId prizeAmount hack + let embed = Embeds.responseSuccessfulHack attacker defender prizeAmount bonus hack do! ctx.FollowUp embed |> Async.AwaitTask let builder = Embeds.eventSuccessfulHack ctx defender prizeAmount @@ -150,7 +152,8 @@ let hack (target : DiscordUser) (ctx : IDiscordContext) = >>= checkPlayerIsAttackingThemselves defender |> function | Ok atkr -> async { - let embed = Embeds.pickHack "Attack" atkr defender false + let bonus = strengthBonus attacker.Stats.Strength.Amount defender.Stats.Strength.Amount + let embed = Embeds.pickHack "Attack" atkr defender bonus false do! ctx.FollowUp(embed) |> Async.AwaitTask // TODO: Add a call when it's an error with the error type, must include an error code do! Analytics.hackCommand (ctx.GetDiscordMember()) diff --git a/Bot/Games/Trainer.fs b/Bot/Games/Trainer.fs index ccffa7b..bf3694f 100644 --- a/Bot/Games/Trainer.fs +++ b/Bot/Games/Trainer.fs @@ -126,7 +126,7 @@ let hack (target : DiscordUser) (ctx : IDiscordContext) = | true -> let player = { PlayerData.empty with Inventory = [ hackItem ] } let bot = { PlayerData.empty with DiscordId = Sensei.Id ; Name = Sensei.Name } - let embed = Embeds.pickHack "Trainer-4" player bot true + let embed = Embeds.pickHack "Trainer-4" player bot 0 true do! ctx.FollowUp(embed) |> Async.AwaitTask | false -> @@ -143,7 +143,8 @@ let handleHack (ctx : IDiscordContext) = PlayerInteractions.executePlayerAction ctx (fun player -> async { let sendMessage' = sendFollowUpMessage ctx do! Async.Sleep 1000 - let embed = Embeds.responseSuccessfulHack false Sensei.Id defaultHack.Power defaultHack + let bot = { PlayerData.empty with DiscordId = Sensei.Id ; Name = Sensei.Name } + let embed = Embeds.responseSuccessfulHack player bot (defaultHack.Power * 1) 0 defaultHack do! ctx.FollowUp(embed) |> Async.AwaitTask do! Async.Sleep 1000 do! sendMessage'