Public Class Daycare Public Shared Function ProduceEgg(ByVal daycareID As Integer) As Pokemon Dim parent1 As Pokemon = Nothing Dim parent2 As Pokemon = Nothing Dim EggID As Integer = 0 For Each line As String In Core.Player.DaycareData.SplitAtNewline() If line.StartsWith(daycareID.ToString() & "|0|") = True Then Dim data As String = line.Remove(0, line.IndexOf("{")) parent1 = P3D.Pokemon.GetPokemonByData(data) ElseIf line.StartsWith(daycareID.ToString() & "|1|") = True Then Dim data As String = line.Remove(0, line.IndexOf("{")) parent2 = P3D.Pokemon.GetPokemonByData(data) ElseIf line.StartsWith(daycareID.ToString() & "|Egg|") = True Then EggID = CInt(line.Split(CChar("|"))(2)) End If Next Dim DittoAsParent As Integer = 0 If parent1.EggGroup1 = Pokemon.EggGroups.Ditto Or parent1.EggGroup2 = Pokemon.EggGroups.Ditto Then DittoAsParent = 1 ElseIf parent2.EggGroup1 = Pokemon.EggGroups.Ditto Or parent2.EggGroup2 = Pokemon.EggGroups.Ditto Then DittoAsParent = 2 End If If Not parent1 Is Nothing And Not parent2 Is Nothing And EggID <> 0 Then Dim p As Pokemon = Pokemon.GetPokemonByID(EggID) p.Generate(1, True) p.EggSteps = 1 p.SetCatchInfos(Item.GetItemByID(5), "obtained at") p.CatchBall = Item.GetItemByID(GetEggPokeballID({parent1, parent2}.ToList())) ' Adding Egg Moves: Dim EggMoves As New List(Of BattleSystem.Attack) ' Level-Up moves: If DittoAsParent = 0 Then For Each m1 As BattleSystem.Attack In parent1.Attacks For Each m2 As BattleSystem.Attack In parent2.Attacks If m1.ID = m2.ID Then Dim newAttack As BattleSystem.Attack = BattleSystem.Attack.GetAttackByID(m1.ID) EggMoves.Add(newAttack) End If Next Next End If ' Technical/Hidden Machine moves: Dim male As Integer = -1 If parent1.Gender = P3D.Pokemon.Genders.Male Then male = 0 End If If parent2.Gender = P3D.Pokemon.Genders.Male Then male = 1 End If If male > -1 Then Dim cParent As Pokemon = Nothing Select Case male Case 0 cParent = parent1 Case 1 cParent = parent2 End Select For Each THMMove As BattleSystem.Attack In p.AttackLearns.Values For Each m1 As BattleSystem.Attack In cParent.Attacks If m1.ID = THMMove.ID Then Dim newAttack As BattleSystem.Attack = BattleSystem.Attack.GetAttackByID(m1.ID) EggMoves.Add(newAttack) End If Next Next End If ' Egg Moves: male = -1 If parent1.Gender = P3D.Pokemon.Genders.Male Then male = 0 End If If parent2.Gender = P3D.Pokemon.Genders.Male Then male = 1 End If If male > -1 Then For Each BreedMove As Integer In p.EggMoves For Each m1 As BattleSystem.Attack In parent1.Attacks If m1.ID = BreedMove Then GameJolt.Emblem.AchieveEmblem("eggsplosion") Dim newAttack As BattleSystem.Attack = BattleSystem.Attack.GetAttackByID(m1.ID) EggMoves.Add(newAttack) End If Next For Each m1 As BattleSystem.Attack In parent2.Attacks If m1.ID = BreedMove Then GameJolt.Emblem.AchieveEmblem("eggsplosion") Dim newAttack As BattleSystem.Attack = BattleSystem.Attack.GetAttackByID(m1.ID) EggMoves.Add(newAttack) End If Next Next End If ' Volt Tackle for Pikachu: If (parent1.Item IsNot Nothing AndAlso parent1.Item.Name.ToLower = "light ball") OrElse (parent2.Item IsNot Nothing AndAlso parent2.Item.Name.ToLower = "light ball") Then Dim newAttack As BattleSystem.Attack = BattleSystem.Attack.GetAttackByID(344) EggMoves.Add(newAttack) End If Dim learnMoves As New List(Of BattleSystem.Attack) If EggMoves.Count <= 4 Then learnMoves.AddRange(EggMoves.ToArray()) Else For i = EggMoves.Count - 4 To EggMoves.Count - 1 learnMoves.Add(EggMoves(i)) Next End If While p.Attacks.Count + learnMoves.Count > 4 p.Attacks.RemoveAt(0) End While For Each learnMove As BattleSystem.Attack In learnMoves Dim hasAttack As Boolean = False For Each m As BattleSystem.Attack In p.Attacks If m.ID = learnMove.ID Then hasAttack = True Exit For End If Next If hasAttack = False Then p.Attacks.Add(learnMove) End If Next ' Inherit stats: Dim IV1 As New List(Of String) Dim IV2 As New List(Of String) Dim EVStat1 As String = "" Dim EVStat2 As String = "" Dim EVItems() As String = {"power weight", "power bracer", "power belt", "power lens", "power band", "power anklet"} If Not parent1.Item Is Nothing Then If EVItems.Contains(parent1.Item.Name.ToLower()) = True Then Select Case parent1.Item.Name.ToLower() Case "power weight" EVStat1 = "HP" Case "power bracer" EVStat1 = "Attack" Case "power belt" EVStat1 = "Defense" Case "power lens" EVStat1 = "Special Attack" Case "power band" EVStat1 = "Special Defense" Case "power anklet" EVStat1 = "Speed" End Select End If End If If Not parent2.Item Is Nothing Then If EVItems.Contains(parent2.Item.Name.ToLower()) = True Then Select Case parent2.Item.Name.ToLower() Case "power weight" EVStat2 = "HP" Case "power bracer" EVStat2 = "Attack" Case "power belt" EVStat2 = "Defense" Case "power lens" EVStat2 = "Special Attack" Case "power band" EVStat2 = "Special Defense" Case "power anklet" EVStat2 = "Speed" End Select End If End If If EVStat1 <> "" And EVStat2 = "" Then IV1.Add(EVStat1) ElseIf EVStat1 = "" And EVStat2 <> "" Then IV2.Add(EVStat2) ElseIf EVStat1 <> "" And EVStat2 <> "" Then If Core.Random.Next(0, 2) = 0 Then IV1.Add(EVStat1) Else IV2.Add(EVStat2) End If End If While IV1.Count + IV2.Count < 3 Dim newStat As String = "" While newStat = "" Or IV1.Contains(newStat) = True Or IV2.Contains(newStat) = True Select Case Core.Random.Next(0, 6) Case 0 newStat = "Attack" Case 1 newStat = "Defense" Case 2 newStat = "Special Attack" Case 3 newStat = "Special Defense" Case 4 newStat = "Speed" Case 5 newStat = "HP" End Select End While Select Case Core.Random.Next(0, 2) Case 0 IV1.Add(newStat) Case 1 IV2.Add(newStat) End Select End While For Each IV As String In IV1 Select Case IV Case "HP" p.IVHP = parent1.IVHP Case "Attack" p.IVAttack = parent1.IVAttack Case "Defense" p.IVDefense = parent1.IVDefense Case "Special Attack" p.IVSpAttack = parent1.IVSpAttack Case "Special Defense" p.IVSpDefense = parent1.IVSpDefense Case "Speed" p.IVSpeed = parent1.IVSpeed End Select Next For Each IV As String In IV2 Select Case IV Case "HP" p.IVHP = parent2.IVHP Case "Attack" p.IVAttack = parent2.IVAttack Case "Defense" p.IVDefense = parent2.IVDefense Case "Special Attack" p.IVSpAttack = parent2.IVSpAttack Case "Special Defense" p.IVSpDefense = parent2.IVSpDefense Case "Speed" p.IVSpeed = parent2.IVSpeed End Select Next ' Natures: Dim EStone1 As Boolean = False Dim EStone2 As Boolean = False If Not parent1.Item Is Nothing Then If parent1.Item.Name.ToLower() = "everstone" Then EStone1 = True End If End If If Not parent2.Item Is Nothing Then If parent2.Item.Name.ToLower() = "everstone" Then EStone2 = True End If End If If EStone1 = True And EStone2 = False Then p.Nature = parent1.Nature ElseIf EStone1 = False And EStone2 = True Then p.Nature = parent2.Nature ElseIf EStone1 = True And EStone2 = True Then If Core.Random.Next(0, 2) = 0 Then p.Nature = parent1.Nature Else p.Nature = parent2.Nature End If End If ' Abilities: If DittoAsParent = 0 Then Dim female As Pokemon = parent1 If parent2.Gender = P3D.Pokemon.Genders.Female Then female = parent2 End If If Core.Random.Next(0, 100) < 80 Then p.Ability = female.Ability End If End If ' Hidden Ability: If DittoAsParent <> 0 Then If DittoAsParent = 1 Then If parent2.IsUsingHiddenAbility = True And p.HasHiddenAbility = True And Core.Random.Next(0, 100) < 80 Then p.Ability = p.HiddenAbility End If Else If parent1.IsUsingHiddenAbility = True And p.HasHiddenAbility = True And Core.Random.Next(0, 100) < 80 Then p.Ability = p.HiddenAbility End If End If Else Dim female As Pokemon = parent1 If parent2.Gender = P3D.Pokemon.Genders.Female Then female = parent2 End If If female.IsUsingHiddenAbility = True And p.HasHiddenAbility = True And Core.Random.Next(0, 100) < 80 Then p.Ability = p.HiddenAbility End If End If ' Shiny: Dim Shiny1 As Boolean = parent1.IsShiny Dim Shiny2 As Boolean = parent2.IsShiny Dim chances As List(Of Integer) = {1, 4096}.ToList() If Shiny1 = True And Shiny2 = True Then chances = {12, 4096}.ToList() ElseIf Shiny1 = True Or Shiny2 = True Then chances = {6, 4096}.ToList() End If If Core.Random.Next(0, chances(1)) < chances(0) Then p.IsShiny = True Else p.IsShiny = False End If Return p End If Return Nothing End Function Public Shared Function CanBreed(ByVal Pokemon As List(Of Pokemon)) As Integer Dim chance As Integer = 0 If Pokemon.Count = 2 Then Dim p1 As Pokemon = Pokemon(0) Dim p2 As Pokemon = Pokemon(1) If p1.CanBreed = False Or p2.CanBreed = False Then Return 0 End If If p1.EggGroup1 = P3D.Pokemon.EggGroups.Undiscovered Or p1.EggGroup2 = P3D.Pokemon.EggGroups.Undiscovered Or p2.EggGroup1 = P3D.Pokemon.EggGroups.Undiscovered Or p2.EggGroup2 = P3D.Pokemon.EggGroups.Undiscovered Then Return 0 End If If p1.EggGroup1 = P3D.Pokemon.EggGroups.Ditto Or p1.EggGroup2 = P3D.Pokemon.EggGroups.Ditto Then If p2.EggGroup1 = P3D.Pokemon.EggGroups.Ditto Or p2.EggGroup2 = P3D.Pokemon.EggGroups.Ditto Then Return 0 End If End If If p2.EggGroup1 = P3D.Pokemon.EggGroups.Ditto Or p2.EggGroup2 = P3D.Pokemon.EggGroups.Ditto Then If p1.EggGroup1 = P3D.Pokemon.EggGroups.Ditto Or p1.EggGroup2 = P3D.Pokemon.EggGroups.Ditto Then Return 0 End If End If If p1.IsGenderless = True Then If p2.EggGroup1 = P3D.Pokemon.EggGroups.Ditto Or p2.EggGroup2 = P3D.Pokemon.EggGroups.Ditto Then chance = -1 Else If p1.EggGroup1 = P3D.Pokemon.EggGroups.Ditto Or p1.EggGroup2 = P3D.Pokemon.EggGroups.Ditto Then chance = -1 End If End If ElseIf p2.IsGenderless = True Then If p1.EggGroup1 = P3D.Pokemon.EggGroups.Ditto Or p1.EggGroup2 = P3D.Pokemon.EggGroups.Ditto Then chance = -1 Else If p2.EggGroup1 = P3D.Pokemon.EggGroups.Ditto Or p2.EggGroup2 = P3D.Pokemon.EggGroups.Ditto Then chance = -1 End If End If ElseIf p1.IsGenderless = False And p2.IsGenderless = False Then If p1.Gender <> p2.Gender Then If p1.EggGroup1 = P3D.Pokemon.EggGroups.Ditto Or p2.EggGroup1 = P3D.Pokemon.EggGroups.Ditto Or p1.EggGroup2 = P3D.Pokemon.EggGroups.Ditto Or p2.EggGroup2 = P3D.Pokemon.EggGroups.Ditto Then chance = -1 Else If p1.EggGroup1 = p2.EggGroup1 And p1.EggGroup1 <> P3D.Pokemon.EggGroups.None Or p1.EggGroup2 = p2.EggGroup1 And p1.EggGroup2 <> P3D.Pokemon.EggGroups.None Or p1.EggGroup1 = p2.EggGroup2 And p1.EggGroup1 <> P3D.Pokemon.EggGroups.None Or p1.EggGroup2 = p2.EggGroup2 And p1.EggGroup2 <> P3D.Pokemon.EggGroups.None Then chance = -1 End If End If End If End If If chance = -1 Then If p1.Number = p2.Number And p1.OT <> p2.OT Then chance = 70 End If If p1.Number = p2.Number And p1.OT = p2.OT Then chance = 50 End If If p1.Number <> p2.Number And p1.OT <> p2.OT Then chance = 50 End If If p1.Number <> p2.Number And p1.OT = p2.OT Then chance = 20 End If End If End If If chance > 0 Then If Core.Player.Inventory.GetItemAmount(241) > 0 Then chance = CInt(chance * 1.3F) End If End If Return chance End Function Public Shared Function CanBreed(ByVal daycareID As Integer) As Integer Dim l As New List(Of Pokemon) For Each line As String In Core.Player.DaycareData.SplitAtNewline() If line.StartsWith(daycareID.ToString() & "|") = True Then Dim data As String = line.Remove(0, line.IndexOf("{")) Dim p As Pokemon = P3D.Pokemon.GetPokemonByData(data) l.Add(p) End If Next Return CanBreed(l) End Function Public Shared Function CanBreed(ByVal Pokemon As Dictionary(Of Integer, Pokemon)) As Integer Dim l As New List(Of Pokemon) For i = 0 To Pokemon.Count - 1 l.Add(Pokemon.Values(i)) Next Return CanBreed(l) End Function Private Shared Function GetEggPokemonID(ByVal Pokemon As Dictionary(Of Integer, Pokemon)) As Integer If Pokemon.Count = 2 Then Dim p1 As Pokemon = Pokemon.Values(0) Dim p2 As Pokemon = Pokemon.Values(1) If p1.EggGroup1 = P3D.Pokemon.EggGroups.Ditto Or p1.EggGroup2 = P3D.Pokemon.EggGroups.Ditto Then Return p2.Number End If If p2.EggGroup1 = P3D.Pokemon.EggGroups.Ditto Or p2.EggGroup2 = P3D.Pokemon.EggGroups.Ditto Then Return p1.Number End If If p1.Gender = P3D.Pokemon.Genders.Female Then Return p1.Number End If If p2.Gender = P3D.Pokemon.Genders.Female Then Return p2.Number End If End If Return 0 End Function Private Shared Function GetEggPokeballID(ByVal Pokemon As List(Of Pokemon)) As Integer Dim ballID As Integer = 5 If Pokemon.Count = 2 Then Dim p1 As Pokemon = Pokemon(0) Dim p2 As Pokemon = Pokemon(1) ' First Pokémon is Ditto: If p1.EggGroup1 = P3D.Pokemon.EggGroups.Ditto Or p1.EggGroup2 = P3D.Pokemon.EggGroups.Ditto Then ' If the first Pokémon is Ditto, then the other Pokémon must be female to inherit the Poké Ball. If p2.Gender = P3D.Pokemon.Genders.Female Then ballID = p2.CatchBall.ID End If End If 'Second Pokémon is Ditto. If p2.EggGroup1 = P3D.Pokemon.EggGroups.Ditto Or p2.EggGroup2 = P3D.Pokemon.EggGroups.Ditto Then 'If the second Pokémon is Ditto, then the other Pokémon must be female to inherit the Poké Ball. If p1.Gender = P3D.Pokemon.Genders.Female Then ballID = p1.CatchBall.ID End If End If ' No Pokémon is Ditto: If p1.EggGroup1 <> P3D.Pokemon.EggGroups.Ditto And p1.EggGroup2 <> P3D.Pokemon.EggGroups.Ditto And p2.EggGroup1 <> P3D.Pokemon.EggGroups.Ditto And p2.EggGroup2 <> P3D.Pokemon.EggGroups.Ditto Then ' First Pokémon is female: If p1.Gender = P3D.Pokemon.Genders.Female Then ballID = p1.CatchBall.ID End If ' Second Pokémon is female: If p2.Gender = P3D.Pokemon.Genders.Female Then ballID = p2.CatchBall.ID End If End If ' Check for: Master Ball, Cherish Ball: Set to Poké Ball If ballID = 1 Or ballID = 45 Then ballID = 5 End If End If ' Return BallID (Standard is 5 for Pokéball): Return ballID End Function Public Shared Sub ObtainEgg() Dim Data() As String = Core.Player.DaycareData.SplitAtNewline() Dim IDs As New List(Of Integer) For Each line As String In Data If line <> "" And line.Contains("|") = True Then Dim newID As Integer = CInt(line.GetSplit(0, "|")) If IDs.Contains(newID) = False Then IDs.Add(newID) End If End If Next Logger.Debug("Daycare circle complete!") For Each DaycareID As Integer In IDs Logger.Debug("Daycare ID: " & DaycareID) Dim Pokemon As New Dictionary(Of Integer, Pokemon) Dim hasEgg As Boolean = False Dim EggID As Integer = 0 For Each line As String In Data If line.StartsWith(DaycareID & "|") = True Then If line.GetSplit(1, "|") = "Egg" Then hasEgg = True EggID = CInt(line.GetSplit(2, "|")) Else Dim PlaceID As Integer = CInt(line.GetSplit(1, "|")) Dim startStep As Integer = CInt(line.GetSplit(2, "|")) Dim Level As Integer = CInt(line.GetSplit(3, "|")) Dim PokemonData As String = line.GetSplit(4, "|") If Pokemon.ContainsKey(PlaceID) = False Then Dim p As Pokemon = P3D.Pokemon.GetPokemonByData(PokemonData) Pokemon.Add(PlaceID, p) End If End If End If Next Logger.Debug("Pokémon count: " & Pokemon.Count) Logger.Debug("Has Egg: " & hasEgg.ToString()) If hasEgg = False Then Dim breedChance As Integer = CanBreed(Pokemon) If breedChance > 0 Then Logger.Debug("Breed chance: " & breedChance) If Core.Random.Next(0, 100) < breedChance Then Dim parentID As Integer = GetEggPokemonID(Pokemon) Dim newEggID As Integer = P3D.Pokemon.GetPokemonByID(parentID).EggPokemon Dim s As String = DaycareID.ToString() & "|Egg|" & newEggID.ToString() Logger.Debug("Egg created!" & Environment.NewLine & "EggID: " & newEggID) TriggerCall(DaycareID) Dim oldData As String = Core.Player.DaycareData If oldData <> "" Then oldData &= Environment.NewLine End If oldData &= s Core.Player.DaycareData = oldData End If Else Logger.Debug("Pokémon in Daycare " & DaycareID & " cannot breed.") End If End If Next End Sub Public Shared Sub TriggerCall(ByVal daycareID As Integer) If ActionScript.IsRegistered("daycare_callid_" & daycareID.ToString()) = True Then Dim c() As Object = ActionScript.GetRegisterValue("daycare_callid_" & daycareID.ToString()) If Not c(0) Is Nothing And Not c(1) Is Nothing Then Dim callID As String = CStr(c(0)) GameJolt.PokegearScreen.CallID(callID, True, False) Else Logger.Debug("Cannot initialize call for Daycare ID " & daycareID.ToString() & ".") End If Else Logger.Debug("Cannot initialize call for Daycare ID " & daycareID.ToString() & ".") End If End Sub Public Shared Sub EggCircle() Core.Player.PlayerTemp.DayCareCycle = 256 ObtainEgg() End Sub End Class