P3D-Legacy/P3D/Network/Servers/PVPLobbyScreen.vb

830 lines
36 KiB
VB.net

Public Class PVPLobbyScreen
Inherits Screen
Enum ScreenStates
Idle
Stopped
ChooseTeam
StartBattle
BattleResults
End Enum
Public Shared ScreenState As ScreenStates = ScreenStates.Idle
Shared OppTeam As List(Of Pokemon) = Nothing 'The team the opponent is using.
Dim OwnTeam As List(Of Pokemon) = Nothing 'The team you are using.
Shared PartnerNetworkID As Integer = 0 'The NetworkID of your partner.
Shared WaitingForPlayer As Boolean = False 'If you are the host and waiting for the other player to accept.
Shared SentBattleOffer As Boolean = False 'If you sent a request.
Shared ReceivedBattleOffer As Boolean = False 'If you idle and get a request.
Shared StartBattleRemote As Boolean = False 'If you sent a request and got the accept.
Public Shared DisconnectMessage As String = ""
Shared IsHost As Boolean = True
Dim Cursor As Integer = 0
Dim menuItems As New List(Of String)
Dim texture As Texture2D = Nothing
Private Shared _oppGameVersion As String = ""
Private _startNow As Boolean = False
Public Sub New(ByVal currentScreen As Screen, ByVal connectPlayerID As Integer, ByVal isHost As Boolean)
Me.PreScreen = currentScreen
Me.Identification = Identifications.PVPLobbyScreen
Me.texture = TextureManager.GetTexture("GUI\Menus\General")
MusicManager.Play("lobby", True)
Me.MouseVisible = True
Me.CanBePaused = False
PartnerNetworkID = connectPlayerID
WaitingForPlayer = isHost
SentBattleOffer = False
ReceivedBattleOffer = False
OppTeam = Nothing
StartBattleRemote = False
PVPLobbyScreen.IsHost = isHost
OwnTeam = Nothing
OppTeam = Nothing
StoppedBattle = False
BattleSuccessful = False
BattleResults = Nothing
DisconnectMessage = ""
ScreenState = ScreenStates.Idle
If isHost = False Then
Core.ServersManager.ServerConnection.SendPackage(New Servers.Package(Servers.Package.PackageTypes.BattleJoin, Core.ServersManager.ID, Servers.Package.ProtocolTypes.TCP, PartnerNetworkID.ToString()))
Else
Core.ServersManager.ServerConnection.SendPackage(New Servers.Package(Servers.Package.PackageTypes.BattleRequest, Core.ServersManager.ID, Servers.Package.ProtocolTypes.TCP, PartnerNetworkID.ToString()))
End If
Me.menuItems = {"Start Battle!", "Choose Team", "Quit"}.ToList()
Me.BattleBoxPokemon = StorageSystemScreen.GetBattleBoxPokemon()
Core.StartThreadedSub(AddressOf DownloadOnlineSprite)
End Sub
Private Sub DownloadOnlineSprite()
Dim p As Servers.Player = Core.ServersManager.PlayerCollection.GetPlayer(PartnerNetworkID)
If Not p Is Nothing Then
If p.GameJoltId <> "" Then
GameJolt.Emblem.GetOnlineSprite(p.GameJoltId)
End If
End If
End Sub
Public Overrides Sub Draw()
Canvas.DrawGradient(Core.windowSize, New Color(10, 145, 227), New Color(6, 77, 139), False, -1)
Canvas.DrawGradient(New Rectangle(0, 0, CInt(Core.windowSize.Width), 65), New Color(0, 24, 114), New Color(13, 138, 228), False, -1)
Core.SpriteBatch.DrawString(FontManager.MainFont, "Versus Battle", New Vector2(CSng(Core.windowSize.Width / 2 - FontManager.MainFont.MeasureString("Versus Battle").X / 2), 20), New Color(196, 231, 255))
Canvas.DrawRectangle(New Rectangle(0, 65, Core.windowSize.Width, 1), New Color(0, 24, 114))
Select Case ScreenState
Case ScreenStates.Idle
If WaitingForPlayer = True Then
Dim t As String = "Waiting for other player" & LoadingDots.Dots
Core.SpriteBatch.DrawString(FontManager.MainFont, t, New Vector2(CSng(Core.windowSize.Width / 2 - FontManager.MainFont.MeasureString(t).X / 2), CSng(Core.windowSize.Height / 2 - 10)), Color.White)
Else
Me.DrawIdle()
End If
Case ScreenStates.Stopped
Dim t As String = DisconnectMessage
Core.SpriteBatch.DrawString(FontManager.MainFont, t, New Vector2(CSng(Core.windowSize.Width / 2 - FontManager.MainFont.MeasureString(t).X / 2), CSng(Core.windowSize.Height / 2 - 10)), Color.White)
Case ScreenStates.ChooseTeam
Me.DrawChooseTeam()
Case ScreenStates.BattleResults
Me.DrawBattleResults()
End Select
TextBox.Draw()
End Sub
Public Overrides Sub Update()
If TextBox.Showing Then
TextBox.Update()
Exit Sub
End If
If ScreenState = ScreenStates.Idle Then
If ConnectScreen.Connected = True Then
Dim partnerOnServer As Boolean = False
For Each p As Servers.Player In Core.ServersManager.PlayerCollection
If p.ServersID = PartnerNetworkID Then
partnerOnServer = True
Exit For
End If
Next
If partnerOnServer = False Then
DisconnectMessage = "The other player disconnected." & Environment.NewLine & Environment.NewLine & "Press any key to exit."
ScreenState = ScreenStates.Stopped
End If
Else
DisconnectMessage = "You got disconnected from the server." & Environment.NewLine & Environment.NewLine & "Press any key to exit."
ScreenState = ScreenStates.Stopped
End If
End If
Select Case ScreenState
Case ScreenStates.Idle
Me.UpdateIdle()
Case ScreenStates.Stopped
If KeyBoardHandler.GetPressedKeys().Count > 0 Or ControllerHandler.HasControlerInput() = True Or Controls.Accept() = True Or Controls.Dismiss() = True Then
Core.SetScreen(Me.PreScreen)
End If
Case ScreenStates.ChooseTeam
Me.UpdateChooseTeam()
Case ScreenStates.BattleResults
Me.UpdateBattleResults()
End Select
End Sub
#Region "Idle"
Private Sub DrawIdle()
'Own side:
Canvas.DrawRectangle(New Rectangle(100, 200, 300, 64), New Color(177, 228, 247, 200))
Canvas.DrawGradient(New Rectangle(0, 200, 100, 64), New Color(255, 255, 255, 0), New Color(177, 228, 247, 200), True, -1)
Core.SpriteBatch.DrawString(FontManager.MainFont, Core.Player.Name, New Vector2(140, 215), Color.Black, 0.0F, Vector2.Zero, 1.5F, SpriteEffects.None, 0.0F)
Core.SpriteBatch.Draw(Screen.Level.OwnPlayer.Texture, New Rectangle(60, 200, 64, 64), New Rectangle(0, 64, 32, 32), Color.White)
Canvas.DrawRectangle(New Rectangle(0, 264, 400, 32), New Color(6, 77, 139))
If Not OwnTeam Is Nothing Then
If OwnTeam.Count > 0 Then
For i = 0 To OwnTeam.Count - 1
Dim p As Pokemon = OwnTeam(i)
Dim pokeTexture = p.GetMenuTexture()
Core.SpriteBatch.Draw(pokeTexture, New Rectangle(40 + i * 40 - CInt((pokeTexture.Width - 32) / 2), 264, pokeTexture.Width, 32), Color.White)
Next
End If
End If
'Menu:
If ReceivedBattleOffer = True Then
Canvas.DrawRectangle(New Rectangle(CInt(Core.windowSize.Width / 2 - (64 * 4) / 2), 100, 64 * 4, 64), New Color(255, 255, 255, 150))
Core.SpriteBatch.DrawString(FontManager.MiniFont, "Your opponent wants to" & Environment.NewLine & "battle with this setup.", New Vector2(CInt(Core.windowSize.Width / 2 - (64 * 4) / 2) + 4, 104), Color.Black)
Else
If SentBattleOffer = True Then
Canvas.DrawRectangle(New Rectangle(CInt(Core.windowSize.Width / 2 - (64 * 4) / 2), 100, 64 * 4, 64), New Color(255, 255, 255, 150))
Core.SpriteBatch.DrawString(FontManager.MiniFont, "You want to battle" & Environment.NewLine & "with this setup.", New Vector2(CInt(Core.windowSize.Width / 2 - (64 * 4) / 2) + 4, 104), Color.Black)
End If
End If
For i = 0 To Me.menuItems.Count - 1
Core.SpriteBatch.Draw(Me.texture, New Rectangle(CInt(Core.windowSize.Width / 2 - (64 * 4) / 2), 200 + i * 96, 64, 64), New Rectangle(16, 16, 16, 16), Color.White)
Core.SpriteBatch.Draw(Me.texture, New Rectangle(CInt(Core.windowSize.Width / 2 - (64 * 4) / 2) + 64, 200 + i * 96, 64 * 2, 64), New Rectangle(32, 16, 16, 16), Color.White)
Core.SpriteBatch.Draw(Me.texture, New Rectangle(CInt(Core.windowSize.Width / 2 - (64 * 4) / 2) + 64 * 3, 200 + i * 96, 64, 64), New Rectangle(16, 16, 16, 16), Color.White, 0.0F, Vector2.Zero, SpriteEffects.FlipHorizontally, 0.0F)
Core.SpriteBatch.DrawString(FontManager.MainFont, Me.menuItems(i), New Vector2(CInt(Core.windowSize.Width / 2 - (64 * 4) / 2) + 20, 216 + i * 96), Color.Black, 0.0F, Vector2.Zero, 1.25F, SpriteEffects.None, 0.0F)
Next
DrawCursor()
'Opp side:
Canvas.DrawRectangle(New Rectangle(CInt(Core.windowSize.Width - 300), 200, 300, 64), New Color(177, 228, 247, 200))
Canvas.DrawGradient(New Rectangle(CInt(Core.windowSize.Width - 400), 200, 100, 64), New Color(255, 255, 255, 0), New Color(177, 228, 247, 200), True, -1)
Dim t As Texture2D = Nothing
Dim tempPlayer As Servers.Player = Nothing
For Each p As Servers.Player In Core.ServersManager.PlayerCollection
If p.ServersID = PartnerNetworkID Then
Dim tPath As String = NetworkPlayer.GetTexturePath(p.Skin)
If TextureManager.TextureExist(tPath) = True Then
t = TextureManager.GetTexture(tPath)
Else
t = TextureManager.GetTexture("Textures\NPC\0")
End If
tempPlayer = p
If p.GameJoltId <> "" Then
If GameJolt.Emblem.HasDownloadedSprite(p.GameJoltId) = True Then
Dim newT As Texture2D = GameJolt.Emblem.GetOnlineSprite(p.GameJoltId)
If Not newT Is Nothing Then
t = newT
End If
End If
End If
Exit For
End If
Next
If Not t Is Nothing And Not tempPlayer Is Nothing Then
Core.SpriteBatch.DrawString(FontManager.MainFont, tempPlayer.Name, New Vector2(Core.windowSize.Width - 260, 215), Color.Black, 0.0F, Vector2.Zero, 1.5F, SpriteEffects.None, 0.0F)
Core.SpriteBatch.Draw(t, New Rectangle(CInt(Core.windowSize.Width - 340), 200, 64, 64), New Rectangle(0, 64, 32, 32), Color.White)
End If
Canvas.DrawRectangle(New Rectangle(CInt(Core.windowSize.Width - 400), 264, 400, 32), New Color(6, 77, 139))
If Not OppTeam Is Nothing Then
If OppTeam.Count > 0 Then
For i = 0 To OppTeam.Count - 1
Dim p As Pokemon = OppTeam(i)
Dim pokeTexture = p.GetMenuTexture()
Core.SpriteBatch.Draw(pokeTexture, New Rectangle(CInt(Core.windowSize.Width - 360) + i * 40 - CInt((pokeTexture.Width - 32) / 2), 264, pokeTexture.Width, 32), Color.White)
Next
End If
End If
End Sub
Private Sub DrawCursor()
Dim cPosition As Vector2 = New Vector2(CInt(Core.windowSize.Width / 2 - (64 * 4) / 2) + 160, 200 + 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(CInt(cPosition.X), CInt(cPosition.Y), 64, 64), Color.White)
End Sub
Private Sub UpdateIdle()
If WaitingForPlayer = False Then
If StartBattleRemote = True Then
StartBattleRemote = False
InitializeBattle()
ElseIf _startNow Then
_startNow = False
InitializeBattle()
Else
If Controls.Up(True, True, True, True, True, True) = True Then
Me.Cursor -= 1
If Controls.ShiftDown() = True Then
Me.Cursor -= 4
End If
End If
If Controls.Down(True, True, True, True, True, True) = True Then
Me.Cursor += 1
If Controls.ShiftDown() = True Then
Me.Cursor += 4
End If
End If
Me.Cursor = Me.Cursor.Clamp(0, Me.menuItems.Count - 1)
If Controls.Accept(True, False, False) = True Then
For i = 0 To Me.menuItems.Count - 1
If New Rectangle(CInt(Core.windowSize.Width / 2 - (64 * 4) / 2), 200 + i * 96, 64 * 4, 64).Contains(MouseHandler.MousePosition) = True Then
If i = Cursor Then
Me.SelectMenuEntry()
Else
Cursor = i
End If
End If
Next
End If
If Controls.Accept(False, True, True) = True Then
Me.SelectMenuEntry()
End If
End If
Else
If Controls.Dismiss() = True Then
QuitBattle()
End If
End If
End Sub
Private Sub SelectMenuEntry()
Select Case Me.Cursor
Case 0
Me.StartBattle()
Case 1
ScreenState = ScreenStates.ChooseTeam
Case 2
Me.QuitBattle()
End Select
End Sub
Private Sub StartBattle()
If Not Me.OwnTeam Is Nothing And Not OppTeam Is Nothing Then
Dim selScreen = New PartyScreen(Core.CurrentScreen, Item.GetItemByID(5), AddressOf LeadPickedStart, "Choose your Lead", True, True, False, _pokemonList:=OwnTeam) With {.Mode = Screens.UI.ISelectionScreen.ScreenMode.Selection, .CanExit = True}
AddHandler selScreen.SelectedObject, AddressOf LeadPickedStartHandler
Core.SetScreen(selScreen)
End If
End Sub
Public Sub LeadPickedStartHandler(ByVal params As Object())
LeadPickedStart(CInt(params(0)))
End Sub
Private Sub LeadPickedStart(ByVal index As Integer)
BattleSystem.BattleScreen.OwnLeadIndex = index
Core.ServersManager.ServerConnection.SendPackage(New Servers.Package(Servers.Package.PackageTypes.BattleOffer,
Core.ServersManager.ID, Servers.Package.ProtocolTypes.TCP, {PartnerNetworkID.ToString(), CStr(index) & "," & GameController.RELEASEVERSION}.ToList()))
If ReceivedBattleOffer = True Then
If GameController.RELEASEVERSION = _oppGameVersion Then
_startNow = True
Else
TextBox.Show("Game versions don't match.")
End If
Else
SentBattleOffer = True
End If
End Sub
Private Sub QuitBattle()
Core.ServersManager.ServerConnection.SendPackage(New Servers.Package(Servers.Package.PackageTypes.BattleQuit, Core.ServersManager.ID, Servers.Package.ProtocolTypes.TCP, PartnerNetworkID.ToString()))
Core.SetScreen(Me.PreScreen)
End Sub
#End Region
#Region "ChooseTeam"
Dim BattleBoxPokemon As New List(Of Pokemon)
Dim ChooseTeamCursor As Integer = 0
Private Sub DrawChooseTeam()
Dim t As String = "Choose your team:"
Core.SpriteBatch.DrawString(FontManager.MainFont, t, New Vector2(CSng(Core.windowSize.Width / 2 - FontManager.MainFont.MeasureString(t).X / 2), 100), Color.White)
Dim startPos As New Vector2(CSng(Core.windowSize.Width / 2) - 400, 300)
Canvas.DrawGradient(New Rectangle(CInt(Core.windowSize.Width / 2) - 410, 230, 290, 360), New Color(203, 40, 41), New Color(238, 128, 128), False, -1)
For i = 0 To 5
Dim x As Integer = i
Dim y As Integer = 0
While x > 1
x -= 2
y += 1
End While
Canvas.DrawBorder(2, New Rectangle(CInt(startPos.X) + x * 140, y * 100 + CInt(startPos.Y), 128, 80), New Color(230, 230, 230))
If BattleBoxPokemon.Count - 1 >= i Then
Dim pokeTexture = BattleBoxPokemon(i).GetMenuTexture()
Core.SpriteBatch.Draw(pokeTexture, New Rectangle(CInt(startPos.X) + x * 140 + 32 - CInt(pokeTexture.Width - 32), y * 100 + CInt(startPos.Y) + 10, pokeTexture.Width * 2, 64), Color.White)
End If
Core.SpriteBatch.DrawString(FontManager.MainFont, "Battle Box", New Vector2(CInt(startPos.X) + 80, CInt(startPos.Y) - 45), Color.White)
Next
startPos = New Vector2(CSng(Core.windowSize.Width / 2) + 130, 300)
Canvas.DrawGradient(New Rectangle(CInt(Core.windowSize.Width / 2) + 120, 230, 290, 360), New Color(84, 198, 216), New Color(42, 167, 198), False, -1)
For i = 0 To 5
Dim x As Integer = i
Dim y As Integer = 0
While x > 1
x -= 2
y += 1
End While
Canvas.DrawBorder(2, New Rectangle(CInt(startPos.X) + x * 140, y * 100 + CInt(startPos.Y), 128, 80), New Color(230, 230, 230))
If Core.Player.Pokemons.Count - 1 >= i Then
Dim pokeTexture = Core.Player.Pokemons(i).GetMenuTexture()
Core.SpriteBatch.Draw(pokeTexture, New Rectangle(CInt(startPos.X) + x * 140 + 32 - CInt(pokeTexture.Width - 32), y * 100 + CInt(startPos.Y) + 10, pokeTexture.Width * 2, 64), Color.White)
End If
Core.SpriteBatch.DrawString(FontManager.MainFont, "Team", New Vector2(CInt(startPos.X) + 106, CInt(startPos.Y) - 45), Color.White)
Next
DrawChooseTeamCursor()
End Sub
Private Sub DrawChooseTeamCursor()
Dim cPosition As Vector2 = New Vector2(CSng(Core.windowSize.Width / 2) - 280, 190)
If ChooseTeamCursor = 1 Then
cPosition = New Vector2(CSng(Core.windowSize.Width / 2) + 250, 190)
End If
Dim t As Texture2D = TextureManager.GetTexture("GUI\Menus\General", New Rectangle(0, 0, 16, 16), "")
Core.SpriteBatch.Draw(t, New Rectangle(CInt(cPosition.X), CInt(cPosition.Y), 64, 64), Color.White)
End Sub
Private Sub UpdateChooseTeam()
If Controls.Left(True, True) = True Then
Me.ChooseTeamCursor = 0
End If
If Controls.Right(True, True) = True Then
Me.ChooseTeamCursor = 1
End If
Dim hasBattleBoxPokemon As Boolean = False
For Each p As Pokemon In Me.BattleBoxPokemon
If p.IsEgg() = False Then
hasBattleBoxPokemon = True
Exit For
End If
Next
If Controls.Accept(True, False, False) = True Then
If New Rectangle(CInt(Core.windowSize.Width / 2) + 120, 230, 290, 360).Contains(MouseHandler.MousePosition) = True Then
If ChooseTeamCursor = 0 Then
ChooseTeamCursor = 1
Else
SelectTeam()
End If
End If
If New Rectangle(CInt(Core.windowSize.Width / 2) - 410, 230, 290, 360).Contains(MouseHandler.MousePosition) = True Then
If ChooseTeamCursor = 1 Then
ChooseTeamCursor = 0
Else
If hasBattleBoxPokemon = True Then
SelectTeam()
End If
End If
End If
End If
If hasBattleBoxPokemon = True Or ChooseTeamCursor = 1 Then
If Controls.Accept(False, True, True) = True Then
SelectTeam()
End If
End If
If Controls.Dismiss(True, True, True) = True Then
ScreenState = ScreenStates.Idle
End If
End Sub
Private Sub SelectTeam()
Me.OwnTeam = New List(Of Pokemon)
If ChooseTeamCursor = 0 Then
Me.OwnTeam.AddRange(BattleBoxPokemon.ToArray())
Else
Me.OwnTeam.AddRange(Core.Player.Pokemons.ToArray())
End If
For i = 0 To Me.OwnTeam.Count - 1
If i <= Me.OwnTeam.Count - 1 Then
If Me.OwnTeam(i).IsEgg() = True Then
Me.OwnTeam.RemoveAt(i)
i -= 1
End If
End If
Next
SentBattleOffer = False
ReceivedBattleOffer = False
Dim sendPokemonData As String = ""
For Each p As Pokemon In Me.OwnTeam
If p.IsEgg() = False Then
If sendPokemonData <> "" Then
sendPokemonData &= "|"
End If
sendPokemonData &= p.GetSaveData()
End If
Next
Core.ServersManager.ServerConnection.SendPackage(New Servers.Package(Servers.Package.PackageTypes.BattleOffer, Core.ServersManager.ID, Servers.Package.ProtocolTypes.TCP, {PartnerNetworkID.ToString(), sendPokemonData}.ToList()))
ScreenState = ScreenStates.Idle
End Sub
#End Region
#Region "InputFunctions"
Public Shared Sub OtherPlayerJoins()
If IsLobbyScreen() = True Then
WaitingForPlayer = False
End If
End Sub
Public Shared Sub OtherPlayerQuits()
If IsLobbyScreen() = True Then
ScreenState = ScreenStates.Stopped
DisconnectMessage = "The other player quit the battle." & Environment.NewLine & Environment.NewLine & "Press any key to exit."
End If
End Sub
Public Shared Sub ReceiveOppTeam(ByVal data As String)
If IsLobbyScreen() = True Then
If data = "none" Then
OppTeam = Nothing
Else
OppTeam = New List(Of Pokemon)
Dim tempData As String = ""
Dim cData As String = data
While cData.Length > 0
If cData(0).ToString() = "|" AndAlso tempData(tempData.Length - 1).ToString() = "}" Then
OppTeam.Add(Pokemon.GetPokemonByData(tempData))
tempData = ""
Else
tempData &= cData(0).ToString()
End If
cData = cData.Remove(0, 1)
End While
If tempData.StartsWith("{") = True And tempData.EndsWith("}") = True Then
OppTeam.Add(Pokemon.GetPokemonByData(tempData))
tempData = ""
End If
End If
SentBattleOffer = False
ReceivedBattleOffer = False
End If
End Sub
Public Shared Sub ReceiveBattleStart(ByVal data As String)
Dim cData As String() = data.Split(",")
BattleSystem.BattleScreen.OppLeadIndex = CInt(cData(0))
_oppGameVersion = cData(1)
If IsLobbyScreen() = True Then
If SentBattleOffer = True Then
StartBattleRemote = True
Else
ReceivedBattleOffer = True
End If
End If
End Sub
Private Shared Function IsLobbyScreen() As Boolean
Dim s As Screen = Core.CurrentScreen
While s.Identification <> Identifications.PVPLobbyScreen And Not s.PreScreen Is Nothing
s = s.PreScreen
End While
Return (s.Identification = Identifications.PVPLobbyScreen)
End Function
#End Region
#Region "StartBattle"
Dim TempOriginalTeam As New List(Of Pokemon)
Public Shared StoppedBattle As Boolean = False 'This is true if changed to the screen from a battle.
Private Sub InitializeBattle()
Me.CanChat = False
Me.CanBePaused = False
ScreenState = ScreenStates.StartBattle
Dim tPath As String = "Textures\NPC\0"
Dim tempPlayer As Servers.Player = Nothing
For Each p As Servers.Player In Core.ServersManager.PlayerCollection
If p.ServersID = PartnerNetworkID Then
tPath = NetworkPlayer.GetTexturePath(p.Skin)
If TextureManager.TextureExist(tPath) = False Then
tPath = "Textures\NPC\0"
End If
tempPlayer = p
Exit For
End If
Next
tPath = tPath.Remove(0, ("Textures\NPC\").Length)
Dim t As New Trainer()
t.Pokemons = OppTeam
t.TrainerType = "Pokémon Trainer"
t.DoubleTrainer = False
t.Name = tempPlayer.Name
t.Money = 0
t.SpriteName = tPath
t.Region = "Johto"
t.TrainerFile = ""
t.Items = New List(Of Item)
t.Gender = 0
t.IntroType = 11
t.OutroMessage = ". . ."
t.GameJoltID = tempPlayer.GameJoltId
For Each p As Pokemon In t.Pokemons
p.Level = 50
p.CalculateStats()
p.FullRestore()
Next
TempOriginalTeam.Clear()
For Each p As Pokemon In Core.Player.Pokemons
TempOriginalTeam.Add(Pokemon.GetPokemonByData(p.GetSaveData()))
Next
Core.Player.Pokemons.Clear()
For Each p As Pokemon In Me.OwnTeam
If p.IsEgg() = False Then
p.Level = 50
p.CalculateStats()
p.FullRestore()
Core.Player.Pokemons.Add(p)
End If
Next
Dim b As New BattleSystem.BattleScreen(t, Core.CurrentScreen, 0)
b.IsPVPBattle = True
b.IsHost = IsHost
b.IsRemoteBattle = True
b.PartnerNetworkID = PartnerNetworkID
If tempPlayer.GameJoltId <> "" Then
b.PVPGameJoltID = tempPlayer.GameJoltId
End If
Core.SetScreen(New BattleIntroScreen(Core.CurrentScreen, b, t, t.GetIniMusicName(), t.IntroType))
PlayerStatistics.Track("PVP battles", 1)
End Sub
#End Region
Public Overrides Sub ChangeTo()
If PVPLobbyScreen.StoppedBattle = True Then
If BattleSuccessful = True Then
ScreenState = ScreenStates.BattleResults
End If
MusicManager.Play("lobby", False)
Core.Player.Pokemons.Clear()
Core.Player.Pokemons.AddRange(TempOriginalTeam.ToArray())
End If
End Sub
#Region "BattleResults"
Shared BattleResults As BattleResult = Nothing
Public Shared BattleSuccessful As Boolean = False
Class BattleResult
Public Won As Boolean = False
Public OwnPokemon As New List(Of Pokemon)
Public OppPokemon As New List(Of Pokemon)
Public OwnStatistics As BattleSystem.BattleScreen.NetworkPlayerStatistics
Public OppStatistics As BattleSystem.BattleScreen.NetworkPlayerStatistics
Public Sub New(ByVal won As Boolean, ByVal own As List(Of Pokemon), ByVal opp As List(Of Pokemon), ByVal ownStatistics As BattleSystem.BattleScreen.NetworkPlayerStatistics, ByVal oppStatistics As BattleSystem.BattleScreen.NetworkPlayerStatistics)
Me.Won = won
For Each p As Pokemon In own
Me.OwnPokemon.Add(Pokemon.GetPokemonByData(p.GetSaveData()))
Next
Me.OppPokemon = opp
Me.OwnStatistics = ownStatistics
Me.OppStatistics = oppStatistics
If won = False Then
For Each p As Pokemon In Me.OwnPokemon
p.HP = 0
p.Status = Pokemon.StatusProblems.Fainted
Next
Else
For Each p As Pokemon In Me.OppPokemon
p.HP = 0
p.Status = Pokemon.StatusProblems.Fainted
Next
End If
End Sub
End Class
Public Shared Sub SetupBattleResults(ByVal BattleScreen As BattleSystem.BattleScreen)
BattleSuccessful = True
BattleResults = New BattleResult(BattleSystem.Battle.Won, Core.Player.Pokemons, BattleScreen.Trainer.Pokemons, BattleScreen.OwnStatistics, BattleScreen.OppStatistics)
If BattleResults.Won = True Then
PlayerStatistics.Track("PVP Wins", 1)
Else
PlayerStatistics.Track("PVP Losses", 1)
End If
End Sub
Private Sub DrawBattleResults()
If Not BattleResults Is Nothing Then
'Draw Result:
Dim resultText As String = "You Won the Battle!"
Dim resultStateText As String = "Won"
Dim resultColor As Color = Color.Orange
If BattleResults.Won = False Then
resultText = "You Lost the Battle!"
resultStateText = "Lost"
resultColor = Color.LightBlue
End If
Core.SpriteBatch.DrawString(FontManager.MainFont, resultText, New Vector2(Core.windowSize.Width / 2.0F - FontManager.MainFont.MeasureString(resultText).X / 2.0F, 120), Color.White)
Core.SpriteBatch.DrawString(FontManager.MainFont, resultStateText, New Vector2(Core.windowSize.Width / 2.0F - FontManager.MainFont.MeasureString(resultText).X / 2.0F + FontManager.MainFont.MeasureString("You ").X, 120), resultColor)
'Own side:
Canvas.DrawRectangle(New Rectangle(100, 200, 300, 64), New Color(177, 228, 247, 200))
Canvas.DrawGradient(New Rectangle(0, 200, 100, 64), New Color(255, 255, 255, 0), New Color(177, 228, 247, 200), True, -1)
Core.SpriteBatch.DrawString(FontManager.MainFont, Core.Player.Name, New Vector2(140, 215), Color.Black, 0.0F, Vector2.Zero, 1.5F, SpriteEffects.None, 0.0F)
Core.SpriteBatch.Draw(Screen.Level.OwnPlayer.Texture, New Rectangle(60, 200, 64, 64), New Rectangle(0, 64, 32, 32), Color.White)
Canvas.DrawRectangle(New Rectangle(0, 264, 400, 32), New Color(6, 77, 139))
For i = 0 To BattleResults.OwnPokemon.Count - 1
Dim p As Pokemon = BattleResults.OwnPokemon(i)
Dim c As Color = Color.White
If p.Status = Pokemon.StatusProblems.Fainted Or p.HP <= 0 Then
c = New Color(65, 65, 65, 255)
End If
Dim pokeTexture = p.GetMenuTexture()
Core.SpriteBatch.Draw(pokeTexture, New Rectangle(40 + i * 40 - CInt((pokeTexture.Width - 32) / 2), 264, pokeTexture.Width, 32), c)
Next
'Draw Own Statistics:
With BattleResults.OwnStatistics
Dim s1 As String = "Turns:" & Environment.NewLine &
" Moves:" & Environment.NewLine &
" Switches:" & Environment.NewLine & Environment.NewLine &
"Super Effective:" & Environment.NewLine &
"Not very Effective:" & Environment.NewLine &
"No Effect:" & Environment.NewLine & Environment.NewLine &
"Critical Hits:"
Dim s2 As String = .Turns & Environment.NewLine &
.Moves & Environment.NewLine &
.Switches & Environment.NewLine & Environment.NewLine &
.SuperEffective & Environment.NewLine &
.NotVeryEffective & Environment.NewLine &
.NoEffect & Environment.NewLine & Environment.NewLine &
.Critical
Core.SpriteBatch.DrawString(FontManager.MiniFont, s1, New Vector2(40, 340), Color.White, 0.0F, Vector2.Zero, 1.1F, SpriteEffects.None, 0.0F)
Core.SpriteBatch.DrawString(FontManager.MiniFont, s2, New Vector2(250, 340), Color.LightBlue, 0.0F, Vector2.Zero, 1.1F, SpriteEffects.None, 0.0F)
End With
'Draw Pokémon left:
Dim countOwnPokemon As Integer = 0
For Each p As Pokemon In BattleResults.OwnPokemon
If p.IsEgg() = False And p.HP > 0 And p.Status <> Pokemon.StatusProblems.Fainted Then
countOwnPokemon += 1
End If
Next
Dim countOppPokemon As Integer = 0
For Each p As Pokemon In BattleResults.OppPokemon
If p.IsEgg() = False And p.HP > 0 And p.Status <> Pokemon.StatusProblems.Fainted Then
countOppPokemon += 1
End If
Next
Dim pokeLeft As String = countOwnPokemon.ToString & " VS " & countOppPokemon.ToString()
Core.SpriteBatch.DrawString(FontManager.MainFont, pokeLeft, New Vector2(Core.windowSize.Width / 2.0F - FontManager.MainFont.MeasureString(pokeLeft).X * 2.0F, 240), Color.White, 0.0F, Vector2.Zero, 4.0F, SpriteEffects.None, 0.0F)
'Opp Side:
Canvas.DrawRectangle(New Rectangle(CInt(Core.windowSize.Width - 300), 200, 300, 64), New Color(177, 228, 247, 200))
Canvas.DrawGradient(New Rectangle(CInt(Core.windowSize.Width - 400), 200, 100, 64), New Color(255, 255, 255, 0), New Color(177, 228, 247, 200), True, -1)
Dim t As Texture2D = Nothing
Dim tempPlayer As Servers.Player = Nothing
For Each p As Servers.Player In Core.ServersManager.PlayerCollection
If p.ServersID = PartnerNetworkID Then
Dim tPath As String = NetworkPlayer.GetTexturePath(p.Skin)
If TextureManager.TextureExist(tPath) = True Then
t = TextureManager.GetTexture(tPath)
Else
t = TextureManager.GetTexture("Textures\NPC\0")
End If
tempPlayer = p
Exit For
End If
Next
If Not t Is Nothing And Not tempPlayer Is Nothing Then
Core.SpriteBatch.DrawString(FontManager.MainFont, tempPlayer.Name, New Vector2(Core.windowSize.Width - 260, 215), Color.Black, 0.0F, Vector2.Zero, 1.5F, SpriteEffects.None, 0.0F)
Core.SpriteBatch.Draw(t, New Rectangle(CInt(Core.windowSize.Width - 340), 200, 64, 64), New Rectangle(0, 64, 32, 32), Color.White)
End If
Canvas.DrawRectangle(New Rectangle(CInt(Core.windowSize.Width - 400), 264, 400, 32), New Color(6, 77, 139))
For i = 0 To BattleResults.OppPokemon.Count - 1
Dim p As Pokemon = BattleResults.OppPokemon(i)
Dim c As Color = Color.White
If p.Status = Pokemon.StatusProblems.Fainted Or p.HP <= 0 Then
c = New Color(65, 65, 65, 255)
End If
Dim pokeTexture = p.GetMenuTexture()
Core.SpriteBatch.Draw(pokeTexture, New Rectangle(CInt(Core.windowSize.Width - 360) + i * 40 - CInt((pokeTexture.Width - 32) / 2), 264, pokeTexture.Width, 32), c)
Next
'Draw Opp Statistics:
With BattleResults.OppStatistics
Dim s1 As String = "Turns:" & Environment.NewLine &
" Moves:" & Environment.NewLine &
" Switches:" & Environment.NewLine & Environment.NewLine &
"Super Effective:" & Environment.NewLine &
"Not very Effective:" & Environment.NewLine &
"No Effect:" & Environment.NewLine & Environment.NewLine &
"Critical Hits:"
Dim s2 As String = .Turns & Environment.NewLine &
.Moves & Environment.NewLine &
.Switches & Environment.NewLine & Environment.NewLine &
.SuperEffective & Environment.NewLine &
.NotVeryEffective & Environment.NewLine &
.NoEffect & Environment.NewLine & Environment.NewLine &
.Critical
Core.SpriteBatch.DrawString(FontManager.MiniFont, s1, New Vector2(Core.windowSize.Width - 360, 340), Color.White, 0.0F, Vector2.Zero, 1.1F, SpriteEffects.None, 0.0F)
Core.SpriteBatch.DrawString(FontManager.MiniFont, s2, New Vector2(Core.windowSize.Width - 150, 340), Color.LightBlue, 0.0F, Vector2.Zero, 1.1F, SpriteEffects.None, 0.0F)
End With
End If
End Sub
Private Sub UpdateBattleResults()
If Controls.Accept() = True Then
ScreenState = ScreenStates.Stopped
End If
End Sub
#End Region
End Class