Basic stats
This commit is contained in:
parent
0d2bfebb2d
commit
8baa8d8f60
@ -88,15 +88,29 @@ module PlayerStats =
|
|||||||
let Luck = { Id = StatId.Luck ; BaseDecayRate = 4.17 ; BaseRange = Range.normalized }
|
let Luck = { Id = StatId.Luck ; BaseDecayRate = 4.17 ; BaseRange = Range.normalized }
|
||||||
let Charisma = { Id = StatId.Charisma ; BaseDecayRate = 4.17 ; BaseRange = Range.normalized }
|
let Charisma = { Id = StatId.Charisma ; BaseDecayRate = 4.17 ; BaseRange = Range.normalized }
|
||||||
|
|
||||||
let stats = [ Strength ; Focus ; Luck ; Charisma ]
|
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 calculateActiveStat statId amount items =
|
||||||
let statConfig = stats |> List.find (fun s -> s.Id = statId)
|
let statConfig = stats |> List.find (fun s -> s.Id = statId)
|
||||||
// let hoursElapsed = (DateTime.UtcNow - lastRead).Hours
|
// let hoursElapsed = (DateTime.UtcNow - lastRead).Hours
|
||||||
// let totalDecay = float hoursElapsed * statConfig.BaseDecayRate
|
// let totalDecay = float hoursElapsed * statConfig.BaseDecayRate
|
||||||
let modMinMax =
|
let modMinMax =
|
||||||
let min = items |> List.sumBy (fun item -> match item with | Accessory a -> a.FloorBoost | _ -> 0)
|
let min =
|
||||||
let max = items |> List.sumBy (fun item -> match item with | Accessory a -> a.CeilBoost | _ -> 0)
|
items
|
||||||
|
|> List.filter (fun item -> match item with | Accessory a -> a.TargetStat = statId | _ -> false)
|
||||||
|
|> List.sumBy (fun item -> match item with | Accessory a -> a.FloorBoost | _ -> 0)
|
||||||
|
let max =
|
||||||
|
items
|
||||||
|
|> List.filter (fun item -> match item with | Accessory a -> a.TargetStat = statId | _ -> false)
|
||||||
|
|> List.sumBy (fun item -> match item with | Accessory a -> a.CeilBoost | _ -> 0)
|
||||||
Range.create (statConfig.BaseRange.Min + min) (statConfig.BaseRange.Max + max)
|
Range.create (statConfig.BaseRange.Min + min) (statConfig.BaseRange.Max + max)
|
||||||
let amountAfterDecay = modMinMax |> Range.constrain amount
|
let amountAfterDecay = modMinMax |> Range.constrain amount
|
||||||
{ Id = statId ; Amount = amountAfterDecay ; ModRange = modMinMax ; LastRead = DateTime.UtcNow }
|
{ Id = statId ; Amount = amountAfterDecay ; ModRange = modMinMax ; LastRead = DateTime.UtcNow }
|
||||||
|
@ -131,6 +131,11 @@ type AccessoryItem = {
|
|||||||
Item : Item
|
Item : Item
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type MeleeWeapon = {
|
||||||
|
BreakChance : float
|
||||||
|
Item : Item
|
||||||
|
}
|
||||||
|
|
||||||
type ItemDetails =
|
type ItemDetails =
|
||||||
| Hack of HackItem
|
| Hack of HackItem
|
||||||
| Shield of ShieldItem
|
| Shield of ShieldItem
|
||||||
|
@ -232,6 +232,28 @@ let showInventoryEmbed (ctx : IDiscordContext) = PlayerInteractions.executePlaye
|
|||||||
do! ctx.FollowUp builder |> Async.AwaitTask
|
do! ctx.FollowUp builder |> Async.AwaitTask
|
||||||
})
|
})
|
||||||
|
|
||||||
|
let showStats (ctx : IDiscordContext) = PlayerInteractions.executePlayerAction ctx (fun player -> async {
|
||||||
|
let embed = DiscordEmbedBuilder()
|
||||||
|
PlayerStats.stats
|
||||||
|
|> List.iter (fun statConfig ->
|
||||||
|
let playerStat = PlayerStats.getPlayerStat statConfig player
|
||||||
|
// let diffSymbol lhs rhs = if lhs < rhs then "-" elif lhs = rhs then "" else "+"
|
||||||
|
let min =
|
||||||
|
match statConfig.BaseRange.Min = playerStat.ModRange.Min with
|
||||||
|
| true -> $"{statConfig.BaseRange.Min}"
|
||||||
|
| false -> $"{statConfig.BaseRange.Min} (+{playerStat.ModRange.Min}) "
|
||||||
|
let max =
|
||||||
|
match statConfig.BaseRange.Max = playerStat.ModRange.Max with
|
||||||
|
| true -> $"{statConfig.BaseRange.Max}"
|
||||||
|
| false -> $"{statConfig.BaseRange.Max} (+{playerStat.ModRange.Max}) "
|
||||||
|
let field = $"{min} |---------------| {max}"
|
||||||
|
embed.AddField(string statConfig.Id , field) |> ignore)
|
||||||
|
let builder =
|
||||||
|
DiscordFollowupMessageBuilder()
|
||||||
|
.AddEmbed(embed)
|
||||||
|
.AsEphemeral(true)
|
||||||
|
do! ctx.FollowUp builder |> Async.AwaitTask
|
||||||
|
})
|
||||||
|
|
||||||
type Store() =
|
type Store() =
|
||||||
inherit ApplicationCommandModule ()
|
inherit ApplicationCommandModule ()
|
||||||
@ -283,3 +305,7 @@ type Store() =
|
|||||||
member this.Inventory (ctx : InteractionContext) =
|
member this.Inventory (ctx : InteractionContext) =
|
||||||
showInventoryEmbed (DiscordInteractionContext ctx)
|
showInventoryEmbed (DiscordInteractionContext ctx)
|
||||||
|
|
||||||
|
[<SlashCommand("stats", "Check your stats")>]
|
||||||
|
member this.Stats (ctx : InteractionContext) =
|
||||||
|
showStats (DiscordInteractionContext ctx)
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user