Fix some trainer bugs
This commit is contained in:
parent
1f58bdba60
commit
00f3633b2e
@ -12,8 +12,8 @@
|
|||||||
<Compile Include="GuildEnvironment.fs" />
|
<Compile Include="GuildEnvironment.fs" />
|
||||||
<Compile Include="Messaging.fs" />
|
<Compile Include="Messaging.fs" />
|
||||||
<Compile Include="GameTypes.fs" />
|
<Compile Include="GameTypes.fs" />
|
||||||
<Compile Include="GameHelpers.fs" />
|
|
||||||
<Compile Include="DbService.fs" />
|
<Compile Include="DbService.fs" />
|
||||||
|
<Compile Include="GameHelpers.fs" />
|
||||||
<Compile Include="Analytics.fs" />
|
<Compile Include="Analytics.fs" />
|
||||||
<Compile Include="PlayerInteractions.fs" />
|
<Compile Include="PlayerInteractions.fs" />
|
||||||
<Compile Include="InviteTracker.fs" />
|
<Compile Include="InviteTracker.fs" />
|
||||||
|
@ -37,6 +37,7 @@ let readItem (reader : RowReader) =
|
|||||||
Item.Attributes = [
|
Item.Attributes = [
|
||||||
reader.intOrNone "buy_price" |> Option.map (fun a -> Buyable (a * 1<GBT>))
|
reader.intOrNone "buy_price" |> Option.map (fun a -> Buyable (a * 1<GBT>))
|
||||||
reader.intOrNone "sell_price" |> Option.map (fun a -> Sellable (a * 1<GBT>))
|
reader.intOrNone "sell_price" |> Option.map (fun a -> Sellable (a * 1<GBT>))
|
||||||
|
reader.intOrNone "rate_limit" |> Option.map (fun a -> RateLimitable (a * 1<mins>))
|
||||||
reader.intOrNone "expiration" |> Option.map (fun a -> Expireable (a * 1<mins>))
|
reader.intOrNone "expiration" |> Option.map (fun a -> Expireable (a * 1<mins>))
|
||||||
reader.floatOrNone "drop_chance" |> Option.map (float >> Droppable)
|
reader.floatOrNone "drop_chance" |> Option.map (float >> Droppable)
|
||||||
reader.intOrNone "attack_power" |> Option.map Attackable
|
reader.intOrNone "attack_power" |> Option.map Attackable
|
||||||
@ -124,8 +125,8 @@ let getWeapons () =
|
|||||||
connStr
|
connStr
|
||||||
|> Sql.connect
|
|> Sql.connect
|
||||||
|> Sql.query """
|
|> Sql.query """
|
||||||
SELECT i.id,i.name,description,icon_url,image_url,category,buy_price,sell_price,rate_limit,expiration,drop_chance,can_trade,can_consume,
|
SELECT id,name,description,icon_url,image_url,category,buy_price,sell_price,rate_limit,expiration,
|
||||||
attack_power,defense_power,class_name,max_stack,mods
|
drop_chance,can_trade,can_consume,attack_power,defense_power,class_name,max_stack,mods
|
||||||
FROM item WHERE category = 'Hack' OR category = 'Shield'
|
FROM item WHERE category = 'Hack' OR category = 'Shield'
|
||||||
"""
|
"""
|
||||||
|> Sql.executeAsync readItem
|
|> Sql.executeAsync readItem
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
namespace Degenz
|
namespace Degenz
|
||||||
|
|
||||||
open System
|
open System
|
||||||
|
open System.Threading
|
||||||
open DSharpPlus
|
open DSharpPlus
|
||||||
open DSharpPlus.Entities
|
open DSharpPlus.Entities
|
||||||
open Degenz
|
open Degenz
|
||||||
@ -19,7 +20,7 @@ module Inventory =
|
|||||||
|
|
||||||
let getHackItem item =
|
let getHackItem item =
|
||||||
match item.Type , item.Attributes with
|
match item.Type , item.Attributes with
|
||||||
| ItemType.Hack , CanBuy buyPrice & CanSell _ & CanAttack power & CanExpire cooldown & CanClass ``class``->
|
| ItemType.Hack , CanBuy buyPrice & CanSell _ & CanAttack power & CanRateLimit cooldown & CanClass ``class``->
|
||||||
Some { Id = item.Id
|
Some { Id = item.Id
|
||||||
Name = item.Name
|
Name = item.Name
|
||||||
Price = buyPrice
|
Price = buyPrice
|
||||||
@ -32,7 +33,7 @@ module Inventory =
|
|||||||
|
|
||||||
let getShieldItem item =
|
let getShieldItem item =
|
||||||
match item.Type , item.Attributes with
|
match item.Type , item.Attributes with
|
||||||
| ItemType.Shield , CanBuy buyPrice & CanSell _ & CanDefend resistance & CanExpire cooldown & CanClass ``class`` ->
|
| ItemType.Shield , CanBuy buyPrice & CanSell _ & CanDefend resistance & CanRateLimit cooldown & CanClass ``class`` ->
|
||||||
Some { Id = item.Id
|
Some { Id = item.Id
|
||||||
Name = item.Name
|
Name = item.Name
|
||||||
Price = buyPrice
|
Price = buyPrice
|
||||||
@ -64,9 +65,9 @@ module WeaponClass =
|
|||||||
|
|
||||||
let getClassButtonColor item =
|
let getClassButtonColor item =
|
||||||
match item.Attributes with
|
match item.Attributes with
|
||||||
| CanClass "0" -> ButtonStyle.Danger
|
| CanClass "NETWORK" -> ButtonStyle.Danger
|
||||||
| CanClass "1" -> ButtonStyle.Primary
|
| CanClass "EXPLOIT" -> ButtonStyle.Primary
|
||||||
| CanClass "2" -> ButtonStyle.Success
|
| CanClass "PENETRATION" -> ButtonStyle.Success
|
||||||
| _ -> ButtonStyle.Primary
|
| _ -> ButtonStyle.Primary
|
||||||
|
|
||||||
let getClassEmbedColor item =
|
let getClassEmbedColor item =
|
||||||
@ -100,43 +101,10 @@ module Player =
|
|||||||
|
|
||||||
let modifyBank (player : PlayerData) amount = { player with Bank = max (player.Bank + amount) 0<GBT> }
|
let modifyBank (player : PlayerData) amount = { player with Bank = max (player.Bank + amount) 0<GBT> }
|
||||||
|
|
||||||
module PlayerStats =
|
|
||||||
// 2.09f would go from 100 to 0 in roughly 48 hours
|
|
||||||
let Strength = { Id = StatId.Strength ; BaseDecayRate = 2.09 ; BaseRange = Range.normalized }
|
|
||||||
let Focus = { Id = StatId.Focus ; BaseDecayRate = 2.09 ; BaseRange = Range.normalized }
|
|
||||||
let Luck = { Id = StatId.Luck ; BaseDecayRate = 2.09 ; BaseRange = Range.normalized }
|
|
||||||
let Charisma = { Id = StatId.Charisma ; BaseDecayRate = 2.09 ; BaseRange = Range.normalized }
|
|
||||||
|
|
||||||
let stats = [ Strength ; Focus ; Charisma ; Luck ]
|
|
||||||
|
|
||||||
let getPlayerStat (statConfig : StatConfig) player =
|
|
||||||
match statConfig.Id with
|
|
||||||
| StatId.Strength -> player.Stats.Strength
|
|
||||||
| StatId.Focus -> player.Stats.Focus
|
|
||||||
| StatId.Charisma -> player.Stats.Charisma
|
|
||||||
| StatId.Luck -> player.Stats.Luck
|
|
||||||
| _ -> player.Stats.Luck
|
|
||||||
|
|
||||||
let calculateActiveStat statId amount items =
|
|
||||||
let statConfig = stats |> List.find (fun s -> s.Id = statId)
|
|
||||||
// let hoursElapsed = (DateTime.UtcNow - lastRead).Hours
|
|
||||||
// let totalDecay = float hoursElapsed * statConfig.BaseDecayRate
|
|
||||||
let modMinMax =
|
|
||||||
let min =
|
|
||||||
items
|
|
||||||
|> List.choose (fun i -> match i.Attributes with CanModify fx -> Some fx | _ -> None)
|
|
||||||
|> List.concat
|
|
||||||
|> List.sumBy (fun fx -> match fx.Effect with | Min x -> x | _ -> 0)
|
|
||||||
let max =
|
|
||||||
items
|
|
||||||
|> List.choose (fun i -> match i.Attributes with CanModify fx -> Some fx | _ -> None)
|
|
||||||
|> List.concat
|
|
||||||
|> List.sumBy (fun fx -> match fx.Effect with | Max x -> x | _ -> 0)
|
|
||||||
Range.create (statConfig.BaseRange.Min + min) (statConfig.BaseRange.Max + max)
|
|
||||||
let amountAfterDecay = modMinMax |> Range.constrain amount
|
|
||||||
{ Id = statId ; Amount = amountAfterDecay ; ModRange = modMinMax ; LastRead = DateTime.UtcNow }
|
|
||||||
|
|
||||||
module Arsenal =
|
module Arsenal =
|
||||||
|
let weapons = DbService.getWeapons () |> Async.RunSynchronously
|
||||||
|
|
||||||
let battleItemFormat (items : Inventory) =
|
let battleItemFormat (items : Inventory) =
|
||||||
match items with
|
match items with
|
||||||
| [] -> "None"
|
| [] -> "None"
|
||||||
@ -165,5 +133,5 @@ module Arsenal =
|
|||||||
let hacks = Player.getHackEvents p
|
let hacks = Player.getHackEvents p
|
||||||
$"**Hacks:** {Inventory.getItemsByType ItemType.Hack p.Inventory |> battleItemFormat}\n
|
$"**Hacks:** {Inventory.getItemsByType ItemType.Hack p.Inventory |> battleItemFormat}\n
|
||||||
**Shields:** {Inventory.getItemsByType ItemType.Shield p.Inventory |> battleItemFormat}\n
|
**Shields:** {Inventory.getItemsByType ItemType.Shield p.Inventory |> battleItemFormat}\n
|
||||||
**Hack Attacks:**\n{hacks |> List.take (min hacks.Length 10) |> actionFormat p.Inventory}\n
|
**Hack Attacks:**\n{hacks |> List.take (min hacks.Length 10) |> actionFormat weapons}\n
|
||||||
**Active Shields:**\n{Player.getShieldEvents p |> actionFormat p.Inventory}"
|
**Active Shields:**\n{Player.getShieldEvents p |> actionFormat weapons}"
|
||||||
|
@ -190,3 +190,38 @@ with member this.toDiscordPlayer = { Id = this.DiscordId ; Name = this.Name }
|
|||||||
Bank = 0<GBT>
|
Bank = 0<GBT>
|
||||||
Active = false }
|
Active = false }
|
||||||
|
|
||||||
|
module PlayerStats =
|
||||||
|
// 2.09f would go from 100 to 0 in roughly 48 hours
|
||||||
|
let Strength = { Id = StatId.Strength ; BaseDecayRate = 2.09 ; BaseRange = Range.normalized }
|
||||||
|
let Focus = { Id = StatId.Focus ; BaseDecayRate = 2.09 ; BaseRange = Range.normalized }
|
||||||
|
let Luck = { Id = StatId.Luck ; BaseDecayRate = 2.09 ; BaseRange = Range.normalized }
|
||||||
|
let Charisma = { Id = StatId.Charisma ; BaseDecayRate = 2.09 ; BaseRange = Range.normalized }
|
||||||
|
|
||||||
|
let stats = [ Strength ; Focus ; Charisma ; Luck ]
|
||||||
|
|
||||||
|
let getPlayerStat (statConfig : StatConfig) player =
|
||||||
|
match statConfig.Id with
|
||||||
|
| StatId.Strength -> player.Stats.Strength
|
||||||
|
| StatId.Focus -> player.Stats.Focus
|
||||||
|
| StatId.Charisma -> player.Stats.Charisma
|
||||||
|
| StatId.Luck -> player.Stats.Luck
|
||||||
|
| _ -> player.Stats.Luck
|
||||||
|
|
||||||
|
let calculateActiveStat statId amount items =
|
||||||
|
let statConfig = stats |> List.find (fun s -> s.Id = statId)
|
||||||
|
// let hoursElapsed = (DateTime.UtcNow - lastRead).Hours
|
||||||
|
// let totalDecay = float hoursElapsed * statConfig.BaseDecayRate
|
||||||
|
let modMinMax =
|
||||||
|
let min =
|
||||||
|
items
|
||||||
|
|> List.choose (fun i -> match i.Attributes with CanModify fx -> Some fx | _ -> None)
|
||||||
|
|> List.concat
|
||||||
|
|> List.sumBy (fun fx -> match fx.Effect with | Min x -> x | _ -> 0)
|
||||||
|
let max =
|
||||||
|
items
|
||||||
|
|> List.choose (fun i -> match i.Attributes with CanModify fx -> Some fx | _ -> None)
|
||||||
|
|> List.concat
|
||||||
|
|> List.sumBy (fun fx -> match fx.Effect with | Max x -> x | _ -> 0)
|
||||||
|
Range.create (statConfig.BaseRange.Min + min) (statConfig.BaseRange.Max + max)
|
||||||
|
let amountAfterDecay = modMinMax |> Range.constrain amount
|
||||||
|
{ Id = statId ; Amount = amountAfterDecay ; ModRange = modMinMax ; LastRead = DateTime.UtcNow }
|
||||||
|
@ -83,7 +83,7 @@ let runHackerBattle defender (hack : HackItem) =
|
|||||||
|> List.exists (fun event ->
|
|> List.exists (fun event ->
|
||||||
match event.Type with
|
match event.Type with
|
||||||
| Shielding id ->
|
| Shielding id ->
|
||||||
let item = Inventory.findItemById id Trainer.weapons
|
let item = Inventory.findItemById id Arsenal.weapons
|
||||||
match item.Attributes with
|
match item.Attributes with
|
||||||
| CanClass c -> hack.Class = c
|
| CanClass c -> hack.Class = c
|
||||||
| _ -> false
|
| _ -> false
|
||||||
@ -166,7 +166,7 @@ let handleAttack (ctx : IDiscordContext) =
|
|||||||
let tokens = ctx.GetInteractionId().Split("-")
|
let tokens = ctx.GetInteractionId().Split("-")
|
||||||
let hackId = tokens.[1]
|
let hackId = tokens.[1]
|
||||||
// TODO: This sucks
|
// TODO: This sucks
|
||||||
let item = Trainer.weapons |> Inventory.findItemById hackId
|
let item = Arsenal.weapons |> Inventory.findItemById hackId
|
||||||
let hackItem = (Inventory.getHackItem item).Value
|
let hackItem = (Inventory.getHackItem item).Value
|
||||||
let resultId , targetId = UInt64.TryParse tokens.[2]
|
let resultId , targetId = UInt64.TryParse tokens.[2]
|
||||||
let! resultTarget = DbService.tryFindPlayer targetId
|
let! resultTarget = DbService.tryFindPlayer targetId
|
||||||
@ -207,7 +207,7 @@ let handleDefense (ctx : IDiscordContext) =
|
|||||||
executePlayerAction ctx (fun player -> async {
|
executePlayerAction ctx (fun player -> async {
|
||||||
let tokens = ctx.GetInteractionId().Split("-")
|
let tokens = ctx.GetInteractionId().Split("-")
|
||||||
let shieldId = tokens.[1]
|
let shieldId = tokens.[1]
|
||||||
let item = Trainer.weapons |> Inventory.findItemById shieldId
|
let item = Arsenal.weapons |> Inventory.findItemById shieldId
|
||||||
let shieldItem = (Inventory.getShieldItem item).Value
|
let shieldItem = (Inventory.getShieldItem item).Value
|
||||||
|
|
||||||
do! player
|
do! player
|
||||||
|
@ -336,8 +336,8 @@ let sendArmoryEmbed (ctx : IDiscordContext) =
|
|||||||
embed.Color <- DiscordColor.Black
|
embed.Color <- DiscordColor.Black
|
||||||
embed.Description <- "Buy Shields to protect yourself or buy Hacks to extract $GBT from others"
|
embed.Description <- "Buy Shields to protect yourself or buy Hacks to extract $GBT from others"
|
||||||
builder.AddEmbed embed |> ignore
|
builder.AddEmbed embed |> ignore
|
||||||
let btn1 = DiscordButtonComponent(ButtonStyle.Success, $"ShowHacks-0", $"Hacks") :> DiscordComponent
|
let btn1 = DiscordButtonComponent(ButtonStyle.Success, $"ShowHacks-0-ARMORY", $"Hacks") :> DiscordComponent
|
||||||
let btn2 = DiscordButtonComponent(ButtonStyle.Success, $"ShowShields-0", $"Shields") :> DiscordComponent
|
let btn2 = DiscordButtonComponent(ButtonStyle.Success, $"ShowShields-0-ARMORY", $"Shields") :> DiscordComponent
|
||||||
builder.AddComponents [| btn1 ; btn2 |] |> ignore
|
builder.AddComponents [| btn1 ; btn2 |] |> ignore
|
||||||
|
|
||||||
do! GuildEnvironment.botClientStore.Value.SendMessageAsync(channel, builder)
|
do! GuildEnvironment.botClientStore.Value.SendMessageAsync(channel, builder)
|
||||||
|
@ -9,9 +9,8 @@ open Degenz.Messaging
|
|||||||
|
|
||||||
let TrainerAchievement = "LEARN_TO_HACKER_BATTLE_QUEST_COMPLETED"
|
let TrainerAchievement = "LEARN_TO_HACKER_BATTLE_QUEST_COMPLETED"
|
||||||
let Sensei = { Id = GuildEnvironment.botIdHackerBattle ; Name = "Sensei" }
|
let Sensei = { Id = GuildEnvironment.botIdHackerBattle ; Name = "Sensei" }
|
||||||
let weapons = DbService.getWeapons () |> Async.RunSynchronously
|
let hackItem = Arsenal.weapons |> Inventory.findItemById (string ItemId.REMOTE)
|
||||||
let hackItem = weapons |> Inventory.findItemById (string ItemId.VIRUS)
|
let shieldItem = Arsenal.weapons |> Inventory.findItemById (string ItemId.FIREWALL)
|
||||||
let shieldItem = weapons |> Inventory.findItemById (string ItemId.FIREWALL)
|
|
||||||
let defaultHack = (Inventory.getHackItem hackItem).Value
|
let defaultHack = (Inventory.getHackItem hackItem).Value
|
||||||
let defaultShield = (Inventory.getShieldItem shieldItem ).Value
|
let defaultShield = (Inventory.getShieldItem shieldItem ).Value
|
||||||
let CurrencyGift = 250<GBT>
|
let CurrencyGift = 250<GBT>
|
||||||
@ -99,7 +98,6 @@ let handleDefense (ctx : IDiscordContext) =
|
|||||||
|
|
||||||
let sendMessage' = sendFollowUpMessage ctx
|
let sendMessage' = sendFollowUpMessage ctx
|
||||||
let tokens = ctx.GetInteractionId().Split("-")
|
let tokens = ctx.GetInteractionId().Split("-")
|
||||||
let shieldId = enum<ItemId>(int tokens.[2])
|
|
||||||
let playerName = tokens.[4]
|
let playerName = tokens.[4]
|
||||||
let embed = Embeds.responseCreatedShield defaultShield
|
let embed = Embeds.responseCreatedShield defaultShield
|
||||||
do! ctx.FollowUp embed |> Async.AwaitTask
|
do! ctx.FollowUp embed |> Async.AwaitTask
|
||||||
@ -218,7 +216,7 @@ let handleArsenal (ctx : IDiscordContext) = PlayerInteractions.executePlayerActi
|
|||||||
}
|
}
|
||||||
do! DbService.updatePlayer updatedPlayer |> Async.Ignore
|
do! DbService.updatePlayer updatedPlayer |> Async.Ignore
|
||||||
try
|
try
|
||||||
do! ShieldEvents ()
|
do! ShieldEvents () @ [ HackEvent () ]
|
||||||
|> List.map (DbService.addPlayerEvent player.DiscordId)
|
|> List.map (DbService.addPlayerEvent player.DiscordId)
|
||||||
|> Async.Parallel
|
|> Async.Parallel
|
||||||
|> Async.Ignore
|
|> Async.Ignore
|
||||||
|
Loading…
x
Reference in New Issue
Block a user