Imports P3D.Items ''' ''' Provides an interface to load additional GameMode items. ''' Public Class GameModeItemLoader 'The default relative path to load items from (Content folder). Const PATH As String = "Data\Items\" 'List of loaded items. Shared LoadedItems As New List(Of GameModeItem) ''' ''' Load the attack list for the loaded GameMode. ''' ''' The game won't try to load the list if the default GameMode is selected. Public Shared Sub Load() LoadedItems.Clear() If GameModeManager.ActiveGameMode.IsDefaultGamemode = False Then If System.IO.Directory.Exists(GameController.GamePath & "\" & GameModeManager.ActiveGameMode.ContentPath & "\" & PATH) = True Then For Each file As String In System.IO.Directory.GetFiles(GameController.GamePath & "\" & GameModeManager.ActiveGameMode.ContentPath & PATH, "*.dat") LoadItem(file) Next End If End If If LoadedItems.Count > 0 Then Logger.Debug("Loaded " & LoadedItems.Count.ToString() & " GameMode item(s).") End If End Sub ''' ''' Loads a item from a file. ''' ''' The file to load the item from. Private Shared Sub LoadItem(ByVal file As String) Dim item As New GameModeItem Dim content() As String = System.IO.File.ReadAllLines(file) Dim key As String = "" Dim value As String = "" Dim setID As Boolean = False 'Controls if the item sets its ID. Dim setName As Boolean = False 'Controls if the item sets its ID. Dim nonCommentLines As Integer = 0 Try 'Go through lines of the file and set the properties depending on the content. 'Lines starting with # are comments. For Each l As String In content If l.Contains("|") = True And l.StartsWith("#") = False Then nonCommentLines += 1 key = l.Remove(l.IndexOf("|")) value = l.Remove(0, l.IndexOf("|") + 1) Select Case key.ToLower() Case "id" item.gmID = "gm" & CInt(value).ToString setID = True Case "name" item.gmName = value setName = True Case "pluralname" item.gmPluralName = value Case "description" item.gmDescription = value Case "type" Select Case value.ToLower() Case "standard", "0" item.gmItemType = ItemTypes.Standard Case "medicine", "1" item.gmItemType = ItemTypes.Medicine Case "plants", "2" item.gmItemType = ItemTypes.Plants Case "balls", "pokeballs", "3" item.gmItemType = ItemTypes.Pokéballs Case "machines", "4" item.gmItemType = ItemTypes.Machines Case "keyitems", "5" item.gmItemType = ItemTypes.KeyItems Case "mail", "6" item.gmItemType = ItemTypes.Mail Case "battleitems", "7" item.gmItemType = ItemTypes.BattleItems End Select Case "textureindex" Dim itemX As Integer = CInt(value) Dim itemY As Integer = 0 Dim sheetWidth As Integer = CInt(TextureManager.GetTexture(item.gmTextureSource).Width / 24) While itemX > sheetWidth - 1 itemX -= sheetWidth itemY += 1 End While item.gmTextureRectangle = New Rectangle(CInt(itemX * 24), CInt(itemY * 24), 24, 24) Case "canbeused" item.gmCanBeUsed = CBool(value) Case "canbeusedinbattle" item.gmCanBeUsedInBattle = CBool(value) Case "useonpokemoninbattle" item.gmBattleSelectPokemon = CBool(value) Case "canbetossed" item.gmCanBeTossed = CBool(value) Case "canbeheld" item.gmCanBeHeld = CBool(value) Case "canbetraded" item.gmCanBeTraded = CBool(value) Case "price" item.gmPrice = CInt(value) Case "battlepointsprice" item.gmBattlePointsPrice = CInt(value) Case "catchmultiplier" item.gmCatchMultiplier = CSng(value.ReplaceDecSeparator) Case "maxstack" item.gmMaxStack = CInt(value) Case "flingdamage" item.gmFlingDamage = CInt(value) Case "ishealingitem" item.gmIsHealingItem = CBool(value) Case "ismail" item.gmIsMail = CBool(value) Case "healhpamount" item.gmHealHPAmount = CInt(value) Case "curestatus" Dim StatusEffectList As New List(Of String) Dim valueSplit As String() = value.Split(",") For i = 0 To valueSplit.Count - 1 Select Case valueSplit(i).ToLower Case "brn", "frz", "prz", "psn", "bpsn", "slp", "fnt", "confusion", "allwithoutfnt", "all" StatusEffectList.Add(valueSplit(i)) End Select Next If item.gmCureStatusEffects Is Nothing Then item.gmCureStatusEffects = StatusEffectList Else item.gmCureStatusEffects.AddRange(StatusEffectList) End If Case "evolutionpokemon" Dim PokemonList As New List(Of Integer) Dim valueSplit As String() = value.Split(CChar(",")) For i = 0 To valueSplit.Count - 1 If Pokemon.PokemonDataExists(valueSplit(i)) Then PokemonList.Add(CInt(valueSplit(i))) End If Next If item.gmEvolutionPokemon Is Nothing Then item.gmEvolutionPokemon = PokemonList Else item.gmEvolutionPokemon.AddRange(PokemonList) End If Case "script" item.gmScriptPath = value Case "ishm" item.gmIsHM = CBool(value) Case "teachmove" item.gmTeachMove = BattleSystem.Attack.GetAttackByID(CInt(value)) Case "canteachalways" item.gmCanTeachAlways = CBool(value) Case "canteachwhenfullyevolved" item.gmCanTeachWhenFullyEvolved = CBool(value) Case "canteachwhengendered" item.gmCanTeachWhenGendered = CBool(value) End Select End If Next Catch ex As Exception 'If an error occurs loading a item, log the error. Logger.Log(Logger.LogTypes.ErrorMessage, "GameModeItemLoader.vb: Error loading GameMode Item from file """ & file & """: " & ex.Message & "; Last Key/Value pair successfully loaded: " & key & "|" & value) End Try If nonCommentLines > 0 Then If setID = True AndAlso setName = True Then If item.gmIsMegaStone = True AndAlso item.gmMegaPokemonNumber <> Nothing AndAlso item.gmDescription = "" Then Dim MegaPokemonName As String = Pokemon.GetPokemonByID(item.gmMegaPokemonNumber).GetName item.gmDescription = "One variety of the mysterious Mega Stones. Have " & MegaPokemonName & " hold it, and this stone will enable it to Mega Evolve during battle." item.gmCanBeTossed = False item.gmCanBeTraded = False item.gmCanBeUsed = False item.gmCanBeUsedInBattle = False End If If item.gmTeachMove IsNot Nothing AndAlso item.gmDescription = "" Then Dim AttackName As String = item.gmTeachMove.Name item.gmDescription = "Teaches """ & AttackName & """ to a Pokémon." item.gmItemType = ItemTypes.Machines item.gmCanBeHeld = False item.gmCanBeTossed = True item.gmCanBeTraded = True item.gmCanBeUsed = True item.gmCanBeUsedInBattle = False If item.gmName.StartsWith("TM ") Then item.gmSortValue = CInt(item.gmName.Remove(0, 3)) + 190 ElseIf item.gmName.StartsWith("TM") Then item.gmSortValue = CInt(item.gmName.Remove(0, 2)) + 190 End If If item.gmName.StartsWith("HM ") Then item.gmSortValue = -100000 + CInt(item.gmName.Remove(0, 3)) ElseIf item.gmName.StartsWith("HM") Then item.gmSortValue = -100000 + CInt(item.gmName.Remove(0, 2)) End If item.gmTextureSource = "Items\ItemSheet" item.SetTeachMoveTextureRectangle() End If If item.gmTextureRectangle = Nothing Then Dim itemX As Integer = CInt(item.gmID.Remove(0, 2)) Dim itemY As Integer = 0 Dim sheetWidth As Integer = CInt(TextureManager.GetTexture(item.gmTextureSource).Width / 24) While itemX > sheetWidth - 1 itemX -= sheetWidth itemY += 1 End While item.gmTextureRectangle = New Rectangle(CInt(itemX * 24), CInt(itemY * 24), 24, 24) End If LoadedItems.Add(item) 'Add the item. Else Logger.Log(Logger.LogTypes.ErrorMessage, "GameModeItemLoader.vb: User defined Items must set their ID through the ""ID"" property and their Name through the ""Name"" property, however the item loaded from """ & file & """ has no ID or Name set so it will be ignored.") End If Else Debug.Print("GameModeItemLoader.vb: The item loaded from """ & file & """ has no valid lines so it will be ignored.") End If End Sub ''' ''' Returns a custom item based on its ID. ''' ''' The ID of the custom item. ''' Returns a item or nothing. Public Shared Function GetItemByID(ByVal ID As String) As GameModeItem For Each i As GameModeItem In LoadedItems If i.gmID = ID Then Return i End If Next Return Nothing End Function Public Shared Function GetItemByName(ByVal Name As String) As GameModeItem For Each i As GameModeItem In LoadedItems If i.gmName.ToLowerInvariant() = Name.ToLowerInvariant() Then Return i End If Next Return Nothing End Function End Class