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.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(" is shivering~with the effects of being~poisoned.", MessageBulb.NotifcationTypes.Poisoned) Case Pokemon.StatusProblems.Burn Return New ReactionContainer("'s burn~looks painful!", MessageBulb.NotifcationTypes.Poisoned) Case Pokemon.StatusProblems.Freeze Select Case Core.Random.Next(0, 2) Case 0 Return New ReactionContainer(" 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(" 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(" seems~a little tiered.", MessageBulb.NotifcationTypes.Poisoned) Case 1 Return New ReactionContainer(" is somehow~fighting off sleep...", MessageBulb.NotifcationTypes.Poisoned) Case 2 Return New ReactionContainer(" yawned~very loudly!", MessageBulb.NotifcationTypes.Poisoned) End Select End Select Return New ReactionContainer(" 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(" is going~to fall down!", MessageBulb.NotifcationTypes.Exclamation) Case 1 Return New ReactionContainer(" seems to~be about to fall over!", MessageBulb.NotifcationTypes.Exclamation) End Select Return New ReactionContainer(" 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(" is doing~it's best to keep up~with you.", MessageBulb.NotifcationTypes.Unhappy) Case 1 r = New ReactionContainer(" is somehow~forcing itself to keep going.", MessageBulb.NotifcationTypes.Unsure) Case 2 r = New ReactionContainer(" is staring~patiantly at nothing at all.", MessageBulb.NotifcationTypes.Unsure) Case 3 r = New ReactionContainer(" is staring~intently into the distance.", MessageBulb.NotifcationTypes.Waiting) Case 4 r = New ReactionContainer(" is dizzy...", MessageBulb.NotifcationTypes.Unhappy) Case 5 r = New ReactionContainer(" is stepping~on your feet!", MessageBulb.NotifcationTypes.Waiting) Case 6 r = New ReactionContainer(" seems~unhappy somehow...", MessageBulb.NotifcationTypes.Unhappy) Case 7 r = New ReactionContainer(" is making~an unhappy face.", MessageBulb.NotifcationTypes.Unhappy) Case 8 r = New ReactionContainer(" seems~uneasy and is poking~.", MessageBulb.NotifcationTypes.Unsure) Case 9 r = New ReactionContainer(" is making~a face like its angry!", MessageBulb.NotifcationTypes.Angry) Case 10 r = New ReactionContainer(" 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(" 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(" 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(" 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(" is happy~but shy.", MessageBulb.NotifcationTypes.Friendly) Case 1 r = New ReactionContainer(" puts in~extra effort.", MessageBulb.NotifcationTypes.Friendly) Case 2 If IsOutside() = True Then r = New ReactionContainer(" 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(" greeted everyone!", MessageBulb.NotifcationTypes.CatFace) End If Case 5 If IsOutside() = True Then r = New ReactionContainer(" is wandering~around and listening~to the different sounds.", MessageBulb.NotifcationTypes.Note) End If Case 6 r = New ReactionContainer(" looks very~interested!", MessageBulb.NotifcationTypes.Friendly) Case 7 If IsOutside() = True Then r = New ReactionContainer(" 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(" seems dazzled~after seeing the sky.", MessageBulb.NotifcationTypes.Waiting) End If Case 10 r = New ReactionContainer(" is gazing~around restlessly!", MessageBulb.NotifcationTypes.Waiting) Case 11 If TrainerAround() = True Then r = New ReactionContainer(" 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(" is vigorously~breathing fire!", MessageBulb.NotifcationTypes.Exclamation) End If Case 13 If TrainerAround() = True Or NPCAround() = True Then r = New ReactionContainer(" is on~the lookout!", MessageBulb.NotifcationTypes.Exclamation) End If Case 14 If TrainerAround() = True Then r = New ReactionContainer(" roared!", MessageBulb.NotifcationTypes.Exclamation) End If Case 15 If TrainerAround() = True Then r = New ReactionContainer(" let out a roar!", MessageBulb.NotifcationTypes.Exclamation) End If Case 16 r = New ReactionContainer(" is surveying~the area...", MessageBulb.NotifcationTypes.Waiting) Case 17 If IsInside() = True Then r = New ReactionContainer(" is sniffing~at the floor.", MessageBulb.NotifcationTypes.Question) End If Case 18 r = New ReactionContainer(" is peering~down.", MessageBulb.NotifcationTypes.Question) Case 19 r = New ReactionContainer(" seems~to be wandering around.", MessageBulb.NotifcationTypes.Note) Case 20 r = New ReactionContainer(" is looking~around absentmindedly.", MessageBulb.NotifcationTypes.Waiting) Case 21 r = New ReactionContainer(" is relaxing~comfortably.", MessageBulb.NotifcationTypes.Friendly) Case 22 If IsInside() = True Then r = New ReactionContainer(" is sniffing~at the floor.", MessageBulb.NotifcationTypes.Waiting) End If Case 23 If IsOutside() = True Then r = New ReactionContainer(" 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(" 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(" 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(" seems to be~enjoying this a little bit!", MessageBulb.NotifcationTypes.Note) Case 29 If IsInside() = True Then r = New ReactionContainer(" 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(" is in~danger of falling over!", MessageBulb.NotifcationTypes.Exclamation) Case 32 If p.NickName <> "" Then r = New ReactionContainer(" 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(" 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(" 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(" seems~refreshed!", MessageBulb.NotifcationTypes.Friendly) End If Case 36 If p.HP = p.MaxHP And p.Status = Pokemon.StatusProblems.None Then r = New ReactionContainer(" feels~refreshed.", MessageBulb.NotifcationTypes.Friendly) End If Case 37 If ItemAround() = True Then r = New ReactionContainer(" seems to~have found something!", MessageBulb.NotifcationTypes.Exclamation) End If Case 38 If TrainerAround() = True Or GrassAround() = True Then r = New ReactionContainer(" suddenly~turned around and~started barking!", MessageBulb.NotifcationTypes.Exclamation) End If Case 39 If TrainerAround() = True Or GrassAround() = True Then r = New ReactionContainer(" suddenly~turned around!", MessageBulb.NotifcationTypes.Exclamation) End If Case 40 If IsOutside() = True Then r = New ReactionContainer(" 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(" 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(" 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(" is wandering~around and searching~for something.", MessageBulb.NotifcationTypes.Question) Case 50 r = New ReactionContainer(" is sniffing~at .", MessageBulb.NotifcationTypes.Friendly) Case 51 If IsOutside() = True And World.GetCurrentRegionWeather() = World.Weathers.Rain And GrassAround() = True Then r = New ReactionContainer(" 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(" 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(" is coming along~happily.", MessageBulb.NotifcationTypes.Friendly) Case 2 r = New ReactionContainer(" is composed!", MessageBulb.NotifcationTypes.Friendly) Case 3 If p.HP = p.MaxHP Then r = New ReactionContainer(" is glowing~with health!", MessageBulb.NotifcationTypes.Note) End If Case 4 r = New ReactionContainer(" looks~very happy!", MessageBulb.NotifcationTypes.Happy) Case 5 If p.HP = p.MaxHP Then r = New ReactionContainer(" is full~of life!", MessageBulb.NotifcationTypes.Note) End If Case 6 r = New ReactionContainer(" is very~eager!", MessageBulb.NotifcationTypes.Friendly) Case 7 r = New ReactionContainer(" gives you~a happy look and a smile!", MessageBulb.NotifcationTypes.Happy) Case 8 r = New ReactionContainer(" seems very~happy to see you!", MessageBulb.NotifcationTypes.Friendly) Case 9 r = New ReactionContainer(" faced this~way and grinned!", MessageBulb.NotifcationTypes.CatFace) Case 10 r = New ReactionContainer(" spun around~in a circle!", MessageBulb.NotifcationTypes.Note) Case 11 r = New ReactionContainer(" is looking~this way and smiling.", MessageBulb.NotifcationTypes.Friendly) Case 12 r = New ReactionContainer(" is very~eager...", MessageBulb.NotifcationTypes.Waiting) Case 13 r = New ReactionContainer(" is focusing~its attention on you!", MessageBulb.NotifcationTypes.Exclamation) Case 14 r = New ReactionContainer(" focused~with a sharp gaze!", MessageBulb.NotifcationTypes.Exclamation) Case 15 r = New ReactionContainer(" is looking~at 's footprints.", MessageBulb.NotifcationTypes.Question) Case 16 r = New ReactionContainer(" is staring~straight into 's~eyes.", MessageBulb.NotifcationTypes.Friendly) Case 17 If p.BaseSpeed >= 100 Then r = New ReactionContainer(" is showing off~its agility!", MessageBulb.NotifcationTypes.Note) End If Case 18 r = New ReactionContainer(" is moving~around happily!", MessageBulb.NotifcationTypes.Note) Case 19 r = New ReactionContainer(" is steadily~keeping up with you!", MessageBulb.NotifcationTypes.Friendly) Case 20 r = New ReactionContainer(" seems to~want to play with~!", MessageBulb.NotifcationTypes.Note) Case 21 r = New ReactionContainer(" is singing~and humming.", MessageBulb.NotifcationTypes.Note) Case 22 r = New ReactionContainer(" is playfully~nibbling at the ground.", MessageBulb.NotifcationTypes.Friendly) Case 23 r = New ReactionContainer(" is nipping~at your feet!", MessageBulb.NotifcationTypes.Note) Case 24 If p.BaseAttack >= 100 Or p.BaseSpAttack >= 100 Then r = New ReactionContainer(" is working~hard to show off~its mighty power!", MessageBulb.NotifcationTypes.Exclamation) End If Case 25 r = New ReactionContainer(" is cheerful!", MessageBulb.NotifcationTypes.Note) Case 26 r = New ReactionContainer(" bumped~into !", MessageBulb.NotifcationTypes.Exclamation) Case 27 If IsCave() = True And p.Level < 20 Then r = New ReactionContainer(" is scared~and snuggled up~to !", 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(" began poking~you in the stomach!", MessageBulb.NotifcationTypes.CatFace) Case 1 r = New ReactionContainer(" seems to be~feeling great about~walking with you!", MessageBulb.NotifcationTypes.Heart) Case 2 r = New ReactionContainer(" is still~feeling great!", MessageBulb.NotifcationTypes.Happy) Case 3 r = New ReactionContainer(" is poking~at your belly.", MessageBulb.NotifcationTypes.Heart) Case 4 If p.Level > 30 Then r = New ReactionContainer(" looks like~it wants to lead!", MessageBulb.NotifcationTypes.Note) End If Case 5 r = New ReactionContainer(" seems to be~very happy!", MessageBulb.NotifcationTypes.Happy) Case 6 r = New ReactionContainer(" nodded slowly.", MessageBulb.NotifcationTypes.Friendly) Case 7 r = New ReactionContainer(" gave you~a sunny look!", MessageBulb.NotifcationTypes.Happy) Case 8 r = New ReactionContainer(" is very~composed and sure of itself!", MessageBulb.NotifcationTypes.Waiting) Case 9 If p.BaseDefense >= 100 Then r = New ReactionContainer(" is~standing guard!", MessageBulb.NotifcationTypes.Exclamation) End If Case 10 r = New ReactionContainer(" danced a~wonderful dance!", MessageBulb.NotifcationTypes.Note) Case 11 r = New ReactionContainer(" is staring~steadfastly at~'s face.", MessageBulb.NotifcationTypes.Waiting) Case 12 r = New ReactionContainer(" is staring~intently at~'s face.", MessageBulb.NotifcationTypes.Waiting) Case 13 r = New ReactionContainer(" is concentrating.", MessageBulb.NotifcationTypes.Unsure) Case 14 r = New ReactionContainer(" faced this~way and nodded.", MessageBulb.NotifcationTypes.Friendly) Case 15 r = New ReactionContainer(" suddenly~started walking closer!", MessageBulb.NotifcationTypes.Heart) Case 16 r = New ReactionContainer("Woah!* is suddenly~playful!", MessageBulb.NotifcationTypes.Heart) Case 17 r = New ReactionContainer(" blushes.", MessageBulb.NotifcationTypes.Happy) Case 18 r = New ReactionContainer("Woah!* suddenly started~dancing in happiness!", MessageBulb.NotifcationTypes.Note) Case 19 r = New ReactionContainer(" is happily~skipping about.", MessageBulb.NotifcationTypes.Note) Case 20 r = New ReactionContainer("Woah!* 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(" 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(" is happily~cuddling up to you!", MessageBulb.NotifcationTypes.Heart) Case 3 r = New ReactionContainer(" is so happy~that it can't stand still!", MessageBulb.NotifcationTypes.Heart) Case 4 If p.PokedexEntry.Height <= 1.6F Then r = New ReactionContainer(" happily~cuddled up to you!", MessageBulb.NotifcationTypes.Heart) End If Case 5 r = New ReactionContainer("'s cheeks are~becoming rosy!", MessageBulb.NotifcationTypes.Heart) Case 6 r = New ReactionContainer("Woah!* suddenly~hugged you!", MessageBulb.NotifcationTypes.Heart) Case 7 If p.PokedexEntry.Height <= 0.7F Then r = New ReactionContainer(" is rubbing~against your legs!", MessageBulb.NotifcationTypes.Heart) End If Case 8 r = New ReactionContainer("Ah!~ cuddles you!", MessageBulb.NotifcationTypes.Heart) Case 9 r = New ReactionContainer(" is regarding~you with adoration!", MessageBulb.NotifcationTypes.Heart) Case 10 r = New ReactionContainer(" got~closer to !", MessageBulb.NotifcationTypes.Heart) Case 11 r = New ReactionContainer(" is keeping~close to your feet.", MessageBulb.NotifcationTypes.Heart) Case 12 r = New ReactionContainer(" 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("", 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