Fix a few bugs and disable inviter

This commit is contained in:
Joseph Ferano 2022-03-05 19:55:54 +07:00
parent 81cd471a7f
commit eba589746b
7 changed files with 51 additions and 37 deletions

View File

@ -90,7 +90,7 @@ GuildEnvironment.botUserArmory <- Some storeBot.CurrentUser
stealBot.ConnectAsync() |> Async.AwaitTask |> Async.RunSynchronously
inviterBot.ConnectAsync() |> Async.AwaitTask |> Async.RunSynchronously
//inviterBot.ConnectAsync() |> Async.AwaitTask |> Async.RunSynchronously
//let channel = hackerBattleBot.GetChannelAsync(1234uL) |> Async.AwaitTask |> Async.RunSynchronously
//channel.invi

View File

@ -57,8 +57,7 @@ let pickDefense actionId player isTrainer =
.WithDescription("Pick a shield to protect yourself from hacks")
for shield in Inventory.getShields player.Inventory do
// TODO: This is returning a decimal so look into why
let hours = TimeSpan.FromMinutes(int shield.Cooldown).TotalHours
let hours = TimeSpan.FromMinutes(int shield.Cooldown).TotalHours |> int
let against = WeaponClass.getGoodAgainst(shield.Class) |> snd
embed.AddField(shield.Item.Name, $"Active {hours} hours\nDefeats {against}", true) |> ignore

View File

@ -43,7 +43,7 @@ module Inventory =
inventory |> List.choose (fun item -> match item with | Accessory a -> Some a | _ -> None)
module WeaponClass =
let SameTargetAttackCooldown = TimeSpan.FromHours(1)
let SameTargetAttackCooldown = TimeSpan.FromHours(2)
let getClassButtonColor item =
match ItemDetails.getClass item with
@ -130,6 +130,6 @@ module Arsenal =
let statusFormat p =
let hacks = Player.getHackEvents p
$"**Hacks:** {Inventory.getItemsByType ItemType.Hack p.Inventory |> battleItemFormat}\n
**Shields:** {Inventory.getItemsByType ItemType.Hack p.Inventory |> battleItemFormat}\n
**Shields:** {Inventory.getItemsByType ItemType.Shield p.Inventory |> battleItemFormat}\n
**Hack Attacks:**\n{hacks |> List.take (min hacks.Length 10) |> actionFormat}\n
**Active Shields:**\n{Player.getShieldEvents p |> actionFormat}"

View File

@ -65,7 +65,7 @@ let checkPlayerHasShieldSlotsAvailable player =
| false -> Ok updatedPlayer
let checkTargetHasFunds target player =
match target.Bank = 0<GBT> with
match target.Bank <= 0<GBT> with
| true -> Error $"Looks like the poor bastard has no $GBT... pick a different victim."
| false -> Ok player
@ -81,7 +81,6 @@ let runHackerBattle defender (hack : HackItem) =
|> List.contains Weak
let updateCombatants successfulHack (attacker : PlayerData) (defender : PlayerData) (hack : HackItem) prize =
// TODO: Look into the prizes and how we're handling them because it seems it can be negative
let updatePlayer amount attack p =
{ p with Events = attack::p.Events ; Bank = max (p.Bank + amount) 0<GBT> }
let event isDefenderEvent =
@ -162,6 +161,7 @@ let handleAttack (ctx : IDiscordContext) =
|> Player.removeExpiredActions
|> checkAlreadyHackedTarget defender
>>= checkPlayerOwnsWeapon hack.Item
>>= checkTargetHasFunds defender
>>= checkWeaponHasCooldown hack.Item
|> function
| Ok atkr ->

View File

@ -82,7 +82,7 @@ let checkVictimStealingCooldown defender attacker =
| None -> Ok attacker
let checkTargetHasFunds target player =
match target.Bank = 0<GBT> with
match target.Bank <= 0<GBT> with
| true -> Error $"Looks like the poor bastard has no $GBT... pick a different victim."
| false -> Ok player

