Stealing mechanic with different scenarios and maths, start RPS game
This commit is contained in:
		
							parent
							
								
									bb9c04fe6e
								
							
						
					
					
						commit
						7e2b46a96b
					
				@ -15,9 +15,10 @@
 | 
				
			|||||||
        <Compile Include="Game.fs" />
 | 
					        <Compile Include="Game.fs" />
 | 
				
			||||||
        <Compile Include="PlayerInteractions.fs" />
 | 
					        <Compile Include="PlayerInteractions.fs" />
 | 
				
			||||||
        <Compile Include="Embeds.fs" />
 | 
					        <Compile Include="Embeds.fs" />
 | 
				
			||||||
        <Compile Include="Store.fs" />
 | 
					 | 
				
			||||||
        <Compile Include="Thief.fs" />
 | 
					 | 
				
			||||||
        <Compile Include="SlotMachine.fs" />
 | 
					        <Compile Include="SlotMachine.fs" />
 | 
				
			||||||
 | 
					        <Compile Include="Thief.fs" />
 | 
				
			||||||
 | 
					        <Compile Include="RockPaperScissors.fs" />
 | 
				
			||||||
 | 
					        <Compile Include="Store.fs" />
 | 
				
			||||||
        <Compile Include="Trainer.fs" />
 | 
					        <Compile Include="Trainer.fs" />
 | 
				
			||||||
        <Compile Include="HackerBattle.fs" />
 | 
					        <Compile Include="HackerBattle.fs" />
 | 
				
			||||||
        <Compile Include="Bot.fs" />
 | 
					        <Compile Include="Bot.fs" />
 | 
				
			||||||
 | 
				
			|||||||
@ -22,6 +22,7 @@ let channelBattle = getId "CHANNEL_BATTLE"
 | 
				
			|||||||
let botIdHackerBattle = getId "BOT_HACKER_BATTLE"
 | 
					let botIdHackerBattle = getId "BOT_HACKER_BATTLE"
 | 
				
			||||||
let botIdArmory = getId "BOT_ARMORY"
 | 
					let botIdArmory = getId "BOT_ARMORY"
 | 
				
			||||||
let roleTrainee = getId "ROLE_TRAINEE"
 | 
					let roleTrainee = getId "ROLE_TRAINEE"
 | 
				
			||||||
 | 
					let rolePrisoner = getId "ROLE_PRISONER"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
let mutable botUserHackerBattle : DiscordUser option = None
 | 
					let mutable botUserHackerBattle : DiscordUser option = None
 | 
				
			||||||
