P3D-Legacy/P3D/Player/Pokedex.vb

299 lines
9.4 KiB
VB.net

Public Class Pokedex
'0 = undiscovered
'1 = seen
'2 = caught + seen
'3 = shiny + caught + seen
Public Shared AutoDetect As Boolean = True
Public Const POKEMONCOUNT As Integer = 721
#Region "PlayerData"
Public Shared Function CountEntries(ByVal Data As String, ByVal Type() As Integer) As Integer
Dim counts As Integer = 0
Dim pData() As String = Data.Split(CChar(Environment.NewLine))
For Each Entry As String In pData
Entry = Entry.Remove(0, Entry.IndexOf("{") + 1)
Entry = Entry.Remove(Entry.Length - 1, 1)
Dim eID As Integer = CInt(Entry.GetSplit(0, "|"))
Dim eType As Integer = CInt(Entry.GetSplit(1, "|"))
If Type.Contains(eType) = True Then
counts += 1
End If
Next
Return counts
End Function
Public Shared Function CountEntries(ByVal Data As String, ByVal Type() As Integer, ByVal Range() As String) As Integer
Dim IDs As New List(Of Integer)
For Each r As String In Range
If StringHelper.IsNumeric(r) = True Then
If IDs.Contains(CInt(r)) = False Then
IDs.Add(CInt(r))
End If
Else
If r.Contains("-") = True Then
Dim min As Integer = CInt(r.Remove(r.IndexOf("-")))
Dim max As Integer = CInt(r.Remove(0, r.IndexOf("-") + 1))
For i = min To max
If IDs.Contains(i) = False Then
IDs.Add(i)
End If
Next
End If
End If
Next
Dim counts As Integer = 0
Dim pData() As String = Data.Split(CChar(Environment.NewLine))
For Each Entry As String In pData
Entry = Entry.Remove(0, Entry.IndexOf("{") + 1)
Entry = Entry.Remove(Entry.Length - 1, 1)
Dim eID As Integer = CInt(Entry.GetSplit(0, "|"))
Dim eType As Integer = CInt(Entry.GetSplit(1, "|"))
If IDs.Contains(eID) = True Then
If Type.Contains(eType) = True Then
counts += 1
End If
End If
Next
Return counts
End Function
Public Shared Function GetEntryType(ByVal Data As String, ByVal ID As Integer) As Integer
Dim pData() As String = Data.Split(CChar(Environment.NewLine))
If pData.Count >= ID Then
If pData(ID - 1).Contains(ID.ToString() & "|") = True Then
Dim Entry As String = pData(ID - 1)
Return CInt(Entry.Remove(Entry.Length - 1, 1).Remove(0, Entry.IndexOf("|") + 1))
End If
End If
For Each Entry As String In pData
If Entry.Contains(ID.ToString() & "|") = True Then
Return CInt(Entry.Remove(Entry.Length - 1, 1).Remove(0, Entry.IndexOf("|") + 1))
End If
Next
Return 0
End Function
Public Shared Function ChangeEntry(ByVal Data As String, ByVal ID As Integer, ByVal Type As Integer) As String
If Type = 0 Or AutoDetect = True Then
If Data.Contains("{" & ID & "|") = True Then
Dim cEntry As Integer = GetEntryType(Data, ID)
If cEntry < Type Then
Return Data.Replace("{" & ID & "|" & cEntry & "}", "{" & ID & "|" & Type & "}")
Else
Return Data
End If
Else
If Data <> "" Then
Data &= Environment.NewLine
End If
Data &= "{" & ID & "|" & Type & "}"
Return Data
End If
End If
Return Data
End Function
Public Shared Function NewPokedex() As String
Dim Data As String = ""
For i = 1 To POKEMONCOUNT
Data &= "{" & i & "|0}"
If i <> POKEMONCOUNT Then
Data &= Environment.NewLine
End If
Next
Return Data
End Function
Public Shared Function GetLastSeen(ByVal Data As String) As Integer
Dim pData() As String = Data.Split(CChar(Environment.NewLine))
Dim lastSeen As Integer = 1
For Each Entry As String In pData
Entry = Entry.Remove(0, Entry.IndexOf("{") + 1)
Entry = Entry.Remove(Entry.Length - 1, 1)
Dim eID As Integer = CInt(Entry.GetSplit(0, "|"))
Dim eType As Integer = CInt(Entry.GetSplit(1, "|"))
If eType > 0 Then
lastSeen = eID
End If
Next
Return lastSeen
End Function
Public Shared Sub Load()
Core.Player.Pokedexes.Clear()
Dim path As String = GameModeManager.GetContentFilePath("Data\pokedex.dat")
Security.FileValidation.CheckFileValid(path, False, "Pokedex.vb")
Dim lines() As String = System.IO.File.ReadAllLines(path)
For Each PokedexData As String In lines
Core.Player.Pokedexes.Add(New Pokedex(PokedexData))
Next
End Sub
Public Shared Function RegisterPokemon(ByVal Data As String, ByVal Pokemon As Pokemon) As String
If Pokemon.IsShiny = True Then
Return ChangeEntry(Data, Pokemon.Number, 3)
Else
Return ChangeEntry(Data, Pokemon.Number, 2)
End If
End Function
#End Region
#Region "PokedexHandler"
'The Pokedex screen changes the PokemonList array to add Pokémon not in the array, so this will get used to count things when focussing on the Pokémon in this dex.
Private _originalPokemonList As New Dictionary(Of Integer, Integer)
'Fields:
Public PokemonList As New Dictionary(Of Integer, Integer)
Public Name As String = ""
Public Activation As String = ""
Public OriginalCount As Integer = 0
Public IncludeExternalPokemon As Boolean = False 'for the pokedex screen, if true, this pokedex view will include all Pokémon seen/caught at the end.
Public Sub New(ByVal input As String)
Dim data() As String = input.Split(CChar("|"))
Me.Name = data(0)
Me.Activation = data(1)
Dim pokemonData() As String = data(2).Split(CChar(","))
Dim Place As Integer = 1
For Each l As String In pokemonData
l = l.Replace("[MAX]", POKEMONCOUNT.ToString())
If l.Contains("-") = True Then
Dim range() As String = l.Split(CChar("-"))
Dim min As Integer = CInt(range(0))
Dim max As Integer = CInt(range(1))
For j = min To max
PokemonList.Add(Place, j)
_originalPokemonList.Add(Place, j)
Place += 1
Next
Else
PokemonList.Add(Place, CInt(l))
_originalPokemonList.Add(Place, CInt(l))
Place += 1
End If
Next
If data.Length >= 4 Then
Me.IncludeExternalPokemon = CBool(data(3))
End If
Me.OriginalCount = Me.PokemonList.Count
End Sub
Dim TempPlaces As New Dictionary(Of Integer, Integer)
Public Function GetPlace(ByVal PokemonNumber As Integer) As Integer
If TempPlaces.ContainsKey(PokemonNumber) = True Then
Return TempPlaces(PokemonNumber)
End If
If PokemonList.ContainsValue(PokemonNumber) = True Then
For i = 0 To PokemonList.Values.Count - 1
If PokemonList.Values(i) = PokemonNumber Then
TempPlaces.Add(PokemonNumber, PokemonList.Keys(i))
Return PokemonList.Keys(i)
End If
Next
End If
Return -1
End Function
Public Function GetPokemonNumber(ByVal Place As Integer) As Integer
If PokemonList.ContainsKey(Place) = True Then
Return PokemonList(Place)
End If
Return -1
End Function
Public ReadOnly Property IsActivated() As Boolean
Get
If Me.Activation = "0" Then
Return True
Else
If ActionScript.IsRegistered(Me.Activation) = True Then
Return True
End If
End If
Return False
End Get
End Property
Public ReadOnly Property Obtained() As Integer
Get
Dim o As Integer = 0
For Each v As Integer In _originalPokemonList.Values
If GetEntryType(Core.Player.PokedexData, v) > 1 Then
o += 1
End If
Next
Return o
End Get
End Property
Public ReadOnly Property Seen() As Integer
Get
Dim o As Integer = 0
For Each v As Integer In _originalPokemonList.Values
If GetEntryType(Core.Player.PokedexData, v) = 1 Then
o += 1
End If
Next
Return o
End Get
End Property
Public ReadOnly Property Count() As Integer
Get
Return Me._originalPokemonList.Keys.Count
End Get
End Property
Public ReadOnly Property HasPokemon(ByVal pokemonNumber As Integer, ByVal originalList As Boolean) As Boolean
Get
If originalList = True Then
Return _originalPokemonList.ContainsValue(pokemonNumber)
Else
Return PokemonList.ContainsValue(pokemonNumber)
End If
End Get
End Property
#End Region
End Class