View File

@ -12,18 +12,21 @@ let Sensei = { Id = GuildEnvironment.botIdHackerBattle ; Name = "Sensei" }
let defaultHack = Armory.weapons |> Inventory.findHackById (int ItemId.Virus)
let defaultShield = Armory.weapons |> Inventory.findShieldById (int ItemId.Firewall)
let TrainerEvents = [
{ Timestamp = System.DateTime.UtcNow
Cooldown = defaultHack.Cooldown
let HackEvent = {
Timestamp = System.DateTime.UtcNow
Cooldown = 1<mins>
Type = Hacking {
Adversary = Sensei
Success = true
IsInstigator = true
HackId = defaultHack.Item.Id } }
{ Timestamp = System.DateTime.UtcNow
HackId = defaultHack.Item.Id
}
}
let ShieldEvent = {
Timestamp = System.DateTime.UtcNow
Cooldown = defaultShield.Cooldown
Type = Shielding defaultShield.Item.Id }
]
Type = Shielding defaultShield.Item.Id
}
let sendInitialEmbed (client : DiscordClient) =
async {
@ -166,27 +169,39 @@ let handleHack (ctx : IDiscordContext) =
let handleArsenal (ctx : IDiscordContext) =
PlayerInteractions.executePlayerAction ctx (fun player -> async {
let hasStockWeapons =
// TODO: This didn't seem to work and someone was gifted both weapons when they already owned one
player.Inventory
|> List.choose (fun item -> if item.Id = defaultHack.Item.Id || item.Id = defaultShield.Item.Id then Some item else None)
|> List.length > 0
let updatedPlayer =
if not hasStockWeapons then {
Player.removeExpiredActions player with
Events = TrainerEvents @ player.Events
Inventory = Hack defaultHack::Shield defaultShield::player.Inventory
}
else
Player.removeExpiredActions player
if not hasStockWeapons then
do!
[ DbService.addPlayerEvent player.DiscordId TrainerEvents.[0]
DbService.addPlayerEvent player.DiscordId TrainerEvents.[1]
DbService.updatePlayer updatedPlayer ]
|> Async.Parallel
|> Async.Ignore
let embed = Embeds.getArsenalEmbed updatedPlayer
let hack =
if player.Inventory |> List.exists (fun i -> i.Id = defaultHack.Item.Id)
then []
else [ Hack defaultHack ]
let shield =
if player.Inventory |> List.exists (fun i -> i.Id = defaultShield.Item.Id)
then []
else [ Shield defaultShield ]
let shieldEvent =
let hasShield =
player
|> Player.removeExpiredActions
|> fun p -> p.Events
|> List.exists (fun e -> match e.Type with Shielding shieldId -> shieldId = defaultShield.Item.Id | _ -> false)
if hasShield
then []
else [ ShieldEvent ]
let updatedPlayer = {
Player.removeExpiredActions player with
Events = shieldEvent @ player.Events
Inventory = hack @ shield @ player.Inventory
}
if not (List.isEmpty hack) || not (List.isEmpty shield) then
do! DbService.updatePlayer updatedPlayer |> Async.Ignore
if not (List.isEmpty shieldEvent) then
do! DbService.addPlayerEvent player.DiscordId (List.head shieldEvent) |> Async.Ignore
let playerForEmbed = {
player with
Events = [ HackEvent ; ShieldEvent ]
Inventory = hack @ shield @ player.Inventory
}
let embed = Embeds.getArsenalEmbed playerForEmbed
do! ctx.FollowUp(embed) |> Async.AwaitTask
let! completed = DbService.checkHasAchievement player.DiscordId trainerAchievement

View File

@ -77,7 +77,7 @@
"Fields": [
{
"Class": 2,
"Cooldown": 380,
"Cooldown": 360,
"Item": {
"Id": 8,
"Name": "Cypher",