Fix some trainer bugs
This commit is contained in:
parent
1f58bdba60
commit
00f3633b2e
@ -12,8 +12,8 @@
|
||||
<Compile Include="GuildEnvironment.fs" />
|
||||
<Compile Include="Messaging.fs" />
|
||||
<Compile Include="GameTypes.fs" />
|
||||
<Compile Include="GameHelpers.fs" />
|
||||
<Compile Include="DbService.fs" />
|
||||
<Compile Include="GameHelpers.fs" />
|
||||
<Compile Include="Analytics.fs" />
|
||||
<Compile Include="PlayerInteractions.fs" />
|
||||
<Compile Include="InviteTracker.fs" />
|
||||
|
@ -37,6 +37,7 @@ let readItem (reader : RowReader) =
|
||||
Item.Attributes = [
|
||||
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 "rate_limit" |> Option.map (fun a -> RateLimitable (a * 1<mins>))
|
||||
reader.intOrNone "expiration" |> Option.map (fun a -> Expireable (a * 1<mins>))
|
||||
reader.floatOrNone "drop_chance" |> Option.map (float >> Droppable)
|
||||
reader.intOrNone "attack_power" |> Option.map Attackable
|
||||
@ -124,8 +125,8 @@ let getWeapons () =
|
||||
connStr
|
||||
|> Sql.connect
|
||||
|> 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,
|
||||
attack_power,defense_power,class_name,max_stack,mods
|
||||
SELECT id,name,description,icon_url,image_url,category,buy_price,sell_price,rate_limit,expiration,
|
||||
drop_chance,can_trade,can_consume,attack_power,defense_power,class_name,max_stack,mods
|
||||
FROM item WHERE category = 'Hack' OR category = 'Shield'
|
||||
"""
|
||||
|> Sql.executeAsync readItem
|
||||
|
@ -1,6 +1,7 @@
|
||||
namespace Degenz
|
||||
|
||||
open System
|
||||
open System.Threading
|
||||
open DSharpPlus
|
||||
open DSharpPlus.Entities
|
||||
open Degenz
|
||||
@ -19,7 +20,7 @@ module Inventory =
|
||||
|
||||
let getHackItem item =
|
||||
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
|
||||
Name = item.Name
|
||||
Price = buyPrice
|
||||
@ -32,7 +33,7 @@ module Inventory =
|
||||
|
||||
let getShieldItem item =
|
||||
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
|
||||
Name = item.Name
|
||||
Price = buyPrice
|
||||
@ -64,9 +65,9 @@ module WeaponClass =
|
||||
|
||||
let getClassButtonColor item =
|
||||
match item.Attributes with
|
||||
| CanClass "0" -> ButtonStyle.Danger
|
||||
| CanClass "1" -> ButtonStyle.Primary
|
||||
| CanClass "2" -> ButtonStyle.Success
|
||||
| CanClass "NETWORK" -> ButtonStyle.Danger
|
||||
| CanClass "EXPLOIT" -> ButtonStyle.Primary
|
||||
| CanClass "PENETRATION" -> ButtonStyle.Success
|
||||
| _ -> ButtonStyle.Primary
|
||||
|
||||
let getClassEmbedColor item =
|
||||
@ -100,43 +101,10 @@ module Player =
|
||||
|
||||
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 =
|
||||
let weapons = DbService.getWeapons () |> Async.RunSynchronously
|
||||
|
||||
let battleItemFormat (items : Inventory) =
|
||||
match items with
|
||||
| [] -> "None"
|
||||
@ -165,5 +133,5 @@ module Arsenal =
|
||||
let hacks = Player.getHackEvents p
|
||||
$"**Hacks:** {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 p.Inventory}\n
|
||||
**Active Shields:**\n{Player.getShieldEvents p |> actionFormat p.Inventory}"
|
||||
**Hack Attacks:**\n{hacks |> List.take (min hacks.Length 10) |> actionFormat weapons}\n
|
||||
**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>
|
||||
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 ->
|
||||
match event.Type with
|
||||
| Shielding id ->
|
||||
let item = Inventory.findItemById id Trainer.weapons
|
||||
let item = Inventory.findItemById id Arsenal.weapons
|
||||
match item.Attributes with
|
||||
| CanClass c -> hack.Class = c
|
||||
| _ -> false
|
||||
@ -166,7 +166,7 @@ let handleAttack (ctx : IDiscordContext) =
|
||||
let tokens = ctx.GetInteractionId().Split("-")
|
||||
let hackId = tokens.[1]
|
||||
// TODO: This sucks
|
||||
let item = Trainer.weapons |> Inventory.findItemById hackId
|
||||
let item = Arsenal.weapons |> Inventory.findItemById hackId
|
||||
let hackItem = (Inventory.getHackItem item).Value
|
||||
let resultId , targetId = UInt64.TryParse tokens.[2]
|
||||
let! resultTarget = DbService.tryFindPlayer targetId
|
||||
@ -207,7 +207,7 @@ let handleDefense (ctx : IDiscordContext) =
|
||||
executePlayerAction ctx (fun player -> async {
|
||||
let tokens = ctx.GetInteractionId().Split("-")
|
||||
let shieldId = tokens.[1]
|
||||
let item = Trainer.weapons |> Inventory.findItemById shieldId
|
||||
let item = Arsenal.weapons |> Inventory.findItemById shieldId
|
||||
let shieldItem = (Inventory.getShieldItem item).Value
|
||||
|
||||
do! player
|
||||
|
@ -336,8 +336,8 @@ let sendArmoryEmbed (ctx : IDiscordContext) =
|
||||
embed.Color <- DiscordColor.Black
|
||||
embed.Description <- "Buy Shields to protect yourself or buy Hacks to extract $GBT from others"
|
||||
builder.AddEmbed embed |> ignore
|
||||
let btn1 = DiscordButtonComponent(ButtonStyle.Success, $"ShowHacks-0", $"Hacks") :> DiscordComponent
|
||||
let btn2 = DiscordButtonComponent(ButtonStyle.Success, $"ShowShields-0", $"Shields") :> DiscordComponent
|
||||
let btn1 = DiscordButtonComponent(ButtonStyle.Success, $"ShowHacks-0-ARMORY", $"Hacks") :> DiscordComponent
|
||||
let btn2 = DiscordButtonComponent(ButtonStyle.Success, $"ShowShields-0-ARMORY", $"Shields") :> DiscordComponent
|
||||
builder.AddComponents [| btn1 ; btn2 |] |> ignore
|
||||
|
||||
do! GuildEnvironment.botClientStore.Value.SendMessageAsync(channel, builder)
|
||||
|
@ -9,9 +9,8 @@ open Degenz.Messaging
|
||||
|
||||
let TrainerAchievement = "LEARN_TO_HACKER_BATTLE_QUEST_COMPLETED"
|
||||
let Sensei = { Id = GuildEnvironment.botIdHackerBattle ; Name = "Sensei" }
|
||||
let weapons = DbService.getWeapons () |> Async.RunSynchronously
|
||||
let hackItem = weapons |> Inventory.findItemById (string ItemId.VIRUS)
|
||||
let shieldItem = weapons |> Inventory.findItemById (string ItemId.FIREWALL)
|
||||
let hackItem = Arsenal.weapons |> Inventory.findItemById (string ItemId.REMOTE)
|
||||
let shieldItem = Arsenal.weapons |> Inventory.findItemById (string ItemId.FIREWALL)
|
||||
let defaultHack = (Inventory.getHackItem hackItem).Value
|
||||
let defaultShield = (Inventory.getShieldItem shieldItem ).Value
|
||||
let CurrencyGift = 250<GBT>
|
||||
@ -99,7 +98,6 @@ let handleDefense (ctx : IDiscordContext) =
|
||||
|
||||
let sendMessage' = sendFollowUpMessage ctx
|
||||
let tokens = ctx.GetInteractionId().Split("-")
|
||||
let shieldId = enum<ItemId>(int tokens.[2])
|
||||
let playerName = tokens.[4]
|
||||
let embed = Embeds.responseCreatedShield defaultShield
|
||||
do! ctx.FollowUp embed |> Async.AwaitTask
|
||||
@ -218,7 +216,7 @@ let handleArsenal (ctx : IDiscordContext) = PlayerInteractions.executePlayerActi
|
||||
}
|
||||
do! DbService.updatePlayer updatedPlayer |> Async.Ignore
|
||||
try
|
||||
do! ShieldEvents ()
|
||||
do! ShieldEvents () @ [ HackEvent () ]
|
||||
|> List.map (DbService.addPlayerEvent player.DiscordId)
|
||||
|> Async.Parallel
|
||||
|> Async.Ignore
|
||||
|
Loading…
x
Reference in New Issue
Block a user