P3D-Legacy/P3D/Screens/PC/StorageSystemScreen.vb

1697 lines
77 KiB
VB.net

Public Class StorageSystemScreen
Inherits Screen
Public Shared TileOffset As Integer = 0
Private renderTarget As RenderTarget2D
Public Enum FeatureTypes
Deposit
Withdraw
Organize
End Enum
Public Enum SelectionModes
SingleMove
EasyMove
ItemMove
Withdraw
Deposit
End Enum
Private Enum CursorModes
Selection
Box
End Enum
Public Enum FilterTypes
Pokémon
Type1
Type2
Move
Ability
Nature
Gender
HeldItem
End Enum
Public FeatureType As FeatureTypes = FeatureTypes.Organize
Public SelectionMode As SelectionModes = SelectionModes.SingleMove
Public Structure Filter
Public FilterType As FilterTypes
Public FilterValue As String
End Structure
Public Filters As New List(Of Filter)
Dim CursorMode As CursorModes = CursorModes.Selection
Dim CursorPosition As Vector2
Dim CursorMovePosition As Vector2 = New Vector2(0)
Dim CursorAimPosition As Vector2 = New Vector2(0)
Dim CursorMoving As Boolean = False
Dim CursorSpeed As Integer = 0
Dim MovingPokemon As Pokemon = Nothing
Dim PickupPlace As Vector2 = New Vector2(1)
Dim PickupBox As Integer = 0
Dim texture As Texture2D
Dim menuTexture As Texture2D
Dim MenuEntries As New List(Of MenuEntry)
Dim MenuVisible As Boolean = False
Dim MenuCursor As Integer = 0
Dim MenuHeader As String = ""
Dim BoxChooseMode As Boolean = False
Dim Boxes As New List(Of Box)
Dim CurrentBox As Integer = 0
Dim modelRoll As Single = 0.0F
Dim modelPan As Single = 0.0F
Public Sub New(ByVal currentScreen As Screen)
Me.renderTarget = New RenderTarget2D(Core.GraphicsDevice, 1200, 680, False, SurfaceFormat.Color, DepthFormat.Depth24Stencil8)
Me.PreScreen = currentScreen
Me.Identification = Identifications.StorageSystemScreen
Me.MouseVisible = True
Me.CanBePaused = True
Me.CanChat = True
Me.CanMuteAudio = True
Me.texture = TextureManager.GetTexture("GUI\Box\storage")
Me.menuTexture = TextureManager.GetTexture("GUI\Menus\General")
LoadScreen()
End Sub
Private Shared Function LoadBoxes() As List(Of Box)
Dim boxes = New Dictionary(Of Integer, Box)
For i = 0 To Core.Player.BoxAmount - 1
boxes.Add(i, New Box(i))
Next
For Each line In Core.Player.BoxData.SplitAtNewline()
If Not line.StartsWith("BOX") And line <> "" Then
Dim Data = line.Split(",")
Dim boxIndex = CInt(Data(0))
Dim pokemonIndex = CInt(Data(1))
Dim pokemonData = line.Remove(0, line.IndexOf("{"))
Dim box As Box = Nothing
If Not boxes.TryGetValue(boxIndex, box) Then
boxes.Add(boxIndex, New Box(boxIndex))
End If
If Not box.Pokemon.ContainsKey(pokemonIndex) Then
box.Pokemon.Add(pokemonIndex, New PokemonWrapper(pokemonData)) ' Pokemon.GetPokemonByData(pokemonData))
End If
ElseIf line.StartsWith("BOX") Then
Dim boxData = line.Split("|")
Dim boxIndex = CInt(boxData(1))
Dim box As Box = Nothing
If Not boxes.TryGetValue(boxIndex, box) Then
boxes.Add(boxIndex, New Box(boxIndex))
End If
box.Background = CInt(boxData(3))
box.Name = boxData(2)
End If
Next
Dim bounds = (min:=boxes.Min(Function(x) x.Value.index), max:=boxes.Max(Function(x) x.Value.index))
For i = bounds.min To bounds.max
If Not boxes.ContainsKey(i) Then boxes.Add(i, New Box(i))
Next
boxes(bounds.max).IsBattleBox = True
Return boxes.Values.ToList()
End Function
Private Sub LoadScreen()
SelectionMode = Player.Temp.PCSelectionType
CursorMode = CursorModes.Selection
CursorPosition = Player.Temp.StorageSystemCursorPosition
Me.Boxes = LoadBoxes()
Me.CurrentBox = Player.Temp.PCBoxIndex
Me.BoxChooseMode = Player.Temp.PCBoxChooseMode
End Sub
#Region "Update"
Public Overrides Sub Update()
TextBox.Update()
If ControllerHandler.ButtonPressed(Buttons.Back) Or KeyBoardHandler.KeyPressed(KeyBindings.SpecialKey) Then
Core.SetScreen(New StorageSystemFilterScreen(Me))
End If
If Not TextBox.Showing Then
If MenuVisible Then
For i = 0 To Me.MenuEntries.Count - 1
If i <= Me.MenuEntries.Count - 1 Then Me.MenuEntries(i).Update(Me)
Next
If Controls.Up(True, True) Then Me.MenuCursor -= 1
If Controls.Down(True, True) Then Me.MenuCursor += 1
Dim maxIndex = Me.MenuEntries.Max(Function(x) x.Index)
Dim minIndex = Me.MenuEntries.Min(Function(x) x.Index)
If Me.MenuCursor > maxIndex Then Me.MenuCursor = minIndex
If Me.MenuCursor < minIndex Then Me.MenuCursor = maxIndex
Else
TurnModel()
If CursorMoving Then
MoveCursor()
Else
Dim rightInput = ControllerHandler.ButtonPressed(Buttons.RightTrigger) Or Controls.Right(True, False, True, False, False, False)
Dim leftInput = ControllerHandler.ButtonPressed(Buttons.LeftTrigger) Or Controls.Left(True, False, True, False, False, False)
If leftInput Then Me.CurrentBox -= 1
If rightInput Then Me.CurrentBox += 1
If CurrentBox < 0 Then CurrentBox = Me.Boxes.Count - 1
If CurrentBox > Me.Boxes.Count - 1 Then CurrentBox = 0
PressNumberButtons()
If GetRelativeMousePosition() <> New Vector2(-1) AndAlso GetRelativeMousePosition() = CursorPosition AndAlso Controls.Accept(True, False, False) Then
SoundManager.PlaySound("select")
ChooseObject()
End If
ControlCursor()
If Controls.Accept(False, True, True) Then
SoundManager.PlaySound("select")
ChooseObject()
End If
If Controls.Dismiss(True, True, True) Then
SoundManager.PlaySound("select")
CloseScreen()
End If
End If
End If
StorageSystemScreen.TileOffset = (StorageSystemScreen.TileOffset + 1) Mod 64
End If
End Sub
Private Sub TurnModel()
If Controls.ShiftDown("L", False) Then modelRoll -= 0.1F
If Controls.ShiftDown("R", False) Then modelRoll += 0.1F
If Not ControllerHandler.ButtonDown(Buttons.RightThumbstickLeft Or Buttons.RightThumbstickRight) Then Return
Dim gPadState = GamePad.GetState(PlayerIndex.One)
modelRoll -= gPadState.ThumbSticks.Right.X * 0.1F
End Sub
Private Sub PressNumberButtons()
Dim switchTo = If(KeyBoardHandler.KeyPressed(Keys.D0), 9, -1)
If switchTo < 0 Then
Dim keysPressed = KeyBoardHandler.GetPressedKeys.Where(Function(key) key >= Keys.D1 AndAlso key <= Keys.D9)
switchTo = If(keysPressed.Count < 1, switchTo, keysPressed.Max() - Keys.D1)
End If
If switchTo < 0 Then Return
If Me.Boxes.Count - 1 >= switchTo Then CurrentBox = switchTo
End Sub
Private Sub ChooseObject()
If CursorPosition.Y = 0 Then
If CursorPosition.X = 0 Then Me.CurrentBox -= 1
If CursorPosition.X = 5 Then Me.CurrentBox += 1
If CurrentBox < 0 Then CurrentBox = Me.Boxes.Count - 1
If CurrentBox > Me.Boxes.Count - 1 Then CurrentBox = 0
If CursorPosition.X = 6 Then
SelectPokemon()
ElseIf CursorPosition.X > 0 AndAlso CursorPosition.X < 5 Then
If Me.BoxChooseMode Then
Me.BoxChooseMode = False
Return
End If
Dim entries = New List(Of MenuEntry)
entries.Add(New MenuEntry(3, Localization.GetString("storage_screen_menu_box_ChooseBox", "Choose Box"), False, Sub() Me.BoxChooseMode = Not Me.BoxChooseMode))
entries.Add(New MenuEntry(4, Localization.GetString("storage_screen_menu_box_ChangeMode", "Change Mode"), False, AddressOf Me.ChangeModeMenu))
If Not GetBox(CurrentBox).IsBattleBox Then
entries.Add(New MenuEntry(5, Localization.GetString("storage_screen_menu_box_Wallpaper", "Wallpaper"), False, AddressOf WallpaperMain))
entries.Add(New MenuEntry(6, Localization.GetString("global_name", "Name"), False, AddressOf SelectNameBox))
End If
entries.Add(New MenuEntry(entries.Max(Function(x) x.Index) + 1, Localization.GetString("global_cancel", "Cancel"), True, Nothing))
Me.SetupMenu(entries.ToArray(), Localization.GetString("storage_screen_menu_box_WhatDoYouWant", "What do you want to do?"))
End If
ElseIf CursorPosition.Y < 6 Then
If Not BoxChooseMode Or CursorPosition.X > 5 Or CursorPosition.Y < 1 Then
SelectPokemon()
Return
End If
Dim id = CInt(CursorPosition.X + (CursorPosition.Y - 1) * 6)
If GetBox(id) Is Nothing Then Return
Me.CurrentBox = id
Me.BoxChooseMode = False
End If
End Sub
Private Sub ChangeModeMenu()
Dim e As New MenuEntry(3, Localization.GetString("storage_screen_menu_mode_Withdraw", "Withdraw"), False, Sub() Me.SelectionMode = SelectionModes.Withdraw)
Dim e1 As New MenuEntry(4, Localization.GetString("storage_screen_menu_mode_Deposit", "Deposit"), False, Sub() Me.SelectionMode = SelectionModes.Deposit)
Dim e2 As New MenuEntry(5, Localization.GetString("storage_screen_menu_mode_SingleMove", "Single Move"), False, Sub() Me.SelectionMode = SelectionModes.SingleMove)
Dim e3 As New MenuEntry(6, Localization.GetString("storage_screen_menu_mode_EasyMove", "Easy Move"), False, Sub() Me.SelectionMode = SelectionModes.EasyMove)
Dim e4 As New MenuEntry(7, Localization.GetString("global_cancel", "Cancel"), True, AddressOf Me.ChooseObject)
Me.SetupMenu({e, e1, e2, e3, e4}, Localization.GetString("storage_screen_menu_mode_ChooseModeToUse", "Choose a mode to use."))
End Sub
Private Sub SelectNameBox()
Dim box = GetBox(CurrentBox)
Dim defaultName = CStr(Localization.GetString("storage_screen_box_DefaultName", "BOX [NUMBER]")).Replace("[NUMBER]", $"{box.index + 1}")
Dim inputMode = InputScreen.InputModes.Text
Dim rename = Sub(name As String) box.Name = name
Dim screen = New InputScreen(Core.CurrentScreen, defaultName, inputMode, box.Name, 11, New List(Of Texture2D), rename)
Core.SetScreen(screen)
End Sub
#Region "Backgrounds"
Private Sub WallpaperMain()
Dim badges = Core.Player.Badges.Count
Dim package1 = New Dictionary(Of String, Integer)
Dim package2 = New Dictionary(Of String, Integer)
Dim package3 = New Dictionary(Of String, Integer)
Dim package4 = New Dictionary(Of String, Integer)
package1.Add(Localization.GetString("storage_screen_menu_wallpaper_Forest", "Forest"), 0)
package1.Add(Localization.GetString("storage_screen_menu_wallpaper_City", "City"), 1)
package1.Add(Localization.GetString("storage_screen_menu_wallpaper_Desert", "Desert"), 2)
package1.Add(Localization.GetString("storage_screen_menu_wallpaper_Savanna", "Savanna"), 3)
package1.Add(Localization.GetString("storage_screen_menu_wallpaper_Cave", "Cave"), 8)
package1.Add(Localization.GetString("storage_screen_menu_wallpaper_River", "River"), 11)
package2.Add(Localization.GetString("storage_screen_menu_wallpaper_Volcano", "Volcano"), 5)
package2.Add(Localization.GetString("storage_screen_menu_wallpaper_Snow", "Snow"), 6)
package2.Add(Localization.GetString("storage_screen_menu_wallpaper_Beach", "Beach"), 9)
package2.Add(Localization.GetString("storage_screen_menu_wallpaper_Seafloor", "Seafloor"), 10)
package2.Add(Localization.GetString("storage_screen_menu_wallpaper_Crag", "Crag"), 4)
package2.Add(Localization.GetString("storage_screen_menu_wallpaper_Steel", "Steel"), 7)
package3.Add(Localization.GetString("storage_screen_menu_wallpaper_Volcano2", "Volcano 2"), 14)
package3.Add(Localization.GetString("storage_screen_menu_wallpaper_City2", "City 2"), 15)
package3.Add(Localization.GetString("storage_screen_menu_wallpaper_Snow2", "Snow 2"), 16)
package3.Add(Localization.GetString("storage_screen_menu_wallpaper_Desert2", "Desert 2"), 17)
package3.Add(Localization.GetString("storage_screen_menu_wallpaper_Savanna2", "Savanna 2"), 18)
package3.Add(Localization.GetString("storage_screen_menu_wallpaper_Steel2", "Steel 2"), 19)
package4.Add(Localization.GetString("storage_screen_menu_wallpaper_System", "System"), 22)
package4.Add(Localization.GetString("storage_screen_menu_wallpaper_Simple ", "Simple "), 13)
package4.Add(Localization.GetString("storage_screen_menu_wallpaper_Checks ", "Checks "), 12)
package4.Add(Localization.GetString("storage_screen_menu_wallpaper_Seasons", "Seasons"), 23)
package4.Add(Localization.GetString("storage_screen_menu_wallpaper_Retro1", "Retro 1"), 20)
package4.Add(Localization.GetString("storage_screen_menu_wallpaper_Retro2", "Retro 2"), 21)
If Core.Player.SandBoxMode Or GameController.IS_DEBUG_ACTIVE Then
badges = 16
End If
Dim entries = New List(Of MenuEntry)
Dim cancelIndex = 4
entries.Add(New MenuEntry(3, Localization.GetString("storage_screen_menu_theme_Package1", "Package 1"), False, Sub() Me.WallpaperList(package1)))
If badges > 1 Then entries.Add(New MenuEntry(4, Localization.GetString("storage_screen_menu_theme_Package2", "Package 2"), False, Sub() Me.WallpaperList(package2)))
If badges > 4 Then entries.Add(New MenuEntry(5, Localization.GetString("storage_screen_menu_theme_Package3", "Package 3"), False, Sub() Me.WallpaperList(package3)))
If badges > 7 Then entries.Add(New MenuEntry(6, Localization.GetString("storage_screen_menu_theme_Package4", "Package 4"), False, Sub() Me.WallpaperList(package4)))
entries.Add(New MenuEntry(entries.Max(Function(x) x.Index) + 1, Localization.GetString("global_cancel", "Cancel"), True, AddressOf ChooseObject))
SetupMenu(entries.ToArray(), Localization.GetString("storage_screen_menu_theme_PickTheme", "Please pick a theme."))
End Sub
Private Sub WallpaperList(package As Dictionary(Of String, Integer))
Dim itemList = New List(Of MenuEntry)(package.Count + 1)
Dim index = 3
For Each wallpaper In package
itemList.Add(New MenuEntry(index, wallpaper.Key, False, Sub() GetBox(CurrentBox).Background = wallpaper.Value))
index += 1
Next
itemList.Add(New MenuEntry(index, Localization.GetString("global_cancel", "Cancel"), True, AddressOf WallpaperMain))
SetupMenu(itemList.ToArray(), Localization.GetString("storage_screen_menu_wallpaper_PickWallpaper", "Pick the wallpaper."))
End Sub
#End Region
Private Sub GetYOffset(ByVal p As Pokemon)
Dim t = p.GetTexture(True)
Me.yOffset = -1
Dim cArr(t.Width * t.Height - 1) As Color
t.GetData(cArr)
For y = 0 To t.Height - 1
For x = 0 To t.Width - 1
If cArr(x + y * t.Height) = Color.Transparent Then Continue For
Me.yOffset = y
Exit For
Next
If Me.yOffset <> -1 Then Exit For
Next
End Sub
Dim ClickedObject As Boolean = False
Private Sub MoveCursor()
Dim changedPosition = CursorMovePosition <> CursorAimPosition
Dim difference = CursorMovePosition - CursorAimPosition
Dim speed = New Vector2(Math.Sign(difference.X), Math.Sign(difference.Y)) * Me.CursorSpeed
CursorMovePosition -= speed
CursorMovePosition.X = If(speed.X > 0, Math.Max(CursorMovePosition.X, CursorAimPosition.X), Math.Min(CursorMovePosition.X, CursorAimPosition.X))
CursorMovePosition.Y = If(speed.Y > 0, Math.Max(CursorMovePosition.Y, CursorAimPosition.Y), Math.Min(CursorMovePosition.Y, CursorAimPosition.Y))
If CursorAimPosition <> CursorMovePosition Then Return
Me.CursorMoving = False
If Me.SelectionMode = SelectionModes.EasyMove And changedPosition And Me.ClickedObject Then
ChooseObject()
End If
End Sub
Private Sub ControlCursor()
Dim PreCursor = CursorPosition
Dim box = GetBox(CurrentBox)
Dim direction = Vector2.Zero
Dim cancel = ControllerHandler.ButtonPressed(Buttons.X)
Dim confirm = Controls.Accept(True, False, False) AndAlso GetRelativeMousePosition() <> New Vector2(-1)
Me.CursorMovePosition = GetAbsoluteCursorPosition(Me.CursorPosition)
If cancel Then
Me.CursorPosition = New Vector2(1, 0)
ElseIf confirm Then
Me.CursorPosition = GetRelativeMousePosition()
Else
If Controls.Right(True, True, False) Then direction.X += 1
If Controls.Left(True, True, False) Then direction.X -= 1
If Controls.Up(True, True, False) Then direction.Y -= 1
If Controls.Down(True, True, False) Then direction.Y += 1
Me.CursorPosition += direction
If direction.X > 0 And Me.CursorPosition.Y = 0 And Me.CursorPosition.X > 1 And Me.CursorPosition.X < 5 Then
Me.CursorPosition.X = 5
End If
If direction.X < 0 And Me.CursorPosition.Y = 0 And Me.CursorPosition.X > 0 And Me.CursorPosition.X < 4 Then
Me.CursorPosition.X = 0
End If
If direction.Y > 0 And Me.CursorPosition.Y = 1 And box.IsBattleBox And Me.CursorPosition.X < 6 And Not BoxChooseMode Then
Me.CursorPosition.X = 2
End If
End If
Me.CursorMoving = cancel Or confirm Or direction <> Vector2.Zero
Me.ClickedObject = confirm
Dim XRange() = {0, 6}
If Not Me.BoxChooseMode Then
If Me.SelectionMode = SelectionModes.Withdraw And CursorPosition.Y > 0 Then
XRange = If(box.IsBattleBox, {2, 3}, {0, 5})
ElseIf Me.SelectionMode = SelectionModes.Deposit And CursorPosition.Y > 0 Then
XRange = {6, 6}
ElseIf box.IsBattleBox Then
XRange = If(CursorPosition.Y = 0, {0, 6}, {2, 6})
End If
End If
If CursorPosition.X < XRange(0) Then CursorPosition.X = XRange(1)
If CursorPosition.X > XRange(1) Then CursorPosition.X = XRange(0)
If box.IsBattleBox And Not Me.BoxChooseMode Then
If Me.CursorPosition.Y > 0 And Me.CursorPosition.X > 3 And Me.CursorPosition.X < 6 Then
Me.CursorPosition.X = If(PreCursor.X > Me.CursorPosition.X, 3, 6)
End If
End If
Dim YRange() = {0, 5}
If Not Me.BoxChooseMode Then
If box.IsBattleBox And Me.CursorPosition.X < 6 Then
YRange = {0, 3}
End If
End If
If CursorPosition.Y < YRange(0) Then CursorPosition.Y = YRange(1)
If CursorPosition.Y > YRange(1) Then CursorPosition.Y = YRange(0)
CursorAimPosition = GetAbsoluteCursorPosition(Me.CursorPosition)
Me.CursorSpeed = CInt(Vector2.Distance(CursorMovePosition, CursorAimPosition) * 0.3)
End Sub
Private Sub CloseScreen()
If Me.BoxChooseMode Then
Me.BoxChooseMode = False
Return
End If
If MovingPokemon IsNot Nothing Then
If PickupPlace.X = 6 Then
Core.Player.Pokemons.Add(Me.MovingPokemon)
Else
Dim id = CInt(PickupPlace.X) + CInt((PickupPlace.Y - 1) * 6)
Dim box = GetBox(PickupBox)
Dim index = If(box.IsBattleBox, box.Pokemon.Count, id)
box.Pokemon.Add(index, New PokemonWrapper(Me.MovingPokemon)) ' Me.MovingPokemon))
CurrentBox = PickupBox
End If
Me.MovingPokemon = Nothing
Else
Player.Temp.StorageSystemCursorPosition = Me.CursorPosition
Player.Temp.PCBoxIndex = Me.CurrentBox
Player.Temp.PCBoxChooseMode = Me.BoxChooseMode
Player.Temp.PCSelectionType = Me.SelectionMode
Core.Player.BoxData = GetBoxSaveData(Me.Boxes)
Core.SetScreen(New TransitionScreen(Me, Me.PreScreen, Color.Black, False))
End If
End Sub
Private Shared Function GetBoxSaveData(ByVal boxes As List(Of Box)) As String
Dim BoxesFull = True
Dim newData = New List(Of String)
For Each b In boxes
If b.IsBattleBox Then Continue For
newData.Add($"BOX|{b.index}|{b.Name}|{b.Background}")
Dim hasPokemon = False
For i = 0 To 29
If Not b.Pokemon.ContainsKey(i) Then Continue For
hasPokemon = True
newData.Add($"{b.index},{i},{b.Pokemon(i).PokemonData}")
Next
If Not hasPokemon Then BoxesFull = False
Next
Dim addedBoxes = 0
If BoxesFull And boxes.Count < 30 Then
Dim newBoxes = 5.Clamp(1, 30 - boxes.Count)
addedBoxes = newBoxes
For i = 0 To newBoxes - 1
Dim newBoxID = boxes.Count - 1 + i
newData.Add($"BOX|{newBoxID}|BOX {newBoxID + 1}|{Core.Random.Next(0, 19)}")
Next
End If
Dim battleBox = boxes.Last()
newData.Add($"BOX|{boxes.Count - 1 + addedBoxes}|{battleBox.Name}|{battleBox.Background}")
For i = 0 To 29
If Not battleBox.Pokemon.ContainsKey(i) Then Continue For
newData.Add($"{boxes.Count - 1 + addedBoxes},{i},{battleBox.Pokemon(i).PokemonData}")
Next
Return String.Join(Environment.NewLine, newData)
End Function
Private Function GetRelativeMousePosition() As Vector2
For x = 0 To 5
For y = 0 To 4
Dim boxTile = New Rectangle(50 + x * 100, 200 + y * 84, 64, 64)
If boxTile.Contains(MouseHandler.MousePosition) Then Return New Vector2(x, y + 1)
Next
Next
For y = 0 To 5
Dim partyTile = New Rectangle(Core.windowSize.Width - 260, y * 100 + 50, 128, 80)
If partyTile.Contains(MouseHandler.MousePosition) Then Return New Vector2(6, y)
Next
Dim labelArea = New Rectangle(80, 50, 600, 100)
Dim leftArrowArea = New Rectangle(10, 52, 96, 96)
Dim rightArrowArea = New Rectangle(655, 52, 96, 96)
If labelArea.Contains(MouseHandler.MousePosition) Then Return New Vector2(1, 0)
If leftArrowArea.Contains(MouseHandler.MousePosition) Then Return New Vector2(0, 0)
If rightArrowArea.Contains(MouseHandler.MousePosition) Then Return New Vector2(5, 0)
Return New Vector2(-1)
End Function
Private Function GetAbsoluteCursorPosition(ByVal relPos As Vector2) As Vector2
If relPos.Y = 0 Then
If relPos.X < 0 Or relPos.X > 6 Then Return New Vector2()
Dim leftArrow = New Vector2(60, 20)
Dim rightArrow = New Vector2(705, 20)
Dim label = New Vector2(380, 30)
Dim party = New Vector2(Core.windowSize.Width - 200, 20)
Dim positions = {leftArrow, label, label, label, label, rightArrow, party}
Return positions(CInt(relPos.X))
End If
If relPos.Y > 0 And relPos.Y < 6 Then
Dim boxTile = New Vector2(50 + relPos.X * 100 + 42, 200 + (relPos.Y - 1) * 84 - 42)
Dim partyTile = New Vector2(Core.windowSize.Width - 200, 20 + 100 * relPos.Y)
If relPos.X >= 0 And relPos.X < 6 Then Return boxTile
If relPos.X = 6 Then Return partyTile
End If
Return New Vector2()
End Function
Private Function GetBattleBoxID() As Integer
If CursorPosition.Y < 1 Or CursorPosition.Y > 3 Then Return -1
If CursorPosition.X = 2 Then Return CInt(CursorPosition.Y * 2 - 2)
If CursorPosition.X = 3 Then Return CInt(CursorPosition.Y * 2 - 1)
Return -1
End Function
Private Sub SelectPokemon()
If SelectionMode = SelectionModes.EasyMove Then
PickupPokemon()
Return
End If
If SelectionMode <> SelectionModes.SingleMove And SelectionMode <> SelectionModes.Withdraw And SelectionMode <> SelectionModes.Deposit Then
Return
End If
If Me.MovingPokemon IsNot Nothing Then
PickupPokemon()
Return
End If
Dim box = GetBox(CurrentBox)
Dim id = If(box.IsBattleBox, GetBattleBoxID(), CInt(CursorPosition.X) + CInt((CursorPosition.Y - 1) * 6))
If box.Pokemon.ContainsKey(id) And CursorPosition.X < 6 Or CursorPosition.X = 6 And Core.Player.Pokemons.Count - 1 >= CInt(CursorPosition.Y) Then
Dim p = If(CursorPosition.X = 6, Core.Player.Pokemons(CInt(CursorPosition.Y)), box.Pokemon(id).pokemon)
Dim entries = New List(Of MenuEntry)
If Me.SelectionMode = SelectionModes.Withdraw Then
entries.Add(New MenuEntry(3, Localization.GetString("storage_screen_menu_pokemon_Withdraw", "Withdraw"), False, AddressOf WithdrawPokemon))
ElseIf Me.SelectionMode = SelectionModes.Deposit Then
entries.Add(New MenuEntry(3, Localization.GetString("storage_screen_menu_pokemon_Deposit", "Deposit"), False, AddressOf DepositPokemon))
Else
entries.Add(New MenuEntry(3, Localization.GetString("storage_screen_menu_pokemon_Move", "Move"), False, AddressOf PickupPokemon))
End If
entries.Add(New MenuEntry(4, Localization.GetString("global_summary", "Summary"), False, AddressOf SummaryPokemon))
Dim itemOffset = If(p.Item IsNot Nothing, 1, 0)
If p.Item IsNot Nothing Then entries.Add(New MenuEntry(5, Localization.GetString("storage_screen_menu_pokemon_TakeItem", "Take Item"), False, Sub() TakeItemPokemon()))
entries.Add(New MenuEntry(5 + itemOffset, Localization.GetString("storage_screen_menu_pokemon_Release", "Release"), False, AddressOf ReleasePokemon))
entries.Add(New MenuEntry(6 + itemOffset, Localization.GetString("global_cancel", "Cancel"), True, Nothing))
SetupMenu(entries.ToArray(), Localization.GetString("storage_screen_menu_pokemon_IsSelected", "//POKEMONNAME// is selected.").Replace("//POKEMONNAME//", p.GetDisplayName()))
End If
End Sub
Private Sub PickupPokemon()
If CursorPosition.X = 6 Then
If Core.Player.Pokemons.Count - 1 >= CursorPosition.Y Then
Dim l = New List(Of Pokemon)(Core.Player.Pokemons.ToArray())
l.RemoveAt(CInt(CursorPosition.Y))
If Me.MovingPokemon IsNot Nothing Then
l.Add(Me.MovingPokemon)
End If
Dim hasPokemon = l.Any(Function(p) Not p.IsEgg() And p.Status <> Pokemon.StatusProblems.Fainted And p.HP > 0)
If Not hasPokemon Then
SetupMenu({New MenuEntry(3, Localization.GetString("global_ok", "OK"), True, Nothing)}, Localization.GetString("storage_screen_pokemon_CannotRemoveLastPokemon", "Can't remove last Pokémon from party."))
Else
If Me.MovingPokemon IsNot Nothing Then
Dim sPokemon = Core.Player.Pokemons(CInt(CursorPosition.Y))
Me.MovingPokemon.FullRestore()
Core.Player.Pokemons.Insert(CInt(CursorPosition.Y), Me.MovingPokemon)
Me.MovingPokemon = sPokemon
Core.Player.Pokemons.RemoveAt(CInt(CursorPosition.Y) + 1)
Else
Me.MovingPokemon = Core.Player.Pokemons(CInt(CursorPosition.Y))
Core.Player.Pokemons.RemoveAt(CInt(CursorPosition.Y))
PickupBox = 0
PickupPlace = New Vector2(6, 0)
End If
End If
ElseIf Me.MovingPokemon IsNot Nothing Then
Me.MovingPokemon.FullRestore()
Core.Player.Pokemons.Add(Me.MovingPokemon)
Me.MovingPokemon = Nothing
End If
Else
Dim box = GetBox(CurrentBox)
Dim id = If(box.IsBattleBox, GetBattleBoxID(), CInt(CursorPosition.X) + CInt((CursorPosition.Y - 1) * 6))
Dim pokemonExists = box.Pokemon.ContainsKey(id)
If pokemonExists Then
If Me.MovingPokemon Is Nothing Then
Me.MovingPokemon = box.Pokemon(id).pokemon
box.Pokemon.Remove(id)
PickupBox = CurrentBox
PickupPlace = CursorPosition
RearrangeBattleBox(box)
Else
Me.MovingPokemon.FullRestore()
Dim sPokemon = box.Pokemon(id).pokemon
box.Pokemon(id) = New PokemonWrapper(Me.MovingPokemon) ' Me.MovingPokemon
Me.MovingPokemon = sPokemon
End If
ElseIf Me.MovingPokemon IsNot Nothing Then
Me.MovingPokemon.FullRestore()
Dim index = If(box.IsBattleBox, box.Pokemon.Count, id)
box.Pokemon.Add(index, New PokemonWrapper(Me.MovingPokemon)) ' Me.MovingPokemon)
Me.MovingPokemon = Nothing
End If
End If
End Sub
Private Sub WithdrawPokemon()
Dim box = GetBox(CurrentBox)
Dim id = If(box.IsBattleBox, GetBattleBoxID(), CInt(CursorPosition.X) + CInt((CursorPosition.Y - 1) * 6))
If Core.Player.Pokemons.Count > 5 Then
SetupMenu({New MenuEntry(3, Localization.GetString("global_ok", "OK"), True, Nothing)}, Localization.GetString("storage_screen_pokemon_PartyIsFull", "Party is full!"))
ElseIf box.Pokemon.ContainsKey(id) Then
Core.Player.Pokemons.Add(box.Pokemon(id).pokemon)
box.Pokemon.Remove(id)
End If
RearrangeBattleBox(box)
End Sub
Private Sub DepositPokemon()
Dim box = GetBox(CurrentBox)
If box.Pokemon.Count > 29 Then Return
If Core.Player.Pokemons.Count - 1 < CInt(Me.CursorPosition.Y) Then Return
Dim l = New List(Of Pokemon)(Core.Player.Pokemons.ToArray())
l.RemoveAt(CInt(CursorPosition.Y))
Dim hasPokemon = l.Any(Function(p) Not p.IsEgg() And p.Status <> Pokemon.StatusProblems.Fainted And p.HP > 0)
If Not hasPokemon Then
SetupMenu({New MenuEntry(3, Localization.GetString("global_ok", "OK"), True, Nothing)}, Localization.GetString("storage_screen_pokemon_CannotRemoveLastPokemon", "Can't remove last Pokémon from party."))
Else
Dim nextIndex = 0
While box.Pokemon.ContainsKey(nextIndex)
nextIndex += 1
End While
Core.Player.Pokemons(CInt(Me.CursorPosition.Y)).FullRestore()
box.Pokemon.Add(nextIndex, New PokemonWrapper(Core.Player.Pokemons(CInt(Me.CursorPosition.Y)))) ' Core.Player.Pokemons(CInt(Me.CursorPosition.Y)))
Core.Player.Pokemons.RemoveAt(CInt(Me.CursorPosition.Y))
End If
End Sub
Private Sub SummaryPokemon()
If CursorPosition.X = 6 Then
Core.SetScreen(New SummaryScreen(Me, Core.Player.Pokemons.ToArray(), CInt(CursorPosition.Y)))
Return
End If
Dim box = GetBox(CurrentBox)
Dim id = If(box.IsBattleBox, GetBattleBoxID(), CInt(CursorPosition.X) + CInt((CursorPosition.Y - 1) * 6))
Dim pokemonList = box.GetPokemonList()
Dim partyIndex = pokemonList.IndexOf(box.Pokemon(id).pokemon)
Core.SetScreen(New SummaryScreen(Me, pokemonList.ToArray(), partyIndex))
End Sub
Private Function TakeItemPokemon(Optional logImmediate As Boolean = True) As String
Dim box = GetBox(CurrentBox)
Dim id = If(box.IsBattleBox, GetBattleBoxID(), CInt(CursorPosition.X) + CInt((CursorPosition.Y - 1) * 6))
Dim pokemon = If(CursorPosition.X = 6, Core.Player.Pokemons(CInt(CursorPosition.Y)), box.Pokemon(id).pokemon)
Dim message = ""
If pokemon.Item Is Nothing Then Return message
If pokemon.Item.IsMail And pokemon.Item.AdditionalData <> "" Then
message = Localization.GetString("storage_screen_pokemon_item_MailWasTaken", "The Mail was taken to your~inbox on your PC.")
Core.Player.Mails.Add(Items.MailItem.GetMailDataFromString(pokemon.Item.AdditionalData))
Else
message = Localization.GetString("storage_screen_pokemon_item_TakenItemFromPokemon", "Taken //ITEM//~from //POKEMONNAME//.").Replace("//ITEM//", pokemon.Item.OneLineName()).Replace("//POKEMONNAME//", pokemon.GetDisplayName())
Dim ItemID = If(pokemon.Item.IsGameModeItem, pokemon.Item.gmID, pokemon.Item.ID.ToString())
Core.Player.Inventory.AddItem(ItemID, 1)
End If
If logImmediate Then Screen.TextBox.Show(message)
pokemon.Item = Nothing
Return message
End Function
Private Sub ReleasePokemon()
Dim hasPokemon = False
If Me.CursorPosition.X <> 6 Then
hasPokemon = True
Else
Dim l = New List(Of Pokemon)(Core.Player.Pokemons.ToArray())
l.RemoveAt(CInt(CursorPosition.Y))
hasPokemon = l.Any(Function(p) Not p.IsEgg() And p.Status <> Pokemon.StatusProblems.Fainted And p.HP > 0)
End If
If hasPokemon Then
Dim box = GetBox(CurrentBox)
Dim id = If(box.IsBattleBox, GetBattleBoxID(), CInt(CursorPosition.X) + CInt((CursorPosition.Y - 1) * 6))
Dim p = If(CursorPosition.X = 6, Core.Player.Pokemons(CInt(CursorPosition.Y)), box.Pokemon(id).pokemon)
If Not p.IsEgg() Then
Dim e1 = New MenuEntry(3, Localization.GetString("global_no", "No"), True, AddressOf SelectPokemon)
Dim e = New MenuEntry(4, Localization.GetString("global_yes", "Yes"), False, AddressOf ConfirmRelease)
Me.SetupMenu({e1, e}, Localization.GetString("storage_screen_pokemon_release_Question", "Release //POKEMONNAME//?").Replace("//POKEMONNAME//", p.GetDisplayName()))
Else
Me.SetupMenu({New MenuEntry(3, Localization.GetString("global_ok", "OK"), True, Nothing)}, Localization.GetString("storage_screen_pokemon_release_CannotReleaseEgg", "Cannot release an Egg."))
End If
Else
Me.SetupMenu({New MenuEntry(3, Localization.GetString("global_ok", "OK"), True, Nothing)}, Localization.GetString("storage_screen_pokemon_release_CannotReleaseLastPokemon", "Cannot release the last Pokémon."))
End If
End Sub
Private Sub ConfirmRelease()
Dim id = CInt(CursorPosition.X) + CInt((CursorPosition.Y - 1) * 6)
Dim box = GetBox(CurrentBox)
Dim pokemon = If(CursorPosition.X = 6, Core.Player.Pokemons(CInt(CursorPosition.Y)), box.Pokemon(id).pokemon)
Dim text = ""
If pokemon.Item IsNot Nothing Then text &= Me.TakeItemPokemon(False)
If text <> "" Then text &= "*"
text &= Localization.GetString("storage_screen_pokemon_release_Goodbye", "Goodbye, //POKEMONNAME//!".Replace("//POKEMONNAME//", pokemon.GetDisplayName()))
Screen.TextBox.Show(text)
If CursorPosition.X = 6 Then
Core.Player.Pokemons.RemoveAt(CInt(CursorPosition.Y))
Else
box.Pokemon.Remove(id)
End If
End Sub
Private Sub RearrangeBattleBox(ByVal b As Box)
If Not b.IsBattleBox Then Return
Dim p = b.GetPokemonList()
b.Pokemon.Clear()
For i = 0 To p.Count - 1
b.Pokemon.Add(i, New PokemonWrapper(p(i))) ' p(i))
Next
End Sub
#End Region
#Region "Draw"
Public Overrides Sub Draw()
' Draw3DModel()
DrawMainWindow()
DrawPokemonStatus()
DrawTopBar()
DrawTeamWindow()
Dim Draw = If(Me.MenuVisible, CType(AddressOf Me.DrawMenuEntries, Action), AddressOf Me.DrawCursor)
Draw()
TextBox.Draw()
End Sub
Private Sub DrawTopBar()
Dim boxIndex = Me.CurrentBox
If BoxChooseMode Then
boxIndex = If(CursorPosition.X < 6 And CursorPosition.Y > 0, CInt(CursorPosition.X + (CursorPosition.Y - 1) * 6), CurrentBox)
End If
Dim b = GetBox(boxIndex)
If b Is Nothing Then Return
Dim texturePath = If(b.IsBattleBox, "GUI\Box\BattleBox", $"GUI\Box\{b.Background}")
Core.SpriteBatch.Draw(TextureManager.GetTexture(texturePath), New Rectangle(80, 50, 600, 100), Color.White)
Dim cArr(0) As Color
TextureManager.GetTexture(texturePath, New Rectangle(0, 0, 1, 1), "").GetData(cArr)
Canvas.DrawScrollBar(New Vector2(80, 36), Me.Boxes.Count, 1, boxIndex, New Size(600, 14), True, Color.TransparentBlack, cArr(0))
Dim font = FontManager.MainFont
Dim textWidth = font.MeasureString(b.Name).X
Dim labelPosition = New Vector2(380 - textWidth, 76)
Dim labelShadowPosition = labelPosition + New Vector2(4)
Core.SpriteBatch.DrawString(font, b.Name, labelShadowPosition, Color.Black, 0.0F, Vector2.Zero, 2, SpriteEffects.None, 0.0F)
Core.SpriteBatch.DrawString(font, b.Name, labelPosition, Color.White, 0.0F, Vector2.Zero, 2, SpriteEffects.None, 0.0F)
Dim textureArea = New Rectangle(0, 16, 16, 16)
Dim leftArrowArea = New Rectangle(10, 52, 96, 96)
Dim rightArrowArea = New Rectangle(655, 52, 96, 96)
Core.SpriteBatch.Draw(Me.menuTexture, leftArrowArea, textureArea, Color.White)
Core.SpriteBatch.Draw(Me.menuTexture, rightArrowArea, textureArea, Color.White, 0.0F, Vector2.Zero, SpriteEffects.FlipHorizontally, 0.0F)
End Sub
Private Sub DrawPokemonIcon(area As Rectangle, pokemon As Pokemon, Optional drawItem As Boolean = False, Optional drawShadow As Boolean = False)
Dim light = If(IsLit(pokemon), Color.White, New Color(65, 65, 65, 255))
Dim texture = pokemon.GetMenuTexture()
If drawShadow Then
Dim shadowArea = New Rectangle(area.Location + New Point(10, 10), area.Size)
Core.SpriteBatch.Draw(texture, shadowArea, New Color(0, 0, 0, 150))
End If
Core.SpriteBatch.Draw(texture, area, light)
If pokemon.IsEgg() Or Not drawItem Or pokemon.Item Is Nothing Then Return
Dim itemArea = New Rectangle(area.Location + New Point(32), New Point(24))
Core.SpriteBatch.Draw(pokemon.Item.Texture, itemArea, Color.White)
End Sub
Private Sub DrawMainWindow()
Dim backgroundColor = New Color(220, 220, 220)
Dim TilePosition = Function(x As Integer, y As Integer) New Point(x, y) * New Point(100, 84) + New Point(50, 200)
If BoxChooseMode Then
Canvas.DrawRectangle(Core.windowSize, backgroundColor)
For x = 0 To 5
For y = 0 To 4
Dim id = y * 6 + x
If Me.Boxes.Count - 1 < id Then Continue For
Dim pBox = Me.GetBox(id)
Dim pCount = If(pBox Is Nothing, 0, pBox.Pokemon.Values.Where(Function(p) IsLit(p.pokemon)).Count())
Dim empty = New Point(64, 32)
Dim notEmpty = New Point(64, 0)
Dim full = New Point(32, 32)
Dim tCoord = notEmpty
If pCount = 0 Then tCoord = empty
If pCount = 30 Then tCoord = full
Dim tileArea = New Rectangle(TilePosition(x, y), New Point(64))
Dim textureArea = New Rectangle(tCoord, New Point(32))
Core.SpriteBatch.Draw(Me.texture, tileArea, textureArea, Color.White)
Next
Next
Return
End If
Dim box = GetBox(CurrentBox)
Dim wrapper As PokemonWrapper = Nothing
Dim cArr(0) As Color
Dim background = If(box.IsBattleBox, "GUI\Box\Battlebox", $"GUI\Box\{box.Background}")
TextureManager.GetTexture(background, New Rectangle(0, 0, 1, 1), "").GetData(cArr, 0, 1)
backgroundColor = New Color(cArr(0).R, cArr(0).G, cArr(0).B, 150)
If box.IsBattleBox Then
Canvas.DrawGradient(Core.windowSize, New Color(203, 40, 41), New Color(238, 128, 128), False, -1)
For i = 0 To 5
Dim x = i + 2
Dim y = 0
While x > 3
x -= 2
y += 1
End While
Dim area = New Rectangle(TilePosition(x, y), New Point(64))
Canvas.DrawRectangle(area, backgroundColor)
If Not box.Pokemon.TryGetValue(i, wrapper) Then Continue For
Me.DrawPokemonIcon(area, wrapper.pokemon, True)
Next
Else
Dim xt = box.Background
Dim yt = 0
While xt > 7
xt -= 8
yt += 1
End While
For x = 0 To Core.windowSize.Width Step 64
For y = 0 To Core.windowSize.Height Step 64
Core.SpriteBatch.Draw(Me.texture, New Rectangle(x, y, 64, 64), New Rectangle(xt * 16, yt * 16 + 64, 16, 16), Color.White)
Next
Next
For x = 0 To 5
For y = 0 To 4
Dim id = y * 6 + x
Dim area = New Rectangle(TilePosition(x, y), New Point(64))
Canvas.DrawRectangle(area, backgroundColor)
If Not box.Pokemon.TryGetValue(id, wrapper) Then Continue For
Me.DrawPokemonIcon(area, wrapper.pokemon, True)
Next
Next
Dim text = Localization.GetString("storage_screen_filter_Hint", "Press <system.button(special)> on the keyboard to filter.")
Dim textPosition = New Vector2(44, 200 + 5 * 84)
Dim shadowPosition = textPosition + New Vector2(2)
Core.SpriteBatch.DrawString(FontManager.MainFont, text, shadowPosition, Color.Black)
Core.SpriteBatch.DrawString(FontManager.MainFont, text, textPosition, Color.White)
End If
End Sub
Dim yOffset As Integer = 0
Private Sub DrawPokemonStatus()
If Me.BoxChooseMode And CursorPosition.X < 6 And CursorPosition.Y > 0 Then
Dim box = GetBox(CInt(CursorPosition.X + (CursorPosition.Y - 1) * 6))
If box Is Nothing Then Return
Dim overviewArea = New Rectangle(660, 200, 200, 200)
Dim detailsArea = New Rectangle(660, 410, 200, 210)
Canvas.DrawRectangle(overviewArea, New Color(84, 198, 216, 150))
Dim minLevel = Integer.MaxValue
Dim maxLevel = Integer.MinValue
For x = 0 To 5
For y = 0 To 4
Dim id = y * 6 + x
Dim wrapper As PokemonWrapper = Nothing
If Not box.Pokemon.TryGetValue(id, wrapper) Then Continue For
Dim position = New Point(x, y) * New Point(32) + New Point(664, 215)
Dim pokemon = wrapper.pokemon
Me.DrawPokemonIcon(New Rectangle(position, New Point(32)), pokemon)
minLevel = Math.Min(minLevel, pokemon.Level)
maxLevel = Math.Max(maxLevel, pokemon.Level)
Next
Next
Canvas.DrawRectangle(detailsArea, New Color(84, 198, 216, 150))
Dim levelString = If(minLevel = Integer.MaxValue Or maxLevel = Integer.MinValue, Localization.GetString("global_none", "None"), $"{minLevel} - {maxLevel}")
Dim maxPokemon = If(box.IsBattleBox, 6, 30)
Dim t = Localization.GetString("storage_screen_pokemon_summary_Box", "Box") & $": {box.Name}{Environment.NewLine}"
t &= Localization.GetString("storage_screen_pokemon_summary_Pokemon", "Pokémon") & $": {box.Pokemon.Count} / {maxPokemon}{Environment.NewLine}"
t &= Localization.GetString("storage_screen_pokemon_summary_Level", "Level") & $": {levelString}"
Dim infoPosition = New Vector2(665, 415)
Dim shadowPosition = infoPosition + New Vector2(2)
Core.SpriteBatch.DrawString(FontManager.MainFont, t, shadowPosition, Color.Black)
Core.SpriteBatch.DrawString(FontManager.MainFont, t, infoPosition, Color.White)
Else
Dim box = GetBox(CurrentBox)
Dim p = Me.MovingPokemon
If p Is Nothing Then
If CursorPosition.X = 6 Then
If Core.Player.Pokemons.Count - 1 >= CursorPosition.Y Then
p = Core.Player.Pokemons(CInt(CursorPosition.Y))
End If
Else
Dim id = If(box.IsBattleBox, GetBattleBoxID(), CInt(Me.CursorPosition.X + (Me.CursorPosition.Y - 1) * 6))
If box.Pokemon.ContainsKey(id) Then
p = box.Pokemon(id).pokemon
End If
End If
End If
If p Is Nothing Then Return
Dim cArr(0) As Color
Dim texturePath = If(box.IsBattleBox, "GUI\Box\BattleBox", $"GUI\Box\{box.Background}")
TextureManager.GetTexture(texturePath, New Rectangle(0, 0, 1, 1), "").GetData(cArr, 0, 1)
Dim overviewArea = New Rectangle(660, 200, 256, 256)
Dim detailsArea = New Rectangle(660, 472, 320, 240)
Dim backgroundColor = If(BoxChooseMode, New Color(84, 198, 216, 150), New Color(cArr(0).R, cArr(0).G, cArr(0).B, 150))
Canvas.DrawRectangle(overviewArea, backgroundColor)
Dim modelName = p.AnimationName
Dim shinyString = If(p.IsShiny, Localization.GetString("storage_screen_pokemon_summary_Shiny", "Shiny"), Localization.GetString("storage_screen_pokemon_summary_Normal", "Normal"))
If Core.Player.ShowModelsInBattle AndAlso ModelManager.ModelExist($"Models\Pokemon\{modelName}\{shinyString}") And Not p.IsEgg() Then
Draw3DModel(p, $"Models\Pokemon\{modelName}\{shinyString}")
Else
GetYOffset(p)
Dim texture = p.GetTexture(True)
Dim size = Vector2.Min(New Vector2(texture.Width, texture.Height) * 3, New Vector2(288, 288)).ToPoint()
Dim position = New Point(792 - CInt(size.X / 2), 192 - yOffset)
Core.SpriteBatch.Draw(texture, New Rectangle(position, size), Color.White)
End If
Canvas.DrawRectangle(detailsArea, backgroundColor)
Dim text = ""
If p.IsEgg() Then
text = Localization.GetString("storage_screen_pokemon_summary_Egg", "Egg")
Else
Dim itemString = If(p.Item Is Nothing, Localization.GetString("global_none", "None"), p.Item.Name)
Dim nameString = If(p.NickName = "", p.GetDisplayName(), $"{p.GetDisplayName()}/{p.GetName}")
text = $"{nameString}{Environment.NewLine}"
text &= Localization.GetString("storage_screen_pokemon_summary_DexNo", "DEX NO.") & $" {p.Number}{Environment.NewLine}"
text &= Localization.GetString("storage_screen_pokemon_summary_Level", "LEVEL") & $" {p.Level}{Environment.NewLine}"
text &= Localization.GetString("storage_screen_pokemon_summary_HP", "HP") & $" {p.HP} / {p.MaxHP}{Environment.NewLine}"
text &= Localization.GetString("storage_screen_pokemon_summary_Attack", "ATTACK") & $" {p.Attack}{Environment.NewLine}"
text &= Localization.GetString("storage_screen_pokemon_summary_Defense", "DEFENSE") & $" {p.Defense}{Environment.NewLine}"
text &= Localization.GetString("storage_screen_pokemon_summary_SpAtk", "SP. ATK") & $" {p.SpAttack}{Environment.NewLine}"
text &= Localization.GetString("storage_screen_pokemon_summary_SpDef", "SP. DEF") & $" {p.SpDefense}{Environment.NewLine}"
text &= Localization.GetString("storage_screen_pokemon_summary_Speed", "SPEED") & $" {p.Speed}{Environment.NewLine}"
text &= Localization.GetString("storage_screen_pokemon_summary_Item", "ITEM") & $" {itemString}"
End If
Dim textPosition = New Vector2(665, 477)
Dim shadowPosition = textPosition + New Vector2(2)
Core.SpriteBatch.DrawString(FontManager.MainFont, text, shadowPosition, Color.Black)
Core.SpriteBatch.DrawString(FontManager.MainFont, text, textPosition, Color.White)
End If
End Sub
Private Sub Draw3DModel(ByVal p As Pokemon, ByVal modelName As String)
Dim propList = p.GetModelProperties()
Dim scale = propList.Item1 * 10
Dim position = New Vector3(propList.Item2, propList.Item3, propList.Item4)
Dim roll = propList.Item5
Dim t = ModelManager.DrawModelToTexture(modelName, renderTarget, position, New Vector3(0, 10, 50), New Vector3(roll + modelRoll, 0, 0), scale, True)
Core.SpriteBatch.Draw(t, New Rectangle(192, 72, 1200, 680), Color.White)
End Sub
Private Sub DrawTeamWindow()
Canvas.DrawRectangle(New Rectangle(Core.windowSize.Width - 310, 0, 400, Core.windowSize.Height), New Color(84, 198, 216))
For y = -64 To Core.windowSize.Height Step 64
Dim scrollArea = New Rectangle(Core.windowSize.Width - 128, y + StorageSystemScreen.TileOffset, 128, 64)
Dim scrollTextureArea = New Rectangle(48, 0, 16, 16)
Core.SpriteBatch.Draw(Me.menuTexture, scrollArea, scrollTextureArea, Color.White)
Next
Dim halfHeight = CInt(Core.windowSize.Height / 2)
Dim cutoutArea = New Rectangle(Core.windowSize.Width - 430, 0, 128, halfHeight)
Dim cutoutTextureArea = New Rectangle(96, 0, 32, 64)
Core.SpriteBatch.Draw(Me.texture, cutoutArea, cutoutTextureArea, Color.White)
cutoutArea.Location += New Point(0, halfHeight)
Core.SpriteBatch.Draw(Me.texture, cutoutArea, cutoutTextureArea, Color.White, 0.0F, Vector2.Zero, SpriteEffects.FlipVertically, 0.0F)
For i = 0 To 5
Dim outlineArea = New Rectangle(Core.windowSize.Width - 260, i * 100 + 50, 128, 80)
Canvas.DrawBorder(2, outlineArea, New Color(42, 167, 198))
If Core.Player.Pokemons.Count - 1 < i Then Continue For
Dim pokemon = Core.Player.Pokemons(i)
Dim spriteArea = New Rectangle(Core.windowSize.Width - 228, i * 100 + 60, 64, 64)
Me.DrawPokemonIcon(spriteArea, pokemon, True)
Next
End Sub
Private Sub DrawCursor()
Dim cPosition = If(CursorMoving, CursorMovePosition, GetAbsoluteCursorPosition(Me.CursorPosition)).ToPoint()
If Me.MovingPokemon IsNot Nothing Then
Dim spriteArea = New Rectangle(cPosition + New Point(-20, 34), New Point(64))
Me.DrawPokemonIcon(spriteArea, Me.MovingPokemon, True, True)
End If
Core.SpriteBatch.Draw(GetCursorTexture(), New Rectangle(cPosition, New Point(64)), Color.White)
End Sub
Private Sub DrawMenuEntries()
If Me.MenuHeader <> "" Then
Dim font = FontManager.MainFont
Canvas.DrawRectangle(New Rectangle(Core.windowSize.Width - 370, 100, 356, 64), New Color(0, 0, 0, 180))
Core.SpriteBatch.DrawString(font, MenuHeader, New Vector2(Core.windowSize.Width - 192 - font.MeasureString(MenuHeader).X / 2, 120), Color.White)
End If
Me.MenuEntries.ForEach(Sub(x) x.Draw(Me.MenuCursor, GetCursorTexture()))
End Sub
Private Function GetCursorTexture() As Texture2D
Dim rectangles = New Dictionary(Of SelectionModes, Rectangle)
rectangles.Add(SelectionModes.SingleMove, New Rectangle(0, 0, 16, 16))
rectangles.Add(SelectionModes.EasyMove, New Rectangle(16, 0, 16, 16))
rectangles.Add(SelectionModes.Deposit, New Rectangle(32, 0, 16, 16))
rectangles.Add(SelectionModes.Withdraw, New Rectangle(0, 32, 16, 16))
Return If(rectangles.ContainsKey(Me.SelectionMode), TextureManager.GetTexture("GUI\Menus\General", rectangles(Me.SelectionMode), ""), Nothing)
End Function
#End Region
Private Function IsLit(ByVal p As Pokemon) As Boolean
If Me.Filters.Count < 1 Then Return True
If p.IsEgg() Then Return False
Dim criteria = New Dictionary(Of FilterTypes, Func(Of Filter, Boolean))
criteria.Add(FilterTypes.Ability, Function(f) p.Ability.Name.ToLower() = f.FilterValue.ToLower())
criteria.Add(FilterTypes.Gender, Function(f) p.Gender.ToString().ToLower() = f.FilterValue.ToLower())
criteria.Add(FilterTypes.Nature, Function(f) p.Nature.ToString().ToLower() = f.FilterValue.ToLower())
criteria.Add(FilterTypes.Pokémon, Function(f) p.GetName().ToLower() = f.FilterValue.ToLower())
criteria.Add(FilterTypes.Move, Function(f) p.Attacks.Any(Function(a) a.Name.ToLower() = f.FilterValue.ToLower()))
criteria.Add(FilterTypes.Type1, Function(f) p.Type1.Type = New Element(f.FilterValue).Type)
criteria.Add(FilterTypes.Type2, Function(f) p.Type2.Type = New Element(f.FilterValue).Type)
For Each f As Filter In Filters
Dim check As Func(Of Filter, Boolean) = Nothing
If criteria.TryGetValue(f.FilterType, check) AndAlso Not criteria(f.FilterType)(f) Then Return False
If f.FilterType = FilterTypes.HeldItem Then
If f.FilterValue = "Has no Held Item" And p.Item IsNot Nothing Then Return False
If f.FilterValue = "Has a Held Item" And p.Item Is Nothing Then Return False
End If
Next
Return True
End Function
''' <summary>
''' Adds a Pokémon to the next free spot and returns the index of that box.
''' </summary>
Public Shared Function DepositPokemon(ByVal p As Pokemon, Optional ByVal BoxIndex As Integer = -1) As Integer
p.FullRestore()
Dim Boxes = LoadBoxes()
Dim startIndex = If(BoxIndex > -1, BoxIndex, 0)
For i = startIndex To Boxes.Count - 1
Dim pokemons = GetBox(i, Boxes).Pokemon
If pokemons.Count > 29 Then Continue For
For l = 0 To 29
If pokemons.ContainsKey(l) Then Continue For
pokemons.Add(l, New PokemonWrapper(p)) ' p)
Exit For
Next
Core.Player.BoxData = GetBoxSaveData(Boxes)
Return i
Next
If startIndex = 0 Then Return -1
For i = 0 To startIndex - 1
Dim pokemons = GetBox(i, Boxes).Pokemon
If pokemons.Count > 29 Then Continue For
For l = 0 To 29
If pokemons.ContainsKey(l) Then Continue For
pokemons.Add(l, New PokemonWrapper(p)) ' p)
Exit For
Next
Core.Player.BoxData = GetBoxSaveData(Boxes)
Return i
Next
Return -1
End Function
Public Shared Function GetBoxName(ByVal boxIndex As Integer) As String
Return GetBox(boxIndex, LoadBoxes()).Name
End Function
Private Shared Function GetBox(ByVal index As Integer, ByVal boxes As List(Of Box)) As Box
Return boxes.FirstOrDefault(Function(x) x.index = index)
End Function
Private Function GetBox(ByVal index As Integer) As Box
Return GetBox(index, Me.Boxes)
End Function
Private Sub SetupMenu(ByVal entries() As MenuEntry, ByVal header As String)
Me.MenuEntries.Clear()
Me.MenuEntries.AddRange(entries)
Me.MenuVisible = True
Me.MenuCursor = MenuEntries(0).Index
Me.MenuHeader = header
End Sub
Public Class PokemonWrapper
Private _pokemon As Pokemon = Nothing
Private _pokemonData As String
Private _loaded As Boolean = False
Public Sub New(ByVal PokemonData As String)
Me._pokemonData = PokemonData
End Sub
Public Sub New(ByVal p As Pokemon)
Me._loaded = True
Me._pokemon = p
Me._pokemonData = p.GetSaveData()
End Sub
Public ReadOnly Property pokemon As Pokemon
Get
If _loaded Then Return Me._pokemon
_loaded = True
_pokemon = Pokemon.GetPokemonByData(Me._pokemonData)
Return Me._pokemon
End Get
End Property
Public ReadOnly Property PokemonData() As String
Get
Return If(_loaded, Me._pokemon.GetSaveData(), Me._pokemonData)
End Get
End Property
End Class
Class Box
Public index As Integer = 0
Public Name As String = "BOX 0"
Public Pokemon As New Dictionary(Of Integer, PokemonWrapper)
Public Background As Integer = 0
Public isSelected As Boolean = False
Private _isBattleBox As Boolean = False
Public Sub New(ByVal index As Integer)
Me.index = index
Me.Name = CStr(Localization.GetString("storage_screen_box_DefaultName", "BOX [NUMBER]")).Replace("[NUMBER]", $"{index + 1}")
Me.Background = index
End Sub
Public ReadOnly Property HasPokemon() As Boolean
Get
Return (Pokemon.Count > 0)
End Get
End Property
Public Function GetPokemonList() As List(Of Pokemon)
Return Pokemon.Values.Select(Function(x) x.pokemon).ToList()
End Function
Public Property IsBattleBox() As Boolean
Get
Return Me._isBattleBox
End Get
Set(value As Boolean)
Me._isBattleBox = value
If Me._isBattleBox Then Me.Name = Localization.GetString("storage_screen_box_BattleBoxName", "BATTLE BOX")
End Set
End Property
End Class
Class MenuEntry
Public Index As Integer = 0
Public Text As String = "Menu"
Public IsBack As Boolean = False
Public Delegate Sub ClickEvent(ByVal m As MenuEntry)
Public ClickHandler As ClickEvent = Nothing
Dim t1 As Texture2D
Dim t2 As Texture2D
Public Sub New(ByVal Index As Integer, ByVal text As String, ByVal isBack As Boolean, ByVal ClickHandler As ClickEvent)
Me.Index = Index
Me.Text = text
Me.IsBack = isBack
Me.ClickHandler = ClickHandler
t1 = TextureManager.GetTexture("GUI\Menus\General", New Rectangle(16, 16, 16, 16), "")
t2 = TextureManager.GetTexture("GUI\Menus\General", New Rectangle(32, 16, 16, 16), "")
End Sub
Public Sub Update(ByVal s As StorageSystemScreen)
Dim hovering = New Rectangle(Core.windowSize.Width - 270, 66 * Index, 256, 64).Contains(MouseHandler.MousePosition)
Dim acceptPointer = Controls.Accept(True, False, False) And hovering
Dim acceptButtons = Controls.Accept(False, True, True)
Dim dismiss = Controls.Dismiss(True, True, True) And Me.IsBack
If (acceptPointer Or acceptButtons) And s.MenuCursor = Me.Index Or dismiss Then
s.MenuVisible = False
ClickHandler?(Me)
End If
If acceptPointer Then
s.MenuCursor = Me.Index
End If
End Sub
Public Sub Draw(ByVal CursorIndex As Integer, ByVal CursorTexture As Texture2D)
Dim startPos = New Point(Core.windowSize.Width - 270, 66 * Index)
Core.SpriteBatch.Draw(t1, New Rectangle(startPos.X, startPos.Y, 64, 64), Color.White)
Core.SpriteBatch.Draw(t2, New Rectangle(startPos.X + 64, startPos.Y, 64, 64), Color.White)
Core.SpriteBatch.Draw(t2, New Rectangle(startPos.X + 128, startPos.Y, 64, 64), Color.White)
Core.SpriteBatch.Draw(t1, New Rectangle(startPos.X + 192, startPos.Y, 64, 64), Nothing, Color.White, 0.0F, Vector2.Zero, SpriteEffects.FlipHorizontally, 0.0F)
Dim font = FontManager.MainFont
Dim textSize = font.MeasureString(Me.Text).X * 0.7F
Dim position = New Vector2(startPos.X + 128 - textSize, startPos.Y + 15)
Core.SpriteBatch.DrawString(font, Me.Text, position, Color.Black, 0.0F, Vector2.Zero, 1.4F, SpriteEffects.None, 0.0F)
If Me.Index <> CursorIndex Then Return
Dim cPosition = startPos + New Point(128, -40)
Core.SpriteBatch.Draw(CursorTexture, New Rectangle(cPosition, New Point(64)), Color.White)
End Sub
End Class
Public Shared Function GetAllBoxPokemon() As List(Of Pokemon)
Dim Pokemons = New List(Of Pokemon)
Dim Data() = Core.Player.BoxData.SplitAtNewline()
For Each line In Data
If Not line.StartsWith("BOX|") Or line = "" Then Continue For
Dim pokeData = line.Remove(0, line.IndexOf("{"))
Pokemons.Add(Pokemon.GetPokemonByData(pokeData))
Next
Return Pokemons
End Function
Public Function GetPokemonList(ByVal includeTeam As Boolean, ByVal lit As Boolean) As List(Of Pokemon)
Dim L = New List(Of Pokemon)
For Each Box In Me.Boxes
If Not Box.HasPokemon Then Continue For
Dim pokemons = Box.Pokemon.Values.Select(Function(x) x.pokemon)
L.AddRange(pokemons.Where(Function(pokemon) (lit AndAlso IsLit(pokemon)) Or Not lit))
Next
If includeTeam Then
L.AddRange(Core.Player.Pokemons.Where(Function(pokemon) (lit AndAlso IsLit(pokemon)) Or Not lit))
End If
Return L
End Function
Public Shared Function GetBattleBoxPokemon() As List(Of Pokemon)
Dim BattleBoxID = 0
Dim Data() = Core.Player.BoxData.SplitAtNewline()
Dim PokemonList = New List(Of Pokemon)
For Each line In Data
If Not line.StartsWith("BOX|") Then Continue For
Dim boxData() = line.Split(CChar("|"))
BattleBoxID = Math.Min(CInt(boxData(1)), BattleBoxID)
Next
For Each line In Data
If Not line.StartsWith(BattleBoxID.ToString() & ",") Or Not line.EndsWith("}") Then Continue For
Dim pokemonData = line.Remove(0, line.IndexOf("{"))
PokemonList.Add(Pokemon.GetPokemonByData(pokemonData))
Next
If PokemonList.Count > 6 Then
PokemonList.RemoveRange(5, PokemonList.Count - 6)
End If
Return PokemonList
End Function
End Class
Public Class StorageSystemFilterScreen
Inherits Screen
Private Class SelectMenu
Dim Items As New List(Of String)
Dim Index As Integer = 0
Public Delegate Sub ClickEvent(ByVal s As SelectMenu)
Dim ClickHandler As ClickEvent = Nothing
Dim BackIndex As Integer = 0
Public Visible As Boolean = True
Public Scroll As Integer = 0
Dim t1 As Texture2D
Dim t2 As Texture2D
Public Sub New(ByVal Items As List(Of String), ByVal Index As Integer, ByVal ClickHandle As ClickEvent, ByVal BackIndex As Integer)
Me.Items = Items
Me.Index = Index
Me.ClickHandler = ClickHandle
Me.BackIndex = BackIndex
If Me.BackIndex < 0 Then
Me.BackIndex = Me.Items.Count + Me.BackIndex
End If
Me.Visible = True
t1 = TextureManager.GetTexture("GUI\Menus\General", New Rectangle(16, 16, 16, 16), "")
t2 = TextureManager.GetTexture("GUI\Menus\General", New Rectangle(32, 16, 16, 16), "")
End Sub
Public Sub Update()
If Not Visible Then Return
If Controls.Up(True, True, True, True, True, True) Then Me.Index -= 1
If Controls.Down(True, True, True, True, True, True) Then Me.Index += 1
Me.Index = Me.Index.Clamp(0, Me.Items.Count - 1)
For i = Scroll To Me.Scroll + 8
If i > Me.Items.Count - 1 Then Continue For
Dim hovering = New Rectangle(Core.windowSize.Width - 270, 66 * (i + 1 - Scroll), 256, 64).Contains(MouseHandler.MousePosition)
Dim acceptPointer = Controls.Accept(True, False, False) And hovering
Dim acceptButtons = Controls.Accept(False, True, True)
Dim dismiss = Controls.Dismiss(True, True, True)
If (acceptPointer Or acceptButtons) And i = Me.Index Or dismiss And Me.BackIndex = Me.Index Then
If ClickHandler IsNot Nothing Then
ClickHandler(Me)
SoundManager.PlaySound("select")
End If
Me.Visible = False
End If
If dismiss Then Me.Index = Me.BackIndex
If acceptPointer Then Me.Index = i
Next
If Index - Scroll > 8 Then Scroll = Index - 8
If Index - Scroll < 0 Then Scroll = Index
End Sub
Public Sub Draw()
If Not Visible Then Return
For i = Scroll To Me.Scroll + 8
If i > Me.Items.Count - 1 Then Continue For
Dim Text = Items(i)
Dim startPos = New Point(Core.windowSize.Width - 270, 66 * ((i + 1) - Scroll))
Core.SpriteBatch.Draw(t1, New Rectangle(startPos.X, startPos.Y, 64, 64), Color.White)
Core.SpriteBatch.Draw(t2, New Rectangle(startPos.X + 64, startPos.Y, 64, 64), Color.White)
Core.SpriteBatch.Draw(t2, New Rectangle(startPos.X + 128, startPos.Y, 64, 64), Color.White)
Core.SpriteBatch.Draw(t1, New Rectangle(startPos.X + 192, startPos.Y, 64, 64), Nothing, Color.White, 0.0F, Vector2.Zero, SpriteEffects.FlipHorizontally, 0.0F)
Dim font = FontManager.MainFont
Dim textSize = font.MeasureString(Text).X * 0.7F
Dim position = New Vector2(startPos.X + 128 - textSize, startPos.Y + 15)
Core.SpriteBatch.DrawString(font, Text, position, Color.Black, 0.0F, Vector2.Zero, 1.4F, SpriteEffects.None, 0.0F)
If Me.Index <> i Then Continue For
Dim cPosition = startPos + New Point(128, -40)
Dim t = TextureManager.GetTexture("GUI\Menus\General", New Rectangle(0, 0, 16, 16), "")
Core.SpriteBatch.Draw(t, New Rectangle(cPosition, New Point(64)), Color.White)
Next
End Sub
Public ReadOnly Property SelectedItem() As String
Get
Return Items(Me.Index)
End Get
End Property
End Class
Private _storageSystemScreen As StorageSystemScreen
Dim texture As Texture2D
Dim Filters As New List(Of StorageSystemScreen.Filter)
Dim Menu As SelectMenu
Dim mainMenuItems As New List(Of String)
Dim Cursor As Integer = 0
Dim Scroll As Integer = 0
Dim Results As Integer = 0
Dim CalculatedFilters As New List(Of StorageSystemScreen.Filter)
Public Sub New(ByVal currentScreen As StorageSystemScreen)
Me.Identification = Identifications.StorageSystemFilterScreen
Me._storageSystemScreen = currentScreen
Me.texture = TextureManager.GetTexture("GUI\Menus\General")
Me.Filters.AddRange(currentScreen.Filters)
Me.MouseVisible = True
Me.CanMuteAudio = True
Me.CanBePaused = True
Me.mainMenuItems = {"Pokémon", "Type1", "Type2", "Move", "Ability", "Nature", "Gender", "HeldItem"}.ToList()
Me.Menu = New SelectMenu({""}.ToList(), 0, Nothing, 0)
Me.Menu.Visible = False
End Sub
Public Overrides Sub Draw()
Canvas.DrawRectangle(Core.windowSize, New Color(84, 198, 216))
For y = -64 To Core.windowSize.Height Step 64
Dim source = New Rectangle(48, 0, 16, 16)
Dim destination = New Rectangle(Core.windowSize.Width - 128, y + StorageSystemScreen.TileOffset, 128, 64)
Core.SpriteBatch.Draw(Me.texture, destination, source, Color.White)
Next
Dim tones = (A:=New Color(42, 167, 198), B:=New Color(42, 167, 198, 0))
Canvas.DrawGradient(New Rectangle(0, 0, Core.windowSize.Width, 200), tones.A, tones.B, False, -1)
Canvas.DrawGradient(New Rectangle(0, Core.windowSize.Height - 200, Core.windowSize.Width, 200), tones.B, tones.A, False, -1)
Core.SpriteBatch.DrawString(FontManager.MainFont, "Configure the filters:", New Vector2(100, 24), Color.White, 0.0F, Vector2.Zero, 2.0F, SpriteEffects.None, 0.0F)
For i = Scroll To Scroll + 5
If i > Me.mainMenuItems.Count - 1 Then Continue For
Dim p = i - Scroll
Core.SpriteBatch.Draw(Me.texture, New Rectangle(100, 100 + p * 96, 64, 64), New Rectangle(16, 16, 16, 16), Color.White)
Core.SpriteBatch.Draw(Me.texture, New Rectangle(100 + 64, 100 + p * 96, 64 * 8, 64), New Rectangle(32, 16, 16, 16), Color.White)
Core.SpriteBatch.Draw(Me.texture, New Rectangle(100 + 64 * 9, 100 + p * 96, 64, 64), New Rectangle(16, 16, 16, 16), Color.White, 0.0F, Vector2.Zero, SpriteEffects.FlipHorizontally, 0.0F)
Dim filterText = GetFilterText(mainMenuItems(i))
Dim s = If(filterText <> "", $"{mainMenuItems(i)} ({filterText})", mainMenuItems(i))
Dim sourceRectangle = If(filterText <> "", New Rectangle(16, 48, 16, 16), New Rectangle(16, 32, 16, 16))
Core.SpriteBatch.Draw(Me.texture, New Rectangle(120, 116 + p * 96, 32, 32), sourceRectangle, Color.White)
Core.SpriteBatch.DrawString(FontManager.MainFont, s, New Vector2(160, 116 + p * 96), Color.Black, 0.0F, Vector2.Zero, 1.25F, SpriteEffects.None, 0.0F)
Next
If Filters.Count > 0 Then
Core.SpriteBatch.DrawString(FontManager.MainFont, $"Results: {Environment.NewLine}{Environment.NewLine}Filters: ", New Vector2(90 + 64 * 11, 119), Color.Black)
Core.SpriteBatch.DrawString(FontManager.MainFont, $"{Me.Results}{Environment.NewLine}{Environment.NewLine}{Me.Filters.Count}", New Vector2(190 + 64 * 11, 119), Color.White)
End If
Dim draw = If(Menu.Visible, CType(AddressOf Menu.Draw, Action), AddressOf DrawCursor)
draw()
End Sub
Private Function GetFilterText(ByVal filterTypeString As String) As String
Dim Equals = Function(f As StorageSystemScreen.Filter?) $"{f.Value.FilterType}".ToLower() = filterTypeString.ToLower()
Dim filter = Me.Filters.Cast(Of StorageSystemScreen.Filter?).FirstOrDefault(Equals)
Return If(filter.HasValue, filter.Value.FilterValue, "")
End Function
Private Sub DrawCursor()
Dim cPosition = New Point(520, 100 + Me.Cursor * 96 - 42)
Dim t As Texture2D = TextureManager.GetTexture("GUI\Menus\General", New Rectangle(0, 0, 16, 16), "")
Core.SpriteBatch.Draw(t, New Rectangle(cPosition, New Point(64)), Color.White)
End Sub
Private Sub ApplyFilters()
Me._storageSystemScreen.Filters.Clear()
Me._storageSystemScreen.Filters.AddRange(Me.Filters)
End Sub
Public Overrides Sub Update()
If Menu.Visible Then
Menu.Update()
Else
Dim direction = 0
If Controls.Down(True, True, True, True, True, True) Then direction = 1
If Controls.Up(True, True, True, True, True, True) Then direction = -1
Me.Cursor += direction
If Controls.ShiftDown() Then Me.Cursor += direction * 4
While Me.Cursor > 5
Me.Cursor -= 1
Me.Scroll += 1
End While
While Me.Cursor < 0
Me.Cursor += 1
Me.Scroll -= 1
End While
Me.Scroll = If(Me.mainMenuItems.Count < 7, 0, Me.Scroll.Clamp(0, Me.mainMenuItems.Count - 6))
Me.Cursor = If(Me.mainMenuItems.Count < 6, Me.Cursor.Clamp(0, Me.mainMenuItems.Count - 1), Me.Cursor.Clamp(0, 5))
If Me.mainMenuItems.Count > 0 Then
If Controls.Accept(True, False, False) Then
For i = Scroll To Scroll + 5
Dim hovering = New Rectangle(100, 100 + (i - Scroll) * 96, 640, 64).Contains(MouseHandler.MousePosition)
If i > Me.mainMenuItems.Count - 1 OrElse Not hovering Then Continue For
If i <> Cursor + Scroll Then
Cursor = i - Scroll
Continue For
End If
SelectFilter()
SoundManager.PlaySound("select")
Next
End If
If Controls.Accept(False, True, True) Then
SelectFilter()
SoundManager.PlaySound("select")
End If
End If
If Controls.Dismiss(True, True, True) Then
ApplyFilters()
Core.SetScreen(Me._storageSystemScreen)
SoundManager.PlaySound("select")
End If
End If
CalculateResults()
StorageSystemScreen.TileOffset = (StorageSystemScreen.TileOffset + 1) Mod 64
End Sub
Private Sub CalculateResults()
Dim s = ""
Dim s1 = ""
Me.CalculatedFilters.ForEach(Sub(f) s &= $"{f.FilterType}|{f.FilterValue}")
Me.Filters.ForEach(Sub(f) s1 &= $"{f.FilterType}|{f.FilterValue}")
If s1 = s Then Return
Me.CalculatedFilters.Clear()
Me.CalculatedFilters.AddRange(Me.Filters)
ApplyFilters()
Me.Results = Me._storageSystemScreen.GetPokemonList(True, True).Count
End Sub
Private Sub SelectFilter()
Dim filterType = Me.mainMenuItems(Me.Scroll + Me.Cursor).ToLower()
Dim menus = New Dictionary(Of String, Action)
menus.Add("pokémon", Sub() Me.OpenMenu(StorageSystemScreen.FilterTypes.Pokémon, True))
menus.Add("type1", Sub() Me.OpenMenu(StorageSystemScreen.FilterTypes.Type1))
menus.Add("type2", Sub() Me.OpenMenu(StorageSystemScreen.FilterTypes.Type2))
menus.Add("move", Sub() Me.OpenMenu(StorageSystemScreen.FilterTypes.Move, True))
menus.Add("ability", Sub() Me.OpenMenu(StorageSystemScreen.FilterTypes.Ability, True))
menus.Add("nature", Sub() Me.OpenMenu(StorageSystemScreen.FilterTypes.Nature))
menus.Add("gender", Sub() Me.OpenMenu(StorageSystemScreen.FilterTypes.Gender))
menus.Add("helditem", Sub() Me.OpenMenu(StorageSystemScreen.FilterTypes.HeldItem))
If menus.ContainsKey(filterType) Then menus(filterType)()
End Sub
#Region "Filtering"
Private Sub OpenMenu(filterType As StorageSystemScreen.FilterTypes, Optional letterFiltering As Boolean = False)
Dim l = Me._storageSystemScreen.GetPokemonList(True, False)
Dim GetNames = New Dictionary(Of StorageSystemScreen.FilterTypes, Func(Of IEnumerable(Of String)))
GetNames.Add(StorageSystemScreen.FilterTypes.Pokémon, Function() l.Select(Function(pokemon) pokemon.GetName()))
GetNames.Add(StorageSystemScreen.FilterTypes.Type1, Function() l.Select(Function(p) $"{p.Type1}"))
GetNames.Add(StorageSystemScreen.FilterTypes.Type2, Function() l.Select(Function(p) $"{p.Type2}"))
GetNames.Add(StorageSystemScreen.FilterTypes.Move, Function() l.SelectMany(Function(p) p.Attacks).Select(Function(a) a.Name))
GetNames.Add(StorageSystemScreen.FilterTypes.Ability, Function() l.Select(Function(p) p.Ability.Name))
GetNames.Add(StorageSystemScreen.FilterTypes.Nature, Function() l.Select(Function(p) $"{p.Nature}"))
GetNames.Add(StorageSystemScreen.FilterTypes.Gender, Function() l.Select(Function(p) $"{p.Gender}"))
GetNames.Add(StorageSystemScreen.FilterTypes.HeldItem, Function() {"Has a Held Item", "Has no Held Item"})
Dim names = GetNames(filterType)().Distinct().ToList()
names.Sort()
Dim letters = If(letterFiltering, names.Select(Function(name) $"{name(0)}".ToUpper()).Distinct.ToList(), Nothing)
Dim items = If(letterFiltering, letters, names)
Dim OnClick = If(letterFiltering, Sub(s As SelectMenu) Me.SelectLetter(s, names, filterType), Sub(s) Me.SelectType(s, filterType))
items.Add("Back")
If GetFilterText($"{filterType}") <> "" Then items.Insert(0, "Clear")
Me.Menu = New SelectMenu(items, 0, OnClick, -1)
End Sub
Private Sub SelectLetter(ByVal s As SelectMenu, names As List(Of String), filterType As StorageSystemScreen.FilterTypes)
If s.SelectedItem = "Back" Then Return
If s.SelectedItem = "Clear" Then
Me.Filters.RemoveAll(Function(filter) filter.FilterType = filterType)
Return
End If
Dim chosenLetter = s.SelectedItem
Dim buttonNames = names.Where(Function(x) x.ToUpper().StartsWith(chosenLetter)).Distinct().ToList()
buttonNames.Sort()
buttonNames.Add("Back")
Me.Menu = New SelectMenu(buttonNames, 0, Sub(x) Me.SelectType(x, filterType, False), -1)
End Sub
Private Sub SelectType(ByVal s As SelectMenu, filterType As StorageSystemScreen.FilterTypes, Optional backIsRoot As Boolean = True)
If s.SelectedItem = "Back" Then
If Not backIsRoot Then Me.OpenMenu(filterType, True)
Return
End If
Me.Filters.RemoveAll(Function(filter) filter.FilterType = filterType)
If s.SelectedItem = "Clear" Then Return
Me.Filters.Add(New StorageSystemScreen.Filter() With {.FilterType = filterType, .FilterValue = s.SelectedItem})
End Sub
#End Region
End Class