Public Class PokemonInteractions

    'Procedure:
    '1. If has a status condition, return that
    '1.1 If a Pokémon has low HP, return reaction (40%)
    '2. If the Pokémon holds a pickup item, give that (if friendship is high enough, else say 50% that it doesn't want to give item, 50% proceed)
    '3. Return Special Location Text (found in Content\Data\interactions.dat) (60%)
    '4. Friendship based/random text

    'Friendship levels:
    '1: <= 50 (hate)
    '2: >50 <= 150 (neutral)
    '3: >150 <= 200 (like)
    '4: >200 <=250 (loyal)
    '5: >250 (love)

    Public Enum FriendshipLevels
        Hate
        Neutral
        Likes
        Loyal
        Love
    End Enum

    Public Shared Function GetScriptString(ByVal p As Pokemon, ByVal cPosition As Vector3, ByVal facing As Integer) As String
        If PickupItemID > -1 Then
            If PickupIndividualValue = p.IndividualValue Then
                Return GenerateItemReaction(p, cPosition, facing)
            Else
                PickupItemID = -1
                PickupIndividualValue = ""
            End If
        End If

        Dim reaction As ReactionContainer = GetReaction(p)

        Dim offset As New Vector2(0, 0)
        Select Case facing
            Case 0
                offset.Y = -0.02F
            Case 1
                offset.X = -0.02F
            Case 2
                offset.Y = 0.01F
            Case 3
                offset.X = 0.01F
        End Select

        Dim newPosition As New Vector2(0, 1)

        Dim s As String = "version=2" & Environment.NewLine &
            "@pokemon.cry(" & p.Number & ")" & Environment.NewLine

        If CType(Screen.Camera, OverworldCamera).ThirdPerson = False Then
            If reaction.HasNotification = True Then
                s &= "@camera.activatethirdperson" & Environment.NewLine &
                     "@camera.setposition(" & newPosition.X & ",1," & newPosition.Y & ")" & Environment.NewLine

                s &= "@entity.showmessagebulb(" & CInt(reaction.Notification).ToString() & "|" & cPosition.X + offset.X & "|" & cPosition.Y + 0.7F & "|" & cPosition.Z + offset.Y & ")" & Environment.NewLine

                s &= "@camera.deactivatethirdperson" & Environment.NewLine
            End If
            s &= "@text.show(" & reaction.GetMessage(p) & ")" & Environment.NewLine
        Else
            Dim preYaw As Single = Screen.Camera.Yaw
            If reaction.HasNotification = True Then
                s &= "@camera.setyaw(" & CType(Screen.Camera, OverworldCamera).GetAimYawFromDirection(Screen.Camera.GetPlayerFacingDirection()) & ")" & Environment.NewLine
                s &= "@camera.setposition(" & newPosition.X & ",1," & newPosition.Y & ")" & Environment.NewLine
                s &= "@entity.showmessagebulb(" & CInt(reaction.Notification).ToString() & "|" & cPosition.X + offset.X & "|" & cPosition.Y + 0.7F & "|" & cPosition.Z + offset.Y & ")" & Environment.NewLine

                s &= "@camera.deactivatethirdperson" & Environment.NewLine
            End If
            s &= "@text.show(" & reaction.GetMessage(p) & ")" & Environment.NewLine
            s &= "@camera.activatethirdperson" & Environment.NewLine
            s &= "@camera.reset" & Environment.NewLine
            s &= "@camera.setyaw(" & preYaw & ")" & Environment.NewLine
        End If
        s &= ":end"

        Return s
    End Function

    Private Shared Function GenerateItemReaction(ByVal p As Pokemon, ByVal cPosition As Vector3, ByVal facing As Integer) As String
        Dim message As String = "It looks like your Pokémon~holds on to something.*Do you want to~take it?"

        Dim offset As New Vector2(0, 0)
        Select Case facing
            Case 0
                offset.Y = -0.02F
            Case 1
                offset.X = -0.02F
            Case 2
                offset.Y = 0.01F
            Case 3
                offset.X = 0.01F
        End Select

        Dim newPosition As New Vector2(0, 1)

        Dim item As Item = Item.GetItemByID(PickupItemID)

        Dim s As String = "version=2" & Environment.NewLine &
           "@pokemon.cry(" & p.Number & ")" & Environment.NewLine

        If CType(Screen.Camera, OverworldCamera).ThirdPerson = False Then
            s &= "@camera.activatethirdperson" & Environment.NewLine &
                 "@camera.setposition(" & newPosition.X & ",1," & newPosition.Y & ")" & Environment.NewLine

            s &= "@entity.showmessagebulb(" & CInt(MessageBulb.NotifcationTypes.Question).ToString() & "|" & cPosition.X + offset.X & "|" & cPosition.Y + 0.7F & "|" & cPosition.Z + offset.Y & ")" & Environment.NewLine

            s &= "@camera.deactivatethirdperson" & Environment.NewLine
            s &= "@text.show(" & message & ")" & Environment.NewLine &
                "@options.show(Yes,No)" & Environment.NewLine &
                ":when:Yes" & Environment.NewLine &
                "@text.show(Your Pokémon handed over~the " & item.Name & "!)" & Environment.NewLine &
                "@item.give(" & PickupItemID & ",1)" & Environment.NewLine &
                "@item.messagegive(" & PickupItemID & ",1)" & Environment.NewLine &
                ":when:No" & Environment.NewLine &
                "@text.show(Your Pokémon kept~the item happily.)" & Environment.NewLine &
                "@pokemon.addfriendship(0,10)" & Environment.NewLine &
                ":endwhen" & Environment.NewLine
        Else
            s &= "@camera.setposition(" & newPosition.X & ",1," & newPosition.Y & ")" & Environment.NewLine
            s &= "@entity.showmessagebulb(" & CInt(MessageBulb.NotifcationTypes.Question).ToString() & "|" & cPosition.X + offset.X & "|" & cPosition.Y + 0.7F & "|" & cPosition.Z + offset.Y & ")" & Environment.NewLine

            s &= "@camera.deactivatethirdperson" & Environment.NewLine

            s &= "@text.show(" & message & ")" & Environment.NewLine &
                "@options.show(Yes,No)" & Environment.NewLine &
                ":when:Yes" & Environment.NewLine &
                "@text.show(Your Pokémon handed over~the " & item.Name & "!)" & Environment.NewLine &
                "@item.give(" & PickupItemID & ",1)" & Environment.NewLine &
                "@item.messagegive(" & PickupItemID & ",1)" & Environment.NewLine &
                ":when:No" & Environment.NewLine &
                "@text.show(Your Pokémon kept~the item happily.)" & Environment.NewLine &
                "@pokemon.addfriendship(0,10)" & Environment.NewLine &
                ":endwhen" & Environment.NewLine
            s &= "@camera.activatethirdperson" & Environment.NewLine
        End If
        s &= ":end"

        PickupItemID = -1
        PickupIndividualValue = ""

        Return s
    End Function

    Private Shared Function GetReaction(ByVal p As Pokemon) As ReactionContainer
        Dim FriendshipLevel As FriendshipLevels = GetFriendshipLevel(p)

        Dim reaction As ReactionContainer = Nothing

        If p.Status <> Pokemon.StatusProblems.None Then
            'Return status condition text
            reaction = GetStatusConditionReaction(p)
        End If

        If reaction Is Nothing And ((p.HP / p.MaxHP) * 100) <= 15 Then
            If Core.Random.Next(0, 100) < 40 Then
                reaction = GetLowHPReaction(p)
            End If
        End If

        'Get special place reaction  (60%)
        If reaction Is Nothing Then
            If Core.Random.Next(0, 100) < 60 Then
                reaction = GetSpecialReaction(p)
            End If
        End If

        'Friendship based:
        'If friendship level is hate, return hate.
        'If friendship level is above hate, never return hate.
        'If friendship level is neutral, only return neutral.
        'If friendship level is like, return 60% like, 40% neutral
        'If friendship level is loyal, return 60% loyal, 15% like, 25% neutral
        'If friendship level is love, return 55% love, 10% loyal, 10% like, 25% neutral
        If reaction Is Nothing Then
            Dim r As Integer = Core.Random.Next(0, 100)
            Select Case FriendshipLevel
                Case FriendshipLevels.Hate
                    reaction = GetHateReaction(p)
                Case FriendshipLevels.Neutral
                    reaction = GetNeutralReaction(p)
                Case FriendshipLevels.Likes
                    If r < 60 Then
                        reaction = GetLikeReaction(p)
                    Else
                        reaction = GetNeutralReaction(p)
                    End If
                Case FriendshipLevels.Loyal
                    If r < 60 Then
                        reaction = GetLoyalReaction(p)
                    ElseIf r >= 60 And r < 75 Then
                        reaction = GetLikeReaction(p)
                    Else
                        reaction = GetNeutralReaction(p)
                    End If
                Case FriendshipLevels.Love
                    If r < 55 Then
                        reaction = GetLoveReaction(p)
                    ElseIf r >= 55 And r < 65 Then
                        reaction = GetLoyalReaction(p)
                    ElseIf r >= 65 And r < 75 Then
                        reaction = GetLikeReaction(p)
                    Else
                        reaction = GetNeutralReaction(p)
                    End If
            End Select
        End If

        Return reaction
    End Function

    Private Shared Function GetFriendshipLevel(ByVal p As Pokemon) As FriendshipLevels
        Dim f As Integer = p.Friendship
        If f <= 50 Then
            Return FriendshipLevels.Hate
        ElseIf f > 50 And f <= 120 Then
            Return FriendshipLevels.Neutral
        ElseIf f > 120 And f <= 200 Then
            Return FriendshipLevels.Likes
        ElseIf f > 200 And f <= 245 Then
            Return FriendshipLevels.Loyal
        Else
            Return FriendshipLevels.Love
        End If
    End Function

    Private Shared Function GetStatusConditionReaction(ByVal p As Pokemon) As ReactionContainer
        Select Case p.Status
            Case Pokemon.StatusProblems.BadPoison, Pokemon.StatusProblems.Poison
                Return New ReactionContainer("<name> is shivering~with the effects of being~poisoned.", MessageBulb.NotifcationTypes.Poisoned)
            Case Pokemon.StatusProblems.Burn
                Return New ReactionContainer("<name>'s burn~looks painful!", MessageBulb.NotifcationTypes.Poisoned)
            Case Pokemon.StatusProblems.Freeze
                Select Case Core.Random.Next(0, 2)
                    Case 0
                        Return New ReactionContainer("<name> seems very cold!", MessageBulb.NotifcationTypes.Poisoned)
                    Case 1
                        Return New ReactionContainer(".....Your Pokémon seems~a little cold.", MessageBulb.NotifcationTypes.Poisoned)
                End Select
            Case Pokemon.StatusProblems.Paralyzed
                Return New ReactionContainer("<name> is trying~very hard to keep~up with you...", MessageBulb.NotifcationTypes.Poisoned)
            Case Pokemon.StatusProblems.Sleep
                Select Case Core.Random.Next(0, 3)
                    Case 0
                        Return New ReactionContainer("<name> seems~a little tiered.", MessageBulb.NotifcationTypes.Poisoned)
                    Case 1
                        Return New ReactionContainer("<name> is somehow~fighting off sleep...", MessageBulb.NotifcationTypes.Poisoned)
                    Case 2
                        Return New ReactionContainer("<name> yawned~very loudly!", MessageBulb.NotifcationTypes.Poisoned)
                End Select
        End Select
        Return New ReactionContainer("<name> is trying~very hard to keep~up with you...", MessageBulb.NotifcationTypes.Poisoned)
    End Function

    Private Shared Function GetLowHPReaction(ByVal p As Pokemon) As ReactionContainer
        Select Case Core.Random.Next(0, 2)
            Case 0
                Return New ReactionContainer("<name> is going~to fall down!", MessageBulb.NotifcationTypes.Exclamation)
            Case 1
                Return New ReactionContainer("<name> seems to~be about to fall over!", MessageBulb.NotifcationTypes.Exclamation)
        End Select
        Return New ReactionContainer("<name> seems to~be about to fall over!", MessageBulb.NotifcationTypes.Exclamation)
    End Function

    Private Shared Function GetSpecialReaction(ByVal p As Pokemon) As ReactionContainer
        Dim matching As New List(Of ReactionContainer)

        For Each spReaction As ReactionContainer In SpecialReactionList
            If spReaction.Match(p) = True Then
                matching.Add(spReaction)
            End If
        Next

        If matching.Count > 0 Then
            Dim chances As New List(Of Integer)
            For Each r In matching
                chances.Add(r.Probability)
            Next

            Dim index As Integer = GetRandomChance(chances)

            Return matching(index)
        End If

        Return Nothing
    End Function

    Private Shared Function GetHateReaction(ByVal p As Pokemon) As ReactionContainer
        Dim r As ReactionContainer = Nothing
        While r Is Nothing
            Select Case Core.Random.Next(0, 17)
                Case 0
                    r = New ReactionContainer("<name> is doing~it's best to keep up~with you.", MessageBulb.NotifcationTypes.Unhappy)
                Case 1
                    r = New ReactionContainer("<name> is somehow~forcing itself to keep going.", MessageBulb.NotifcationTypes.Unsure)
                Case 2
                    r = New ReactionContainer("<name> is staring~patiantly at nothing at all.", MessageBulb.NotifcationTypes.Unsure)
                Case 3
                    r = New ReactionContainer("<name> is staring~intently into the distance.", MessageBulb.NotifcationTypes.Waiting)
                Case 4
                    r = New ReactionContainer("<name> is dizzy...", MessageBulb.NotifcationTypes.Unhappy)
                Case 5
                    r = New ReactionContainer("<name> is stepping~on your feet!", MessageBulb.NotifcationTypes.Waiting)
                Case 6
                    r = New ReactionContainer("<name> seems~unhappy somehow...", MessageBulb.NotifcationTypes.Unhappy)
                Case 7
                    r = New ReactionContainer("<name> is making~an unhappy face.", MessageBulb.NotifcationTypes.Unhappy)
                Case 8
                    r = New ReactionContainer("<name> seems~uneasy and is poking~<player.name>.", MessageBulb.NotifcationTypes.Unsure)
                Case 9
                    r = New ReactionContainer("<name> is making~a face like its angry!", MessageBulb.NotifcationTypes.Angry)
                Case 10
                    r = New ReactionContainer("<name> seems to be~angry for some reason.", MessageBulb.NotifcationTypes.Angry)
                Case 11
                    r = New ReactionContainer("Your Pokémon turned to face~the other way, showing a~defiant expression. ", MessageBulb.NotifcationTypes.Unsure)
                Case 12
                    r = New ReactionContainer("<name> is looking~down steadily...", MessageBulb.NotifcationTypes.Waiting)
                Case 13
                    r = New ReactionContainer("Your Pokémon is staring~intently at nothing...", MessageBulb.NotifcationTypes.Waiting)
                Case 14
                    r = New ReactionContainer("Your Pokémon turned to~face the other way,~showing a defiant expression.", MessageBulb.NotifcationTypes.Unhappy)
                Case 15
                    r = New ReactionContainer("<name> seems~a bit nervous...", MessageBulb.NotifcationTypes.Unsure)
                Case 16
                    r = New ReactionContainer("Your Pokémon stumbled~and nearly fell!", MessageBulb.NotifcationTypes.Exclamation)
                Case 17
                    r = New ReactionContainer("<name> is having~a hard time keeping up.", MessageBulb.NotifcationTypes.Unsure)
            End Select
        End While

        Return r
    End Function

    Private Shared Function GetNeutralReaction(ByVal p As Pokemon) As ReactionContainer
        Dim r As ReactionContainer = Nothing
        While r Is Nothing
            Select Case Core.Random.Next(0, 53)
                Case 0
                    r = New ReactionContainer("<name> is happy~but shy.", MessageBulb.NotifcationTypes.Friendly)
                Case 1
                    r = New ReactionContainer("<name> puts in~extra effort.", MessageBulb.NotifcationTypes.Friendly)
                Case 2
                    If IsOutside() = True Then
                        r = New ReactionContainer("<name> is smelling~the scents of the~surrounding air", MessageBulb.NotifcationTypes.Friendly)
                    End If
                Case 3
                    If IsOutside() = True Then
                        r = New ReactionContainer("Your Pokémon has caught~the scent of smoke.", MessageBulb.NotifcationTypes.Friendly)
                    End If
                Case 4
                    If NPCAround() = True Then
                        r = New ReactionContainer("<name> greeted everyone!", MessageBulb.NotifcationTypes.CatFace)
                    End If
                Case 5
                    If IsOutside() = True Then
                        r = New ReactionContainer("<name> is wandering~around and listening~to the different sounds.", MessageBulb.NotifcationTypes.Note)
                    End If
                Case 6
                    r = New ReactionContainer("<name> looks very~interested!", MessageBulb.NotifcationTypes.Friendly)
                Case 7
                    If IsOutside() = True Then
                        r = New ReactionContainer("<name> is steadily~poking at the ground.", MessageBulb.NotifcationTypes.Waiting)
                    End If
                Case 8
                    r = New ReactionContainer("Your Pokémon is looking~around restlessly.", MessageBulb.NotifcationTypes.Note)
                Case 9
                    If IsOutside() = True Then
                        r = New ReactionContainer("<name> seems dazzled~after seeing the sky.", MessageBulb.NotifcationTypes.Waiting)
                    End If
                Case 10
                    r = New ReactionContainer("<name> is gazing~around restlessly!", MessageBulb.NotifcationTypes.Waiting)
                Case 11
                    If TrainerAround() = True Then
                        r = New ReactionContainer("<name> let out~a battle cry!", MessageBulb.NotifcationTypes.Shouting)
                    End If
                Case 12
                    If TrainerAround() = True And p.IsType(Element.Types.Fire) = True Then
                        r = New ReactionContainer("<name> is vigorously~breathing fire!", MessageBulb.NotifcationTypes.Exclamation)
                    End If
                Case 13
                    If TrainerAround() = True Or NPCAround() = True Then
                        r = New ReactionContainer("<name> is on~the lookout!", MessageBulb.NotifcationTypes.Exclamation)
                    End If
                Case 14
                    If TrainerAround() = True Then
                        r = New ReactionContainer("<name> roared!", MessageBulb.NotifcationTypes.Exclamation)
                    End If
                Case 15
                    If TrainerAround() = True Then
                        r = New ReactionContainer("<name> let out a roar!", MessageBulb.NotifcationTypes.Exclamation)
                    End If
                Case 16
                    r = New ReactionContainer("<name> is surveying~the area...", MessageBulb.NotifcationTypes.Waiting)
                Case 17
                    If IsInside() = True Then
                        r = New ReactionContainer("<name> is sniffing~at the floor.", MessageBulb.NotifcationTypes.Question)
                    End If
                Case 18
                    r = New ReactionContainer("<name> is peering~down.", MessageBulb.NotifcationTypes.Question)
                Case 19
                    r = New ReactionContainer("<name> seems~to be wandering around.", MessageBulb.NotifcationTypes.Note)
                Case 20
                    r = New ReactionContainer("<name> is looking~around absentmindedly.", MessageBulb.NotifcationTypes.Waiting)
                Case 21
                    r = New ReactionContainer("<name> is relaxing~comfortably.", MessageBulb.NotifcationTypes.Friendly)
                Case 22
                    If IsInside() = True Then
                        r = New ReactionContainer("<name> is sniffing~at the floor.", MessageBulb.NotifcationTypes.Waiting)
                    End If
                Case 23
                    If IsOutside() = True Then
                        r = New ReactionContainer("<name> seems to~relax as it hears the~sound of rustling leaves...", MessageBulb.NotifcationTypes.Friendly)
                    End If
                Case 24
                    If IsOutside() = True Then
                        r = New ReactionContainer("<name> seems to~be listening to the~sound of rustling leaves...", MessageBulb.NotifcationTypes.Friendly)
                    End If
                Case 25
                    If WaterAround() = True Then
                        r = New ReactionContainer("Your Pokémon is playing around~and splashing in the water!", MessageBulb.NotifcationTypes.Happy)
                    End If
                Case 26
                    If IsOutside() = True Then
                        r = New ReactionContainer("<name> is looking~up at the sky.", MessageBulb.NotifcationTypes.Waiting)
                    End If
                Case 27
                    If IsOutside() = True And World.GetTime() = World.DayTime.Night And World.GetCurrentRegionWeather() = World.Weathers.Clear Then
                        r = New ReactionContainer("Your Pokémon is happily~gazing at the beautiful,~starry sky!", MessageBulb.NotifcationTypes.Waiting)
                    End If
                Case 28
                    r = New ReactionContainer("<name> seems to be~enjoying this a little bit!", MessageBulb.NotifcationTypes.Note)
                Case 29
                    If IsInside() = True Then
                        r = New ReactionContainer("<name> is looking~up at the ceiling.", MessageBulb.NotifcationTypes.Note)
                    End If
                Case 30
                    If IsOutside() = True And World.GetTime() = World.DayTime.Night Then
                        r = New ReactionContainer("Your Pokémon is staring~spellbound at the night sky!", MessageBulb.NotifcationTypes.Friendly)
                    End If
                Case 31
                    r = New ReactionContainer("<name> is in~danger of falling over!", MessageBulb.NotifcationTypes.Exclamation)
                Case 32
                    If p.NickName <> "" Then
                        r = New ReactionContainer("<name> doesn't~seem to be used to its~own name yet.", MessageBulb.NotifcationTypes.Exclamation)
                    End If
                Case 33
                    If IsInside() = True Then
                        r = New ReactionContainer("<name> slipped~on the floor and seems~likely to fall!", MessageBulb.NotifcationTypes.Exclamation)
                    End If
                Case 34
                    If TrainerAround() = True Or GrassAround() = True Then
                        r = New ReactionContainer("<name> feels something~and is howling!", MessageBulb.NotifcationTypes.Exclamation)
                    End If
                Case 35
                    If p.HP = p.MaxHP And p.Status = Pokemon.StatusProblems.None Then
                        r = New ReactionContainer("<name> seems~refreshed!", MessageBulb.NotifcationTypes.Friendly)
                    End If
                Case 36
                    If p.HP = p.MaxHP And p.Status = Pokemon.StatusProblems.None Then
                        r = New ReactionContainer("<name> feels~refreshed.", MessageBulb.NotifcationTypes.Friendly)
                    End If
                Case 37
                    If ItemAround() = True Then
                        r = New ReactionContainer("<name> seems to~have found something!", MessageBulb.NotifcationTypes.Exclamation)
                    End If
                Case 38
                    If TrainerAround() = True Or GrassAround() = True Then
                        r = New ReactionContainer("<name> suddenly~turned around and~started barking!", MessageBulb.NotifcationTypes.Exclamation)
                    End If
                Case 39
                    If TrainerAround() = True Or GrassAround() = True Then
                        r = New ReactionContainer("<name> suddenly~turned around!", MessageBulb.NotifcationTypes.Exclamation)
                    End If
                Case 40
                    If IsOutside() = True Then
                        r = New ReactionContainer("<name> looked up~at the sky and shouted loudly!", MessageBulb.NotifcationTypes.Exclamation)
                    End If
                Case 41
                    r = New ReactionContainer("Your Pokémon was surprised~that you suddenly spoke to it!", MessageBulb.NotifcationTypes.Exclamation)
                Case 42
                    If Not p.Item Is Nothing Then
                        r = New ReactionContainer("<name> almost forgot~it was holding~that " & p.Item.Name & "!", MessageBulb.NotifcationTypes.Question)
                    End If
                Case 43
                    If IceAround() = True Then
                        r = New ReactionContainer("Oh!~its slipping and came~over here for support.", MessageBulb.NotifcationTypes.Exclamation)
                    End If
                Case 44
                    If IceAround() = True Then
                        r = New ReactionContainer("Your Pokémon almost slipped~and fell over!", MessageBulb.NotifcationTypes.Exclamation)
                    End If
                Case 45
                    r = New ReactionContainer("<name> sensed something~strange and was surprised!", MessageBulb.NotifcationTypes.Question)
                Case 46
                    r = New ReactionContainer("Your Pokémon is looking~around restlessly for~something.", MessageBulb.NotifcationTypes.Question)
                Case 47
                    r = New ReactionContainer("Your Pokémon wasn't watching~where it was going and~ran into you!", MessageBulb.NotifcationTypes.Friendly)
                Case 48
                    If ItemAround() = True Then
                        r = New ReactionContainer("Sniff, sniff!~Is there something nearby?", MessageBulb.NotifcationTypes.Question)
                    End If
                Case 49
                    r = New ReactionContainer("<name> is wandering~around and searching~for something.", MessageBulb.NotifcationTypes.Question)
                Case 50
                    r = New ReactionContainer("<name> is sniffing~at <player.name>.", MessageBulb.NotifcationTypes.Friendly)
                Case 51
                    If IsOutside() = True And World.GetCurrentRegionWeather() = World.Weathers.Rain And GrassAround() = True Then
                        r = New ReactionContainer("<name> is taking shelter in the grass from the rain!", MessageBulb.NotifcationTypes.Waiting)
                    End If
                Case 52
                    If IsOutside() = True And World.GetCurrentRegionWeather() = World.Weathers.Rain And GrassAround() = True Then
                        r = New ReactionContainer("<name> is splashing~around in the wet grass", MessageBulb.NotifcationTypes.Note)
                    End If
            End Select
        End While
        Return r
    End Function

    Private Shared Function GetLikeReaction(ByVal p As Pokemon) As ReactionContainer
        Dim r As ReactionContainer = Nothing
        While r Is Nothing
            Select Case Core.Random.Next(0, 28)
                Case 0
                    If IsOutside() = True And World.GetCurrentRegionWeather() = World.Weathers.Clear Then
                        r = New ReactionContainer("Your Pokémon seems happy~about the great weather!", MessageBulb.NotifcationTypes.Happy)
                    End If
                Case 1
                    r = New ReactionContainer("<name> is coming along~happily.", MessageBulb.NotifcationTypes.Friendly)
                Case 2
                    r = New ReactionContainer("<name> is composed!", MessageBulb.NotifcationTypes.Friendly)
                Case 3
                    If p.HP = p.MaxHP Then
                        r = New ReactionContainer("<name> is glowing~with health!", MessageBulb.NotifcationTypes.Note)
                    End If
                Case 4
                    r = New ReactionContainer("<name> looks~very happy!", MessageBulb.NotifcationTypes.Happy)
                Case 5
                    If p.HP = p.MaxHP Then
                        r = New ReactionContainer("<name> is full~of life!", MessageBulb.NotifcationTypes.Note)
                    End If
                Case 6
                    r = New ReactionContainer("<name> is very~eager!", MessageBulb.NotifcationTypes.Friendly)
                Case 7
                    r = New ReactionContainer("<name> gives you~a happy look and a smile!", MessageBulb.NotifcationTypes.Happy)
                Case 8
                    r = New ReactionContainer("<name> seems very~happy to see you!", MessageBulb.NotifcationTypes.Friendly)
                Case 9
                    r = New ReactionContainer("<name> faced this~way and grinned!", MessageBulb.NotifcationTypes.CatFace)
                Case 10
                    r = New ReactionContainer("<name> spun around~in a circle!", MessageBulb.NotifcationTypes.Note)
                Case 11
                    r = New ReactionContainer("<name> is looking~this way and smiling.", MessageBulb.NotifcationTypes.Friendly)
                Case 12
                    r = New ReactionContainer("<name> is very~eager...", MessageBulb.NotifcationTypes.Waiting)
                Case 13
                    r = New ReactionContainer("<name> is focusing~its attention on you!", MessageBulb.NotifcationTypes.Exclamation)
                Case 14
                    r = New ReactionContainer("<name> focused~with a sharp gaze!", MessageBulb.NotifcationTypes.Exclamation)
                Case 15
                    r = New ReactionContainer("<name> is looking~at <player.name>'s footprints.", MessageBulb.NotifcationTypes.Question)
                Case 16
                    r = New ReactionContainer("<name> is staring~straight into <player.name>'s~eyes.", MessageBulb.NotifcationTypes.Friendly)
                Case 17
                    If p.BaseSpeed >= 100 Then
                        r = New ReactionContainer("<name> is showing off~its agility!", MessageBulb.NotifcationTypes.Note)
                    End If
                Case 18
                    r = New ReactionContainer("<name> is moving~around happily!", MessageBulb.NotifcationTypes.Note)
                Case 19
                    r = New ReactionContainer("<name> is steadily~keeping up with you!", MessageBulb.NotifcationTypes.Friendly)
                Case 20
                    r = New ReactionContainer("<name> seems to~want to play with~<player.name>!", MessageBulb.NotifcationTypes.Note)
                Case 21
                    r = New ReactionContainer("<name> is singing~and humming.", MessageBulb.NotifcationTypes.Note)
                Case 22
                    r = New ReactionContainer("<name> is playfully~nibbling at the ground.", MessageBulb.NotifcationTypes.Friendly)
                Case 23
                    r = New ReactionContainer("<name> is nipping~at your feet!", MessageBulb.NotifcationTypes.Note)
                Case 24
                    If p.BaseAttack >= 100 Or p.BaseSpAttack >= 100 Then
                        r = New ReactionContainer("<name> is working~hard to show off~its mighty power!", MessageBulb.NotifcationTypes.Exclamation)
                    End If
                Case 25
                    r = New ReactionContainer("<name> is cheerful!", MessageBulb.NotifcationTypes.Note)
                Case 26
                    r = New ReactionContainer("<name> bumped~into <player.name>!", MessageBulb.NotifcationTypes.Exclamation)
                Case 27
                    If IsCave() = True And p.Level < 20 Then
                        r = New ReactionContainer("<name> is scared~and snuggled up~to <player.name>!", MessageBulb.NotifcationTypes.Exclamation)
                    End If
            End Select
        End While
        Return r
    End Function

    Private Shared Function GetLoyalReaction(ByVal p As Pokemon) As ReactionContainer
        Dim r As ReactionContainer = Nothing
        While r Is Nothing
            Select Case Core.Random.Next(0, 21)
                Case 0
                    r = New ReactionContainer("<name> began poking~you in the stomach!", MessageBulb.NotifcationTypes.CatFace)
                Case 1
                    r = New ReactionContainer("<name> seems to be~feeling great about~walking with you!", MessageBulb.NotifcationTypes.Heart)
                Case 2
                    r = New ReactionContainer("<name> is still~feeling great!", MessageBulb.NotifcationTypes.Happy)
                Case 3
                    r = New ReactionContainer("<name> is poking~at your belly.", MessageBulb.NotifcationTypes.Heart)
                Case 4
                    If p.Level > 30 Then
                        r = New ReactionContainer("<name> looks like~it wants to lead!", MessageBulb.NotifcationTypes.Note)
                    End If
                Case 5
                    r = New ReactionContainer("<name> seems to be~very happy!", MessageBulb.NotifcationTypes.Happy)
                Case 6
                    r = New ReactionContainer("<name> nodded slowly.", MessageBulb.NotifcationTypes.Friendly)
                Case 7
                    r = New ReactionContainer("<name> gave you~a sunny look!", MessageBulb.NotifcationTypes.Happy)
                Case 8
                    r = New ReactionContainer("<name> is very~composed and sure of itself!", MessageBulb.NotifcationTypes.Waiting)
                Case 9
                    If p.BaseDefense >= 100 Then
                        r = New ReactionContainer("<name> is~standing guard!", MessageBulb.NotifcationTypes.Exclamation)
                    End If
                Case 10
                    r = New ReactionContainer("<name> danced a~wonderful dance!", MessageBulb.NotifcationTypes.Note)
                Case 11
                    r = New ReactionContainer("<name> is staring~steadfastly at~<player.name>'s face.", MessageBulb.NotifcationTypes.Waiting)
                Case 12
                    r = New ReactionContainer("<name> is staring~intently at~<player.name>'s face.", MessageBulb.NotifcationTypes.Waiting)
                Case 13
                    r = New ReactionContainer("<name> is concentrating.", MessageBulb.NotifcationTypes.Unsure)
                Case 14
                    r = New ReactionContainer("<name> faced this~way and nodded.", MessageBulb.NotifcationTypes.Friendly)
                Case 15
                    r = New ReactionContainer("<name> suddenly~started walking closer!", MessageBulb.NotifcationTypes.Heart)
                Case 16
                    r = New ReactionContainer("Woah!*<name> is suddenly~playful!", MessageBulb.NotifcationTypes.Heart)
                Case 17
                    r = New ReactionContainer("<name> blushes.", MessageBulb.NotifcationTypes.Happy)
                Case 18
                    r = New ReactionContainer("Woah!*<name> suddenly started~dancing in happiness!", MessageBulb.NotifcationTypes.Note)
                Case 19
                    r = New ReactionContainer("<name> is happily~skipping about.", MessageBulb.NotifcationTypes.Note)
                Case 20
                    r = New ReactionContainer("Woah!*<name> suddenly~danced in happiness!", MessageBulb.NotifcationTypes.Note)
            End Select
        End While
        Return r
    End Function

    Private Shared Function GetLoveReaction(ByVal p As Pokemon) As ReactionContainer
        Dim r As ReactionContainer = Nothing
        While r Is Nothing
            Select Case Core.Random.Next(0, 13)
                Case 0
                    r = New ReactionContainer("<name> is jumping~for joy!", MessageBulb.NotifcationTypes.Heart)
                Case 1
                    r = New ReactionContainer("Your Pokémon stretched out~its body and is relaxing.", MessageBulb.NotifcationTypes.Happy)
                Case 2
                    r = New ReactionContainer("<name> is happily~cuddling up to you!", MessageBulb.NotifcationTypes.Heart)
                Case 3
                    r = New ReactionContainer("<name> is so happy~that it can't stand still!", MessageBulb.NotifcationTypes.Heart)
                Case 4
                    If p.PokedexEntry.Height <= 1.6F Then
                        r = New ReactionContainer("<name> happily~cuddled up to you!", MessageBulb.NotifcationTypes.Heart)
                    End If
                Case 5
                    r = New ReactionContainer("<name>'s cheeks are~becoming rosy!", MessageBulb.NotifcationTypes.Heart)
                Case 6
                    r = New ReactionContainer("Woah!*<name> suddenly~hugged you!", MessageBulb.NotifcationTypes.Heart)
                Case 7
                    If p.PokedexEntry.Height <= 0.7F Then
                        r = New ReactionContainer("<name> is rubbing~against your legs!", MessageBulb.NotifcationTypes.Heart)
                    End If
                Case 8
                    r = New ReactionContainer("Ah!~<name> cuddles you!", MessageBulb.NotifcationTypes.Heart)
                Case 9
                    r = New ReactionContainer("<name> is regarding~you with adoration!", MessageBulb.NotifcationTypes.Heart)
                Case 10
                    r = New ReactionContainer("<name> got~closer to <player.name>!", MessageBulb.NotifcationTypes.Heart)
                Case 11
                    r = New ReactionContainer("<name> is keeping~close to your feet.", MessageBulb.NotifcationTypes.Heart)
                Case 12
                    r = New ReactionContainer("<name> is jumping~around in a carefree way!", MessageBulb.NotifcationTypes.Note)
            End Select
        End While
        Return r
    End Function

    Shared SpecialReactionList As New List(Of ReactionContainer)

    Public Shared Sub Load()
        SpecialReactionList.Clear()

        Dim path As String = GameModeManager.GetContentFilePath("Data\interactions.dat")
        Security.FileValidation.CheckFileValid(path, False, "PokemonInteractions.vb")

        Dim data() As String = System.IO.File.ReadAllLines(path)

        For Each line As String In data
            If line.StartsWith("{") = True And line.EndsWith("}") = True Then
                If line.CountSeperators("|") >= 8 Then
                    Dim r As New ReactionContainer(line)
                    SpecialReactionList.Add(r)
                End If
            End If
        Next
    End Sub

    Private Class ReactionContainer

        Public Message As String
        Public Notification As MessageBulb.NotifcationTypes = MessageBulb.NotifcationTypes.AFK
        Public HasNotification As Boolean = True
        Public MapFiles As New List(Of String)
        Public PokemonIDs As New List(Of Integer)
        Public ExcludeIDs As New List(Of Integer)
        Public Daytime As Integer = -1
        Public Weather As Integer = -1
        Public Season As Integer = -1
        Public Types As New List(Of Element.Types)
        Public Probability As Integer = 100

        Public Sub New(ByVal dataLine As String)
            dataLine = dataLine.Remove(dataLine.Length - 1, 1).Remove(0, 1)

            Dim dataParts() As String = dataLine.Split(CChar("|"))

            Me.MapFiles = dataParts(0).Split(CChar(",")).ToList()

            If dataParts(1) <> "-1" Then
                For Each pokePart As String In dataParts(1).Split(CChar(","))
                    Dim lReference As List(Of Integer) = PokemonIDs
                    If pokePart.StartsWith("!") = True Then
                        pokePart = pokePart.Remove(0, 1)
                        lReference = ExcludeIDs
                    End If
                    If StringHelper.IsNumeric(pokePart) = True Then
                        If lReference.Contains(CInt(pokePart)) = False Then
                            lReference.Add(CInt(pokePart))
                        End If
                    End If
                Next
            End If

            If dataParts(2) <> "-1" Then
                Daytime = CInt(dataParts(2)).Clamp(0, 3)
            End If
            If dataParts(3) <> "-1" Then
                Weather = CInt(dataParts(3)).Clamp(0, 9)
            End If
            If dataParts(4) <> "-1" Then
                Season = CInt(dataParts(4)).Clamp(0, 3)
            End If

            If dataParts(5) <> "-1" Then
                For Each typePart As String In dataParts(5).Split(CChar(","))
                    Me.Types.Add(New Element(typePart).Type)
                Next
            End If

            Me.Probability = CInt(dataParts(6))

            If dataParts(7) = "-1" Then
                Me.HasNotification = False
            Else
                Me.HasNotification = True
                Me.Notification = Me.ConvertEmoji(dataParts(7))
            End If

            Me.Message = dataParts(8)
        End Sub

        Public Sub New(ByVal Message As String, ByVal Notification As MessageBulb.NotifcationTypes)
            Me.Message = Message
            Me.Notification = Notification
        End Sub

        Private Function ConvertEmoji(ByVal s As String) As MessageBulb.NotifcationTypes
            Select Case s.ToLower()
                Case "..."
                    Return MessageBulb.NotifcationTypes.Waiting
                Case "!"
                    Return MessageBulb.NotifcationTypes.Exclamation
                Case ">:("
                    Return MessageBulb.NotifcationTypes.Shouting
                Case "?"
                    Return MessageBulb.NotifcationTypes.Question
                Case "note"
                    Return MessageBulb.NotifcationTypes.Note
                Case "<3"
                    Return MessageBulb.NotifcationTypes.Heart
                Case ":("
                    Return MessageBulb.NotifcationTypes.Unhappy
                Case "ball"
                    Return MessageBulb.NotifcationTypes.Battle
                Case ":D"
                    Return MessageBulb.NotifcationTypes.Happy
                Case ":)"
                    Return MessageBulb.NotifcationTypes.Friendly
                Case "bad"
                    Return MessageBulb.NotifcationTypes.Poisoned
                Case ";)"
                    Return MessageBulb.NotifcationTypes.Wink
                Case "afk"
                    Return MessageBulb.NotifcationTypes.AFK
                Case "/:("
                    Return MessageBulb.NotifcationTypes.Angry
                Case ":3"
                    Return MessageBulb.NotifcationTypes.CatFace
                Case ":/"
                    Return MessageBulb.NotifcationTypes.Unsure
            End Select

            Return MessageBulb.NotifcationTypes.Waiting
        End Function

        Public Function Match(ByVal p As Pokemon) As Boolean
            If MapFiles.Count > 0 Then
                If MapFiles.Any(Function(m As String)
                                    Return m.ToLowerInvariant() = Screen.Level.LevelFile.ToLowerInvariant()
                                End Function) Then
                    Return False

                End If
            End If

            If PokemonIDs.Count > 0 Then
                If PokemonIDs.Contains(p.Number) = False Then
                    Return False
                End If
            End If

            If ExcludeIDs.Count > 0 Then
                If ExcludeIDs.Contains(p.Number) = True Then
                    Return False
                End If
            End If

            If Daytime > -1 Then
                If Daytime <> CInt(World.GetTime()) Then
                    Return False
                End If
            End If

            If Weather > -1 Then
                If Weather <> CInt(World.GetCurrentRegionWeather) Then
                    Return False
                End If
            End If

            If Season > -1 Then
                If Season <> CInt(World.CurrentSeason) Then
                    Return False
                End If
            End If

            If Me.Types.Count > 0 Then
                For Each t As Element.Types In Me.Types
                    If p.IsType(t) = False Then
                        Return False
                    End If
                Next
            End If

            Return True
        End Function

        Public Function GetMessage(ByVal p As Pokemon) As String
            Return Me.Message.Replace("<name>", p.GetDisplayName())
        End Function

    End Class

    Shared PickupIndividualValue As String = "" 'This value holds the individual value of the Pokémon that picked up the item.
    Shared PickupItemID As Integer = -1 'This is the Item ID of the item that the Pokémon picked up. -1 means no item got picked up.

    Public Shared Sub CheckForRandomPickup()
        'Checks if the first Pokémon in the party is following the player:
        If Screen.Level.ShowOverworldPokemon = True And CBool(GameModeManager.GetGameRuleValue("ShowFollowPokemon", "1")) = True Then
            'Checks if the player has a Pokémon:
            If Core.Player.Pokemons.Count > 0 And Screen.Level.Surfing = False And Screen.Level.Riding = False And Screen.Level.ShowOverworldPokemon = True And Not Core.Player.GetWalkPokemon() Is Nothing Then
                If Core.Player.GetWalkPokemon().Status = Pokemon.StatusProblems.None Then
                    'If the player switched the Pokémon, reset the item ID.
                    If PickupIndividualValue <> Core.Player.GetWalkPokemon().IndividualValue Then
                        PickupItemID = -1
                    End If

                    'Check if an item should be generated:
                    If Core.Random.Next(0, 270) < Core.Player.GetWalkPokemon().Friendship Then
                        Dim newItemID As Integer = -1 'creates a temp value to hold the new Item ID.

                        'Checks if the player is outside:
                        If IsOutside() = True Then
                            'Checks if the leading Pokémon is holding a sticky feather, which ensures a 90% feather pickup outside:
                            If Not Core.Player.GetWalkPokemon().Item Is Nothing AndAlso Core.Player.GetWalkPokemon().Item.ID = 261 AndAlso Core.Random.Next(0, 100) < 90 Then
                                newItemID = Core.Random.Next(254, 261)
                            Else
                                'Checks if ice is around:
                                If IceAround() = True Then
                                    '20%: NeverMeltIce, 80% Aspear Berry
                                    If Core.Random.Next(0, 100) < 20 Then
                                        newItemID = 107
                                    Else
                                        newItemID = 2004
                                    End If
                                Else
                                    'Checks if loamy soil is around, if so, give a random berry (only 50% activation)
                                    If LoamySoilAround() = True And Core.Random.Next(0, 100) < 50 Then
                                        newItemID = Core.Random.Next(2000, 2064)
                                    Else
                                        'Checks if grass is around, if so, give a grass item (only 50% activation)
                                        If GrassAround() = True And Core.Random.Next(0, 100) < 50 Then
                                            'Leaf Stone (10%), energy root (50%), revival herb (15%), heal powder (25%):
                                            Dim r As Integer = Core.Random.Next(0, 100)
                                            If r < 10 Then
                                                newItemID = 34
                                            ElseIf r >= 10 And r < 60 Then
                                                newItemID = 122
                                            ElseIf r >= 60 And r < 75 Then
                                                newItemID = 124
                                            Else
                                                newItemID = 123
                                            End If
                                        Else
                                            'Checks if water is around, if so, give a water item (only 50% activation)
                                            If WaterAround() = True And Core.Random.Next(0, 100) < 50 Then
                                                'Water Stone (10%), pearl (50%), big pearl (10%), heart scale (40%):
                                                Dim r As Integer = Core.Random.Next(0, 100)
                                                If r < 10 Then
                                                    newItemID = 24
                                                ElseIf r >= 10 And r < 50 Then
                                                    newItemID = 110
                                                ElseIf r >= 50 And r < 60 Then
                                                    newItemID = 190
                                                Else
                                                    newItemID = 111
                                                End If
                                            Else
                                                'No special conditions apply:
                                                '(general): first 10 berries (45%), wings (45%), gold leaf (2%), silver leaf (8%):
                                                Dim r As Integer = Core.Random.Next(0, 100)
                                                If r < 45 Then
                                                    newItemID = Core.Random.Next(2000, 2011)
                                                ElseIf r >= 45 And r < 90 Then
                                                    newItemID = Core.Random.Next(254, 262)
                                                ElseIf r >= 90 And r < 92 Then
                                                    newItemID = 75
                                                Else
                                                    newItemID = 60
                                                End If
                                            End If
                                        End If
                                    End If
                                End If
                            End If
                        ElseIf IsInside() = True Then 'Player is inside:
                            'leftovers (5%), lavacookie (20%), super potion (10%), ether (20%), elixier (20%), potion (10%), quick claw (8%), gold leaf (2%), silver leaf (5%)
                            Dim r As Integer = Core.Random.Next(0, 100)
                            If r < 5 Then
                                newItemID = 146 'Leftovers
                            ElseIf r >= 5 And r < 25 Then
                                newItemID = 7 'Lavacookie
                            ElseIf r >= 25 And r < 45 Then
                                '0-1 badge: potion
                                '2-4 badges: super potion
                                '5-7 badges: hyper potion
                                '8 and above: max potion
                                Dim b As Integer = Core.Player.Badges.Count
                                If b <= 1 Then
                                    newItemID = 18
                                ElseIf b >= 2 And b <= 4 Then
                                    newItemID = 17
                                ElseIf b >= 5 And b <= 7 Then
                                    newItemID = 16
                                Else
                                    newItemID = 15
                                End If
                            ElseIf r >= 45 And r < 65 Then
                                newItemID = 63 'Ether
                            ElseIf r >= 65 And r < 85 Then
                                newItemID = 65 'Elixier
                            ElseIf r >= 85 And r < 93 Then
                                newItemID = 73 'Quick Claw
                            ElseIf r >= 93 And r < 95 Then
                                newItemID = 75 'Gold leaf
                            Else
                                newItemID = 60 'Silver leaf
                            End If
                            'Player is in cave:
                        ElseIf IsCave() = True Then
                            'Checks if the leading Pokémon is holding a sticky rock, which ensures a 90% feather pickup in a cave:
                            If Not Core.Player.GetWalkPokemon().Item Is Nothing AndAlso Core.Player.GetWalkPokemon().Item.ID = 262 AndAlso Core.Random.Next(0, 100) < 90 Then
                                'Thunderstone(20%),Firestone(20%),Waterstone(20%),Leafstone(20%),Moonstone(10%),Sunstone(10%)
                                Dim r1 As Integer = Core.Random.Next(0, 100)
                                If r1 < 20 Then
                                    newItemID = 22
                                ElseIf r1 >= 20 And r1 < 40 Then
                                    newItemID = 23
                                ElseIf r1 >= 40 And r1 < 60 Then
                                    newItemID = 24
                                ElseIf r1 >= 60 And r1 < 80 Then
                                    newItemID = 34
                                ElseIf r1 >= 80 And r1 < 90 Then
                                    newItemID = 8
                                Else
                                    newItemID = 169
                                End If
                            Else
                                'Checks if water is around, if so, give a water item (only 65% activation)
                                If WaterAround() = True And Core.Random.Next(0, 100) < 65 Then
                                    'Water Stone (30%), pearl (40%), big pearl (10%), heart scale (20%):
                                    Dim r As Integer = Core.Random.Next(0, 100)
                                    If r < 30 Then
                                        newItemID = 24
                                    ElseIf r >= 30 And r < 70 Then
                                        newItemID = 110
                                    ElseIf r >= 70 And r < 80 Then
                                        newItemID = 190
                                    Else
                                        newItemID = 111
                                    End If
                                Else
                                    'Fire Stone (10%), Thunder Stone (10%), pearl (30%), hard stone (10%), everstone (10%), first 10 berries (20%)
                                    Dim r As Integer = Core.Random.Next(0, 100)
                                    If r < 10 Then
                                        newItemID = 22
                                    ElseIf r >= 10 And r < 20 Then
                                        newItemID = 23
                                    ElseIf r >= 20 And r < 50 Then
                                        newItemID = 110
                                    ElseIf r >= 50 And r < 60 Then
                                        newItemID = 125
                                    ElseIf r >= 60 And r < 70 Then
                                        newItemID = 112
                                    ElseIf r >= 70 And r < 90 Then
                                        newItemID = Core.Random.Next(2000, 2011)
                                    Else
                                        newItemID = 262
                                    End If
                                End If
                            End If
                        End If

                        'If an item got generated, assign it to the global value to store it until the player interacts with the Pokémon. Also store the individual value.
                        If newItemID > -1 Then
                            Logger.Debug("Pokémon picks up item (" & Item.GetItemByID(newItemID).Name & ")")
                            PickupItemID = newItemID
                            PickupIndividualValue = Core.Player.GetWalkPokemon().IndividualValue
                            SoundManager.PlaySound("pickup")
                        End If
                    End If
                End If
            Else
                'Reset the system if no Pokémon:
                PickupItemID = -1
                PickupIndividualValue = ""
            End If
        End If
    End Sub

