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