P3D-Legacy/P3D/Screens/Pokemon/EvolutionScreen.vb

571 lines
23 KiB
VB.net

Public Class EvolutionScreen
Inherits Screen
' Old Evolution System:
'Private FromBattle As Boolean = False
'Private EvolutionArgument As String = ""
'Private EvolutionTrigger As EvolutionCondition.EvolutionTrigger
'Private PokemonList As New List(Of Integer)
'Dim currentPokemon As Pokemon
'Dim evolvedPokemon As Pokemon
'Dim PokemonModel As ModelEntity
'Dim C As Camera
'Public Sub New(ByVal currentScreen As Screen, ByVal EvolvePokemonIndices As List(Of Integer), ByVal EvolutionArgument As String, ByVal EvolutionTrigger As EvolutionCondition.EvolutionTrigger, Optional ByVal FromBattle As Boolean = False)
' Me.Identification = Identifications.EvolutionScreen
' Me.PreScreen = currentScreen
' Me.CanBePaused = True
' Me.CanChat = True
' Me.CanMuteAudio = True
' Me.MouseVisible = False
' Me.FromBattle = FromBattle
' Me.EvolutionArgument = EvolutionArgument
' Me.EvolutionTrigger = EvolutionTrigger
' Me.PokemonList = EvolvePokemonIndices
' Me.currentPokemon = Basic.Player.Pokemons(Me.PokemonList(0))
' Me.evolvedPokemon = EvolvePokemon(currentPokemon, EvolutionArgument, EvolutionTrigger)
' Dim shiny As String = "Normal"
' If currentPokemon.IsShiny = True Then
' shiny = "Shiny"
' End If
' Me.PokemonModel = CType(Entity.GetNewEntity("ModelEntity", New Vector3(0), {}, {}, False, New Vector3(MathHelper.Pi * 0.5F, 0, 0), New Vector3(0.1F), BaseModel.BlockModel, 0, "Models\" & Me.currentPokemon.AnimationName & "\" & shiny, True, New Vector3(1), 0, "", "", New Vector3(0), Nothing), ModelEntity)
' Me.C = Screen.Camera
' Screen.Camera = New EvolutionCamera()
'End Sub
'Public Overrides Sub Draw()
' Me.PokemonModel.Render()
' TextBox.Draw()
'End Sub
'Dim state As Integer = 0
'Public Overrides Sub Update()
' Camera.Update()
' SkyDome.Update()
' TextBox.Update()
' If TextBox.Showing = False Then
' Select Case state
' Case 0
' state += 1
' TextBox.Show("What?*" & currentPokemon.GetDisplayName() & "~is evolving!", {}, False, False)
' Case 1
' End Select
' End If
'End Sub
'Public Shared Function EvolvePokemon(ByVal currentPokemon As Pokemon, ByVal EvolutionArgument As String, ByVal EvolutionTrigger As EvolutionCondition.EvolutionTrigger) As Pokemon
' Dim HPpercentage As Integer = CInt((currentPokemon.HP / currentPokemon.MaxHP) * 100)
' Dim evolvedPokemon As Pokemon = PokeGetter.GetPokemonByID(currentPokemon.GetEvolutionID(EvolutionTrigger, EvolutionArgument))
' evolvedPokemon.Status = currentPokemon.Status
' evolvedPokemon.EVHP = currentPokemon.EVHP
' evolvedPokemon.EVAttack = currentPokemon.EVAttack
' evolvedPokemon.EVDefense = currentPokemon.EVDefense
' evolvedPokemon.EVSpAttack = currentPokemon.EVSpAttack
' evolvedPokemon.EVSpDefense = currentPokemon.EVSpDefense
' evolvedPokemon.EVSpeed = currentPokemon.EVSpeed
' evolvedPokemon.Friendship = currentPokemon.Friendship
' evolvedPokemon.NickName = currentPokemon.NickName
' evolvedPokemon.IVHP = currentPokemon.IVHP
' evolvedPokemon.IVAttack = currentPokemon.IVAttack
' evolvedPokemon.IVDefense = currentPokemon.IVDefense
' evolvedPokemon.IVSpAttack = currentPokemon.IVSpAttack
' evolvedPokemon.IVSpDefense = currentPokemon.IVSpDefense
' evolvedPokemon.IVSpeed = currentPokemon.IVSpeed
' evolvedPokemon.Wild(currentPokemon.Level, False)
' evolvedPokemon.Attacks = currentPokemon.Attacks
' evolvedPokemon.Gender = currentPokemon.Gender
' evolvedPokemon.Nature = currentPokemon.Nature
' evolvedPokemon.CalculateStats()
' Dim hasOldAbility As Boolean = False
' For Each a As Ability In evolvedPokemon.NewAbilities
' If a.ID = currentPokemon.Ability.ID Then
' hasOldAbility = True
' Exit For
' End If
' Next
' If hasOldAbility = False Then
' evolvedPokemon.Ability = evolvedPokemon.NewAbilities(Basic.Random.Next(0, evolvedPokemon.NewAbilities.Count))
' Else
' evolvedPokemon.Ability = currentPokemon.Ability
' End If
' evolvedPokemon.IsShiny = currentPokemon.IsShiny
' evolvedPokemon.Item = currentPokemon.Item
' evolvedPokemon.CatchBall = currentPokemon.CatchBall
' evolvedPokemon.CatchLocation = currentPokemon.CatchLocation
' evolvedPokemon.CatchMethod = currentPokemon.CatchMethod
' evolvedPokemon.CatchTrainerName = currentPokemon.CatchTrainerName
' evolvedPokemon.OT = currentPokemon.OT
' evolvedPokemon.Experience = currentPokemon.Experience
' evolvedPokemon.HP = CInt(evolvedPokemon.MaxHP * (HPpercentage / 100))
' Return evolvedPokemon
'End Function
Public PokeList As New List(Of Integer)
Dim currentPokemon As Pokemon
Dim evolvedPokemon As Pokemon
Dim evolutionReady As Boolean = False
Dim evolutionStarted As Boolean = False
Dim evolved As Boolean = False
Dim brokeEvolution As Boolean = False
Dim learnAttack As Boolean = False
Dim EvolutionArg As String = ""
Dim EvolutionTrigger As EvolutionCondition.EvolutionTrigger
Dim FromBattle As Boolean = False
Private Sparks As New List(Of Spark)
Public Sub New(ByVal currentScreen As Screen, ByVal EvolvePokemonIndices As List(Of Integer), ByVal EvolutionArg As String, ByVal EvolutionTrigger As EvolutionCondition.EvolutionTrigger, Optional ByVal FromBattle As Boolean = False)
Me.Identification = Identifications.EvolutionScreen
PlayerStatistics.Track("Evolutions", 1)
Me.PreScreen = currentScreen
Me.FromBattle = FromBattle
For Each i As Integer In EvolvePokemonIndices
PokeList.Add(i)
Next
Me.EvolutionArg = EvolutionArg
Me.EvolutionTrigger = EvolutionTrigger
currentPokemon = Core.Player.Pokemons(PokeList(0))
EvolvePokemon()
Me.SavedMusic = MusicManager.CurrentSong.Name
MusicManager.PlayNoMusic()
End Sub
Public Overrides Sub Draw()
Canvas.DrawRectangle(New Rectangle(0, 0, Core.windowSize.Width, Core.windowSize.Height), Color.Black)
Dim T As Texture2D = currentPokemon.GetTexture(True)
Dim Size As Vector2 = New Vector2(CInt(MathHelper.Min(T.Width * 3, 288)), CInt(MathHelper.Min(T.Height * 3, 288)))
If evolved = True Then
Core.SpriteBatch.Draw(TextureManager.GetTexture("GUI\Evolution\Light"), New Rectangle(CInt((Core.windowSize.Width / 2) - Size.X), CInt((Core.windowSize.Height / 2) - Size.Y), CInt(Size.X * 2), CInt(Size.Y * 2)), Color.White)
End If
If evolved = True Then
T = evolvedPokemon.GetTexture(True)
Size = New Vector2(CInt(MathHelper.Min(T.Width * 3, 288)), CInt(MathHelper.Min(T.Height * 3, 288)))
End If
Core.SpriteBatch.Draw(T, New Rectangle(CInt((Core.windowSize.Width / 2) - Size.X / 2), CInt((Core.windowSize.Height / 2) - Size.Y / 2), CInt(Size.X), CInt(Size.Y)), Color.White)
For Each Spark As Spark In Sparks
Spark.Draw()
Next
TextBox.Draw()
End Sub
Public Overrides Sub Update()
TextBox.Update()
If evolutionStarted = False Then
SoundManager.PlayPokemonCry(currentPokemon.Number)
TextBox.Show("What?*" & currentPokemon.GetDisplayName() & " is evolving!", {}, False, False)
evolutionStarted = True
For i = 0 To Core.Random.Next(200, 250)
Sparks.Add(New Spark())
Next
Else
If evolutionReady = False And TextBox.Showing = False Then
MusicManager.Play("evolution", True)
If evolved = False Then
Dim allReady As Boolean = True
For Each Spark As Spark In Sparks
Spark.Update()
If Spark.IsReady = False Then
allReady = False
End If
Next
If allReady = True Then
evolved = True
For Each Spark As Spark In Sparks
Spark.doGrow = True
Next
Else
If Controls.Dismiss(True, True) = True Then
Sparks.Clear()
evolutionReady = True
brokeEvolution = True
TextBox.Show("Huh? " & currentPokemon.GetDisplayName() & "~stopped evolving!", {}, False, False)
End If
End If
Else
Dim allReady As Boolean = True
For Each Spark As Spark In Sparks
Spark.Update()
If Spark.IsReady = False Or Spark.doGrow = True Then
allReady = False
End If
Next
If allReady = True Then
Sparks.Clear()
Dim type As Integer = 2
If evolvedPokemon.IsShiny = True Then
type = 3
End If
Core.Player.PokedexData = Pokedex.ChangeEntry(Core.Player.PokedexData, evolvedPokemon.Number, type)
evolvedPokemon.PlayCry()
SoundManager.PlaySound("success", True)
evolutionReady = True
Dim t As String = "Congratulations!*Your " & currentPokemon.GetDisplayName() & "~evolved into " & evolvedPokemon.GetName() & "!"
If evolvedPokemon.AttackLearns.ContainsKey(evolvedPokemon.Level) = True Then
If evolvedPokemon.KnowsMove(evolvedPokemon.AttackLearns(evolvedPokemon.Level)) = False Then
If evolvedPokemon.Attacks.Count = 4 Then
Me.learnAttack = True
Else
evolvedPokemon.Attacks.Add(evolvedPokemon.AttackLearns(evolvedPokemon.Level))
t &= "*" & evolvedPokemon.GetDisplayName() & " learned~" & evolvedPokemon.AttackLearns(evolvedPokemon.Level).Name & "!"
PlayerStatistics.Track("Moves learned", 1)
End If
End If
End If
If Me.EvolutionTrigger = EvolutionCondition.EvolutionTrigger.Trading Then
Dim econ As EvolutionCondition = EvolutionCondition.GetEvolutionCondition(currentPokemon, Me.EvolutionTrigger, Me.EvolutionArg)
Dim removeItem As Boolean = False
If econ.Trigger = EvolutionCondition.EvolutionTrigger.Trading Then
For i = 0 To econ.Conditions.Count - 1
If econ.Conditions(i).ConditionType = EvolutionCondition.ConditionTypes.HoldItem Then
removeItem = True
End If
Next
End If
If removeItem Then
evolvedPokemon.Item = Nothing
End If
End If
Core.Player.AddPoints(10, "Evolved Pokémon.")
If ConnectScreen.Connected = True Then
Core.ServersManager.ServerConnection.SendGameStateMessage("evolved their " & currentPokemon.GetName() & " into a " & evolvedPokemon.GetName() & "!")
End If
TextBox.Show(t, {}, False, False)
End If
End If
Else
If TextBox.Showing = False Then
If learnAttack = True Then
learnAttack = False
Core.SetScreen(New LearnAttackScreen(Core.CurrentScreen, evolvedPokemon, evolvedPokemon.AttackLearns(evolvedPokemon.Level)))
Else
Endscene()
End If
End If
End If
End If
End Sub
Private Sub Endscene()
If brokeEvolution = False Then
' Nincada's evolution to Shedinja if a Poké Ball is in the player's Bag and free space is available in the player's party:
If Shedinja.CanEvolveInto(Me.evolvedPokemon, Me.EvolutionTrigger) = True Then
Core.Player.Pokemons.Add(Shedinja.GenerateNew(evolvedPokemon))
Core.Player.Inventory.RemoveItem(5, 1)
End If
Core.Player.Pokemons(PokeList(0)) = evolvedPokemon
End If
PokeList.RemoveAt(0)
If PokeList.Count = 0 Then
If FromBattle = False Then
Dim s As Screen = Core.CurrentScreen
While s.PreScreen.Identification = Identifications.EvolutionScreen
s = s.PreScreen
End While
Core.SetScreen(New TransitionScreen(s, s.PreScreen, Color.Black, False))
MusicManager.Play(SavedMusic)
Else
Dim s As Screen = Core.CurrentScreen
While s.Identification <> Identifications.BattleScreen
s = s.PreScreen
End While
ChangeSavedScreen()
Core.SetScreen(New TransitionScreen(Me, CType(s, BattleSystem.BattleScreen).SavedOverworld.OverworldScreen, Color.Black, False))
End If
Else
Core.SetScreen(New TransitionScreen(Me, New EvolutionScreen(Me, PokeList, Me.EvolutionArg, Me.EvolutionTrigger, Me.FromBattle), Color.Black, False))
End If
End Sub
Private Sub EvolvePokemon()
Dim HPpercentage As Integer = CInt((currentPokemon.HP / currentPokemon.MaxHP) * 100)
Dim ID As String = currentPokemon.GetEvolutionID(Me.EvolutionTrigger, Me.EvolutionArg)
If ID.Contains(CChar("_")) Then
evolvedPokemon = Pokemon.GetPokemonByID(CInt(ID.Split(CChar("_"))(0)), ID.Split(CChar("_"))(1))
Else
evolvedPokemon = Pokemon.GetPokemonByID(CInt(ID))
End If
evolvedPokemon.Status = currentPokemon.Status
evolvedPokemon.EVHP = currentPokemon.EVHP
evolvedPokemon.EVAttack = currentPokemon.EVAttack
evolvedPokemon.EVDefense = currentPokemon.EVDefense
evolvedPokemon.EVSpAttack = currentPokemon.EVSpAttack
evolvedPokemon.EVSpDefense = currentPokemon.EVSpDefense
evolvedPokemon.EVSpeed = currentPokemon.EVSpeed
evolvedPokemon.Friendship = currentPokemon.Friendship
evolvedPokemon.NickName = currentPokemon.NickName
evolvedPokemon.IVHP = currentPokemon.IVHP
evolvedPokemon.IVAttack = currentPokemon.IVAttack
evolvedPokemon.IVDefense = currentPokemon.IVDefense
evolvedPokemon.IVSpAttack = currentPokemon.IVSpAttack
evolvedPokemon.IVSpDefense = currentPokemon.IVSpDefense
evolvedPokemon.IVSpeed = currentPokemon.IVSpeed
evolvedPokemon.Generate(currentPokemon.Level, False)
evolvedPokemon.Attacks = currentPokemon.Attacks
evolvedPokemon.Gender = currentPokemon.Gender
evolvedPokemon.Nature = currentPokemon.Nature
evolvedPokemon.ReloadDefinitions()
evolvedPokemon.CalculateStats()
Dim hasOldAbility As Boolean = False
If currentPokemon.IsUsingHiddenAbility = True And evolvedPokemon.HasHiddenAbility = True Then
evolvedPokemon.Ability = evolvedPokemon.HiddenAbility
Else
For Each a As Ability In evolvedPokemon.NewAbilities
If a.ID = currentPokemon.Ability.ID Then
hasOldAbility = True
Exit For
End If
Next
If hasOldAbility = False Then
Dim AbilityNumber As Integer = -1
For i = 0 To currentPokemon.NewAbilities.Count - 1
If currentPokemon.NewAbilities(i).ID = currentPokemon.Ability.ID Then
AbilityNumber = i
Exit For
End If
Next
If AbilityNumber > -1 Then
AbilityNumber = AbilityNumber.Clamp(0, evolvedPokemon.NewAbilities.Count - 1)
evolvedPokemon.Ability = evolvedPokemon.NewAbilities(AbilityNumber)
Else
evolvedPokemon.Ability = evolvedPokemon.NewAbilities(Core.Random.Next(0, evolvedPokemon.NewAbilities.Count))
End If
Else
evolvedPokemon.Ability = currentPokemon.Ability
End If
End If
evolvedPokemon.SetOriginalAbility()
evolvedPokemon.IsShiny = currentPokemon.IsShiny
evolvedPokemon.Item = currentPokemon.Item
evolvedPokemon.CatchBall = currentPokemon.CatchBall
If currentPokemon.CatchMethod = "" Then
currentPokemon.CatchMethod = "Somehow obtained at"
End If
If currentPokemon.CatchLocation = "" Then
currentPokemon.CatchLocation = "an unknown place"
End If
evolvedPokemon.CatchLocation = currentPokemon.CatchLocation
evolvedPokemon.CatchMethod = currentPokemon.CatchMethod
evolvedPokemon.CatchTrainerName = currentPokemon.CatchTrainerName
evolvedPokemon.OT = currentPokemon.OT
evolvedPokemon.Experience = currentPokemon.Experience
evolvedPokemon.HP = CInt(evolvedPokemon.MaxHP * (HPpercentage / 100))
End Sub
Dim SavedMusic As String = ""
Public Sub ChangeSavedScreen()
Dim s As Screen = Core.CurrentScreen
While s.Identification <> Identifications.BattleScreen
s = s.PreScreen
End While
Screen.Level = CType(s, BattleSystem.BattleScreen).SavedOverworld.Level
Screen.Camera = CType(s, BattleSystem.BattleScreen).SavedOverworld.Camera
Screen.Effect = CType(s, BattleSystem.BattleScreen).SavedOverworld.Effect
Screen.SkyDome = CType(s, BattleSystem.BattleScreen).SavedOverworld.SkyDome
Screen.Level.World.Initialize(Screen.Level.EnvironmentType, Screen.Level.WeatherType)
End Sub
End Class
Public Class Spark
Dim T As Texture2D
Dim Position As New Vector2(0, 0)
Dim Size As Integer = 0
Dim Speed As Single = 0.0F
Dim aim As Vector2
Dim Delay As Single = 0.0F
Dim C As Color = New Color(255, 255, 255)
Dim xReady As Boolean = False
Dim yReady As Boolean = False
Public IsReady As Boolean = False
Public doGrow As Boolean = False
Dim grown As Integer = 50
Public Sub New()
Me.T = TextureManager.GetTexture("GUI\Evolution\EvolutionSpark")
Me.Size = Core.Random.Next(12, 150)
Me.Speed = CSng(Core.Random.Next(5, 35) / 10)
Me.aim = New Vector2(CSng(Core.windowSize.Width / 2) - CSng(Size / 2), CSng(Core.windowSize.Height / 2) - CSng(Size / 2))
Me.aim = New Vector2(Me.aim.X + (Core.Random.Next(0, 320) - 160), Me.aim.Y + (Core.Random.Next(0, 320) - 160))
Me.Delay = CSng(Core.Random.Next(10, 250) / 10)
Me.C = New Color(Core.Random.Next(200, 256), Core.Random.Next(200, 256), Core.Random.Next(200, 256))
Select Case Core.Random.Next(0, 4)
Case 0
Me.Position.X = -Size
Me.Position.Y = Core.Random.Next(0, Core.windowSize.Height - Size)
Case 1
Me.Position.X = Core.Random.Next(0, Core.windowSize.Height - Size)
Me.Position.Y = -Size
Case 2
Me.Position.X = Core.windowSize.Width
Me.Position.Y = Core.Random.Next(0, Core.windowSize.Height - Size)
Case 3
Me.Position.X = Core.Random.Next(0, Core.windowSize.Height - Size)
Me.Position.Y = Core.windowSize.Height
End Select
End Sub
Public Sub Draw()
Core.SpriteBatch.Draw(Me.T, New Rectangle(CInt(Me.Position.X), CInt(Me.Position.Y), Me.Size, Me.Size), Me.C)
End Sub
Public Sub Update()
If Me.IsReady = False Then
If Me.Delay > 0.0F Then
Me.Delay -= 0.1F
If Me.Delay <= 0.0F Then
Me.Delay = 0.0F
End If
Else
If xReady = False Then
If Me.Position.X = Me.aim.X Then
Me.xReady = True
End If
If Me.Position.X < aim.X Then
Me.Position.X += Speed
If Me.Position.X >= aim.X Then
Me.xReady = True
End If
End If
If Me.Position.X > aim.X Then
Me.Position.X -= Speed
If Me.Position.X <= aim.X Then
Me.xReady = True
End If
End If
End If
If yReady = False Then
If Me.Position.Y = Me.aim.Y Then
Me.yReady = True
End If
If Me.Position.Y < aim.Y Then
Me.Position.Y += Speed
If Me.Position.Y >= aim.Y Then
Me.yReady = True
End If
End If
If Me.Position.Y > aim.Y Then
Me.Position.Y -= Speed
If Me.Position.Y <= aim.Y Then
Me.yReady = True
End If
End If
End If
If Core.Random.Next(0, 3) = 0 Then
Me.Speed += 0.1F
End If
If Me.xReady = True And Me.yReady = True Then
Me.IsReady = True
End If
End If
End If
If doGrow = True Then
If Me.grown > 0 Then
Me.Size += 2
Me.Position.X -= 1
Me.Position.Y -= 1
Me.grown -= 1
If grown = 0 Then
Select Case Core.Random.Next(0, 4)
Case 0
Me.aim.X = -Size
Me.aim.Y = Core.Random.Next(0, Core.windowSize.Height - Size)
Case 1
Me.aim.X = Core.Random.Next(0, Core.windowSize.Height - Size)
Me.aim.Y = -Size
Case 2
Me.aim.X = Core.windowSize.Width
Me.aim.Y = Core.Random.Next(0, Core.windowSize.Height - Size)
Case 3
Me.aim.X = Core.Random.Next(0, Core.windowSize.Height - Size)
Me.aim.Y = Core.windowSize.Height
End Select
doGrow = False
Me.IsReady = False
Me.xReady = False
Me.yReady = False
Me.Speed *= 3
End If
End If
End If
End Sub
End Class