From c7ee6bfa6a52afeeabb71c92739fc0fd41b2ae8a Mon Sep 17 00:00:00 2001 From: Joseph Ferano Date: Thu, 17 Feb 2022 00:11:41 +0700 Subject: [PATCH] Change events so it's a positive/negative dynamic and can be shared --- Bot/Game.fs | 14 +++++++------- Bot/HackerBattle.fs | 8 ++++---- Bot/Thief.fs | 6 +++--- Bot/Trainer.fs | 11 +++++------ DbService/DbService.fs | 12 ------------ Shared/Shared.fs | 11 +++++------ 6 files changed, 24 insertions(+), 38 deletions(-) diff --git a/Bot/Game.fs b/Bot/Game.fs index e235d89..e73777a 100644 --- a/Bot/Game.fs +++ b/Bot/Game.fs @@ -68,10 +68,10 @@ module Player = let getShields (player : PlayerData) = getItems ItemType.Shield player let getHackEvents player = player.Events - |> Array.filter (fun act -> match act.Type with PlayerEventType.Hack -> true | _ -> false || act.ItemId < 12) + |> Array.filter (fun act -> match act.Type with PlayerEventType.Hacking -> true | _ -> false || act.ItemId < 12) let getShieldEvents player = player.Events - |> Array.filter (fun act -> match act.Type with PlayerEventType.Shield -> true | _ -> false || act.ItemId < 12) + |> Array.filter (fun act -> match act.Type with PlayerEventType.Shielding -> true | _ -> false || act.ItemId < 12) // TODO: This parameter is a result of putting the cooldown on the attack side. Put the cooldown on the defender // side and only check if it's the same target, we need to refactor Actions @@ -89,9 +89,9 @@ module Player = |> int match act.Type , filterByAttackCooldown with - | PlayerEventType.Hack , true -> System.DateTime.UtcNow - act.Timestamp < System.TimeSpan.FromMinutes(itemCooldown) - | PlayerEventType.Hack , false -> System.DateTime.UtcNow - act.Timestamp < Game.SameTargetAttackCooldown - | PlayerEventType.Shield , _ -> System.DateTime.UtcNow - act.Timestamp < System.TimeSpan.FromMinutes(itemCooldown) + | PlayerEventType.Hacking , true -> System.DateTime.UtcNow - act.Timestamp < System.TimeSpan.FromMinutes(itemCooldown) + | PlayerEventType.Hacking , false -> System.DateTime.UtcNow - act.Timestamp < Game.SameTargetAttackCooldown + | PlayerEventType.Shielding , _ -> System.DateTime.UtcNow - act.Timestamp < System.TimeSpan.FromMinutes(itemCooldown) | _ -> System.DateTime.UtcNow - act.Timestamp < System.TimeSpan.FromMinutes(itemCooldown)) { player with Events = actions } @@ -110,14 +110,14 @@ module Arsenal = let hacks , defenses = actions |> Array.filter (fun act -> act.ItemId < 12) - |> Array.partition (fun act -> match act.Type with PlayerEventType.Hack -> true | _ -> false) + |> Array.partition (fun act -> match act.Type with PlayerEventType.Hacking -> true | _ -> false) let hacks = hacks |> Array.take (min hacks.Length 10) hacks |> Array.append defenses |> Array.map (fun act -> let item = Armory.getItem act.ItemId match act.Type with - | PlayerEventType.Hack -> + | PlayerEventType.Hacking -> let cooldown = Messaging.getTimeText false Game.SameTargetAttackCooldown act.Timestamp $"Hacked {act.Adversary.Name} {cooldown} ago" | _ -> diff --git a/Bot/HackerBattle.fs b/Bot/HackerBattle.fs index 6681cd6..8fd6c8e 100644 --- a/Bot/HackerBattle.fs +++ b/Bot/HackerBattle.fs @@ -82,9 +82,9 @@ let updateCombatants attacker defender hack prize = let target = { Id = defender.DiscordId ; Name = defender.Name } let attack = { ItemId = int hack - Type = PlayerEventType.Hack + Type = PlayerEventType.Hacking Adversary = target - Result = if prize > 0 then PlayerEventResult.Successful else PlayerEventResult.Failed + Result = if prize > 0 then PlayerEventResult.Positive else PlayerEventResult.Negative Timestamp = DateTime.UtcNow } @@ -191,8 +191,8 @@ let handleDefense (ctx : IDiscordContext) = do! ctx.FollowUp embed |> Async.AwaitTask let defense = { ItemId = shieldId - Type = PlayerEventType.Shield - Result = PlayerEventResult.Successful + Type = PlayerEventType.Shielding + Result = PlayerEventResult.Positive Timestamp = DateTime.UtcNow Adversary = DiscordPlayer.empty } diff --git a/Bot/Thief.fs b/Bot/Thief.fs index 1600d91..a2b0c7a 100644 --- a/Bot/Thief.fs +++ b/Bot/Thief.fs @@ -85,7 +85,7 @@ let checkVictimStealingCooldown defender attacker = defender |> Player.removeExpiredActions false |> Player.getShieldEvents - |> Array.tryFind (fun pe -> pe.Type = PlayerEventType.Mugged) + |> Array.tryFind (fun pe -> pe.Type = PlayerEventType.Steal && pe.Result = PlayerEventResult.Negative) |> function | Some act -> let cooldown = VictimRecovery - (DateTime.UtcNow - act.Timestamp) @@ -161,11 +161,11 @@ let handleSteal (ctx : IDiscordContext) = do! Messaging.sendFollowUpEmbed ctx (embed.Build()) match! DbService.tryFindPlayer targetId with | Some t -> - let mugged = { ItemId = -1 ; Type = PlayerEventType.Mugged ; Result = PlayerEventResult.Failed ; Adversary = player.basicPlayer ; Timestamp = DateTime.UtcNow } + let mugged = { ItemId = -1 ; Type = PlayerEventType.Steal ; Result = PlayerEventResult.Negative ; Adversary = player.basicPlayer ; Timestamp = DateTime.UtcNow } let actions = t |> Player.removeExpiredActions false |> fun p -> Array.append [| mugged |] p.Events do! DbService.updatePlayer { t with Bank = max (t.Bank - prize) 0 ; Events = actions } | None -> () - let stole = { ItemId = -1 ; Type = PlayerEventType.Steal ; Result = PlayerEventResult.Successful ; Adversary = dp ; Timestamp = DateTime.UtcNow } + let stole = { ItemId = -1 ; Type = PlayerEventType.Steal ; Result = PlayerEventResult.Positive ; Adversary = dp ; Timestamp = DateTime.UtcNow } let actions = player |> Player.removeExpiredActions false |> fun p -> Array.append [| stole |] p.Events do! DbService.updatePlayer { player with Bank = player.Bank + prize ; XP = player.XP + xp ; Events = actions } let newLevel = XP.getLevel (player.XP + xp) diff --git a/Bot/Trainer.fs b/Bot/Trainer.fs index 2039043..d161485 100644 --- a/Bot/Trainer.fs +++ b/Bot/Trainer.fs @@ -142,8 +142,7 @@ let handleAttack (ctx : IDiscordContext) = let sb = StringBuilder("Here, ") - let! achievements = DbService.getAchievements player.DiscordId - let isFirstTrainer = achievements |> Option.map (Seq.contains trainerAchievement >> not) |> Option.defaultValue true + let isFirstTrainer = player.Achievements |> Seq.contains trainerAchievement |> not if isFirstTrainer then do! DbService.addAchievement player.DiscordId trainerAchievement @@ -173,14 +172,14 @@ let handleAttack (ctx : IDiscordContext) = Events = [ { PlayerEvent.Timestamp = System.DateTime.UtcNow PlayerEvent.Adversary = { Id = GuildEnvironment.botIdHackerBattle ; Name = "Sensei" } - PlayerEvent.Type = PlayerEventType.Shield - PlayerEvent.Result = PlayerEventResult.Successful + PlayerEvent.Type = PlayerEventType.Shielding + PlayerEvent.Result = PlayerEventResult.Positive PlayerEvent.ItemId = defaultHack.Id } if not hasShields && Array.exists (fun act -> act.ItemId = freeShield.Id) player.Events |> not then { PlayerEvent.Timestamp = System.DateTime.UtcNow PlayerEvent.Adversary = { Id = GuildEnvironment.botIdHackerBattle ; Name = "Sensei" } - PlayerEvent.Type = PlayerEventType.Shield - PlayerEvent.Result = PlayerEventResult.Successful + PlayerEvent.Type = PlayerEventType.Shielding + PlayerEvent.Result = PlayerEventResult.Positive PlayerEvent.ItemId = defaultHack.Id } ] |> Seq.toArray |> Array.append player.Events diff --git a/DbService/DbService.fs b/DbService/DbService.fs index c8dae60..930f6a3 100644 --- a/DbService/DbService.fs +++ b/DbService/DbService.fs @@ -7,18 +7,6 @@ open MongoDB.Bson.Serialization open MongoDB.Driver open Degenz.Types -[] -type AttackAction = - { ActionId : int - Result : bool - Target : DiscordPlayer - Timestamp : DateTime } - -[] -type DefenseAction = - { ActionId : int - Timestamp : DateTime } - [] type PlayerEntry = { DiscordId : uint64 diff --git a/Shared/Shared.fs b/Shared/Shared.fs index c5071c1..b9c9ddf 100644 --- a/Shared/Shared.fs +++ b/Shared/Shared.fs @@ -68,17 +68,15 @@ module Types = with static member empty = { Id = 0uL ; Name = "None" } type PlayerEventResult = - | Successful = 0 + | Positive = 0 | Neutral = 1 - | Failed = 2 + | Negative = 2 type PlayerEventType = - | Hack = 0 - | Shield = 1 + | Hacking = 0 + | Shielding = 1 | Steal = 2 - | Mugged = 3 | Imprison = 3 - | Imprisoned = 3 [] type PlayerEvent = @@ -88,6 +86,7 @@ module Types = ItemId : int Timestamp : DateTime } + [] type PlayerTraits = { Strength : int Focus : int