Change events so it's a positive/negative dynamic and can be shared

This commit is contained in:
Joseph Ferano 2022-02-17 00:11:41 +07:00
parent 7900bba3c3
commit c7ee6bfa6a
6 changed files with 24 additions and 38 deletions

View File

@ -68,10 +68,10 @@ module Player =
let getShields (player : PlayerData) = getItems ItemType.Shield player let getShields (player : PlayerData) = getItems ItemType.Shield player
let getHackEvents player = let getHackEvents player =
player.Events player.Events
|> Array.filter (fun act -> match act.Type with PlayerEventType.Hack -> true | _ -> false || act.ItemId < 12) |> Array.filter (fun act -> match act.Type with PlayerEventType.Hacking -> true | _ -> false || act.ItemId < 12)
let getShieldEvents player = let getShieldEvents player =
player.Events player.Events
|> Array.filter (fun act -> match act.Type with PlayerEventType.Shield -> true | _ -> false || act.ItemId < 12) |> Array.filter (fun act -> match act.Type with PlayerEventType.Shielding -> true | _ -> false || act.ItemId < 12)
// TODO: This parameter is a result of putting the cooldown on the attack side. Put the cooldown on the defender // TODO: This parameter is a result of putting the cooldown on the attack side. Put the cooldown on the defender
// side and only check if it's the same target, we need to refactor Actions // side and only check if it's the same target, we need to refactor Actions
@ -89,9 +89,9 @@ module Player =
|> int |> int
match act.Type , filterByAttackCooldown with match act.Type , filterByAttackCooldown with
| PlayerEventType.Hack , true -> System.DateTime.UtcNow - act.Timestamp < System.TimeSpan.FromMinutes(itemCooldown) | PlayerEventType.Hacking , true -> System.DateTime.UtcNow - act.Timestamp < System.TimeSpan.FromMinutes(itemCooldown)
| PlayerEventType.Hack , false -> System.DateTime.UtcNow - act.Timestamp < Game.SameTargetAttackCooldown | PlayerEventType.Hacking , false -> System.DateTime.UtcNow - act.Timestamp < Game.SameTargetAttackCooldown
| PlayerEventType.Shield , _ -> System.DateTime.UtcNow - act.Timestamp < System.TimeSpan.FromMinutes(itemCooldown) | PlayerEventType.Shielding , _ -> System.DateTime.UtcNow - act.Timestamp < System.TimeSpan.FromMinutes(itemCooldown)
| _ -> System.DateTime.UtcNow - act.Timestamp < System.TimeSpan.FromMinutes(itemCooldown)) | _ -> System.DateTime.UtcNow - act.Timestamp < System.TimeSpan.FromMinutes(itemCooldown))
{ player with Events = actions } { player with Events = actions }
@ -110,14 +110,14 @@ module Arsenal =
let hacks , defenses = let hacks , defenses =
actions actions
|> Array.filter (fun act -> act.ItemId < 12) |> Array.filter (fun act -> act.ItemId < 12)
|> Array.partition (fun act -> match act.Type with PlayerEventType.Hack -> true | _ -> false) |> Array.partition (fun act -> match act.Type with PlayerEventType.Hacking -> true | _ -> false)
let hacks = hacks |> Array.take (min hacks.Length 10) let hacks = hacks |> Array.take (min hacks.Length 10)
hacks hacks
|> Array.append defenses |> Array.append defenses
|> Array.map (fun act -> |> Array.map (fun act ->
let item = Armory.getItem act.ItemId let item = Armory.getItem act.ItemId
match act.Type with match act.Type with
| PlayerEventType.Hack -> | PlayerEventType.Hacking ->
let cooldown = Messaging.getTimeText false Game.SameTargetAttackCooldown act.Timestamp let cooldown = Messaging.getTimeText false Game.SameTargetAttackCooldown act.Timestamp
$"Hacked {act.Adversary.Name} {cooldown} ago" $"Hacked {act.Adversary.Name} {cooldown} ago"
| _ -> | _ ->

View File

@ -82,9 +82,9 @@ let updateCombatants attacker defender hack prize =
let target = { Id = defender.DiscordId ; Name = defender.Name } let target = { Id = defender.DiscordId ; Name = defender.Name }
let attack = { let attack = {
ItemId = int hack ItemId = int hack
Type = PlayerEventType.Hack Type = PlayerEventType.Hacking
Adversary = target Adversary = target
Result = if prize > 0<GBT> then PlayerEventResult.Successful else PlayerEventResult.Failed Result = if prize > 0<GBT> then PlayerEventResult.Positive else PlayerEventResult.Negative
Timestamp = DateTime.UtcNow Timestamp = DateTime.UtcNow
} }
@ -191,8 +191,8 @@ let handleDefense (ctx : IDiscordContext) =
do! ctx.FollowUp embed |> Async.AwaitTask do! ctx.FollowUp embed |> Async.AwaitTask
let defense = { let defense = {
ItemId = shieldId ItemId = shieldId
Type = PlayerEventType.Shield Type = PlayerEventType.Shielding
Result = PlayerEventResult.Successful Result = PlayerEventResult.Positive
Timestamp = DateTime.UtcNow Timestamp = DateTime.UtcNow
Adversary = DiscordPlayer.empty Adversary = DiscordPlayer.empty
} }

View File

@ -85,7 +85,7 @@ let checkVictimStealingCooldown defender attacker =
defender defender
|> Player.removeExpiredActions false |> Player.removeExpiredActions false
|> Player.getShieldEvents |> Player.getShieldEvents
|> Array.tryFind (fun pe -> pe.Type = PlayerEventType.Mugged) |> Array.tryFind (fun pe -> pe.Type = PlayerEventType.Steal && pe.Result = PlayerEventResult.Negative)
|> function |> function
| Some act -> | Some act ->
let cooldown = VictimRecovery - (DateTime.UtcNow - act.Timestamp) let cooldown = VictimRecovery - (DateTime.UtcNow - act.Timestamp)
@ -161,11 +161,11 @@ let handleSteal (ctx : IDiscordContext) =
do! Messaging.sendFollowUpEmbed ctx (embed.Build()) do! Messaging.sendFollowUpEmbed ctx (embed.Build())
match! DbService.tryFindPlayer targetId with match! DbService.tryFindPlayer targetId with
| Some t -> | Some t ->
let mugged = { ItemId = -1 ; Type = PlayerEventType.Mugged ; Result = PlayerEventResult.Failed ; Adversary = player.basicPlayer ; Timestamp = DateTime.UtcNow } let mugged = { ItemId = -1 ; Type = PlayerEventType.Steal ; Result = PlayerEventResult.Negative ; Adversary = player.basicPlayer ; Timestamp = DateTime.UtcNow }
let actions = t |> Player.removeExpiredActions false |> fun p -> Array.append [| mugged |] p.Events let actions = t |> Player.removeExpiredActions false |> fun p -> Array.append [| mugged |] p.Events
do! DbService.updatePlayer { t with Bank = max (t.Bank - prize) 0<GBT> ; Events = actions } do! DbService.updatePlayer { t with Bank = max (t.Bank - prize) 0<GBT> ; Events = actions }
| None -> () | None -> ()
let stole = { ItemId = -1 ; Type = PlayerEventType.Steal ; Result = PlayerEventResult.Successful ; Adversary = dp ; Timestamp = DateTime.UtcNow } let stole = { ItemId = -1 ; Type = PlayerEventType.Steal ; Result = PlayerEventResult.Positive ; Adversary = dp ; Timestamp = DateTime.UtcNow }
let actions = player |> Player.removeExpiredActions false |> fun p -> Array.append [| stole |] p.Events let actions = player |> Player.removeExpiredActions false |> fun p -> Array.append [| stole |] p.Events
do! DbService.updatePlayer { player with Bank = player.Bank + prize ; XP = player.XP + xp ; Events = actions } do! DbService.updatePlayer { player with Bank = player.Bank + prize ; XP = player.XP + xp ; Events = actions }
let newLevel = XP.getLevel (player.XP + xp) let newLevel = XP.getLevel (player.XP + xp)

View File

@ -142,8 +142,7 @@ let handleAttack (ctx : IDiscordContext) =
let sb = StringBuilder("Here, ") let sb = StringBuilder("Here, ")
let! achievements = DbService.getAchievements player.DiscordId let isFirstTrainer = player.Achievements |> Seq.contains trainerAchievement |> not
let isFirstTrainer = achievements |> Option.map (Seq.contains trainerAchievement >> not) |> Option.defaultValue true
if isFirstTrainer then if isFirstTrainer then
do! DbService.addAchievement player.DiscordId trainerAchievement do! DbService.addAchievement player.DiscordId trainerAchievement
@ -173,14 +172,14 @@ let handleAttack (ctx : IDiscordContext) =
Events = [ Events = [
{ PlayerEvent.Timestamp = System.DateTime.UtcNow { PlayerEvent.Timestamp = System.DateTime.UtcNow
PlayerEvent.Adversary = { Id = GuildEnvironment.botIdHackerBattle ; Name = "Sensei" } PlayerEvent.Adversary = { Id = GuildEnvironment.botIdHackerBattle ; Name = "Sensei" }
PlayerEvent.Type = PlayerEventType.Shield PlayerEvent.Type = PlayerEventType.Shielding
PlayerEvent.Result = PlayerEventResult.Successful PlayerEvent.Result = PlayerEventResult.Positive
PlayerEvent.ItemId = defaultHack.Id } PlayerEvent.ItemId = defaultHack.Id }
if not hasShields && Array.exists (fun act -> act.ItemId = freeShield.Id) player.Events |> not then { if not hasShields && Array.exists (fun act -> act.ItemId = freeShield.Id) player.Events |> not then {
PlayerEvent.Timestamp = System.DateTime.UtcNow PlayerEvent.Timestamp = System.DateTime.UtcNow
PlayerEvent.Adversary = { Id = GuildEnvironment.botIdHackerBattle ; Name = "Sensei" } PlayerEvent.Adversary = { Id = GuildEnvironment.botIdHackerBattle ; Name = "Sensei" }
PlayerEvent.Type = PlayerEventType.Shield PlayerEvent.Type = PlayerEventType.Shielding
PlayerEvent.Result = PlayerEventResult.Successful PlayerEvent.Result = PlayerEventResult.Positive
PlayerEvent.ItemId = defaultHack.Id } PlayerEvent.ItemId = defaultHack.Id }
] |> Seq.toArray ] |> Seq.toArray
|> Array.append player.Events |> Array.append player.Events

View File

@ -7,18 +7,6 @@ open MongoDB.Bson.Serialization
open MongoDB.Driver open MongoDB.Driver
open Degenz.Types open Degenz.Types
[<CLIMutable>]
type AttackAction =
{ ActionId : int
Result : bool
Target : DiscordPlayer
Timestamp : DateTime }
[<CLIMutable>]
type DefenseAction =
{ ActionId : int
Timestamp : DateTime }
[<CLIMutable>] [<CLIMutable>]
type PlayerEntry = type PlayerEntry =
{ DiscordId : uint64 { DiscordId : uint64

View File

@ -68,17 +68,15 @@ module Types =
with static member empty = { Id = 0uL ; Name = "None" } with static member empty = { Id = 0uL ; Name = "None" }
type PlayerEventResult = type PlayerEventResult =
| Successful = 0 | Positive = 0
| Neutral = 1 | Neutral = 1
| Failed = 2 | Negative = 2
type PlayerEventType = type PlayerEventType =
| Hack = 0 | Hacking = 0
| Shield = 1 | Shielding = 1
| Steal = 2 | Steal = 2
| Mugged = 3
| Imprison = 3 | Imprison = 3
| Imprisoned = 3
[<CLIMutable>] [<CLIMutable>]
type PlayerEvent = type PlayerEvent =
@ -88,6 +86,7 @@ module Types =
ItemId : int ItemId : int
Timestamp : DateTime } Timestamp : DateTime }
[<CLIMutable>]
type PlayerTraits = { type PlayerTraits = {
Strength : int Strength : int
Focus : int Focus : int