namespace Degenz open DSharpPlus open DSharpPlus.Entities open Newtonsoft.Json module Armory = let battleItems = let file = System.IO.File.ReadAllText("Items.json") // let file = System.IO.File.ReadAllText("Bot/Items.json") JsonConvert.DeserializeObject(file) let hacks = battleItems |> Array.filter (fun bi -> match bi.Type with ItemType.Hack -> true | _ -> false) let shields = battleItems |> Array.filter (fun bi -> match bi.Type with ItemType.Shield -> true | _ -> false) let getItem itemId = battleItems |> Array.find (fun w -> w.Id = itemId) module WeaponClass = let SameTargetAttackCooldown = System.TimeSpan.FromHours(1) let getClassButtonColor = function | 0 -> ButtonStyle.Danger | 1 -> ButtonStyle.Primary | _ -> ButtonStyle.Success let getClassEmbedColor = function | 0 -> DiscordColor.Red | 1 -> DiscordColor.Blurple | _ -> DiscordColor.Green let getGoodAgainst = function | 0 -> ( ShieldId.Firewall , HackId.Virus ) | 1 -> ( ShieldId.Encryption , HackId.RemoteAccess ) | _ -> ( ShieldId.Cypher , HackId.Worm ) module Player = let getItems itemType (player : PlayerData) = player.Inventory |> Array.filter (fun i -> i.Type = itemType) let getHacks (player : PlayerData) = getItems ItemType.Hack player let getShields (player : PlayerData) = getItems ItemType.Shield player let getHackEvents player = player.Events |> Array.filter (fun act -> match act.Type with PlayerEventType.Hacking h -> h.IsInstigator | _ -> false) let getShieldEvents player = player.Events |> Array.filter (fun act -> match act.Type with PlayerEventType.Shielding _ -> true | _ -> false) let removeExpiredActions player = let actions = player.Events |> Array.filter (fun (act : PlayerEvent) -> let cooldown = System.TimeSpan.FromMinutes(int act.Cooldown) System.DateTime.UtcNow - act.Timestamp < cooldown) { player with Events = actions } let modifyBank (player : PlayerData) amount = { player with Bank = max (player.Bank + amount) 0 } module Arsenal = let battleItemFormat (items : Item array) = match items with | [||] -> "None" | _ -> items |> Array.toList |> List.map (fun i -> i.Name) |> String.concat ", " let actionFormat (actions : PlayerEvent array) = match actions with | [||] -> "None" | acts -> acts |> Array.map (fun act -> match act.Type with | Hacking h -> let item = Armory.getItem h.HackId let cooldown = Messaging.getTimeText false WeaponClass.SameTargetAttackCooldown act.Timestamp $"Hacked {h.Adversary.Name} with {item.Name} {cooldown} ago" | Shielding id -> let item = Armory.getItem id let cooldown = Messaging.getTimeText true (System.TimeSpan.FromMinutes(int act.Cooldown)) act.Timestamp $"{item.Name} Shield active for {cooldown}" | _ -> "") |> Array.filter (System.String.IsNullOrWhiteSpace >> not) |> String.concat "\n" let statusFormat p = let hacks = Player.getHackEvents p $"**Hacks:** {Player.getHacks p |> battleItemFormat}\n **Shields:** {Player.getShields p |> battleItemFormat}\n **Hack Attacks:**\n{ hacks |> Array.take (min hacks.Length 10) |> actionFormat}\n **Active Shields:**\n{Player.getShieldEvents p |> actionFormat}"