let mutable botUserArmory : DiscordUser option = None
 | 
					let mutable botUserArmory : DiscordUser option = None
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										53
									
								
								Bot/RockPaperScissors.fs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										53
									
								
								Bot/RockPaperScissors.fs
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,53 @@
 | 
				
			|||||||
 | 
					module Degenz.RockPaperScissors
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					open System
 | 
				
			||||||
 | 
					open System.Threading.Tasks
 | 
				
			||||||
 | 
					open DSharpPlus
 | 
				
			||||||
 | 
					open DSharpPlus.Entities
 | 
				
			||||||
 | 
					open DSharpPlus.SlashCommands
 | 
				
			||||||
 | 
					open Degenz.Messaging
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type Move =
 | 
				
			||||||
 | 
					    | Rock
 | 
				
			||||||
 | 
					    | Paper
 | 
				
			||||||
 | 
					    | Scissor
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type RoundResult =
 | 
				
			||||||
 | 
					    | P1Win
 | 
				
			||||||
 | 
					    | P2Win
 | 
				
			||||||
 | 
					    | Draw
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					let player1Won p1m p2m =
 | 
				
			||||||
 | 
					    match p1m , p2m with
 | 
				
			||||||
 | 
					    | Rock    , Paper    -> P2Win
 | 
				
			||||||
 | 
					    | Rock    , Scissor  -> P1Win
 | 
				
			||||||
 | 
					    | Paper   , Rock     -> P1Win
 | 
				
			||||||
 | 
					    | Paper   , Scissor  -> P2Win
 | 
				
			||||||
 | 
					    | Scissor , Rock     -> P2Win
 | 
				
			||||||
 | 
					    | Scissor , Paper    -> P1Win
 | 
				
			||||||
 | 
					    | _       , _        -> Draw
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					let playRPS target ctx =
 | 
				
			||||||
 | 
					    Game.executePlayerWithTargetAction target ctx (fun attacker defender -> async {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        return ()
 | 
				
			||||||
 | 
					    })
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type StealGame() =
 | 
				
			||||||
 | 
					    inherit ApplicationCommandModule ()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    let enforceChannel (ctx : IDiscordContext) (storeFn : IDiscordContext -> Task) =
 | 
				
			||||||
 | 
					        match ctx.GetChannel().Id with
 | 
				
			||||||
 | 
					        | id when id = GuildEnvironment.channelArmory -> storeFn ctx
 | 
				
			||||||
 | 
					        | _ ->
 | 
				
			||||||
 | 
					            task {
 | 
				
			||||||
 | 
					                let msg = $"You must go to <#{GuildEnvironment.channelArmory}> channel to buy or sell weapons"
 | 
				
			||||||
 | 
					                do! Messaging.sendSimpleResponse ctx msg
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    [<SlashCommand("rock-paper-scissors", "Steal some money from another player, but you might go to prison if caught")>]
 | 
				
			||||||
 | 
					    member this.RPS (ctx : InteractionContext, [<Option("target", "Who do you want to play with?")>] target : DiscordUser) =
 | 
				
			||||||
 | 
					//        enforceChannel (DiscordInteractionContext ctx) (steal target)
 | 
				
			||||||
 | 
					        playRPS target (DiscordInteractionContext ctx)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
							
								
								
									
										77
									
								
								Bot/Thief.fs
									
									
									
									
									
								
							
							
						
						
									
										77
									
								
								Bot/Thief.fs
									
									
									
									
									
								
							@ -7,6 +7,11 @@ open DSharpPlus.Entities
 | 
				
			|||||||
open DSharpPlus.SlashCommands
 | 
					open DSharpPlus.SlashCommands
 | 
				
			||||||
open Degenz.Messaging
 | 
					open Degenz.Messaging
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type StealResult =
 | 
				
			||||||
 | 
					    | Success
 | 
				
			||||||
 | 
					    | WentToPrison
 | 
				
			||||||
 | 
					    | TargetRanAway
 | 
				
			||||||
 | 
					
 | 
				
			||||||
let getRandomStealBtnLabels () =
 | 
					let getRandomStealBtnLabels () =
 | 
				
			||||||
    let rand = Random(Guid.NewGuid().GetHashCode())
 | 
					    let rand = Random(Guid.NewGuid().GetHashCode())
 | 
				
			||||||
    let affirmative = [| "LFG" ; "YOLO" ; "IDGAF" |]
 | 
					    let affirmative = [| "LFG" ; "YOLO" ; "IDGAF" |]
 | 
				
			||||||
@ -20,22 +25,28 @@ let chanceOfSuccessMsg = function
 | 
				
			|||||||
    | _                   -> "Totally worth it"
 | 
					    | _                   -> "Totally worth it"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
let targetEvaluationMsg = function
 | 
					let targetEvaluationMsg = function
 | 
				
			||||||
    | amt when amt < 0.20 -> "but man, they look swole."
 | 
					    | amt when amt < 0.20 -> "but man, they look swole"
 | 
				
			||||||
    | amt when amt < 0.50 -> "but they look a little confident"
 | 
					    | amt when amt < 0.50 -> "but they look a little confident"
 | 
				
			||||||
    | amt when amt < 0.80 -> "and they're looking a little nervous"
 | 
					    | amt when amt < 0.80 -> "and they're looking a little nervous"
 | 
				
			||||||
    | _                   -> "and they look weak af man"
 | 
					    | _                   -> "and they look weak af man"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
let payoutChance targetBank chance = targetBank * 0.1 * (1.0 - chance)
 | 
					let payout defenderBank chance =
 | 
				
			||||||
 | 
					    let rand = Random(Guid.NewGuid().GetHashCode())
 | 
				
			||||||
 | 
					    let baseAmount = defenderBank * 0.1 * (1.0 - chance)
 | 
				
			||||||
 | 
					    let randomBonus = baseAmount * rand.NextDouble() * chance |> ceil
 | 
				
			||||||
 | 
					    let randomAmount = baseAmount + randomBonus |> int
 | 
				
			||||||
 | 
					    max 1 randomAmount
 | 
				
			||||||
 | 
					
 | 
				
			||||||
let getStealEmbed chance (target : PlayerData) (player : PlayerData) =
 | 
					let getStealEmbed chance prize (target : PlayerData) =
 | 
				
			||||||
    let buttons =
 | 
					    let buttons =
 | 
				
			||||||
        let yes , no = getRandomStealBtnLabels ()
 | 
					        let yes , no = getRandomStealBtnLabels ()
 | 
				
			||||||
        [ DiscordButtonComponent(ButtonStyle.Success, $"Steal-yes-{target.DiscordId}-{target.Name}-{chance}", yes)
 | 
					        [ DiscordButtonComponent(ButtonStyle.Success, $"Steal-yes-{target.DiscordId}-{target.Name}-{chance}-{prize}", yes)
 | 
				
			||||||
          DiscordButtonComponent(ButtonStyle.Danger, $"Steal-no", no) ]
 | 
					          DiscordButtonComponent(ButtonStyle.Danger, $"Steal-no", no) ]
 | 
				
			||||||
        |> Seq.cast<DiscordComponent>
 | 
					        |> Seq.cast<DiscordComponent>
 | 
				
			||||||
    let embed =
 | 
					    let embed =
 | 
				
			||||||
        DiscordEmbedBuilder()
 | 
					        DiscordEmbedBuilder()
 | 
				
			||||||
          .AddField("Chance of Success", $"{chanceOfSuccessMsg chance}", true)
 | 
					          .AddField("Chance of Success", $"{chanceOfSuccessMsg chance}", true)
 | 
				
			||||||
 | 
					          .AddField("Payout", $"{prize}", true)
 | 
				
			||||||
          .WithDescription($"{target.Name} is coming towards you in a dark alley, {targetEvaluationMsg chance}")
 | 
					          .WithDescription($"{target.Name} is coming towards you in a dark alley, {targetEvaluationMsg chance}")
 | 
				
			||||||
          .WithImageUrl("https://cdnb.artstation.com/p/assets/images/images/017/553/457/large/maarten-hof-backalley-mainshot.jpg")
 | 
					          .WithImageUrl("https://cdnb.artstation.com/p/assets/images/images/017/553/457/large/maarten-hof-backalley-mainshot.jpg")
 | 
				
			||||||
          .WithTitle($"Steal Money")
 | 
					          .WithTitle($"Steal Money")
 | 
				
			||||||
@ -45,11 +56,34 @@ let getStealEmbed chance (target : PlayerData) (player : PlayerData) =
 | 
				
			|||||||
        .AddComponents(buttons)
 | 
					        .AddComponents(buttons)
 | 
				
			||||||
        .AsEphemeral(true)
 | 
					        .AsEphemeral(true)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					let getResultEmbed targetName result =
 | 
				
			||||||
 | 
					    let resultMsg , msg , img =
 | 
				
			||||||
 | 
					        match result with
 | 
				
			||||||
 | 
					        | Success ->
 | 
				
			||||||
 | 
					            "You successfully robbed the poor bastard"
 | 
				
			||||||
 | 
					            , "Your mean ugly face and athletic physique intimidated your poor victim into giving you their money"
 | 
				
			||||||
 | 
					            , "https://f8n-production-collection-assets.imgix.net/0x3B3ee1931Dc30C1957379FAc9aba94D1C48a5405/127502/QmPLPg1CLovKzS7mP8QkrMoHws1D4VZTzpfbZBALLwKZ5b/nft.png"
 | 
				
			||||||
 | 
					        | WentToPrison ->
 | 
				
			||||||
 | 
					            "Looks like you went to prison"
 | 
				
			||||||
 | 
					            , $"{targetName} knows Karate and elbowed you in the nose. While unconscious, they called the cops. You're on your way to prison now... "
 | 
				
			||||||
 | 
					            , "https://thumbs.dreamstime.com/b/vector-pixel-art-prisoner-isolated-cartoon-vector-pixel-art-prisoner-129807237.jpg"
 | 
				
			||||||
 | 
					        | TargetRanAway ->
 | 
				
			||||||
 | 
					            "You tried to snatch their money and they ran away"
 | 
				
			||||||
 | 
					            , $"{targetName} got nervous seeing a shadowy figure and ran in the opposite direction"
 | 
				
			||||||
 | 
					            , "https://i.imgur.com/NLHMvVK.jpg"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    DiscordEmbedBuilder()
 | 
				
			||||||
 | 
					      .AddField("Result" , resultMsg)
 | 
				
			||||||
 | 
					      .WithDescription(msg)
 | 
				
			||||||
 | 
					      .WithImageUrl(img)
 | 
				
			||||||
 | 
					      .WithTitle($"Robbery Results")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
let steal target (ctx : IDiscordContext) =
 | 
					let steal target (ctx : IDiscordContext) =
 | 
				
			||||||
    Game.executePlayerWithTargetAction target ctx (fun attacker defender -> async {
 | 
					    Game.executePlayerWithTargetAction target ctx (fun attacker defender -> async {
 | 
				
			||||||
        let winPercentage = if attacker.Stats.Strength > defender.Stats.Strength then 1.0 else 0.0
 | 
					        let ``base`` = 0.5
 | 
				
			||||||
        let embed = getStealEmbed winPercentage defender attacker
 | 
					        let winPercentage = double (attacker.Stats.Strength - defender.Stats.Strength) * 0.45 + ``base``
 | 
				
			||||||
 | 
					        let prize = payout (float defender.Bank) winPercentage
 | 
				
			||||||
 | 
					        let embed = getStealEmbed winPercentage prize defender
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        do! ctx.FollowUp(embed) |> Async.AwaitTask
 | 
					        do! ctx.FollowUp(embed) |> Async.AwaitTask
 | 
				
			||||||
    })
 | 
					    })
 | 
				
			||||||
@ -62,17 +96,31 @@ let handleSteal (ctx : IDiscordContext) =
 | 
				
			|||||||
            let targetId = uint64 split.[2]
 | 
					            let targetId = uint64 split.[2]
 | 
				
			||||||
            let targetName = split.[3]
 | 
					            let targetName = split.[3]
 | 
				
			||||||
            let chance = double split.[4]
 | 
					            let chance = double split.[4]
 | 
				
			||||||
 | 
					            let prize = int split.[5] * 1<GBT>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            let rand = Random(Guid.NewGuid().GetHashCode())
 | 
					            let rand = Random(Guid.NewGuid().GetHashCode())
 | 
				
			||||||
            let result = rand.NextDouble()
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
            if chance >= result then
 | 
					            let result = chance >= rand.NextDouble() , rand.Next(0,3) = 0
 | 
				
			||||||
                let! target = DbService.tryFindPlayer targetId
 | 
					            match result with
 | 
				
			||||||
                do! Messaging.sendFollowUpMessage ctx $"You stole {targetName} money"
 | 
					            | true , _ ->
 | 
				
			||||||
            else
 | 
					                let xp = 15
 | 
				
			||||||
                do! Messaging.sendFollowUpMessage ctx "You failed miserably"
 | 
					                let embed = getResultEmbed targetName Success
 | 
				
			||||||
 | 
					                embed.AddField("$GBT Stolen", string prize) |> ignore
 | 
				
			||||||
            return ()
 | 
					                embed.AddField("XP Gained", $"{xp}+") |> ignore
 | 
				
			||||||
 | 
					                do! Messaging.sendFollowUpEmbed ctx (embed.Build())
 | 
				
			||||||
 | 
					                match! DbService.tryFindPlayer targetId with
 | 
				
			||||||
 | 
					                | Some t -> do! DbService.updatePlayer { t with Bank = max (t.Bank - prize) 0<GBT> }
 | 
				
			||||||
 | 
					                | None -> ()
 | 
				
			||||||
 | 
					                do! DbService.updatePlayer { player with Bank = player.Bank + prize ; XP = player.XP + xp }
 | 
				
			||||||
 | 
					            | false , false ->
 | 
				
			||||||
 | 
					                let embed = getResultEmbed targetName TargetRanAway
 | 
				
			||||||
 | 
					                do! Messaging.sendFollowUpEmbed ctx (embed.Build())
 | 
				
			||||||
 | 
					            | false , true ->
 | 
				
			||||||
 | 
					                let embed = getResultEmbed targetName WentToPrison
 | 
				
			||||||
 | 
					                do! Messaging.sendFollowUpEmbed ctx (embed.Build())
 | 
				
			||||||
 | 
					                do! Async.Sleep 5000
 | 
				
			||||||
 | 
					                let role = ctx.GetGuild().GetRole(GuildEnvironment.rolePrisoner)
 | 
				
			||||||
 | 
					                do! ctx.GetDiscordMember().GrantRoleAsync(role) |> Async.AwaitTask
 | 
				
			||||||
        })
 | 
					        })
 | 
				
			||||||
    else
 | 
					    else
 | 
				
			||||||
        async {
 | 
					        async {
 | 
				
			||||||
@ -81,7 +129,6 @@ let handleSteal (ctx : IDiscordContext) =
 | 
				
			|||||||
            do! ctx.Respond InteractionResponseType.UpdateMessage builder |> Async.AwaitTask
 | 
					            do! ctx.Respond InteractionResponseType.UpdateMessage builder |> Async.AwaitTask
 | 
				
			||||||
        } |> Async.StartAsTask :> Task
 | 
					        } |> Async.StartAsTask :> Task
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 | 
				
			||||||
type StealGame() =
 | 
					type StealGame() =
 | 
				
			||||||
    inherit ApplicationCommandModule ()
 | 
					    inherit ApplicationCommandModule ()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user