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 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 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.sumBy (fun item -> match item with | Accessory a -> a.FloorBoost | _ -> 0)
 | 
			
		||||
            let max = items |> List.sumBy (fun item -> match item with | Accessory a -> a.CeilBoost  | _ -> 0)
 | 
			
		||||
            let min =
 | 
			
		||||
                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)
 | 
			
		||||
        let amountAfterDecay = modMinMax |> Range.constrain amount
 | 
			
		||||
        { Id = statId ; Amount = amountAfterDecay ; ModRange = modMinMax ; LastRead = DateTime.UtcNow }
 | 
			
		||||
 | 
			
		||||
@ -131,6 +131,11 @@ type AccessoryItem = {
 | 
			
		||||
    Item : Item
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type MeleeWeapon = {
 | 
			
		||||
    BreakChance : float
 | 
			
		||||
    Item : Item
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type ItemDetails =
 | 
			
		||||
    | Hack of HackItem
 | 
			
		||||
    | Shield of ShieldItem
 | 
			
		||||
 | 
			
		||||
@ -232,6 +232,28 @@ let showInventoryEmbed (ctx : IDiscordContext) = PlayerInteractions.executePlaye
 | 
			
		||||
    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() =
 | 
			
		||||
    inherit ApplicationCommandModule ()
 | 
			
		||||
@ -283,3 +305,7 @@ type Store() =
 | 
			
		||||
    member this.Inventory (ctx : InteractionContext) =
 | 
			
		||||
        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