Imports P3D.ScriptVersion2 Public Class Trainer Public AILevel As Integer = 0 Public SignatureMoves As New List(Of BattleSystem.Attack) Public Pokemons As New List(Of Pokemon) Public TrainerType As String = "Youngster" Public TrainerType2 As String = "Youngster" Public Name As String = "Joey" Public Name2 As String = "Joey" Public Money As Integer = 84 Public SpriteName As String = "14" Public SpriteName2 As String = "14" Public Region As String = "Johto" Public Music As String = "Trainer" Public TrainerFile As String = "" Public DoubleTrainer As Boolean = False Public Items As New List(Of Item) Public Gender As Integer = -1 Public IntroType As Integer = 10 Public GameJoltID As String = "" Public VSImageOrigin As String = "VSIntro" Public VSImagePosition As Vector2 = New Vector2(0, 0) Public VSImageSize As Size = New Size(61, 54) Public BarImagePosition As Vector2 = New Vector2(0, 0) Public OutroMessage As String = "TRAINER_DEFAULT_MESSAGE" Public OutroMessage2 As String = "TRAINER_DEFAULT_MESSAGE" Public IntroMessage As String = "TRAINER_DEFAULT_MESSAGE" Public DefeatMessage As String = "TRAINER_DEFAULT_MESSAGE" Public Shared FrontierTrainer As Integer = -1 Public Function IsBeaten() As Boolean Return ActionScript.IsRegistered("trainer_" & TrainerFile) End Function Public Shared Function IsBeaten(ByVal CheckTrainerFile As String) As Boolean Return ActionScript.IsRegistered("trainer_" & CheckTrainerFile) End Function Public Sub New() End Sub Public Sub New(ByVal TrainerFile As String) Me.TrainerFile = TrainerFile Dim path As String = GameModeManager.GetScriptPath("Trainer\" & TrainerFile & ".trainer") Security.FileValidation.CheckFileValid(path, False, "Trainer.vb") Dim Data() As String = System.IO.File.ReadAllLines(path) If Data(0) = "[TRAINER FORMAT]" Then LoadTrainer(Data) Else LoadTrainerLegacy(Data) End If End Sub Private Sub LoadTrainerLegacy(ByVal Data() As String) Dim newData As New List(Of String) Dim sevenData As List(Of String) = Data(7).Split(CChar("|")).ToList() newData.Add("Name|" & Data(2)) newData.Add("TrainerClass|" & Data(1)) newData.Add("Money|" & Data(0)) newData.Add("IntroMessage|" & Data(3)) newData.Add("OutroMessage|" & Data(4)) newData.Add("DefeatMessage|" & Data(5)) newData.Add("TextureID|" & Data(6)) newData.Add("Region|" & sevenData(0)) Me.Region = sevenData(0) Me.Music = sevenData(1) newData.Add("IniMusic|" & GetIniMusicName()) newData.Add("DefeatMusic|" & GetDefeatMusic()) newData.Add("BattleMusic|" & GetBattleMusicName()) newData.Add("Pokemon1|" & Data(8).Remove(0, 2)) newData.Add("Pokemon2|" & Data(9).Remove(0, 2)) newData.Add("Pokemon3|" & Data(10).Remove(0, 2)) newData.Add("Pokemon4|" & Data(11).Remove(0, 2)) newData.Add("Pokemon5|" & Data(12).Remove(0, 2)) newData.Add("Pokemon6|" & Data(13).Remove(0, 2)) If Data.Length > 14 Then newData.Add("Items|" & Data(14)) End If If Data.Length > 15 Then newData.Add("AI|" & Data(15)) End If If Data.Length > 16 Then newData.Add("Gender|" & Data(16)) End If Dim sequenceData As String = "Blue,Blue" If sevenData.Count = 3 Then sequenceData = sevenData(2) & ",Blue" ElseIf sevenData.Count > 3 Then sequenceData = sevenData(2) & "," & sevenData(3) End If newData.Add("IntroSequence|" & sequenceData) Logger.Log(Logger.LogTypes.Warning, "Trainer.vb: Converted legacy trainer file! Generated new trainer data:") Logger.Log(Logger.LogTypes.Message, newData.ToArray().ArrayToString()) LoadTrainer(newData.ToArray()) End Sub Private Sub LoadTrainer(ByVal Data() As String) Dim PokeLines As New List(Of String) Dim isDoubleTrainerValid As Integer = 0 Dim vsdata As String = "blue" Dim bardata As String = "blue" For Each line As String In Data If line.Contains("|") = True Then Dim pointer As String = line.Remove(line.IndexOf("|")) Dim value As String = line.Remove(0, line.IndexOf("|") + 1) Select Case pointer.ToLower() Case "name" Me.Name = ScriptCommander.Parse(value).ToString() If Me.Name.Contains(",") = True Then Me.Name2 = Me.Name.GetSplit(1) Me.Name = Me.Name.GetSplit(0) isDoubleTrainerValid += 1 End If Case "trainerclass" Me.TrainerType = ScriptCommander.Parse(value).ToString() If Me.TrainerType.Contains(",") = True Then Me.TrainerType2 = TrainerType.GetSplit(1) Me.TrainerType = TrainerType.GetSplit(0) isDoubleTrainerValid += 1 End If Case "money" Me.Money = CInt(ScriptConversion.ToInteger(ScriptCommander.Parse(value).ToString())) Case "intromessage" Me.IntroMessage = ScriptCommander.Parse(value).ToString() Case "outromessage" Me.OutroMessage = ScriptCommander.Parse(value).ToString() If Me.OutroMessage.Contains("|") = True Then Me.OutroMessage2 = OutroMessage.GetSplit(1, "|") Me.OutroMessage = OutroMessage.GetSplit(0, "|") isDoubleTrainerValid += 1 End If Case "defeatmessage" Me.DefeatMessage = ScriptCommander.Parse(value).ToString() Case "textureid" Me.SpriteName = ScriptCommander.Parse(value).ToString() If Me.SpriteName.Contains(",") = True Then Me.SpriteName2 = Me.SpriteName.GetSplit(1) Me.SpriteName = Me.SpriteName.GetSplit(0) isDoubleTrainerValid += 1 End If Case "region" Me.Region = ScriptCommander.Parse(value).ToString() Case "inimusic" Me.IniMusic = ScriptCommander.Parse(value).ToString() Case "defeatmusic" Me.DefeatMusic = ScriptCommander.Parse(value).ToString() Case "battlemusic" Me.BattleMusic = ScriptCommander.Parse(value).ToString() Case "insightmusic" Me.InSightMusic = ScriptCommander.Parse(value).ToString() Case "pokemon1", "pokemon2", "pokemon3", "pokemon4", "pokemon5", "pokemon6" If value <> "" Then PokeLines.Add(value) End If Case "items" If value <> "" Then Dim itemData() As String = ScriptCommander.Parse(value).ToString().Split(CChar(",")) For Each ItemID As String In itemData Items.Add(Item.GetItemByID(ItemID.ToString)) Next End If Case "gender" Dim GenderInt As Integer = CInt(ScriptCommander.Parse(value).ToString()) Me.Gender = CInt(MathHelper.Clamp(GenderInt, -1, 1)) Case "ai" Me.AILevel = CInt(ScriptCommander.Parse(value).ToString()) Case "introsequence" value = ScriptCommander.Parse(value).ToString() If value.Contains(",") = True Then vsdata = value.GetSplit(0) bardata = value.GetSplit(1) Else vsdata = value End If Case "introtype" Me.IntroType = CInt(ScriptCommander.Parse(value).ToString()) End Select End If Next For Each PokeLine As String In PokeLines Dim PokeData As String = PokeLine.GetSplit(1, "|") If PokeData <> "" Then If ScriptCommander.Parse(PokeData).ToString().StartsWith("{") = True Then PokeData = ScriptCommander.Parse(PokeData).ToString().Replace("§", ",").Replace("«", "[").Replace("»", "]") End If If PokeData.StartsWith("{") = True And PokeData.EndsWith("}") = True Then Dim p As Pokemon = Pokemon.GetPokemonByData(PokeData) If Core.Player.DifficultyMode > 0 Then Dim level As Integer = p.Level Dim addLevel As Integer = 0 If Core.Player.DifficultyMode = 1 Then addLevel = CInt(Math.Ceiling(level / 10)) ElseIf Core.Player.DifficultyMode = 2 Then addLevel = CInt(Math.Ceiling(level / 5)) End If While level + addLevel > p.Level p.LevelUp(False) p.Experience = p.NeedExperience(p.Level) End While p.HP = p.MaxHP End If Pokemons.Add(p) Else Dim firstPart As String = "" Dim secondPart As String = "" Dim endedFirstPart As Boolean = False Dim readData As String = PokeData Dim openTag As Boolean = False While readData.Length > 0 Select Case readData(0).ToString() Case "<" openTag = True Case ">" openTag = False Case "," If openTag = False Then endedFirstPart = True End If End Select If readData(0).ToString() <> "," Or openTag = True Then If endedFirstPart = True Then secondPart &= readData(0).ToString() Else firstPart &= readData(0).ToString() End If End If readData = readData.Remove(0, 1) End While Dim PK As String = ScriptCommander.Parse(firstPart).ToString() Dim Level As Integer = ScriptConversion.ToInteger(ScriptCommander.Parse(secondPart)) Dim ID As Integer = ScriptConversion.ToInteger(PK.Split(CChar("_"))(0)) Dim AD As String = "" If PK.Contains(CChar("_")) Then AD = PK.Split(CChar("_"))(1) End If Dim addLevel As Integer = 0 If Core.Player.DifficultyMode = 1 Then addLevel = CInt(Math.Ceiling(Level / 10)) ElseIf Core.Player.DifficultyMode = 2 Then addLevel = CInt(Math.Ceiling(Level / 5)) End If Level += addLevel Dim maxLevel As Integer = CInt(GameModeManager.GetGameRuleValue("MaxLevel", "100")) If Level > maxLevel Then Level = maxLevel End If Dim p As Pokemon = Nothing If FrontierTrainer > -1 Then p = FrontierSpawner.GetPokemon(Level, FrontierTrainer, Nothing) Else If AD <> "" Then p = Pokemon.GetPokemonByID(ID, AD) p.Generate(Level, True, AD) Else p = Pokemon.GetPokemonByID(ID) p.Generate(Level, True) End If End If If p.IsGenderless = False Then Select Case Me.Gender Case 0 If p.IsMale > 0.0F Then p.Gender = Pokemon.Genders.Male End If Case 1 If p.IsMale < 100.0F Then p.Gender = Pokemon.Genders.Female End If End Select End If p.IsShiny = False Pokemons.Add(p) End If End If Next If isDoubleTrainerValid = 4 Then Me.DoubleTrainer = True End If SetIniImage(vsdata, bardata) FrontierTrainer = -1 End Sub Private Sub SetIniImage(ByVal vsType As String, ByVal barType As String) Select Case vsType.ToLower() Case "blue", "0" Me.VSImagePosition = New Vector2(0, 0) Case "orange", "1" Me.VSImagePosition = New Vector2(1, 0) Case "green", "2" Me.VSImagePosition = New Vector2(0, 1) Case "3" Me.VSImagePosition = New Vector2(1, 1) Case "4" Me.VSImagePosition = New Vector2(0, 2) Case "5" Me.VSImagePosition = New Vector2(1, 2) Case "6" Me.VSImagePosition = New Vector2(0, 3) Case "7" Me.VSImagePosition = New Vector2(1, 3) Case "8" Me.VSImagePosition = New Vector2(0, 4) Case "9" Me.VSImagePosition = New Vector2(1, 4) Case "red", "10" Me.VSImagePosition = New Vector2(0, 5) Case "11" Me.VSImagePosition = New Vector2(1, 5) Case "battlefrontier" Me.VSImagePosition = New Vector2(0, 0) Me.VSImageOrigin = "battlefrontier" Me.VSImageSize = New Size(275, 275) Case Else If StringHelper.IsNumeric(vsType) = True Then If CInt(vsType) > 11 Then Dim x As Integer = CInt(vsType) Dim y As Integer = 0 While x > 1 x -= 2 y += 1 End While Me.VSImagePosition = New Vector2(x, y) End If End If End Select Select Case barType.ToLower() Case "blue", "0" Me.BarImagePosition = New Vector2(0, 0) Case "orange", "1" Me.BarImagePosition = New Vector2(1, 0) Case "lightgreen", "2" Me.BarImagePosition = New Vector2(0, 1) Case "gray", "3" Me.BarImagePosition = New Vector2(1, 1) Case "violet", "4" Me.BarImagePosition = New Vector2(0, 2) Case "green", "5" Me.BarImagePosition = New Vector2(1, 2) Case "yellow", "6" Me.BarImagePosition = New Vector2(0, 3) Case "brown", "7" Me.BarImagePosition = New Vector2(1, 3) Case "lightblue", "8" Me.BarImagePosition = New Vector2(0, 4) Case "lightgray", "9" Me.BarImagePosition = New Vector2(1, 4) Case "red", "10" Me.BarImagePosition = New Vector2(0, 5) Case "11" Me.BarImagePosition = New Vector2(1, 5) Case Else If StringHelper.IsNumeric(barType) = True Then If CInt(barType) > 11 Then Dim x As Integer = CInt(barType) Dim y As Integer = 0 While x > 1 x -= 2 y += 1 End While Me.BarImagePosition = New Vector2(x, y) End If End If End Select End Sub Private IniMusic As String = "" Private DefeatMusic As String = "" Private BattleMusic As String = "" Private InSightMusic As String = "trainer_encounter" Public Function GetIniMusicName() As String If IniMusic <> "" Then Return IniMusic End If Dim middle As String = "trainer" Select Case Me.Music.ToLower() Case "rival" middle = "rival" Case "leader" middle = "leader" Case "rocket" middle = "rocket" End Select Return Region & "_" & middle & "_intro" End Function Public Function GetDefeatMusic() As String If DefeatMusic <> "" Then Return DefeatMusic End If Dim pre As String = "trainer" Select Case Me.Music.ToLower() Case "leader" pre = "leader" End Select Return pre & "_defeat" End Function Public Function GetBattleMusicName() As String If BattleMusic <> "" Then Return BattleMusic End If Return Me.Region.ToLower() & "_" & Me.Music.ToLower() End Function Public Function GetInSightMusic() As String Return InSightMusic End Function Public Function HasBattlePokemon() As Boolean For Each Pokemon As Pokemon In Pokemons If Pokemon.Status <> P3D.Pokemon.StatusProblems.Fainted And Pokemon.HP > 0 Then Return True End If Next Return False End Function Public Sub TrainerItemUse(ByVal ItemID As Integer) For i = 0 To Items.Count - 1 Dim item As Item = Items(i) If item.ID = ItemID Then Me.Items.RemoveAt(i) Exit For End If Next End Sub Public Function CountUseablePokemon() As Integer Dim i As Integer = 0 For Each p As Pokemon In Me.Pokemons If p.HP > 0 And p.Status <> Pokemon.StatusProblems.Fainted Then i += 1 End If Next Return i End Function End Class