#Region "Checks"

    Private Shared Function IsOutside() As Boolean
        If Screen.Level.CanFly = True And Screen.Level.CanDig = False And Screen.Level.CanTeleport = True Then
            Return True
        End If
        Return False
    End Function

    Private Shared Function IsCave() As Boolean
        If Screen.Level.CanFly = False And Screen.Level.CanDig = True And Screen.Level.CanTeleport = False Then
            Return True
        End If
        Return False
    End Function

    Private Shared Function IsInside() As Boolean
        If Screen.Level.CanFly = False And Screen.Level.CanDig = False And Screen.Level.CanTeleport = False Then
            Return True
        End If
        Return False
    End Function

    Private Shared Function WildPokemon() As Boolean
        If Screen.Level.WildPokemonFloor = True Or Screen.Level.WildPokemonGrass = True Or Screen.Level.WildPokemonWater = True Then
            Return True
        End If
        Return False
    End Function

    Private Shared Function WaterAround() As Boolean
        For Each e As Entity In Screen.Level.Entities
            If e.EntityID.ToLower() = "water" Then
                If Vector3.Distance(e.Position, Screen.Camera.Position) <= 5.0F Then
                    Return True
                End If
            End If
        Next

        Return False
    End Function

    Private Shared Function NPCAround() As Boolean
        For Each e As Entity In Screen.Level.Entities
            If e.EntityID.ToLower() = "npc" Then
                If Vector3.Distance(e.Position, Screen.Camera.Position) <= 4.0F Then
                    Return True
                End If
            End If
        Next

        Return False
    End Function

    Private Shared Function TrainerAround() As Boolean
        For Each e As Entity In Screen.Level.Entities
            If e.EntityID.ToLower() = "npc" Then
                If CType(e, NPC).IsTrainer = True Then
                    If Vector3.Distance(e.Position, Screen.Camera.Position) <= 3.0F Then
                        Return True
                    End If
                End If
            End If
        Next

        Return False
    End Function

    Private Shared Function GrassAround() As Boolean
        For Each e As Entity In Screen.Level.Entities
            If e.EntityID.ToLower() = "grass" Then
                If Vector3.Distance(e.Position, Screen.Camera.Position) <= 5.0F Then
                    Return True
                End If
            End If
        Next

        Return False
    End Function

    Private Shared Function ItemAround() As Boolean
        For Each e As Entity In Screen.Level.Entities
            If e.EntityID.ToLower() = "itemobject" Then
                If Vector3.Distance(e.Position, Screen.Camera.Position) <= 5.0F Then
                    Return True
                End If
            End If
        Next

        Return False
    End Function

    Private Shared Function IceAround() As Boolean
        For Each e As Entity In Screen.Level.Entities
            If e.EntityID.ToLower() = "floor" Then
                If CType(e, Floor).IsIce = True Then
                    If Vector3.Distance(e.Position, Screen.Camera.Position) <= 2.0F Then
                        Return True
                    End If
                End If
            End If
        Next

        Return False
    End Function

    Private Shared Function LoamySoilAround() As Boolean
        For Each e As Entity In Screen.Level.Entities
            If e.EntityID.ToLower() = "loamysoil" Then
                If Vector3.Distance(e.Position, Screen.Camera.Position) <= 5.0F Then
                    Return True
                End If
            End If
        Next

        Return False
    End Function

#End Region

End Class