Change events so it's a positive/negative dynamic and can be shared
This commit is contained in:
parent
7900bba3c3
commit
c7ee6bfa6a
14
Bot/Game.fs
14
Bot/Game.fs
@ -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"
|
||||||
| _ ->
|
| _ ->
|
||||||
|
@ -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
|
||||||
}
|
}
|
||||||
|
@ -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)
|
||||||
|
@ -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
|
||||||
|
@ -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
|
||||||
|
@ -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
|
||||||
|
Loading…
x
Reference in New Issue
Block a user