From c79f92b3e8879b21a71c912b73e81772645567c5 Mon Sep 17 00:00:00 2001 From: JappaWakkaP3D <66885565+JappaWakkaP3D@users.noreply.github.com> Date: Sun, 22 Aug 2021 20:17:36 +0200 Subject: [PATCH 01/57] Battle Animations 22-08-2021 Made the Battle Animation implementation functional Added animations for: Stats Increasing Stats Decreasing Status Effects - Poisoned - Burned Attacks - Ember - Growl - Pound - Tackle - Poison Sting --- P3D/Battle/BattleSystemV2/Battle.vb | 1005 +++++++++++++-------- P3D/Pokemon/Attacks/Attack.vb | 28 +- P3D/Pokemon/Attacks/Fire/Ember.vb | 50 +- P3D/Pokemon/Attacks/Normal/Growl.vb | 9 + P3D/Pokemon/Attacks/Normal/Pound.vb | 7 + P3D/Pokemon/Attacks/Normal/Tackle.vb | 13 + P3D/Pokemon/Attacks/Poison/PoisonSting.vb | 30 + 7 files changed, 763 insertions(+), 379 deletions(-) diff --git a/P3D/Battle/BattleSystemV2/Battle.vb b/P3D/Battle/BattleSystemV2/Battle.vb index 0b0fb2977..2b322aaa2 100644 --- a/P3D/Battle/BattleSystemV2/Battle.vb +++ b/P3D/Battle/BattleSystemV2/Battle.vb @@ -1496,7 +1496,7 @@ End If 'Own Pokémon move animation! This displays any effects that should display on the user of the move. - moveUsed.UserPokemonMoveAnimation(BattleScreen) + moveUsed.UserPokemonMoveAnimation(BattleScreen, own) If moveUsed.Target <> Attack.Targets.Self And moveUsed.FocusOppPokemon = True Then If own = True Then @@ -1849,7 +1849,7 @@ End If 'Opp Pokémon move animation! This displays the move effects that target the other Pokémon and appear after the camera switched around. - moveUsed.OpponentPokemonMoveAnimation(BattleScreen) + moveUsed.OpponentPokemonMoveAnimation(BattleScreen, own) If moveUsed.IsDamagingMove = True Then ChangeCameraAngle(2, own, BattleScreen) @@ -2643,9 +2643,12 @@ Public Function InflictBurn(ByVal own As Boolean, ByVal from As Boolean, ByVal BattleScreen As BattleScreen, ByVal message As String, ByVal cause As String) As Boolean Dim p As Pokemon = BattleScreen.OwnPokemon Dim op As Pokemon = BattleScreen.OppPokemon + Dim pNPC As Entity = BattleScreen.OwnPokemonNPC + If own = False Then p = BattleScreen.OppPokemon op = BattleScreen.OwnPokemon + pNPC = BattleScreen.OppPokemonNPC End If If p.HP <= 0 OrElse p.Status = Pokemon.StatusProblems.Fainted Then @@ -2701,7 +2704,15 @@ 'Works! p.Status = Pokemon.StatusProblems.Burn ChangeCameraAngle(1, own, BattleScreen) - BattleScreen.BattleQuery.Add(New PlaySoundQueryObject("Battle\Effects\Burned", False)) + 'Burn animation + Dim BurnAnimation As AnimationQueryObject = New AnimationQueryObject(pNPC, own) + BurnAnimation.AnimationPlaySound("Battle\Effects\Burned", 0, 0) + MoveAnimation.AnimationSpawnFadingEntity(0.25, -0.25, -0.25, "Textures\Battle\Fire\Ember,0,0,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 1, 1) + MoveAnimation.AnimationSpawnFadingEntity(0.25, -0.25, -0.25, "Textures\Battle\Fire\Ember,0,32,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 2, 1) + MoveAnimation.AnimationSpawnFadingEntity(0.25, -0.25, -0.25, "Textures\Battle\Fire\Ember,0,64,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 3, 1) + MoveAnimation.AnimationSpawnFadingEntity(0.25, -0.25, -0.25, "Textures\Battle\Fire\Ember,0,96,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 4, 1) + MoveAnimation.AnimationSpawnFadingEntity(0.25, -0.25, -0.25, "Textures\Battle\Fire\Ember,0,128,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 5, 1) + BattleScreen.BattleQuery.Add(BurnAnimation) Select Case message Case "" 'Print default message only BattleScreen.BattleQuery.Add(New TextQueryObject(p.GetDisplayName() & " got burned!")) @@ -3399,7 +3410,28 @@ End If End If - '***SHOW STAT INCREASE ANIMATION HERE*** + '***STAT INCREASE ANIMATION*** + Dim MoveAnimation As AnimationQueryObject = New AnimationQueryObject(pNPC, Not own) + Dim maxAmount As Integer = 20 * val + Dim currentAmount As Integer = 0 + While currentAmount <= maxAmount + Dim Texture As String = "Textures\Battle\StatChange\statDown" + Dim Position As Vector3 = New Vector3(0, -0.4, 0) + Dim Destination As Vector3 = New Vector3(0, 0.8, 0) + Dim Scale As Vector3 = New Vector3(0.2F) + Dim xPos = CSng((Random.NextDouble() - 0.5) * 1.2) + Dim zPos = CSng((Random.NextDouble() - 0.5) * 1.2) + + Position.X = xPos + Position.Z = zPos + Destination.X = xPos + Destination.Z = zPos + Dim startDelay As Double = 5.0 * Random.NextDouble() + MoveAnimation.AnimationSpawnMovingEntity(Position.X, Position.Y, Position.Z, Texture, Scale.X, Scale.Y, Scale.Z, Destination.X, Destination.Y, Destination.Z, 0.05F, False, True, CSng(startDelay), 0.0F) + Threading.Interlocked.Increment(currentAmount) + End While + BattleScreen.BattleQuery.Add(New PlaySoundQueryObject("Battle\Effects\Stat_Raise", False)) + BattleScreen.BattleQuery.Add(MoveAnimation) Dim printMessage As String = p.GetDisplayName() & "'s " & statString Select Case val @@ -3660,8 +3692,28 @@ val = 6 + statC End If End If + '***STAT DECREASE ANIMATION*** + Dim MoveAnimation As AnimationQueryObject = New AnimationQueryObject(pNPC, Not own) + Dim maxAmount As Integer = 20 * val + Dim currentAmount As Integer = 0 + While currentAmount <= maxAmount + Dim Texture As String = "Textures\Battle\StatChange\statDown" + Dim Position As Vector3 = New Vector3(0, 0.8, 0) + Dim Destination As Vector3 = New Vector3(0, -0.4, 0) + Dim Scale As Vector3 = New Vector3(0.2F) + Dim xPos = CSng((Random.NextDouble() - 0.5) * 1.2) + Dim zPos = CSng((Random.NextDouble() - 0.5) * 1.2) - '***SHOW STAT DECREASE ANIMATION HERE*** + Position.X = xPos + Position.Z = zPos + Destination.X = xPos + Destination.Z = zPos + Dim startDelay As Double = 5.0 * Random.NextDouble() + MoveAnimation.AnimationSpawnMovingEntity(Position.X, Position.Y, Position.Z, Texture, Scale.X, Scale.Y, Scale.Z, Destination.X, Destination.Y, Destination.Z, 0.05F, False, True, CSng(startDelay), 0.0F) + Threading.Interlocked.Increment(currentAmount) + End While + MoveAnimation.AnimationPlaySound("Battle\Effects\Stat_Lower", 0.0F, 10.0F) + BattleScreen.BattleQuery.Add(MoveAnimation) Dim printMessage As String = p.GetDisplayName() & "'s " & statString Select Case val @@ -5295,14 +5347,48 @@ Else If .OwnPokemon.Ability.Name.ToLower() <> "magic guard" Then If .OwnPokemon.Status = Pokemon.StatusProblems.Poison Then 'Own Poison - BattleScreen.BattleQuery.Add(New PlaySoundQueryObject("Battle\Effects\Poisoned", False)) + 'Poison animation + Dim PoisonAnimation As AnimationQueryObject = New AnimationQueryObject(BattleScreen.OwnPokemonNPC, True) + PoisonAnimation.AnimationPlaySound("Battle\Effects\Poisoned", 0, 0) + PoisonAnimation.AnimationSpawnFadingEntity(-0.25, -0.25, -0.25, "Textures\Battle\Poison\Bubble,0,0,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 0, 1) + + PoisonAnimation.AnimationSpawnFadingEntity(-0.25, -0.25, -0.25, "Textures\Battle\Poison\Bubble,0,32,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 1, 1) + PoisonAnimation.AnimationSpawnFadingEntity(0.25, -0.25, 0.25, "Textures\Battle\Poison\Bubble,0,0,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 1, 1) + + PoisonAnimation.AnimationSpawnFadingEntity(-0.25, -0.25, -0.25, "Textures\Battle\Poison\Bubble,0,64,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 2, 1) + PoisonAnimation.AnimationSpawnFadingEntity(0.25, -0.25, 0.25, "Textures\Battle\Poison\Bubble,0,32,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 2, 1) + PoisonAnimation.AnimationSpawnFadingEntity(0.25, -0.25, -0.25, "Textures\Battle\Poison\Bubble,0,0,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 2, 1) + + PoisonAnimation.AnimationSpawnFadingEntity(0.25, -0.25, 0.25, "Textures\Battle\Poison\Bubble,0,64,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 3, 1) + PoisonAnimation.AnimationSpawnFadingEntity(0.25, -0.25, -0.25, "Textures\Battle\Poison\Bubble,0,32,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 3, 1) + + PoisonAnimation.AnimationSpawnFadingEntity(0.25, -0.25, -0.25, "Textures\Battle\Poison\Bubble,0,64,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 4, 2) + BattleScreen.BattleQuery.Add(PoisonAnimation) + 'Actual damage ReduceHP(CInt(.OwnPokemon.MaxHP / 8), True, True, BattleScreen, "The poison hurt " & .OwnPokemon.GetDisplayName() & ".", "poison") End If If .OwnPokemon.Status = Pokemon.StatusProblems.BadPoison Then 'Own Toxic .FieldEffects.OwnPoisonCounter += 1 Dim multiplier As Double = (.FieldEffects.OwnPoisonCounter / 16) - BattleScreen.BattleQuery.Add(New PlaySoundQueryObject("Battle\Effects\Poisoned", False)) + 'Poison animation + Dim PoisonAnimation As AnimationQueryObject = New AnimationQueryObject(BattleScreen.OwnPokemonNPC, True) + PoisonAnimation.AnimationPlaySound("Battle\Effects\Poisoned", 0, 0) + PoisonAnimation.AnimationSpawnFadingEntity(-0.25, -0.25, -0.25, "Textures\Battle\Poison\Bubble,0,0,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 0, 1) + + PoisonAnimation.AnimationSpawnFadingEntity(-0.25, -0.25, -0.25, "Textures\Battle\Poison\Bubble,0,32,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 1, 1) + PoisonAnimation.AnimationSpawnFadingEntity(0.25, -0.25, 0.25, "Textures\Battle\Poison\Bubble,0,0,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 1, 1) + + PoisonAnimation.AnimationSpawnFadingEntity(-0.25, -0.25, -0.25, "Textures\Battle\Poison\Bubble,0,64,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 2, 1) + PoisonAnimation.AnimationSpawnFadingEntity(0.25, -0.25, 0.25, "Textures\Battle\Poison\Bubble,0,32,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 2, 1) + PoisonAnimation.AnimationSpawnFadingEntity(0.25, -0.25, -0.25, "Textures\Battle\Poison\Bubble,0,0,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 2, 1) + + PoisonAnimation.AnimationSpawnFadingEntity(0.25, -0.25, 0.25, "Textures\Battle\Poison\Bubble,0,64,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 3, 1) + PoisonAnimation.AnimationSpawnFadingEntity(0.25, -0.25, -0.25, "Textures\Battle\Poison\Bubble,0,32,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 3, 1) + + PoisonAnimation.AnimationSpawnFadingEntity(0.25, -0.25, -0.25, "Textures\Battle\Poison\Bubble,0,64,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 4, 2) + BattleScreen.BattleQuery.Add(PoisonAnimation) + 'Actual damage ReduceHP(CInt(.OwnPokemon.MaxHP * multiplier), True, True, BattleScreen, "The toxic hurt " & .OwnPokemon.GetDisplayName() & ".", "badpoison") End If End If @@ -5317,7 +5403,16 @@ reduceAmount = CInt(.OwnPokemon.MaxHP / 32) End If - BattleScreen.BattleQuery.Add(New PlaySoundQueryObject("Battle\Effects\Burned", False)) + 'Burn animation + Dim BurnAnimation As AnimationQueryObject = New AnimationQueryObject(BattleScreen.OwnPokemonNPC, False) + BurnAnimation.AnimationPlaySound("Battle\Effects\Burned", 0, 0) + MoveAnimation.AnimationSpawnFadingEntity(0.25, -0.25, -0.25, "Textures\Battle\Fire\Ember,0,0,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 1, 1) + MoveAnimation.AnimationSpawnFadingEntity(0.25, -0.25, -0.25, "Textures\Battle\Fire\Ember,0,32,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 2, 1) + MoveAnimation.AnimationSpawnFadingEntity(0.25, -0.25, -0.25, "Textures\Battle\Fire\Ember,0,64,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 3, 1) + MoveAnimation.AnimationSpawnFadingEntity(0.25, -0.25, -0.25, "Textures\Battle\Fire\Ember,0,96,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 4, 1) + MoveAnimation.AnimationSpawnFadingEntity(0.25, -0.25, -0.25, "Textures\Battle\Fire\Ember,0,128,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 5, 1) + BattleScreen.BattleQuery.Add(BurnAnimation) + 'Actual damage ReduceHP(reduceAmount, True, True, BattleScreen, .OwnPokemon.GetDisplayName() & " is hurt by the burn.", "burn") End If End If @@ -6044,14 +6139,48 @@ Else If .OppPokemon.Ability.Name.ToLower() <> "magic guard" Then If .OppPokemon.Status = Pokemon.StatusProblems.Poison Then 'Opp Poison - BattleScreen.BattleQuery.Add(New PlaySoundQueryObject("Battle\Effects\Poisoned", False)) + 'Poison animation + Dim PoisonAnimation As AnimationQueryObject = New AnimationQueryObject(BattleScreen.OppPokemonNPC, False) + PoisonAnimation.AnimationPlaySound("Battle\Effects\Poisoned", 0, 0) + PoisonAnimation.AnimationSpawnFadingEntity(-0.25, -0.25, -0.25, "Textures\Battle\Poison\Bubble,0,0,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 0, 1) + + PoisonAnimation.AnimationSpawnFadingEntity(-0.25, -0.25, -0.25, "Textures\Battle\Poison\Bubble,0,32,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 1, 1) + PoisonAnimation.AnimationSpawnFadingEntity(0.25, -0.25, 0.25, "Textures\Battle\Poison\Bubble,0,0,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 1, 1) + + PoisonAnimation.AnimationSpawnFadingEntity(-0.25, -0.25, -0.25, "Textures\Battle\Poison\Bubble,0,64,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 2, 1) + PoisonAnimation.AnimationSpawnFadingEntity(0.25, -0.25, 0.25, "Textures\Battle\Poison\Bubble,0,32,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 2, 1) + PoisonAnimation.AnimationSpawnFadingEntity(0.25, -0.25, -0.25, "Textures\Battle\Poison\Bubble,0,0,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 2, 1) + + PoisonAnimation.AnimationSpawnFadingEntity(0.25, -0.25, 0.25, "Textures\Battle\Poison\Bubble,0,64,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 3, 1) + PoisonAnimation.AnimationSpawnFadingEntity(0.25, -0.25, -0.25, "Textures\Battle\Poison\Bubble,0,32,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 3, 1) + + PoisonAnimation.AnimationSpawnFadingEntity(0.25, -0.25, -0.25, "Textures\Battle\Poison\Bubble,0,64,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 4, 2) + BattleScreen.BattleQuery.Add(PoisonAnimation) + 'Actual damage ReduceHP(CInt(.OppPokemon.MaxHP / 8), False, False, BattleScreen, "The poison hurt " & .OppPokemon.GetDisplayName() & ".", "poison") End If If .OppPokemon.Status = Pokemon.StatusProblems.BadPoison Then 'Opp Toxic .FieldEffects.OppPoisonCounter += 1 Dim multiplier As Double = (.FieldEffects.OppPoisonCounter / 16) - BattleScreen.BattleQuery.Add(New PlaySoundQueryObject("Battle\Effects\Poisoned", False)) + 'Poison animation + Dim PoisonAnimation As AnimationQueryObject = New AnimationQueryObject(BattleScreen.OppPokemonNPC, False) + PoisonAnimation.AnimationPlaySound("Battle\Effects\Poisoned", 0, 0) + PoisonAnimation.AnimationSpawnFadingEntity(-0.25, -0.25, -0.25, "Textures\Battle\Poison\Bubble,0,0,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 0, 1) + + PoisonAnimation.AnimationSpawnFadingEntity(-0.25, -0.25, -0.25, "Textures\Battle\Poison\Bubble,0,32,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 1, 1) + PoisonAnimation.AnimationSpawnFadingEntity(0.25, -0.25, 0.25, "Textures\Battle\Poison\Bubble,0,0,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 1, 1) + + PoisonAnimation.AnimationSpawnFadingEntity(-0.25, -0.25, -0.25, "Textures\Battle\Poison\Bubble,0,64,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 2, 1) + PoisonAnimation.AnimationSpawnFadingEntity(0.25, -0.25, 0.25, "Textures\Battle\Poison\Bubble,0,32,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 2, 1) + PoisonAnimation.AnimationSpawnFadingEntity(0.25, -0.25, -0.25, "Textures\Battle\Poison\Bubble,0,0,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 2, 1) + + PoisonAnimation.AnimationSpawnFadingEntity(0.25, -0.25, 0.25, "Textures\Battle\Poison\Bubble,0,64,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 3, 1) + PoisonAnimation.AnimationSpawnFadingEntity(0.25, -0.25, -0.25, "Textures\Battle\Poison\Bubble,0,32,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 3, 1) + + PoisonAnimation.AnimationSpawnFadingEntity(0.25, -0.25, -0.25, "Textures\Battle\Poison\Bubble,0,64,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 4, 2) + BattleScreen.BattleQuery.Add(PoisonAnimation) + 'Actual damage ReduceHP(CInt(.OppPokemon.MaxHP * multiplier), False, False, BattleScreen, "The toxic hurt " & .OppPokemon.GetDisplayName() & ".", "badpoison") End If End If @@ -6065,8 +6194,16 @@ If .OppPokemon.Ability.Name.ToLower() = "heatproof" Then reduceAmount = CInt(.OppPokemon.MaxHP / 16) End If - - BattleScreen.BattleQuery.Add(New PlaySoundQueryObject("Battle\Effects\Burned", False)) + 'Burn animation + Dim BurnAnimation As AnimationQueryObject = New AnimationQueryObject(BattleScreen.OppPokemonNPC, False) + BurnAnimation.AnimationPlaySound("Battle\Effects\Burned", 0, 0) + MoveAnimation.AnimationSpawnFadingEntity(0.25, -0.25, -0.25, "Textures\Battle\Fire\Ember,0,0,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 1, 1) + MoveAnimation.AnimationSpawnFadingEntity(0.25, -0.25, -0.25, "Textures\Battle\Fire\Ember,0,32,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 2, 1) + MoveAnimation.AnimationSpawnFadingEntity(0.25, -0.25, -0.25, "Textures\Battle\Fire\Ember,0,64,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 3, 1) + MoveAnimation.AnimationSpawnFadingEntity(0.25, -0.25, -0.25, "Textures\Battle\Fire\Ember,0,96,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 4, 1) + MoveAnimation.AnimationSpawnFadingEntity(0.25, -0.25, -0.25, "Textures\Battle\Fire\Ember,0,128,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 5, 1) + BattleScreen.BattleQuery.Add(BurnAnimation) + 'Actual damage ReduceHP(reduceAmount, False, False, BattleScreen, .OppPokemon.GetDisplayName() & " is hurt by the burn.", "burn") End If End If @@ -6620,8 +6757,8 @@ End If End Sub - Public Sub SwitchInOwn(ByVal BattleScreen As BattleScreen, ByVal NewPokemonIndex As Integer, ByVal FirstTime As Boolean, ByVal InsertIndex As Integer, Optional ByVal message As String = "") - HasSwitchedInOwn = True + Public Sub SwitchInOwn(ByVal BattleScreen As BattleScreen, ByVal NewPokemonIndex As Integer, ByVal FirstTime As Boolean, ByVal InsertIndex As Integer, Optional ByVal message As String = "") + HasSwitchedInOwn = True If FirstTime = False Then Dim insertMessage As String = message @@ -6631,6 +6768,34 @@ BattleScreen.AddToQuery(InsertIndex, New TextQueryObject(insertMessage)) + Dim BallReturn As AnimationQueryObject = New AnimationQueryObject(BattleScreen.OwnPokemonNPC, False, BattleScreen.OwnPokemonModel) + + ' Ball Closes + BallReturn.AnimationPlaySound("Battle\Pokeball\Open", 0, 0) + Dim SmokeReturned As Integer = 0 + Do + Dim SmokePosition = New Vector3(CSng(Random.Next(-10, 10) / 10), CSng(Random.Next(-10, 10) / 10), CSng(Random.Next(-10, 10) / 10)) + Dim SmokeDestination = New Vector3(0, 0, 0) + + Dim SmokeTexture As String = "Textures\Battle\Cloud" + + Dim SmokeScale = New Vector3(CSng(Random.Next(2, 6) / 10)) + Dim SmokeSpeed = CSng(Random.Next(1, 3) / 10.0F) + + BallReturn.AnimationSpawnMovingEntity(SmokePosition.X, SmokePosition.Y, SmokePosition.Z, SmokeTexture, SmokeScale.X, SmokeScale.Y, SmokeScale.Z, SmokeDestination.X, SmokeDestination.Y, SmokeDestination.Z, SmokeSpeed, False, False, 0.0F, 0.0F) + Threading.Interlocked.Increment(SmokeReturned) + Loop While SmokeReturned <= 38 + + ' Pokemon disappears + BallReturn.AnimationFadePokemonEntity(1, False, 0, 1, 0) + BallReturn.AnimationMovePokemonEntity(0, 0.5, 0, 0.5, False, False, 2, 0,,, 4) + + ' Ball returns + BallReturn.AnimationPlaySound("Battle\Pokeball\Throw", 1, 0) + BallReturn.AnimationSpawnMovingEntity(0, 0, 0, BattleScreen.OwnPokemon.CatchBall.TextureSource, 0.3F, 0.3F, 0.3F, -2, 0, 0, 0.1, False, True, 1, 0,, 0.3) + + BattleScreen.AddToQuery(InsertIndex, BallReturn) + Dim index As Integer = NewPokemonIndex If index <= -1 Then For i = 0 To Core.Player.Pokemons.Count - 1 @@ -6655,435 +6820,547 @@ End If Dim ownModel As String = BattleScreen.GetModelName(True) - If ownModel = "" Then BattleScreen.AddToQuery(InsertIndex, New ToggleEntityQueryObject(True, ToggleEntityQueryObject.BattleEntities.OwnPokemon, PokemonForms.GetOverworldSpriteName(BattleScreen.OwnPokemon), 0, 1, -1, -1)) Else BattleScreen.AddToQuery(InsertIndex, New ToggleEntityQueryObject(True, ownModel, 1, 0, -1, -1)) End If - BattleScreen.AddToQuery(InsertIndex, New ToggleEntityQueryObject(True, ToggleEntityQueryObject.BattleEntities.OwnPokemon, 1, -1, -1, -1, -1)) - BattleScreen.BattleQuery.Add(New PlaySoundQueryObject(BattleScreen.OwnPokemon.Number.ToString(), True)) BattleScreen.AddToQuery(InsertIndex, New TextQueryObject("Go, " & BattleScreen.OwnPokemon.GetDisplayName() & "!")) + + ' Ball is thrown + Dim BallThrow As AnimationQueryObject = New AnimationQueryObject(BattleScreen.OwnPokemonNPC, False, BattleScreen.OwnPokemonModel) + BallThrow.AnimationPlaySound("Battle\Pokeball\Throw", 0, 0) + BallThrow.AnimationSpawnMovingEntity(-2, -0.15, 0, BattleScreen.OwnPokemon.CatchBall.TextureSource, 0.3F, 0.3F, 0.3F, 0, 0.35, 0, 0.1, False, True, 0F, 0F,, 0.3) + + ' Ball Opens + BallThrow.AnimationPlaySound("Battle\Pokeball\Open", 3, 0) + Dim SmokeSpawned As Integer = 0 + Do + Dim SmokePosition = New Vector3(0, 0.35, 0) + Dim SmokeDestination = New Vector3(CSng(Random.Next(-10, 10) / 10), CSng(Random.Next(-10, 10) / 10), CSng(Random.Next(-10, 10) / 10)) + + Dim SmokeTexture As String = "Textures\Battle\Cloud" + + Dim SmokeScale = New Vector3(CSng(Random.Next(2, 6) / 10)) + Dim SmokeSpeed = CSng(Random.Next(1, 3) / 10.0F) + + BallThrow.AnimationSpawnMovingEntity(SmokePosition.X, SmokePosition.Y, SmokePosition.Z, SmokeTexture, SmokeScale.X, SmokeScale.Y, SmokeScale.Z, SmokeDestination.X, SmokeDestination.Y, SmokeDestination.Z, SmokeSpeed, False, False, 3.0F, 0.0F) + Threading.Interlocked.Increment(SmokeSpawned) + Loop While SmokeSpawned <= 38 + + ' Pokemon appears + BallThrow.AnimationFadePokemonEntity(1, True, 1, 4, 0) + BallThrow.AnimationPlaySound(CStr(BattleScreen.OwnPokemon.Number), 4, 0,, True) + + ' Pokémon falls down + BallThrow.AnimationMovePokemonEntity(0, 0, 0, 0.05F, False, False, 4, 0,,, 4) + + BattleScreen.AddToQuery(InsertIndex, BallThrow) End If With BattleScreen - If .FieldEffects.UsedPokemon.Contains(NewPokemonIndex) = False Then - .FieldEffects.UsedPokemon.Add(NewPokemonIndex) - End If + If .FieldEffects.UsedPokemon.Contains(NewPokemonIndex) = False Then + .FieldEffects.UsedPokemon.Add(NewPokemonIndex) + End If - If Not .OwnPokemon.Item Is Nothing Then - If .OwnPokemon.Item.Name.ToLower() = "amulet coin" Or .OwnPokemon.Item.Name.ToLower() = "luck incense" Then - If .FieldEffects.CanUseItem(True) = True And .FieldEffects.CanUseOwnItem(True, BattleScreen) = True Then - BattleScreen.FieldEffects.AmuletCoin += 1 - End If - End If - End If + If Not .OwnPokemon.Item Is Nothing Then + If .OwnPokemon.Item.Name.ToLower() = "amulet coin" Or .OwnPokemon.Item.Name.ToLower() = "luck incense" Then + If .FieldEffects.CanUseItem(True) = True And .FieldEffects.CanUseOwnItem(True, BattleScreen) = True Then + BattleScreen.FieldEffects.AmuletCoin += 1 + End If + End If + End If - Dim p As Pokemon = .OwnPokemon - Dim op As Pokemon = .OppPokemon + Dim p As Pokemon = .OwnPokemon + Dim op As Pokemon = .OppPokemon - Dim spikeAffected As Boolean = True - Dim rockAffected As Boolean = True + Dim spikeAffected As Boolean = True + Dim rockAffected As Boolean = True - spikeAffected = BattleScreen.FieldEffects.IsGrounded(True, BattleScreen) + spikeAffected = BattleScreen.FieldEffects.IsGrounded(True, BattleScreen) - 'Spikes - If spikeAffected = True Then - If .FieldEffects.OppSpikes > 0 And (p.Ability.Name.ToLower() <> "magic guard" Or BattleScreen.FieldEffects.CanUseAbility(True, BattleScreen, 1) = False) Then - Dim spikeDamage As Double = 1D - Select Case .FieldEffects.OppSpikes - Case 1 - spikeDamage = (p.MaxHP / 100) * 12.5D - Case 2 - spikeDamage = (p.MaxHP / 100) * 16.7D - Case 3 - spikeDamage = (p.MaxHP / 100) * 25D - End Select - ReduceHP(CInt(spikeDamage), True, False, BattleScreen, "The Spikes hurt " & p.GetDisplayName() & "!", "spikes") - End If - End If + 'Spikes + If spikeAffected = True Then + If .FieldEffects.OppSpikes > 0 And (p.Ability.Name.ToLower() <> "magic guard" Or BattleScreen.FieldEffects.CanUseAbility(True, BattleScreen, 1) = False) Then + Dim spikeDamage As Double = 1D + Select Case .FieldEffects.OppSpikes + Case 1 + spikeDamage = (p.MaxHP / 100) * 12.5D + Case 2 + spikeDamage = (p.MaxHP / 100) * 16.7D + Case 3 + spikeDamage = (p.MaxHP / 100) * 25D + End Select + ReduceHP(CInt(spikeDamage), True, False, BattleScreen, "The Spikes hurt " & p.GetDisplayName() & "!", "spikes") + End If + End If - 'Sticky Web - If spikeAffected = True Then - If .FieldEffects.OppStickyWeb > 0 Then + 'Sticky Web + If spikeAffected = True Then + If .FieldEffects.OppStickyWeb > 0 Then - LowerStat(True, True, BattleScreen, "Speed", 1, "Your pokemon was caught in a Sticky Web!", "stickyweb") + LowerStat(True, True, BattleScreen, "Speed", 1, "Your pokemon was caught in a Sticky Web!", "stickyweb") - End If - End If + End If + End If - 'Toxic Spikes - If spikeAffected = True Then - If .FieldEffects.OppToxicSpikes > 0 And p.Status = Pokemon.StatusProblems.None And p.Type1.Type <> Element.Types.Poison And p.Type2.Type <> Element.Types.Poison Then - Select Case .FieldEffects.OppToxicSpikes - Case 1 - InflictPoison(True, False, BattleScreen, False, "The Toxic Spikes hurt " & p.GetDisplayName() & "!", "toxicspikes") - Case 2 - InflictPoison(True, False, BattleScreen, True, "The Toxic Spikes hurt " & p.GetDisplayName() & "!", "toxicspikes") - End Select - End If - If .FieldEffects.OppToxicSpikes > 0 Then - If p.Type1.Type = Element.Types.Poison Or p.Type2.Type = Element.Types.Poison Then - .AddToQuery(InsertIndex, New TextQueryObject(p.GetDisplayName() & " removed the Toxic Spikes!")) - .FieldEffects.OppToxicSpikes = 0 - End If - End If - End If + 'Toxic Spikes + If spikeAffected = True Then + If .FieldEffects.OppToxicSpikes > 0 And p.Status = Pokemon.StatusProblems.None And p.Type1.Type <> Element.Types.Poison And p.Type2.Type <> Element.Types.Poison Then + Select Case .FieldEffects.OppToxicSpikes + Case 1 + InflictPoison(True, False, BattleScreen, False, "The Toxic Spikes hurt " & p.GetDisplayName() & "!", "toxicspikes") + Case 2 + InflictPoison(True, False, BattleScreen, True, "The Toxic Spikes hurt " & p.GetDisplayName() & "!", "toxicspikes") + End Select + End If + If .FieldEffects.OppToxicSpikes > 0 Then + If p.Type1.Type = Element.Types.Poison Or p.Type2.Type = Element.Types.Poison Then + .AddToQuery(InsertIndex, New TextQueryObject(p.GetDisplayName() & " removed the Toxic Spikes!")) + .FieldEffects.OppToxicSpikes = 0 + End If + End If + End If - 'Stealth Rock - If rockAffected = True Then - If .FieldEffects.OppStealthRock > 0 And (p.Ability.Name.ToLower() <> "magic guard" Or BattleScreen.FieldEffects.CanUseAbility(True, BattleScreen, 1) = False) Then - Dim rocksDamage As Double = 1D + 'Stealth Rock + If rockAffected = True Then + If .FieldEffects.OppStealthRock > 0 And (p.Ability.Name.ToLower() <> "magic guard" Or BattleScreen.FieldEffects.CanUseAbility(True, BattleScreen, 1) = False) Then + Dim rocksDamage As Double = 1D - Dim effectiveness As Single = BattleCalculation.ReverseTypeEffectiveness(Element.GetElementMultiplier(New Element(Element.Types.Rock), p.Type1)) * BattleCalculation.ReverseTypeEffectiveness(Element.GetElementMultiplier(New Element(Element.Types.Rock), p.Type2)) - Select Case effectiveness - Case 0.25F - rocksDamage = (p.MaxHP / 100) * 3.125D - Case 0.5F - rocksDamage = (p.MaxHP / 100) * 6.25D - Case 1.0F - rocksDamage = (p.MaxHP / 100) * 12.5D - Case 2.0F - rocksDamage = (p.MaxHP / 100) * 25D - Case 4.0F - rocksDamage = (p.MaxHP / 100) * 50D - End Select + Dim effectiveness As Single = BattleCalculation.ReverseTypeEffectiveness(Element.GetElementMultiplier(New Element(Element.Types.Rock), p.Type1)) * BattleCalculation.ReverseTypeEffectiveness(Element.GetElementMultiplier(New Element(Element.Types.Rock), p.Type2)) + Select Case effectiveness + Case 0.25F + rocksDamage = (p.MaxHP / 100) * 3.125D + Case 0.5F + rocksDamage = (p.MaxHP / 100) * 6.25D + Case 1.0F + rocksDamage = (p.MaxHP / 100) * 12.5D + Case 2.0F + rocksDamage = (p.MaxHP / 100) * 25D + Case 4.0F + rocksDamage = (p.MaxHP / 100) * 50D + End Select - ReduceHP(CInt(rocksDamage), True, False, BattleScreen, "The Stealth Rocks hurt " & p.GetDisplayName() & "!", "stealthrocks") - End If - End If + ReduceHP(CInt(rocksDamage), True, False, BattleScreen, "The Stealth Rocks hurt " & p.GetDisplayName() & "!", "stealthrocks") + End If + End If - TriggerAbilityEffect(BattleScreen, True) - TriggerItemEffect(BattleScreen, True) + TriggerAbilityEffect(BattleScreen, True) + TriggerItemEffect(BattleScreen, True) - If .OwnPokemon.Status = Pokemon.StatusProblems.Sleep Then - .FieldEffects.OwnSleepTurns = Core.Random.Next(1, 4) - End If + If .OwnPokemon.Status = Pokemon.StatusProblems.Sleep Then + .FieldEffects.OwnSleepTurns = Core.Random.Next(1, 4) + End If - If BattleScreen.FieldEffects.OwnHealingWish = True Then - BattleScreen.FieldEffects.OwnHealingWish = False + If BattleScreen.FieldEffects.OwnHealingWish = True Then + BattleScreen.FieldEffects.OwnHealingWish = False - If .OwnPokemon.HP < .OwnPokemon.MaxHP Or .OwnPokemon.Status <> Pokemon.StatusProblems.None Then - GainHP(.OwnPokemon.MaxHP - .OwnPokemon.HP, True, True, BattleScreen, "The Healing Wish came true for " & .OwnPokemon.GetDisplayName() & "!", "move:healingwish") - CureStatusProblem(True, True, BattleScreen, "", "move:healingwish") - End If - End If - End With - End Sub + If .OwnPokemon.HP < .OwnPokemon.MaxHP Or .OwnPokemon.Status <> Pokemon.StatusProblems.None Then + GainHP(.OwnPokemon.MaxHP - .OwnPokemon.HP, True, True, BattleScreen, "The Healing Wish came true for " & .OwnPokemon.GetDisplayName() & "!", "move:healingwish") + CureStatusProblem(True, True, BattleScreen, "", "move:healingwish") + End If + End If + End With + End Sub - Public Sub SwitchOutOpp(ByVal BattleScreen As BattleScreen, ByVal index As Integer, Optional ByVal message As String = "") - With BattleScreen - 'Natural cure cures status problems - If .OppPokemon.Ability.Name.ToLower() = "natural cure" Then - If .OppPokemon.Status <> Pokemon.StatusProblems.Fainted And .OppPokemon.Status <> Pokemon.StatusProblems.None Then - .OppPokemon.Status = Pokemon.StatusProblems.None - .BattleQuery.Add(New TextQueryObject(.OppPokemon.GetDisplayName() & "'s status problem got healed by Natural Cure")) - End If - End If - 'Regenerator ability heals 1/3 of it's max HP - If .OppPokemon.Ability.Name.ToLower() = "regenerator" Then - If Not (.OppPokemon.Status = Pokemon.StatusProblems.Fainted Or .OppPokemon.HP = 0) Then - Dim restoreHP = CInt(.OppPokemon.MaxHP / 3) - If restoreHP > 0 And .OppPokemon.HP < .OppPokemon.MaxHP And .OppPokemon.HP > 0 Then - BattleScreen.Battle.GainHP(restoreHP, False, True, BattleScreen, .OppPokemon.GetDisplayName() & "'s HP was restored!", "ability:regenerator") - End If - End If - End If - 'save baton pass stuff: - If .FieldEffects.OppUsedBatonPass = True Then - .FieldEffects.OppBatonPassStats = New List(Of Integer) - With .OppPokemon - BattleScreen.FieldEffects.OppBatonPassStats.AddRange({ .StatAttack, .StatDefense, .StatSpAttack, .StatSpDefense, .StatSpeed, .Evasion, .Accuracy}) - End With - .FieldEffects.OppBatonPassConfusion = .OppPokemon.HasVolatileStatus(Pokemon.VolatileStatus.Confusion) = True - End If + Public Sub SwitchOutOpp(ByVal BattleScreen As BattleScreen, ByVal index As Integer, Optional ByVal message As String = "") + With BattleScreen + 'Natural cure cures status problems + If .OppPokemon.Ability.Name.ToLower() = "natural cure" Then + If .OppPokemon.Status <> Pokemon.StatusProblems.Fainted And .OppPokemon.Status <> Pokemon.StatusProblems.None Then + .OppPokemon.Status = Pokemon.StatusProblems.None + .BattleQuery.Add(New TextQueryObject(.OppPokemon.GetDisplayName() & "'s status problem got healed by Natural Cure")) + End If + End If + 'Regenerator ability heals 1/3 of it's max HP + If .OppPokemon.Ability.Name.ToLower() = "regenerator" Then + If Not (.OppPokemon.Status = Pokemon.StatusProblems.Fainted Or .OppPokemon.HP = 0) Then + Dim restoreHP = CInt(.OppPokemon.MaxHP / 3) + If restoreHP > 0 And .OppPokemon.HP < .OppPokemon.MaxHP And .OppPokemon.HP > 0 Then + BattleScreen.Battle.GainHP(restoreHP, False, True, BattleScreen, .OppPokemon.GetDisplayName() & "'s HP was restored!", "ability:regenerator") + End If + End If + End If + 'save baton pass stuff: + If .FieldEffects.OppUsedBatonPass = True Then + .FieldEffects.OppBatonPassStats = New List(Of Integer) + With .OppPokemon + BattleScreen.FieldEffects.OppBatonPassStats.AddRange({ .StatAttack, .StatDefense, .StatSpAttack, .StatSpDefense, .StatSpeed, .Evasion, .Accuracy}) + End With + .FieldEffects.OppBatonPassConfusion = .OppPokemon.HasVolatileStatus(Pokemon.VolatileStatus.Confusion) = True + End If - 'Set the original objects of Pokemon - .OppPokemon.ResetTemp() + 'Set the original objects of Pokemon + .OppPokemon.ResetTemp() - 'Remove volatiles - .OppPokemon.ClearAllVolatiles() + 'Remove volatiles + .OppPokemon.ClearAllVolatiles() - 'Resetting FieldEffects - With .FieldEffects - .OppSleepTurns = 0 - .OppTruantRound = 0 - .OppTaunt = 0 - .OppSmacked = 0 - .OppFlashFire = 0 - .OppRageCounter = 0 - .OppUproar = 0 - If .OppUsedBatonPass = False Then .OppFocusEnergy = 0 - .OppEndure = 0 - .OppProtectCounter = 0 - .OppDetectCounter = 0 - .OppKingsShieldCounter = 0 - .OppProtectMovesCount = 0 - If .OppUsedBatonPass = False Then .OppIngrain = 0 - If .OppUsedBatonPass = False Then .OppSubstitute = 0 - If .OppUsedBatonPass = False Then .OppMagnetRise = 0 - If .OppUsedBatonPass = False Then .OppAquaRing = 0 - .OppPoisonCounter = 0 - .OppNightmare = 0 - If .OppUsedBatonPass = False Then .OppCurse = 0 - .OppOutrage = 0 - .OppThrash = 0 - .OppPetalDance = 0 - .OppEncore = 0 - .OppEncoreMove = Nothing - If .OppUsedBatonPass = False Then .OppEmbargo = 0 - .OppYawn = 0 - If .OppUsedBatonPass = False Then .OppPerishSongCount = 0 - .OppConfusionTurns = 0 - .OppTorment = 0 - .OppTormentMove = Nothing - .OppChoiceMove = Nothing - .OppRecharge = 0 - .OppRolloutCounter = 0 - .OppIceBallCounter = 0 - .OppDefenseCurl = 0 - .OppCharge = 0 - .OppSolarBeam = 0 - .OppSolarBlade = 0 - If .OppUsedBatonPass = False Then .OppLeechSeed = 0 - If .OppUsedBatonPass = False Then .OppLockOn = 0 - .OppLansatBerry = 0 - .OppCustapBerry = 0 - .OppTrappedCounter = 0 - .OppFuryCutter = 0 - .OppEchoedVoice = 0 - .OppPokemonTurns = 0 - .OppStockpileCount = 0 - .OppDestinyBond = False - .OppGastroAcid = False + 'Resetting FieldEffects + With .FieldEffects + .OppSleepTurns = 0 + .OppTruantRound = 0 + .OppTaunt = 0 + .OppSmacked = 0 + .OppRageCounter = 0 + .OppUproar = 0 + If .OppUsedBatonPass = False Then .OppFocusEnergy = 0 + .OppEndure = 0 + .OppProtectCounter = 0 + .OppDetectCounter = 0 + .OppKingsShieldCounter = 0 + .OppProtectMovesCount = 0 + If .OppUsedBatonPass = False Then .OppIngrain = 0 + If .OppUsedBatonPass = False Then .OppSubstitute = 0 + If .OppUsedBatonPass = False Then .OppMagnetRise = 0 + If .OppUsedBatonPass = False Then .OppAquaRing = 0 + .OppPoisonCounter = 0 + .OppNightmare = 0 + If .OppUsedBatonPass = False Then .OppCurse = 0 + .OppOutrage = 0 + .OppThrash = 0 + .OppPetalDance = 0 + .OppEncore = 0 + .OppEncoreMove = Nothing + If .OppUsedBatonPass = False Then .OppEmbargo = 0 + .OppYawn = 0 + If .OppUsedBatonPass = False Then .OppPerishSongCount = 0 + .OppConfusionTurns = 0 + .OppTorment = 0 + .OppTormentMove = Nothing + .OppChoiceMove = Nothing + .OppRecharge = 0 + .OppRolloutCounter = 0 + .OppIceBallCounter = 0 + .OppDefenseCurl = 0 + .OppCharge = 0 + .OppSolarBeam = 0 + .OppSolarBlade = 0 + If .OppUsedBatonPass = False Then .OppLeechSeed = 0 + If .OppUsedBatonPass = False Then .OppLockOn = 0 + .OppLansatBerry = 0 + .OppCustapBerry = 0 + .OppTrappedCounter = 0 + .OppFuryCutter = 0 + .OppEchoedVoice = 0 + .OppPokemonTurns = 0 + .OppStockpileCount = 0 + .OppDestinyBond = False + .OppGastroAcid = False - .OppFlyCounter = 0 - .OppDigCounter = 0 - .OppBounceCounter = 0 - .OppDiveCounter = 0 - .OppShadowForceCounter = 0 - .OppPhantomForceCounter = 0 - .OppSkyDropCounter = 0 - .OppGeomancyCounter = 0 - .OppSkyAttackCounter = 0 - .OppRazorWindCounter = 0 - .OppSkullBashCounter = 0 + .OppFlyCounter = 0 + .OppDigCounter = 0 + .OppBounceCounter = 0 + .OppDiveCounter = 0 + .OppShadowForceCounter = 0 + .OppPhantomForceCounter = 0 + .OppSkyDropCounter = 0 + .OppGeomancyCounter = 0 + .OppSkyAttackCounter = 0 + .OppRazorWindCounter = 0 + .OppSkullBashCounter = 0 - .OppForesight = 0 - .OppOdorSleuth = 0 - .OppMiracleEye = 0 + .OppForesight = 0 + .OppOdorSleuth = 0 + .OppMiracleEye = 0 - .OppWrap = 0 - .OppWhirlpool = 0 - .OppBind = 0 - .OppClamp = 0 - .OppFireSpin = 0 - .OppMagmaStorm = 0 - .OppSandTomb = 0 - .OppInfestation = 0 + .OppWrap = 0 + .OppWhirlpool = 0 + .OppBind = 0 + .OppClamp = 0 + .OppFireSpin = 0 + .OppMagmaStorm = 0 + .OppSandTomb = 0 + .OppInfestation = 0 - .OppBideCounter = 0 - .OppBideDamage = 0 + .OppBideCounter = 0 + .OppBideDamage = 0 - .OppRoostUsed = False + .OppRoostUsed = False - 'Own stuff that depends on opp pokemon presence - .OwnTrappedCounter = 0 - .OwnWrap = 0 - .OwnWhirlpool = 0 - .OwnBind = 0 - .OwnClamp = 0 - .OwnFireSpin = 0 - .OwnMagmaStorm = 0 - .OwnSandTomb = 0 - .OwnInfestation = 0 + 'Own stuff that depends on opp pokemon presence + .OwnTrappedCounter = 0 + .OwnWrap = 0 + .OwnWhirlpool = 0 + .OwnBind = 0 + .OwnClamp = 0 + .OwnFireSpin = 0 + .OwnMagmaStorm = 0 + .OwnSandTomb = 0 + .OwnInfestation = 0 - If BattleScreen.OwnPokemon.HasVolatileStatus(Pokemon.VolatileStatus.Infatuation) Then - BattleScreen.OwnPokemon.RemoveVolatileStatus(Pokemon.VolatileStatus.Infatuation) - End If - End With - End With + If BattleScreen.OwnPokemon.HasVolatileStatus(Pokemon.VolatileStatus.Infatuation) Then + BattleScreen.OwnPokemon.RemoveVolatileStatus(Pokemon.VolatileStatus.Infatuation) + End If + End With + End With - BattleScreen.OppPokemon.Ability.SwitchOut(BattleScreen.OppPokemon) + BattleScreen.OppPokemon.Ability.SwitchOut(BattleScreen.OppPokemon) - If BattleScreen.IsTrainerBattle = False Then + If BattleScreen.IsTrainerBattle = False Then ChangeCameraAngle(1, False, BattleScreen) + Dim Faint As AnimationQueryObject = New AnimationQueryObject(BattleScreen.OppPokemonNPC, True, BattleScreen.OppPokemonModel) + Faint.AnimationPlaySound(CStr(BattleScreen.OppPokemon.Number), 0, 2, False, True) + Faint.AnimationMovePokemonEntity(0, -1, 0, 0.1, False, False, 2, 0,,, 4) + BattleScreen.BattleQuery.Add(Faint) + BattleScreen.BattleQuery.Add(New ToggleEntityQueryObject(True, ToggleEntityQueryObject.BattleEntities.OppPokemon, 2, -1, -1, -1, -1)) - EndBattle(EndBattleReasons.WinWild, BattleScreen, False) - Else - If BattleScreen.TrainerHasFightablePokemon() = True Then - If BattleScreen.OppPokemon.HP <= 0 Or BattleScreen.OppPokemon.Status = Pokemon.StatusProblems.Fainted Then - GainEXP(BattleScreen) - End If - BattleScreen.BattleQuery.Add(New ToggleEntityQueryObject(True, ToggleEntityQueryObject.BattleEntities.OppPokemon, 2, -1, -1, -1, -1)) + EndBattle(EndBattleReasons.WinWild, BattleScreen, False) + Else + If BattleScreen.TrainerHasFightablePokemon() = True Then + If BattleScreen.OppPokemon.HP <= 0 Or BattleScreen.OppPokemon.Status = Pokemon.StatusProblems.Fainted Then + GainEXP(BattleScreen) + End If If BattleScreen.IsRemoteBattle And BattleScreen.OppFaint Then - 'Next pokemon is selected by the opponent. - Else - SwitchInOpp(BattleScreen, False, index) - End If - Else - GainEXP(BattleScreen) - - ChangeCameraAngle(1, False, BattleScreen) - BattleScreen.BattleQuery.Add(New ToggleEntityQueryObject(True, ToggleEntityQueryObject.BattleEntities.OppPokemon, 2, -1, -1, -1, -1)) + 'Next pokemon is selected by the opponent. + Else + SwitchInOpp(BattleScreen, False, index) + End If + Else + GainEXP(BattleScreen) If message = "" Then - message = BattleScreen.Trainer.Name & ": ""Come back, " & BattleScreen.OppPokemon.GetDisplayName() & "!""" - End If + message = BattleScreen.Trainer.Name & ": ""Come back, " & BattleScreen.OppPokemon.GetDisplayName() & "!""" + End If - BattleScreen.BattleQuery.Add(New TextQueryObject(message)) + BattleScreen.BattleQuery.Add(New TextQueryObject(message)) + + Dim BallReturn As AnimationQueryObject = New AnimationQueryObject(BattleScreen.OppPokemonNPC, True, BattleScreen.OppPokemonModel) + + ' Ball Closes + BallReturn.AnimationPlaySound("Battle\Pokeball\Open", 0, 0) + Dim SmokeReturned As Integer = 0 + Do + Dim SmokePosition = New Vector3(CSng(Random.Next(-10, 10) / 10), CSng(Random.Next(-10, 10) / 10), CSng(Random.Next(-10, 10) / 10)) + Dim SmokeDestination = New Vector3(0, 0, 0) + + Dim SmokeTexture As String = "Textures\Battle\Cloud" + + Dim SmokeScale = New Vector3(CSng(Random.Next(2, 6) / 10)) + Dim SmokeSpeed = CSng(Random.Next(1, 3) / 10.0F) + + BallReturn.AnimationSpawnMovingEntity(SmokePosition.X, SmokePosition.Y, SmokePosition.Z, SmokeTexture, SmokeScale.X, SmokeScale.Y, SmokeScale.Z, SmokeDestination.X, SmokeDestination.Y, SmokeDestination.Z, SmokeSpeed, False, False, 0.0F, 0.0F) + Threading.Interlocked.Increment(SmokeReturned) + Loop While SmokeReturned <= 38 + + ' Pokemon disappears + BallReturn.AnimationFadePokemonEntity(1, False, 0, 1, 0) + BallReturn.AnimationMovePokemonEntity(0, 0.5, 0, 0.5, False, False, 2, 0,,, 4) + + ' Ball returns + BallReturn.AnimationPlaySound("Battle\Pokeball\Throw", 1, 0) + BallReturn.AnimationSpawnMovingEntity(0, 0, 0, BattleScreen.OppPokemon.CatchBall.TextureSource, 0.3F, 0.3F, 0.3F, -2, 0, 0, 0.1, False, True, 1, 0,, 0.3) + + BattleScreen.BattleQuery.Add(BallReturn) EndBattle(EndBattleReasons.WinTrainer, BattleScreen, False) - If BattleScreen.IsRemoteBattle = True Then - EndBattle(EndBattleReasons.WinTrainer, BattleScreen, True) - End If - End If - End If - End Sub + If BattleScreen.IsRemoteBattle = True Then + EndBattle(EndBattleReasons.WinTrainer, BattleScreen, True) + End If + End If + End If + End Sub - Public Sub ApplyOppBatonPass(ByVal BattleScreen As BattleScreen) - If BattleScreen.FieldEffects.OppUsedBatonPass = True Then - BattleScreen.FieldEffects.OppUsedBatonPass = False + Public Sub ApplyOppBatonPass(ByVal BattleScreen As BattleScreen) + If BattleScreen.FieldEffects.OppUsedBatonPass = True Then + BattleScreen.FieldEffects.OppUsedBatonPass = False - BattleScreen.OppPokemon.StatAttack = BattleScreen.FieldEffects.OppBatonPassStats(0) - BattleScreen.OppPokemon.StatDefense = BattleScreen.FieldEffects.OppBatonPassStats(1) - BattleScreen.OppPokemon.StatSpAttack = BattleScreen.FieldEffects.OppBatonPassStats(2) - BattleScreen.OppPokemon.StatSpDefense = BattleScreen.FieldEffects.OppBatonPassStats(3) - BattleScreen.OppPokemon.StatSpeed = BattleScreen.FieldEffects.OppBatonPassStats(4) - BattleScreen.OppPokemon.Evasion = BattleScreen.FieldEffects.OppBatonPassStats(5) - BattleScreen.OppPokemon.Accuracy = BattleScreen.FieldEffects.OppBatonPassStats(6) + BattleScreen.OppPokemon.StatAttack = BattleScreen.FieldEffects.OppBatonPassStats(0) + BattleScreen.OppPokemon.StatDefense = BattleScreen.FieldEffects.OppBatonPassStats(1) + BattleScreen.OppPokemon.StatSpAttack = BattleScreen.FieldEffects.OppBatonPassStats(2) + BattleScreen.OppPokemon.StatSpDefense = BattleScreen.FieldEffects.OppBatonPassStats(3) + BattleScreen.OppPokemon.StatSpeed = BattleScreen.FieldEffects.OppBatonPassStats(4) + BattleScreen.OppPokemon.Evasion = BattleScreen.FieldEffects.OppBatonPassStats(5) + BattleScreen.OppPokemon.Accuracy = BattleScreen.FieldEffects.OppBatonPassStats(6) - If BattleScreen.FieldEffects.OppBatonPassConfusion = True Then - BattleScreen.FieldEffects.OppBatonPassConfusion = False - BattleScreen.OppPokemon.AddVolatileStatus(Pokemon.VolatileStatus.Confusion) - End If - End If - End Sub + If BattleScreen.FieldEffects.OppBatonPassConfusion = True Then + BattleScreen.FieldEffects.OppBatonPassConfusion = False + BattleScreen.OppPokemon.AddVolatileStatus(Pokemon.VolatileStatus.Confusion) + End If + End If + End Sub - Public Sub SwitchInOpp(ByVal BattleScreen As BattleScreen, ByVal FirstTime As Boolean, ByVal index As Integer) + Public Sub SwitchInOpp(ByVal BattleScreen As BattleScreen, ByVal FirstTime As Boolean, ByVal index As Integer) - If FirstTime = False Then - HasSwitchedInOpp = True - ChangeCameraAngle(1, False, BattleScreen) + If FirstTime = False Then + HasSwitchedInOpp = True BattleScreen.BattleQuery.Add(New TextQueryObject(BattleScreen.Trainer.Name & ": ""Come back, " & BattleScreen.OppPokemon.GetDisplayName() & "!""")) + Dim BallReturn As AnimationQueryObject = New AnimationQueryObject(BattleScreen.OppPokemonNPC, True, BattleScreen.OppPokemonModel) + + ' Ball Closes + BallReturn.AnimationPlaySound("Battle\Pokeball\Open", 0, 0) + Dim SmokeReturned As Integer = 0 + Do + Dim SmokePosition = New Vector3(CSng(Random.Next(-10, 10) / 10), CSng(Random.Next(-10, 10) / 10), CSng(Random.Next(-10, 10) / 10)) + Dim SmokeDestination = New Vector3(0, 0, 0) + + Dim SmokeTexture As String = "Textures\Battle\Cloud" + + Dim SmokeScale = New Vector3(CSng(Random.Next(2, 6) / 10)) + Dim SmokeSpeed = CSng(Random.Next(1, 3) / 10.0F) + + BallReturn.AnimationSpawnMovingEntity(SmokePosition.X, SmokePosition.Y, SmokePosition.Z, SmokeTexture, SmokeScale.X, SmokeScale.Y, SmokeScale.Z, SmokeDestination.X, SmokeDestination.Y, SmokeDestination.Z, SmokeSpeed, False, False, 0.0F, 0.0F) + Threading.Interlocked.Increment(SmokeReturned) + Loop While SmokeReturned <= 38 + + ' Pokemon disappears + BallReturn.AnimationFadePokemonEntity(1, False, 0, 1, 0) + BallReturn.AnimationMovePokemonEntity(0, 0.5, 0, 0.5, False, False, 2, 0,,, 4) + + ' Ball returns + BallReturn.AnimationPlaySound("Battle\Pokeball\Throw", 1, 0) + BallReturn.AnimationSpawnMovingEntity(0, 0, 0, BattleScreen.OppPokemon.CatchBall.TextureSource, 0.3F, 0.3F, 0.3F, -2, 0, 0, 0.1, False, True, 1, 0,, 0.3) + + BattleScreen.BattleQuery.Add(BallReturn) + BattleScreen.SendInNewTrainerPokemon(index) - Me.ApplyOppBatonPass(BattleScreen) + Me.ApplyOppBatonPass(BattleScreen) - If BattleScreen.ParticipatedPokemon.Contains(BattleScreen.OwnPokemonIndex) = False Then - BattleScreen.ParticipatedPokemon.Add(BattleScreen.OwnPokemonIndex) - End If + If BattleScreen.ParticipatedPokemon.Contains(BattleScreen.OwnPokemonIndex) = False Then + BattleScreen.ParticipatedPokemon.Add(BattleScreen.OwnPokemonIndex) + End If - Dim oppShiny As String = "N" - If BattleScreen.OppPokemon.IsShiny = True Then - oppShiny = "S" - End If + Dim oppShiny As String = "N" + If BattleScreen.OppPokemon.IsShiny = True Then + oppShiny = "S" + End If - Dim oppModel As String = BattleScreen.GetModelName(False) + Dim oppModel As String = BattleScreen.GetModelName(False) - If oppModel = "" Then - BattleScreen.BattleQuery.Add(New ToggleEntityQueryObject(True, ToggleEntityQueryObject.BattleEntities.OppPokemon, PokemonForms.GetOverworldSpriteName(BattleScreen.OppPokemon), -1, -1, 0, 1)) - Else - BattleScreen.BattleQuery.Add(New ToggleEntityQueryObject(False, oppModel, -1, -1, 1, 0)) - End If + If oppModel = "" Then + BattleScreen.BattleQuery.Add(New ToggleEntityQueryObject(True, ToggleEntityQueryObject.BattleEntities.OppPokemon, PokemonForms.GetOverworldSpriteName(BattleScreen.OppPokemon), -1, -1, 0, 1)) + Else + BattleScreen.BattleQuery.Add(New ToggleEntityQueryObject(False, oppModel, -1, -1, 1, 0)) + End If - BattleScreen.BattleQuery.Add(New ToggleEntityQueryObject(True, ToggleEntityQueryObject.BattleEntities.OppPokemon, 1, -1, -1, -1, -1)) - BattleScreen.BattleQuery.Add(New PlaySoundQueryObject(BattleScreen.OppPokemon.Number.ToString(), True)) + BattleScreen.BattleQuery.Add(New ToggleEntityQueryObject(True, ToggleEntityQueryObject.BattleEntities.OppPokemon, 1, -1, -1, -1, -1)) BattleScreen.BattleQuery.Add(New TextQueryObject(BattleScreen.Trainer.Name & ": ""Go, " & BattleScreen.OppPokemon.GetDisplayName() & "!""")) + + ' Ball is thrown + Dim BallThrow As AnimationQueryObject = New AnimationQueryObject(BattleScreen.OppPokemonNPC, True, BattleScreen.OppPokemonModel) + + BallThrow.AnimationPlaySound("Battle\Pokeball\Throw", 0, 0) + BallThrow.AnimationSpawnMovingEntity(-2, -0.15, 0, BattleScreen.OwnPokemon.CatchBall.TextureSource, 0.3F, 0.3F, 0.3F, 0, 0.35, 0, 0.1, False, True, 0F, 0F,, 0.3) + + ' Ball Opens + BallThrow.AnimationPlaySound("Battle\Pokeball\Open", 3, 0) + Dim SmokeSpawned As Integer = 0 + Do + Dim SmokePosition = New Vector3(0, 0.35, 0) + Dim SmokeDestination = New Vector3(CSng(Random.Next(-10, 10) / 10), CSng(Random.Next(-10, 10) / 10), CSng(Random.Next(-10, 10) / 10)) + + Dim SmokeTexture As String = "Textures\Battle\Cloud" + + Dim SmokeScale = New Vector3(CSng(Random.Next(2, 6) / 10)) + Dim SmokeSpeed = CSng(Random.Next(1, 3) / 10.0F) + + BallThrow.AnimationSpawnMovingEntity(SmokePosition.X, SmokePosition.Y, SmokePosition.Z, SmokeTexture, SmokeScale.X, SmokeScale.Y, SmokeScale.Z, SmokeDestination.X, SmokeDestination.Y, SmokeDestination.Z, SmokeSpeed, False, False, 3.0F, 0.0F) + Threading.Interlocked.Increment(SmokeSpawned) + Loop While SmokeSpawned <= 38 + + ' Pokemon appears + BallThrow.AnimationFadePokemonEntity(1, True, 1, 4, 0) + BallThrow.AnimationPlaySound(CStr(BattleScreen.OppPokemon.Number), 4, 0,, True) + + ' Pokémon falls down + BallThrow.AnimationMovePokemonEntity(0, 0, 0, 0.05F, False, False, 4, 0,,, 4) + + BattleScreen.BattleQuery.Add(BallThrow) End If - With BattleScreen - Dim p As Pokemon = .OppPokemon - Dim op As Pokemon = .OwnPokemon + With BattleScreen + Dim p As Pokemon = .OppPokemon + Dim op As Pokemon = .OwnPokemon - Dim spikeAffected As Boolean = True - Dim rockAffected As Boolean = True + Dim spikeAffected As Boolean = True + Dim rockAffected As Boolean = True - spikeAffected = BattleScreen.FieldEffects.IsGrounded(False, BattleScreen) + spikeAffected = BattleScreen.FieldEffects.IsGrounded(False, BattleScreen) - If spikeAffected = True Then - If .FieldEffects.OwnSpikes > 0 And p.Ability.Name.ToLower() <> "magic guard" Then - Dim spikeDamage As Double = 1D - Select Case .FieldEffects.OwnSpikes - Case 1 - spikeDamage = (p.MaxHP / 100) * 12.5D - Case 2 - spikeDamage = (p.MaxHP / 100) * 16.7D - Case 3 - spikeDamage = (p.MaxHP / 100) * 25D - End Select - ReduceHP(CInt(spikeDamage), False, True, BattleScreen, "The Spikes hurt " & p.GetDisplayName() & "!", "spikes") - End If - End If - 'Sticky Web - If spikeAffected = True Then - If .FieldEffects.OwnStickyWeb > 0 Then + If spikeAffected = True Then + If .FieldEffects.OwnSpikes > 0 And p.Ability.Name.ToLower() <> "magic guard" Then + Dim spikeDamage As Double = 1D + Select Case .FieldEffects.OwnSpikes + Case 1 + spikeDamage = (p.MaxHP / 100) * 12.5D + Case 2 + spikeDamage = (p.MaxHP / 100) * 16.7D + Case 3 + spikeDamage = (p.MaxHP / 100) * 25D + End Select + ReduceHP(CInt(spikeDamage), False, True, BattleScreen, "The Spikes hurt " & p.GetDisplayName() & "!", "spikes") + End If + End If + 'Sticky Web + If spikeAffected = True Then + If .FieldEffects.OwnStickyWeb > 0 Then - LowerStat(False, False, BattleScreen, "Speed", 1, "The opposing pokemon was caught in a Sticky Web!", "stickyweb") + LowerStat(False, False, BattleScreen, "Speed", 1, "The opposing pokemon was caught in a Sticky Web!", "stickyweb") - End If - End If - If spikeAffected = True Then - If .FieldEffects.OwnToxicSpikes > 0 And p.Status = Pokemon.StatusProblems.None And p.Type1.Type <> Element.Types.Poison And p.Type2.Type <> Element.Types.Poison Then - Select Case .FieldEffects.OwnToxicSpikes - Case 1 - InflictPoison(False, True, BattleScreen, False, "The Toxic Spikes hurt " & p.GetDisplayName() & "!", "toxicspikes") - Case 2 - InflictPoison(False, True, BattleScreen, True, "The Toxic Spikes hurt " & p.GetDisplayName() & "!", "toxicspikes") - End Select - End If - If .FieldEffects.OwnToxicSpikes > 0 Then - If p.Type1.Type = Element.Types.Poison Or p.Type2.Type = Element.Types.Poison Then - .BattleQuery.Add(New TextQueryObject(p.GetDisplayName() & " removed the Toxic Spikes!")) - .FieldEffects.OwnToxicSpikes = 0 - End If - End If - End If + End If + End If + If spikeAffected = True Then + If .FieldEffects.OwnToxicSpikes > 0 And p.Status = Pokemon.StatusProblems.None And p.Type1.Type <> Element.Types.Poison And p.Type2.Type <> Element.Types.Poison Then + Select Case .FieldEffects.OwnToxicSpikes + Case 1 + InflictPoison(False, True, BattleScreen, False, "The Toxic Spikes hurt " & p.GetDisplayName() & "!", "toxicspikes") + Case 2 + InflictPoison(False, True, BattleScreen, True, "The Toxic Spikes hurt " & p.GetDisplayName() & "!", "toxicspikes") + End Select + End If + If .FieldEffects.OwnToxicSpikes > 0 Then + If p.Type1.Type = Element.Types.Poison Or p.Type2.Type = Element.Types.Poison Then + .BattleQuery.Add(New TextQueryObject(p.GetDisplayName() & " removed the Toxic Spikes!")) + .FieldEffects.OwnToxicSpikes = 0 + End If + End If + End If - If rockAffected = True Then - If .FieldEffects.OwnStealthRock > 0 And p.Ability.Name.ToLower() <> "magic guard" Then - Dim rocksDamage As Double = 1D + If rockAffected = True Then + If .FieldEffects.OwnStealthRock > 0 And p.Ability.Name.ToLower() <> "magic guard" Then + Dim rocksDamage As Double = 1D - Dim effectiveness As Single = BattleCalculation.ReverseTypeEffectiveness(Element.GetElementMultiplier(New Element(Element.Types.Rock), p.Type1)) * BattleCalculation.ReverseTypeEffectiveness(Element.GetElementMultiplier(New Element(Element.Types.Rock), p.Type2)) - Select Case effectiveness - Case 0.25F - rocksDamage = (p.MaxHP / 100) * 3.125D - Case 0.5F - rocksDamage = (p.MaxHP / 100) * 6.25D - Case 1.0F - rocksDamage = (p.MaxHP / 100) * 12.5D - Case 2.0F - rocksDamage = (p.MaxHP / 100) * 25D - Case 4.0F - rocksDamage = (p.MaxHP / 100) * 50D - End Select + Dim effectiveness As Single = BattleCalculation.ReverseTypeEffectiveness(Element.GetElementMultiplier(New Element(Element.Types.Rock), p.Type1)) * BattleCalculation.ReverseTypeEffectiveness(Element.GetElementMultiplier(New Element(Element.Types.Rock), p.Type2)) + Select Case effectiveness + Case 0.25F + rocksDamage = (p.MaxHP / 100) * 3.125D + Case 0.5F + rocksDamage = (p.MaxHP / 100) * 6.25D + Case 1.0F + rocksDamage = (p.MaxHP / 100) * 12.5D + Case 2.0F + rocksDamage = (p.MaxHP / 100) * 25D + Case 4.0F + rocksDamage = (p.MaxHP / 100) * 50D + End Select - ReduceHP(CInt(rocksDamage), False, True, BattleScreen, "The Stealth Rocks hurt " & p.GetDisplayName() & "!", "stealthrocks") - End If - End If + ReduceHP(CInt(rocksDamage), False, True, BattleScreen, "The Stealth Rocks hurt " & p.GetDisplayName() & "!", "stealthrocks") + End If + End If - TriggerAbilityEffect(BattleScreen, False) - TriggerItemEffect(BattleScreen, False) + TriggerAbilityEffect(BattleScreen, False) + TriggerItemEffect(BattleScreen, False) - If .OppPokemon.Status = Pokemon.StatusProblems.Sleep Then - .FieldEffects.OppSleepTurns = Core.Random.Next(1, 4) - End If + If .OppPokemon.Status = Pokemon.StatusProblems.Sleep Then + .FieldEffects.OppSleepTurns = Core.Random.Next(1, 4) + End If - If BattleScreen.FieldEffects.OppHealingWish = True Then - BattleScreen.FieldEffects.OppHealingWish = False + If BattleScreen.FieldEffects.OppHealingWish = True Then + BattleScreen.FieldEffects.OppHealingWish = False - If .OppPokemon.HP < .OppPokemon.MaxHP Or .OppPokemon.Status <> Pokemon.StatusProblems.None Then - GainHP(.OppPokemon.MaxHP - .OppPokemon.HP, False, False, BattleScreen, "The Healing Wish came true for " & .OppPokemon.GetDisplayName() & "!", "move:healingwish") - CureStatusProblem(False, False, BattleScreen, "", "move:healingwish") - End If - End If - End With - End Sub + If .OppPokemon.HP < .OppPokemon.MaxHP Or .OppPokemon.Status <> Pokemon.StatusProblems.None Then + GainHP(.OppPokemon.MaxHP - .OppPokemon.HP, False, False, BattleScreen, "The Healing Wish came true for " & .OppPokemon.GetDisplayName() & "!", "move:healingwish") + CureStatusProblem(False, False, BattleScreen, "", "move:healingwish") + End If + End If + End With + End Sub #End Region diff --git a/P3D/Pokemon/Attacks/Attack.vb b/P3D/Pokemon/Attacks/Attack.vb index 35b2af5b6..cf379b4c5 100644 --- a/P3D/Pokemon/Attacks/Attack.vb +++ b/P3D/Pokemon/Attacks/Attack.vb @@ -1844,7 +1844,7 @@ 'returnMove = New Moves.Fighting.MeteorAssault() 'Case 795 'returnMove = New Moves.Dragon.Eternabeam() - Case 796 + Case 796 returnMove = New Moves.Steel.SteelBeam() 'Case 797 'Blank @@ -2163,23 +2163,37 @@ #Region "Animation" - Public Sub UserPokemonMoveAnimation(ByVal BattleScreen As BattleScreen) + Public Sub UserPokemonMoveAnimation(ByVal BattleScreen As BattleScreen, ByVal own As Boolean) If Core.Player.ShowBattleAnimations = 1 Then - Me.InternalUserPokemonMoveAnimation(BattleScreen) + Dim CurrentPokemon As Pokemon = BattleScreen.OwnPokemon + Dim CurrentEntity As NPC = BattleScreen.OwnPokemonNPC + Dim CurrentModel As ModelEntity = BattleScreen.OwnPokemonModel + If own = False Then + CurrentEntity = BattleScreen.OppPokemonNPC + CurrentModel = BattleScreen.OppPokemonModel + End If + Me.InternalUserPokemonMoveAnimation(BattleScreen, own, CurrentPokemon, CurrentEntity, CurrentModel) End If End Sub - Public Overridable Sub InternalUserPokemonMoveAnimation(ByVal BattleScreen As BattleScreen) + Public Overridable Sub InternalUserPokemonMoveAnimation(ByVal BattleScreen As BattleScreen, ByVal own As Boolean, ByVal CurrentPokemon As Pokemon, ByVal CurrentEntity As NPC, ByVal CurrentModel As ModelEntity) 'Override this method in the attack class to insert the move animation query objects into the queue. End Sub - Public Sub OpponentPokemonMoveAnimation(ByVal BattleScreen As BattleScreen) + Public Sub OpponentPokemonMoveAnimation(ByVal BattleScreen As BattleScreen, ByVal own As Boolean) If Core.Player.ShowBattleAnimations = 1 Then - Me.InternalOpponentPokemonMoveAnimation(BattleScreen) + Dim CurrentPokemon As Pokemon = BattleScreen.OppPokemon + Dim CurrentEntity As NPC = BattleScreen.OppPokemonNPC + Dim CurrentModel As ModelEntity = BattleScreen.OppPokemonModel + If own = False Then + CurrentEntity = BattleScreen.OwnPokemonNPC + CurrentModel = BattleScreen.OwnPokemonModel + End If + Me.InternalOpponentPokemonMoveAnimation(BattleScreen, own, CurrentPokemon, CurrentEntity, CurrentModel) End If End Sub - Public Overridable Sub InternalOpponentPokemonMoveAnimation(ByVal BattleScreen As BattleScreen) + Public Overridable Sub InternalOpponentPokemonMoveAnimation(ByVal BattleScreen As BattleScreen, ByVal own As Boolean, ByVal CurrentPokemon As Pokemon, ByVal CurrentEntity As NPC, ByVal CurrentModel As ModelEntity) 'Override this method in the attack class to insert the move animation query objects into the queue. End Sub diff --git a/P3D/Pokemon/Attacks/Fire/Ember.vb b/P3D/Pokemon/Attacks/Fire/Ember.vb index 48a698f0d..bb5fae6fe 100644 --- a/P3D/Pokemon/Attacks/Fire/Ember.vb +++ b/P3D/Pokemon/Attacks/Fire/Ember.vb @@ -50,7 +50,6 @@ Me.IsOneHitKOMove = False Me.IsWonderGuardAffected = True '#End - Me.AIField1 = AIField.Damage Me.AIField2 = AIField.CanBurn @@ -58,19 +57,54 @@ End Sub Public Overrides Sub MoveHits(own As Boolean, BattleScreen As BattleScreen) - Dim p As Pokemon = BattleScreen.OwnPokemon - Dim op As Pokemon = BattleScreen.OppPokemon - If own = False Then - p = BattleScreen.OppPokemon - op = BattleScreen.OwnPokemon - End If - Dim chance As Integer = GetEffectChance(0, own, BattleScreen) If Core.Random.Next(0, 100) < chance Then BattleScreen.Battle.InflictBurn(Not own, own, BattleScreen, "", "move:ember") End If End Sub + Public Overrides Sub InternalUserPokemonMoveAnimation(ByVal BattleScreen As BattleScreen, ByVal own As Boolean, ByVal CurrentPokemon As Pokemon, ByVal CurrentEntity As NPC, ByVal CurrentModel As ModelEntity) + Dim MoveAnimation As AnimationQueryObject = New AnimationQueryObject(CurrentEntity, own) + MoveAnimation.AnimationSpawnMovingEntity(0.0, 0, 0.0, "Textures\Battle\Fire\FireBall", 0.5, 0.5, 0.5, 2.0, 0.0, 0.0, 0.05, False, True, 0.0, 0.0,, -0.5, 0) + MoveAnimation.AnimationPlaySound("Battle\Attacks\Ember_Start", 0, 0) + For i = 0 To 12 + MoveAnimation.AnimationSpawnFadingEntity(CSng(i * 0.2), 0.0, 0.0, "Textures\Battle\Fire\Smoke", 0.2, 0.2, 0.2, 0.02, False, 0.0, CSng(i * 0.2), 0.0) + i += 1 + Next + BattleScreen.BattleQuery.Add(MoveAnimation) + End Sub + + Public Overrides Sub InternalOpponentPokemonMoveAnimation(ByVal BattleScreen As BattleScreen, ByVal own As Boolean, ByVal CurrentPokemon As Pokemon, ByVal CurrentEntity As NPC, ByVal CurrentModel As ModelEntity) + Dim MoveAnimation As AnimationQueryObject = New AnimationQueryObject(CurrentEntity, own) + + MoveAnimation.AnimationSpawnMovingEntity(2.0, 0, 0.0, "Textures\Battle\Fire\FireBall", 0.5, 0.5, 0.5, 0.0, 0.0, 0.0, 0.05, False, True, 0.0, 0.0, 0.1, 0.5, 0) + For i = 0 To 12 + MoveAnimation.AnimationSpawnFadingEntity(CSng(3.0 - i * 0.2), 0.0, 0.0, "Textures\Battle\Fire\Smoke", 0.2, 0.2, 0.2, 0.02, False, 0.0, CSng(i * 0.2), 0.0) + i += 1 + Next + MoveAnimation.AnimationPlaySound("Battle\Attacks\Ember_Hit", 2, 0) + MoveAnimation.AnimationSpawnFadingEntity(-0.25, -0.25, -0.25, "Textures\Battle\Fire\Ember,0,0,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 1, 1) + MoveAnimation.AnimationSpawnFadingEntity(0.25, -0.25, 0.25, "Textures\Battle\Fire\Ember,0,0,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 1, 1) + MoveAnimation.AnimationSpawnFadingEntity(0.25, -0.25, -0.25, "Textures\Battle\Fire\Ember,0,0,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 1, 1) + + MoveAnimation.AnimationSpawnFadingEntity(-0.25, -0.25, -0.25, "Textures\Battle\Fire\Ember,0,32,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 2, 1) + MoveAnimation.AnimationSpawnFadingEntity(0.25, -0.25, 0.25, "Textures\Battle\Fire\Ember,0,32,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 2, 1) + MoveAnimation.AnimationSpawnFadingEntity(0.25, -0.25, -0.25, "Textures\Battle\Fire\Ember,0,32,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 2, 1) + + MoveAnimation.AnimationSpawnFadingEntity(-0.25, -0.25, -0.25, "Textures\Battle\Fire\Ember,0,64,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 3, 1) + MoveAnimation.AnimationSpawnFadingEntity(0.25, -0.25, 0.25, "Textures\Battle\Fire\Ember,0,64,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 3, 1) + MoveAnimation.AnimationSpawnFadingEntity(0.25, -0.25, -0.25, "Textures\Battle\Fire\Ember,0,64,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 3, 1) + + MoveAnimation.AnimationSpawnFadingEntity(-0.25, -0.25, -0.25, "Textures\Battle\Fire\Ember,0,96,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 4, 1) + MoveAnimation.AnimationSpawnFadingEntity(0.25, -0.25, 0.25, "Textures\Battle\Fire\Ember,0,96,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 4, 1) + MoveAnimation.AnimationSpawnFadingEntity(0.25, -0.25, -0.25, "Textures\Battle\Fire\Ember,0,96,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 4, 1) + + MoveAnimation.AnimationSpawnFadingEntity(-0.25, -0.25, -0.25, "Textures\Battle\Fire\Ember,0,128,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 5, 1) + MoveAnimation.AnimationSpawnFadingEntity(0.25, -0.25, 0.25, "Textures\Battle\Fire\Ember,0,128,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 5, 1) + MoveAnimation.AnimationSpawnFadingEntity(0.25, -0.25, -0.25, "Textures\Battle\Fire\Ember,0,128,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 5, 1) + + BattleScreen.BattleQuery.Add(MoveAnimation) + End Sub End Class End Namespace \ No newline at end of file diff --git a/P3D/Pokemon/Attacks/Normal/Growl.vb b/P3D/Pokemon/Attacks/Normal/Growl.vb index c42633558..5c35961e3 100644 --- a/P3D/Pokemon/Attacks/Normal/Growl.vb +++ b/P3D/Pokemon/Attacks/Normal/Growl.vb @@ -62,6 +62,15 @@ End If End Sub + Public Overrides Sub InternalUserPokemonMoveAnimation(ByVal BattleScreen As BattleScreen, ByVal own As Boolean, ByVal CurrentPokemon As Pokemon, ByVal CurrentEntity As NPC, ByVal CurrentModel As ModelEntity) + Dim MoveAnimation As AnimationQueryObject = New AnimationQueryObject(CurrentEntity, own) + MoveAnimation.AnimationPlaySound(CStr(CurrentPokemon.Number), 0, 0,, True) + MoveAnimation.AnimationSpawnFadingEntity(0.25, -0.25, -0.25, "Textures\Battle\Normal\Growl,0,0,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 0, 1) + MoveAnimation.AnimationSpawnFadingEntity(0.25, -0.25, -0.25, "Textures\Battle\Normal\Growl,0,32,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 1, 1) + MoveAnimation.AnimationSpawnFadingEntity(0.25, -0.25, -0.25, "Textures\Battle\Normal\Growl,0,0,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 2, 1) + MoveAnimation.AnimationSpawnFadingEntity(0.25, -0.25, -0.25, "Textures\Battle\Normal\Growl,0,32,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 3, 1) + BattleScreen.BattleQuery.Add(MoveAnimation) + End Sub End Class End Namespace \ No newline at end of file diff --git a/P3D/Pokemon/Attacks/Normal/Pound.vb b/P3D/Pokemon/Attacks/Normal/Pound.vb index 2f542a2ab..467c5891d 100644 --- a/P3D/Pokemon/Attacks/Normal/Pound.vb +++ b/P3D/Pokemon/Attacks/Normal/Pound.vb @@ -55,6 +55,13 @@ Me.AIField2 = AIField.Nothing End Sub + Public Overrides Sub InternalUserPokemonMoveAnimation(ByVal BattleScreen As BattleScreen, ByVal own As Boolean, ByVal CurrentPokemon As Pokemon, ByVal CurrentEntity As NPC, ByVal CurrentModel As ModelEntity) + Dim MoveAnimation As AnimationQueryObject = New AnimationQueryObject(CurrentEntity, own) + MoveAnimation.AnimationPlaySound("Battle\Attacks\Pound", 0.5, 2.5) + MoveAnimation.AnimationSpawnFadingEntity(0, -0.25, 0, "Textures\Battle\Normal\Pound", 0.5, 0.5, 0.5, 0.02, False, 1.0, 0, 3) + BattleScreen.BattleQuery.Add(MoveAnimation) + End Sub + End Class End Namespace \ No newline at end of file diff --git a/P3D/Pokemon/Attacks/Normal/Tackle.vb b/P3D/Pokemon/Attacks/Normal/Tackle.vb index 36b8ca00f..6d8954700 100644 --- a/P3D/Pokemon/Attacks/Normal/Tackle.vb +++ b/P3D/Pokemon/Attacks/Normal/Tackle.vb @@ -52,6 +52,19 @@ '#End End Sub + Public Overrides Sub InternalUserPokemonMoveAnimation(ByVal BattleScreen As BattleScreen, ByVal own As Boolean, ByVal CurrentPokemon As Pokemon, ByVal CurrentEntity As NPC, ByVal CurrentModel As ModelEntity) + Dim MoveAnimation As AnimationQueryObject = New AnimationQueryObject(CurrentEntity, own, CurrentModel) + MoveAnimation.AnimationMovePokemonEntity(0.5, 0, 0, 0.3, False, False, 0, 0,,, 2) + MoveAnimation.AnimationMovePokemonEntity(0, 0, 0, 0.3, False, False, 1, 0,,, 2) + BattleScreen.BattleQuery.Add(MoveAnimation) + End Sub + + Public Overrides Sub InternalOpponentPokemonMoveAnimation(ByVal BattleScreen As BattleScreen, ByVal own As Boolean, ByVal CurrentPokemon As Pokemon, ByVal CurrentEntity As NPC, ByVal CurrentModel As ModelEntity) + Dim MoveAnimation As AnimationQueryObject = New AnimationQueryObject(CurrentEntity, own) + MoveAnimation.AnimationPlaySound("Battle\Attacks\Tackle", 0, 2) + MoveAnimation.AnimationSpawnFadingEntity(0, -0.25, 0, "Textures\Battle\Normal\Tackle", 0.5, 0.5, 0.5, 0.02, False, 1.0, 0, 2) + BattleScreen.BattleQuery.Add(MoveAnimation) + End Sub End Class End Namespace \ No newline at end of file diff --git a/P3D/Pokemon/Attacks/Poison/PoisonSting.vb b/P3D/Pokemon/Attacks/Poison/PoisonSting.vb index 7e857aa53..36622416b 100644 --- a/P3D/Pokemon/Attacks/Poison/PoisonSting.vb +++ b/P3D/Pokemon/Attacks/Poison/PoisonSting.vb @@ -65,6 +65,36 @@ End If End Sub + Public Overrides Sub InternalUserPokemonMoveAnimation(ByVal BattleScreen As BattleScreen, ByVal own As Boolean, ByVal CurrentPokemon As Pokemon, ByVal CurrentEntity As NPC, ByVal CurrentModel As ModelEntity) + Dim MoveAnimation As AnimationQueryObject = New AnimationQueryObject(CurrentEntity, own) + MoveAnimation.AnimationSpawnMovingEntity(0.0, 0, 0.0, "Textures\Battle\Poison\Stinger", 0.5, 0.5, 0.5, 2.0, 0.0, 0.0, 0.05, False, False, 0.0, 0.0,,, 0) + MoveAnimation.AnimationPlaySound("Battle\Attacks\PoisonSting_Start", 0, 0) + BattleScreen.BattleQuery.Add(MoveAnimation) + End Sub + + Public Overrides Sub InternalOpponentPokemonMoveAnimation(ByVal BattleScreen As BattleScreen, ByVal own As Boolean, ByVal CurrentPokemon As Pokemon, ByVal CurrentEntity As NPC, ByVal CurrentModel As ModelEntity) + Dim MoveAnimation As AnimationQueryObject = New AnimationQueryObject(CurrentEntity, own) + + MoveAnimation.AnimationSpawnMovingEntity(2.0, 0, 0.0, "Textures\Battle\Poison\Stinger", 0.5, 0.5, 0.5, 0.0, 0.0, 0.0, 0.05, False, False, 0.0, 0.0,,, 0) + + MoveAnimation.AnimationPlaySound("Battle\Attacks\PoisonSting_Hit", 1, 0) + MoveAnimation.AnimationSpawnFadingEntity(-0.25, -0.25, -0.25, "Textures\Battle\Poison\Bubble,0,0,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 1, 1) + + MoveAnimation.AnimationSpawnFadingEntity(-0.25, -0.25, -0.25, "Textures\Battle\Poison\Bubble,0,32,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 2, 1) + MoveAnimation.AnimationSpawnFadingEntity(0.25, -0.25, 0.25, "Textures\Battle\Poison\Bubble,0,0,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 2, 1) + + MoveAnimation.AnimationSpawnFadingEntity(-0.25, -0.25, -0.25, "Textures\Battle\Poison\Bubble,0,64,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 3, 1) + MoveAnimation.AnimationSpawnFadingEntity(0.25, -0.25, 0.25, "Textures\Battle\Poison\Bubble,0,32,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 3, 1) + MoveAnimation.AnimationSpawnFadingEntity(0.25, -0.25, -0.25, "Textures\Battle\Poison\Bubble,0,0,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 3, 1) + + MoveAnimation.AnimationSpawnFadingEntity(0.25, -0.25, 0.25, "Textures\Battle\Poison\Bubble,0,64,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 4, 1) + MoveAnimation.AnimationSpawnFadingEntity(0.25, -0.25, -0.25, "Textures\Battle\Poison\Bubble,0,32,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 4, 1) + + MoveAnimation.AnimationSpawnFadingEntity(0.25, -0.25, -0.25, "Textures\Battle\Poison\Bubble,0,64,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 5, 2) + + BattleScreen.BattleQuery.Add(MoveAnimation) + End Sub + End Class End Namespace \ No newline at end of file From 09e5661729dee9a1682d442235c688a7f3ab8c02 Mon Sep 17 00:00:00 2001 From: JappaWakka Date: Sat, 2 Oct 2021 17:40:48 +0200 Subject: [PATCH 02/57] Fix Burned animation error --- P3D/Battle/BattleSystemV2/Battle.vb | 32 ++++++++++++++--------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/P3D/Battle/BattleSystemV2/Battle.vb b/P3D/Battle/BattleSystemV2/Battle.vb index 2b322aaa2..2b69ba9cc 100644 --- a/P3D/Battle/BattleSystemV2/Battle.vb +++ b/P3D/Battle/BattleSystemV2/Battle.vb @@ -2705,13 +2705,13 @@ p.Status = Pokemon.StatusProblems.Burn ChangeCameraAngle(1, own, BattleScreen) 'Burn animation - Dim BurnAnimation As AnimationQueryObject = New AnimationQueryObject(pNPC, own) + Dim BurnAnimation As AnimationQueryObject = New AnimationQueryObject(CType(pNPC, NPC), own) BurnAnimation.AnimationPlaySound("Battle\Effects\Burned", 0, 0) - MoveAnimation.AnimationSpawnFadingEntity(0.25, -0.25, -0.25, "Textures\Battle\Fire\Ember,0,0,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 1, 1) - MoveAnimation.AnimationSpawnFadingEntity(0.25, -0.25, -0.25, "Textures\Battle\Fire\Ember,0,32,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 2, 1) - MoveAnimation.AnimationSpawnFadingEntity(0.25, -0.25, -0.25, "Textures\Battle\Fire\Ember,0,64,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 3, 1) - MoveAnimation.AnimationSpawnFadingEntity(0.25, -0.25, -0.25, "Textures\Battle\Fire\Ember,0,96,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 4, 1) - MoveAnimation.AnimationSpawnFadingEntity(0.25, -0.25, -0.25, "Textures\Battle\Fire\Ember,0,128,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 5, 1) + BurnAnimation.AnimationSpawnFadingEntity(0.25, -0.25, -0.25, "Textures\Battle\Fire\Ember,0,0,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 1, 1) + BurnAnimation.AnimationSpawnFadingEntity(0.25, -0.25, -0.25, "Textures\Battle\Fire\Ember,0,32,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 2, 1) + BurnAnimation.AnimationSpawnFadingEntity(0.25, -0.25, -0.25, "Textures\Battle\Fire\Ember,0,64,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 3, 1) + BurnAnimation.AnimationSpawnFadingEntity(0.25, -0.25, -0.25, "Textures\Battle\Fire\Ember,0,96,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 4, 1) + BurnAnimation.AnimationSpawnFadingEntity(0.25, -0.25, -0.25, "Textures\Battle\Fire\Ember,0,128,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 5, 1) BattleScreen.BattleQuery.Add(BurnAnimation) Select Case message Case "" 'Print default message only @@ -5406,11 +5406,11 @@ 'Burn animation Dim BurnAnimation As AnimationQueryObject = New AnimationQueryObject(BattleScreen.OwnPokemonNPC, False) BurnAnimation.AnimationPlaySound("Battle\Effects\Burned", 0, 0) - MoveAnimation.AnimationSpawnFadingEntity(0.25, -0.25, -0.25, "Textures\Battle\Fire\Ember,0,0,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 1, 1) - MoveAnimation.AnimationSpawnFadingEntity(0.25, -0.25, -0.25, "Textures\Battle\Fire\Ember,0,32,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 2, 1) - MoveAnimation.AnimationSpawnFadingEntity(0.25, -0.25, -0.25, "Textures\Battle\Fire\Ember,0,64,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 3, 1) - MoveAnimation.AnimationSpawnFadingEntity(0.25, -0.25, -0.25, "Textures\Battle\Fire\Ember,0,96,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 4, 1) - MoveAnimation.AnimationSpawnFadingEntity(0.25, -0.25, -0.25, "Textures\Battle\Fire\Ember,0,128,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 5, 1) + BurnAnimation.AnimationSpawnFadingEntity(0.25, -0.25, -0.25, "Textures\Battle\Fire\Ember,0,0,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 1, 1) + BurnAnimation.AnimationSpawnFadingEntity(0.25, -0.25, -0.25, "Textures\Battle\Fire\Ember,0,32,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 2, 1) + BurnAnimation.AnimationSpawnFadingEntity(0.25, -0.25, -0.25, "Textures\Battle\Fire\Ember,0,64,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 3, 1) + BurnAnimation.AnimationSpawnFadingEntity(0.25, -0.25, -0.25, "Textures\Battle\Fire\Ember,0,96,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 4, 1) + BurnAnimation.AnimationSpawnFadingEntity(0.25, -0.25, -0.25, "Textures\Battle\Fire\Ember,0,128,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 5, 1) BattleScreen.BattleQuery.Add(BurnAnimation) 'Actual damage ReduceHP(reduceAmount, True, True, BattleScreen, .OwnPokemon.GetDisplayName() & " is hurt by the burn.", "burn") @@ -6197,11 +6197,11 @@ 'Burn animation Dim BurnAnimation As AnimationQueryObject = New AnimationQueryObject(BattleScreen.OppPokemonNPC, False) BurnAnimation.AnimationPlaySound("Battle\Effects\Burned", 0, 0) - MoveAnimation.AnimationSpawnFadingEntity(0.25, -0.25, -0.25, "Textures\Battle\Fire\Ember,0,0,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 1, 1) - MoveAnimation.AnimationSpawnFadingEntity(0.25, -0.25, -0.25, "Textures\Battle\Fire\Ember,0,32,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 2, 1) - MoveAnimation.AnimationSpawnFadingEntity(0.25, -0.25, -0.25, "Textures\Battle\Fire\Ember,0,64,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 3, 1) - MoveAnimation.AnimationSpawnFadingEntity(0.25, -0.25, -0.25, "Textures\Battle\Fire\Ember,0,96,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 4, 1) - MoveAnimation.AnimationSpawnFadingEntity(0.25, -0.25, -0.25, "Textures\Battle\Fire\Ember,0,128,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 5, 1) + BurnAnimation.AnimationSpawnFadingEntity(0.25, -0.25, -0.25, "Textures\Battle\Fire\Ember,0,0,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 1, 1) + BurnAnimation.AnimationSpawnFadingEntity(0.25, -0.25, -0.25, "Textures\Battle\Fire\Ember,0,32,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 2, 1) + BurnAnimation.AnimationSpawnFadingEntity(0.25, -0.25, -0.25, "Textures\Battle\Fire\Ember,0,64,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 3, 1) + BurnAnimation.AnimationSpawnFadingEntity(0.25, -0.25, -0.25, "Textures\Battle\Fire\Ember,0,96,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 4, 1) + BurnAnimation.AnimationSpawnFadingEntity(0.25, -0.25, -0.25, "Textures\Battle\Fire\Ember,0,128,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 5, 1) BattleScreen.BattleQuery.Add(BurnAnimation) 'Actual damage ReduceHP(reduceAmount, False, False, BattleScreen, .OppPokemon.GetDisplayName() & " is hurt by the burn.", "burn") From b95d4d1c694b1632463acf43f2feb92e3850eaa7 Mon Sep 17 00:00:00 2001 From: JappaWakka Date: Sun, 3 Oct 2021 11:02:18 +0200 Subject: [PATCH 03/57] Hit Animation + Restructure of attack sound effects + Absorb animation MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Attack sound effects are now in the folder of the type of their attack Pokémon flicker briefly when hit --- P3D/Battle/BattleSystemV2/Battle.vb | 9 +++++++ .../Attacks/{ => Electric}/Thunderbolt.wav | Bin .../Battle/Attacks/{ => Fire}/Ember_Hit.wav | Bin .../Battle/Attacks/{ => Fire}/Ember_Start.wav | Bin .../Battle/Attacks/{ => Flying}/Fly_Hit.wav | Bin .../Battle/Attacks/{ => Flying}/Fly_Start.wav | Bin .../Sounds/Battle/Attacks/Grass/Absorb.wav | Bin 0 -> 472456 bytes .../Battle/Attacks/{ => Normal}/Pound.wav | Bin .../Battle/Attacks/{ => Normal}/Tackle.wav | Bin .../Attacks/{ => Poison}/PoisonSting_Hit.wav | Bin .../{ => Poison}/PoisonSting_Start.wav | Bin P3D/Content/Textures/Battle/Grass/Absorb.png | Bin 0 -> 258 bytes P3D/P3D.vbproj | 24 +++++++++++------- P3D/Pokemon/Attacks/Fire/Ember.vb | 4 +-- P3D/Pokemon/Attacks/Grass/Absorb.vb | 16 ++++++++++++ P3D/Pokemon/Attacks/Normal/Pound.vb | 2 +- P3D/Pokemon/Attacks/Normal/Tackle.vb | 2 +- P3D/Pokemon/Attacks/Poison/PoisonSting.vb | 4 +-- P3D/Screens/Pokemon/HatchEggScreen.vb | 2 +- P3D/World/World.vb | 2 +- 20 files changed, 48 insertions(+), 17 deletions(-) rename P3D/Content/Sounds/Battle/Attacks/{ => Electric}/Thunderbolt.wav (100%) rename P3D/Content/Sounds/Battle/Attacks/{ => Fire}/Ember_Hit.wav (100%) rename P3D/Content/Sounds/Battle/Attacks/{ => Fire}/Ember_Start.wav (100%) rename P3D/Content/Sounds/Battle/Attacks/{ => Flying}/Fly_Hit.wav (100%) rename P3D/Content/Sounds/Battle/Attacks/{ => Flying}/Fly_Start.wav (100%) create mode 100644 P3D/Content/Sounds/Battle/Attacks/Grass/Absorb.wav rename P3D/Content/Sounds/Battle/Attacks/{ => Normal}/Pound.wav (100%) rename P3D/Content/Sounds/Battle/Attacks/{ => Normal}/Tackle.wav (100%) rename P3D/Content/Sounds/Battle/Attacks/{ => Poison}/PoisonSting_Hit.wav (100%) rename P3D/Content/Sounds/Battle/Attacks/{ => Poison}/PoisonSting_Start.wav (100%) create mode 100644 P3D/Content/Textures/Battle/Grass/Absorb.png diff --git a/P3D/Battle/BattleSystemV2/Battle.vb b/P3D/Battle/BattleSystemV2/Battle.vb index 2b69ba9cc..6247835f1 100644 --- a/P3D/Battle/BattleSystemV2/Battle.vb +++ b/P3D/Battle/BattleSystemV2/Battle.vb @@ -3978,8 +3978,10 @@ Public Sub ReduceHP(ByVal HPAmount As Integer, ByVal own As Boolean, ByVal from As Boolean, ByVal BattleScreen As BattleScreen, ByVal message As String, ByVal cause As String, ByVal sound As String) Dim p As Pokemon = BattleScreen.OwnPokemon + Dim pNPC As Entity = BattleScreen.OwnPokemonNPC If own = False Then p = BattleScreen.OppPokemon + pNPC = BattleScreen.OppPokemonNPC End If If p.HP > 0 And p.Status <> Pokemon.StatusProblems.Fainted Then @@ -3996,6 +3998,13 @@ BattleScreen.BattleQuery.Add(New PlaySoundQueryObject(sound, False, 0.0F)) End If + Dim HitAnimation As AnimationQueryObject = New AnimationQueryObject(CType(pNPC, NPC), own) + HitAnimation.AnimationFadePokemonEntity(1, False, 0, 0, 0) + HitAnimation.AnimationFadePokemonEntity(1, True, 1, 1, 0) + HitAnimation.AnimationFadePokemonEntity(1, False, 0, 2, 0) + HitAnimation.AnimationFadePokemonEntity(1, True, 1, 3, 0) + BattleScreen.BattleQuery.Add(HitAnimation) + If own = True Then BattleScreen.BattleQuery.Add(New MathHPQueryObject(p.HP, p.MaxHP, HPAmount, New Vector2(200, 256))) Else diff --git a/P3D/Content/Sounds/Battle/Attacks/Thunderbolt.wav b/P3D/Content/Sounds/Battle/Attacks/Electric/Thunderbolt.wav similarity index 100% rename from P3D/Content/Sounds/Battle/Attacks/Thunderbolt.wav rename to P3D/Content/Sounds/Battle/Attacks/Electric/Thunderbolt.wav diff --git a/P3D/Content/Sounds/Battle/Attacks/Ember_Hit.wav b/P3D/Content/Sounds/Battle/Attacks/Fire/Ember_Hit.wav similarity index 100% rename from P3D/Content/Sounds/Battle/Attacks/Ember_Hit.wav rename to P3D/Content/Sounds/Battle/Attacks/Fire/Ember_Hit.wav diff --git a/P3D/Content/Sounds/Battle/Attacks/Ember_Start.wav b/P3D/Content/Sounds/Battle/Attacks/Fire/Ember_Start.wav similarity index 100% rename from P3D/Content/Sounds/Battle/Attacks/Ember_Start.wav rename to P3D/Content/Sounds/Battle/Attacks/Fire/Ember_Start.wav diff --git a/P3D/Content/Sounds/Battle/Attacks/Fly_Hit.wav b/P3D/Content/Sounds/Battle/Attacks/Flying/Fly_Hit.wav similarity index 100% rename from P3D/Content/Sounds/Battle/Attacks/Fly_Hit.wav rename to P3D/Content/Sounds/Battle/Attacks/Flying/Fly_Hit.wav diff --git a/P3D/Content/Sounds/Battle/Attacks/Fly_Start.wav b/P3D/Content/Sounds/Battle/Attacks/Flying/Fly_Start.wav similarity index 100% rename from P3D/Content/Sounds/Battle/Attacks/Fly_Start.wav rename to P3D/Content/Sounds/Battle/Attacks/Flying/Fly_Start.wav diff --git a/P3D/Content/Sounds/Battle/Attacks/Grass/Absorb.wav b/P3D/Content/Sounds/Battle/Attacks/Grass/Absorb.wav new file mode 100644 index 0000000000000000000000000000000000000000..84c0f3f606b904a185a7f9d161686cf26b517608 GIT binary patch literal 472456 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%0A;j?LJbN(gQX7b9)D~- z>d<{px=II|M{-2(H?sCtXF#X<9+@Bhl7ARsZy)r!VT^D1z&!am_I=&WURUvb<*X}> zd*1|jo!`Hz+~2BiEN=}6KUU6t(i7bi-RXlGV`7`4T6!NI@=@VGpdK7D{S{^IcRcMR zsgh6;DwbhnO9Zy(*#(o%u;Z%^d^ zYXAOiH>gY?@x)hlL#ohITYThNSgCA3RAM;NuFxdcq1ZVbj~i0B`gti?3_#FPFj`ZC z8dPpitupx&^F&$HJGuMu;g(v`VmCDJeC{6)a9wO7WvV*6Iv{MOopd9Z9tGuLg-kfi z%gDz2@t5EvavLmAe>=>Alha)3+azpV=bn09UEylc^t+<6w`cJv4?)hkihL|oW)ph? zAQirAFCthsCClP8#-#uK{k~(u{->$a&Up?PDo}+i<|+ol$yJo8?An$`+{~TdM!7ciCnbA2A*$=_ z`sH}^3CYa7XHJ{C&Z+=tplW!icvcLBZ}!}Ag4W9!pXWy=J{YZ_hf0fOdGE!Q-==7& zx{{YwL2E-U|DxaThg8! zi#o%x!ADh!-^3bQ)mb~xF$4kxrxe^Ny-Ejy(UBzvN4+*MuAGaQRl}%uYNR@v5$&lzk5vlld|guSv<|aRp?#j`_za{FLoe&R z)OgG&L|Mnmf&^xxLvEaO4o453Z0JSnWrR$h-C8VVP&l1FwW0^?f2uoIEHXkZQ{Ao^ zQjOsXfq_j^-KklLIbT5%t%u3kyeSdt15as+Hd2r|QPsm$@+)6fh(S$FhBapA!R{?g zp1M-ii~BWTpJ36ZU1OaVLJqFh)Up+AZsE3BadxqslEq zKllGC>V5XvA3z;@8nM2~x}*Ptc|AN(^Go)xePX>;y&!P`fCUc);~o#+ak^sk;_cMj t9%An}EoN z5{}Nk1^bv6C_09+3#40C_DPf;2qxx9hi2l@VR uWrhj}KIMoKJKDU+NGg{fYT*J_1_q^_I}gqdn>h{WFa}RoKbLh*2~7aIOjlC? literal 0 HcmV?d00001 diff --git a/P3D/P3D.vbproj b/P3D/P3D.vbproj index f1927c233..7b6910788 100644 --- a/P3D/P3D.vbproj +++ b/P3D/P3D.vbproj @@ -14665,31 +14665,34 @@ PreserveNewest - + PreserveNewest - + PreserveNewest - + PreserveNewest - + PreserveNewest - + PreserveNewest - + PreserveNewest - + PreserveNewest - + PreserveNewest - + + PreserveNewest + + PreserveNewest @@ -15379,6 +15382,9 @@ PreserveNewest + + PreserveNewest + PreserveNewest diff --git a/P3D/Pokemon/Attacks/Fire/Ember.vb b/P3D/Pokemon/Attacks/Fire/Ember.vb index bb5fae6fe..6719f780d 100644 --- a/P3D/Pokemon/Attacks/Fire/Ember.vb +++ b/P3D/Pokemon/Attacks/Fire/Ember.vb @@ -66,7 +66,7 @@ Public Overrides Sub InternalUserPokemonMoveAnimation(ByVal BattleScreen As BattleScreen, ByVal own As Boolean, ByVal CurrentPokemon As Pokemon, ByVal CurrentEntity As NPC, ByVal CurrentModel As ModelEntity) Dim MoveAnimation As AnimationQueryObject = New AnimationQueryObject(CurrentEntity, own) MoveAnimation.AnimationSpawnMovingEntity(0.0, 0, 0.0, "Textures\Battle\Fire\FireBall", 0.5, 0.5, 0.5, 2.0, 0.0, 0.0, 0.05, False, True, 0.0, 0.0,, -0.5, 0) - MoveAnimation.AnimationPlaySound("Battle\Attacks\Ember_Start", 0, 0) + MoveAnimation.AnimationPlaySound("Battle\Attacks\Fire\Ember_Start", 0, 0) For i = 0 To 12 MoveAnimation.AnimationSpawnFadingEntity(CSng(i * 0.2), 0.0, 0.0, "Textures\Battle\Fire\Smoke", 0.2, 0.2, 0.2, 0.02, False, 0.0, CSng(i * 0.2), 0.0) i += 1 @@ -82,7 +82,7 @@ MoveAnimation.AnimationSpawnFadingEntity(CSng(3.0 - i * 0.2), 0.0, 0.0, "Textures\Battle\Fire\Smoke", 0.2, 0.2, 0.2, 0.02, False, 0.0, CSng(i * 0.2), 0.0) i += 1 Next - MoveAnimation.AnimationPlaySound("Battle\Attacks\Ember_Hit", 2, 0) + MoveAnimation.AnimationPlaySound("Battle\Attacks\Fire\Ember_Hit", 2, 0) MoveAnimation.AnimationSpawnFadingEntity(-0.25, -0.25, -0.25, "Textures\Battle\Fire\Ember,0,0,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 1, 1) MoveAnimation.AnimationSpawnFadingEntity(0.25, -0.25, 0.25, "Textures\Battle\Fire\Ember,0,0,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 1, 1) MoveAnimation.AnimationSpawnFadingEntity(0.25, -0.25, -0.25, "Textures\Battle\Fire\Ember,0,0,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 1, 1) diff --git a/P3D/Pokemon/Attacks/Grass/Absorb.vb b/P3D/Pokemon/Attacks/Grass/Absorb.vb index 4c0c2f7b7..a63495b58 100644 --- a/P3D/Pokemon/Attacks/Grass/Absorb.vb +++ b/P3D/Pokemon/Attacks/Grass/Absorb.vb @@ -92,6 +92,22 @@ End If End Sub + Public Overrides Sub InternalOpponentPokemonMoveAnimation(ByVal BattleScreen As BattleScreen, ByVal own As Boolean, ByVal CurrentPokemon As Pokemon, ByVal CurrentEntity As NPC, ByVal CurrentModel As ModelEntity) + Dim MoveAnimation As AnimationQueryObject = New AnimationQueryObject(CurrentEntity, own) + Dim maxAmount As Integer = 8 + Dim currentAmount As Integer = 0 + MoveAnimation.AnimationPlaySound("Battle\Attacks\Grass\Absorb", 0, 0) + While currentAmount <= maxAmount + Dim yPos As Single = CSng(Random.NextDouble() * 0.5) + Dim zPos As Single = CSng(Random.Next(-5, 5) * 0.15) + MoveAnimation.AnimationSpawnMovingEntity(0.0, 0, 0.0, "Textures\Battle\Grass\Absorb", 0.35, 0.35, 0.35, 1.5, yPos, zPos, 0.03, False, True, CSng(currentAmount), 0.0, 0.1, 0.5) + Threading.Interlocked.Increment(currentAmount) + End While + + BattleScreen.BattleQuery.Add(MoveAnimation) + End Sub End Class + + End Namespace diff --git a/P3D/Pokemon/Attacks/Normal/Pound.vb b/P3D/Pokemon/Attacks/Normal/Pound.vb index 467c5891d..25785556e 100644 --- a/P3D/Pokemon/Attacks/Normal/Pound.vb +++ b/P3D/Pokemon/Attacks/Normal/Pound.vb @@ -55,7 +55,7 @@ Me.AIField2 = AIField.Nothing End Sub - Public Overrides Sub InternalUserPokemonMoveAnimation(ByVal BattleScreen As BattleScreen, ByVal own As Boolean, ByVal CurrentPokemon As Pokemon, ByVal CurrentEntity As NPC, ByVal CurrentModel As ModelEntity) + Public Overrides Sub InternalOpponentPokemonMoveAnimation(ByVal BattleScreen As BattleScreen, ByVal own As Boolean, ByVal CurrentPokemon As Pokemon, ByVal CurrentEntity As NPC, ByVal CurrentModel As ModelEntity) Dim MoveAnimation As AnimationQueryObject = New AnimationQueryObject(CurrentEntity, own) MoveAnimation.AnimationPlaySound("Battle\Attacks\Pound", 0.5, 2.5) MoveAnimation.AnimationSpawnFadingEntity(0, -0.25, 0, "Textures\Battle\Normal\Pound", 0.5, 0.5, 0.5, 0.02, False, 1.0, 0, 3) diff --git a/P3D/Pokemon/Attacks/Normal/Tackle.vb b/P3D/Pokemon/Attacks/Normal/Tackle.vb index 6d8954700..c3a075d95 100644 --- a/P3D/Pokemon/Attacks/Normal/Tackle.vb +++ b/P3D/Pokemon/Attacks/Normal/Tackle.vb @@ -61,7 +61,7 @@ Public Overrides Sub InternalOpponentPokemonMoveAnimation(ByVal BattleScreen As BattleScreen, ByVal own As Boolean, ByVal CurrentPokemon As Pokemon, ByVal CurrentEntity As NPC, ByVal CurrentModel As ModelEntity) Dim MoveAnimation As AnimationQueryObject = New AnimationQueryObject(CurrentEntity, own) - MoveAnimation.AnimationPlaySound("Battle\Attacks\Tackle", 0, 2) + MoveAnimation.AnimationPlaySound("Battle\Attacks\Normal\Tackle", 0, 2) MoveAnimation.AnimationSpawnFadingEntity(0, -0.25, 0, "Textures\Battle\Normal\Tackle", 0.5, 0.5, 0.5, 0.02, False, 1.0, 0, 2) BattleScreen.BattleQuery.Add(MoveAnimation) End Sub diff --git a/P3D/Pokemon/Attacks/Poison/PoisonSting.vb b/P3D/Pokemon/Attacks/Poison/PoisonSting.vb index 36622416b..9684f8379 100644 --- a/P3D/Pokemon/Attacks/Poison/PoisonSting.vb +++ b/P3D/Pokemon/Attacks/Poison/PoisonSting.vb @@ -68,7 +68,7 @@ Public Overrides Sub InternalUserPokemonMoveAnimation(ByVal BattleScreen As BattleScreen, ByVal own As Boolean, ByVal CurrentPokemon As Pokemon, ByVal CurrentEntity As NPC, ByVal CurrentModel As ModelEntity) Dim MoveAnimation As AnimationQueryObject = New AnimationQueryObject(CurrentEntity, own) MoveAnimation.AnimationSpawnMovingEntity(0.0, 0, 0.0, "Textures\Battle\Poison\Stinger", 0.5, 0.5, 0.5, 2.0, 0.0, 0.0, 0.05, False, False, 0.0, 0.0,,, 0) - MoveAnimation.AnimationPlaySound("Battle\Attacks\PoisonSting_Start", 0, 0) + MoveAnimation.AnimationPlaySound("Battle\Attacks\Poison\PoisonSting_Start", 0, 0) BattleScreen.BattleQuery.Add(MoveAnimation) End Sub @@ -77,7 +77,7 @@ MoveAnimation.AnimationSpawnMovingEntity(2.0, 0, 0.0, "Textures\Battle\Poison\Stinger", 0.5, 0.5, 0.5, 0.0, 0.0, 0.0, 0.05, False, False, 0.0, 0.0,,, 0) - MoveAnimation.AnimationPlaySound("Battle\Attacks\PoisonSting_Hit", 1, 0) + MoveAnimation.AnimationPlaySound("Battle\Attacks\Poison\PoisonSting_Hit", 1, 0) MoveAnimation.AnimationSpawnFadingEntity(-0.25, -0.25, -0.25, "Textures\Battle\Poison\Bubble,0,0,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 1, 1) MoveAnimation.AnimationSpawnFadingEntity(-0.25, -0.25, -0.25, "Textures\Battle\Poison\Bubble,0,32,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 2, 1) diff --git a/P3D/Screens/Pokemon/HatchEggScreen.vb b/P3D/Screens/Pokemon/HatchEggScreen.vb index e4f2c31f1..7e1aa39c7 100644 --- a/P3D/Screens/Pokemon/HatchEggScreen.vb +++ b/P3D/Screens/Pokemon/HatchEggScreen.vb @@ -72,7 +72,7 @@ If Stage = 6 Then SoundManager.PlaySound("egg_hatch") Else - SoundManager.PlaySound("Battle\Attacks\Pound") + SoundManager.PlaySound("Battle\Attacks\Normal\Pound") End If Egg = GetEggTexture() diff --git a/P3D/World/World.vb b/P3D/World/World.vb index a53cc8e06..39a864436 100644 --- a/P3D/World/World.vb +++ b/P3D/World/World.vb @@ -717,7 +717,7 @@ endsub: If Core.Random.Next(0, 250) = 0 Then Dim pitch As Single = -(Core.Random.Next(8, 11) / 10.0F) Debug.Print(pitch.ToString()) - SoundManager.PlaySound("Battle\Attacks\Thunderbolt", pitch, 0F, SoundManager.Volume, False) + SoundManager.PlaySound("Battle\Attacks\Electric\Thunderbolt", pitch, 0F, SoundManager.Volume, False) End If End If From 7ff7f96a47da163a7a80f946a173ad59cad5be92 Mon Sep 17 00:00:00 2001 From: JappaWakka Date: Thu, 14 Oct 2021 01:21:10 +0200 Subject: [PATCH 04/57] Battle Animation System Rework about halfway done Updated to work with the new animation system: - Catch animation - Burn animation - Attack: Tackle --- .../{BABillMove.vb => BAEntityMove.vb} | 6 +- .../{BABillOpacity.vb => BAEntityOpacity.vb} | 2 +- P3D/Battle/BattleAnimations/BAEntityRotate.vb | 131 +++++++++++ .../{BABillSize.vb => BAEntityScale.vb} | 2 +- .../BattleAnimations/BAEntityTextureChange.vb | 21 ++ P3D/Battle/BattleAnimations/BAMove.vb | 2 +- P3D/Battle/BattleAnimations/BASize.vb | 106 --------- P3D/Battle/BattleSystemV2/Battle.vb | 122 ++++++----- .../QueryObjects/AnimationQueryObject.vb | 198 +++++++++-------- .../{Other/Star.png => BallCatchStar.png} | Bin P3D/P3D.vbproj | 11 +- P3D/Pokemon/Attacks/Normal/Tackle.vb | 4 +- P3D/Screens/Battle/BattleCatchScreen.vb | 207 +++++++++--------- 13 files changed, 448 insertions(+), 364 deletions(-) rename P3D/Battle/BattleAnimations/{BABillMove.vb => BAEntityMove.vb} (98%) rename P3D/Battle/BattleAnimations/{BABillOpacity.vb => BAEntityOpacity.vb} (97%) create mode 100644 P3D/Battle/BattleAnimations/BAEntityRotate.vb rename P3D/Battle/BattleAnimations/{BABillSize.vb => BAEntityScale.vb} (99%) create mode 100644 P3D/Battle/BattleAnimations/BAEntityTextureChange.vb delete mode 100644 P3D/Battle/BattleAnimations/BASize.vb rename P3D/Content/Textures/Battle/{Other/Star.png => BallCatchStar.png} (100%) diff --git a/P3D/Battle/BattleAnimations/BABillMove.vb b/P3D/Battle/BattleAnimations/BAEntityMove.vb similarity index 98% rename from P3D/Battle/BattleAnimations/BABillMove.vb rename to P3D/Battle/BattleAnimations/BAEntityMove.vb index 120d3b87f..8e7685f6f 100644 --- a/P3D/Battle/BattleAnimations/BABillMove.vb +++ b/P3D/Battle/BattleAnimations/BAEntityMove.vb @@ -1,4 +1,4 @@ -Public Class BABillMove +Public Class BAEntityMove Inherits BattleAnimation3D @@ -20,7 +20,7 @@ Linear End Enum - Public Sub New(ByRef entity As Entity, ByVal Destination As Vector3, ByVal Speed As Single, ByVal SpinX As Boolean, ByVal SpinZ As Boolean, ByVal startDelay As Single, ByVal endDelay As Single, Optional ByVal SpinXSpeed As Single = 0.1F, Optional ByVal SpinZSpeed As Single = 0.1F, Optional MovementCurve As Integer = 3) + Public Sub New(ByRef Entity As Entity, ByVal Destination As Vector3, ByVal Speed As Single, ByVal SpinX As Boolean, ByVal SpinZ As Boolean, ByVal startDelay As Single, ByVal endDelay As Single, Optional ByVal SpinXSpeed As Single = 0.1F, Optional ByVal SpinZSpeed As Single = 0.1F, Optional MovementCurve As Integer = 3) MyBase.New(New Vector3(0.0F), TextureManager.DefaultTexture, New Vector3(1.0F), startDelay, endDelay) Me.Destination = Destination @@ -33,7 +33,7 @@ Me.SpinSpeedZ = SpinZSpeed Me.Visible = False - Me.TargetEntity = entity + Me.TargetEntity = Entity Select Case MovementCurve Case Curves.EaseIn diff --git a/P3D/Battle/BattleAnimations/BABillOpacity.vb b/P3D/Battle/BattleAnimations/BAEntityOpacity.vb similarity index 97% rename from P3D/Battle/BattleAnimations/BABillOpacity.vb rename to P3D/Battle/BattleAnimations/BAEntityOpacity.vb index e2bc7e3d8..959d733b5 100644 --- a/P3D/Battle/BattleAnimations/BABillOpacity.vb +++ b/P3D/Battle/BattleAnimations/BAEntityOpacity.vb @@ -1,4 +1,4 @@ -Public Class BABillOpacity +Public Class BAEntityOpacity Inherits BattleAnimation3D diff --git a/P3D/Battle/BattleAnimations/BAEntityRotate.vb b/P3D/Battle/BattleAnimations/BAEntityRotate.vb new file mode 100644 index 000000000..cbcda0f7b --- /dev/null +++ b/P3D/Battle/BattleAnimations/BAEntityRotate.vb @@ -0,0 +1,131 @@ +Public Class BAEntityRotate + + Inherits BattleAnimation3D + + Dim TargetEntity As Entity + Dim RotationSpeedVector As Vector3 + Dim EndRotation As Vector3 + Dim DoReturn As Boolean = False + Dim ReturnVector As Vector3 + Dim hasReturned As Boolean = False + Dim DoRotation As Vector3 = New Vector3(1.0F) + + Public Sub New(ByVal Entity As Entity, ByVal RotationSpeedVector As Vector3, ByVal EndRotation As Vector3, ByVal startDelay As Single, ByVal endDelay As Single) + MyBase.New(New Vector3(0.0F), TextureManager.DefaultTexture, New Vector3(1.0F), startDelay, endDelay) + + Me.RotationSpeedVector = RotationSpeedVector + Me.EndRotation = EndRotation + Me.ReturnVector = Me.Rotation + Me.TargetEntity = Entity + End Sub + + Public Sub New(ByVal Entity As Entity, ByVal RotationSpeedVector As Vector3, ByVal EndRotation As Vector3, ByVal startDelay As Single, ByVal endDelay As Single, ByVal DoXRotation As Boolean, ByVal DoYRotation As Boolean, ByVal DoZRotation As Boolean) + Me.New(Entity, RotationSpeedVector, EndRotation, startDelay, endDelay) + + If DoXRotation = False Then + DoRotation.X = 0.0F + End If + If DoYRotation = False Then + DoRotation.Y = 0.0F + End If + If DoZRotation = False Then + DoRotation.Z = 0.0F + End If + End Sub + + Public Sub New(ByVal Entity As Entity, ByVal RotationSpeedVector As Vector3, ByVal EndRotation As Vector3, ByVal startDelay As Single, ByVal endDelay As Single, ByVal DoXRotation As Boolean, ByVal DoYRotation As Boolean, ByVal DoZRotation As Boolean, ByVal DoReturn As Boolean) + Me.New(Entity, RotationSpeedVector, EndRotation, startDelay, endDelay, DoXRotation, DoYRotation, DoZRotation) + + Me.DoReturn = DoReturn + End Sub + + Public Overrides Sub DoActionActive() + If VectorReached() = False Then + + If DoRotation.X = 1.0F Then + If TargetEntity.Rotation.X > Me.EndRotation.X Then + TargetEntity.Rotation.X += Me.RotationSpeedVector.X + + If TargetEntity.Rotation.X <= Me.EndRotation.X Then + TargetEntity.Rotation.X = Me.EndRotation.X + End If + ElseIf TargetEntity.Rotation.X < Me.EndRotation.X Then + TargetEntity.Rotation.X += Me.RotationSpeedVector.X + + If TargetEntity.Rotation.X >= Me.EndRotation.X Then + TargetEntity.Rotation.X = Me.EndRotation.X + End If + End If + End If + + If DoRotation.Y = 1.0F Then + If TargetEntity.Rotation.Y > Me.EndRotation.Y Then + TargetEntity.Rotation.Y += Me.RotationSpeedVector.Y + + If TargetEntity.Rotation.Y <= Me.EndRotation.Y Then + TargetEntity.Rotation.Y = Me.EndRotation.Y + End If + ElseIf TargetEntity.Rotation.Y < Me.EndRotation.Y Then + TargetEntity.Rotation.Y += Me.RotationSpeedVector.Y + + If TargetEntity.Rotation.Y >= Me.EndRotation.Y Then + TargetEntity.Rotation.Y = Me.EndRotation.Y + End If + End If + End If + + If DoRotation.Z = 1.0F Then + If TargetEntity.Rotation.Z > Me.EndRotation.Z Then + TargetEntity.Rotation.Z += Me.RotationSpeedVector.Z + + If TargetEntity.Rotation.Z <= Me.EndRotation.Z Then + TargetEntity.Rotation.Z = Me.EndRotation.Z + End If + ElseIf TargetEntity.Rotation.Z < Me.EndRotation.Z Then + TargetEntity.Rotation.Z += Me.RotationSpeedVector.Z + + If TargetEntity.Rotation.Z >= Me.EndRotation.Z Then + TargetEntity.Rotation.Z = Me.EndRotation.Z + End If + End If + End If + + If VectorReached() = True Then + RotationReady() + End If + Else + RotationReady() + End If + End Sub + + Private Sub RotationReady() + If Me.DoReturn = True And Me.hasReturned = False Then + Me.hasReturned = True + Me.EndRotation = Me.ReturnVector + Me.RotationSpeedVector = New Vector3(Me.RotationSpeedVector.X * -1, Me.RotationSpeedVector.Y * -1, Me.RotationSpeedVector.Z * -1) + Else + Me.Ready = True + End If + End Sub + + Private Function VectorReached() As Boolean + If DoRotation.X = 1.0F Then + If EndRotation.X <> TargetEntity.Rotation.X Then + Return False + End If + End If + If DoRotation.Y = 1.0F Then + If EndRotation.Y <> TargetEntity.Rotation.Y Then + Return False + End If + End If + If DoRotation.Z = 1.0F Then + If EndRotation.Z <> TargetEntity.Rotation.Z Then + Return False + End If + End If + + Return True + End Function + +End Class \ No newline at end of file diff --git a/P3D/Battle/BattleAnimations/BABillSize.vb b/P3D/Battle/BattleAnimations/BAEntityScale.vb similarity index 99% rename from P3D/Battle/BattleAnimations/BABillSize.vb rename to P3D/Battle/BattleAnimations/BAEntityScale.vb index ce7ff373a..24d1245ea 100644 --- a/P3D/Battle/BattleAnimations/BABillSize.vb +++ b/P3D/Battle/BattleAnimations/BAEntityScale.vb @@ -1,4 +1,4 @@ -Public Class BABillSize +Public Class BAEntityScale Inherits BattleAnimation3D diff --git a/P3D/Battle/BattleAnimations/BAEntityTextureChange.vb b/P3D/Battle/BattleAnimations/BAEntityTextureChange.vb new file mode 100644 index 000000000..4b266b706 --- /dev/null +++ b/P3D/Battle/BattleAnimations/BAEntityTextureChange.vb @@ -0,0 +1,21 @@ +Public Class BAEntityTextureChange + + Inherits BattleAnimation3D + + Public Texture As Texture2D + Public TargetEntity As Entity + + Public Sub New(ByVal Entity As Entity, Texture As Texture2D, ByVal startDelay As Single, ByVal endDelay As Single) + MyBase.New(New Vector3(0.0F), TextureManager.DefaultTexture, New Vector3(1.0F), startDelay, endDelay) + + Me.TargetEntity = Entity + Me.Texture = Texture + Me.AnimationType = AnimationTypes.Texture + End Sub + + Public Overrides Sub DoActionActive() + TargetEntity.Textures = {Me.Texture} + Me.Ready = True + End Sub + +End Class \ No newline at end of file diff --git a/P3D/Battle/BattleAnimations/BAMove.vb b/P3D/Battle/BattleAnimations/BAMove.vb index c1220411d..e59c0f0e5 100644 --- a/P3D/Battle/BattleAnimations/BAMove.vb +++ b/P3D/Battle/BattleAnimations/BAMove.vb @@ -10,7 +10,7 @@ Public InterpolationSpeed As Single Public SpinSpeedX As Single = 0.1F Public SpinSpeedZ As Single = 0.1F - Public MovementCurve As Integer = 2 + Public MovementCurve As Integer = 3 Private EasedIn As Boolean = False Private EasedOut As Boolean = False diff --git a/P3D/Battle/BattleAnimations/BASize.vb b/P3D/Battle/BattleAnimations/BASize.vb deleted file mode 100644 index b8926f1da..000000000 --- a/P3D/Battle/BattleAnimations/BASize.vb +++ /dev/null @@ -1,106 +0,0 @@ -Public Class BASize - - Inherits BattleAnimation3D - - Public Grow As Boolean = False - Public EndSize As Vector3 - Public SizeSpeed As Single = 0.01F - Public Anchors As String - - Public Change As New Vector3(1) - - Public Sub New(ByVal Position As Vector3, ByVal Texture As Texture2D, ByVal Scale As Vector3, ByVal Grow As Boolean, ByVal EndSize As Vector3, ByVal SizeSpeed As Single, ByVal startDelay As Single, ByVal endDelay As Single, ByVal Anchors As String) - MyBase.New(Position, Texture, Scale, startDelay, endDelay) - - Me.Anchors = Anchors - Me.Grow = Grow - Me.EndSize = EndSize - Me.SizeSpeed = SizeSpeed - - Me.AnimationType = AnimationTypes.Size - End Sub - - Public Overrides Sub DoActionActive() - Dim saveScale As Vector3 = Me.Scale - - Dim changeX As Single = SizeSpeed * Change.X - Dim changeY As Single = SizeSpeed * Change.Y - Dim changeZ As Single = SizeSpeed * Change.Z - - If Grow = True Then - If Me.Scale.X < Me.EndSize.X Then - Me.Scale.X += changeX - - If Me.Scale.X >= Me.EndSize.X Then - Me.Scale.X = Me.EndSize.X - End If - End If - If Me.Scale.Y < Me.EndSize.Y Then - Me.Scale.Y += changeY - - If Me.Scale.Y >= Me.EndSize.Y Then - Me.Scale.Y = Me.EndSize.Y - End If - End If - If Me.Scale.Z < Me.EndSize.Z Then - Me.Scale.Z += changeZ - - If Me.Scale.Z >= Me.EndSize.Z Then - Me.Scale.Z = Me.EndSize.Z - End If - End If - Else - If Me.Scale.X > Me.EndSize.X Then - Me.Scale.X -= changeX - - If Me.Scale.X <= Me.EndSize.X Then - Me.Scale.X = Me.EndSize.X - End If - End If - If Me.Scale.Y > Me.EndSize.Y Then - Me.Scale.Y -= changeY - - If Me.Scale.Y <= Me.EndSize.Y Then - Me.Scale.Y = Me.EndSize.Y - End If - End If - If Me.Scale.Z > Me.EndSize.Z Then - Me.Scale.Z -= changeZ - - If Me.Scale.Z <= Me.EndSize.Z Then - Me.Scale.Z = Me.EndSize.Z - End If - End If - End If - - 'Bottom - If Anchors.Contains("1") = True Then - Dim diffY As Single = saveScale.Y - Me.Scale.Y - Me.Position.Y -= diffY / 2 - End If - 'Top - If Anchors.Contains("2") = True Then - Dim diffY As Single = saveScale.Y - Me.Scale.Y - Me.Position.Y += diffY / 2 - End If - 'Left - If Anchors.Contains("3") = True Then - Dim diffX As Single = saveScale.X - Me.Scale.X - Me.Position.X -= diffX / 2 - End If - 'Right - If Anchors.Contains("4") = True Then - Dim diffX As Single = saveScale.X - Me.Scale.X - Me.Position.X += diffX / 2 - End If - - If Me.EndSize = Me.Scale Then - Me.Ready = True - End If - End Sub - - Public Sub SetChange(ByVal changeX As Single, ByVal changeY As Single, ByVal changeZ As Single) - Me.Change = New Vector3(changeX, changeY, changeZ) - End Sub - -End Class \ No newline at end of file diff --git a/P3D/Battle/BattleSystemV2/Battle.vb b/P3D/Battle/BattleSystemV2/Battle.vb index 6247835f1..823bea6f1 100644 --- a/P3D/Battle/BattleSystemV2/Battle.vb +++ b/P3D/Battle/BattleSystemV2/Battle.vb @@ -2705,14 +2705,20 @@ p.Status = Pokemon.StatusProblems.Burn ChangeCameraAngle(1, own, BattleScreen) 'Burn animation - Dim BurnAnimation As AnimationQueryObject = New AnimationQueryObject(CType(pNPC, NPC), own) + Dim BurnAnimation As AnimationQueryObject = New AnimationQueryObject(pNPC, own) BurnAnimation.AnimationPlaySound("Battle\Effects\Burned", 0, 0) - BurnAnimation.AnimationSpawnFadingEntity(0.25, -0.25, -0.25, "Textures\Battle\Fire\Ember,0,0,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 1, 1) - BurnAnimation.AnimationSpawnFadingEntity(0.25, -0.25, -0.25, "Textures\Battle\Fire\Ember,0,32,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 2, 1) - BurnAnimation.AnimationSpawnFadingEntity(0.25, -0.25, -0.25, "Textures\Battle\Fire\Ember,0,64,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 3, 1) - BurnAnimation.AnimationSpawnFadingEntity(0.25, -0.25, -0.25, "Textures\Battle\Fire\Ember,0,96,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 4, 1) - BurnAnimation.AnimationSpawnFadingEntity(0.25, -0.25, -0.25, "Textures\Battle\Fire\Ember,0,128,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 5, 1) + Dim FlameEntity As Entity = BurnAnimation.SpawnEntity(New Vector3(CSng(pNPC.Position.X - 0.25), CSng(pNPC.Position.Y - 0.25), CSng(pNPC.Position.Z - 0.25)), TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 0, 32, 32)), New Vector3(0.5, 0.5, 0.5), 1.0F) + BurnAnimation.AnimationChangeTexture(FlameEntity, TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 32, 32, 32)), 2, 1) + BurnAnimation.AnimationChangeTexture(FlameEntity, TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 64, 32, 32)), 3, 1) + BurnAnimation.AnimationChangeTexture(FlameEntity, TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 96, 32, 32)), 4, 1) + BurnAnimation.AnimationChangeTexture(FlameEntity, TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 128, 32, 32)), 5, 1) + BurnAnimation.AnimationFadeEntity(FlameEntity, 1, False, 0.0F, 6, 1, 1) BattleScreen.BattleQuery.Add(BurnAnimation) + + If FlameEntity.Opacity = 0.0F Then + BurnAnimation.RemoveEntity(FlameEntity) + End If + Select Case message Case "" 'Print default message only BattleScreen.BattleQuery.Add(New TextQueryObject(p.GetDisplayName() & " got burned!")) @@ -2723,30 +2729,30 @@ BattleScreen.BattleQuery.Add(New TextQueryObject(p.GetDisplayName() & " got burned!")) End Select If p.Ability.Name.ToLower() = "synchronize" AndAlso from <> own Then - Me.InflictBurn(Not own, Not own, BattleScreen, "Synchronize passed over the burn.", "synchronize") - End If + Me.InflictBurn(Not own, Not own, BattleScreen, "Synchronize passed over the burn.", "synchronize") + End If - If Not p.Item Is Nothing Then - If p.Item.Name.ToLower() = "rawst" AndAlso BattleScreen.FieldEffects.CanUseItem(own) = True AndAlso BattleScreen.FieldEffects.CanUseOwnItem(own, BattleScreen) = True Then - If RemoveHeldItem(own, own, BattleScreen, "", "berry:rawst") = True Then - BattleScreen.BattleQuery.Add(New PlaySoundQueryObject("Use_Item", False)) - CureStatusProblem(own, own, BattleScreen, "The Rawst Berry cured the burn of " & p.GetDisplayName() & "!", "berry:rawst") + If Not p.Item Is Nothing Then + If p.Item.Name.ToLower() = "rawst" AndAlso BattleScreen.FieldEffects.CanUseItem(own) = True AndAlso BattleScreen.FieldEffects.CanUseOwnItem(own, BattleScreen) = True Then + If RemoveHeldItem(own, own, BattleScreen, "", "berry:rawst") = True Then + BattleScreen.BattleQuery.Add(New PlaySoundQueryObject("Use_Item", False)) + CureStatusProblem(own, own, BattleScreen, "The Rawst Berry cured the burn of " & p.GetDisplayName() & "!", "berry:rawst") + End If End If End If - End If - If Not p.Item Is Nothing Then - If p.Item.Name.ToLower() = "lum" AndAlso BattleScreen.FieldEffects.CanUseItem(own) = True AndAlso BattleScreen.FieldEffects.CanUseOwnItem(own, BattleScreen) = True Then - If RemoveHeldItem(own, own, BattleScreen, "", "berry:lum") = True Then - BattleScreen.BattleQuery.Add(New PlaySoundQueryObject("Use_Item", False)) - CureStatusProblem(own, own, BattleScreen, "The Lum Berry cured the burn of " & p.GetDisplayName() & "!", "berry:lum") + If Not p.Item Is Nothing Then + If p.Item.Name.ToLower() = "lum" AndAlso BattleScreen.FieldEffects.CanUseItem(own) = True AndAlso BattleScreen.FieldEffects.CanUseOwnItem(own, BattleScreen) = True Then + If RemoveHeldItem(own, own, BattleScreen, "", "berry:lum") = True Then + BattleScreen.BattleQuery.Add(New PlaySoundQueryObject("Use_Item", False)) + CureStatusProblem(own, own, BattleScreen, "The Lum Berry cured the burn of " & p.GetDisplayName() & "!", "berry:lum") + End If End If End If - End If - Return True + Return True + End If End If - End If End If End If End If @@ -3411,7 +3417,7 @@ End If '***STAT INCREASE ANIMATION*** - Dim MoveAnimation As AnimationQueryObject = New AnimationQueryObject(pNPC, Not own) + Dim StatAnimation As AnimationQueryObject = New AnimationQueryObject(pNPC, Not own) Dim maxAmount As Integer = 20 * val Dim currentAmount As Integer = 0 While currentAmount <= maxAmount @@ -3427,11 +3433,11 @@ Destination.X = xPos Destination.Z = zPos Dim startDelay As Double = 5.0 * Random.NextDouble() - MoveAnimation.AnimationSpawnMovingEntity(Position.X, Position.Y, Position.Z, Texture, Scale.X, Scale.Y, Scale.Z, Destination.X, Destination.Y, Destination.Z, 0.05F, False, True, CSng(startDelay), 0.0F) + StatAnimation.AnimationSpawnMovingEntity(Position.X, Position.Y, Position.Z, Texture, Scale.X, Scale.Y, Scale.Z, Destination.X, Destination.Y, Destination.Z, 0.05F, False, True, CSng(startDelay), 0.0F) Threading.Interlocked.Increment(currentAmount) End While BattleScreen.BattleQuery.Add(New PlaySoundQueryObject("Battle\Effects\Stat_Raise", False)) - BattleScreen.BattleQuery.Add(MoveAnimation) + BattleScreen.BattleQuery.Add(StatAnimation) Dim printMessage As String = p.GetDisplayName() & "'s " & statString Select Case val @@ -3998,11 +4004,11 @@ BattleScreen.BattleQuery.Add(New PlaySoundQueryObject(sound, False, 0.0F)) End If - Dim HitAnimation As AnimationQueryObject = New AnimationQueryObject(CType(pNPC, NPC), own) - HitAnimation.AnimationFadePokemonEntity(1, False, 0, 0, 0) - HitAnimation.AnimationFadePokemonEntity(1, True, 1, 1, 0) - HitAnimation.AnimationFadePokemonEntity(1, False, 0, 2, 0) - HitAnimation.AnimationFadePokemonEntity(1, True, 1, 3, 0) + Dim HitAnimation As AnimationQueryObject = New AnimationQueryObject(pNPC, own) + HitAnimation.AnimationFadeEntity(Nothing, 1, False, 0, 0, 0) + HitAnimation.AnimationFadeEntity(Nothing, 1, True, 1, 1, 0) + HitAnimation.AnimationFadeEntity(Nothing, 1, False, 0, 2, 0) + HitAnimation.AnimationFadeEntity(Nothing, 1, True, 1, 3, 0) BattleScreen.BattleQuery.Add(HitAnimation) If own = True Then @@ -5415,12 +5421,19 @@ 'Burn animation Dim BurnAnimation As AnimationQueryObject = New AnimationQueryObject(BattleScreen.OwnPokemonNPC, False) BurnAnimation.AnimationPlaySound("Battle\Effects\Burned", 0, 0) - BurnAnimation.AnimationSpawnFadingEntity(0.25, -0.25, -0.25, "Textures\Battle\Fire\Ember,0,0,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 1, 1) - BurnAnimation.AnimationSpawnFadingEntity(0.25, -0.25, -0.25, "Textures\Battle\Fire\Ember,0,32,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 2, 1) - BurnAnimation.AnimationSpawnFadingEntity(0.25, -0.25, -0.25, "Textures\Battle\Fire\Ember,0,64,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 3, 1) - BurnAnimation.AnimationSpawnFadingEntity(0.25, -0.25, -0.25, "Textures\Battle\Fire\Ember,0,96,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 4, 1) - BurnAnimation.AnimationSpawnFadingEntity(0.25, -0.25, -0.25, "Textures\Battle\Fire\Ember,0,128,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 5, 1) + + Dim FlameEntity As Entity = BurnAnimation.SpawnEntity(New Vector3(CSng(BattleScreen.OwnPokemonNPC.Position.X + 0.25), CSng(BattleScreen.OwnPokemonNPC.Position.Y - 0.25), CSng(BattleScreen.OwnPokemonNPC.Position.Z + 0.25)), TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 0, 32, 32)), New Vector3(0.5, 0.5, 0.5), 1.0F) + BurnAnimation.AnimationChangeTexture(FlameEntity, TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 32, 32, 32)), 2, 1) + BurnAnimation.AnimationChangeTexture(FlameEntity, TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 64, 32, 32)), 3, 1) + BurnAnimation.AnimationChangeTexture(FlameEntity, TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 96, 32, 32)), 4, 1) + BurnAnimation.AnimationChangeTexture(FlameEntity, TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 128, 32, 32)), 5, 1) + BurnAnimation.AnimationFadeEntity(FlameEntity, 1, False, 0.0F, 6, 1, 1) BattleScreen.BattleQuery.Add(BurnAnimation) + + If FlameEntity.Opacity = 0.0F Then + BurnAnimation.RemoveEntity(FlameEntity) + End If + 'Actual damage ReduceHP(reduceAmount, True, True, BattleScreen, .OwnPokemon.GetDisplayName() & " is hurt by the burn.", "burn") End If @@ -6206,12 +6219,19 @@ 'Burn animation Dim BurnAnimation As AnimationQueryObject = New AnimationQueryObject(BattleScreen.OppPokemonNPC, False) BurnAnimation.AnimationPlaySound("Battle\Effects\Burned", 0, 0) - BurnAnimation.AnimationSpawnFadingEntity(0.25, -0.25, -0.25, "Textures\Battle\Fire\Ember,0,0,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 1, 1) - BurnAnimation.AnimationSpawnFadingEntity(0.25, -0.25, -0.25, "Textures\Battle\Fire\Ember,0,32,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 2, 1) - BurnAnimation.AnimationSpawnFadingEntity(0.25, -0.25, -0.25, "Textures\Battle\Fire\Ember,0,64,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 3, 1) - BurnAnimation.AnimationSpawnFadingEntity(0.25, -0.25, -0.25, "Textures\Battle\Fire\Ember,0,96,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 4, 1) - BurnAnimation.AnimationSpawnFadingEntity(0.25, -0.25, -0.25, "Textures\Battle\Fire\Ember,0,128,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 5, 1) + + Dim FlameEntity As Entity = BurnAnimation.SpawnEntity(New Vector3(CSng(BattleScreen.OppPokemonNPC.Position.X - 0.25), CSng(BattleScreen.OwnPokemonNPC.Position.Y - 0.25), CSng(BattleScreen.OwnPokemonNPC.Position.Z - 0.25)), TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 0, 32, 32)), New Vector3(0.5, 0.5, 0.5), 1.0F) + BurnAnimation.AnimationChangeTexture(FlameEntity, TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 32, 32, 32)), 2, 1) + BurnAnimation.AnimationChangeTexture(FlameEntity, TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 64, 32, 32)), 3, 1) + BurnAnimation.AnimationChangeTexture(FlameEntity, TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 96, 32, 32)), 4, 1) + BurnAnimation.AnimationChangeTexture(FlameEntity, TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 128, 32, 32)), 5, 1) + BurnAnimation.AnimationFadeEntity(FlameEntity, 1, False, 0.0F, 6, 1, 1) BattleScreen.BattleQuery.Add(BurnAnimation) + + If FlameEntity.Opacity = 0.0F Then + BurnAnimation.RemoveEntity(FlameEntity) + End If + 'Actual damage ReduceHP(reduceAmount, False, False, BattleScreen, .OppPokemon.GetDisplayName() & " is hurt by the burn.", "burn") End If @@ -6796,8 +6816,8 @@ Loop While SmokeReturned <= 38 ' Pokemon disappears - BallReturn.AnimationFadePokemonEntity(1, False, 0, 1, 0) - BallReturn.AnimationMovePokemonEntity(0, 0.5, 0, 0.5, False, False, 2, 0,,, 4) + BallReturn.AnimationFadeEntity(Nothing, 1, False, 0, 1, 0) + BallReturn.AnimationMoveEntity(Nothing, 0, 0.5, 0, 0.5, False, False, 2, 0,,, 3) ' Ball returns BallReturn.AnimationPlaySound("Battle\Pokeball\Throw", 1, 0) @@ -6859,11 +6879,11 @@ Loop While SmokeSpawned <= 38 ' Pokemon appears - BallThrow.AnimationFadePokemonEntity(1, True, 1, 4, 0) + BallThrow.AnimationFadeEntity(Nothing, 1, True, 1, 4, 0) BallThrow.AnimationPlaySound(CStr(BattleScreen.OwnPokemon.Number), 4, 0,, True) ' Pokémon falls down - BallThrow.AnimationMovePokemonEntity(0, 0, 0, 0.05F, False, False, 4, 0,,, 4) + BallThrow.AnimationMoveEntity(Nothing, 0, 0, 0, 0.05F, False, False, 4, 0,,, 3) BattleScreen.AddToQuery(InsertIndex, BallThrow) End If @@ -7112,7 +7132,7 @@ ChangeCameraAngle(1, False, BattleScreen) Dim Faint As AnimationQueryObject = New AnimationQueryObject(BattleScreen.OppPokemonNPC, True, BattleScreen.OppPokemonModel) Faint.AnimationPlaySound(CStr(BattleScreen.OppPokemon.Number), 0, 2, False, True) - Faint.AnimationMovePokemonEntity(0, -1, 0, 0.1, False, False, 2, 0,,, 4) + Faint.AnimationMoveEntity(Nothing, 0, -1, 0, 0.1, False, False, 2, 0,,, 3) BattleScreen.BattleQuery.Add(Faint) BattleScreen.BattleQuery.Add(New ToggleEntityQueryObject(True, ToggleEntityQueryObject.BattleEntities.OppPokemon, 2, -1, -1, -1, -1)) @@ -7157,8 +7177,8 @@ Loop While SmokeReturned <= 38 ' Pokemon disappears - BallReturn.AnimationFadePokemonEntity(1, False, 0, 1, 0) - BallReturn.AnimationMovePokemonEntity(0, 0.5, 0, 0.5, False, False, 2, 0,,, 4) + BallReturn.AnimationFadeEntity(Nothing, 1, False, 0, 1, 0) + BallReturn.AnimationMoveEntity(Nothing, 0, 0.5, 0, 0.5, False, False, 2, 0,,, 4) ' Ball returns BallReturn.AnimationPlaySound("Battle\Pokeball\Throw", 1, 0) @@ -7218,8 +7238,8 @@ Loop While SmokeReturned <= 38 ' Pokemon disappears - BallReturn.AnimationFadePokemonEntity(1, False, 0, 1, 0) - BallReturn.AnimationMovePokemonEntity(0, 0.5, 0, 0.5, False, False, 2, 0,,, 4) + BallReturn.AnimationFadeEntity(Nothing, 1, False, 0, 1, 0) + BallReturn.AnimationMoveEntity(Nothing, 0, 0.5, 0, 0.5, False, False, 2, 0,,, 4) ' Ball returns BallReturn.AnimationPlaySound("Battle\Pokeball\Throw", 1, 0) @@ -7273,11 +7293,11 @@ Loop While SmokeSpawned <= 38 ' Pokemon appears - BallThrow.AnimationFadePokemonEntity(1, True, 1, 4, 0) + BallThrow.AnimationFadeEntity(Nothing, 1, True, 1, 4, 0) BallThrow.AnimationPlaySound(CStr(BattleScreen.OppPokemon.Number), 4, 0,, True) ' Pokémon falls down - BallThrow.AnimationMovePokemonEntity(0, 0, 0, 0.05F, False, False, 4, 0,,, 4) + BallThrow.AnimationMoveEntity(Nothing, 0, 0, 0, 0.05F, False, False, 4, 0,,, 4) BattleScreen.BattleQuery.Add(BallThrow) End If diff --git a/P3D/Battle/BattleSystemV2/QueryObjects/AnimationQueryObject.vb b/P3D/Battle/BattleSystemV2/QueryObjects/AnimationQueryObject.vb index bf5d71de7..75e95027d 100644 --- a/P3D/Battle/BattleSystemV2/QueryObjects/AnimationQueryObject.vb +++ b/P3D/Battle/BattleSystemV2/QueryObjects/AnimationQueryObject.vb @@ -7,6 +7,7 @@ Public AnimationEnded As Boolean = False Public BAFlipped As Boolean Public AnimationSequence As List(Of BattleAnimation3D) + Public SpawnedEntities As List(Of Entity) Public CurrentEntity As Entity Public CurrentModel As ModelEntity @@ -16,7 +17,7 @@ End Get End Property - Public Sub New(ByVal entity As NPC, ByVal BAFlipped As Boolean, Optional ByVal model As ModelEntity = Nothing) + Public Sub New(ByVal entity As Entity, ByVal BAFlipped As Boolean, Optional ByVal model As ModelEntity = Nothing) MyBase.New(QueryTypes.MoveAnimation) Me.AnimationSequence = New List(Of BattleAnimation3D) Me.BAFlipped = BAFlipped @@ -54,20 +55,18 @@ If AnimationSequence.Count <= 0 Then AnimationSequenceEnd() End If + For Each Animation As BattleAnimation3D In AnimationSequence Animation.UpdateEntity() Next + For Each Entity As Entity In SpawnedEntities + Entity.UpdateEntity() + Next End If End Sub Public Sub AnimationSequenceBegin() - If CurrentEntity Is Nothing Then - Logger.Log(Logger.LogTypes.Warning, "ATTEMPT TO USE AnimationSequenceBegin OUTSIDE OF ATTACK ANIMATION DELEGATE") - ElseIf AnimationStarted Then - Logger.Log(Logger.LogTypes.Warning, "ATTEMPT TO USE AnimationSequenceBegin INSIDE ANIMATION SEQUENCE, DID YOU MEAN AnimationSequenceEnd?") - Else - AnimationStarted = True - End If + AnimationStarted = True End Sub Public Sub AnimationSequenceEnd() @@ -80,6 +79,104 @@ End If End Sub + Public Function SpawnEntity(ByVal Position As Vector3, ByVal Texture As Texture2D, ByVal Scale As Vector3, ByVal Opacity As Single) As Entity + Dim SpawnedEntity As Entity = New Entity(Position.X, Position.Y, Position.Z, "BattleAnimation", {Texture}, {0, 0}, False, 0, Scale, BaseModel.BillModel, 0, "", New Vector3(1.0F)) + + SpawnedEntity.Opacity = Opacity + If SpawnedEntity.Opacity > 0 Then + SpawnedEntity.Visible = True + Else + SpawnedEntity.Visible = False + End If + + SpawnedEntities.Add(SpawnedEntity) + Return SpawnedEntity + End Function + Public Sub RemoveEntity(Entity As Entity) + SpawnedEntities.Remove(Entity) + End Sub + Public Sub AnimationChangeTexture(ByVal Entity As Entity, ByVal Texture As Texture2D, ByVal startDelay As Single, ByVal endDelay As Single) + Dim TextureChangeEntity As Entity + + If Entity Is Nothing Then + TextureChangeEntity = CurrentEntity + Else + TextureChangeEntity = Entity + End If + + Dim baEntityTextureChange As BAEntityTextureChange = New BAEntityTextureChange(TextureChangeEntity, Texture, startDelay, endDelay) + AnimationSequence.Add(baEntityTextureChange) + End Sub + + Public Sub AnimationMoveEntity(ByVal Entity As Entity, ByVal DestinationX As Single, ByVal DestinationY As Single, ByVal DestinationZ As Single, ByVal Speed As Single, ByVal SpinX As Boolean, ByVal SpinZ As Boolean, ByVal startDelay As Single, ByVal endDelay As Single, Optional ByVal SpinXSpeed As Single = 0.1F, Optional ByVal SpinZSpeed As Single = 0.1F, Optional MovementCurve As Integer = 3) + Dim MoveEntity As Entity + Dim Destination As Vector3 + + If Entity Is Nothing Then + MoveEntity = CurrentEntity + If BAFlipped Then + DestinationX -= DestinationX * 2.0F + DestinationZ -= DestinationZ * 2.0F + Destination = New Vector3(CurrentEntity.Position.X + DestinationX, CurrentEntity.Position.Y + DestinationY, CurrentEntity.Position.Z + DestinationZ) + End If + Else + MoveEntity = Entity + Destination = New Vector3(DestinationX, DestinationY, DestinationZ) + End If + + Dim baEntityMove As BAEntityMove = New BAEntityMove(MoveEntity, Destination, Speed, SpinX, SpinZ, startDelay, endDelay, SpinXSpeed, SpinZSpeed, MovementCurve) + AnimationSequence.Add(baEntityMove) + + If Me.CurrentModel IsNot Nothing Then + Dim baModelMove As BAEntityMove = New BAEntityMove(CType(CurrentModel, Entity), Destination, Speed, SpinX, SpinZ, startDelay, endDelay, SpinXSpeed, SpinZSpeed, MovementCurve) + AnimationSequence.Add(baModelMove) + End If + End Sub + + Public Sub AnimationFadeEntity(ByVal Entity As Entity, ByVal TransitionSpeed As Single, ByVal FadeIn As Boolean, ByVal EndState As Single, ByVal startDelay As Single, ByVal endDelay As Single, Optional ByVal startState As Single = -1.0F) + Dim FadeEntity As Entity + If Entity Is Nothing Then + FadeEntity = CurrentEntity + Else + FadeEntity = Entity + End If + If startState = -1.0F Then startState = FadeEntity.Opacity + Dim baEntityOpacity As BAEntityOpacity = New BAEntityOpacity(FadeEntity, TransitionSpeed, FadeIn, EndState, startDelay, endDelay, startState) + AnimationSequence.Add(baEntityOpacity) + + If Me.CurrentModel IsNot Nothing Then + Dim baModelOpacity As BAEntityOpacity = New BAEntityOpacity(CType(CurrentModel, Entity), TransitionSpeed, FadeIn, EndState, startDelay, endDelay, startState) + AnimationSequence.Add(baModelOpacity) + End If + End Sub + Public Sub AnimationRotateEntity(Entity As Entity, ByVal RotationSpeedX As Single, ByVal RotationSpeedY As Single, ByVal RotationSpeedZ As Single, ByVal EndRotationX As Single, ByVal EndRotationY As Single, ByVal EndRotationZ As Single, ByVal startDelay As Single, ByVal endDelay As Single, ByVal DoXRotation As Boolean, ByVal DoYRotation As Boolean, ByVal DoZRotation As Boolean, ByVal DoReturn As Boolean) + Dim RotateEntity As Entity + If Entity Is Nothing Then + RotateEntity = CurrentEntity + Else + RotateEntity = Entity + End If + + Dim RotationSpeedVector As Vector3 = New Vector3(RotationSpeedX, RotationSpeedY, RotationSpeedZ) + Dim EndRotation As Vector3 = New Vector3(EndRotationX, EndRotationY, EndRotationZ) + Dim baEntityRotate As BAEntityRotate = New BAEntityRotate(RotateEntity, RotationSpeedVector, EndRotation, startDelay, endDelay, DoXRotation, DoYRotation, DoZRotation, DoReturn) + AnimationSequence.Add(baEntityRotate) + End Sub + Public Sub AnimationScaleEntity(ByVal Entity As Entity, ByVal Grow As Boolean, ByVal EndSizeX As Single, ByVal EndSizeY As Single, ByVal EndSizeZ As Single, ByVal SizeSpeed As Single, ByVal startDelay As Single, ByVal endDelay As Single, Optional ByVal Anchors As String = "1") + Dim ScaleEntity As Entity + If Entity Is Nothing Then + ScaleEntity = CurrentEntity + Else + ScaleEntity = Entity + End If + + Dim Position As Vector3 = ScaleEntity.Position + Dim Scale As Vector3 = ScaleEntity.Scale + Dim EndSize As Vector3 = New Vector3(EndSizeX, EndSizeY, EndSizeZ) + Dim baBillSize As BAEntityScale = New BAEntityScale(ScaleEntity, Scale, Grow, EndSize, SizeSpeed, startDelay, endDelay, Anchors) + AnimationSequence.Add(baBillSize) + End Sub + Public Sub AnimationSpawnFadingEntity(ByVal PositionX As Single, ByVal PositionY As Single, ByVal PositionZ As Single, ByVal Texture As String, ByVal ScaleX As Single, ByVal ScaleY As Single, ByVal ScaleZ As Single, ByVal TransitionSpeed As Single, ByVal FadeIn As Boolean, ByVal EndState As Single, ByVal startDelay As Single, ByVal endDelay As Single, Optional ByVal startState As Single = 1.0F) If CurrentEntity Is Nothing Then Logger.Log(Logger.LogTypes.Warning, "ATTEMPT TO USE AttackSpawnMovingAnimation OUTSIDE OF ATTACK ANIMATION DELEGATE") @@ -142,44 +239,6 @@ AnimationSequence.Add(baMove) End If End Sub - Public Sub AnimationMovePokemonEntity(ByVal DestinationX As Single, ByVal DestinationY As Single, ByVal DestinationZ As Single, ByVal Speed As Single, ByVal SpinX As Boolean, ByVal SpinZ As Boolean, ByVal startDelay As Single, ByVal endDelay As Single, Optional ByVal SpinXSpeed As Single = 0.1F, Optional ByVal SpinZSpeed As Single = 0.1F, Optional MovementCurve As Integer = 3) - If CurrentEntity Is Nothing Then - Logger.Log(Logger.LogTypes.Warning, "ATTEMPT TO USE AttackSpawnMovingAnimation OUTSIDE OF ATTACK ANIMATION DELEGATE") - ElseIf Not AnimationStarted Then - Logger.Log(Logger.LogTypes.Warning, "ATTEMPT TO USE AttackSpawnMovingAnimation BEFORE CALLING AnimationSequenceBegin") - Else - If BAFlipped Then - DestinationX -= DestinationX * 2.0F - DestinationZ -= DestinationZ * 2.0F - End If - - Dim Destination As Vector3 = New Vector3(CurrentEntity.Position.X + DestinationX, CurrentEntity.Position.Y + DestinationY, CurrentEntity.Position.Z + DestinationZ) - - Dim baBillMove As BABillMove = New BABillMove(CurrentEntity, Destination, Speed, SpinX, SpinZ, startDelay, endDelay, SpinXSpeed, SpinZSpeed, MovementCurve) - AnimationSequence.Add(baBillMove) - - If Me.CurrentModel IsNot Nothing Then - Dim baModelMove As BABillMove = New BABillMove(CType(CurrentModel, Entity), Destination, Speed, SpinX, SpinZ, startDelay, endDelay, SpinXSpeed, SpinZSpeed, MovementCurve) - AnimationSequence.Add(baModelMove) - End If - End If - End Sub - Public Sub AnimationFadePokemonEntity(ByVal TransitionSpeed As Single, ByVal FadeIn As Boolean, ByVal EndState As Single, ByVal startDelay As Single, ByVal endDelay As Single, Optional ByVal startState As Single = -1.0F) - If CurrentEntity Is Nothing Then - Logger.Log(Logger.LogTypes.Warning, "ATTEMPT TO USE AttackSpawnMovingAnimation OUTSIDE OF ATTACK ANIMATION DELEGATE") - ElseIf Not AnimationStarted Then - Logger.Log(Logger.LogTypes.Warning, "ATTEMPT TO USE AttackSpawnMovingAnimation BEFORE CALLING AnimationSequenceBegin") - Else - If startState = -1.0F Then startState = CurrentEntity.Opacity - Dim baBillOpacity As BABillOpacity = New BABillOpacity(CurrentEntity, TransitionSpeed, FadeIn, EndState, startDelay, endDelay, startState) - AnimationSequence.Add(baBillOpacity) - - If Me.CurrentModel IsNot Nothing Then - Dim baModelOpacity As BABillOpacity = New BABillOpacity(CType(CurrentModel, Entity), TransitionSpeed, FadeIn, EndState, startDelay, endDelay, startState) - AnimationSequence.Add(baModelOpacity) - End If - End If - End Sub Public Sub AnimationPlaySound(ByVal sound As String, ByVal startDelay As Single, ByVal endDelay As Single, Optional ByVal stopMusic As Boolean = False, Optional ByVal IsPokemon As Boolean = False) If CurrentEntity Is Nothing Then Logger.Log(Logger.LogTypes.Warning, "ATTEMPT TO USE AnimationPlaySound OUTSIDE OF ATTACK ANIMATION DELEGATE") @@ -191,52 +250,5 @@ End If End Sub - Public Sub AnimationSpawnScalingEntity(ByVal PositionX As Single, ByVal PositionY As Single, ByVal PositionZ As Single, ByVal Texture As String, ByVal ScaleX As Single, ByVal ScaleY As Single, ByVal ScaleZ As Single, ByVal Grow As Boolean, ByVal EndSizeX As Single, ByVal EndSizeY As Single, ByVal EndSizeZ As Single, ByVal SizeSpeed As Single, ByVal startDelay As Single, ByVal endDelay As Single, Optional ByVal Anchors As String = "1") - If CurrentEntity Is Nothing Then - Logger.Log(Logger.LogTypes.Warning, "ATTEMPT TO USE AttackSpawnSizeAnimation OUTSIDE OF ATTACK ANIMATION DELEGATE") - ElseIf Not AnimationStarted Then - Logger.Log(Logger.LogTypes.Warning, "ATTEMPT TO USE AttackSpawnSizeAnimation BEFORE CALLING AnimationSequenceBegin") - Else - Dim stringArray = Texture.Split(","c) - Dim texture2D As Texture2D = Nothing - - If stringArray.Length = 1 Then - texture2D = TextureManager.GetTexture(Texture) - ElseIf stringArray.Length = 5 Then - Dim r As Rectangle = New Rectangle(CInt(stringArray(1)), CInt(stringArray(2)), CInt(stringArray(3)), CInt(stringArray(4))) - texture2D = TextureManager.GetTexture(stringArray(0), r, "") - End If - - If BAFlipped Then - PositionX -= PositionX * 2.0F - PositionZ -= PositionZ * 2.0F - End If - Dim Position As Vector3 = New Vector3(CurrentEntity.Position.X + PositionX, CurrentEntity.Position.Y + PositionY, CurrentEntity.Position.Z + PositionZ) - Dim Scale As Vector3 = New Vector3(ScaleX, ScaleY, ScaleZ) - Dim EndSize As Vector3 = New Vector3(EndSizeX, EndSizeY, EndSizeZ) - Dim baSize As BASize = New BASize(Position, texture2D, Scale, Grow, EndSize, SizeSpeed, startDelay, endDelay, Anchors) - AnimationSequence.Add(baSize) - End If - End Sub - Public Sub AnimationScalePokemonEntity(ByVal entity As Entity, ByVal PositionX As Single, ByVal PositionY As Single, ByVal PositionZ As Single, ByVal Texture As String, ByVal ScaleX As Single, ByVal ScaleY As Single, ByVal ScaleZ As Single, ByVal Grow As Boolean, ByVal EndSizeX As Single, ByVal EndSizeY As Single, ByVal EndSizeZ As Single, ByVal SizeSpeed As Single, ByVal startDelay As Single, ByVal endDelay As Single, Optional ByVal Anchors As String = "1") - If CurrentEntity Is Nothing Then - Logger.Log(Logger.LogTypes.Warning, "ATTEMPT TO USE AttackSpawnSizeAnimation OUTSIDE OF ATTACK ANIMATION DELEGATE") - ElseIf Not AnimationStarted Then - Logger.Log(Logger.LogTypes.Warning, "ATTEMPT TO USE AttackSpawnSizeAnimation BEFORE CALLING AnimationSequenceBegin") - Else - Dim stringArray = Texture.Split(","c) - - - If BAFlipped Then - PositionX -= PositionX * 2.0F - PositionZ -= PositionZ * 2.0F - End If - Dim Position As Vector3 = New Vector3(CurrentEntity.Position.X + PositionX, CurrentEntity.Position.Y + PositionY, CurrentEntity.Position.Z + PositionZ) - Dim Scale As Vector3 = New Vector3(ScaleX, ScaleY, ScaleZ) - Dim EndSize As Vector3 = New Vector3(EndSizeX, EndSizeY, EndSizeZ) - Dim baBillSize As BABillSize = New BABillSize(entity, Scale, Grow, EndSize, SizeSpeed, startDelay, endDelay, Anchors) - AnimationSequence.Add(baBillSize) - End If - End Sub End Class End Namespace \ No newline at end of file diff --git a/P3D/Content/Textures/Battle/Other/Star.png b/P3D/Content/Textures/Battle/BallCatchStar.png similarity index 100% rename from P3D/Content/Textures/Battle/Other/Star.png rename to P3D/Content/Textures/Battle/BallCatchStar.png diff --git a/P3D/P3D.vbproj b/P3D/P3D.vbproj index 7b6910788..ec16b862f 100644 --- a/P3D/P3D.vbproj +++ b/P3D/P3D.vbproj @@ -15394,7 +15394,7 @@ PreserveNewest - + PreserveNewest @@ -27545,9 +27545,11 @@ PreserveNewest - - - + + + + + @@ -29229,7 +29231,6 @@ - diff --git a/P3D/Pokemon/Attacks/Normal/Tackle.vb b/P3D/Pokemon/Attacks/Normal/Tackle.vb index c3a075d95..4d53f749d 100644 --- a/P3D/Pokemon/Attacks/Normal/Tackle.vb +++ b/P3D/Pokemon/Attacks/Normal/Tackle.vb @@ -54,8 +54,8 @@ Public Overrides Sub InternalUserPokemonMoveAnimation(ByVal BattleScreen As BattleScreen, ByVal own As Boolean, ByVal CurrentPokemon As Pokemon, ByVal CurrentEntity As NPC, ByVal CurrentModel As ModelEntity) Dim MoveAnimation As AnimationQueryObject = New AnimationQueryObject(CurrentEntity, own, CurrentModel) - MoveAnimation.AnimationMovePokemonEntity(0.5, 0, 0, 0.3, False, False, 0, 0,,, 2) - MoveAnimation.AnimationMovePokemonEntity(0, 0, 0, 0.3, False, False, 1, 0,,, 2) + MoveAnimation.AnimationMoveEntity(Nothing, 0.5, 0, 0, 0.3, False, False, 0, 0,,, 2) + MoveAnimation.AnimationMoveEntity(Nothing, 0, 0, 0, 0.3, False, False, 1, 0,,, 2) BattleScreen.BattleQuery.Add(MoveAnimation) End Sub diff --git a/P3D/Screens/Battle/BattleCatchScreen.vb b/P3D/Screens/Battle/BattleCatchScreen.vb index 3720b2ede..787d1e9b0 100644 --- a/P3D/Screens/Battle/BattleCatchScreen.vb +++ b/P3D/Screens/Battle/BattleCatchScreen.vb @@ -3,10 +3,13 @@ Inherits Screen Dim Ball As Item - Dim Animations As New List(Of BattleAnimation3D) + + Dim Animations As BattleSystem.AnimationQueryObject = New BattleSystem.AnimationQueryObject(Nothing, False, Nothing) + Dim BallStartPosition As Vector3 = New Vector3(Camera.Position.X - 1.0F, Camera.Position.Y, Camera.Position.Z - 0.5F) + BattleScreen.BattleMapOffset + Dim BallEntity As Entity = Animations.SpawnEntity(BallStartPosition, Ball.Texture, New Vector3(0.3F), 1.0F) Dim AnimationStarted As Boolean = False - Dim catched As Boolean = False + Dim caught As Boolean = False Dim InBall As Boolean = False Dim AnimationIndex As Integer = 0 Dim renamed As Boolean = False @@ -49,9 +52,6 @@ Level.Draw() Dim RenderObjects As New List(Of Entity) - For Each a As BattleAnimation3D In Me.Animations - RenderObjects.Add(a) - Next If InBall = False Then RenderObjects.Add(BattleScreen.OppPokemonNPC) @@ -65,29 +65,15 @@ [Object].Render() Next + Animations.Draw(CType(Me.PreScreen, BattleSystem.BattleScreen)) + World.DrawWeather(Screen.Level.World.CurrentMapWeather) TextBox.Draw() End Sub Private Sub UpdateAnimations() - Animations = (From a In Animations Order By a.CameraDistance Descending).ToList() - - For i = 0 To Animations.Count - 1 - If i <= Animations.Count - 1 Then - Dim a As BattleAnimation3D = Animations(i) - If a.CanRemove = True Then - i -= 1 - Animations.Remove(a) - Else - a.Update() - End If - End If - Next - - For Each Animation As BattleAnimation3D In Animations - Animation.UpdateEntity() - Next + Animations.Update(CType(Me.PreScreen, BattleSystem.BattleScreen)) End Sub Private Sub SetCamera() @@ -129,75 +115,72 @@ If AnimationStarted = False Then SetupAnimation() Else - If Me.Animations.Count = 0 Then - Select Case Me.AnimationIndex - Case 0 + Select Case Me.AnimationIndex + Case 0 + SoundManager.PlaySound("Battle\Pokeball\open") + InBall = True + AnimationIndex = 1 + AnimationStarted = False + SetupAnimation() + Case 1 + AnimationIndex = 2 + AnimationStarted = False + SetupAnimation() + Case 2, 3, 4, 5 + If StayInBall() = True Then + SoundManager.PlaySound("Battle\Pokeball\shake") + AnimationIndex += 1 + Else SoundManager.PlaySound("Battle\Pokeball\open") - InBall = True - AnimationIndex = 1 - AnimationStarted = False - SetupAnimation() - Case 1 - AnimationIndex = 2 - AnimationStarted = False - SetupAnimation() - Case 2, 3, 4, 5 - If StayInBall() = True Then - SoundManager.PlaySound("Battle\Pokeball\shake") - AnimationIndex += 1 - Else - SoundManager.PlaySound("Battle\Pokeball\break") - AnimationIndex = 21 - InBall = False - End If - AnimationStarted = False - SetupAnimation() - Case 6 - AnimationIndex = 7 - AnimationStarted = False - SetupAnimation() - SoundManager.PlaySound("Battle\Pokeball\catch", False) - Case 7 - AnimationIndex = 8 - AnimationStarted = False - SetupAnimation() - CatchPokemon() - BattleSystem.Battle.Caught = True - Case 8 - AnimationIndex = 9 - If showPokedexEntry = True Then - Core.SetScreen(New TransitionScreen(Core.CurrentScreen, New PokedexViewScreen(Core.CurrentScreen, p, True), Color.White, False)) - End If - Case 9 - AnimationIndex = 10 - Core.SetScreen(New NameObjectScreen(Core.CurrentScreen, p)) - Case 10 ' After Catch - If p.CatchBall.ID = 186 Then - p.FullRestore() ' Heal Ball - End If + AnimationIndex = 21 + InBall = False + End If + AnimationStarted = False + SetupAnimation() + Case 6 + AnimationIndex = 7 + AnimationStarted = False + SetupAnimation() + Case 7 + AnimationIndex = 8 + AnimationStarted = False + SetupAnimation() + CatchPokemon() + BattleSystem.Battle.Caught = True + Case 8 + AnimationIndex = 9 + If showPokedexEntry = True Then + Core.SetScreen(New TransitionScreen(Core.CurrentScreen, New PokedexViewScreen(Core.CurrentScreen, p, True), Color.White, False)) + End If + Case 9 + AnimationIndex = 10 + Core.SetScreen(New NameObjectScreen(Core.CurrentScreen, p)) + Case 10 ' After Catch + If p.CatchBall.ID = 186 Then + p.FullRestore() ' Heal Ball + End If - PlayerStatistics.Track("Caught Pokemon", 1) - StorePokemon() - AnimationIndex = 11 - Case 11 - Core.SetScreen(Me.PreScreen) - BattleSystem.Battle.Won = True - CType(Core.CurrentScreen, BattleSystem.BattleScreen).EndBattle(False) - Case 20 ' Failed - If Core.Player.Pokemons.Count < 6 Then - Dim p As Pokemon = BattleScreen.OppPokemon - p.SetCatchInfos(Me.Ball, "Illegally caught!") + PlayerStatistics.Track("Caught Pokemon", 1) + StorePokemon() + AnimationIndex = 11 + Case 11 + Core.SetScreen(Me.PreScreen) + BattleSystem.Battle.Won = True + CType(Core.CurrentScreen, BattleSystem.BattleScreen).EndBattle(False) + Case 20 ' Failed + If Core.Player.Pokemons.Count < 6 Then + Dim p As Pokemon = BattleScreen.OppPokemon + p.SetCatchInfos(Me.Ball, "Illegally caught!") - Core.Player.Pokemons.Add(p) - End If - ResetVisibility() - Core.SetScreen(Me.PreScreen) - Case 21 ' After Break - ResetVisibility() - Core.SetScreen(Me.PreScreen) - CType(Core.CurrentScreen, BattleSystem.BattleScreen).Battle.InitializeRound(CType(Core.CurrentScreen, BattleSystem.BattleScreen), New BattleSystem.Battle.RoundConst() With {.StepType = BattleSystem.Battle.RoundConst.StepTypes.Text, .Argument = "It broke free!"}) - End Select - End If + Core.Player.Pokemons.Add(p) + End If + ResetVisibility() + Core.SetScreen(Me.PreScreen) + Case 21 ' After Break + ResetVisibility() + Core.SetScreen(Me.PreScreen) + CType(Core.CurrentScreen, BattleSystem.BattleScreen).Battle.InitializeRound(CType(Core.CurrentScreen, BattleSystem.BattleScreen), New BattleSystem.Battle.RoundConst() With {.StepType = BattleSystem.Battle.RoundConst.StepTypes.Text, .Argument = "It broke free!"}) + End Select End If End If End If @@ -272,29 +255,51 @@ Select Case Me.AnimationIndex Case 0 - Animations.Add(New BAMove(New Vector3(Camera.Position.X - 1.0F, Camera.Position.Y, Camera.Position.Z - 0.5F) + BattleScreen.BattleMapOffset, Ball.Texture, New Vector3(0.3F), New Vector3(BattleScreen.OppPokemonNPC.Position.X - 0.05F, 0.0F, BattleScreen.OppPokemonNPC.Position.Z), 0.04F, True, True, 1.0F, 0.0F,,, 3)) + Animations.AnimationMoveEntity(BallEntity, BattleScreen.OppPokemonNPC.Position.X - 0.05F, 0.0F, BattleScreen.OppPokemonNPC.Position.Z, 0.04F, True, True, 1.0F, 0.0F,,, 3) Case 1 - BattleScreen.OppPokemonNPC.Visible = False - Animations.Add(New BAMove(New Vector3(BattleScreen.OppPokemonNPC.Position.X - 0.05F, 0.0F, BattleScreen.OppPokemonNPC.Position.Z), Ball.Texture, New Vector3(0.3F), New Vector3(BattleScreen.OppPokemonNPC.Position.X - 0.05F, 0.0F, BattleScreen.OppPokemonNPC.Position.Z), 0.01F, False, False, 0.0F, 6.0F,,, 3)) + Dim SmokeReturned As Integer = 0 + Do + Dim SmokePosition = New Vector3(CSng(Random.Next(-10, 10) / 10), CSng(Random.Next(-10, 10) / 10), CSng(Random.Next(-10, 10) / 10)) + Dim SmokeDestination = New Vector3(0, 0, 0) - Dim Size As New BASize(BattleScreen.OppPokemonNPC.Position, BattleScreen.OppPokemonNPC.Textures(0), BattleScreen.OppPokemonNPC.Scale, False, New Vector3(0.05F), 0.02F, 0.0F, 0.0F, "1") + Dim SmokeTexture As Texture2D = TextureManager.GetTexture("Textures\Battle\Cloud") - Animations.Add(Size) + Dim SmokeScale = New Vector3(CSng(Random.Next(2, 6) / 10)) + Dim SmokeSpeed = CSng(Random.Next(1, 3) / 10.0F) + + Dim SmokeEntity As Entity = Animations.SpawnEntity(SmokePosition, SmokeTexture, SmokeScale, 1.0F) + + Animations.AnimationMoveEntity(SmokeEntity, SmokeDestination.X, SmokeDestination.Y, SmokeDestination.Z, SmokeSpeed, False, False, 0.0F, 0.0F) + If SmokeEntity.Position = SmokeDestination Then + Animations.RemoveEntity(SmokeEntity) + End If + Threading.Interlocked.Increment(SmokeReturned) + Loop While SmokeReturned <= 38 + + Animations.AnimationMoveEntity(BallEntity, BattleScreen.OppPokemonNPC.Position.X - 0.05F, 0.0F, BattleScreen.OppPokemonNPC.Position.Z, 0.01F, False, False, 0.0F, 6.0F,,, 3) + + Animations.AnimationScaleEntity(BattleScreen.OppPokemonNPC, False, 0.05F, 0.05F, 0.05F, 0.02F, 0.0F, 0.0F, "1") + Animations.AnimationFadeEntity(BattleScreen.OppPokemonNPC, 1, False, 0.0F, 0.0F, 0.0F) Case 2 - Animations.Add(New BAMove(New Vector3(BattleScreen.OppPokemonNPC.Position.X - 0.05F, 0.0F, BattleScreen.OppPokemonNPC.Position.Z), Ball.Texture, New Vector3(0.3F), New Vector3(BattleScreen.OppPokemonNPC.Position.X - 0.05F, -0.35F, BattleScreen.OppPokemonNPC.Position.Z), 0.02F, False, False, 0.0F, 6.0F,,, 3)) + Animations.AnimationMoveEntity(BallEntity, BattleScreen.OppPokemonNPC.Position.X - 0.05F, -0.35F, BattleScreen.OppPokemonNPC.Position.Z, 0.02F, False, False, 0.0F, 6.0F,,, 3) + Case 3, 5 - Animations.Add(New BARotation(New Vector3(BattleScreen.OppPokemonNPC.Position.X - 0.05F, -0.35F, BattleScreen.OppPokemonNPC.Position.Z), Ball.Texture, New Vector3(0.3F), New Vector3(0, 0, 0.05F), New Vector3(0, 0, 1.0F), 0.0F, 4.0F, False, False, True, True)) + Animations.AnimationRotateEntity(BallEntity, 0, 0, 0.05F, 0, 0, 1.0F, 0.0F, 4.0F, False, False, True, True) Case 4, 6 - Animations.Add(New BARotation(New Vector3(BattleScreen.OppPokemonNPC.Position.X - 0.05F, -0.35F, BattleScreen.OppPokemonNPC.Position.Z), Ball.Texture, New Vector3(0.3F), New Vector3(0, 0, -0.05F), New Vector3(0, 0, -1.0F), 0.0F, 4.0F, False, False, True, True)) + Animations.AnimationRotateEntity(BallEntity, 0, 0, -0.05F, 0, 0, -1.0F, 0.0F, 4.0F, False, False, True, True) Case 7 ' Catch Animation For i = 0 To 2 - Dim v As Vector3 = New Vector3(BattleScreen.OppPokemonNPC.Position.X - 0.05F, -0.35F, BattleScreen.OppPokemonNPC.Position.Z) - - Animations.Add(New BAMove(v, TextureManager.GetTexture("Textures\Battle\Other\Star"), New Vector3(0.1F), New Vector3(v.X, v.Y + 0.4F, v.Z - ((1 - i) * 0.4F)), 0.01F, False, False, 0.0F, 0.0F,,, 3)) + Dim StarPosition As Vector3 = New Vector3(BattleScreen.OppPokemonNPC.Position.X - 0.05F, -0.35F, BattleScreen.OppPokemonNPC.Position.Z) + Dim StarDestination As Vector3 = New Vector3(StarPosition.X, StarPosition.Y + 0.4F, StarPosition.Z - ((1 - i) * 0.4F)) + Dim StarEntity As Entity = Animations.SpawnEntity(StarPosition, TextureManager.GetTexture("Textures\Battle\BallCatchStar"), New Vector3(0.1F), 1.0F) + Animations.AnimationMoveEntity(StarEntity, StarDestination.X, StarDestination.Y, StarDestination.Z, 0.01F, False, False, 0.0F, 0.0F,,, 3) + If StarEntity.Position = StarDestination Then + Animations.RemoveEntity(StarEntity) + End If Next - Animations.Add(New BAMove(New Vector3(BattleScreen.OppPokemonNPC.Position.X - 0.05F, -0.35F, BattleScreen.OppPokemonNPC.Position.Z), Ball.Texture, New Vector3(0.3F), New Vector3(BattleScreen.OppPokemonNPC.Position.X - 0.05F, -0.35F, BattleScreen.OppPokemonNPC.Position.Z), 0.02F, False, False, 0.0F, 6.0F,,, 3)) + Animations.AnimationMoveEntity(BallEntity, BattleScreen.OppPokemonNPC.Position.X - 0.05F, -0.35F, BattleScreen.OppPokemonNPC.Position.Z, 0.02F, False, False, 0.0F, 6.0F,,, 3) Case 8 - Animations.Add(New BAOpacity(New Vector3(BattleScreen.OppPokemonNPC.Position.X - 0.05F, -0.35F, BattleScreen.OppPokemonNPC.Position.Z), Ball.Texture, New Vector3(0.3F), 0.01F, False, 0.0F, 0.0F, 0.0F)) + Animations.AnimationFadeEntity(BallEntity, 0.01F, False, 0.0F, 0.0F, 0.0F) Case 21 ' Break Animation End Select From 168a855ed03ad6257391b5f0d36edabb55b70f59 Mon Sep 17 00:00:00 2001 From: JappaWakka Date: Thu, 14 Oct 2021 17:50:44 +0200 Subject: [PATCH 05/57] I was not halfway done MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit I've updated Poison Sting, through which I realized I hadn't taken some usage cases into consideration, so the system should be more robust and useful now I've also updated the animation for Switching In your own Pokémon and I've added an animation for when the Pokémon breaks out of the ball when you're trying to catch it --- P3D/Battle/BattleAnimations/BAEntityColor.vb | 67 + P3D/Battle/BattleAnimations/BAEntityScale.vb | 2 +- P3D/Battle/BattleAnimations/BAMove.vb | 194 --- P3D/Battle/BattleAnimations/BAOpacity.vb | 41 - P3D/Battle/BattleAnimations/BARotation.vb | 129 -- P3D/Battle/BattleAnimations/BASound.vb | 28 - .../BattleAnimations/BattleAnimation3D.vb | 10 +- P3D/Battle/BattleSystemV2/Battle.vb | 1086 ++++++++--------- .../QueryObjects/AnimationQueryObject.vb | 99 +- .../Textures/Battle/{Cloud.png => Smoke.png} | Bin P3D/Entites/Entity.vb | 1 + P3D/P3D.vbproj | 7 +- P3D/Pokemon/Attacks/Fire/Ember.vb | 4 +- P3D/Pokemon/Attacks/Grass/Absorb.vb | 2 +- P3D/Pokemon/Attacks/Normal/Growl.vb | 2 +- P3D/Pokemon/Attacks/Normal/Pound.vb | 2 +- P3D/Pokemon/Attacks/Normal/Tackle.vb | 9 +- P3D/Pokemon/Attacks/Poison/PoisonSting.vb | 34 +- P3D/Resources/Models/BaseModel.vb | 6 +- P3D/Screens/Battle/BattleCatchScreen.vb | 86 +- 20 files changed, 777 insertions(+), 1032 deletions(-) create mode 100644 P3D/Battle/BattleAnimations/BAEntityColor.vb delete mode 100644 P3D/Battle/BattleAnimations/BAMove.vb delete mode 100644 P3D/Battle/BattleAnimations/BAOpacity.vb delete mode 100644 P3D/Battle/BattleAnimations/BARotation.vb delete mode 100644 P3D/Battle/BattleAnimations/BASound.vb rename P3D/Content/Textures/Battle/{Cloud.png => Smoke.png} (100%) diff --git a/P3D/Battle/BattleAnimations/BAEntityColor.vb b/P3D/Battle/BattleAnimations/BAEntityColor.vb new file mode 100644 index 000000000..75ba229d4 --- /dev/null +++ b/P3D/Battle/BattleAnimations/BAEntityColor.vb @@ -0,0 +1,67 @@ +Public Class BAEntityColor + + Inherits BattleAnimation3D + + Public TargetEntity As Entity + Public TransitionSpeed As Single = 0.01F + Public FadeIn As Boolean = False + Public ColorTo As Vector3 = New Vector3(1.0F, 1.0F, 1.0F) + + Public Sub New(ByVal Entity As Entity, ByVal TransitionSpeed As Single, ByVal startDelay As Single, ByVal endDelay As Single, ByVal ColorTo As Color, Optional ByVal ColorFrom As Color = Nothing) + MyBase.New(New Vector3(0.0F), TextureManager.DefaultTexture, New Vector3(1.0F), startDelay, endDelay) + + Me.TransitionSpeed = TransitionSpeed + Me.TargetEntity = Entity + + If Not ColorFrom = Nothing Then + TargetEntity.Color = ColorFrom.ToVector3 + End If + Me.ColorTo = ColorTo.ToVector3 + + Me.Visible = False + + Me.AnimationType = AnimationTypes.Transition + End Sub + + Public Overrides Sub DoActionActive() + + If TargetEntity.Color.X > ColorTo.X Then + TargetEntity.Color.X -= CByte(Me.TransitionSpeed) + If TargetEntity.Color.X <= ColorTo.X Then + TargetEntity.Color.X = ColorTo.X + End If + ElseIf TargetEntity.Color.X < ColorTo.X Then + TargetEntity.Color.X += CByte(Me.TransitionSpeed) + If TargetEntity.Color.X >= ColorTo.X Then + TargetEntity.Color.X = ColorTo.X + End If + End If + If TargetEntity.Color.Y > ColorTo.Y Then + TargetEntity.Color.Y -= CByte(Me.TransitionSpeed) + If TargetEntity.Color.Y <= ColorTo.Y Then + TargetEntity.Color.Y = ColorTo.Y + End If + ElseIf TargetEntity.Color.Y < ColorTo.Y Then + TargetEntity.Color.Y += CByte(Me.TransitionSpeed) + If TargetEntity.Color.Y >= ColorTo.Y Then + TargetEntity.Color.Y = ColorTo.Y + End If + End If + If TargetEntity.Color.Z > ColorTo.Z Then + TargetEntity.Color.Z -= CByte(Me.TransitionSpeed) + If TargetEntity.Color.Z <= ColorTo.Z Then + TargetEntity.Color.Z = ColorTo.Z + End If + ElseIf TargetEntity.Color.Z < ColorTo.Z Then + TargetEntity.Color.Z += CByte(Me.TransitionSpeed) + If TargetEntity.Color.Z >= ColorTo.Z Then + TargetEntity.Color.Z = ColorTo.Z + End If + End If + + If TargetEntity.Color = ColorTo Then + Me.Ready = True + End If + End Sub + +End Class \ No newline at end of file diff --git a/P3D/Battle/BattleAnimations/BAEntityScale.vb b/P3D/Battle/BattleAnimations/BAEntityScale.vb index 24d1245ea..1e687de4c 100644 --- a/P3D/Battle/BattleAnimations/BAEntityScale.vb +++ b/P3D/Battle/BattleAnimations/BAEntityScale.vb @@ -6,7 +6,7 @@ Public EndSize As Vector3 Public SizeSpeed As Single = 0.01F Public TargetEntity As Entity - Public Anchors As String + Public Anchors As String '1 = Bottom, 2 = Top, 3 = Left, 4 = Right. Combinations are possible. Public Change As New Vector3(1) diff --git a/P3D/Battle/BattleAnimations/BAMove.vb b/P3D/Battle/BattleAnimations/BAMove.vb deleted file mode 100644 index e59c0f0e5..000000000 --- a/P3D/Battle/BattleAnimations/BAMove.vb +++ /dev/null @@ -1,194 +0,0 @@ -Public Class BAMove - - Inherits BattleAnimation3D - - Public Destination As Vector3 - Public MoveSpeed As Single - Public SpinX As Boolean = False - Public SpinZ As Boolean = False - - Public InterpolationSpeed As Single - Public SpinSpeedX As Single = 0.1F - Public SpinSpeedZ As Single = 0.1F - Public MovementCurve As Integer = 3 - - Private EasedIn As Boolean = False - Private EasedOut As Boolean = False - Public Enum Curves As Integer - EaseIn - EaseOut - EaseInAndOut - Linear - End Enum - Public Sub New(ByVal Position As Vector3, ByVal Texture As Texture2D, ByVal Scale As Vector3, ByVal Destination As Vector3, ByVal Speed As Single, ByVal SpinX As Boolean, ByVal SpinZ As Boolean, ByVal startDelay As Single, ByVal endDelay As Single, Optional ByVal SpinXSpeed As Single = 0.1F, Optional ByVal SpinZSpeed As Single = 0.1F, Optional MovementCurve As Integer = 2) - MyBase.New(Position, Texture, Scale, startDelay, endDelay) - - Me.Position = Position - Me.Destination = Destination - Me.MovementCurve = CType(MovementCurve, Curves) - - Me.MoveSpeed = Speed - Me.Scale = Scale - Me.SpinSpeedX = SpinXSpeed - Me.SpinSpeedZ = SpinZSpeed - - Me.SpinX = SpinX - Me.SpinZ = SpinZ - - Select Case MovementCurve - Case Curves.EaseIn - InterpolationSpeed = 0.0F - Case Curves.EaseOut - InterpolationSpeed = MoveSpeed - Case Curves.EaseInAndOut - InterpolationSpeed = 0.0F - Case Curves.Linear - InterpolationSpeed = MoveSpeed - End Select - - Me.AnimationType = AnimationTypes.Move - End Sub - - Public Sub New(ByVal Position As Vector3, ByVal Texture As Texture2D, ByVal Scale As Vector3, ByVal Destination As Vector3, ByVal Speed As Single, ByVal startDelay As Single, ByVal endDelay As Single) - Me.New(Position, Texture, Scale, Destination, Speed, False, False, startDelay, endDelay, 0.1, 0.1, 2) - End Sub - - Public Overrides Sub DoActionUpdate() - Spin() - End Sub - - Public Overrides Sub DoActionActive() - Move() - End Sub - - Private Sub Spin() - If Me.SpinX = True Then - Me.Rotation.X += SpinSpeedX - End If - If Me.SpinZ = True Then - Me.Rotation.Z += SpinSpeedZ - End If - End Sub - - Private Sub Move() - Select Case MovementCurve - Case Curves.EaseIn - If EasedIn = False Then - If InterpolationSpeed < MoveSpeed Then - InterpolationSpeed += MoveSpeed / 10 - Else - EasedIn = True - InterpolationSpeed = MoveSpeed - End If - End If - Case Curves.EaseOut - If EasedOut = False Then - If InterpolationSpeed > 0 Then - InterpolationSpeed -= MoveSpeed / 10 - Else - EasedOut = True - InterpolationSpeed = 0 - End If - End If - Case Curves.EaseInAndOut - If EasedIn = False Then - If InterpolationSpeed < MoveSpeed Then - InterpolationSpeed += MoveSpeed / 10 - Else - EasedIn = True - InterpolationSpeed = MoveSpeed - End If - Else - If EasedOut = False Then - If InterpolationSpeed > 0 Then - InterpolationSpeed -= MoveSpeed / 10 - Else - EasedOut = True - InterpolationSpeed = 0 - End If - End If - End If - End Select - If MovementCurve = Curves.Linear Then - If Me.Position.X < Me.Destination.X Then - Me.Position.X += Me.MoveSpeed - - If Me.Position.X >= Me.Destination.X Then - Me.Position.X = Me.Destination.X - End If - ElseIf Me.Position.X > Me.Destination.X Then - Me.Position.X -= Me.MoveSpeed - - If Me.Position.X <= Me.Destination.X Then - Me.Position.X = Me.Destination.X - End If - End If - If Me.Position.Y < Me.Destination.Y Then - Me.Position.Y += Me.MoveSpeed - - If Me.Position.Y >= Me.Destination.Y Then - Me.Position.Y = Me.Destination.Y - End If - ElseIf Me.Position.Y > Me.Destination.Y Then - Me.Position.Y -= Me.MoveSpeed - - If Me.Position.Y <= Me.Destination.Y Then - Me.Position.Y = Me.Destination.Y - End If - End If - If Me.Position.Z < Me.Destination.Z Then - Me.Position.Z += Me.MoveSpeed - - If Me.Position.Z >= Me.Destination.Z Then - Me.Position.Z = Me.Destination.Z - End If - ElseIf Me.Position.Z > Me.Destination.Z Then - Me.Position.Z -= Me.MoveSpeed - - If Me.Position.Z <= Me.Destination.Z Then - Me.Position.Z = Me.Destination.Z - End If - End If - Else - If Me.Position.X < Me.Destination.X Then - Me.Position.X = MathHelper.Lerp(Me.Position.X, Me.Destination.X, Me.InterpolationSpeed) - If Me.Position.X > Me.Destination.X - 0.05 Then - Me.Position.X = Me.Destination.X - End If - ElseIf Me.Position.X > Me.Destination.X Then - Me.Position.X = MathHelper.Lerp(Me.Position.X, Me.Destination.X, Me.InterpolationSpeed) - If Me.Position.X < Me.Destination.X + 0.05 Then - Me.Position.X = Me.Destination.X - End If - End If - If Me.Position.Y < Me.Destination.Y Then - Me.Position.Y = MathHelper.Lerp(Me.Position.Y, Me.Destination.Y, Me.InterpolationSpeed) - If Me.Position.Y > Me.Destination.Y - 0.05 Then - Me.Position.Y = Me.Destination.Y - End If - ElseIf Me.Position.Y > Me.Destination.Y Then - Me.Position.Y = MathHelper.Lerp(Me.Position.Y, Me.Destination.Y, Me.InterpolationSpeed) - If Me.Position.Y < Me.Destination.Y + 0.05 Then - Me.Position.Y = Me.Destination.Y - End If - End If - If Me.Position.Z < Me.Destination.Z Then - Me.Position.Z = MathHelper.Lerp(Me.Position.Z, Me.Destination.Z, Me.InterpolationSpeed) - If Me.Position.Z > Me.Destination.Z - 0.05 Then - Me.Position.Z = Me.Destination.Z - End If - ElseIf Me.Position.Z > Me.Destination.Z Then - Me.Position.Z = MathHelper.Lerp(Me.Position.Z, Me.Destination.Z, Me.InterpolationSpeed) - If Me.Position.Z < Me.Destination.Z + 0.05 Then - Me.Position.Z = Me.Destination.Z - End If - End If - End If - - If Me.Position = Destination Then - Me.Ready = True - End If - - End Sub - -End Class \ No newline at end of file diff --git a/P3D/Battle/BattleAnimations/BAOpacity.vb b/P3D/Battle/BattleAnimations/BAOpacity.vb deleted file mode 100644 index 5326dcea2..000000000 --- a/P3D/Battle/BattleAnimations/BAOpacity.vb +++ /dev/null @@ -1,41 +0,0 @@ -Public Class BAOpacity - - Inherits BattleAnimation3D - - Public TransitionSpeed As Single = 0.01F - Public FadeIn As Boolean = False - Public EndState As Single = 0.0F - - Public Sub New(ByVal Position As Vector3, ByVal Texture As Texture2D, ByVal Scale As Vector3, ByVal TransitionSpeed As Single, ByVal FadeIn As Boolean, ByVal EndState As Single, ByVal startDelay As Single, ByVal endDelay As Single, Optional ByVal StartState As Single = 1.0F) - MyBase.New(Position, Texture, Scale, startDelay, endDelay) - MyBase.Opacity = StartState - Me.EndState = EndState - Me.FadeIn = FadeIn - Me.TransitionSpeed = TransitionSpeed - - Me.AnimationType = AnimationTypes.Transition - End Sub - - Public Overrides Sub DoActionActive() - If Me.FadeIn = True Then - If Me.EndState > Me.Opacity Then - Me.Opacity += Me.TransitionSpeed - If Me.Opacity >= Me.EndState Then - Me.Opacity = Me.EndState - End If - End If - Else - If Me.EndState < Me.Opacity Then - Me.Opacity -= Me.TransitionSpeed - If Me.Opacity <= Me.EndState Then - Me.Opacity = Me.EndState - End If - End If - End If - - If Me.Opacity = Me.EndState Then - Me.Ready = True - End If - End Sub - -End Class \ No newline at end of file diff --git a/P3D/Battle/BattleAnimations/BARotation.vb b/P3D/Battle/BattleAnimations/BARotation.vb deleted file mode 100644 index 13f921a10..000000000 --- a/P3D/Battle/BattleAnimations/BARotation.vb +++ /dev/null @@ -1,129 +0,0 @@ -Public Class BARotation - - Inherits BattleAnimation3D - - Dim RotationVector As Vector3 - Dim EndRotation As Vector3 - Dim DoReturn As Boolean = False - Dim ReturnVector As Vector3 - Dim hasReturned As Boolean = False - Dim DoRotation As Vector3 = New Vector3(1.0F) - - Public Sub New(ByVal Position As Vector3, ByVal Texture As Texture2D, ByVal Scale As Vector3, ByVal RotationVector As Vector3, ByVal EndRotation As Vector3, ByVal startDelay As Single, ByVal endDelay As Single) - MyBase.New(Position, Texture, Scale, startDelay, endDelay) - - Me.RotationVector = RotationVector - Me.EndRotation = EndRotation - Me.ReturnVector = Me.Rotation - End Sub - - Public Sub New(ByVal Position As Vector3, ByVal Texture As Texture2D, ByVal Scale As Vector3, ByVal RotationVector As Vector3, ByVal EndRotation As Vector3, ByVal startDelay As Single, ByVal endDelay As Single, ByVal DoXRotation As Boolean, ByVal DoYRotation As Boolean, ByVal DoZRotation As Boolean) - Me.New(Position, Texture, Scale, RotationVector, EndRotation, startDelay, endDelay) - - If DoXRotation = False Then - DoRotation.X = 0.0F - End If - If DoYRotation = False Then - DoRotation.Y = 0.0F - End If - If DoZRotation = False Then - DoRotation.Z = 0.0F - End If - End Sub - - Public Sub New(ByVal Position As Vector3, ByVal Texture As Texture2D, ByVal Scale As Vector3, ByVal RotationVector As Vector3, ByVal EndRotation As Vector3, ByVal startDelay As Single, ByVal endDelay As Single, ByVal DoXRotation As Boolean, ByVal DoYRotation As Boolean, ByVal DoZRotation As Boolean, ByVal DoReturn As Boolean) - Me.New(Position, Texture, Scale, RotationVector, EndRotation, startDelay, endDelay, DoXRotation, DoYRotation, DoZRotation) - - Me.DoReturn = DoReturn - End Sub - - Public Overrides Sub DoActionActive() - If VectorReached() = False Then - - If DoRotation.X = 1.0F Then - If Me.Rotation.X > Me.EndRotation.X Then - Me.Rotation.X += Me.RotationVector.X - - If Me.Rotation.X <= Me.EndRotation.X Then - Me.Rotation.X = Me.EndRotation.X - End If - ElseIf Me.Rotation.X < Me.EndRotation.X Then - Me.Rotation.X += Me.RotationVector.X - - If Me.Rotation.X >= Me.EndRotation.X Then - Me.Rotation.X = Me.EndRotation.X - End If - End If - End If - - If DoRotation.Y = 1.0F Then - If Me.Rotation.Y > Me.EndRotation.Y Then - Me.Rotation.Y += Me.RotationVector.Y - - If Me.Rotation.Y <= Me.EndRotation.Y Then - Me.Rotation.Y = Me.EndRotation.Y - End If - ElseIf Me.Rotation.Y < Me.EndRotation.Y Then - Me.Rotation.Y += Me.RotationVector.Y - - If Me.Rotation.Y >= Me.EndRotation.Y Then - Me.Rotation.Y = Me.EndRotation.Y - End If - End If - End If - - If DoRotation.Z = 1.0F Then - If Me.Rotation.Z > Me.EndRotation.Z Then - Me.Rotation.Z += Me.RotationVector.Z - - If Me.Rotation.Z <= Me.EndRotation.Z Then - Me.Rotation.Z = Me.EndRotation.Z - End If - ElseIf Me.Rotation.Z < Me.EndRotation.Z Then - Me.Rotation.Z += Me.RotationVector.Z - - If Me.Rotation.Z >= Me.EndRotation.Z Then - Me.Rotation.Z = Me.EndRotation.Z - End If - End If - End If - - If VectorReached() = True Then - RotationReady() - End If - Else - RotationReady() - End If - End Sub - - Private Sub RotationReady() - If Me.DoReturn = True And Me.hasReturned = False Then - Me.hasReturned = True - Me.EndRotation = Me.ReturnVector - Me.RotationVector = New Vector3(Me.RotationVector.X * -1, Me.RotationVector.Y * -1, Me.RotationVector.Z * -1) - Else - Me.Ready = True - End If - End Sub - - Private Function VectorReached() As Boolean - If DoRotation.X = 1.0F Then - If EndRotation.X <> Me.Rotation.X Then - Return False - End If - End If - If DoRotation.Y = 1.0F Then - If EndRotation.Y <> Me.Rotation.Y Then - Return False - End If - End If - If DoRotation.Z = 1.0F Then - If EndRotation.Z <> Me.Rotation.Z Then - Return False - End If - End If - - Return True - End Function - -End Class \ No newline at end of file diff --git a/P3D/Battle/BattleAnimations/BASound.vb b/P3D/Battle/BattleAnimations/BASound.vb deleted file mode 100644 index da699ec23..000000000 --- a/P3D/Battle/BattleAnimations/BASound.vb +++ /dev/null @@ -1,28 +0,0 @@ -Public Class BASound - - Inherits BattleAnimation3D - - Private soundfile As String - Private stopMusic As Boolean - Private IsPokemon As Boolean - - - Public Sub New(ByVal sound As String, ByVal startDelay As Single, ByVal endDelay As Single, Optional ByVal stopMusic As Boolean = False, Optional ByVal IsPokemon As Boolean = False) - MyBase.New(New Vector3(0.0F), TextureManager.DefaultTexture, New Vector3(1.0F), startDelay, endDelay) - Me.Scale = New Vector3(1.0F) - soundfile = sound - Me.Visible = False - Me.stopMusic = stopMusic - Me.IsPokemon = IsPokemon - AnimationType = AnimationTypes.Sound - End Sub - - Public Overrides Sub DoActionActive() - If IsPokemon = True Then - SoundManager.PlayPokemonCry(CInt(soundfile)) - Else - SoundManager.PlaySound(soundfile, stopMusic) - End If - Me.Ready = True - End Sub -End Class \ No newline at end of file diff --git a/P3D/Battle/BattleAnimations/BattleAnimation3D.vb b/P3D/Battle/BattleAnimations/BattleAnimation3D.vb index 7d7c8050b..1aeb45e27 100644 --- a/P3D/Battle/BattleAnimations/BattleAnimation3D.vb +++ b/P3D/Battle/BattleAnimations/BattleAnimation3D.vb @@ -24,14 +24,19 @@ Public Ready As Boolean = False Public startDelay As Single Public endDelay As Single + Public SpawnedEntity As Entity = Nothing - Public Sub New(ByVal Position As Vector3, ByVal Texture As Texture2D, ByVal Scale As Vector3, ByVal startDelay As Single, ByVal endDelay As Single) + Public Sub New(ByVal Position As Vector3, ByVal Texture As Texture2D, ByVal Scale As Vector3, ByVal startDelay As Single, ByVal endDelay As Single, Optional SpawnedEntity As Entity = Nothing) MyBase.New(Position.X, Position.Y, Position.Z, "BattleAnimation", {Texture}, {0, 0}, False, 0, Scale, BaseModel.BillModel, 0, "", New Vector3(1.0F)) Me.Visible = Visible Me.startDelay = startDelay Me.endDelay = endDelay + If SpawnedEntity IsNot Nothing Then + Me.SpawnedEntity = SpawnedEntity + End If + Me.CreateWorldEveryFrame = True Me.DropUpdateUnlessDrawn = False End Sub @@ -56,6 +61,9 @@ startDelay = 0.0F End If Else + If SpawnedEntity IsNot Nothing Then + Ready = True + End If DoActionActive() End If End If diff --git a/P3D/Battle/BattleSystemV2/Battle.vb b/P3D/Battle/BattleSystemV2/Battle.vb index 823bea6f1..a93c5e4bc 100644 --- a/P3D/Battle/BattleSystemV2/Battle.vb +++ b/P3D/Battle/BattleSystemV2/Battle.vb @@ -2706,19 +2706,14 @@ ChangeCameraAngle(1, own, BattleScreen) 'Burn animation Dim BurnAnimation As AnimationQueryObject = New AnimationQueryObject(pNPC, own) - BurnAnimation.AnimationPlaySound("Battle\Effects\Burned", 0, 0) + BurnAnimation.PlaySound("Battle\Effects\Burned", 0, 0) Dim FlameEntity As Entity = BurnAnimation.SpawnEntity(New Vector3(CSng(pNPC.Position.X - 0.25), CSng(pNPC.Position.Y - 0.25), CSng(pNPC.Position.Z - 0.25)), TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 0, 32, 32)), New Vector3(0.5, 0.5, 0.5), 1.0F) - BurnAnimation.AnimationChangeTexture(FlameEntity, TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 32, 32, 32)), 2, 1) - BurnAnimation.AnimationChangeTexture(FlameEntity, TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 64, 32, 32)), 3, 1) - BurnAnimation.AnimationChangeTexture(FlameEntity, TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 96, 32, 32)), 4, 1) - BurnAnimation.AnimationChangeTexture(FlameEntity, TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 128, 32, 32)), 5, 1) - BurnAnimation.AnimationFadeEntity(FlameEntity, 1, False, 0.0F, 6, 1, 1) + BurnAnimation.ChangeEntityTexture(FlameEntity, False, TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 32, 32, 32)), 2, 1) + BurnAnimation.ChangeEntityTexture(FlameEntity, False, TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 64, 32, 32)), 3, 1) + BurnAnimation.ChangeEntityTexture(FlameEntity, False, TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 96, 32, 32)), 4, 1) + BurnAnimation.ChangeEntityTexture(FlameEntity, True, TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 128, 32, 32)), 5, 2) BattleScreen.BattleQuery.Add(BurnAnimation) - If FlameEntity.Opacity = 0.0F Then - BurnAnimation.RemoveEntity(FlameEntity) - End If - Select Case message Case "" 'Print default message only BattleScreen.BattleQuery.Add(New TextQueryObject(p.GetDisplayName() & " got burned!")) @@ -2729,30 +2724,30 @@ BattleScreen.BattleQuery.Add(New TextQueryObject(p.GetDisplayName() & " got burned!")) End Select If p.Ability.Name.ToLower() = "synchronize" AndAlso from <> own Then - Me.InflictBurn(Not own, Not own, BattleScreen, "Synchronize passed over the burn.", "synchronize") - End If - - If Not p.Item Is Nothing Then - If p.Item.Name.ToLower() = "rawst" AndAlso BattleScreen.FieldEffects.CanUseItem(own) = True AndAlso BattleScreen.FieldEffects.CanUseOwnItem(own, BattleScreen) = True Then - If RemoveHeldItem(own, own, BattleScreen, "", "berry:rawst") = True Then - BattleScreen.BattleQuery.Add(New PlaySoundQueryObject("Use_Item", False)) - CureStatusProblem(own, own, BattleScreen, "The Rawst Berry cured the burn of " & p.GetDisplayName() & "!", "berry:rawst") - End If - End If - End If - - If Not p.Item Is Nothing Then - If p.Item.Name.ToLower() = "lum" AndAlso BattleScreen.FieldEffects.CanUseItem(own) = True AndAlso BattleScreen.FieldEffects.CanUseOwnItem(own, BattleScreen) = True Then - If RemoveHeldItem(own, own, BattleScreen, "", "berry:lum") = True Then - BattleScreen.BattleQuery.Add(New PlaySoundQueryObject("Use_Item", False)) - CureStatusProblem(own, own, BattleScreen, "The Lum Berry cured the burn of " & p.GetDisplayName() & "!", "berry:lum") - End If - End If - End If - - Return True + Me.InflictBurn(Not own, Not own, BattleScreen, "Synchronize passed over the burn.", "synchronize") End If + + If Not p.Item Is Nothing Then + If p.Item.Name.ToLower() = "rawst" AndAlso BattleScreen.FieldEffects.CanUseItem(own) = True AndAlso BattleScreen.FieldEffects.CanUseOwnItem(own, BattleScreen) = True Then + If RemoveHeldItem(own, own, BattleScreen, "", "berry:rawst") = True Then + BattleScreen.BattleQuery.Add(New PlaySoundQueryObject("Use_Item", False)) + CureStatusProblem(own, own, BattleScreen, "The Rawst Berry cured the burn of " & p.GetDisplayName() & "!", "berry:rawst") + End If + End If + End If + + If Not p.Item Is Nothing Then + If p.Item.Name.ToLower() = "lum" AndAlso BattleScreen.FieldEffects.CanUseItem(own) = True AndAlso BattleScreen.FieldEffects.CanUseOwnItem(own, BattleScreen) = True Then + If RemoveHeldItem(own, own, BattleScreen, "", "berry:lum") = True Then + BattleScreen.BattleQuery.Add(New PlaySoundQueryObject("Use_Item", False)) + CureStatusProblem(own, own, BattleScreen, "The Lum Berry cured the burn of " & p.GetDisplayName() & "!", "berry:lum") + End If + End If + End If + + Return True End If + End If End If End If End If @@ -3421,19 +3416,18 @@ Dim maxAmount As Integer = 20 * val Dim currentAmount As Integer = 0 While currentAmount <= maxAmount - Dim Texture As String = "Textures\Battle\StatChange\statDown" - Dim Position As Vector3 = New Vector3(0, -0.4, 0) - Dim Destination As Vector3 = New Vector3(0, 0.8, 0) - Dim Scale As Vector3 = New Vector3(0.2F) + Dim Texture As Texture2D = TextureManager.GetTexture("Textures\Battle\StatChange\statUp") Dim xPos = CSng((Random.NextDouble() - 0.5) * 1.2) Dim zPos = CSng((Random.NextDouble() - 0.5) * 1.2) - Position.X = xPos - Position.Z = zPos - Destination.X = xPos - Destination.Z = zPos + Dim Position As New Vector3(xPos + pNPC.Position.X, CSng(pNPC.Position.Y - 0.4), pNPC.Position.Z + zPos) + Dim Destination As New Vector3(xPos + pNPC.Position.X, CSng(pNPC.Position.Y + 0.8), zPos + pNPC.Position.Z) + Dim Scale As New Vector3(0.2F) + + Dim StatEntity As Entity = StatAnimation.SpawnEntity(Position, Texture, Scale, 1.0F) Dim startDelay As Double = 5.0 * Random.NextDouble() - StatAnimation.AnimationSpawnMovingEntity(Position.X, Position.Y, Position.Z, Texture, Scale.X, Scale.Y, Scale.Z, Destination.X, Destination.Y, Destination.Z, 0.05F, False, True, CSng(startDelay), 0.0F) + + StatAnimation.MoveEntity(Nothing, True, Destination.X, Destination.Y, Destination.Z, 0.05F, False, True, CSng(startDelay), 0.0F) Threading.Interlocked.Increment(currentAmount) End While BattleScreen.BattleQuery.Add(New PlaySoundQueryObject("Battle\Effects\Stat_Raise", False)) @@ -3699,27 +3693,26 @@ End If End If '***STAT DECREASE ANIMATION*** - Dim MoveAnimation As AnimationQueryObject = New AnimationQueryObject(pNPC, Not own) + Dim StatAnimation As AnimationQueryObject = New AnimationQueryObject(pNPC, Not own) Dim maxAmount As Integer = 20 * val Dim currentAmount As Integer = 0 While currentAmount <= maxAmount - Dim Texture As String = "Textures\Battle\StatChange\statDown" - Dim Position As Vector3 = New Vector3(0, 0.8, 0) - Dim Destination As Vector3 = New Vector3(0, -0.4, 0) - Dim Scale As Vector3 = New Vector3(0.2F) + Dim Texture As Texture2D = TextureManager.GetTexture("Textures\Battle\StatChange\statDown") Dim xPos = CSng((Random.NextDouble() - 0.5) * 1.2) Dim zPos = CSng((Random.NextDouble() - 0.5) * 1.2) - Position.X = xPos - Position.Z = zPos - Destination.X = xPos - Destination.Z = zPos + Dim Position As New Vector3(xPos + pNPC.Position.X, CSng(pNPC.Position.Y + 0.8), pNPC.Position.Z + zPos) + Dim Destination As New Vector3(xPos + pNPC.Position.X, CSng(pNPC.Position.Y - 0.4), zPos + pNPC.Position.Z) + Dim Scale As New Vector3(0.2F) + + Dim StatEntity As Entity = StatAnimation.SpawnEntity(Position, Texture, Scale, 1.0F) Dim startDelay As Double = 5.0 * Random.NextDouble() - MoveAnimation.AnimationSpawnMovingEntity(Position.X, Position.Y, Position.Z, Texture, Scale.X, Scale.Y, Scale.Z, Destination.X, Destination.Y, Destination.Z, 0.05F, False, True, CSng(startDelay), 0.0F) + + StatAnimation.MoveEntity(Nothing, True, Destination.X, Destination.Y, Destination.Z, 0.05F, False, True, CSng(startDelay), 0.0F) Threading.Interlocked.Increment(currentAmount) End While - MoveAnimation.AnimationPlaySound("Battle\Effects\Stat_Lower", 0.0F, 10.0F) - BattleScreen.BattleQuery.Add(MoveAnimation) + StatAnimation.PlaySound("Battle\Effects\Stat_Lower", 0.0F, 10.0F) + BattleScreen.BattleQuery.Add(StatAnimation) Dim printMessage As String = p.GetDisplayName() & "'s " & statString Select Case val @@ -4005,10 +3998,10 @@ End If Dim HitAnimation As AnimationQueryObject = New AnimationQueryObject(pNPC, own) - HitAnimation.AnimationFadeEntity(Nothing, 1, False, 0, 0, 0) - HitAnimation.AnimationFadeEntity(Nothing, 1, True, 1, 1, 0) - HitAnimation.AnimationFadeEntity(Nothing, 1, False, 0, 2, 0) - HitAnimation.AnimationFadeEntity(Nothing, 1, True, 1, 3, 0) + HitAnimation.FadeEntity(Nothing, False, 1, False, 0, 0, 0) + HitAnimation.FadeEntity(Nothing, False, 1, True, 1, 1, 0) + HitAnimation.FadeEntity(Nothing, False, 1, False, 0, 2, 0) + HitAnimation.FadeEntity(Nothing, False, 1, True, 1, 3, 0) BattleScreen.BattleQuery.Add(HitAnimation) If own = True Then @@ -4763,14 +4756,14 @@ #End Region - ''' - ''' Switches camera to angle - ''' - ''' 0=main battle/1=own pokemon/2=opp pokemon - ''' If the code comes from the own player or not. - ''' Battlescreen reference - ''' If the call should get added the PVP list or the own queue. - Public Sub ChangeCameraAngle(ByVal direction As Integer, ByVal own As Boolean, ByVal BattleScreen As BattleScreen, Optional ByVal AddPVP As Boolean = False) + ''' + ''' Switches camera to angle + ''' + ''' 0=main battle/1=own pokemon/2=opp pokemon + ''' If the code comes from the own player or not. + ''' Battlescreen reference + ''' If the call should get added the PVP list or the own queue. + Public Sub ChangeCameraAngle(ByVal direction As Integer, ByVal own As Boolean, ByVal BattleScreen As BattleScreen, Optional ByVal AddPVP As Boolean = False) Dim q As CameraQueryObject = Nothing Select Case direction @@ -5364,7 +5357,7 @@ If .OwnPokemon.Status = Pokemon.StatusProblems.Poison Then 'Own Poison 'Poison animation Dim PoisonAnimation As AnimationQueryObject = New AnimationQueryObject(BattleScreen.OwnPokemonNPC, True) - PoisonAnimation.AnimationPlaySound("Battle\Effects\Poisoned", 0, 0) + PoisonAnimation.PlaySound("Battle\Effects\Poisoned", 0, 0) PoisonAnimation.AnimationSpawnFadingEntity(-0.25, -0.25, -0.25, "Textures\Battle\Poison\Bubble,0,0,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 0, 1) PoisonAnimation.AnimationSpawnFadingEntity(-0.25, -0.25, -0.25, "Textures\Battle\Poison\Bubble,0,32,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 1, 1) @@ -5388,7 +5381,7 @@ Dim multiplier As Double = (.FieldEffects.OwnPoisonCounter / 16) 'Poison animation Dim PoisonAnimation As AnimationQueryObject = New AnimationQueryObject(BattleScreen.OwnPokemonNPC, True) - PoisonAnimation.AnimationPlaySound("Battle\Effects\Poisoned", 0, 0) + PoisonAnimation.PlaySound("Battle\Effects\Poisoned", 0, 0) PoisonAnimation.AnimationSpawnFadingEntity(-0.25, -0.25, -0.25, "Textures\Battle\Poison\Bubble,0,0,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 0, 1) PoisonAnimation.AnimationSpawnFadingEntity(-0.25, -0.25, -0.25, "Textures\Battle\Poison\Bubble,0,32,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 1, 1) @@ -5420,20 +5413,15 @@ 'Burn animation Dim BurnAnimation As AnimationQueryObject = New AnimationQueryObject(BattleScreen.OwnPokemonNPC, False) - BurnAnimation.AnimationPlaySound("Battle\Effects\Burned", 0, 0) + BurnAnimation.PlaySound("Battle\Effects\Burned", 0, 0) Dim FlameEntity As Entity = BurnAnimation.SpawnEntity(New Vector3(CSng(BattleScreen.OwnPokemonNPC.Position.X + 0.25), CSng(BattleScreen.OwnPokemonNPC.Position.Y - 0.25), CSng(BattleScreen.OwnPokemonNPC.Position.Z + 0.25)), TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 0, 32, 32)), New Vector3(0.5, 0.5, 0.5), 1.0F) - BurnAnimation.AnimationChangeTexture(FlameEntity, TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 32, 32, 32)), 2, 1) - BurnAnimation.AnimationChangeTexture(FlameEntity, TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 64, 32, 32)), 3, 1) - BurnAnimation.AnimationChangeTexture(FlameEntity, TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 96, 32, 32)), 4, 1) - BurnAnimation.AnimationChangeTexture(FlameEntity, TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 128, 32, 32)), 5, 1) - BurnAnimation.AnimationFadeEntity(FlameEntity, 1, False, 0.0F, 6, 1, 1) + BurnAnimation.ChangeEntityTexture(FlameEntity, False, TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 32, 32, 32)), 2, 1) + BurnAnimation.ChangeEntityTexture(FlameEntity, False, TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 64, 32, 32)), 3, 1) + BurnAnimation.ChangeEntityTexture(FlameEntity, False, TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 96, 32, 32)), 4, 1) + BurnAnimation.ChangeEntityTexture(FlameEntity, True, TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 128, 32, 32)), 5, 2) BattleScreen.BattleQuery.Add(BurnAnimation) - If FlameEntity.Opacity = 0.0F Then - BurnAnimation.RemoveEntity(FlameEntity) - End If - 'Actual damage ReduceHP(reduceAmount, True, True, BattleScreen, .OwnPokemon.GetDisplayName() & " is hurt by the burn.", "burn") End If @@ -6163,7 +6151,7 @@ If .OppPokemon.Status = Pokemon.StatusProblems.Poison Then 'Opp Poison 'Poison animation Dim PoisonAnimation As AnimationQueryObject = New AnimationQueryObject(BattleScreen.OppPokemonNPC, False) - PoisonAnimation.AnimationPlaySound("Battle\Effects\Poisoned", 0, 0) + PoisonAnimation.PlaySound("Battle\Effects\Poisoned", 0, 0) PoisonAnimation.AnimationSpawnFadingEntity(-0.25, -0.25, -0.25, "Textures\Battle\Poison\Bubble,0,0,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 0, 1) PoisonAnimation.AnimationSpawnFadingEntity(-0.25, -0.25, -0.25, "Textures\Battle\Poison\Bubble,0,32,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 1, 1) @@ -6187,7 +6175,7 @@ Dim multiplier As Double = (.FieldEffects.OppPoisonCounter / 16) 'Poison animation Dim PoisonAnimation As AnimationQueryObject = New AnimationQueryObject(BattleScreen.OppPokemonNPC, False) - PoisonAnimation.AnimationPlaySound("Battle\Effects\Poisoned", 0, 0) + PoisonAnimation.PlaySound("Battle\Effects\Poisoned", 0, 0) PoisonAnimation.AnimationSpawnFadingEntity(-0.25, -0.25, -0.25, "Textures\Battle\Poison\Bubble,0,0,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 0, 1) PoisonAnimation.AnimationSpawnFadingEntity(-0.25, -0.25, -0.25, "Textures\Battle\Poison\Bubble,0,32,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 1, 1) @@ -6218,20 +6206,15 @@ End If 'Burn animation Dim BurnAnimation As AnimationQueryObject = New AnimationQueryObject(BattleScreen.OppPokemonNPC, False) - BurnAnimation.AnimationPlaySound("Battle\Effects\Burned", 0, 0) + BurnAnimation.PlaySound("Battle\Effects\Burned", 0, 0) Dim FlameEntity As Entity = BurnAnimation.SpawnEntity(New Vector3(CSng(BattleScreen.OppPokemonNPC.Position.X - 0.25), CSng(BattleScreen.OwnPokemonNPC.Position.Y - 0.25), CSng(BattleScreen.OwnPokemonNPC.Position.Z - 0.25)), TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 0, 32, 32)), New Vector3(0.5, 0.5, 0.5), 1.0F) - BurnAnimation.AnimationChangeTexture(FlameEntity, TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 32, 32, 32)), 2, 1) - BurnAnimation.AnimationChangeTexture(FlameEntity, TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 64, 32, 32)), 3, 1) - BurnAnimation.AnimationChangeTexture(FlameEntity, TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 96, 32, 32)), 4, 1) - BurnAnimation.AnimationChangeTexture(FlameEntity, TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 128, 32, 32)), 5, 1) - BurnAnimation.AnimationFadeEntity(FlameEntity, 1, False, 0.0F, 6, 1, 1) + BurnAnimation.ChangeEntityTexture(FlameEntity, False, TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 32, 32, 32)), 2, 1) + BurnAnimation.ChangeEntityTexture(FlameEntity, False, TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 64, 32, 32)), 3, 1) + BurnAnimation.ChangeEntityTexture(FlameEntity, False, TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 96, 32, 32)), 4, 1) + BurnAnimation.ChangeEntityTexture(FlameEntity, True, TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 128, 32, 32)), 5, 2) BattleScreen.BattleQuery.Add(BurnAnimation) - If FlameEntity.Opacity = 0.0F Then - BurnAnimation.RemoveEntity(FlameEntity) - End If - 'Actual damage ReduceHP(reduceAmount, False, False, BattleScreen, .OppPokemon.GetDisplayName() & " is hurt by the burn.", "burn") End If @@ -6756,38 +6739,38 @@ End If Else If BattleScreen.IsTrainerBattle = True Then - EndBattle(EndBattleReasons.LoseTrainer, BattleScreen, False) - If BattleScreen.IsRemoteBattle = True Then - EndBattle(EndBattleReasons.LoseTrainer, BattleScreen, True) - End If - Else - EndBattle(EndBattleReasons.LoseWild, BattleScreen, False) - End If - End If - End With - End Sub + EndBattle(EndBattleReasons.LoseTrainer, BattleScreen, False) + If BattleScreen.IsRemoteBattle = True Then + EndBattle(EndBattleReasons.LoseTrainer, BattleScreen, True) + End If + Else + EndBattle(EndBattleReasons.LoseWild, BattleScreen, False) + End If + End If + End With + End Sub - Public Sub ApplyOwnBatonPass(ByVal BattleScreen As BattleScreen) - If BattleScreen.FieldEffects.OwnUsedBatonPass = True Then - BattleScreen.FieldEffects.OwnUsedBatonPass = False + Public Sub ApplyOwnBatonPass(ByVal BattleScreen As BattleScreen) + If BattleScreen.FieldEffects.OwnUsedBatonPass = True Then + BattleScreen.FieldEffects.OwnUsedBatonPass = False - BattleScreen.OwnPokemon.StatAttack = BattleScreen.FieldEffects.OwnBatonPassStats(0) - BattleScreen.OwnPokemon.StatDefense = BattleScreen.FieldEffects.OwnBatonPassStats(1) - BattleScreen.OwnPokemon.StatSpAttack = BattleScreen.FieldEffects.OwnBatonPassStats(2) - BattleScreen.OwnPokemon.StatSpDefense = BattleScreen.FieldEffects.OwnBatonPassStats(3) - BattleScreen.OwnPokemon.StatSpeed = BattleScreen.FieldEffects.OwnBatonPassStats(4) - BattleScreen.OwnPokemon.Evasion = BattleScreen.FieldEffects.OwnBatonPassStats(5) - BattleScreen.OwnPokemon.Accuracy = BattleScreen.FieldEffects.OwnBatonPassStats(6) + BattleScreen.OwnPokemon.StatAttack = BattleScreen.FieldEffects.OwnBatonPassStats(0) + BattleScreen.OwnPokemon.StatDefense = BattleScreen.FieldEffects.OwnBatonPassStats(1) + BattleScreen.OwnPokemon.StatSpAttack = BattleScreen.FieldEffects.OwnBatonPassStats(2) + BattleScreen.OwnPokemon.StatSpDefense = BattleScreen.FieldEffects.OwnBatonPassStats(3) + BattleScreen.OwnPokemon.StatSpeed = BattleScreen.FieldEffects.OwnBatonPassStats(4) + BattleScreen.OwnPokemon.Evasion = BattleScreen.FieldEffects.OwnBatonPassStats(5) + BattleScreen.OwnPokemon.Accuracy = BattleScreen.FieldEffects.OwnBatonPassStats(6) - If BattleScreen.FieldEffects.OwnBatonPassConfusion = True Then - BattleScreen.FieldEffects.OwnBatonPassConfusion = False - BattleScreen.OwnPokemon.AddVolatileStatus(Pokemon.VolatileStatus.Confusion) - End If - End If - End Sub + If BattleScreen.FieldEffects.OwnBatonPassConfusion = True Then + BattleScreen.FieldEffects.OwnBatonPassConfusion = False + BattleScreen.OwnPokemon.AddVolatileStatus(Pokemon.VolatileStatus.Confusion) + End If + End If + End Sub - Public Sub SwitchInOwn(ByVal BattleScreen As BattleScreen, ByVal NewPokemonIndex As Integer, ByVal FirstTime As Boolean, ByVal InsertIndex As Integer, Optional ByVal message As String = "") - HasSwitchedInOwn = True + Public Sub SwitchInOwn(ByVal BattleScreen As BattleScreen, ByVal NewPokemonIndex As Integer, ByVal FirstTime As Boolean, ByVal InsertIndex As Integer, Optional ByVal message As String = "") + HasSwitchedInOwn = True If FirstTime = False Then Dim insertMessage As String = message @@ -6800,28 +6783,32 @@ Dim BallReturn As AnimationQueryObject = New AnimationQueryObject(BattleScreen.OwnPokemonNPC, False, BattleScreen.OwnPokemonModel) ' Ball Closes - BallReturn.AnimationPlaySound("Battle\Pokeball\Open", 0, 0) + BallReturn.PlaySound("Battle\Pokeball\Open", 0, 0) Dim SmokeReturned As Integer = 0 Do Dim SmokePosition = New Vector3(CSng(Random.Next(-10, 10) / 10), CSng(Random.Next(-10, 10) / 10), CSng(Random.Next(-10, 10) / 10)) - Dim SmokeDestination = New Vector3(0, 0, 0) + Dim SmokeDestination As Vector3 = New Vector3(0, 0, 0) - Dim SmokeTexture As String = "Textures\Battle\Cloud" + Dim SmokeTexture As Texture2D = TextureManager.GetTexture("Textures\Battle\Smoke") Dim SmokeScale = New Vector3(CSng(Random.Next(2, 6) / 10)) Dim SmokeSpeed = CSng(Random.Next(1, 3) / 10.0F) - BallReturn.AnimationSpawnMovingEntity(SmokePosition.X, SmokePosition.Y, SmokePosition.Z, SmokeTexture, SmokeScale.X, SmokeScale.Y, SmokeScale.Z, SmokeDestination.X, SmokeDestination.Y, SmokeDestination.Z, SmokeSpeed, False, False, 0.0F, 0.0F) + Dim SmokeEntity As Entity = BallReturn.SpawnEntity(SmokePosition, SmokeTexture, SmokeScale, 1.0F) + + BallReturn.MoveEntity(SmokeEntity, True, SmokeDestination.X, SmokeDestination.Y, SmokeDestination.Z, SmokeSpeed, False, False, 0.0F, 0.0F) + Threading.Interlocked.Increment(SmokeReturned) Loop While SmokeReturned <= 38 ' Pokemon disappears - BallReturn.AnimationFadeEntity(Nothing, 1, False, 0, 1, 0) - BallReturn.AnimationMoveEntity(Nothing, 0, 0.5, 0, 0.5, False, False, 2, 0,,, 3) + BallReturn.FadeEntity(Nothing, False, 1, False, 0, 1, 0) + BallReturn.MoveEntity(Nothing, False, 0, 0.5, 0, 0.5, False, False, 2, 0,,, 3) ' Ball returns - BallReturn.AnimationPlaySound("Battle\Pokeball\Throw", 1, 0) - BallReturn.AnimationSpawnMovingEntity(0, 0, 0, BattleScreen.OwnPokemon.CatchBall.TextureSource, 0.3F, 0.3F, 0.3F, -2, 0, 0, 0.1, False, True, 1, 0,, 0.3) + BallReturn.PlaySound("Battle\Pokeball\Throw", 1, 0) + Dim BallReturnEntity As Entity = BallReturn.SpawnEntity(BattleScreen.OwnPokemonNPC.Position, TextureManager.GetTexture(BattleScreen.OwnPokemon.CatchBall.TextureSource), New Vector3(0.3F), 1.0F) + BallReturn.MoveEntity(BallReturnEntity, True, BattleScreen.OwnPokemonNPC.Position.X - 2, BattleScreen.OwnPokemonNPC.Position.Y, BattleScreen.OwnPokemonNPC.Position.Z, 0.1, False, True, 1, 0,, 0.3) BattleScreen.AddToQuery(InsertIndex, BallReturn) @@ -6859,315 +6846,322 @@ ' Ball is thrown Dim BallThrow As AnimationQueryObject = New AnimationQueryObject(BattleScreen.OwnPokemonNPC, False, BattleScreen.OwnPokemonModel) - BallThrow.AnimationPlaySound("Battle\Pokeball\Throw", 0, 0) - BallThrow.AnimationSpawnMovingEntity(-2, -0.15, 0, BattleScreen.OwnPokemon.CatchBall.TextureSource, 0.3F, 0.3F, 0.3F, 0, 0.35, 0, 0.1, False, True, 0F, 0F,, 0.3) + + BallThrow.PlaySound("Battle\Pokeball\Throw", 0, 0) + + Dim BallThrowEntity As Entity = BallReturn.SpawnEntity(BattleScreen.OwnPokemonNPC.Position + New Vector3(-2, -0.15, 0), TextureManager.GetTexture(BattleScreen.OwnPokemon.CatchBall.TextureSource), New Vector3(0.3F), 1.0F) + BallThrow.MoveEntity(BallThrowEntity, True, BattleScreen.OwnPokemonNPC.Position.X, CSng(BattleScreen.OwnPokemonNPC.Position.Y + 0.35), BattleScreen.OwnPokemonNPC.Position.Z, 0.1, False, True, 0F, 0F,, 0.3) ' Ball Opens - BallThrow.AnimationPlaySound("Battle\Pokeball\Open", 3, 0) + BallThrow.PlaySound("Battle\Pokeball\Open", 3, 0) + Dim SmokeSpawned As Integer = 0 Do Dim SmokePosition = New Vector3(0, 0.35, 0) Dim SmokeDestination = New Vector3(CSng(Random.Next(-10, 10) / 10), CSng(Random.Next(-10, 10) / 10), CSng(Random.Next(-10, 10) / 10)) - Dim SmokeTexture As String = "Textures\Battle\Cloud" + Dim SmokeTexture As Texture2D = TextureManager.GetTexture("Textures\Battle\Smoke") Dim SmokeScale = New Vector3(CSng(Random.Next(2, 6) / 10)) Dim SmokeSpeed = CSng(Random.Next(1, 3) / 10.0F) - BallThrow.AnimationSpawnMovingEntity(SmokePosition.X, SmokePosition.Y, SmokePosition.Z, SmokeTexture, SmokeScale.X, SmokeScale.Y, SmokeScale.Z, SmokeDestination.X, SmokeDestination.Y, SmokeDestination.Z, SmokeSpeed, False, False, 3.0F, 0.0F) + Dim SmokeEntity As Entity = BallThrow.SpawnEntity(SmokePosition, SmokeTexture, SmokeScale, 1.0F) + + BallThrow.MoveEntity(SmokeEntity, True, SmokeDestination.X, SmokeDestination.Y, SmokeDestination.Z, SmokeSpeed, False, False, 3.0F, 0.0F) + Threading.Interlocked.Increment(SmokeSpawned) Loop While SmokeSpawned <= 38 ' Pokemon appears - BallThrow.AnimationFadeEntity(Nothing, 1, True, 1, 4, 0) - BallThrow.AnimationPlaySound(CStr(BattleScreen.OwnPokemon.Number), 4, 0,, True) + BallThrow.FadeEntity(Nothing, False, 1, True, 1, 4, 0) + BallThrow.PlaySound(CStr(BattleScreen.OwnPokemon.Number), 4, 0,, True) ' Pokémon falls down - BallThrow.AnimationMoveEntity(Nothing, 0, 0, 0, 0.05F, False, False, 4, 0,,, 3) + BallThrow.MoveEntity(Nothing, False, 0, 0, 0, 0.05F, False, False, 4, 0,,, 3) BattleScreen.AddToQuery(InsertIndex, BallThrow) End If With BattleScreen - If .FieldEffects.UsedPokemon.Contains(NewPokemonIndex) = False Then - .FieldEffects.UsedPokemon.Add(NewPokemonIndex) - End If + If .FieldEffects.UsedPokemon.Contains(NewPokemonIndex) = False Then + .FieldEffects.UsedPokemon.Add(NewPokemonIndex) + End If - If Not .OwnPokemon.Item Is Nothing Then - If .OwnPokemon.Item.Name.ToLower() = "amulet coin" Or .OwnPokemon.Item.Name.ToLower() = "luck incense" Then - If .FieldEffects.CanUseItem(True) = True And .FieldEffects.CanUseOwnItem(True, BattleScreen) = True Then - BattleScreen.FieldEffects.AmuletCoin += 1 - End If - End If - End If + If Not .OwnPokemon.Item Is Nothing Then + If .OwnPokemon.Item.Name.ToLower() = "amulet coin" Or .OwnPokemon.Item.Name.ToLower() = "luck incense" Then + If .FieldEffects.CanUseItem(True) = True And .FieldEffects.CanUseOwnItem(True, BattleScreen) = True Then + BattleScreen.FieldEffects.AmuletCoin += 1 + End If + End If + End If - Dim p As Pokemon = .OwnPokemon - Dim op As Pokemon = .OppPokemon + Dim p As Pokemon = .OwnPokemon + Dim op As Pokemon = .OppPokemon - Dim spikeAffected As Boolean = True - Dim rockAffected As Boolean = True + Dim spikeAffected As Boolean = True + Dim rockAffected As Boolean = True - spikeAffected = BattleScreen.FieldEffects.IsGrounded(True, BattleScreen) + spikeAffected = BattleScreen.FieldEffects.IsGrounded(True, BattleScreen) - 'Spikes - If spikeAffected = True Then - If .FieldEffects.OppSpikes > 0 And (p.Ability.Name.ToLower() <> "magic guard" Or BattleScreen.FieldEffects.CanUseAbility(True, BattleScreen, 1) = False) Then - Dim spikeDamage As Double = 1D - Select Case .FieldEffects.OppSpikes - Case 1 - spikeDamage = (p.MaxHP / 100) * 12.5D - Case 2 - spikeDamage = (p.MaxHP / 100) * 16.7D - Case 3 - spikeDamage = (p.MaxHP / 100) * 25D - End Select - ReduceHP(CInt(spikeDamage), True, False, BattleScreen, "The Spikes hurt " & p.GetDisplayName() & "!", "spikes") - End If - End If + 'Spikes + If spikeAffected = True Then + If .FieldEffects.OppSpikes > 0 And (p.Ability.Name.ToLower() <> "magic guard" Or BattleScreen.FieldEffects.CanUseAbility(True, BattleScreen, 1) = False) Then + Dim spikeDamage As Double = 1D + Select Case .FieldEffects.OppSpikes + Case 1 + spikeDamage = (p.MaxHP / 100) * 12.5D + Case 2 + spikeDamage = (p.MaxHP / 100) * 16.7D + Case 3 + spikeDamage = (p.MaxHP / 100) * 25D + End Select + ReduceHP(CInt(spikeDamage), True, False, BattleScreen, "The Spikes hurt " & p.GetDisplayName() & "!", "spikes") + End If + End If - 'Sticky Web - If spikeAffected = True Then - If .FieldEffects.OppStickyWeb > 0 Then + 'Sticky Web + If spikeAffected = True Then + If .FieldEffects.OppStickyWeb > 0 Then - LowerStat(True, True, BattleScreen, "Speed", 1, "Your pokemon was caught in a Sticky Web!", "stickyweb") + LowerStat(True, True, BattleScreen, "Speed", 1, "Your pokemon was caught in a Sticky Web!", "stickyweb") - End If - End If + End If + End If - 'Toxic Spikes - If spikeAffected = True Then - If .FieldEffects.OppToxicSpikes > 0 And p.Status = Pokemon.StatusProblems.None And p.Type1.Type <> Element.Types.Poison And p.Type2.Type <> Element.Types.Poison Then - Select Case .FieldEffects.OppToxicSpikes - Case 1 - InflictPoison(True, False, BattleScreen, False, "The Toxic Spikes hurt " & p.GetDisplayName() & "!", "toxicspikes") - Case 2 - InflictPoison(True, False, BattleScreen, True, "The Toxic Spikes hurt " & p.GetDisplayName() & "!", "toxicspikes") - End Select - End If - If .FieldEffects.OppToxicSpikes > 0 Then - If p.Type1.Type = Element.Types.Poison Or p.Type2.Type = Element.Types.Poison Then - .AddToQuery(InsertIndex, New TextQueryObject(p.GetDisplayName() & " removed the Toxic Spikes!")) - .FieldEffects.OppToxicSpikes = 0 - End If - End If - End If + 'Toxic Spikes + If spikeAffected = True Then + If .FieldEffects.OppToxicSpikes > 0 And p.Status = Pokemon.StatusProblems.None And p.Type1.Type <> Element.Types.Poison And p.Type2.Type <> Element.Types.Poison Then + Select Case .FieldEffects.OppToxicSpikes + Case 1 + InflictPoison(True, False, BattleScreen, False, "The Toxic Spikes hurt " & p.GetDisplayName() & "!", "toxicspikes") + Case 2 + InflictPoison(True, False, BattleScreen, True, "The Toxic Spikes hurt " & p.GetDisplayName() & "!", "toxicspikes") + End Select + End If + If .FieldEffects.OppToxicSpikes > 0 Then + If p.Type1.Type = Element.Types.Poison Or p.Type2.Type = Element.Types.Poison Then + .AddToQuery(InsertIndex, New TextQueryObject(p.GetDisplayName() & " removed the Toxic Spikes!")) + .FieldEffects.OppToxicSpikes = 0 + End If + End If + End If - 'Stealth Rock - If rockAffected = True Then - If .FieldEffects.OppStealthRock > 0 And (p.Ability.Name.ToLower() <> "magic guard" Or BattleScreen.FieldEffects.CanUseAbility(True, BattleScreen, 1) = False) Then - Dim rocksDamage As Double = 1D + 'Stealth Rock + If rockAffected = True Then + If .FieldEffects.OppStealthRock > 0 And (p.Ability.Name.ToLower() <> "magic guard" Or BattleScreen.FieldEffects.CanUseAbility(True, BattleScreen, 1) = False) Then + Dim rocksDamage As Double = 1D - Dim effectiveness As Single = BattleCalculation.ReverseTypeEffectiveness(Element.GetElementMultiplier(New Element(Element.Types.Rock), p.Type1)) * BattleCalculation.ReverseTypeEffectiveness(Element.GetElementMultiplier(New Element(Element.Types.Rock), p.Type2)) - Select Case effectiveness - Case 0.25F - rocksDamage = (p.MaxHP / 100) * 3.125D - Case 0.5F - rocksDamage = (p.MaxHP / 100) * 6.25D - Case 1.0F - rocksDamage = (p.MaxHP / 100) * 12.5D - Case 2.0F - rocksDamage = (p.MaxHP / 100) * 25D - Case 4.0F - rocksDamage = (p.MaxHP / 100) * 50D - End Select + Dim effectiveness As Single = BattleCalculation.ReverseTypeEffectiveness(Element.GetElementMultiplier(New Element(Element.Types.Rock), p.Type1)) * BattleCalculation.ReverseTypeEffectiveness(Element.GetElementMultiplier(New Element(Element.Types.Rock), p.Type2)) + Select Case effectiveness + Case 0.25F + rocksDamage = (p.MaxHP / 100) * 3.125D + Case 0.5F + rocksDamage = (p.MaxHP / 100) * 6.25D + Case 1.0F + rocksDamage = (p.MaxHP / 100) * 12.5D + Case 2.0F + rocksDamage = (p.MaxHP / 100) * 25D + Case 4.0F + rocksDamage = (p.MaxHP / 100) * 50D + End Select - ReduceHP(CInt(rocksDamage), True, False, BattleScreen, "The Stealth Rocks hurt " & p.GetDisplayName() & "!", "stealthrocks") - End If - End If + ReduceHP(CInt(rocksDamage), True, False, BattleScreen, "The Stealth Rocks hurt " & p.GetDisplayName() & "!", "stealthrocks") + End If + End If - TriggerAbilityEffect(BattleScreen, True) - TriggerItemEffect(BattleScreen, True) + TriggerAbilityEffect(BattleScreen, True) + TriggerItemEffect(BattleScreen, True) - If .OwnPokemon.Status = Pokemon.StatusProblems.Sleep Then - .FieldEffects.OwnSleepTurns = Core.Random.Next(1, 4) - End If + If .OwnPokemon.Status = Pokemon.StatusProblems.Sleep Then + .FieldEffects.OwnSleepTurns = Core.Random.Next(1, 4) + End If - If BattleScreen.FieldEffects.OwnHealingWish = True Then - BattleScreen.FieldEffects.OwnHealingWish = False + If BattleScreen.FieldEffects.OwnHealingWish = True Then + BattleScreen.FieldEffects.OwnHealingWish = False - If .OwnPokemon.HP < .OwnPokemon.MaxHP Or .OwnPokemon.Status <> Pokemon.StatusProblems.None Then - GainHP(.OwnPokemon.MaxHP - .OwnPokemon.HP, True, True, BattleScreen, "The Healing Wish came true for " & .OwnPokemon.GetDisplayName() & "!", "move:healingwish") - CureStatusProblem(True, True, BattleScreen, "", "move:healingwish") - End If - End If - End With - End Sub + If .OwnPokemon.HP < .OwnPokemon.MaxHP Or .OwnPokemon.Status <> Pokemon.StatusProblems.None Then + GainHP(.OwnPokemon.MaxHP - .OwnPokemon.HP, True, True, BattleScreen, "The Healing Wish came true for " & .OwnPokemon.GetDisplayName() & "!", "move:healingwish") + CureStatusProblem(True, True, BattleScreen, "", "move:healingwish") + End If + End If + End With + End Sub - Public Sub SwitchOutOpp(ByVal BattleScreen As BattleScreen, ByVal index As Integer, Optional ByVal message As String = "") - With BattleScreen - 'Natural cure cures status problems - If .OppPokemon.Ability.Name.ToLower() = "natural cure" Then - If .OppPokemon.Status <> Pokemon.StatusProblems.Fainted And .OppPokemon.Status <> Pokemon.StatusProblems.None Then - .OppPokemon.Status = Pokemon.StatusProblems.None - .BattleQuery.Add(New TextQueryObject(.OppPokemon.GetDisplayName() & "'s status problem got healed by Natural Cure")) - End If - End If - 'Regenerator ability heals 1/3 of it's max HP - If .OppPokemon.Ability.Name.ToLower() = "regenerator" Then - If Not (.OppPokemon.Status = Pokemon.StatusProblems.Fainted Or .OppPokemon.HP = 0) Then - Dim restoreHP = CInt(.OppPokemon.MaxHP / 3) - If restoreHP > 0 And .OppPokemon.HP < .OppPokemon.MaxHP And .OppPokemon.HP > 0 Then - BattleScreen.Battle.GainHP(restoreHP, False, True, BattleScreen, .OppPokemon.GetDisplayName() & "'s HP was restored!", "ability:regenerator") - End If - End If - End If - 'save baton pass stuff: - If .FieldEffects.OppUsedBatonPass = True Then - .FieldEffects.OppBatonPassStats = New List(Of Integer) - With .OppPokemon - BattleScreen.FieldEffects.OppBatonPassStats.AddRange({ .StatAttack, .StatDefense, .StatSpAttack, .StatSpDefense, .StatSpeed, .Evasion, .Accuracy}) - End With - .FieldEffects.OppBatonPassConfusion = .OppPokemon.HasVolatileStatus(Pokemon.VolatileStatus.Confusion) = True - End If + Public Sub SwitchOutOpp(ByVal BattleScreen As BattleScreen, ByVal index As Integer, Optional ByVal message As String = "") + With BattleScreen + 'Natural cure cures status problems + If .OppPokemon.Ability.Name.ToLower() = "natural cure" Then + If .OppPokemon.Status <> Pokemon.StatusProblems.Fainted And .OppPokemon.Status <> Pokemon.StatusProblems.None Then + .OppPokemon.Status = Pokemon.StatusProblems.None + .BattleQuery.Add(New TextQueryObject(.OppPokemon.GetDisplayName() & "'s status problem got healed by Natural Cure")) + End If + End If + 'Regenerator ability heals 1/3 of it's max HP + If .OppPokemon.Ability.Name.ToLower() = "regenerator" Then + If Not (.OppPokemon.Status = Pokemon.StatusProblems.Fainted Or .OppPokemon.HP = 0) Then + Dim restoreHP = CInt(.OppPokemon.MaxHP / 3) + If restoreHP > 0 And .OppPokemon.HP < .OppPokemon.MaxHP And .OppPokemon.HP > 0 Then + BattleScreen.Battle.GainHP(restoreHP, False, True, BattleScreen, .OppPokemon.GetDisplayName() & "'s HP was restored!", "ability:regenerator") + End If + End If + End If + 'save baton pass stuff: + If .FieldEffects.OppUsedBatonPass = True Then + .FieldEffects.OppBatonPassStats = New List(Of Integer) + With .OppPokemon + BattleScreen.FieldEffects.OppBatonPassStats.AddRange({ .StatAttack, .StatDefense, .StatSpAttack, .StatSpDefense, .StatSpeed, .Evasion, .Accuracy}) + End With + .FieldEffects.OppBatonPassConfusion = .OppPokemon.HasVolatileStatus(Pokemon.VolatileStatus.Confusion) = True + End If - 'Set the original objects of Pokemon - .OppPokemon.ResetTemp() + 'Set the original objects of Pokemon + .OppPokemon.ResetTemp() - 'Remove volatiles - .OppPokemon.ClearAllVolatiles() + 'Remove volatiles + .OppPokemon.ClearAllVolatiles() - 'Resetting FieldEffects - With .FieldEffects - .OppSleepTurns = 0 - .OppTruantRound = 0 - .OppTaunt = 0 - .OppSmacked = 0 - .OppRageCounter = 0 - .OppUproar = 0 - If .OppUsedBatonPass = False Then .OppFocusEnergy = 0 - .OppEndure = 0 - .OppProtectCounter = 0 - .OppDetectCounter = 0 - .OppKingsShieldCounter = 0 - .OppProtectMovesCount = 0 - If .OppUsedBatonPass = False Then .OppIngrain = 0 - If .OppUsedBatonPass = False Then .OppSubstitute = 0 - If .OppUsedBatonPass = False Then .OppMagnetRise = 0 - If .OppUsedBatonPass = False Then .OppAquaRing = 0 - .OppPoisonCounter = 0 - .OppNightmare = 0 - If .OppUsedBatonPass = False Then .OppCurse = 0 - .OppOutrage = 0 - .OppThrash = 0 - .OppPetalDance = 0 - .OppEncore = 0 - .OppEncoreMove = Nothing - If .OppUsedBatonPass = False Then .OppEmbargo = 0 - .OppYawn = 0 - If .OppUsedBatonPass = False Then .OppPerishSongCount = 0 - .OppConfusionTurns = 0 - .OppTorment = 0 - .OppTormentMove = Nothing - .OppChoiceMove = Nothing - .OppRecharge = 0 - .OppRolloutCounter = 0 - .OppIceBallCounter = 0 - .OppDefenseCurl = 0 - .OppCharge = 0 - .OppSolarBeam = 0 - .OppSolarBlade = 0 - If .OppUsedBatonPass = False Then .OppLeechSeed = 0 - If .OppUsedBatonPass = False Then .OppLockOn = 0 - .OppLansatBerry = 0 - .OppCustapBerry = 0 - .OppTrappedCounter = 0 - .OppFuryCutter = 0 - .OppEchoedVoice = 0 - .OppPokemonTurns = 0 - .OppStockpileCount = 0 - .OppDestinyBond = False - .OppGastroAcid = False + 'Resetting FieldEffects + With .FieldEffects + .OppSleepTurns = 0 + .OppTruantRound = 0 + .OppTaunt = 0 + .OppSmacked = 0 + .OppRageCounter = 0 + .OppUproar = 0 + If .OppUsedBatonPass = False Then .OppFocusEnergy = 0 + .OppEndure = 0 + .OppProtectCounter = 0 + .OppDetectCounter = 0 + .OppKingsShieldCounter = 0 + .OppProtectMovesCount = 0 + If .OppUsedBatonPass = False Then .OppIngrain = 0 + If .OppUsedBatonPass = False Then .OppSubstitute = 0 + If .OppUsedBatonPass = False Then .OppMagnetRise = 0 + If .OppUsedBatonPass = False Then .OppAquaRing = 0 + .OppPoisonCounter = 0 + .OppNightmare = 0 + If .OppUsedBatonPass = False Then .OppCurse = 0 + .OppOutrage = 0 + .OppThrash = 0 + .OppPetalDance = 0 + .OppEncore = 0 + .OppEncoreMove = Nothing + If .OppUsedBatonPass = False Then .OppEmbargo = 0 + .OppYawn = 0 + If .OppUsedBatonPass = False Then .OppPerishSongCount = 0 + .OppConfusionTurns = 0 + .OppTorment = 0 + .OppTormentMove = Nothing + .OppChoiceMove = Nothing + .OppRecharge = 0 + .OppRolloutCounter = 0 + .OppIceBallCounter = 0 + .OppDefenseCurl = 0 + .OppCharge = 0 + .OppSolarBeam = 0 + .OppSolarBlade = 0 + If .OppUsedBatonPass = False Then .OppLeechSeed = 0 + If .OppUsedBatonPass = False Then .OppLockOn = 0 + .OppLansatBerry = 0 + .OppCustapBerry = 0 + .OppTrappedCounter = 0 + .OppFuryCutter = 0 + .OppEchoedVoice = 0 + .OppPokemonTurns = 0 + .OppStockpileCount = 0 + .OppDestinyBond = False + .OppGastroAcid = False - .OppFlyCounter = 0 - .OppDigCounter = 0 - .OppBounceCounter = 0 - .OppDiveCounter = 0 - .OppShadowForceCounter = 0 - .OppPhantomForceCounter = 0 - .OppSkyDropCounter = 0 - .OppGeomancyCounter = 0 - .OppSkyAttackCounter = 0 - .OppRazorWindCounter = 0 - .OppSkullBashCounter = 0 + .OppFlyCounter = 0 + .OppDigCounter = 0 + .OppBounceCounter = 0 + .OppDiveCounter = 0 + .OppShadowForceCounter = 0 + .OppPhantomForceCounter = 0 + .OppSkyDropCounter = 0 + .OppGeomancyCounter = 0 + .OppSkyAttackCounter = 0 + .OppRazorWindCounter = 0 + .OppSkullBashCounter = 0 - .OppForesight = 0 - .OppOdorSleuth = 0 - .OppMiracleEye = 0 + .OppForesight = 0 + .OppOdorSleuth = 0 + .OppMiracleEye = 0 - .OppWrap = 0 - .OppWhirlpool = 0 - .OppBind = 0 - .OppClamp = 0 - .OppFireSpin = 0 - .OppMagmaStorm = 0 - .OppSandTomb = 0 - .OppInfestation = 0 + .OppWrap = 0 + .OppWhirlpool = 0 + .OppBind = 0 + .OppClamp = 0 + .OppFireSpin = 0 + .OppMagmaStorm = 0 + .OppSandTomb = 0 + .OppInfestation = 0 - .OppBideCounter = 0 - .OppBideDamage = 0 + .OppBideCounter = 0 + .OppBideDamage = 0 - .OppRoostUsed = False + .OppRoostUsed = False - 'Own stuff that depends on opp pokemon presence - .OwnTrappedCounter = 0 - .OwnWrap = 0 - .OwnWhirlpool = 0 - .OwnBind = 0 - .OwnClamp = 0 - .OwnFireSpin = 0 - .OwnMagmaStorm = 0 - .OwnSandTomb = 0 - .OwnInfestation = 0 + 'Own stuff that depends on opp pokemon presence + .OwnTrappedCounter = 0 + .OwnWrap = 0 + .OwnWhirlpool = 0 + .OwnBind = 0 + .OwnClamp = 0 + .OwnFireSpin = 0 + .OwnMagmaStorm = 0 + .OwnSandTomb = 0 + .OwnInfestation = 0 - If BattleScreen.OwnPokemon.HasVolatileStatus(Pokemon.VolatileStatus.Infatuation) Then - BattleScreen.OwnPokemon.RemoveVolatileStatus(Pokemon.VolatileStatus.Infatuation) - End If - End With - End With + If BattleScreen.OwnPokemon.HasVolatileStatus(Pokemon.VolatileStatus.Infatuation) Then + BattleScreen.OwnPokemon.RemoveVolatileStatus(Pokemon.VolatileStatus.Infatuation) + End If + End With + End With - BattleScreen.OppPokemon.Ability.SwitchOut(BattleScreen.OppPokemon) + BattleScreen.OppPokemon.Ability.SwitchOut(BattleScreen.OppPokemon) - If BattleScreen.IsTrainerBattle = False Then + If BattleScreen.IsTrainerBattle = False Then ChangeCameraAngle(1, False, BattleScreen) Dim Faint As AnimationQueryObject = New AnimationQueryObject(BattleScreen.OppPokemonNPC, True, BattleScreen.OppPokemonModel) - Faint.AnimationPlaySound(CStr(BattleScreen.OppPokemon.Number), 0, 2, False, True) - Faint.AnimationMoveEntity(Nothing, 0, -1, 0, 0.1, False, False, 2, 0,,, 3) + Faint.PlaySound(CStr(BattleScreen.OppPokemon.Number), 0, 2, False, True) + Faint.MoveEntity(Nothing, False, 0, -1, 0, 0.1, False, False, 2, 0,,, 3) BattleScreen.BattleQuery.Add(Faint) BattleScreen.BattleQuery.Add(New ToggleEntityQueryObject(True, ToggleEntityQueryObject.BattleEntities.OppPokemon, 2, -1, -1, -1, -1)) - EndBattle(EndBattleReasons.WinWild, BattleScreen, False) - Else - If BattleScreen.TrainerHasFightablePokemon() = True Then - If BattleScreen.OppPokemon.HP <= 0 Or BattleScreen.OppPokemon.Status = Pokemon.StatusProblems.Fainted Then - GainEXP(BattleScreen) - End If + EndBattle(EndBattleReasons.WinWild, BattleScreen, False) + Else + If BattleScreen.TrainerHasFightablePokemon() = True Then + If BattleScreen.OppPokemon.HP <= 0 Or BattleScreen.OppPokemon.Status = Pokemon.StatusProblems.Fainted Then + GainEXP(BattleScreen) + End If If BattleScreen.IsRemoteBattle And BattleScreen.OppFaint Then - 'Next pokemon is selected by the opponent. - Else - SwitchInOpp(BattleScreen, False, index) - End If - Else - GainEXP(BattleScreen) + 'Next pokemon is selected by the opponent. + Else + SwitchInOpp(BattleScreen, False, index) + End If + Else + GainEXP(BattleScreen) If message = "" Then - message = BattleScreen.Trainer.Name & ": ""Come back, " & BattleScreen.OppPokemon.GetDisplayName() & "!""" - End If + message = BattleScreen.Trainer.Name & ": ""Come back, " & BattleScreen.OppPokemon.GetDisplayName() & "!""" + End If - BattleScreen.BattleQuery.Add(New TextQueryObject(message)) + BattleScreen.BattleQuery.Add(New TextQueryObject(message)) Dim BallReturn As AnimationQueryObject = New AnimationQueryObject(BattleScreen.OppPokemonNPC, True, BattleScreen.OppPokemonModel) ' Ball Closes - BallReturn.AnimationPlaySound("Battle\Pokeball\Open", 0, 0) + BallReturn.PlaySound("Battle\Pokeball\Open", 0, 0) Dim SmokeReturned As Integer = 0 Do Dim SmokePosition = New Vector3(CSng(Random.Next(-10, 10) / 10), CSng(Random.Next(-10, 10) / 10), CSng(Random.Next(-10, 10) / 10)) Dim SmokeDestination = New Vector3(0, 0, 0) - Dim SmokeTexture As String = "Textures\Battle\Cloud" + Dim SmokeTexture As String = "Textures\Battle\Smoke" Dim SmokeScale = New Vector3(CSng(Random.Next(2, 6) / 10)) Dim SmokeSpeed = CSng(Random.Next(1, 3) / 10.0F) @@ -7178,57 +7172,57 @@ ' Pokemon disappears BallReturn.AnimationFadeEntity(Nothing, 1, False, 0, 1, 0) - BallReturn.AnimationMoveEntity(Nothing, 0, 0.5, 0, 0.5, False, False, 2, 0,,, 4) + BallReturn.MoveEntity(Nothing, False, 0, 0.5, 0, 0.5, False, False, 2, 0,,, 4) ' Ball returns - BallReturn.AnimationPlaySound("Battle\Pokeball\Throw", 1, 0) + BallReturn.PlaySound("Battle\Pokeball\Throw", 1, 0) BallReturn.AnimationSpawnMovingEntity(0, 0, 0, BattleScreen.OppPokemon.CatchBall.TextureSource, 0.3F, 0.3F, 0.3F, -2, 0, 0, 0.1, False, True, 1, 0,, 0.3) BattleScreen.BattleQuery.Add(BallReturn) EndBattle(EndBattleReasons.WinTrainer, BattleScreen, False) - If BattleScreen.IsRemoteBattle = True Then - EndBattle(EndBattleReasons.WinTrainer, BattleScreen, True) - End If - End If - End If - End Sub + If BattleScreen.IsRemoteBattle = True Then + EndBattle(EndBattleReasons.WinTrainer, BattleScreen, True) + End If + End If + End If + End Sub - Public Sub ApplyOppBatonPass(ByVal BattleScreen As BattleScreen) - If BattleScreen.FieldEffects.OppUsedBatonPass = True Then - BattleScreen.FieldEffects.OppUsedBatonPass = False + Public Sub ApplyOppBatonPass(ByVal BattleScreen As BattleScreen) + If BattleScreen.FieldEffects.OppUsedBatonPass = True Then + BattleScreen.FieldEffects.OppUsedBatonPass = False - BattleScreen.OppPokemon.StatAttack = BattleScreen.FieldEffects.OppBatonPassStats(0) - BattleScreen.OppPokemon.StatDefense = BattleScreen.FieldEffects.OppBatonPassStats(1) - BattleScreen.OppPokemon.StatSpAttack = BattleScreen.FieldEffects.OppBatonPassStats(2) - BattleScreen.OppPokemon.StatSpDefense = BattleScreen.FieldEffects.OppBatonPassStats(3) - BattleScreen.OppPokemon.StatSpeed = BattleScreen.FieldEffects.OppBatonPassStats(4) - BattleScreen.OppPokemon.Evasion = BattleScreen.FieldEffects.OppBatonPassStats(5) - BattleScreen.OppPokemon.Accuracy = BattleScreen.FieldEffects.OppBatonPassStats(6) + BattleScreen.OppPokemon.StatAttack = BattleScreen.FieldEffects.OppBatonPassStats(0) + BattleScreen.OppPokemon.StatDefense = BattleScreen.FieldEffects.OppBatonPassStats(1) + BattleScreen.OppPokemon.StatSpAttack = BattleScreen.FieldEffects.OppBatonPassStats(2) + BattleScreen.OppPokemon.StatSpDefense = BattleScreen.FieldEffects.OppBatonPassStats(3) + BattleScreen.OppPokemon.StatSpeed = BattleScreen.FieldEffects.OppBatonPassStats(4) + BattleScreen.OppPokemon.Evasion = BattleScreen.FieldEffects.OppBatonPassStats(5) + BattleScreen.OppPokemon.Accuracy = BattleScreen.FieldEffects.OppBatonPassStats(6) - If BattleScreen.FieldEffects.OppBatonPassConfusion = True Then - BattleScreen.FieldEffects.OppBatonPassConfusion = False - BattleScreen.OppPokemon.AddVolatileStatus(Pokemon.VolatileStatus.Confusion) - End If - End If - End Sub + If BattleScreen.FieldEffects.OppBatonPassConfusion = True Then + BattleScreen.FieldEffects.OppBatonPassConfusion = False + BattleScreen.OppPokemon.AddVolatileStatus(Pokemon.VolatileStatus.Confusion) + End If + End If + End Sub - Public Sub SwitchInOpp(ByVal BattleScreen As BattleScreen, ByVal FirstTime As Boolean, ByVal index As Integer) + Public Sub SwitchInOpp(ByVal BattleScreen As BattleScreen, ByVal FirstTime As Boolean, ByVal index As Integer) - If FirstTime = False Then - HasSwitchedInOpp = True + If FirstTime = False Then + HasSwitchedInOpp = True BattleScreen.BattleQuery.Add(New TextQueryObject(BattleScreen.Trainer.Name & ": ""Come back, " & BattleScreen.OppPokemon.GetDisplayName() & "!""")) Dim BallReturn As AnimationQueryObject = New AnimationQueryObject(BattleScreen.OppPokemonNPC, True, BattleScreen.OppPokemonModel) ' Ball Closes - BallReturn.AnimationPlaySound("Battle\Pokeball\Open", 0, 0) + BallReturn.PlaySound("Battle\Pokeball\Open", 0, 0) Dim SmokeReturned As Integer = 0 Do Dim SmokePosition = New Vector3(CSng(Random.Next(-10, 10) / 10), CSng(Random.Next(-10, 10) / 10), CSng(Random.Next(-10, 10) / 10)) Dim SmokeDestination = New Vector3(0, 0, 0) - Dim SmokeTexture As String = "Textures\Battle\Cloud" + Dim SmokeTexture As String = "Textures\Battle\Smoke" Dim SmokeScale = New Vector3(CSng(Random.Next(2, 6) / 10)) Dim SmokeSpeed = CSng(Random.Next(1, 3) / 10.0F) @@ -7239,51 +7233,51 @@ ' Pokemon disappears BallReturn.AnimationFadeEntity(Nothing, 1, False, 0, 1, 0) - BallReturn.AnimationMoveEntity(Nothing, 0, 0.5, 0, 0.5, False, False, 2, 0,,, 4) + BallReturn.MoveEntity(Nothing, False, 0, 0.5, 0, 0.5, False, False, 2, 0,,, 4) ' Ball returns - BallReturn.AnimationPlaySound("Battle\Pokeball\Throw", 1, 0) + BallReturn.PlaySound("Battle\Pokeball\Throw", 1, 0) BallReturn.AnimationSpawnMovingEntity(0, 0, 0, BattleScreen.OppPokemon.CatchBall.TextureSource, 0.3F, 0.3F, 0.3F, -2, 0, 0, 0.1, False, True, 1, 0,, 0.3) BattleScreen.BattleQuery.Add(BallReturn) BattleScreen.SendInNewTrainerPokemon(index) - Me.ApplyOppBatonPass(BattleScreen) + Me.ApplyOppBatonPass(BattleScreen) - If BattleScreen.ParticipatedPokemon.Contains(BattleScreen.OwnPokemonIndex) = False Then - BattleScreen.ParticipatedPokemon.Add(BattleScreen.OwnPokemonIndex) - End If + If BattleScreen.ParticipatedPokemon.Contains(BattleScreen.OwnPokemonIndex) = False Then + BattleScreen.ParticipatedPokemon.Add(BattleScreen.OwnPokemonIndex) + End If - Dim oppShiny As String = "N" - If BattleScreen.OppPokemon.IsShiny = True Then - oppShiny = "S" - End If + Dim oppShiny As String = "N" + If BattleScreen.OppPokemon.IsShiny = True Then + oppShiny = "S" + End If - Dim oppModel As String = BattleScreen.GetModelName(False) + Dim oppModel As String = BattleScreen.GetModelName(False) - If oppModel = "" Then - BattleScreen.BattleQuery.Add(New ToggleEntityQueryObject(True, ToggleEntityQueryObject.BattleEntities.OppPokemon, PokemonForms.GetOverworldSpriteName(BattleScreen.OppPokemon), -1, -1, 0, 1)) - Else - BattleScreen.BattleQuery.Add(New ToggleEntityQueryObject(False, oppModel, -1, -1, 1, 0)) - End If + If oppModel = "" Then + BattleScreen.BattleQuery.Add(New ToggleEntityQueryObject(True, ToggleEntityQueryObject.BattleEntities.OppPokemon, PokemonForms.GetOverworldSpriteName(BattleScreen.OppPokemon), -1, -1, 0, 1)) + Else + BattleScreen.BattleQuery.Add(New ToggleEntityQueryObject(False, oppModel, -1, -1, 1, 0)) + End If - BattleScreen.BattleQuery.Add(New ToggleEntityQueryObject(True, ToggleEntityQueryObject.BattleEntities.OppPokemon, 1, -1, -1, -1, -1)) + BattleScreen.BattleQuery.Add(New ToggleEntityQueryObject(True, ToggleEntityQueryObject.BattleEntities.OppPokemon, 1, -1, -1, -1, -1)) BattleScreen.BattleQuery.Add(New TextQueryObject(BattleScreen.Trainer.Name & ": ""Go, " & BattleScreen.OppPokemon.GetDisplayName() & "!""")) ' Ball is thrown Dim BallThrow As AnimationQueryObject = New AnimationQueryObject(BattleScreen.OppPokemonNPC, True, BattleScreen.OppPokemonModel) - BallThrow.AnimationPlaySound("Battle\Pokeball\Throw", 0, 0) + BallThrow.PlaySound("Battle\Pokeball\Throw", 0, 0) BallThrow.AnimationSpawnMovingEntity(-2, -0.15, 0, BattleScreen.OwnPokemon.CatchBall.TextureSource, 0.3F, 0.3F, 0.3F, 0, 0.35, 0, 0.1, False, True, 0F, 0F,, 0.3) ' Ball Opens - BallThrow.AnimationPlaySound("Battle\Pokeball\Open", 3, 0) + BallThrow.PlaySound("Battle\Pokeball\Open", 3, 0) Dim SmokeSpawned As Integer = 0 Do Dim SmokePosition = New Vector3(0, 0.35, 0) Dim SmokeDestination = New Vector3(CSng(Random.Next(-10, 10) / 10), CSng(Random.Next(-10, 10) / 10), CSng(Random.Next(-10, 10) / 10)) - Dim SmokeTexture As String = "Textures\Battle\Cloud" + Dim SmokeTexture As String = "Textures\Battle\Smoke" Dim SmokeScale = New Vector3(CSng(Random.Next(2, 6) / 10)) Dim SmokeSpeed = CSng(Random.Next(1, 3) / 10.0F) @@ -7294,180 +7288,180 @@ ' Pokemon appears BallThrow.AnimationFadeEntity(Nothing, 1, True, 1, 4, 0) - BallThrow.AnimationPlaySound(CStr(BattleScreen.OppPokemon.Number), 4, 0,, True) + BallThrow.PlaySound(CStr(BattleScreen.OppPokemon.Number), 4, 0,, True) ' Pokémon falls down - BallThrow.AnimationMoveEntity(Nothing, 0, 0, 0, 0.05F, False, False, 4, 0,,, 4) + BallThrow.MoveEntity(Nothing, False, 0, 0, 0, 0.05F, False, False, 4, 0,,, 4) BattleScreen.BattleQuery.Add(BallThrow) End If - With BattleScreen - Dim p As Pokemon = .OppPokemon - Dim op As Pokemon = .OwnPokemon + With BattleScreen + Dim p As Pokemon = .OppPokemon + Dim op As Pokemon = .OwnPokemon - Dim spikeAffected As Boolean = True - Dim rockAffected As Boolean = True + Dim spikeAffected As Boolean = True + Dim rockAffected As Boolean = True - spikeAffected = BattleScreen.FieldEffects.IsGrounded(False, BattleScreen) + spikeAffected = BattleScreen.FieldEffects.IsGrounded(False, BattleScreen) - If spikeAffected = True Then - If .FieldEffects.OwnSpikes > 0 And p.Ability.Name.ToLower() <> "magic guard" Then - Dim spikeDamage As Double = 1D - Select Case .FieldEffects.OwnSpikes - Case 1 - spikeDamage = (p.MaxHP / 100) * 12.5D - Case 2 - spikeDamage = (p.MaxHP / 100) * 16.7D - Case 3 - spikeDamage = (p.MaxHP / 100) * 25D - End Select - ReduceHP(CInt(spikeDamage), False, True, BattleScreen, "The Spikes hurt " & p.GetDisplayName() & "!", "spikes") - End If - End If - 'Sticky Web - If spikeAffected = True Then - If .FieldEffects.OwnStickyWeb > 0 Then + If spikeAffected = True Then + If .FieldEffects.OwnSpikes > 0 And p.Ability.Name.ToLower() <> "magic guard" Then + Dim spikeDamage As Double = 1D + Select Case .FieldEffects.OwnSpikes + Case 1 + spikeDamage = (p.MaxHP / 100) * 12.5D + Case 2 + spikeDamage = (p.MaxHP / 100) * 16.7D + Case 3 + spikeDamage = (p.MaxHP / 100) * 25D + End Select + ReduceHP(CInt(spikeDamage), False, True, BattleScreen, "The Spikes hurt " & p.GetDisplayName() & "!", "spikes") + End If + End If + 'Sticky Web + If spikeAffected = True Then + If .FieldEffects.OwnStickyWeb > 0 Then - LowerStat(False, False, BattleScreen, "Speed", 1, "The opposing pokemon was caught in a Sticky Web!", "stickyweb") + LowerStat(False, False, BattleScreen, "Speed", 1, "The opposing pokemon was caught in a Sticky Web!", "stickyweb") - End If - End If - If spikeAffected = True Then - If .FieldEffects.OwnToxicSpikes > 0 And p.Status = Pokemon.StatusProblems.None And p.Type1.Type <> Element.Types.Poison And p.Type2.Type <> Element.Types.Poison Then - Select Case .FieldEffects.OwnToxicSpikes - Case 1 - InflictPoison(False, True, BattleScreen, False, "The Toxic Spikes hurt " & p.GetDisplayName() & "!", "toxicspikes") - Case 2 - InflictPoison(False, True, BattleScreen, True, "The Toxic Spikes hurt " & p.GetDisplayName() & "!", "toxicspikes") - End Select - End If - If .FieldEffects.OwnToxicSpikes > 0 Then - If p.Type1.Type = Element.Types.Poison Or p.Type2.Type = Element.Types.Poison Then - .BattleQuery.Add(New TextQueryObject(p.GetDisplayName() & " removed the Toxic Spikes!")) - .FieldEffects.OwnToxicSpikes = 0 - End If - End If - End If + End If + End If + If spikeAffected = True Then + If .FieldEffects.OwnToxicSpikes > 0 And p.Status = Pokemon.StatusProblems.None And p.Type1.Type <> Element.Types.Poison And p.Type2.Type <> Element.Types.Poison Then + Select Case .FieldEffects.OwnToxicSpikes + Case 1 + InflictPoison(False, True, BattleScreen, False, "The Toxic Spikes hurt " & p.GetDisplayName() & "!", "toxicspikes") + Case 2 + InflictPoison(False, True, BattleScreen, True, "The Toxic Spikes hurt " & p.GetDisplayName() & "!", "toxicspikes") + End Select + End If + If .FieldEffects.OwnToxicSpikes > 0 Then + If p.Type1.Type = Element.Types.Poison Or p.Type2.Type = Element.Types.Poison Then + .BattleQuery.Add(New TextQueryObject(p.GetDisplayName() & " removed the Toxic Spikes!")) + .FieldEffects.OwnToxicSpikes = 0 + End If + End If + End If - If rockAffected = True Then - If .FieldEffects.OwnStealthRock > 0 And p.Ability.Name.ToLower() <> "magic guard" Then - Dim rocksDamage As Double = 1D + If rockAffected = True Then + If .FieldEffects.OwnStealthRock > 0 And p.Ability.Name.ToLower() <> "magic guard" Then + Dim rocksDamage As Double = 1D - Dim effectiveness As Single = BattleCalculation.ReverseTypeEffectiveness(Element.GetElementMultiplier(New Element(Element.Types.Rock), p.Type1)) * BattleCalculation.ReverseTypeEffectiveness(Element.GetElementMultiplier(New Element(Element.Types.Rock), p.Type2)) - Select Case effectiveness - Case 0.25F - rocksDamage = (p.MaxHP / 100) * 3.125D - Case 0.5F - rocksDamage = (p.MaxHP / 100) * 6.25D - Case 1.0F - rocksDamage = (p.MaxHP / 100) * 12.5D - Case 2.0F - rocksDamage = (p.MaxHP / 100) * 25D - Case 4.0F - rocksDamage = (p.MaxHP / 100) * 50D - End Select + Dim effectiveness As Single = BattleCalculation.ReverseTypeEffectiveness(Element.GetElementMultiplier(New Element(Element.Types.Rock), p.Type1)) * BattleCalculation.ReverseTypeEffectiveness(Element.GetElementMultiplier(New Element(Element.Types.Rock), p.Type2)) + Select Case effectiveness + Case 0.25F + rocksDamage = (p.MaxHP / 100) * 3.125D + Case 0.5F + rocksDamage = (p.MaxHP / 100) * 6.25D + Case 1.0F + rocksDamage = (p.MaxHP / 100) * 12.5D + Case 2.0F + rocksDamage = (p.MaxHP / 100) * 25D + Case 4.0F + rocksDamage = (p.MaxHP / 100) * 50D + End Select - ReduceHP(CInt(rocksDamage), False, True, BattleScreen, "The Stealth Rocks hurt " & p.GetDisplayName() & "!", "stealthrocks") - End If - End If + ReduceHP(CInt(rocksDamage), False, True, BattleScreen, "The Stealth Rocks hurt " & p.GetDisplayName() & "!", "stealthrocks") + End If + End If - TriggerAbilityEffect(BattleScreen, False) - TriggerItemEffect(BattleScreen, False) + TriggerAbilityEffect(BattleScreen, False) + TriggerItemEffect(BattleScreen, False) - If .OppPokemon.Status = Pokemon.StatusProblems.Sleep Then - .FieldEffects.OppSleepTurns = Core.Random.Next(1, 4) - End If + If .OppPokemon.Status = Pokemon.StatusProblems.Sleep Then + .FieldEffects.OppSleepTurns = Core.Random.Next(1, 4) + End If - If BattleScreen.FieldEffects.OppHealingWish = True Then - BattleScreen.FieldEffects.OppHealingWish = False + If BattleScreen.FieldEffects.OppHealingWish = True Then + BattleScreen.FieldEffects.OppHealingWish = False - If .OppPokemon.HP < .OppPokemon.MaxHP Or .OppPokemon.Status <> Pokemon.StatusProblems.None Then - GainHP(.OppPokemon.MaxHP - .OppPokemon.HP, False, False, BattleScreen, "The Healing Wish came true for " & .OppPokemon.GetDisplayName() & "!", "move:healingwish") - CureStatusProblem(False, False, BattleScreen, "", "move:healingwish") - End If - End If - End With - End Sub + If .OppPokemon.HP < .OppPokemon.MaxHP Or .OppPokemon.Status <> Pokemon.StatusProblems.None Then + GainHP(.OppPokemon.MaxHP - .OppPokemon.HP, False, False, BattleScreen, "The Healing Wish came true for " & .OppPokemon.GetDisplayName() & "!", "move:healingwish") + CureStatusProblem(False, False, BattleScreen, "", "move:healingwish") + End If + End If + End With + End Sub #End Region #Region "EndBattle" - Enum EndBattleReasons - WinWild - LoseWild - WinTrainer - LoseTrainer - WinPvP - LosePvP - End Enum + Enum EndBattleReasons + WinWild + LoseWild + WinTrainer + LoseTrainer + WinPvP + LosePvP + End Enum - Public Sub EndBattle(ByVal reason As EndBattleReasons, ByVal BattleScreen As BattleScreen, ByVal AddPVP As Boolean) - BattleScreen.OwnFaint = False - BattleScreen.OppFaint = False - IsAfterFaint = False - If AddPVP = True Then - Select Case reason - Case EndBattleReasons.WinTrainer 'Lost - Dim q As New CameraQueryObject(New Vector3(12, 0, 13), Screen.Camera.Position, 0.03F, 0.03F, (MathHelper.Pi * 0.5F), Screen.Camera.Yaw, 0.0F, Screen.Camera.Pitch, 0.02F, 0.02F) - q.ApplyCurrentCamera = True - BattleScreen.TempPVPBattleQuery.Add(BattleScreen.BattleQuery.Count - 5, q) + Public Sub EndBattle(ByVal reason As EndBattleReasons, ByVal BattleScreen As BattleScreen, ByVal AddPVP As Boolean) + BattleScreen.OwnFaint = False + BattleScreen.OppFaint = False + IsAfterFaint = False + If AddPVP = True Then + Select Case reason + Case EndBattleReasons.WinTrainer 'Lost + Dim q As New CameraQueryObject(New Vector3(12, 0, 13), Screen.Camera.Position, 0.03F, 0.03F, (MathHelper.Pi * 0.5F), Screen.Camera.Yaw, 0.0F, Screen.Camera.Pitch, 0.02F, 0.02F) + q.ApplyCurrentCamera = True + BattleScreen.TempPVPBattleQuery.Add(BattleScreen.BattleQuery.Count - 5, q) - BattleScreen.TempPVPBattleQuery.Add(BattleScreen.BattleQuery.Count - 4, New TextQueryObject("You lost the battle!")) - BattleScreen.TempPVPBattleQuery.Add(BattleScreen.BattleQuery.Count - 3, New TextQueryObject("")) - BattleScreen.TempPVPBattleQuery.Add(BattleScreen.BattleQuery.Count - 2, New TextQueryObject("")) + BattleScreen.TempPVPBattleQuery.Add(BattleScreen.BattleQuery.Count - 4, New TextQueryObject("You lost the battle!")) + BattleScreen.TempPVPBattleQuery.Add(BattleScreen.BattleQuery.Count - 3, New TextQueryObject("")) + BattleScreen.TempPVPBattleQuery.Add(BattleScreen.BattleQuery.Count - 2, New TextQueryObject("")) - BattleScreen.TempPVPBattleQuery.Add(BattleScreen.BattleQuery.Count - 1, New EndBattleQueryObject(True)) - Case EndBattleReasons.LoseTrainer 'Won - Dim q As New CameraQueryObject(New Vector3(15, 0, 13), Screen.Camera.Position, 0.03F, 0.03F, -(MathHelper.Pi * 0.5F), Screen.Camera.Yaw, 0.0F, Screen.Camera.Pitch, 0.02F, 0.02F) - q.ApplyCurrentCamera = True - BattleScreen.TempPVPBattleQuery.Add(BattleScreen.BattleQuery.Count - 3, q) + BattleScreen.TempPVPBattleQuery.Add(BattleScreen.BattleQuery.Count - 1, New EndBattleQueryObject(True)) + Case EndBattleReasons.LoseTrainer 'Won + Dim q As New CameraQueryObject(New Vector3(15, 0, 13), Screen.Camera.Position, 0.03F, 0.03F, -(MathHelper.Pi * 0.5F), Screen.Camera.Yaw, 0.0F, Screen.Camera.Pitch, 0.02F, 0.02F) + q.ApplyCurrentCamera = True + BattleScreen.TempPVPBattleQuery.Add(BattleScreen.BattleQuery.Count - 3, q) - BattleScreen.TempPVPBattleQuery.Add(BattleScreen.BattleQuery.Count - 2, New TextQueryObject("Pokémon Trainer " & Core.Player.Name & " was defeated!")) + BattleScreen.TempPVPBattleQuery.Add(BattleScreen.BattleQuery.Count - 2, New TextQueryObject("Pokémon Trainer " & Core.Player.Name & " was defeated!")) - BattleScreen.TempPVPBattleQuery.Add(BattleScreen.BattleQuery.Count - 1, New EndBattleQueryObject(True)) - End Select - Else - Select Case reason - Case EndBattleReasons.WinWild - Won = True - Core.Player.AddPoints(1, "Won against wild Pokémon.") + BattleScreen.TempPVPBattleQuery.Add(BattleScreen.BattleQuery.Count - 1, New EndBattleQueryObject(True)) + End Select + Else + Select Case reason + Case EndBattleReasons.WinWild + Won = True + Core.Player.AddPoints(1, "Won against wild Pokémon.") - BattleScreen.BattleQuery.Add(New PlayMusicQueryObject("wild_defeat")) - ChangeCameraAngle(1, True, BattleScreen) + BattleScreen.BattleQuery.Add(New PlayMusicQueryObject("wild_defeat")) + ChangeCameraAngle(1, True, BattleScreen) - GainEXP(BattleScreen) + GainEXP(BattleScreen) - If BattleScreen.FieldEffects.OwnPayDayCounter > 0 Then - Core.Player.Money += BattleScreen.FieldEffects.OwnPayDayCounter - BattleScreen.BattleQuery.Add(New TextQueryObject(Core.Player.Name & " picked up $" & BattleScreen.FieldEffects.OwnPayDayCounter & "!")) - End If + If BattleScreen.FieldEffects.OwnPayDayCounter > 0 Then + Core.Player.Money += BattleScreen.FieldEffects.OwnPayDayCounter + BattleScreen.BattleQuery.Add(New TextQueryObject(Core.Player.Name & " picked up $" & BattleScreen.FieldEffects.OwnPayDayCounter & "!")) + End If - BattleScreen.BattleQuery.Add(New EndBattleQueryObject(False)) - Case EndBattleReasons.WinTrainer - Won = True - Core.Player.AddPoints(3, "Won against trainer.") + BattleScreen.BattleQuery.Add(New EndBattleQueryObject(False)) + Case EndBattleReasons.WinTrainer + Won = True + Core.Player.AddPoints(3, "Won against trainer.") - Core.Player.Money += BattleScreen.GetTrainerMoney() + Core.Player.Money += BattleScreen.GetTrainerMoney() - BattleScreen.BattleQuery.Add(New PlayMusicQueryObject(BattleScreen.Trainer.GetDefeatMusic())) + BattleScreen.BattleQuery.Add(New PlayMusicQueryObject(BattleScreen.Trainer.GetDefeatMusic())) - Dim q As New CameraQueryObject(New Vector3(15, 0, 13), Screen.Camera.Position, 0.03F, 0.03F, -(MathHelper.Pi * 0.5F), Screen.Camera.Yaw, 0.0F, Screen.Camera.Pitch, 0.04F, 0.02F) - q.ApplyCurrentCamera = True - BattleScreen.BattleQuery.Add(q) + Dim q As New CameraQueryObject(New Vector3(15, 0, 13), Screen.Camera.Position, 0.03F, 0.03F, -(MathHelper.Pi * 0.5F), Screen.Camera.Yaw, 0.0F, Screen.Camera.Pitch, 0.04F, 0.02F) + q.ApplyCurrentCamera = True + BattleScreen.BattleQuery.Add(q) - BattleScreen.BattleQuery.Add(New TextQueryObject(BattleScreen.Trainer.TrainerType & " " & BattleScreen.Trainer.Name & " was defeated!")) - BattleScreen.BattleQuery.Add(New TextQueryObject(BattleScreen.Trainer.OutroMessage)) + BattleScreen.BattleQuery.Add(New TextQueryObject(BattleScreen.Trainer.TrainerType & " " & BattleScreen.Trainer.Name & " was defeated!")) + BattleScreen.BattleQuery.Add(New TextQueryObject(BattleScreen.Trainer.OutroMessage)) - If BattleScreen.GetTrainerMoney() > 0 Then - BattleScreen.BattleQuery.Add(New TextQueryObject(Core.Player.Name & " got $" & BattleScreen.GetTrainerMoney() & "!")) - End If + If BattleScreen.GetTrainerMoney() > 0 Then + BattleScreen.BattleQuery.Add(New TextQueryObject(Core.Player.Name & " got $" & BattleScreen.GetTrainerMoney() & "!")) + End If - BattleScreen.BattleQuery.Add(New EndBattleQueryObject(False)) - Case EndBattleReasons.LoseTrainer, EndBattleReasons.LoseWild - Won = False + BattleScreen.BattleQuery.Add(New EndBattleQueryObject(False)) + Case EndBattleReasons.LoseTrainer, EndBattleReasons.LoseWild + Won = False Dim q As New CameraQueryObject(New Vector3(12, 0, 13), Screen.Camera.Position, 0.03F, 0.03F, (MathHelper.Pi * 0.5F), Screen.Camera.Yaw, 0.0F, Screen.Camera.Pitch, 0.02F, 0.02F) q.ApplyCurrentCamera = True BattleScreen.BattleQuery.Add(q) diff --git a/P3D/Battle/BattleSystemV2/QueryObjects/AnimationQueryObject.vb b/P3D/Battle/BattleSystemV2/QueryObjects/AnimationQueryObject.vb index 75e95027d..84eca1a23 100644 --- a/P3D/Battle/BattleSystemV2/QueryObjects/AnimationQueryObject.vb +++ b/P3D/Battle/BattleSystemV2/QueryObjects/AnimationQueryObject.vb @@ -5,7 +5,7 @@ Public AnimationStarted As Boolean = False Public AnimationEnded As Boolean = False - Public BAFlipped As Boolean + Public BattleFlipped As Boolean = Nothing Public AnimationSequence As List(Of BattleAnimation3D) Public SpawnedEntities As List(Of Entity) Public CurrentEntity As Entity @@ -17,10 +17,12 @@ End Get End Property - Public Sub New(ByVal entity As Entity, ByVal BAFlipped As Boolean, Optional ByVal model As ModelEntity = Nothing) + Public Sub New(ByVal entity As Entity, ByVal BattleFlipped As Boolean, Optional ByVal model As ModelEntity = Nothing) MyBase.New(QueryTypes.MoveAnimation) Me.AnimationSequence = New List(Of BattleAnimation3D) - Me.BAFlipped = BAFlipped + If BattleFlipped <> Nothing Then + Me.BattleFlipped = BattleFlipped + End If Me.CurrentEntity = entity Me.CurrentModel = model AnimationSequenceBegin() @@ -48,6 +50,9 @@ i -= 1 AnimationSequence.Remove(a) Else + If a.SpawnedEntity IsNot Nothing And a.Ready = True Then + SpawnedEntities.Add(a.SpawnedEntity) + End If a.Update() End If End If @@ -70,32 +75,32 @@ End Sub Public Sub AnimationSequenceEnd() - If CurrentEntity Is Nothing Then - Logger.Log(Logger.LogTypes.Warning, "ATTEMPT TO USE AnimationSequenceEnd OUTSIDE OF ATTACK ANIMATION DELEGATE") - ElseIf Not AnimationStarted Then - Logger.Log(Logger.LogTypes.Warning, "ATTEMPT TO USE AnimationSequenceEnd BEFORE CALLING AnimationSequenceBegin") - Else - AnimationEnded = True - End If + AnimationEnded = True End Sub - Public Function SpawnEntity(ByVal Position As Vector3, ByVal Texture As Texture2D, ByVal Scale As Vector3, ByVal Opacity As Single) As Entity - Dim SpawnedEntity As Entity = New Entity(Position.X, Position.Y, Position.Z, "BattleAnimation", {Texture}, {0, 0}, False, 0, Scale, BaseModel.BillModel, 0, "", New Vector3(1.0F)) - - SpawnedEntity.Opacity = Opacity - If SpawnedEntity.Opacity > 0 Then - SpawnedEntity.Visible = True - Else - SpawnedEntity.Visible = False + Public Function SpawnEntity(ByVal Position As Vector3, ByVal Texture As Texture2D, ByVal Scale As Vector3, ByVal Opacity As Single, Optional ByVal startDelay As Single = 0.0F, Optional ByVal endDelay As Single = 0.0F) As Entity + If Not BattleFlipped = Nothing Then + If BattleFlipped = True Then + Position.X = CurrentEntity.Position.X - Position.X * 2.0F + Position.Z = CurrentEntity.Position.Z - Position.Z * 2.0F + Else + Position.X = CurrentEntity.Position.X + Position.X * 2.0F + Position.Z = CurrentEntity.Position.Z + Position.Z * 2.0F + End If End If - SpawnedEntities.Add(SpawnedEntity) + Dim SpawnedEntity As Entity = New Entity(Position.X, Position.Y, Position.Z, "BattleAnimation", {Texture}, {0, 0}, False, 0, Scale, BaseModel.BillModel, 0, "", New Vector3(1.0F)) + SpawnedEntity.Opacity = Opacity + + Dim SpawnDelayEntity As BattleAnimation3D = New BattleAnimation3D(New Vector3(0.0F), TextureManager.DefaultTexture, New Vector3(1.0F), startDelay, endDelay, SpawnedEntity) + + AnimationSequence.Add(SpawnDelayEntity) Return SpawnedEntity End Function Public Sub RemoveEntity(Entity As Entity) SpawnedEntities.Remove(Entity) End Sub - Public Sub AnimationChangeTexture(ByVal Entity As Entity, ByVal Texture As Texture2D, ByVal startDelay As Single, ByVal endDelay As Single) + Public Sub ChangeEntityTexture(ByVal Entity As Entity, RemoveEntityAfter As Boolean, ByVal Texture As Texture2D, ByVal startDelay As Single, ByVal endDelay As Single) Dim TextureChangeEntity As Entity If Entity Is Nothing Then @@ -106,19 +111,29 @@ Dim baEntityTextureChange As BAEntityTextureChange = New BAEntityTextureChange(TextureChangeEntity, Texture, startDelay, endDelay) AnimationSequence.Add(baEntityTextureChange) + + If RemoveEntityAfter = True Then + If baEntityTextureChange.CanRemove = True Then + RemoveEntity(Entity) + End If + End If End Sub - Public Sub AnimationMoveEntity(ByVal Entity As Entity, ByVal DestinationX As Single, ByVal DestinationY As Single, ByVal DestinationZ As Single, ByVal Speed As Single, ByVal SpinX As Boolean, ByVal SpinZ As Boolean, ByVal startDelay As Single, ByVal endDelay As Single, Optional ByVal SpinXSpeed As Single = 0.1F, Optional ByVal SpinZSpeed As Single = 0.1F, Optional MovementCurve As Integer = 3) + Public Sub MoveEntity(ByVal Entity As Entity, ByVal RemoveEntityAfter As Boolean, ByVal DestinationX As Single, ByVal DestinationY As Single, ByVal DestinationZ As Single, ByVal Speed As Single, ByVal SpinX As Boolean, ByVal SpinZ As Boolean, ByVal startDelay As Single, ByVal endDelay As Single, Optional ByVal SpinXSpeed As Single = 0.1F, Optional ByVal SpinZSpeed As Single = 0.1F, Optional MovementCurve As Integer = 3) Dim MoveEntity As Entity Dim Destination As Vector3 - If Entity Is Nothing Then - MoveEntity = CurrentEntity - If BAFlipped Then + If Not BattleFlipped = Nothing Then + If BattleFlipped = True Then DestinationX -= DestinationX * 2.0F DestinationZ -= DestinationZ * 2.0F - Destination = New Vector3(CurrentEntity.Position.X + DestinationX, CurrentEntity.Position.Y + DestinationY, CurrentEntity.Position.Z + DestinationZ) End If + If Entity Is Nothing Then + MoveEntity = CurrentEntity + Else + MoveEntity = Entity + End If + Destination = CurrentEntity.Position + New Vector3(DestinationX, DestinationY, DestinationZ) Else MoveEntity = Entity Destination = New Vector3(DestinationX, DestinationY, DestinationZ) @@ -131,9 +146,15 @@ Dim baModelMove As BAEntityMove = New BAEntityMove(CType(CurrentModel, Entity), Destination, Speed, SpinX, SpinZ, startDelay, endDelay, SpinXSpeed, SpinZSpeed, MovementCurve) AnimationSequence.Add(baModelMove) End If + + If RemoveEntityAfter = True Then + If baEntityMove.CanRemove = True Then + RemoveEntity(Entity) + End If + End If End Sub - Public Sub AnimationFadeEntity(ByVal Entity As Entity, ByVal TransitionSpeed As Single, ByVal FadeIn As Boolean, ByVal EndState As Single, ByVal startDelay As Single, ByVal endDelay As Single, Optional ByVal startState As Single = -1.0F) + Public Sub FadeEntity(ByVal Entity As Entity, ByVal RemoveEntityAfter As Boolean, ByVal TransitionSpeed As Single, ByVal FadeIn As Boolean, ByVal EndState As Single, ByVal startDelay As Single, ByVal endDelay As Single, Optional ByVal startState As Single = -1.0F) Dim FadeEntity As Entity If Entity Is Nothing Then FadeEntity = CurrentEntity @@ -148,8 +169,14 @@ Dim baModelOpacity As BAEntityOpacity = New BAEntityOpacity(CType(CurrentModel, Entity), TransitionSpeed, FadeIn, EndState, startDelay, endDelay, startState) AnimationSequence.Add(baModelOpacity) End If + + If RemoveEntityAfter = True Then + If baEntityOpacity.CanRemove = True Then + RemoveEntity(Entity) + End If + End If End Sub - Public Sub AnimationRotateEntity(Entity As Entity, ByVal RotationSpeedX As Single, ByVal RotationSpeedY As Single, ByVal RotationSpeedZ As Single, ByVal EndRotationX As Single, ByVal EndRotationY As Single, ByVal EndRotationZ As Single, ByVal startDelay As Single, ByVal endDelay As Single, ByVal DoXRotation As Boolean, ByVal DoYRotation As Boolean, ByVal DoZRotation As Boolean, ByVal DoReturn As Boolean) + Public Sub RotateEntity(Entity As Entity, ByVal RemoveEntityAfter As Boolean, ByVal RotationSpeedX As Single, ByVal RotationSpeedY As Single, ByVal RotationSpeedZ As Single, ByVal EndRotationX As Single, ByVal EndRotationY As Single, ByVal EndRotationZ As Single, ByVal startDelay As Single, ByVal endDelay As Single, ByVal DoXRotation As Boolean, ByVal DoYRotation As Boolean, ByVal DoZRotation As Boolean, ByVal DoReturn As Boolean) Dim RotateEntity As Entity If Entity Is Nothing Then RotateEntity = CurrentEntity @@ -161,8 +188,13 @@ Dim EndRotation As Vector3 = New Vector3(EndRotationX, EndRotationY, EndRotationZ) Dim baEntityRotate As BAEntityRotate = New BAEntityRotate(RotateEntity, RotationSpeedVector, EndRotation, startDelay, endDelay, DoXRotation, DoYRotation, DoZRotation, DoReturn) AnimationSequence.Add(baEntityRotate) + If RemoveEntityAfter = True Then + If baEntityRotate.CanRemove = True Then + RemoveEntity(Entity) + End If + End If End Sub - Public Sub AnimationScaleEntity(ByVal Entity As Entity, ByVal Grow As Boolean, ByVal EndSizeX As Single, ByVal EndSizeY As Single, ByVal EndSizeZ As Single, ByVal SizeSpeed As Single, ByVal startDelay As Single, ByVal endDelay As Single, Optional ByVal Anchors As String = "1") + Public Sub ScaleEntity(ByVal Entity As Entity, ByVal RemoveEntityAfter As Boolean, ByVal Grow As Boolean, ByVal EndSizeX As Single, ByVal EndSizeY As Single, ByVal EndSizeZ As Single, ByVal SizeSpeed As Single, ByVal startDelay As Single, ByVal endDelay As Single, Optional ByVal Anchors As String = "1") Dim ScaleEntity As Entity If Entity Is Nothing Then ScaleEntity = CurrentEntity @@ -175,6 +207,11 @@ Dim EndSize As Vector3 = New Vector3(EndSizeX, EndSizeY, EndSizeZ) Dim baBillSize As BAEntityScale = New BAEntityScale(ScaleEntity, Scale, Grow, EndSize, SizeSpeed, startDelay, endDelay, Anchors) AnimationSequence.Add(baBillSize) + If RemoveEntityAfter = True Then + If baBillSize.CanRemove = True Then + RemoveEntity(Entity) + End If + End If End Sub Public Sub AnimationSpawnFadingEntity(ByVal PositionX As Single, ByVal PositionY As Single, ByVal PositionZ As Single, ByVal Texture As String, ByVal ScaleX As Single, ByVal ScaleY As Single, ByVal ScaleZ As Single, ByVal TransitionSpeed As Single, ByVal FadeIn As Boolean, ByVal EndState As Single, ByVal startDelay As Single, ByVal endDelay As Single, Optional ByVal startState As Single = 1.0F) @@ -193,7 +230,7 @@ texture2D = TextureManager.GetTexture(stringArray(0), r, "") End If - If BAFlipped Then + If BattleFlipped Then PositionX -= PositionX * 2.0F PositionZ -= PositionZ * 2.0F End If @@ -222,7 +259,7 @@ texture2D = TextureManager.GetTexture(stringArray(0), r, "") End If - If BAFlipped Then + If BattleFlipped Then PositionX -= PositionX * 2.0F PositionZ -= PositionZ * 2.0F DestinationX -= DestinationX * 2.0F @@ -239,7 +276,7 @@ AnimationSequence.Add(baMove) End If End Sub - Public Sub AnimationPlaySound(ByVal sound As String, ByVal startDelay As Single, ByVal endDelay As Single, Optional ByVal stopMusic As Boolean = False, Optional ByVal IsPokemon As Boolean = False) + Public Sub PlaySound(ByVal sound As String, ByVal startDelay As Single, ByVal endDelay As Single, Optional ByVal stopMusic As Boolean = False, Optional ByVal IsPokemon As Boolean = False) If CurrentEntity Is Nothing Then Logger.Log(Logger.LogTypes.Warning, "ATTEMPT TO USE AnimationPlaySound OUTSIDE OF ATTACK ANIMATION DELEGATE") ElseIf Not AnimationStarted Then diff --git a/P3D/Content/Textures/Battle/Cloud.png b/P3D/Content/Textures/Battle/Smoke.png similarity index 100% rename from P3D/Content/Textures/Battle/Cloud.png rename to P3D/Content/Textures/Battle/Smoke.png diff --git a/P3D/Entites/Entity.vb b/P3D/Entites/Entity.vb index 998344643..99d766dfc 100644 --- a/P3D/Entites/Entity.vb +++ b/P3D/Entites/Entity.vb @@ -22,6 +22,7 @@ Public Visible As Boolean = True Public Shader As New Vector3(1.0F) Public Shaders As New List(Of Vector3) + Public Color As Vector3 = New Vector3(1.0F) Public CameraDistanceDelta As Single = 0.0F diff --git a/P3D/P3D.vbproj b/P3D/P3D.vbproj index ec16b862f..a3208c826 100644 --- a/P3D/P3D.vbproj +++ b/P3D/P3D.vbproj @@ -15403,6 +15403,9 @@ PreserveNewest + + PreserveNewest + PreserveNewest @@ -26269,9 +26272,6 @@ PreserveNewest - - PreserveNewest - PreserveNewest @@ -27545,6 +27545,7 @@ PreserveNewest + diff --git a/P3D/Pokemon/Attacks/Fire/Ember.vb b/P3D/Pokemon/Attacks/Fire/Ember.vb index 6719f780d..03a9cfffc 100644 --- a/P3D/Pokemon/Attacks/Fire/Ember.vb +++ b/P3D/Pokemon/Attacks/Fire/Ember.vb @@ -66,7 +66,7 @@ Public Overrides Sub InternalUserPokemonMoveAnimation(ByVal BattleScreen As BattleScreen, ByVal own As Boolean, ByVal CurrentPokemon As Pokemon, ByVal CurrentEntity As NPC, ByVal CurrentModel As ModelEntity) Dim MoveAnimation As AnimationQueryObject = New AnimationQueryObject(CurrentEntity, own) MoveAnimation.AnimationSpawnMovingEntity(0.0, 0, 0.0, "Textures\Battle\Fire\FireBall", 0.5, 0.5, 0.5, 2.0, 0.0, 0.0, 0.05, False, True, 0.0, 0.0,, -0.5, 0) - MoveAnimation.AnimationPlaySound("Battle\Attacks\Fire\Ember_Start", 0, 0) + MoveAnimation.PlaySound("Battle\Attacks\Fire\Ember_Start", 0, 0) For i = 0 To 12 MoveAnimation.AnimationSpawnFadingEntity(CSng(i * 0.2), 0.0, 0.0, "Textures\Battle\Fire\Smoke", 0.2, 0.2, 0.2, 0.02, False, 0.0, CSng(i * 0.2), 0.0) i += 1 @@ -82,7 +82,7 @@ MoveAnimation.AnimationSpawnFadingEntity(CSng(3.0 - i * 0.2), 0.0, 0.0, "Textures\Battle\Fire\Smoke", 0.2, 0.2, 0.2, 0.02, False, 0.0, CSng(i * 0.2), 0.0) i += 1 Next - MoveAnimation.AnimationPlaySound("Battle\Attacks\Fire\Ember_Hit", 2, 0) + MoveAnimation.PlaySound("Battle\Attacks\Fire\Ember_Hit", 2, 0) MoveAnimation.AnimationSpawnFadingEntity(-0.25, -0.25, -0.25, "Textures\Battle\Fire\Ember,0,0,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 1, 1) MoveAnimation.AnimationSpawnFadingEntity(0.25, -0.25, 0.25, "Textures\Battle\Fire\Ember,0,0,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 1, 1) MoveAnimation.AnimationSpawnFadingEntity(0.25, -0.25, -0.25, "Textures\Battle\Fire\Ember,0,0,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 1, 1) diff --git a/P3D/Pokemon/Attacks/Grass/Absorb.vb b/P3D/Pokemon/Attacks/Grass/Absorb.vb index a63495b58..6b8075175 100644 --- a/P3D/Pokemon/Attacks/Grass/Absorb.vb +++ b/P3D/Pokemon/Attacks/Grass/Absorb.vb @@ -96,7 +96,7 @@ Dim MoveAnimation As AnimationQueryObject = New AnimationQueryObject(CurrentEntity, own) Dim maxAmount As Integer = 8 Dim currentAmount As Integer = 0 - MoveAnimation.AnimationPlaySound("Battle\Attacks\Grass\Absorb", 0, 0) + MoveAnimation.PlaySound("Battle\Attacks\Grass\Absorb", 0, 0) While currentAmount <= maxAmount Dim yPos As Single = CSng(Random.NextDouble() * 0.5) Dim zPos As Single = CSng(Random.Next(-5, 5) * 0.15) diff --git a/P3D/Pokemon/Attacks/Normal/Growl.vb b/P3D/Pokemon/Attacks/Normal/Growl.vb index 5c35961e3..e01dafc73 100644 --- a/P3D/Pokemon/Attacks/Normal/Growl.vb +++ b/P3D/Pokemon/Attacks/Normal/Growl.vb @@ -64,7 +64,7 @@ Public Overrides Sub InternalUserPokemonMoveAnimation(ByVal BattleScreen As BattleScreen, ByVal own As Boolean, ByVal CurrentPokemon As Pokemon, ByVal CurrentEntity As NPC, ByVal CurrentModel As ModelEntity) Dim MoveAnimation As AnimationQueryObject = New AnimationQueryObject(CurrentEntity, own) - MoveAnimation.AnimationPlaySound(CStr(CurrentPokemon.Number), 0, 0,, True) + MoveAnimation.PlaySound(CStr(CurrentPokemon.Number), 0, 0,, True) MoveAnimation.AnimationSpawnFadingEntity(0.25, -0.25, -0.25, "Textures\Battle\Normal\Growl,0,0,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 0, 1) MoveAnimation.AnimationSpawnFadingEntity(0.25, -0.25, -0.25, "Textures\Battle\Normal\Growl,0,32,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 1, 1) MoveAnimation.AnimationSpawnFadingEntity(0.25, -0.25, -0.25, "Textures\Battle\Normal\Growl,0,0,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 2, 1) diff --git a/P3D/Pokemon/Attacks/Normal/Pound.vb b/P3D/Pokemon/Attacks/Normal/Pound.vb index 25785556e..5cf85b3e2 100644 --- a/P3D/Pokemon/Attacks/Normal/Pound.vb +++ b/P3D/Pokemon/Attacks/Normal/Pound.vb @@ -57,7 +57,7 @@ Public Overrides Sub InternalOpponentPokemonMoveAnimation(ByVal BattleScreen As BattleScreen, ByVal own As Boolean, ByVal CurrentPokemon As Pokemon, ByVal CurrentEntity As NPC, ByVal CurrentModel As ModelEntity) Dim MoveAnimation As AnimationQueryObject = New AnimationQueryObject(CurrentEntity, own) - MoveAnimation.AnimationPlaySound("Battle\Attacks\Pound", 0.5, 2.5) + MoveAnimation.PlaySound("Battle\Attacks\Pound", 0.5, 2.5) MoveAnimation.AnimationSpawnFadingEntity(0, -0.25, 0, "Textures\Battle\Normal\Pound", 0.5, 0.5, 0.5, 0.02, False, 1.0, 0, 3) BattleScreen.BattleQuery.Add(MoveAnimation) End Sub diff --git a/P3D/Pokemon/Attacks/Normal/Tackle.vb b/P3D/Pokemon/Attacks/Normal/Tackle.vb index 4d53f749d..99e61e709 100644 --- a/P3D/Pokemon/Attacks/Normal/Tackle.vb +++ b/P3D/Pokemon/Attacks/Normal/Tackle.vb @@ -54,15 +54,16 @@ Public Overrides Sub InternalUserPokemonMoveAnimation(ByVal BattleScreen As BattleScreen, ByVal own As Boolean, ByVal CurrentPokemon As Pokemon, ByVal CurrentEntity As NPC, ByVal CurrentModel As ModelEntity) Dim MoveAnimation As AnimationQueryObject = New AnimationQueryObject(CurrentEntity, own, CurrentModel) - MoveAnimation.AnimationMoveEntity(Nothing, 0.5, 0, 0, 0.3, False, False, 0, 0,,, 2) - MoveAnimation.AnimationMoveEntity(Nothing, 0, 0, 0, 0.3, False, False, 1, 0,,, 2) + MoveAnimation.MoveEntity(Nothing, False, 0.5, 0, 0, 0.3, False, False, 0, 0,,, 2) + MoveAnimation.MoveEntity(Nothing, False, 0, 0, 0, 0.3, False, False, 1, 0,,, 2) BattleScreen.BattleQuery.Add(MoveAnimation) End Sub Public Overrides Sub InternalOpponentPokemonMoveAnimation(ByVal BattleScreen As BattleScreen, ByVal own As Boolean, ByVal CurrentPokemon As Pokemon, ByVal CurrentEntity As NPC, ByVal CurrentModel As ModelEntity) Dim MoveAnimation As AnimationQueryObject = New AnimationQueryObject(CurrentEntity, own) - MoveAnimation.AnimationPlaySound("Battle\Attacks\Normal\Tackle", 0, 2) - MoveAnimation.AnimationSpawnFadingEntity(0, -0.25, 0, "Textures\Battle\Normal\Tackle", 0.5, 0.5, 0.5, 0.02, False, 1.0, 0, 2) + MoveAnimation.PlaySound("Battle\Attacks\Normal\Tackle", 0, 2) + Dim SpawnEntity = MoveAnimation.SpawnEntity(New Vector3(0, -0.25, 0), TextureManager.GetTexture("Textures\Battle\Normal\Tackle"), New Vector3(1.0F), 1.0F) + MoveAnimation.FadeEntity(SpawnEntity, True, 0.02, False, 1.0F, 0, 2) BattleScreen.BattleQuery.Add(MoveAnimation) End Sub End Class diff --git a/P3D/Pokemon/Attacks/Poison/PoisonSting.vb b/P3D/Pokemon/Attacks/Poison/PoisonSting.vb index 9684f8379..3cc76f0a4 100644 --- a/P3D/Pokemon/Attacks/Poison/PoisonSting.vb +++ b/P3D/Pokemon/Attacks/Poison/PoisonSting.vb @@ -67,30 +67,38 @@ Public Overrides Sub InternalUserPokemonMoveAnimation(ByVal BattleScreen As BattleScreen, ByVal own As Boolean, ByVal CurrentPokemon As Pokemon, ByVal CurrentEntity As NPC, ByVal CurrentModel As ModelEntity) Dim MoveAnimation As AnimationQueryObject = New AnimationQueryObject(CurrentEntity, own) - MoveAnimation.AnimationSpawnMovingEntity(0.0, 0, 0.0, "Textures\Battle\Poison\Stinger", 0.5, 0.5, 0.5, 2.0, 0.0, 0.0, 0.05, False, False, 0.0, 0.0,,, 0) - MoveAnimation.AnimationPlaySound("Battle\Attacks\Poison\PoisonSting_Start", 0, 0) + Dim StingerEntity As Entity = MoveAnimation.SpawnEntity(CurrentEntity.Position, TextureManager.GetTexture("Textures\Battle\Poison\Stinger"), New Vector3(0.5F), 1.0F) + + MoveAnimation.PlaySound("Battle\Attacks\Poison\PoisonSting_Start", 0, 0) + MoveAnimation.MoveEntity(StingerEntity, True, 2.0, 0.0, 0.0, 0.05, False, False, 0.0, 0.0,,, 0) + BattleScreen.BattleQuery.Add(MoveAnimation) End Sub Public Overrides Sub InternalOpponentPokemonMoveAnimation(ByVal BattleScreen As BattleScreen, ByVal own As Boolean, ByVal CurrentPokemon As Pokemon, ByVal CurrentEntity As NPC, ByVal CurrentModel As ModelEntity) Dim MoveAnimation As AnimationQueryObject = New AnimationQueryObject(CurrentEntity, own) - MoveAnimation.AnimationSpawnMovingEntity(2.0, 0, 0.0, "Textures\Battle\Poison\Stinger", 0.5, 0.5, 0.5, 0.0, 0.0, 0.0, 0.05, False, False, 0.0, 0.0,,, 0) + Dim StingerEntity As Entity = MoveAnimation.SpawnEntity(New Vector3(2.0, 0, 0.0), TextureManager.GetTexture("Textures\Battle\Poison\Stinger"), New Vector3(0.5F), 1) - MoveAnimation.AnimationPlaySound("Battle\Attacks\Poison\PoisonSting_Hit", 1, 0) - MoveAnimation.AnimationSpawnFadingEntity(-0.25, -0.25, -0.25, "Textures\Battle\Poison\Bubble,0,0,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 1, 1) + MoveAnimation.MoveEntity(StingerEntity, True, 0.0, 0.0, 0.0, 0.05, False, False, 0.0, 0.0,,, 0) - MoveAnimation.AnimationSpawnFadingEntity(-0.25, -0.25, -0.25, "Textures\Battle\Poison\Bubble,0,32,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 2, 1) - MoveAnimation.AnimationSpawnFadingEntity(0.25, -0.25, 0.25, "Textures\Battle\Poison\Bubble,0,0,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 2, 1) + MoveAnimation.PlaySound("Battle\Attacks\Poison\PoisonSting_Hit", 1, 0) - MoveAnimation.AnimationSpawnFadingEntity(-0.25, -0.25, -0.25, "Textures\Battle\Poison\Bubble,0,64,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 3, 1) - MoveAnimation.AnimationSpawnFadingEntity(0.25, -0.25, 0.25, "Textures\Battle\Poison\Bubble,0,32,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 3, 1) - MoveAnimation.AnimationSpawnFadingEntity(0.25, -0.25, -0.25, "Textures\Battle\Poison\Bubble,0,0,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 3, 1) + Dim BubbleEntity1 As Entity = MoveAnimation.SpawnEntity(New Vector3(-0.25, -0.25, -0.25), TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 0, 32, 32)), New Vector3(0.5F), 1, 1, 1) - MoveAnimation.AnimationSpawnFadingEntity(0.25, -0.25, 0.25, "Textures\Battle\Poison\Bubble,0,64,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 4, 1) - MoveAnimation.AnimationSpawnFadingEntity(0.25, -0.25, -0.25, "Textures\Battle\Poison\Bubble,0,32,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 4, 1) + MoveAnimation.ChangeEntityTexture(BubbleEntity1, False, TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 32, 32, 32)), 2, 1) - MoveAnimation.AnimationSpawnFadingEntity(0.25, -0.25, -0.25, "Textures\Battle\Poison\Bubble,0,64,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 5, 2) + Dim BubbleEntity2 As Entity = MoveAnimation.SpawnEntity(New Vector3(0.25, -0.25, 0.25), TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 0, 32, 32)), New Vector3(0.5F), 1, 2, 1) + + MoveAnimation.ChangeEntityTexture(BubbleEntity1, True, TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 64, 32, 32)), 3, 1) + MoveAnimation.ChangeEntityTexture(BubbleEntity2, False, TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 32, 32, 32)), 3, 1) + + Dim BubbleEntity3 As Entity = MoveAnimation.SpawnEntity(New Vector3(0.25, -0.25, -0.25), TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 0, 32, 32)), New Vector3(0.5F), 1, 3, 1) + + MoveAnimation.ChangeEntityTexture(BubbleEntity2, True, TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 64, 32, 32)), 4, 1) + MoveAnimation.ChangeEntityTexture(BubbleEntity3, False, TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 32, 32, 32)), 4, 1) + + MoveAnimation.ChangeEntityTexture(BubbleEntity3, True, TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 64, 32, 32)), 5, 1) BattleScreen.BattleQuery.Add(MoveAnimation) End Sub diff --git a/P3D/Resources/Models/BaseModel.vb b/P3D/Resources/Models/BaseModel.vb index 92ae430c2..c10890d7d 100644 --- a/P3D/Resources/Models/BaseModel.vb +++ b/P3D/Resources/Models/BaseModel.vb @@ -15,7 +15,7 @@ Screen.Effect.TextureEnabled = True Screen.Effect.Alpha = Entity.Opacity - Screen.Effect.DiffuseColor = effectDiffuseColor * Entity.Shader + Screen.Effect.DiffuseColor = effectDiffuseColor * Entity.Shader * Entity.Color If Screen.Level.IsDark = True Then Screen.Effect.DiffuseColor *= New Vector3(0.5, 0.5, 0.5) @@ -70,7 +70,9 @@ End If Screen.Effect.DiffuseColor = effectDiffuseColor - If DebugDisplay.MaxDistance < Entity.CameraDistance Then DebugDisplay.MaxDistance = CInt(Entity.CameraDistance) + If DebugDisplay.MaxDistance < Entity.CameraDistance Then + DebugDisplay.MaxDistance = CInt(Entity.CameraDistance) + End If End Sub Private Sub ApplyTexture(ByVal texture As Texture2D) diff --git a/P3D/Screens/Battle/BattleCatchScreen.vb b/P3D/Screens/Battle/BattleCatchScreen.vb index 787d1e9b0..75ea37b7a 100644 --- a/P3D/Screens/Battle/BattleCatchScreen.vb +++ b/P3D/Screens/Battle/BattleCatchScreen.vb @@ -4,9 +4,11 @@ Dim Ball As Item - Dim Animations As BattleSystem.AnimationQueryObject = New BattleSystem.AnimationQueryObject(Nothing, False, Nothing) - Dim BallStartPosition As Vector3 = New Vector3(Camera.Position.X - 1.0F, Camera.Position.Y, Camera.Position.Z - 0.5F) + BattleScreen.BattleMapOffset - Dim BallEntity As Entity = Animations.SpawnEntity(BallStartPosition, Ball.Texture, New Vector3(0.3F), 1.0F) + Dim Animations As BattleSystem.AnimationQueryObject = New BattleSystem.AnimationQueryObject(BattleScreen.OppPokemonNPC, Nothing, BattleScreen.OppPokemonModel) + Dim BallStartPosition As Vector3 = New Vector3(Camera.Position.X - 1.0F, Camera.Position.Y, Camera.Position.Z - 1.0F) + BattleScreen.BattleMapOffset + Dim BallEntity As Entity = Nothing + + Dim PokemonScale As Vector3 Dim AnimationStarted As Boolean = False Dim caught As Boolean = False @@ -104,15 +106,15 @@ If TextBox.Showing = False Then - If Me._playIntroSound = False Then - Me._playIntroSound = True - SoundManager.PlaySound("Battle\Pokeball\throw") - End If - UpdateAnimations() If Me.IsCurrentScreen() = True Then If AnimationStarted = False Then + If Me._playIntroSound = False Then + Me._playIntroSound = True + SoundManager.PlaySound("Battle\Pokeball\throw") + End If + BallEntity = Animations.SpawnEntity(BallStartPosition, Ball.Texture, New Vector3(0.3F), 1.0F) SetupAnimation() Else Select Case Me.AnimationIndex @@ -131,7 +133,7 @@ SoundManager.PlaySound("Battle\Pokeball\shake") AnimationIndex += 1 Else - SoundManager.PlaySound("Battle\Pokeball\open") + SoundManager.PlaySound("Battle\Pokeball\break") AnimationIndex = 21 InBall = False End If @@ -177,7 +179,7 @@ ResetVisibility() Core.SetScreen(Me.PreScreen) Case 21 ' After Break - ResetVisibility() + SetupAnimation() Core.SetScreen(Me.PreScreen) CType(Core.CurrentScreen, BattleSystem.BattleScreen).Battle.InitializeRound(CType(Core.CurrentScreen, BattleSystem.BattleScreen), New BattleSystem.Battle.RoundConst() With {.StepType = BattleSystem.Battle.RoundConst.StepTypes.Text, .Argument = "It broke free!"}) End Select @@ -255,52 +257,68 @@ Select Case Me.AnimationIndex Case 0 - Animations.AnimationMoveEntity(BallEntity, BattleScreen.OppPokemonNPC.Position.X - 0.05F, 0.0F, BattleScreen.OppPokemonNPC.Position.Z, 0.04F, True, True, 1.0F, 0.0F,,, 3) + PokemonScale = BattleScreen.OppPokemonNPC.Scale + Animations.MoveEntity(BallEntity, False, BattleScreen.OppPokemonNPC.Position.X - 0.05F, 0.0F, BattleScreen.OppPokemonNPC.Position.Z, 0.1, False, True, 0F, 0F,, 0.3) Case 1 - Dim SmokeReturned As Integer = 0 + Dim SmokeParticles As Integer = 0 Do - Dim SmokePosition = New Vector3(CSng(Random.Next(-10, 10) / 10), CSng(Random.Next(-10, 10) / 10), CSng(Random.Next(-10, 10) / 10)) - Dim SmokeDestination = New Vector3(0, 0, 0) + Dim SmokePosition = BattleScreen.OwnPokemonNPC.Position + New Vector3(CSng(Random.Next(-10, 10) / 10), CSng(Random.Next(-10, 10) / 10), CSng(Random.Next(-10, 10) / 10)) + Dim SmokeDestination = BattleScreen.OwnPokemonNPC.Position - Dim SmokeTexture As Texture2D = TextureManager.GetTexture("Textures\Battle\Cloud") + Dim SmokeTexture As Texture2D = TextureManager.GetTexture("Textures\Battle\Smoke") Dim SmokeScale = New Vector3(CSng(Random.Next(2, 6) / 10)) Dim SmokeSpeed = CSng(Random.Next(1, 3) / 10.0F) Dim SmokeEntity As Entity = Animations.SpawnEntity(SmokePosition, SmokeTexture, SmokeScale, 1.0F) - Animations.AnimationMoveEntity(SmokeEntity, SmokeDestination.X, SmokeDestination.Y, SmokeDestination.Z, SmokeSpeed, False, False, 0.0F, 0.0F) - If SmokeEntity.Position = SmokeDestination Then - Animations.RemoveEntity(SmokeEntity) - End If - Threading.Interlocked.Increment(SmokeReturned) - Loop While SmokeReturned <= 38 + Animations.MoveEntity(SmokeEntity, True, SmokeDestination.X, SmokeDestination.Y, SmokeDestination.Z, SmokeSpeed, False, False, 0.0F, 0.0F) - Animations.AnimationMoveEntity(BallEntity, BattleScreen.OppPokemonNPC.Position.X - 0.05F, 0.0F, BattleScreen.OppPokemonNPC.Position.Z, 0.01F, False, False, 0.0F, 6.0F,,, 3) + Threading.Interlocked.Increment(SmokeParticles) + Loop While SmokeParticles <= 38 - Animations.AnimationScaleEntity(BattleScreen.OppPokemonNPC, False, 0.05F, 0.05F, 0.05F, 0.02F, 0.0F, 0.0F, "1") - Animations.AnimationFadeEntity(BattleScreen.OppPokemonNPC, 1, False, 0.0F, 0.0F, 0.0F) + Animations.MoveEntity(BallEntity, False, BattleScreen.OppPokemonNPC.Position.X, BattleScreen.OwnPokemonNPC.Position.Y, BattleScreen.OppPokemonNPC.Position.Z, 0.01F, False, False, 0.0F, 6.0F,,, 3) + + Animations.ScaleEntity(Nothing, False, False, 0.05F, 0.05F, 0.05F, 0.02F, 0.0F, 0.0F, "1") + Animations.FadeEntity(Nothing, False, 1, False, 0.0F, 0.0F, 0.0F) Case 2 - Animations.AnimationMoveEntity(BallEntity, BattleScreen.OppPokemonNPC.Position.X - 0.05F, -0.35F, BattleScreen.OppPokemonNPC.Position.Z, 0.02F, False, False, 0.0F, 6.0F,,, 3) - + Animations.MoveEntity(BallEntity, False, BattleScreen.OppPokemonNPC.Position.X, BattleScreen.OwnPokemonNPC.Position.Y - 0.35F, BattleScreen.OppPokemonNPC.Position.Z, 0.02F, False, False, 0.0F, 6.0F,,, 3) Case 3, 5 - Animations.AnimationRotateEntity(BallEntity, 0, 0, 0.05F, 0, 0, 1.0F, 0.0F, 4.0F, False, False, True, True) + Animations.RotateEntity(BallEntity, False, 0, 0, 0.05F, 0, 0, 1.0F, 0.0F, 4.0F, False, False, True, True) Case 4, 6 - Animations.AnimationRotateEntity(BallEntity, 0, 0, -0.05F, 0, 0, -1.0F, 0.0F, 4.0F, False, False, True, True) + Animations.RotateEntity(BallEntity, False, 0, 0, -0.05F, 0, 0, -1.0F, 0.0F, 4.0F, False, False, True, True) Case 7 ' Catch Animation For i = 0 To 2 Dim StarPosition As Vector3 = New Vector3(BattleScreen.OppPokemonNPC.Position.X - 0.05F, -0.35F, BattleScreen.OppPokemonNPC.Position.Z) Dim StarDestination As Vector3 = New Vector3(StarPosition.X, StarPosition.Y + 0.4F, StarPosition.Z - ((1 - i) * 0.4F)) Dim StarEntity As Entity = Animations.SpawnEntity(StarPosition, TextureManager.GetTexture("Textures\Battle\BallCatchStar"), New Vector3(0.1F), 1.0F) - Animations.AnimationMoveEntity(StarEntity, StarDestination.X, StarDestination.Y, StarDestination.Z, 0.01F, False, False, 0.0F, 0.0F,,, 3) - If StarEntity.Position = StarDestination Then - Animations.RemoveEntity(StarEntity) - End If + Animations.MoveEntity(StarEntity, True, StarDestination.X, StarDestination.Y, StarDestination.Z, 0.01F, False, False, 0.0F, 0.0F,,, 3) Next - Animations.AnimationMoveEntity(BallEntity, BattleScreen.OppPokemonNPC.Position.X - 0.05F, -0.35F, BattleScreen.OppPokemonNPC.Position.Z, 0.02F, False, False, 0.0F, 6.0F,,, 3) + Animations.MoveEntity(BallEntity, False, BattleScreen.OppPokemonNPC.Position.X, BattleScreen.OwnPokemonNPC.Position.Y - 0.35F, BattleScreen.OppPokemonNPC.Position.Z, 0.02F, False, False, 0.0F, 6.0F,,, 3) Case 8 - Animations.AnimationFadeEntity(BallEntity, 0.01F, False, 0.0F, 0.0F, 0.0F) + Animations.FadeEntity(BallEntity, True, 0.01F, False, 0.0F, 0.0F, 0.0F) Case 21 ' Break Animation + ' Ball Opens + Dim SmokeParticles As Integer = 0 + Do + Dim SmokePosition = BattleScreen.OwnPokemonNPC.Position + Dim SmokeDestination = BattleScreen.OwnPokemonNPC.Position + New Vector3(CSng(Random.Next(-10, 10) / 10), CSng(Random.Next(-10, 10) / 10), CSng(Random.Next(-10, 10) / 10)) + + Dim SmokeTexture As Texture2D = TextureManager.GetTexture("Textures\Battle\Smoke") + + Dim SmokeScale = New Vector3(CSng(Random.Next(2, 6) / 10)) + Dim SmokeSpeed = CSng(Random.Next(1, 3) / 10.0F) + + Dim SmokeEntity As Entity = Animations.SpawnEntity(SmokePosition, SmokeTexture, SmokeScale, 1.0F) + + Animations.MoveEntity(SmokeEntity, True, SmokeDestination.X, SmokeDestination.Y, SmokeDestination.Z, SmokeSpeed, False, False, 0.0F, 0.0F) + + Threading.Interlocked.Increment(SmokeParticles) + Loop While SmokeParticles <= 38 + + ' Pokemon appears + Animations.FadeEntity(Nothing, False, 1, False, 1, 0.0F, 0.0F) + Animations.ScaleEntity(Nothing, False, True, PokemonScale.X, PokemonScale.Y, PokemonScale.Z, 0.02F, 0.0F, 0.0F, "1") End Select End Sub From 2c3f46cd2e7aa0ecf827eefea50ee56cfc92255c Mon Sep 17 00:00:00 2001 From: JappaWakka Date: Thu, 21 Oct 2021 20:42:40 +0200 Subject: [PATCH 06/57] Updated everything to the new Battle Animations system and the newest commands MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Updated Attacks: Ember, Absorb, Growl, Pound Updated status effects & shared animations: Poisoned, Switching Pokémon (own and opponent's) --- P3D/Battle/BattleAnimations/BAPlaySound.vb | 28 +++ P3D/Battle/BattleSystemV2/Battle.vb | 217 ++++++++++-------- .../QueryObjects/AnimationQueryObject.vb | 91 +------- P3D/P3D.vbproj | 5 +- P3D/Pokemon/Attacks/Fire/Ember.vb | 51 ++-- P3D/Pokemon/Attacks/Grass/Absorb.vb | 6 +- P3D/Pokemon/Attacks/Normal/Growl.vb | 13 +- P3D/Pokemon/Attacks/Normal/Pound.vb | 5 +- P3D/Pokemon/Attacks/Normal/Tackle.vb | 8 +- P3D/Pokemon/Attacks/Poison/PoisonSting.vb | 20 +- P3D/Screens/Battle/BattleCatchScreen.vb | 28 +-- 11 files changed, 229 insertions(+), 243 deletions(-) create mode 100644 P3D/Battle/BattleAnimations/BAPlaySound.vb diff --git a/P3D/Battle/BattleAnimations/BAPlaySound.vb b/P3D/Battle/BattleAnimations/BAPlaySound.vb new file mode 100644 index 000000000..120ec1106 --- /dev/null +++ b/P3D/Battle/BattleAnimations/BAPlaySound.vb @@ -0,0 +1,28 @@ +Public Class BAPlaySound + + Inherits BattleAnimation3D + + Private soundfile As String + Private stopMusic As Boolean + Private IsPokemon As Boolean + + + Public Sub New(ByVal sound As String, ByVal startDelay As Single, ByVal endDelay As Single, Optional ByVal stopMusic As Boolean = False, Optional ByVal IsPokemon As Boolean = False) + MyBase.New(New Vector3(0.0F), TextureManager.DefaultTexture, New Vector3(1.0F), startDelay, endDelay) + Me.Scale = New Vector3(1.0F) + soundfile = sound + Me.Visible = False + Me.stopMusic = stopMusic + Me.IsPokemon = IsPokemon + AnimationType = AnimationTypes.Sound + End Sub + + Public Overrides Sub DoActionActive() + If IsPokemon = True Then + SoundManager.PlayPokemonCry(CInt(soundfile)) + Else + SoundManager.PlaySound(soundfile, stopMusic) + End If + Me.Ready = True + End Sub +End Class \ No newline at end of file diff --git a/P3D/Battle/BattleSystemV2/Battle.vb b/P3D/Battle/BattleSystemV2/Battle.vb index a93c5e4bc..058885f11 100644 --- a/P3D/Battle/BattleSystemV2/Battle.vb +++ b/P3D/Battle/BattleSystemV2/Battle.vb @@ -2706,12 +2706,12 @@ ChangeCameraAngle(1, own, BattleScreen) 'Burn animation Dim BurnAnimation As AnimationQueryObject = New AnimationQueryObject(pNPC, own) - BurnAnimation.PlaySound("Battle\Effects\Burned", 0, 0) + BurnAnimation.AnimationPlaySound("Battle\Effects\Burned", 0, 0) Dim FlameEntity As Entity = BurnAnimation.SpawnEntity(New Vector3(CSng(pNPC.Position.X - 0.25), CSng(pNPC.Position.Y - 0.25), CSng(pNPC.Position.Z - 0.25)), TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 0, 32, 32)), New Vector3(0.5, 0.5, 0.5), 1.0F) - BurnAnimation.ChangeEntityTexture(FlameEntity, False, TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 32, 32, 32)), 2, 1) - BurnAnimation.ChangeEntityTexture(FlameEntity, False, TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 64, 32, 32)), 3, 1) - BurnAnimation.ChangeEntityTexture(FlameEntity, False, TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 96, 32, 32)), 4, 1) - BurnAnimation.ChangeEntityTexture(FlameEntity, True, TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 128, 32, 32)), 5, 2) + BurnAnimation.AnimationChangeTexture(FlameEntity, False, TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 32, 32, 32)), 2, 1) + BurnAnimation.AnimationChangeTexture(FlameEntity, False, TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 64, 32, 32)), 3, 1) + BurnAnimation.AnimationChangeTexture(FlameEntity, False, TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 96, 32, 32)), 4, 1) + BurnAnimation.AnimationChangeTexture(FlameEntity, True, TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 128, 32, 32)), 5, 2) BattleScreen.BattleQuery.Add(BurnAnimation) Select Case message @@ -3427,7 +3427,7 @@ Dim StatEntity As Entity = StatAnimation.SpawnEntity(Position, Texture, Scale, 1.0F) Dim startDelay As Double = 5.0 * Random.NextDouble() - StatAnimation.MoveEntity(Nothing, True, Destination.X, Destination.Y, Destination.Z, 0.05F, False, True, CSng(startDelay), 0.0F) + StatAnimation.AnimationMove(Nothing, True, Destination.X, Destination.Y, Destination.Z, 0.05F, False, True, CSng(startDelay), 0.0F) Threading.Interlocked.Increment(currentAmount) End While BattleScreen.BattleQuery.Add(New PlaySoundQueryObject("Battle\Effects\Stat_Raise", False)) @@ -3708,10 +3708,10 @@ Dim StatEntity As Entity = StatAnimation.SpawnEntity(Position, Texture, Scale, 1.0F) Dim startDelay As Double = 5.0 * Random.NextDouble() - StatAnimation.MoveEntity(Nothing, True, Destination.X, Destination.Y, Destination.Z, 0.05F, False, True, CSng(startDelay), 0.0F) + StatAnimation.AnimationMove(Nothing, True, Destination.X, Destination.Y, Destination.Z, 0.05F, False, True, CSng(startDelay), 0.0F) Threading.Interlocked.Increment(currentAmount) End While - StatAnimation.PlaySound("Battle\Effects\Stat_Lower", 0.0F, 10.0F) + StatAnimation.AnimationPlaySound("Battle\Effects\Stat_Lower", 0.0F, 10.0F) BattleScreen.BattleQuery.Add(StatAnimation) Dim printMessage As String = p.GetDisplayName() & "'s " & statString @@ -3998,10 +3998,10 @@ End If Dim HitAnimation As AnimationQueryObject = New AnimationQueryObject(pNPC, own) - HitAnimation.FadeEntity(Nothing, False, 1, False, 0, 0, 0) - HitAnimation.FadeEntity(Nothing, False, 1, True, 1, 1, 0) - HitAnimation.FadeEntity(Nothing, False, 1, False, 0, 2, 0) - HitAnimation.FadeEntity(Nothing, False, 1, True, 1, 3, 0) + HitAnimation.AnimationFade(Nothing, False, 1, False, 0, 0, 0) + HitAnimation.AnimationFade(Nothing, False, 1, True, 1, 1, 0) + HitAnimation.AnimationFade(Nothing, False, 1, False, 0, 2, 0) + HitAnimation.AnimationFade(Nothing, False, 1, True, 1, 3, 0) BattleScreen.BattleQuery.Add(HitAnimation) If own = True Then @@ -5357,20 +5357,22 @@ If .OwnPokemon.Status = Pokemon.StatusProblems.Poison Then 'Own Poison 'Poison animation Dim PoisonAnimation As AnimationQueryObject = New AnimationQueryObject(BattleScreen.OwnPokemonNPC, True) - PoisonAnimation.PlaySound("Battle\Effects\Poisoned", 0, 0) - PoisonAnimation.AnimationSpawnFadingEntity(-0.25, -0.25, -0.25, "Textures\Battle\Poison\Bubble,0,0,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 0, 1) - PoisonAnimation.AnimationSpawnFadingEntity(-0.25, -0.25, -0.25, "Textures\Battle\Poison\Bubble,0,32,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 1, 1) - PoisonAnimation.AnimationSpawnFadingEntity(0.25, -0.25, 0.25, "Textures\Battle\Poison\Bubble,0,0,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 1, 1) + PoisonAnimation.AnimationPlaySound("Battle\Effects\Poisoned", 0, 0) + Dim BubbleEntity1 As Entity = PoisonAnimation.SpawnEntity(New Vector3(-0.25, -0.25, -0.25), TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 0, 32, 32)), New Vector3(0.5F), 1, 0, 1) - PoisonAnimation.AnimationSpawnFadingEntity(-0.25, -0.25, -0.25, "Textures\Battle\Poison\Bubble,0,64,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 2, 1) - PoisonAnimation.AnimationSpawnFadingEntity(0.25, -0.25, 0.25, "Textures\Battle\Poison\Bubble,0,32,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 2, 1) - PoisonAnimation.AnimationSpawnFadingEntity(0.25, -0.25, -0.25, "Textures\Battle\Poison\Bubble,0,0,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 2, 1) + PoisonAnimation.AnimationChangeTexture(BubbleEntity1, False, TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 32, 32, 32)), 1, 1) + Dim BubbleEntity2 As Entity = PoisonAnimation.SpawnEntity(New Vector3(0.25, -0.25, 0.25), TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 0, 32, 32)), New Vector3(0.5F), 1, 1, 1) - PoisonAnimation.AnimationSpawnFadingEntity(0.25, -0.25, 0.25, "Textures\Battle\Poison\Bubble,0,64,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 3, 1) - PoisonAnimation.AnimationSpawnFadingEntity(0.25, -0.25, -0.25, "Textures\Battle\Poison\Bubble,0,32,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 3, 1) + PoisonAnimation.AnimationChangeTexture(BubbleEntity1, True, TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 64, 32, 32)), 2, 1) + PoisonAnimation.AnimationChangeTexture(BubbleEntity2, False, TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 32, 32, 32)), 2, 1) + Dim BubbleEntity3 As Entity = PoisonAnimation.SpawnEntity(New Vector3(0.25, -0.25, -0.25), TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 0, 32, 32)), New Vector3(0.5F), 1, 2, 1) + + PoisonAnimation.AnimationChangeTexture(BubbleEntity2, True, TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 64, 32, 32)), 3, 1) + PoisonAnimation.AnimationChangeTexture(BubbleEntity3, False, TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 32, 32, 32)), 3, 1) + + PoisonAnimation.AnimationChangeTexture(BubbleEntity3, True, TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 64, 32, 32)), 4, 1) - PoisonAnimation.AnimationSpawnFadingEntity(0.25, -0.25, -0.25, "Textures\Battle\Poison\Bubble,0,64,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 4, 2) BattleScreen.BattleQuery.Add(PoisonAnimation) 'Actual damage ReduceHP(CInt(.OwnPokemon.MaxHP / 8), True, True, BattleScreen, "The poison hurt " & .OwnPokemon.GetDisplayName() & ".", "poison") @@ -5381,20 +5383,22 @@ Dim multiplier As Double = (.FieldEffects.OwnPoisonCounter / 16) 'Poison animation Dim PoisonAnimation As AnimationQueryObject = New AnimationQueryObject(BattleScreen.OwnPokemonNPC, True) - PoisonAnimation.PlaySound("Battle\Effects\Poisoned", 0, 0) - PoisonAnimation.AnimationSpawnFadingEntity(-0.25, -0.25, -0.25, "Textures\Battle\Poison\Bubble,0,0,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 0, 1) - PoisonAnimation.AnimationSpawnFadingEntity(-0.25, -0.25, -0.25, "Textures\Battle\Poison\Bubble,0,32,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 1, 1) - PoisonAnimation.AnimationSpawnFadingEntity(0.25, -0.25, 0.25, "Textures\Battle\Poison\Bubble,0,0,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 1, 1) + PoisonAnimation.AnimationPlaySound("Battle\Effects\Poisoned", 0, 0) + Dim BubbleEntity1 As Entity = PoisonAnimation.SpawnEntity(New Vector3(-0.25, -0.25, -0.25), TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 0, 32, 32)), New Vector3(0.5F), 1, 0, 1) - PoisonAnimation.AnimationSpawnFadingEntity(-0.25, -0.25, -0.25, "Textures\Battle\Poison\Bubble,0,64,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 2, 1) - PoisonAnimation.AnimationSpawnFadingEntity(0.25, -0.25, 0.25, "Textures\Battle\Poison\Bubble,0,32,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 2, 1) - PoisonAnimation.AnimationSpawnFadingEntity(0.25, -0.25, -0.25, "Textures\Battle\Poison\Bubble,0,0,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 2, 1) + PoisonAnimation.AnimationChangeTexture(BubbleEntity1, False, TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 32, 32, 32)), 1, 1) + Dim BubbleEntity2 As Entity = PoisonAnimation.SpawnEntity(New Vector3(0.25, -0.25, 0.25), TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 0, 32, 32)), New Vector3(0.5F), 1, 1, 1) - PoisonAnimation.AnimationSpawnFadingEntity(0.25, -0.25, 0.25, "Textures\Battle\Poison\Bubble,0,64,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 3, 1) - PoisonAnimation.AnimationSpawnFadingEntity(0.25, -0.25, -0.25, "Textures\Battle\Poison\Bubble,0,32,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 3, 1) + PoisonAnimation.AnimationChangeTexture(BubbleEntity1, True, TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 64, 32, 32)), 2, 1) + PoisonAnimation.AnimationChangeTexture(BubbleEntity2, False, TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 32, 32, 32)), 2, 1) + Dim BubbleEntity3 As Entity = PoisonAnimation.SpawnEntity(New Vector3(0.25, -0.25, -0.25), TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 0, 32, 32)), New Vector3(0.5F), 1, 2, 1) + + PoisonAnimation.AnimationChangeTexture(BubbleEntity2, True, TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 64, 32, 32)), 3, 1) + PoisonAnimation.AnimationChangeTexture(BubbleEntity3, False, TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 32, 32, 32)), 3, 1) + + PoisonAnimation.AnimationChangeTexture(BubbleEntity3, True, TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 64, 32, 32)), 4, 1) - PoisonAnimation.AnimationSpawnFadingEntity(0.25, -0.25, -0.25, "Textures\Battle\Poison\Bubble,0,64,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 4, 2) BattleScreen.BattleQuery.Add(PoisonAnimation) 'Actual damage ReduceHP(CInt(.OwnPokemon.MaxHP * multiplier), True, True, BattleScreen, "The toxic hurt " & .OwnPokemon.GetDisplayName() & ".", "badpoison") @@ -5413,13 +5417,13 @@ 'Burn animation Dim BurnAnimation As AnimationQueryObject = New AnimationQueryObject(BattleScreen.OwnPokemonNPC, False) - BurnAnimation.PlaySound("Battle\Effects\Burned", 0, 0) + BurnAnimation.AnimationPlaySound("Battle\Effects\Burned", 0, 0) Dim FlameEntity As Entity = BurnAnimation.SpawnEntity(New Vector3(CSng(BattleScreen.OwnPokemonNPC.Position.X + 0.25), CSng(BattleScreen.OwnPokemonNPC.Position.Y - 0.25), CSng(BattleScreen.OwnPokemonNPC.Position.Z + 0.25)), TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 0, 32, 32)), New Vector3(0.5, 0.5, 0.5), 1.0F) - BurnAnimation.ChangeEntityTexture(FlameEntity, False, TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 32, 32, 32)), 2, 1) - BurnAnimation.ChangeEntityTexture(FlameEntity, False, TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 64, 32, 32)), 3, 1) - BurnAnimation.ChangeEntityTexture(FlameEntity, False, TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 96, 32, 32)), 4, 1) - BurnAnimation.ChangeEntityTexture(FlameEntity, True, TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 128, 32, 32)), 5, 2) + BurnAnimation.AnimationChangeTexture(FlameEntity, False, TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 32, 32, 32)), 2, 1) + BurnAnimation.AnimationChangeTexture(FlameEntity, False, TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 64, 32, 32)), 3, 1) + BurnAnimation.AnimationChangeTexture(FlameEntity, False, TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 96, 32, 32)), 4, 1) + BurnAnimation.AnimationChangeTexture(FlameEntity, True, TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 128, 32, 32)), 5, 2) BattleScreen.BattleQuery.Add(BurnAnimation) 'Actual damage @@ -6151,21 +6155,24 @@ If .OppPokemon.Status = Pokemon.StatusProblems.Poison Then 'Opp Poison 'Poison animation Dim PoisonAnimation As AnimationQueryObject = New AnimationQueryObject(BattleScreen.OppPokemonNPC, False) - PoisonAnimation.PlaySound("Battle\Effects\Poisoned", 0, 0) - PoisonAnimation.AnimationSpawnFadingEntity(-0.25, -0.25, -0.25, "Textures\Battle\Poison\Bubble,0,0,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 0, 1) - PoisonAnimation.AnimationSpawnFadingEntity(-0.25, -0.25, -0.25, "Textures\Battle\Poison\Bubble,0,32,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 1, 1) - PoisonAnimation.AnimationSpawnFadingEntity(0.25, -0.25, 0.25, "Textures\Battle\Poison\Bubble,0,0,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 1, 1) + PoisonAnimation.AnimationPlaySound("Battle\Effects\Poisoned", 0, 0) + Dim BubbleEntity1 As Entity = PoisonAnimation.SpawnEntity(New Vector3(-0.25, -0.25, -0.25), TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 0, 32, 32)), New Vector3(0.5F), 1, 0, 1) - PoisonAnimation.AnimationSpawnFadingEntity(-0.25, -0.25, -0.25, "Textures\Battle\Poison\Bubble,0,64,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 2, 1) - PoisonAnimation.AnimationSpawnFadingEntity(0.25, -0.25, 0.25, "Textures\Battle\Poison\Bubble,0,32,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 2, 1) - PoisonAnimation.AnimationSpawnFadingEntity(0.25, -0.25, -0.25, "Textures\Battle\Poison\Bubble,0,0,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 2, 1) + PoisonAnimation.AnimationChangeTexture(BubbleEntity1, False, TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 32, 32, 32)), 1, 1) + Dim BubbleEntity2 As Entity = PoisonAnimation.SpawnEntity(New Vector3(0.25, -0.25, 0.25), TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 0, 32, 32)), New Vector3(0.5F), 1, 1, 1) - PoisonAnimation.AnimationSpawnFadingEntity(0.25, -0.25, 0.25, "Textures\Battle\Poison\Bubble,0,64,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 3, 1) - PoisonAnimation.AnimationSpawnFadingEntity(0.25, -0.25, -0.25, "Textures\Battle\Poison\Bubble,0,32,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 3, 1) + PoisonAnimation.AnimationChangeTexture(BubbleEntity1, True, TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 64, 32, 32)), 2, 1) + PoisonAnimation.AnimationChangeTexture(BubbleEntity2, False, TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 32, 32, 32)), 2, 1) + Dim BubbleEntity3 As Entity = PoisonAnimation.SpawnEntity(New Vector3(0.25, -0.25, -0.25), TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 0, 32, 32)), New Vector3(0.5F), 1, 2, 1) + + PoisonAnimation.AnimationChangeTexture(BubbleEntity2, True, TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 64, 32, 32)), 3, 1) + PoisonAnimation.AnimationChangeTexture(BubbleEntity3, False, TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 32, 32, 32)), 3, 1) + + PoisonAnimation.AnimationChangeTexture(BubbleEntity3, True, TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 64, 32, 32)), 4, 1) - PoisonAnimation.AnimationSpawnFadingEntity(0.25, -0.25, -0.25, "Textures\Battle\Poison\Bubble,0,64,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 4, 2) BattleScreen.BattleQuery.Add(PoisonAnimation) + 'Actual damage ReduceHP(CInt(.OppPokemon.MaxHP / 8), False, False, BattleScreen, "The poison hurt " & .OppPokemon.GetDisplayName() & ".", "poison") End If @@ -6175,20 +6182,22 @@ Dim multiplier As Double = (.FieldEffects.OppPoisonCounter / 16) 'Poison animation Dim PoisonAnimation As AnimationQueryObject = New AnimationQueryObject(BattleScreen.OppPokemonNPC, False) - PoisonAnimation.PlaySound("Battle\Effects\Poisoned", 0, 0) - PoisonAnimation.AnimationSpawnFadingEntity(-0.25, -0.25, -0.25, "Textures\Battle\Poison\Bubble,0,0,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 0, 1) - PoisonAnimation.AnimationSpawnFadingEntity(-0.25, -0.25, -0.25, "Textures\Battle\Poison\Bubble,0,32,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 1, 1) - PoisonAnimation.AnimationSpawnFadingEntity(0.25, -0.25, 0.25, "Textures\Battle\Poison\Bubble,0,0,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 1, 1) + PoisonAnimation.AnimationPlaySound("Battle\Effects\Poisoned", 0, 0) + Dim BubbleEntity1 As Entity = PoisonAnimation.SpawnEntity(New Vector3(-0.25, -0.25, -0.25), TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 0, 32, 32)), New Vector3(0.5F), 1, 0, 1) - PoisonAnimation.AnimationSpawnFadingEntity(-0.25, -0.25, -0.25, "Textures\Battle\Poison\Bubble,0,64,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 2, 1) - PoisonAnimation.AnimationSpawnFadingEntity(0.25, -0.25, 0.25, "Textures\Battle\Poison\Bubble,0,32,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 2, 1) - PoisonAnimation.AnimationSpawnFadingEntity(0.25, -0.25, -0.25, "Textures\Battle\Poison\Bubble,0,0,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 2, 1) + PoisonAnimation.AnimationChangeTexture(BubbleEntity1, False, TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 32, 32, 32)), 1, 1) + Dim BubbleEntity2 As Entity = PoisonAnimation.SpawnEntity(New Vector3(0.25, -0.25, 0.25), TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 0, 32, 32)), New Vector3(0.5F), 1, 1, 1) - PoisonAnimation.AnimationSpawnFadingEntity(0.25, -0.25, 0.25, "Textures\Battle\Poison\Bubble,0,64,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 3, 1) - PoisonAnimation.AnimationSpawnFadingEntity(0.25, -0.25, -0.25, "Textures\Battle\Poison\Bubble,0,32,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 3, 1) + PoisonAnimation.AnimationChangeTexture(BubbleEntity1, True, TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 64, 32, 32)), 2, 1) + PoisonAnimation.AnimationChangeTexture(BubbleEntity2, False, TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 32, 32, 32)), 2, 1) + Dim BubbleEntity3 As Entity = PoisonAnimation.SpawnEntity(New Vector3(0.25, -0.25, -0.25), TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 0, 32, 32)), New Vector3(0.5F), 1, 2, 1) + + PoisonAnimation.AnimationChangeTexture(BubbleEntity2, True, TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 64, 32, 32)), 3, 1) + PoisonAnimation.AnimationChangeTexture(BubbleEntity3, False, TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 32, 32, 32)), 3, 1) + + PoisonAnimation.AnimationChangeTexture(BubbleEntity3, True, TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 64, 32, 32)), 4, 1) - PoisonAnimation.AnimationSpawnFadingEntity(0.25, -0.25, -0.25, "Textures\Battle\Poison\Bubble,0,64,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 4, 2) BattleScreen.BattleQuery.Add(PoisonAnimation) 'Actual damage ReduceHP(CInt(.OppPokemon.MaxHP * multiplier), False, False, BattleScreen, "The toxic hurt " & .OppPokemon.GetDisplayName() & ".", "badpoison") @@ -6206,13 +6215,13 @@ End If 'Burn animation Dim BurnAnimation As AnimationQueryObject = New AnimationQueryObject(BattleScreen.OppPokemonNPC, False) - BurnAnimation.PlaySound("Battle\Effects\Burned", 0, 0) + BurnAnimation.AnimationPlaySound("Battle\Effects\Burned", 0, 0) Dim FlameEntity As Entity = BurnAnimation.SpawnEntity(New Vector3(CSng(BattleScreen.OppPokemonNPC.Position.X - 0.25), CSng(BattleScreen.OwnPokemonNPC.Position.Y - 0.25), CSng(BattleScreen.OwnPokemonNPC.Position.Z - 0.25)), TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 0, 32, 32)), New Vector3(0.5, 0.5, 0.5), 1.0F) - BurnAnimation.ChangeEntityTexture(FlameEntity, False, TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 32, 32, 32)), 2, 1) - BurnAnimation.ChangeEntityTexture(FlameEntity, False, TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 64, 32, 32)), 3, 1) - BurnAnimation.ChangeEntityTexture(FlameEntity, False, TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 96, 32, 32)), 4, 1) - BurnAnimation.ChangeEntityTexture(FlameEntity, True, TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 128, 32, 32)), 5, 2) + BurnAnimation.AnimationChangeTexture(FlameEntity, False, TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 32, 32, 32)), 2, 1) + BurnAnimation.AnimationChangeTexture(FlameEntity, False, TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 64, 32, 32)), 3, 1) + BurnAnimation.AnimationChangeTexture(FlameEntity, False, TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 96, 32, 32)), 4, 1) + BurnAnimation.AnimationChangeTexture(FlameEntity, True, TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 128, 32, 32)), 5, 2) BattleScreen.BattleQuery.Add(BurnAnimation) 'Actual damage @@ -6783,7 +6792,7 @@ Dim BallReturn As AnimationQueryObject = New AnimationQueryObject(BattleScreen.OwnPokemonNPC, False, BattleScreen.OwnPokemonModel) ' Ball Closes - BallReturn.PlaySound("Battle\Pokeball\Open", 0, 0) + BallReturn.AnimationPlaySound("Battle\Pokeball\Open", 0, 0) Dim SmokeReturned As Integer = 0 Do Dim SmokePosition = New Vector3(CSng(Random.Next(-10, 10) / 10), CSng(Random.Next(-10, 10) / 10), CSng(Random.Next(-10, 10) / 10)) @@ -6796,19 +6805,19 @@ Dim SmokeEntity As Entity = BallReturn.SpawnEntity(SmokePosition, SmokeTexture, SmokeScale, 1.0F) - BallReturn.MoveEntity(SmokeEntity, True, SmokeDestination.X, SmokeDestination.Y, SmokeDestination.Z, SmokeSpeed, False, False, 0.0F, 0.0F) + BallReturn.AnimationMove(SmokeEntity, True, SmokeDestination.X, SmokeDestination.Y, SmokeDestination.Z, SmokeSpeed, False, False, 0.0F, 0.0F) Threading.Interlocked.Increment(SmokeReturned) Loop While SmokeReturned <= 38 ' Pokemon disappears - BallReturn.FadeEntity(Nothing, False, 1, False, 0, 1, 0) - BallReturn.MoveEntity(Nothing, False, 0, 0.5, 0, 0.5, False, False, 2, 0,,, 3) + BallReturn.AnimationFade(Nothing, False, 1, False, 0, 1, 0) + BallReturn.AnimationMove(Nothing, False, 0, 0.5, 0, 0.5, False, False, 2, 0,,, 3) ' Ball returns - BallReturn.PlaySound("Battle\Pokeball\Throw", 1, 0) + BallReturn.AnimationPlaySound("Battle\Pokeball\Throw", 1, 0) Dim BallReturnEntity As Entity = BallReturn.SpawnEntity(BattleScreen.OwnPokemonNPC.Position, TextureManager.GetTexture(BattleScreen.OwnPokemon.CatchBall.TextureSource), New Vector3(0.3F), 1.0F) - BallReturn.MoveEntity(BallReturnEntity, True, BattleScreen.OwnPokemonNPC.Position.X - 2, BattleScreen.OwnPokemonNPC.Position.Y, BattleScreen.OwnPokemonNPC.Position.Z, 0.1, False, True, 1, 0,, 0.3) + BallReturn.AnimationMove(BallReturnEntity, True, BattleScreen.OwnPokemonNPC.Position.X - 2, BattleScreen.OwnPokemonNPC.Position.Y, BattleScreen.OwnPokemonNPC.Position.Z, 0.1, False, True, 1, 0,, 0.3) BattleScreen.AddToQuery(InsertIndex, BallReturn) @@ -6847,13 +6856,13 @@ ' Ball is thrown Dim BallThrow As AnimationQueryObject = New AnimationQueryObject(BattleScreen.OwnPokemonNPC, False, BattleScreen.OwnPokemonModel) - BallThrow.PlaySound("Battle\Pokeball\Throw", 0, 0) + BallThrow.AnimationPlaySound("Battle\Pokeball\Throw", 0, 0) Dim BallThrowEntity As Entity = BallReturn.SpawnEntity(BattleScreen.OwnPokemonNPC.Position + New Vector3(-2, -0.15, 0), TextureManager.GetTexture(BattleScreen.OwnPokemon.CatchBall.TextureSource), New Vector3(0.3F), 1.0F) - BallThrow.MoveEntity(BallThrowEntity, True, BattleScreen.OwnPokemonNPC.Position.X, CSng(BattleScreen.OwnPokemonNPC.Position.Y + 0.35), BattleScreen.OwnPokemonNPC.Position.Z, 0.1, False, True, 0F, 0F,, 0.3) + BallThrow.AnimationMove(BallThrowEntity, True, BattleScreen.OwnPokemonNPC.Position.X, CSng(BattleScreen.OwnPokemonNPC.Position.Y + 0.35), BattleScreen.OwnPokemonNPC.Position.Z, 0.1, False, True, 0F, 0F,, 0.3) ' Ball Opens - BallThrow.PlaySound("Battle\Pokeball\Open", 3, 0) + BallThrow.AnimationPlaySound("Battle\Pokeball\Open", 3, 0) Dim SmokeSpawned As Integer = 0 Do @@ -6867,17 +6876,17 @@ Dim SmokeEntity As Entity = BallThrow.SpawnEntity(SmokePosition, SmokeTexture, SmokeScale, 1.0F) - BallThrow.MoveEntity(SmokeEntity, True, SmokeDestination.X, SmokeDestination.Y, SmokeDestination.Z, SmokeSpeed, False, False, 3.0F, 0.0F) + BallThrow.AnimationMove(SmokeEntity, True, SmokeDestination.X, SmokeDestination.Y, SmokeDestination.Z, SmokeSpeed, False, False, 3.0F, 0.0F) Threading.Interlocked.Increment(SmokeSpawned) Loop While SmokeSpawned <= 38 ' Pokemon appears - BallThrow.FadeEntity(Nothing, False, 1, True, 1, 4, 0) - BallThrow.PlaySound(CStr(BattleScreen.OwnPokemon.Number), 4, 0,, True) + BallThrow.AnimationFade(Nothing, False, 1, True, 1, 4, 0) + BallThrow.AnimationPlaySound(CStr(BattleScreen.OwnPokemon.Number), 4, 0,, True) ' Pokémon falls down - BallThrow.MoveEntity(Nothing, False, 0, 0, 0, 0.05F, False, False, 4, 0,,, 3) + BallThrow.AnimationMove(Nothing, False, 0, 0, 0, 0.05F, False, False, 4, 0,,, 3) BattleScreen.AddToQuery(InsertIndex, BallThrow) End If @@ -7125,8 +7134,8 @@ If BattleScreen.IsTrainerBattle = False Then ChangeCameraAngle(1, False, BattleScreen) Dim Faint As AnimationQueryObject = New AnimationQueryObject(BattleScreen.OppPokemonNPC, True, BattleScreen.OppPokemonModel) - Faint.PlaySound(CStr(BattleScreen.OppPokemon.Number), 0, 2, False, True) - Faint.MoveEntity(Nothing, False, 0, -1, 0, 0.1, False, False, 2, 0,,, 3) + Faint.AnimationPlaySound(CStr(BattleScreen.OppPokemon.Number), 0, 2, False, True) + Faint.AnimationMove(Nothing, False, 0, -1, 0, 0.1, False, False, 2, 0,,, 3) BattleScreen.BattleQuery.Add(Faint) BattleScreen.BattleQuery.Add(New ToggleEntityQueryObject(True, ToggleEntityQueryObject.BattleEntities.OppPokemon, 2, -1, -1, -1, -1)) @@ -7155,28 +7164,29 @@ Dim BallReturn As AnimationQueryObject = New AnimationQueryObject(BattleScreen.OppPokemonNPC, True, BattleScreen.OppPokemonModel) ' Ball Closes - BallReturn.PlaySound("Battle\Pokeball\Open", 0, 0) + BallReturn.AnimationPlaySound("Battle\Pokeball\Open", 0, 0) Dim SmokeReturned As Integer = 0 Do Dim SmokePosition = New Vector3(CSng(Random.Next(-10, 10) / 10), CSng(Random.Next(-10, 10) / 10), CSng(Random.Next(-10, 10) / 10)) Dim SmokeDestination = New Vector3(0, 0, 0) - Dim SmokeTexture As String = "Textures\Battle\Smoke" + Dim SmokeTexture As Texture2D = TextureManager.GetTexture("Textures\Battle\Smoke") Dim SmokeScale = New Vector3(CSng(Random.Next(2, 6) / 10)) Dim SmokeSpeed = CSng(Random.Next(1, 3) / 10.0F) - - BallReturn.AnimationSpawnMovingEntity(SmokePosition.X, SmokePosition.Y, SmokePosition.Z, SmokeTexture, SmokeScale.X, SmokeScale.Y, SmokeScale.Z, SmokeDestination.X, SmokeDestination.Y, SmokeDestination.Z, SmokeSpeed, False, False, 0.0F, 0.0F) + Dim SmokeEntity = BallReturn.SpawnEntity(SmokePosition, SmokeTexture, SmokeScale, 1) + BallReturn.AnimationMove(SmokeEntity, True, SmokeDestination.X, SmokeDestination.Y, SmokeDestination.Z, SmokeSpeed, False, False, 0.0F, 0.0F) Threading.Interlocked.Increment(SmokeReturned) Loop While SmokeReturned <= 38 ' Pokemon disappears - BallReturn.AnimationFadeEntity(Nothing, 1, False, 0, 1, 0) - BallReturn.MoveEntity(Nothing, False, 0, 0.5, 0, 0.5, False, False, 2, 0,,, 4) + BallReturn.AnimationFade(Nothing, False, 1, False, 0, 1, 0) + BallReturn.AnimationMove(Nothing, False, 0, 0.5, 0, 0.5, False, False, 2, 0,,, 4) ' Ball returns - BallReturn.PlaySound("Battle\Pokeball\Throw", 1, 0) - BallReturn.AnimationSpawnMovingEntity(0, 0, 0, BattleScreen.OppPokemon.CatchBall.TextureSource, 0.3F, 0.3F, 0.3F, -2, 0, 0, 0.1, False, True, 1, 0,, 0.3) + BallReturn.AnimationPlaySound("Battle\Pokeball\Throw", 1, 0) + Dim BallReturnEntity = BallReturn.SpawnEntity(New Vector3(0, 0, 0), TextureManager.GetTexture(BattleScreen.OppPokemon.CatchBall.TextureSource), New Vector3(0.3F), 1.0F) + BallReturn.AnimationMove(BallReturnEntity, True, -2, 0, 0, 0.1, False, True, 0F, 0F,, 0.3) BattleScreen.BattleQuery.Add(BallReturn) @@ -7216,28 +7226,29 @@ Dim BallReturn As AnimationQueryObject = New AnimationQueryObject(BattleScreen.OppPokemonNPC, True, BattleScreen.OppPokemonModel) ' Ball Closes - BallReturn.PlaySound("Battle\Pokeball\Open", 0, 0) + BallReturn.AnimationPlaySound("Battle\Pokeball\Open", 0, 0) Dim SmokeReturned As Integer = 0 Do Dim SmokePosition = New Vector3(CSng(Random.Next(-10, 10) / 10), CSng(Random.Next(-10, 10) / 10), CSng(Random.Next(-10, 10) / 10)) Dim SmokeDestination = New Vector3(0, 0, 0) - Dim SmokeTexture As String = "Textures\Battle\Smoke" + Dim SmokeTexture As Texture2D = TextureManager.GetTexture("Textures\Battle\Smoke") Dim SmokeScale = New Vector3(CSng(Random.Next(2, 6) / 10)) Dim SmokeSpeed = CSng(Random.Next(1, 3) / 10.0F) - - BallReturn.AnimationSpawnMovingEntity(SmokePosition.X, SmokePosition.Y, SmokePosition.Z, SmokeTexture, SmokeScale.X, SmokeScale.Y, SmokeScale.Z, SmokeDestination.X, SmokeDestination.Y, SmokeDestination.Z, SmokeSpeed, False, False, 0.0F, 0.0F) + Dim SmokeEntity = BallReturn.SpawnEntity(SmokePosition, SmokeTexture, SmokeScale, 1) + BallReturn.AnimationMove(SmokeEntity, True, SmokeDestination.X, SmokeDestination.Y, SmokeDestination.Z, SmokeSpeed, False, False, 0.0F, 0.0F) Threading.Interlocked.Increment(SmokeReturned) Loop While SmokeReturned <= 38 ' Pokemon disappears - BallReturn.AnimationFadeEntity(Nothing, 1, False, 0, 1, 0) - BallReturn.MoveEntity(Nothing, False, 0, 0.5, 0, 0.5, False, False, 2, 0,,, 4) + BallReturn.AnimationFade(Nothing, False, 1, False, 0, 1, 0) + BallReturn.AnimationMove(Nothing, False, 0, 0.5, 0, 0.5, False, False, 2, 0,,, 4) ' Ball returns - BallReturn.PlaySound("Battle\Pokeball\Throw", 1, 0) - BallReturn.AnimationSpawnMovingEntity(0, 0, 0, BattleScreen.OppPokemon.CatchBall.TextureSource, 0.3F, 0.3F, 0.3F, -2, 0, 0, 0.1, False, True, 1, 0,, 0.3) + BallReturn.AnimationPlaySound("Battle\Pokeball\Throw", 1, 0) + Dim BallReturnEntity = BallReturn.SpawnEntity(New Vector3(0, 0, 0), TextureManager.GetTexture(BattleScreen.OppPokemon.CatchBall.TextureSource), New Vector3(0.3F), 1.0F) + BallReturn.AnimationMove(BallReturnEntity, True, -2, 0, 0, 0.1, False, True, 0F, 0F,, 0.3) BattleScreen.BattleQuery.Add(BallReturn) @@ -7267,31 +7278,33 @@ ' Ball is thrown Dim BallThrow As AnimationQueryObject = New AnimationQueryObject(BattleScreen.OppPokemonNPC, True, BattleScreen.OppPokemonModel) - BallThrow.PlaySound("Battle\Pokeball\Throw", 0, 0) - BallThrow.AnimationSpawnMovingEntity(-2, -0.15, 0, BattleScreen.OwnPokemon.CatchBall.TextureSource, 0.3F, 0.3F, 0.3F, 0, 0.35, 0, 0.1, False, True, 0F, 0F,, 0.3) + BallThrow.AnimationPlaySound("Battle\Pokeball\Throw", 0, 0) + Dim BallThrowEntity = BallThrow.SpawnEntity(New Vector3(-2, -0.15, 0), TextureManager.GetTexture(BattleScreen.OwnPokemon.CatchBall.TextureSource), New Vector3(0.3F), 1.0F) + BallThrow.AnimationMove(BallThrowEntity, True, 0, 0.35, 0, 0.1, False, True, 0F, 0F,, 0.3) - ' Ball Opens - BallThrow.PlaySound("Battle\Pokeball\Open", 3, 0) + ' Ball opens + BallThrow.AnimationPlaySound("Battle\Pokeball\Open", 3, 0) Dim SmokeSpawned As Integer = 0 Do Dim SmokePosition = New Vector3(0, 0.35, 0) Dim SmokeDestination = New Vector3(CSng(Random.Next(-10, 10) / 10), CSng(Random.Next(-10, 10) / 10), CSng(Random.Next(-10, 10) / 10)) - Dim SmokeTexture As String = "Textures\Battle\Smoke" + Dim SmokeTexture As Texture2D = TextureManager.GetTexture("Textures\Battle\Smoke") Dim SmokeScale = New Vector3(CSng(Random.Next(2, 6) / 10)) Dim SmokeSpeed = CSng(Random.Next(1, 3) / 10.0F) + Dim SmokeEntity = BallReturn.SpawnEntity(SmokePosition, SmokeTexture, SmokeScale, 1) - BallThrow.AnimationSpawnMovingEntity(SmokePosition.X, SmokePosition.Y, SmokePosition.Z, SmokeTexture, SmokeScale.X, SmokeScale.Y, SmokeScale.Z, SmokeDestination.X, SmokeDestination.Y, SmokeDestination.Z, SmokeSpeed, False, False, 3.0F, 0.0F) + BallThrow.AnimationMove(SmokeEntity, True, SmokeDestination.X, SmokeDestination.Y, SmokeDestination.Z, SmokeSpeed, False, False, 3.0F, 0.0F) Threading.Interlocked.Increment(SmokeSpawned) Loop While SmokeSpawned <= 38 ' Pokemon appears - BallThrow.AnimationFadeEntity(Nothing, 1, True, 1, 4, 0) - BallThrow.PlaySound(CStr(BattleScreen.OppPokemon.Number), 4, 0,, True) + BallThrow.AnimationFade(Nothing, False, 1, True, 1, 4, 0) + BallThrow.AnimationPlaySound(CStr(BattleScreen.OppPokemon.Number), 4, 0,, True) ' Pokémon falls down - BallThrow.MoveEntity(Nothing, False, 0, 0, 0, 0.05F, False, False, 4, 0,,, 4) + BallThrow.AnimationMove(Nothing, False, 0, 0, 0, 0.05F, False, False, 4, 0,,, 4) BattleScreen.BattleQuery.Add(BallThrow) End If diff --git a/P3D/Battle/BattleSystemV2/QueryObjects/AnimationQueryObject.vb b/P3D/Battle/BattleSystemV2/QueryObjects/AnimationQueryObject.vb index 84eca1a23..ff0d88d2f 100644 --- a/P3D/Battle/BattleSystemV2/QueryObjects/AnimationQueryObject.vb +++ b/P3D/Battle/BattleSystemV2/QueryObjects/AnimationQueryObject.vb @@ -100,7 +100,7 @@ Public Sub RemoveEntity(Entity As Entity) SpawnedEntities.Remove(Entity) End Sub - Public Sub ChangeEntityTexture(ByVal Entity As Entity, RemoveEntityAfter As Boolean, ByVal Texture As Texture2D, ByVal startDelay As Single, ByVal endDelay As Single) + Public Sub AnimationChangeTexture(ByVal Entity As Entity, RemoveEntityAfter As Boolean, ByVal Texture As Texture2D, ByVal startDelay As Single, ByVal endDelay As Single) Dim TextureChangeEntity As Entity If Entity Is Nothing Then @@ -119,7 +119,7 @@ End If End Sub - Public Sub MoveEntity(ByVal Entity As Entity, ByVal RemoveEntityAfter As Boolean, ByVal DestinationX As Single, ByVal DestinationY As Single, ByVal DestinationZ As Single, ByVal Speed As Single, ByVal SpinX As Boolean, ByVal SpinZ As Boolean, ByVal startDelay As Single, ByVal endDelay As Single, Optional ByVal SpinXSpeed As Single = 0.1F, Optional ByVal SpinZSpeed As Single = 0.1F, Optional MovementCurve As Integer = 3) + Public Sub AnimationMove(ByVal Entity As Entity, ByVal RemoveEntityAfter As Boolean, ByVal DestinationX As Single, ByVal DestinationY As Single, ByVal DestinationZ As Single, ByVal Speed As Single, ByVal SpinX As Boolean, ByVal SpinZ As Boolean, ByVal startDelay As Single, ByVal endDelay As Single, Optional ByVal SpinXSpeed As Single = 0.1F, Optional ByVal SpinZSpeed As Single = 0.1F, Optional MovementCurve As Integer = 3) Dim MoveEntity As Entity Dim Destination As Vector3 @@ -149,12 +149,12 @@ If RemoveEntityAfter = True Then If baEntityMove.CanRemove = True Then - RemoveEntity(Entity) + RemoveEntity(MoveEntity) End If End If End Sub - Public Sub FadeEntity(ByVal Entity As Entity, ByVal RemoveEntityAfter As Boolean, ByVal TransitionSpeed As Single, ByVal FadeIn As Boolean, ByVal EndState As Single, ByVal startDelay As Single, ByVal endDelay As Single, Optional ByVal startState As Single = -1.0F) + Public Sub AnimationFade(ByVal Entity As Entity, ByVal RemoveEntityAfter As Boolean, ByVal TransitionSpeed As Single, ByVal FadeIn As Boolean, ByVal EndState As Single, ByVal startDelay As Single, ByVal endDelay As Single, Optional ByVal startState As Single = -1.0F) Dim FadeEntity As Entity If Entity Is Nothing Then FadeEntity = CurrentEntity @@ -172,11 +172,11 @@ If RemoveEntityAfter = True Then If baEntityOpacity.CanRemove = True Then - RemoveEntity(Entity) + RemoveEntity(FadeEntity) End If End If End Sub - Public Sub RotateEntity(Entity As Entity, ByVal RemoveEntityAfter As Boolean, ByVal RotationSpeedX As Single, ByVal RotationSpeedY As Single, ByVal RotationSpeedZ As Single, ByVal EndRotationX As Single, ByVal EndRotationY As Single, ByVal EndRotationZ As Single, ByVal startDelay As Single, ByVal endDelay As Single, ByVal DoXRotation As Boolean, ByVal DoYRotation As Boolean, ByVal DoZRotation As Boolean, ByVal DoReturn As Boolean) + Public Sub AnimationRotate(Entity As Entity, ByVal RemoveEntityAfter As Boolean, ByVal RotationSpeedX As Single, ByVal RotationSpeedY As Single, ByVal RotationSpeedZ As Single, ByVal EndRotationX As Single, ByVal EndRotationY As Single, ByVal EndRotationZ As Single, ByVal startDelay As Single, ByVal endDelay As Single, ByVal DoXRotation As Boolean, ByVal DoYRotation As Boolean, ByVal DoZRotation As Boolean, ByVal DoReturn As Boolean) Dim RotateEntity As Entity If Entity Is Nothing Then RotateEntity = CurrentEntity @@ -190,11 +190,11 @@ AnimationSequence.Add(baEntityRotate) If RemoveEntityAfter = True Then If baEntityRotate.CanRemove = True Then - RemoveEntity(Entity) + RemoveEntity(RotateEntity) End If End If End Sub - Public Sub ScaleEntity(ByVal Entity As Entity, ByVal RemoveEntityAfter As Boolean, ByVal Grow As Boolean, ByVal EndSizeX As Single, ByVal EndSizeY As Single, ByVal EndSizeZ As Single, ByVal SizeSpeed As Single, ByVal startDelay As Single, ByVal endDelay As Single, Optional ByVal Anchors As String = "1") + Public Sub AnimationScale(ByVal Entity As Entity, ByVal RemoveEntityAfter As Boolean, ByVal Grow As Boolean, ByVal EndSizeX As Single, ByVal EndSizeY As Single, ByVal EndSizeZ As Single, ByVal SizeSpeed As Single, ByVal startDelay As Single, ByVal endDelay As Single, Optional ByVal Anchors As String = "1") Dim ScaleEntity As Entity If Entity Is Nothing Then ScaleEntity = CurrentEntity @@ -202,89 +202,22 @@ ScaleEntity = Entity End If - Dim Position As Vector3 = ScaleEntity.Position Dim Scale As Vector3 = ScaleEntity.Scale Dim EndSize As Vector3 = New Vector3(EndSizeX, EndSizeY, EndSizeZ) Dim baBillSize As BAEntityScale = New BAEntityScale(ScaleEntity, Scale, Grow, EndSize, SizeSpeed, startDelay, endDelay, Anchors) AnimationSequence.Add(baBillSize) If RemoveEntityAfter = True Then If baBillSize.CanRemove = True Then - RemoveEntity(Entity) + RemoveEntity(ScaleEntity) End If End If End Sub - Public Sub AnimationSpawnFadingEntity(ByVal PositionX As Single, ByVal PositionY As Single, ByVal PositionZ As Single, ByVal Texture As String, ByVal ScaleX As Single, ByVal ScaleY As Single, ByVal ScaleZ As Single, ByVal TransitionSpeed As Single, ByVal FadeIn As Boolean, ByVal EndState As Single, ByVal startDelay As Single, ByVal endDelay As Single, Optional ByVal startState As Single = 1.0F) - If CurrentEntity Is Nothing Then - Logger.Log(Logger.LogTypes.Warning, "ATTEMPT TO USE AttackSpawnMovingAnimation OUTSIDE OF ATTACK ANIMATION DELEGATE") - ElseIf Not AnimationStarted Then - Logger.Log(Logger.LogTypes.Warning, "ATTEMPT TO USE AttackSpawnMovingAnimation BEFORE CALLING AnimationSequenceBegin") - Else - Dim stringArray = Texture.Split(","c) - Dim texture2D As Texture2D = Nothing - - If stringArray.Length = 1 Then - texture2D = TextureManager.GetTexture(Texture) - ElseIf stringArray.Length = 5 Then - Dim r As Rectangle = New Rectangle(CInt(stringArray(1)), CInt(stringArray(2)), CInt(stringArray(3)), CInt(stringArray(4))) - texture2D = TextureManager.GetTexture(stringArray(0), r, "") - End If - - If BattleFlipped Then - PositionX -= PositionX * 2.0F - PositionZ -= PositionZ * 2.0F - End If - - Dim Position As Vector3 = New Vector3(CurrentEntity.Position.X + PositionX, CurrentEntity.Position.Y + PositionY, CurrentEntity.Position.Z + PositionZ) - Dim Scale As Vector3 = New Vector3(ScaleX, ScaleY, ScaleZ) - - Dim baOpacity As BAOpacity = New BAOpacity(Position, texture2D, Scale, TransitionSpeed, FadeIn, EndState, startDelay, endDelay, startState) - AnimationSequence.Add(baOpacity) - End If + Public Sub AnimationPlaySound(ByVal sound As String, ByVal startDelay As Single, ByVal endDelay As Single, Optional ByVal stopMusic As Boolean = False, Optional ByVal IsPokemon As Boolean = False) + Dim baSound As BAPlaySound = New BAPlaySound(sound, startDelay, endDelay, stopMusic, IsPokemon) + AnimationSequence.Add(baSound) End Sub - Public Sub AnimationSpawnMovingEntity(ByVal PositionX As Single, ByVal PositionY As Single, ByVal PositionZ As Single, ByVal Texture As String, ByVal ScaleX As Single, ByVal ScaleY As Single, ByVal ScaleZ As Single, ByVal DestinationX As Single, ByVal DestinationY As Single, ByVal DestinationZ As Single, ByVal Speed As Single, ByVal SpinX As Boolean, ByVal SpinZ As Boolean, ByVal startDelay As Single, ByVal endDelay As Single, Optional ByVal SpinXSpeed As Single = 0.1F, Optional ByVal SpinZSpeed As Single = 0.1F, Optional MovementCurve As Integer = 3) - If CurrentEntity Is Nothing Then - Logger.Log(Logger.LogTypes.Warning, "ATTEMPT TO USE AttackSpawnMovingAnimation OUTSIDE OF ATTACK ANIMATION DELEGATE") - ElseIf Not AnimationStarted Then - Logger.Log(Logger.LogTypes.Warning, "ATTEMPT TO USE AttackSpawnMovingAnimation BEFORE CALLING AnimationSequenceBegin") - Else - Dim stringArray = Texture.Split(","c) - Dim texture2D As Texture2D = Nothing - - If stringArray.Length = 1 Then - texture2D = TextureManager.GetTexture(Texture) - ElseIf stringArray.Length = 5 Then - Dim r As Rectangle = New Rectangle(CInt(stringArray(1)), CInt(stringArray(2)), CInt(stringArray(3)), CInt(stringArray(4))) - texture2D = TextureManager.GetTexture(stringArray(0), r, "") - End If - - If BattleFlipped Then - PositionX -= PositionX * 2.0F - PositionZ -= PositionZ * 2.0F - DestinationX -= DestinationX * 2.0F - DestinationZ -= DestinationZ * 2.0F - SpinXSpeed -= SpinXSpeed * 2.0F - SpinZSpeed -= SpinZSpeed * 2.0F - End If - - Dim Position As Vector3 = New Vector3(CurrentEntity.Position.X + PositionX, CurrentEntity.Position.Y + PositionY, CurrentEntity.Position.Z + PositionZ) - Dim Scale As Vector3 = New Vector3(ScaleX, ScaleY, ScaleZ) - Dim Destination As Vector3 = New Vector3(CurrentEntity.Position.X + DestinationX, CurrentEntity.Position.Y + DestinationY, CurrentEntity.Position.Z + DestinationZ) - - Dim baMove As BAMove = New BAMove(Position, texture2D, Scale, Destination, Speed, SpinX, SpinZ, startDelay, endDelay, SpinXSpeed, SpinZSpeed, MovementCurve) - AnimationSequence.Add(baMove) - End If - End Sub - Public Sub PlaySound(ByVal sound As String, ByVal startDelay As Single, ByVal endDelay As Single, Optional ByVal stopMusic As Boolean = False, Optional ByVal IsPokemon As Boolean = False) - If CurrentEntity Is Nothing Then - Logger.Log(Logger.LogTypes.Warning, "ATTEMPT TO USE AnimationPlaySound OUTSIDE OF ATTACK ANIMATION DELEGATE") - ElseIf Not AnimationStarted Then - Logger.Log(Logger.LogTypes.Warning, "ATTEMPT TO USE AnimationPlaySound BEFORE CALLING AnimationSequenceBegin") - Else - Dim baSound As BASound = New BASound(sound, startDelay, endDelay, stopMusic, IsPokemon) - AnimationSequence.Add(baSound) - End If End Sub End Class diff --git a/P3D/P3D.vbproj b/P3D/P3D.vbproj index a3208c826..892230fc9 100644 --- a/P3D/P3D.vbproj +++ b/P3D/P3D.vbproj @@ -27551,7 +27551,7 @@ - + @@ -29229,9 +29229,6 @@ - - - diff --git a/P3D/Pokemon/Attacks/Fire/Ember.vb b/P3D/Pokemon/Attacks/Fire/Ember.vb index 03a9cfffc..1356505d9 100644 --- a/P3D/Pokemon/Attacks/Fire/Ember.vb +++ b/P3D/Pokemon/Attacks/Fire/Ember.vb @@ -65,10 +65,14 @@ Public Overrides Sub InternalUserPokemonMoveAnimation(ByVal BattleScreen As BattleScreen, ByVal own As Boolean, ByVal CurrentPokemon As Pokemon, ByVal CurrentEntity As NPC, ByVal CurrentModel As ModelEntity) Dim MoveAnimation As AnimationQueryObject = New AnimationQueryObject(CurrentEntity, own) - MoveAnimation.AnimationSpawnMovingEntity(0.0, 0, 0.0, "Textures\Battle\Fire\FireBall", 0.5, 0.5, 0.5, 2.0, 0.0, 0.0, 0.05, False, True, 0.0, 0.0,, -0.5, 0) - MoveAnimation.PlaySound("Battle\Attacks\Fire\Ember_Start", 0, 0) + Dim FireballEntity As Entity = MoveAnimation.SpawnEntity(New Vector3(0.0, 0.0, 0.0), TextureManager.GetTexture("Textures\Battle\Fire\FireBall"), New Vector3(0.5F), 1.0F) + + MoveAnimation.AnimationMove(FireballEntity, True, 2.0, 0.0, 0.0, 0.05, False, True, 0.0, 0.0,, -0.5, 0) + MoveAnimation.AnimationPlaySound("Battle\Attacks\Fire\Ember_Start", 0, 0) For i = 0 To 12 - MoveAnimation.AnimationSpawnFadingEntity(CSng(i * 0.2), 0.0, 0.0, "Textures\Battle\Fire\Smoke", 0.2, 0.2, 0.2, 0.02, False, 0.0, CSng(i * 0.2), 0.0) + Dim SmokeEntity = MoveAnimation.SpawnEntity(New Vector3(CSng(i * 0.2), 0.0, 0.0), TextureManager.GetTexture("Textures\Battle\Fire\Smoke"), New Vector3(0.2), 1) + MoveAnimation.AnimationFade(SmokeEntity, True, 0.02, False, 0.0, CSng(i * 0.2), 0.0) + i += 1 Next BattleScreen.BattleQuery.Add(MoveAnimation) @@ -76,32 +80,37 @@ Public Overrides Sub InternalOpponentPokemonMoveAnimation(ByVal BattleScreen As BattleScreen, ByVal own As Boolean, ByVal CurrentPokemon As Pokemon, ByVal CurrentEntity As NPC, ByVal CurrentModel As ModelEntity) Dim MoveAnimation As AnimationQueryObject = New AnimationQueryObject(CurrentEntity, own) + Dim FireballEntity As Entity = MoveAnimation.SpawnEntity(New Vector3(2.0, 0.0, 0.0), TextureManager.GetTexture("Textures\Battle\Fire\FireBall"), New Vector3(0.5F), 1.0F) + + MoveAnimation.AnimationMove(FireballEntity, True, 0.0, 0.0, 0.0, 0.05, False, True, 0.0, 0.0,, -0.5, 0) - MoveAnimation.AnimationSpawnMovingEntity(2.0, 0, 0.0, "Textures\Battle\Fire\FireBall", 0.5, 0.5, 0.5, 0.0, 0.0, 0.0, 0.05, False, True, 0.0, 0.0, 0.1, 0.5, 0) For i = 0 To 12 - MoveAnimation.AnimationSpawnFadingEntity(CSng(3.0 - i * 0.2), 0.0, 0.0, "Textures\Battle\Fire\Smoke", 0.2, 0.2, 0.2, 0.02, False, 0.0, CSng(i * 0.2), 0.0) + Dim SmokeEntity = MoveAnimation.SpawnEntity(New Vector3(CSng(3.0 - i * 0.2), 0.0, 0.0), TextureManager.GetTexture("Textures\Battle\Fire\Smoke"), New Vector3(0.2), 1) + MoveAnimation.AnimationFade(SmokeEntity, True, 0.02, False, 0.0, CSng(i * 0.2), 0.0) + i += 1 Next - MoveAnimation.PlaySound("Battle\Attacks\Fire\Ember_Hit", 2, 0) - MoveAnimation.AnimationSpawnFadingEntity(-0.25, -0.25, -0.25, "Textures\Battle\Fire\Ember,0,0,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 1, 1) - MoveAnimation.AnimationSpawnFadingEntity(0.25, -0.25, 0.25, "Textures\Battle\Fire\Ember,0,0,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 1, 1) - MoveAnimation.AnimationSpawnFadingEntity(0.25, -0.25, -0.25, "Textures\Battle\Fire\Ember,0,0,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 1, 1) + MoveAnimation.AnimationPlaySound("Battle\Attacks\Fire\Ember_Hit", 2, 0) - MoveAnimation.AnimationSpawnFadingEntity(-0.25, -0.25, -0.25, "Textures\Battle\Fire\Ember,0,32,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 2, 1) - MoveAnimation.AnimationSpawnFadingEntity(0.25, -0.25, 0.25, "Textures\Battle\Fire\Ember,0,32,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 2, 1) - MoveAnimation.AnimationSpawnFadingEntity(0.25, -0.25, -0.25, "Textures\Battle\Fire\Ember,0,32,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 2, 1) + Dim FireEntity1 As Entity = MoveAnimation.SpawnEntity(New Vector3(-0.25, -0.25, -0.25), TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 0, 32, 32), ""), New Vector3(0.5F), 1, 1, 1) + Dim FireEntity2 As Entity = MoveAnimation.SpawnEntity(New Vector3(0.25, -0.25, 0.25), TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 0, 32, 32), ""), New Vector3(0.5F), 1, 1, 1) + Dim FireEntity3 As Entity = MoveAnimation.SpawnEntity(New Vector3(0.25, -0.25, -0.25), TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 0, 32, 32), ""), New Vector3(0.5F), 1, 1, 1) - MoveAnimation.AnimationSpawnFadingEntity(-0.25, -0.25, -0.25, "Textures\Battle\Fire\Ember,0,64,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 3, 1) - MoveAnimation.AnimationSpawnFadingEntity(0.25, -0.25, 0.25, "Textures\Battle\Fire\Ember,0,64,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 3, 1) - MoveAnimation.AnimationSpawnFadingEntity(0.25, -0.25, -0.25, "Textures\Battle\Fire\Ember,0,64,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 3, 1) + MoveAnimation.AnimationChangeTexture(FireEntity1, False, TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 32, 32, 32)), 2, 1) + MoveAnimation.AnimationChangeTexture(FireEntity2, False, TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 32, 32, 32)), 2, 1) + MoveAnimation.AnimationChangeTexture(FireEntity3, False, TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 32, 32, 32)), 2, 1) - MoveAnimation.AnimationSpawnFadingEntity(-0.25, -0.25, -0.25, "Textures\Battle\Fire\Ember,0,96,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 4, 1) - MoveAnimation.AnimationSpawnFadingEntity(0.25, -0.25, 0.25, "Textures\Battle\Fire\Ember,0,96,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 4, 1) - MoveAnimation.AnimationSpawnFadingEntity(0.25, -0.25, -0.25, "Textures\Battle\Fire\Ember,0,96,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 4, 1) + MoveAnimation.AnimationChangeTexture(FireEntity1, False, TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 64, 32, 32)), 3, 1) + MoveAnimation.AnimationChangeTexture(FireEntity2, False, TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 64, 32, 32)), 3, 1) + MoveAnimation.AnimationChangeTexture(FireEntity3, False, TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 64, 32, 32)), 3, 1) - MoveAnimation.AnimationSpawnFadingEntity(-0.25, -0.25, -0.25, "Textures\Battle\Fire\Ember,0,128,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 5, 1) - MoveAnimation.AnimationSpawnFadingEntity(0.25, -0.25, 0.25, "Textures\Battle\Fire\Ember,0,128,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 5, 1) - MoveAnimation.AnimationSpawnFadingEntity(0.25, -0.25, -0.25, "Textures\Battle\Fire\Ember,0,128,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 5, 1) + MoveAnimation.AnimationChangeTexture(FireEntity1, False, TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 96, 32, 32)), 4, 1) + MoveAnimation.AnimationChangeTexture(FireEntity2, False, TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 96, 32, 32)), 4, 1) + MoveAnimation.AnimationChangeTexture(FireEntity3, False, TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 96, 32, 32)), 4, 1) + + MoveAnimation.AnimationChangeTexture(FireEntity1, True, TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 128, 32, 32)), 5, 1) + MoveAnimation.AnimationChangeTexture(FireEntity2, True, TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 128, 32, 32)), 5, 1) + MoveAnimation.AnimationChangeTexture(FireEntity3, True, TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 128, 32, 32)), 5, 1) BattleScreen.BattleQuery.Add(MoveAnimation) End Sub diff --git a/P3D/Pokemon/Attacks/Grass/Absorb.vb b/P3D/Pokemon/Attacks/Grass/Absorb.vb index 6b8075175..9590c3d18 100644 --- a/P3D/Pokemon/Attacks/Grass/Absorb.vb +++ b/P3D/Pokemon/Attacks/Grass/Absorb.vb @@ -96,11 +96,13 @@ Dim MoveAnimation As AnimationQueryObject = New AnimationQueryObject(CurrentEntity, own) Dim maxAmount As Integer = 8 Dim currentAmount As Integer = 0 - MoveAnimation.PlaySound("Battle\Attacks\Grass\Absorb", 0, 0) + MoveAnimation.AnimationPlaySound("Battle\Attacks\Grass\Absorb", 0, 0) While currentAmount <= maxAmount Dim yPos As Single = CSng(Random.NextDouble() * 0.5) Dim zPos As Single = CSng(Random.Next(-5, 5) * 0.15) - MoveAnimation.AnimationSpawnMovingEntity(0.0, 0, 0.0, "Textures\Battle\Grass\Absorb", 0.35, 0.35, 0.35, 1.5, yPos, zPos, 0.03, False, True, CSng(currentAmount), 0.0, 0.1, 0.5) + Dim AbsorbEntity = MoveAnimation.SpawnEntity(New Vector3(0.0, 0.0, 0.0), TextureManager.GetTexture("Textures\Battle\Grass\Absorb"), New Vector3(0.35F), 1) + MoveAnimation.AnimationMove(AbsorbEntity, True, 1.5, yPos, zPos, 0.03, False, True, CSng(currentAmount), 0.0, 0.1, 0.5) + Threading.Interlocked.Increment(currentAmount) End While diff --git a/P3D/Pokemon/Attacks/Normal/Growl.vb b/P3D/Pokemon/Attacks/Normal/Growl.vb index e01dafc73..369515629 100644 --- a/P3D/Pokemon/Attacks/Normal/Growl.vb +++ b/P3D/Pokemon/Attacks/Normal/Growl.vb @@ -64,11 +64,14 @@ Public Overrides Sub InternalUserPokemonMoveAnimation(ByVal BattleScreen As BattleScreen, ByVal own As Boolean, ByVal CurrentPokemon As Pokemon, ByVal CurrentEntity As NPC, ByVal CurrentModel As ModelEntity) Dim MoveAnimation As AnimationQueryObject = New AnimationQueryObject(CurrentEntity, own) - MoveAnimation.PlaySound(CStr(CurrentPokemon.Number), 0, 0,, True) - MoveAnimation.AnimationSpawnFadingEntity(0.25, -0.25, -0.25, "Textures\Battle\Normal\Growl,0,0,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 0, 1) - MoveAnimation.AnimationSpawnFadingEntity(0.25, -0.25, -0.25, "Textures\Battle\Normal\Growl,0,32,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 1, 1) - MoveAnimation.AnimationSpawnFadingEntity(0.25, -0.25, -0.25, "Textures\Battle\Normal\Growl,0,0,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 2, 1) - MoveAnimation.AnimationSpawnFadingEntity(0.25, -0.25, -0.25, "Textures\Battle\Normal\Growl,0,32,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 3, 1) + + MoveAnimation.AnimationPlaySound(CStr(CurrentPokemon.Number), 0, 0,, True) + Dim SoundwaveEntity = MoveAnimation.SpawnEntity(New Vector3(0.25, -0.25, -0.25), TextureManager.GetTexture("Textures\Battle\Normal\Growl", New Rectangle(0, 0, 32, 32), ""), New Vector3(0.5F), 1, 0, 1) + + MoveAnimation.AnimationChangeTexture(SoundwaveEntity, False, TextureManager.GetTexture("Textures\Battle\Normal\Growl", New Rectangle(0, 32, 32, 32), ""), 1, 1) + MoveAnimation.AnimationChangeTexture(SoundwaveEntity, False, TextureManager.GetTexture("Textures\Battle\Normal\Growl", New Rectangle(0, 0, 32, 32), ""), 2, 1) + MoveAnimation.AnimationChangeTexture(SoundwaveEntity, True, TextureManager.GetTexture("Textures\Battle\Normal\Growl", New Rectangle(0, 32, 32, 32), ""), 3, 1) + BattleScreen.BattleQuery.Add(MoveAnimation) End Sub End Class diff --git a/P3D/Pokemon/Attacks/Normal/Pound.vb b/P3D/Pokemon/Attacks/Normal/Pound.vb index 5cf85b3e2..d14a3c279 100644 --- a/P3D/Pokemon/Attacks/Normal/Pound.vb +++ b/P3D/Pokemon/Attacks/Normal/Pound.vb @@ -57,8 +57,9 @@ Public Overrides Sub InternalOpponentPokemonMoveAnimation(ByVal BattleScreen As BattleScreen, ByVal own As Boolean, ByVal CurrentPokemon As Pokemon, ByVal CurrentEntity As NPC, ByVal CurrentModel As ModelEntity) Dim MoveAnimation As AnimationQueryObject = New AnimationQueryObject(CurrentEntity, own) - MoveAnimation.PlaySound("Battle\Attacks\Pound", 0.5, 2.5) - MoveAnimation.AnimationSpawnFadingEntity(0, -0.25, 0, "Textures\Battle\Normal\Pound", 0.5, 0.5, 0.5, 0.02, False, 1.0, 0, 3) + MoveAnimation.AnimationPlaySound("Battle\Attacks\Pound", 0.5, 2.5) + Dim PoundEntity = MoveAnimation.SpawnEntity(New Vector3(0.25, -0.25, -0.25), TextureManager.GetTexture("Textures\Battle\Normal\Growl", New Rectangle(0, 0, 32, 32), ""), New Vector3(0.5F), 1, 0, 3) + MoveAnimation.AnimationFade(PoundEntity, True, 1.0F, False, 0.0F, 3, 0) BattleScreen.BattleQuery.Add(MoveAnimation) End Sub diff --git a/P3D/Pokemon/Attacks/Normal/Tackle.vb b/P3D/Pokemon/Attacks/Normal/Tackle.vb index 99e61e709..668b4b545 100644 --- a/P3D/Pokemon/Attacks/Normal/Tackle.vb +++ b/P3D/Pokemon/Attacks/Normal/Tackle.vb @@ -54,16 +54,16 @@ Public Overrides Sub InternalUserPokemonMoveAnimation(ByVal BattleScreen As BattleScreen, ByVal own As Boolean, ByVal CurrentPokemon As Pokemon, ByVal CurrentEntity As NPC, ByVal CurrentModel As ModelEntity) Dim MoveAnimation As AnimationQueryObject = New AnimationQueryObject(CurrentEntity, own, CurrentModel) - MoveAnimation.MoveEntity(Nothing, False, 0.5, 0, 0, 0.3, False, False, 0, 0,,, 2) - MoveAnimation.MoveEntity(Nothing, False, 0, 0, 0, 0.3, False, False, 1, 0,,, 2) + MoveAnimation.AnimationMove(Nothing, False, 0.5, 0, 0, 0.3, False, False, 0, 0,,, 2) + MoveAnimation.AnimationMove(Nothing, False, 0, 0, 0, 0.3, False, False, 1, 0,,, 2) BattleScreen.BattleQuery.Add(MoveAnimation) End Sub Public Overrides Sub InternalOpponentPokemonMoveAnimation(ByVal BattleScreen As BattleScreen, ByVal own As Boolean, ByVal CurrentPokemon As Pokemon, ByVal CurrentEntity As NPC, ByVal CurrentModel As ModelEntity) Dim MoveAnimation As AnimationQueryObject = New AnimationQueryObject(CurrentEntity, own) - MoveAnimation.PlaySound("Battle\Attacks\Normal\Tackle", 0, 2) + MoveAnimation.AnimationPlaySound("Battle\Attacks\Normal\Tackle", 0, 2) Dim SpawnEntity = MoveAnimation.SpawnEntity(New Vector3(0, -0.25, 0), TextureManager.GetTexture("Textures\Battle\Normal\Tackle"), New Vector3(1.0F), 1.0F) - MoveAnimation.FadeEntity(SpawnEntity, True, 0.02, False, 1.0F, 0, 2) + MoveAnimation.AnimationFade(SpawnEntity, True, 0.02, False, 1.0F, 0, 2) BattleScreen.BattleQuery.Add(MoveAnimation) End Sub End Class diff --git a/P3D/Pokemon/Attacks/Poison/PoisonSting.vb b/P3D/Pokemon/Attacks/Poison/PoisonSting.vb index 3cc76f0a4..fa0fb7abe 100644 --- a/P3D/Pokemon/Attacks/Poison/PoisonSting.vb +++ b/P3D/Pokemon/Attacks/Poison/PoisonSting.vb @@ -69,8 +69,8 @@ Dim MoveAnimation As AnimationQueryObject = New AnimationQueryObject(CurrentEntity, own) Dim StingerEntity As Entity = MoveAnimation.SpawnEntity(CurrentEntity.Position, TextureManager.GetTexture("Textures\Battle\Poison\Stinger"), New Vector3(0.5F), 1.0F) - MoveAnimation.PlaySound("Battle\Attacks\Poison\PoisonSting_Start", 0, 0) - MoveAnimation.MoveEntity(StingerEntity, True, 2.0, 0.0, 0.0, 0.05, False, False, 0.0, 0.0,,, 0) + MoveAnimation.AnimationPlaySound("Battle\Attacks\Poison\PoisonSting_Start", 0, 0) + MoveAnimation.AnimationMove(StingerEntity, True, 2.0, 0.0, 0.0, 0.05, False, False, 0.0, 0.0,,, 0) BattleScreen.BattleQuery.Add(MoveAnimation) End Sub @@ -80,25 +80,25 @@ Dim StingerEntity As Entity = MoveAnimation.SpawnEntity(New Vector3(2.0, 0, 0.0), TextureManager.GetTexture("Textures\Battle\Poison\Stinger"), New Vector3(0.5F), 1) - MoveAnimation.MoveEntity(StingerEntity, True, 0.0, 0.0, 0.0, 0.05, False, False, 0.0, 0.0,,, 0) + MoveAnimation.AnimationMove(StingerEntity, True, 0.0, 0.0, 0.0, 0.05, False, False, 0.0, 0.0,,, 0) - MoveAnimation.PlaySound("Battle\Attacks\Poison\PoisonSting_Hit", 1, 0) + MoveAnimation.AnimationPlaySound("Battle\Attacks\Poison\PoisonSting_Hit", 1, 0) Dim BubbleEntity1 As Entity = MoveAnimation.SpawnEntity(New Vector3(-0.25, -0.25, -0.25), TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 0, 32, 32)), New Vector3(0.5F), 1, 1, 1) - MoveAnimation.ChangeEntityTexture(BubbleEntity1, False, TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 32, 32, 32)), 2, 1) + MoveAnimation.AnimationChangeTexture(BubbleEntity1, False, TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 32, 32, 32)), 2, 1) Dim BubbleEntity2 As Entity = MoveAnimation.SpawnEntity(New Vector3(0.25, -0.25, 0.25), TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 0, 32, 32)), New Vector3(0.5F), 1, 2, 1) - MoveAnimation.ChangeEntityTexture(BubbleEntity1, True, TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 64, 32, 32)), 3, 1) - MoveAnimation.ChangeEntityTexture(BubbleEntity2, False, TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 32, 32, 32)), 3, 1) + MoveAnimation.AnimationChangeTexture(BubbleEntity1, True, TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 64, 32, 32)), 3, 1) + MoveAnimation.AnimationChangeTexture(BubbleEntity2, False, TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 32, 32, 32)), 3, 1) Dim BubbleEntity3 As Entity = MoveAnimation.SpawnEntity(New Vector3(0.25, -0.25, -0.25), TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 0, 32, 32)), New Vector3(0.5F), 1, 3, 1) - MoveAnimation.ChangeEntityTexture(BubbleEntity2, True, TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 64, 32, 32)), 4, 1) - MoveAnimation.ChangeEntityTexture(BubbleEntity3, False, TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 32, 32, 32)), 4, 1) + MoveAnimation.AnimationChangeTexture(BubbleEntity2, True, TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 64, 32, 32)), 4, 1) + MoveAnimation.AnimationChangeTexture(BubbleEntity3, False, TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 32, 32, 32)), 4, 1) - MoveAnimation.ChangeEntityTexture(BubbleEntity3, True, TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 64, 32, 32)), 5, 1) + MoveAnimation.AnimationChangeTexture(BubbleEntity3, True, TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 64, 32, 32)), 5, 1) BattleScreen.BattleQuery.Add(MoveAnimation) End Sub diff --git a/P3D/Screens/Battle/BattleCatchScreen.vb b/P3D/Screens/Battle/BattleCatchScreen.vb index 75ea37b7a..9de11a298 100644 --- a/P3D/Screens/Battle/BattleCatchScreen.vb +++ b/P3D/Screens/Battle/BattleCatchScreen.vb @@ -258,7 +258,7 @@ Select Case Me.AnimationIndex Case 0 PokemonScale = BattleScreen.OppPokemonNPC.Scale - Animations.MoveEntity(BallEntity, False, BattleScreen.OppPokemonNPC.Position.X - 0.05F, 0.0F, BattleScreen.OppPokemonNPC.Position.Z, 0.1, False, True, 0F, 0F,, 0.3) + Animations.AnimationMove(BallEntity, False, BattleScreen.OppPokemonNPC.Position.X - 0.05F, 0.0F, BattleScreen.OppPokemonNPC.Position.Z, 0.1, False, True, 0F, 0F,, 0.3) Case 1 Dim SmokeParticles As Integer = 0 Do @@ -272,31 +272,31 @@ Dim SmokeEntity As Entity = Animations.SpawnEntity(SmokePosition, SmokeTexture, SmokeScale, 1.0F) - Animations.MoveEntity(SmokeEntity, True, SmokeDestination.X, SmokeDestination.Y, SmokeDestination.Z, SmokeSpeed, False, False, 0.0F, 0.0F) + Animations.AnimationMove(SmokeEntity, True, SmokeDestination.X, SmokeDestination.Y, SmokeDestination.Z, SmokeSpeed, False, False, 0.0F, 0.0F) Threading.Interlocked.Increment(SmokeParticles) Loop While SmokeParticles <= 38 - Animations.MoveEntity(BallEntity, False, BattleScreen.OppPokemonNPC.Position.X, BattleScreen.OwnPokemonNPC.Position.Y, BattleScreen.OppPokemonNPC.Position.Z, 0.01F, False, False, 0.0F, 6.0F,,, 3) + Animations.AnimationMove(BallEntity, False, BattleScreen.OppPokemonNPC.Position.X, BattleScreen.OwnPokemonNPC.Position.Y, BattleScreen.OppPokemonNPC.Position.Z, 0.01F, False, False, 0.0F, 6.0F,,, 3) - Animations.ScaleEntity(Nothing, False, False, 0.05F, 0.05F, 0.05F, 0.02F, 0.0F, 0.0F, "1") - Animations.FadeEntity(Nothing, False, 1, False, 0.0F, 0.0F, 0.0F) + Animations.AnimationScale(Nothing, False, False, 0.05F, 0.05F, 0.05F, 0.02F, 0.0F, 0.0F, "1") + Animations.AnimationFade(Nothing, False, 1, False, 0.0F, 0.0F, 0.0F) Case 2 - Animations.MoveEntity(BallEntity, False, BattleScreen.OppPokemonNPC.Position.X, BattleScreen.OwnPokemonNPC.Position.Y - 0.35F, BattleScreen.OppPokemonNPC.Position.Z, 0.02F, False, False, 0.0F, 6.0F,,, 3) + Animations.AnimationMove(BallEntity, False, BattleScreen.OppPokemonNPC.Position.X, BattleScreen.OwnPokemonNPC.Position.Y - 0.35F, BattleScreen.OppPokemonNPC.Position.Z, 0.02F, False, False, 0.0F, 6.0F,,, 3) Case 3, 5 - Animations.RotateEntity(BallEntity, False, 0, 0, 0.05F, 0, 0, 1.0F, 0.0F, 4.0F, False, False, True, True) + Animations.AnimationRotate(BallEntity, False, 0, 0, 0.05F, 0, 0, 1.0F, 0.0F, 4.0F, False, False, True, True) Case 4, 6 - Animations.RotateEntity(BallEntity, False, 0, 0, -0.05F, 0, 0, -1.0F, 0.0F, 4.0F, False, False, True, True) + Animations.AnimationRotate(BallEntity, False, 0, 0, -0.05F, 0, 0, -1.0F, 0.0F, 4.0F, False, False, True, True) Case 7 ' Catch Animation For i = 0 To 2 Dim StarPosition As Vector3 = New Vector3(BattleScreen.OppPokemonNPC.Position.X - 0.05F, -0.35F, BattleScreen.OppPokemonNPC.Position.Z) Dim StarDestination As Vector3 = New Vector3(StarPosition.X, StarPosition.Y + 0.4F, StarPosition.Z - ((1 - i) * 0.4F)) Dim StarEntity As Entity = Animations.SpawnEntity(StarPosition, TextureManager.GetTexture("Textures\Battle\BallCatchStar"), New Vector3(0.1F), 1.0F) - Animations.MoveEntity(StarEntity, True, StarDestination.X, StarDestination.Y, StarDestination.Z, 0.01F, False, False, 0.0F, 0.0F,,, 3) + Animations.AnimationMove(StarEntity, True, StarDestination.X, StarDestination.Y, StarDestination.Z, 0.01F, False, False, 0.0F, 0.0F,,, 3) Next - Animations.MoveEntity(BallEntity, False, BattleScreen.OppPokemonNPC.Position.X, BattleScreen.OwnPokemonNPC.Position.Y - 0.35F, BattleScreen.OppPokemonNPC.Position.Z, 0.02F, False, False, 0.0F, 6.0F,,, 3) + Animations.AnimationMove(BallEntity, False, BattleScreen.OppPokemonNPC.Position.X, BattleScreen.OwnPokemonNPC.Position.Y - 0.35F, BattleScreen.OppPokemonNPC.Position.Z, 0.02F, False, False, 0.0F, 6.0F,,, 3) Case 8 - Animations.FadeEntity(BallEntity, True, 0.01F, False, 0.0F, 0.0F, 0.0F) + Animations.AnimationFade(BallEntity, True, 0.01F, False, 0.0F, 0.0F, 0.0F) Case 21 ' Break Animation ' Ball Opens Dim SmokeParticles As Integer = 0 @@ -311,14 +311,14 @@ Dim SmokeEntity As Entity = Animations.SpawnEntity(SmokePosition, SmokeTexture, SmokeScale, 1.0F) - Animations.MoveEntity(SmokeEntity, True, SmokeDestination.X, SmokeDestination.Y, SmokeDestination.Z, SmokeSpeed, False, False, 0.0F, 0.0F) + Animations.AnimationMove(SmokeEntity, True, SmokeDestination.X, SmokeDestination.Y, SmokeDestination.Z, SmokeSpeed, False, False, 0.0F, 0.0F) Threading.Interlocked.Increment(SmokeParticles) Loop While SmokeParticles <= 38 ' Pokemon appears - Animations.FadeEntity(Nothing, False, 1, False, 1, 0.0F, 0.0F) - Animations.ScaleEntity(Nothing, False, True, PokemonScale.X, PokemonScale.Y, PokemonScale.Z, 0.02F, 0.0F, 0.0F, "1") + Animations.AnimationFade(Nothing, False, 1, False, 1, 0.0F, 0.0F) + Animations.AnimationScale(Nothing, False, True, PokemonScale.X, PokemonScale.Y, PokemonScale.Z, 0.02F, 0.0F, 0.0F, "1") End Select End Sub From 673178616f721e46739d09e81846981788c5693d Mon Sep 17 00:00:00 2001 From: JappaWakka Date: Thu, 21 Oct 2021 20:44:38 +0200 Subject: [PATCH 07/57] =?UTF-8?q?Added=20Battle=20Animation=20type=20Backg?= =?UTF-8?q?round=20to=20temporarily=20draw=20a=20texture=20to=20the=20scre?= =?UTF-8?q?en=20behind=20the=20Pok=C3=A9mon=20but=20in=20front=20of=20the?= =?UTF-8?q?=20world?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- P3D/Battle/BattleAnimations/BABackground.vb | 60 +++++++++++++++++ .../BattleAnimations/BattleAnimation3D.vb | 1 + P3D/Battle/BattleSystemV2/BattleScreen.vb | 65 ++++++++++++++++++- .../QueryObjects/AnimationQueryObject.vb | 19 +++++- P3D/P3D.vbproj | 1 + 5 files changed, 142 insertions(+), 4 deletions(-) create mode 100644 P3D/Battle/BattleAnimations/BABackground.vb diff --git a/P3D/Battle/BattleAnimations/BABackground.vb b/P3D/Battle/BattleAnimations/BABackground.vb new file mode 100644 index 000000000..929acc114 --- /dev/null +++ b/P3D/Battle/BattleAnimations/BABackground.vb @@ -0,0 +1,60 @@ +Public Class BABackground + + Inherits BattleAnimation3D + + Public TransitionSpeed As Single = 0.01F + Public FadeIn As Boolean = False + Public FadeOut As Boolean = False + Public BackgroundOpacity As Single = 1.0F + Public EndState As Single = 0.0F + Public Texture As Texture2D + + Public Sub New(ByVal Texture As Texture2D, ByVal TransitionSpeed As Single, ByVal FadeIn As Boolean, FadeOut As Boolean, ByVal EndState As Single, ByVal startDelay As Single, ByVal endDelay As Single, Optional ByVal StartState As Single = 0.0F) + MyBase.New(New Vector3(0.0F), TextureManager.DefaultTexture, New Vector3(1.0F), startDelay, endDelay) + Me.Texture = Texture + Me.EndState = EndState + Me.FadeIn = FadeIn + Me.FadeOut = FadeOut + Me.TransitionSpeed = TransitionSpeed + + Me.BackgroundOpacity = StartState + Me.Visible = False + + Me.AnimationType = AnimationTypes.Background + End Sub + + Public Overrides Sub Render() + If startDelay = 0.0F AndAlso Me.BackgroundOpacity > 0.0F Then + Core.SpriteBatch.Draw(Me.Texture, New Rectangle(0, 0, windowSize.Width, windowSize.Height), New Color(255, 255, 255, CInt(255 * Me.BackgroundOpacity))) + End If + End Sub + + Public Overrides Sub DoActionActive() + If Me.FadeIn = True Then + If Me.EndState > Me.BackgroundOpacity Then + Me.BackgroundOpacity += Me.TransitionSpeed + If Me.BackgroundOpacity >= Me.EndState Then + Me.BackgroundOpacity = Me.EndState + Me.FadeIn = False + Me.EndState = 0 + End If + End If + Else + If Me.FadeOut = True Then + If Me.EndState < Me.BackgroundOpacity Then + Me.BackgroundOpacity -= Me.TransitionSpeed + If Me.BackgroundOpacity <= Me.EndState Then + Me.BackgroundOpacity = Me.EndState + End If + End If + If Me.BackgroundOpacity = Me.EndState Then + Me.Ready = True + End If + Else + Me.BackgroundOpacity = Me.EndState + Me.Ready = True + End If + End If + End Sub + +End Class \ No newline at end of file diff --git a/P3D/Battle/BattleAnimations/BattleAnimation3D.vb b/P3D/Battle/BattleAnimations/BattleAnimation3D.vb index 1aeb45e27..8011ce1d2 100644 --- a/P3D/Battle/BattleAnimations/BattleAnimation3D.vb +++ b/P3D/Battle/BattleAnimations/BattleAnimation3D.vb @@ -17,6 +17,7 @@ Wait ViewPokeBill Sound + Background End Enum Public AnimationType As AnimationTypes = AnimationTypes.Nothing diff --git a/P3D/Battle/BattleSystemV2/BattleScreen.vb b/P3D/Battle/BattleSystemV2/BattleScreen.vb index 4cc142822..a4dcf7821 100644 --- a/P3D/Battle/BattleSystemV2/BattleScreen.vb +++ b/P3D/Battle/BattleSystemV2/BattleScreen.vb @@ -768,7 +768,33 @@ Public Overrides Sub Draw() SkyDome.Draw(45.0F) + + Dim ForegroundEntities As New List(Of Entity) + For Each e As Entity In Level.Entities + If e Is OwnPokemonNPC Then + ForegroundEntities.Add(e) + End If + If e Is OppPokemonNPC Then + ForegroundEntities.Add(e) + End If + If e Is OwnTrainerNPC Then + ForegroundEntities.Add(e) + End If + If e Is OppTrainerNPC Then + ForegroundEntities.Add(e) + End If + If e Is OwnPokemonModel Then + ForegroundEntities.Add(e) + End If + If e Is OppPokemonModel Then + ForegroundEntities.Add(e) + End If + Next + If ForegroundEntities.Count > 0 Then + ForegroundEntities = (From f In ForegroundEntities Order By f.CameraDistance Descending).ToList() + End If Level.Draw() + World.DrawWeather(Screen.Level.World.CurrentMapWeather) If HasToWaitPVP() = True Then @@ -781,13 +807,25 @@ End If End If + Dim ForegroundAnimationList As New List(Of AnimationQueryObject) If BattleQuery.Count > 0 Then Dim cIndex As Integer = 0 Dim cQuery As New List(Of QueryObject) nextIndex: If BattleQuery.Count > cIndex Then Dim cQueryObject As QueryObject = BattleQuery(cIndex) - cQuery.Add(cQueryObject) + If cQueryObject.QueryType = QueryObject.QueryTypes.MoveAnimation Then + If CType(cQueryObject, AnimationQueryObject).DrawBeforeEntities = False Then + cQuery.Add(cQueryObject) + Else + ForegroundAnimationList.Add(CType(cQueryObject, AnimationQueryObject)) + cIndex += 1 + GoTo nextIndex + End If + Else + cQuery.Add(cQueryObject) + End If + If cQueryObject.PassThis = True Then cIndex += 1 @@ -802,6 +840,31 @@ nextIndex: Next End If + If ForegroundAnimationList.Count > 0 Then + For i = 0 To ForegroundEntities.Count - 1 + ForegroundEntities(i).Render() + DebugDisplay.MaxVertices += ForegroundEntities(i).VertexCount + Next + + Dim cIndex As Integer = 0 + Dim cQuery As New List(Of QueryObject) +nextIndexForeground: + If ForegroundAnimationList.Count > cIndex Then + Dim cQueryObject As QueryObject = ForegroundAnimationList(cIndex) + cQuery.Add(cQueryObject) + + If cQueryObject.PassThis = True Then + cIndex += 1 + GoTo nextIndexForeground + End If + End If + + cQuery.Reverse() + + For Each cQueryObject As QueryObject In cQuery + cQueryObject.Draw(Me) + Next + End If 'Core.SpriteBatch.DrawString(FontManager.MiniFont, "Battle system not final!", New Vector2(0, Core.windowSize.Height - 20), Color.White) TextBox.Draw() diff --git a/P3D/Battle/BattleSystemV2/QueryObjects/AnimationQueryObject.vb b/P3D/Battle/BattleSystemV2/QueryObjects/AnimationQueryObject.vb index ff0d88d2f..fba7a46b3 100644 --- a/P3D/Battle/BattleSystemV2/QueryObjects/AnimationQueryObject.vb +++ b/P3D/Battle/BattleSystemV2/QueryObjects/AnimationQueryObject.vb @@ -10,6 +10,7 @@ Public SpawnedEntities As List(Of Entity) Public CurrentEntity As Entity Public CurrentModel As ModelEntity + Public DrawBeforeEntities As Boolean Public Overrides ReadOnly Property IsReady As Boolean Get @@ -17,9 +18,10 @@ End Get End Property - Public Sub New(ByVal entity As Entity, ByVal BattleFlipped As Boolean, Optional ByVal model As ModelEntity = Nothing) + Public Sub New(ByVal entity As Entity, ByVal BattleFlipped As Boolean, Optional ByVal model As ModelEntity = Nothing, Optional DrawBeforeEntities As Boolean = False) MyBase.New(QueryTypes.MoveAnimation) Me.AnimationSequence = New List(Of BattleAnimation3D) + Me.DrawBeforeEntities = DrawBeforeEntities If BattleFlipped <> Nothing Then Me.BattleFlipped = BattleFlipped End If @@ -28,14 +30,22 @@ AnimationSequenceBegin() End Sub Public Overrides Sub Draw(ByVal BV2Screen As BattleScreen) + Dim Backgrounds As New List(Of Entity) + Dim RenderObjects As New List(Of Entity) For Each a As BattleAnimation3D In Me.AnimationSequence - RenderObjects.Add(a) + If a.AnimationType = BattleAnimation3D.AnimationTypes.Background Then + Backgrounds.Add(a) + Else + RenderObjects.Add(a) + End If Next If RenderObjects.Count > 0 Then RenderObjects = (From r In RenderObjects Order By r.CameraDistance Descending).ToList() End If - + For Each [Object] As Entity In Backgrounds + [Object].Render() + Next For Each [Object] As Entity In RenderObjects [Object].Render() Next @@ -218,6 +228,9 @@ AnimationSequence.Add(baSound) End Sub + Public Sub AnimationBackground(Texture As Texture2D, ByVal RemoveEntityAfter As Boolean, ByVal TransitionSpeed As Single, ByVal FadeIn As Boolean, ByVal FadeOut As Boolean, ByVal EndState As Single, ByVal startDelay As Single, ByVal endDelay As Single, Optional ByVal startState As Single = 0.0F) + Dim baBackground As BABackground = New BABackground(Texture, TransitionSpeed, FadeIn, FadeOut, EndState, startDelay, endDelay, startState) + AnimationSequence.Add(baBackground) End Sub End Class diff --git a/P3D/P3D.vbproj b/P3D/P3D.vbproj index 892230fc9..28784aeb7 100644 --- a/P3D/P3D.vbproj +++ b/P3D/P3D.vbproj @@ -27546,6 +27546,7 @@ PreserveNewest + From 758154551bde1e99a56e36eeae2e4fd9a13dac80 Mon Sep 17 00:00:00 2001 From: JappaWakkaP3D <66885565+JappaWakkaP3D@users.noreply.github.com> Date: Sun, 22 Aug 2021 20:17:36 +0200 Subject: [PATCH 08/57] Battle Animations 22-08-2021 Made the Battle Animation implementation functional Added animations for: Stats Increasing Stats Decreasing Status Effects - Poisoned - Burned Attacks - Ember - Growl - Pound - Tackle - Poison Sting --- P3D/Battle/BattleSystemV2/Battle.vb | 1112 ++++++++++----------- P3D/Pokemon/Attacks/Fire/Ember.vb | 51 +- P3D/Pokemon/Attacks/Normal/Growl.vb | 11 +- P3D/Pokemon/Attacks/Normal/Pound.vb | 5 +- P3D/Pokemon/Attacks/Normal/Tackle.vb | 9 +- P3D/Pokemon/Attacks/Poison/PoisonSting.vb | 34 +- 6 files changed, 582 insertions(+), 640 deletions(-) diff --git a/P3D/Battle/BattleSystemV2/Battle.vb b/P3D/Battle/BattleSystemV2/Battle.vb index 058885f11..2b322aaa2 100644 --- a/P3D/Battle/BattleSystemV2/Battle.vb +++ b/P3D/Battle/BattleSystemV2/Battle.vb @@ -2707,13 +2707,12 @@ 'Burn animation Dim BurnAnimation As AnimationQueryObject = New AnimationQueryObject(pNPC, own) BurnAnimation.AnimationPlaySound("Battle\Effects\Burned", 0, 0) - Dim FlameEntity As Entity = BurnAnimation.SpawnEntity(New Vector3(CSng(pNPC.Position.X - 0.25), CSng(pNPC.Position.Y - 0.25), CSng(pNPC.Position.Z - 0.25)), TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 0, 32, 32)), New Vector3(0.5, 0.5, 0.5), 1.0F) - BurnAnimation.AnimationChangeTexture(FlameEntity, False, TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 32, 32, 32)), 2, 1) - BurnAnimation.AnimationChangeTexture(FlameEntity, False, TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 64, 32, 32)), 3, 1) - BurnAnimation.AnimationChangeTexture(FlameEntity, False, TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 96, 32, 32)), 4, 1) - BurnAnimation.AnimationChangeTexture(FlameEntity, True, TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 128, 32, 32)), 5, 2) + MoveAnimation.AnimationSpawnFadingEntity(0.25, -0.25, -0.25, "Textures\Battle\Fire\Ember,0,0,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 1, 1) + MoveAnimation.AnimationSpawnFadingEntity(0.25, -0.25, -0.25, "Textures\Battle\Fire\Ember,0,32,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 2, 1) + MoveAnimation.AnimationSpawnFadingEntity(0.25, -0.25, -0.25, "Textures\Battle\Fire\Ember,0,64,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 3, 1) + MoveAnimation.AnimationSpawnFadingEntity(0.25, -0.25, -0.25, "Textures\Battle\Fire\Ember,0,96,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 4, 1) + MoveAnimation.AnimationSpawnFadingEntity(0.25, -0.25, -0.25, "Textures\Battle\Fire\Ember,0,128,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 5, 1) BattleScreen.BattleQuery.Add(BurnAnimation) - Select Case message Case "" 'Print default message only BattleScreen.BattleQuery.Add(New TextQueryObject(p.GetDisplayName() & " got burned!")) @@ -3412,26 +3411,27 @@ End If '***STAT INCREASE ANIMATION*** - Dim StatAnimation As AnimationQueryObject = New AnimationQueryObject(pNPC, Not own) + Dim MoveAnimation As AnimationQueryObject = New AnimationQueryObject(pNPC, Not own) Dim maxAmount As Integer = 20 * val Dim currentAmount As Integer = 0 While currentAmount <= maxAmount - Dim Texture As Texture2D = TextureManager.GetTexture("Textures\Battle\StatChange\statUp") + Dim Texture As String = "Textures\Battle\StatChange\statDown" + Dim Position As Vector3 = New Vector3(0, -0.4, 0) + Dim Destination As Vector3 = New Vector3(0, 0.8, 0) + Dim Scale As Vector3 = New Vector3(0.2F) Dim xPos = CSng((Random.NextDouble() - 0.5) * 1.2) Dim zPos = CSng((Random.NextDouble() - 0.5) * 1.2) - Dim Position As New Vector3(xPos + pNPC.Position.X, CSng(pNPC.Position.Y - 0.4), pNPC.Position.Z + zPos) - Dim Destination As New Vector3(xPos + pNPC.Position.X, CSng(pNPC.Position.Y + 0.8), zPos + pNPC.Position.Z) - Dim Scale As New Vector3(0.2F) - - Dim StatEntity As Entity = StatAnimation.SpawnEntity(Position, Texture, Scale, 1.0F) + Position.X = xPos + Position.Z = zPos + Destination.X = xPos + Destination.Z = zPos Dim startDelay As Double = 5.0 * Random.NextDouble() - - StatAnimation.AnimationMove(Nothing, True, Destination.X, Destination.Y, Destination.Z, 0.05F, False, True, CSng(startDelay), 0.0F) + MoveAnimation.AnimationSpawnMovingEntity(Position.X, Position.Y, Position.Z, Texture, Scale.X, Scale.Y, Scale.Z, Destination.X, Destination.Y, Destination.Z, 0.05F, False, True, CSng(startDelay), 0.0F) Threading.Interlocked.Increment(currentAmount) End While BattleScreen.BattleQuery.Add(New PlaySoundQueryObject("Battle\Effects\Stat_Raise", False)) - BattleScreen.BattleQuery.Add(StatAnimation) + BattleScreen.BattleQuery.Add(MoveAnimation) Dim printMessage As String = p.GetDisplayName() & "'s " & statString Select Case val @@ -3693,26 +3693,27 @@ End If End If '***STAT DECREASE ANIMATION*** - Dim StatAnimation As AnimationQueryObject = New AnimationQueryObject(pNPC, Not own) + Dim MoveAnimation As AnimationQueryObject = New AnimationQueryObject(pNPC, Not own) Dim maxAmount As Integer = 20 * val Dim currentAmount As Integer = 0 While currentAmount <= maxAmount - Dim Texture As Texture2D = TextureManager.GetTexture("Textures\Battle\StatChange\statDown") + Dim Texture As String = "Textures\Battle\StatChange\statDown" + Dim Position As Vector3 = New Vector3(0, 0.8, 0) + Dim Destination As Vector3 = New Vector3(0, -0.4, 0) + Dim Scale As Vector3 = New Vector3(0.2F) Dim xPos = CSng((Random.NextDouble() - 0.5) * 1.2) Dim zPos = CSng((Random.NextDouble() - 0.5) * 1.2) - Dim Position As New Vector3(xPos + pNPC.Position.X, CSng(pNPC.Position.Y + 0.8), pNPC.Position.Z + zPos) - Dim Destination As New Vector3(xPos + pNPC.Position.X, CSng(pNPC.Position.Y - 0.4), zPos + pNPC.Position.Z) - Dim Scale As New Vector3(0.2F) - - Dim StatEntity As Entity = StatAnimation.SpawnEntity(Position, Texture, Scale, 1.0F) + Position.X = xPos + Position.Z = zPos + Destination.X = xPos + Destination.Z = zPos Dim startDelay As Double = 5.0 * Random.NextDouble() - - StatAnimation.AnimationMove(Nothing, True, Destination.X, Destination.Y, Destination.Z, 0.05F, False, True, CSng(startDelay), 0.0F) + MoveAnimation.AnimationSpawnMovingEntity(Position.X, Position.Y, Position.Z, Texture, Scale.X, Scale.Y, Scale.Z, Destination.X, Destination.Y, Destination.Z, 0.05F, False, True, CSng(startDelay), 0.0F) Threading.Interlocked.Increment(currentAmount) End While - StatAnimation.AnimationPlaySound("Battle\Effects\Stat_Lower", 0.0F, 10.0F) - BattleScreen.BattleQuery.Add(StatAnimation) + MoveAnimation.AnimationPlaySound("Battle\Effects\Stat_Lower", 0.0F, 10.0F) + BattleScreen.BattleQuery.Add(MoveAnimation) Dim printMessage As String = p.GetDisplayName() & "'s " & statString Select Case val @@ -3977,10 +3978,8 @@ Public Sub ReduceHP(ByVal HPAmount As Integer, ByVal own As Boolean, ByVal from As Boolean, ByVal BattleScreen As BattleScreen, ByVal message As String, ByVal cause As String, ByVal sound As String) Dim p As Pokemon = BattleScreen.OwnPokemon - Dim pNPC As Entity = BattleScreen.OwnPokemonNPC If own = False Then p = BattleScreen.OppPokemon - pNPC = BattleScreen.OppPokemonNPC End If If p.HP > 0 And p.Status <> Pokemon.StatusProblems.Fainted Then @@ -3997,13 +3996,6 @@ BattleScreen.BattleQuery.Add(New PlaySoundQueryObject(sound, False, 0.0F)) End If - Dim HitAnimation As AnimationQueryObject = New AnimationQueryObject(pNPC, own) - HitAnimation.AnimationFade(Nothing, False, 1, False, 0, 0, 0) - HitAnimation.AnimationFade(Nothing, False, 1, True, 1, 1, 0) - HitAnimation.AnimationFade(Nothing, False, 1, False, 0, 2, 0) - HitAnimation.AnimationFade(Nothing, False, 1, True, 1, 3, 0) - BattleScreen.BattleQuery.Add(HitAnimation) - If own = True Then BattleScreen.BattleQuery.Add(New MathHPQueryObject(p.HP, p.MaxHP, HPAmount, New Vector2(200, 256))) Else @@ -4756,14 +4748,14 @@ #End Region - ''' - ''' Switches camera to angle - ''' - ''' 0=main battle/1=own pokemon/2=opp pokemon - ''' If the code comes from the own player or not. - ''' Battlescreen reference - ''' If the call should get added the PVP list or the own queue. - Public Sub ChangeCameraAngle(ByVal direction As Integer, ByVal own As Boolean, ByVal BattleScreen As BattleScreen, Optional ByVal AddPVP As Boolean = False) + ''' + ''' Switches camera to angle + ''' + ''' 0=main battle/1=own pokemon/2=opp pokemon + ''' If the code comes from the own player or not. + ''' Battlescreen reference + ''' If the call should get added the PVP list or the own queue. + Public Sub ChangeCameraAngle(ByVal direction As Integer, ByVal own As Boolean, ByVal BattleScreen As BattleScreen, Optional ByVal AddPVP As Boolean = False) Dim q As CameraQueryObject = Nothing Select Case direction @@ -5357,22 +5349,20 @@ If .OwnPokemon.Status = Pokemon.StatusProblems.Poison Then 'Own Poison 'Poison animation Dim PoisonAnimation As AnimationQueryObject = New AnimationQueryObject(BattleScreen.OwnPokemonNPC, True) - PoisonAnimation.AnimationPlaySound("Battle\Effects\Poisoned", 0, 0) - Dim BubbleEntity1 As Entity = PoisonAnimation.SpawnEntity(New Vector3(-0.25, -0.25, -0.25), TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 0, 32, 32)), New Vector3(0.5F), 1, 0, 1) + PoisonAnimation.AnimationSpawnFadingEntity(-0.25, -0.25, -0.25, "Textures\Battle\Poison\Bubble,0,0,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 0, 1) - PoisonAnimation.AnimationChangeTexture(BubbleEntity1, False, TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 32, 32, 32)), 1, 1) - Dim BubbleEntity2 As Entity = PoisonAnimation.SpawnEntity(New Vector3(0.25, -0.25, 0.25), TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 0, 32, 32)), New Vector3(0.5F), 1, 1, 1) + PoisonAnimation.AnimationSpawnFadingEntity(-0.25, -0.25, -0.25, "Textures\Battle\Poison\Bubble,0,32,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 1, 1) + PoisonAnimation.AnimationSpawnFadingEntity(0.25, -0.25, 0.25, "Textures\Battle\Poison\Bubble,0,0,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 1, 1) - PoisonAnimation.AnimationChangeTexture(BubbleEntity1, True, TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 64, 32, 32)), 2, 1) - PoisonAnimation.AnimationChangeTexture(BubbleEntity2, False, TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 32, 32, 32)), 2, 1) - Dim BubbleEntity3 As Entity = PoisonAnimation.SpawnEntity(New Vector3(0.25, -0.25, -0.25), TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 0, 32, 32)), New Vector3(0.5F), 1, 2, 1) + PoisonAnimation.AnimationSpawnFadingEntity(-0.25, -0.25, -0.25, "Textures\Battle\Poison\Bubble,0,64,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 2, 1) + PoisonAnimation.AnimationSpawnFadingEntity(0.25, -0.25, 0.25, "Textures\Battle\Poison\Bubble,0,32,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 2, 1) + PoisonAnimation.AnimationSpawnFadingEntity(0.25, -0.25, -0.25, "Textures\Battle\Poison\Bubble,0,0,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 2, 1) - PoisonAnimation.AnimationChangeTexture(BubbleEntity2, True, TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 64, 32, 32)), 3, 1) - PoisonAnimation.AnimationChangeTexture(BubbleEntity3, False, TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 32, 32, 32)), 3, 1) - - PoisonAnimation.AnimationChangeTexture(BubbleEntity3, True, TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 64, 32, 32)), 4, 1) + PoisonAnimation.AnimationSpawnFadingEntity(0.25, -0.25, 0.25, "Textures\Battle\Poison\Bubble,0,64,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 3, 1) + PoisonAnimation.AnimationSpawnFadingEntity(0.25, -0.25, -0.25, "Textures\Battle\Poison\Bubble,0,32,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 3, 1) + PoisonAnimation.AnimationSpawnFadingEntity(0.25, -0.25, -0.25, "Textures\Battle\Poison\Bubble,0,64,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 4, 2) BattleScreen.BattleQuery.Add(PoisonAnimation) 'Actual damage ReduceHP(CInt(.OwnPokemon.MaxHP / 8), True, True, BattleScreen, "The poison hurt " & .OwnPokemon.GetDisplayName() & ".", "poison") @@ -5383,22 +5373,20 @@ Dim multiplier As Double = (.FieldEffects.OwnPoisonCounter / 16) 'Poison animation Dim PoisonAnimation As AnimationQueryObject = New AnimationQueryObject(BattleScreen.OwnPokemonNPC, True) - PoisonAnimation.AnimationPlaySound("Battle\Effects\Poisoned", 0, 0) - Dim BubbleEntity1 As Entity = PoisonAnimation.SpawnEntity(New Vector3(-0.25, -0.25, -0.25), TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 0, 32, 32)), New Vector3(0.5F), 1, 0, 1) + PoisonAnimation.AnimationSpawnFadingEntity(-0.25, -0.25, -0.25, "Textures\Battle\Poison\Bubble,0,0,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 0, 1) - PoisonAnimation.AnimationChangeTexture(BubbleEntity1, False, TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 32, 32, 32)), 1, 1) - Dim BubbleEntity2 As Entity = PoisonAnimation.SpawnEntity(New Vector3(0.25, -0.25, 0.25), TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 0, 32, 32)), New Vector3(0.5F), 1, 1, 1) + PoisonAnimation.AnimationSpawnFadingEntity(-0.25, -0.25, -0.25, "Textures\Battle\Poison\Bubble,0,32,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 1, 1) + PoisonAnimation.AnimationSpawnFadingEntity(0.25, -0.25, 0.25, "Textures\Battle\Poison\Bubble,0,0,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 1, 1) - PoisonAnimation.AnimationChangeTexture(BubbleEntity1, True, TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 64, 32, 32)), 2, 1) - PoisonAnimation.AnimationChangeTexture(BubbleEntity2, False, TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 32, 32, 32)), 2, 1) - Dim BubbleEntity3 As Entity = PoisonAnimation.SpawnEntity(New Vector3(0.25, -0.25, -0.25), TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 0, 32, 32)), New Vector3(0.5F), 1, 2, 1) + PoisonAnimation.AnimationSpawnFadingEntity(-0.25, -0.25, -0.25, "Textures\Battle\Poison\Bubble,0,64,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 2, 1) + PoisonAnimation.AnimationSpawnFadingEntity(0.25, -0.25, 0.25, "Textures\Battle\Poison\Bubble,0,32,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 2, 1) + PoisonAnimation.AnimationSpawnFadingEntity(0.25, -0.25, -0.25, "Textures\Battle\Poison\Bubble,0,0,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 2, 1) - PoisonAnimation.AnimationChangeTexture(BubbleEntity2, True, TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 64, 32, 32)), 3, 1) - PoisonAnimation.AnimationChangeTexture(BubbleEntity3, False, TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 32, 32, 32)), 3, 1) - - PoisonAnimation.AnimationChangeTexture(BubbleEntity3, True, TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 64, 32, 32)), 4, 1) + PoisonAnimation.AnimationSpawnFadingEntity(0.25, -0.25, 0.25, "Textures\Battle\Poison\Bubble,0,64,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 3, 1) + PoisonAnimation.AnimationSpawnFadingEntity(0.25, -0.25, -0.25, "Textures\Battle\Poison\Bubble,0,32,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 3, 1) + PoisonAnimation.AnimationSpawnFadingEntity(0.25, -0.25, -0.25, "Textures\Battle\Poison\Bubble,0,64,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 4, 2) BattleScreen.BattleQuery.Add(PoisonAnimation) 'Actual damage ReduceHP(CInt(.OwnPokemon.MaxHP * multiplier), True, True, BattleScreen, "The toxic hurt " & .OwnPokemon.GetDisplayName() & ".", "badpoison") @@ -5418,14 +5406,12 @@ 'Burn animation Dim BurnAnimation As AnimationQueryObject = New AnimationQueryObject(BattleScreen.OwnPokemonNPC, False) BurnAnimation.AnimationPlaySound("Battle\Effects\Burned", 0, 0) - - Dim FlameEntity As Entity = BurnAnimation.SpawnEntity(New Vector3(CSng(BattleScreen.OwnPokemonNPC.Position.X + 0.25), CSng(BattleScreen.OwnPokemonNPC.Position.Y - 0.25), CSng(BattleScreen.OwnPokemonNPC.Position.Z + 0.25)), TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 0, 32, 32)), New Vector3(0.5, 0.5, 0.5), 1.0F) - BurnAnimation.AnimationChangeTexture(FlameEntity, False, TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 32, 32, 32)), 2, 1) - BurnAnimation.AnimationChangeTexture(FlameEntity, False, TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 64, 32, 32)), 3, 1) - BurnAnimation.AnimationChangeTexture(FlameEntity, False, TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 96, 32, 32)), 4, 1) - BurnAnimation.AnimationChangeTexture(FlameEntity, True, TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 128, 32, 32)), 5, 2) + MoveAnimation.AnimationSpawnFadingEntity(0.25, -0.25, -0.25, "Textures\Battle\Fire\Ember,0,0,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 1, 1) + MoveAnimation.AnimationSpawnFadingEntity(0.25, -0.25, -0.25, "Textures\Battle\Fire\Ember,0,32,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 2, 1) + MoveAnimation.AnimationSpawnFadingEntity(0.25, -0.25, -0.25, "Textures\Battle\Fire\Ember,0,64,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 3, 1) + MoveAnimation.AnimationSpawnFadingEntity(0.25, -0.25, -0.25, "Textures\Battle\Fire\Ember,0,96,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 4, 1) + MoveAnimation.AnimationSpawnFadingEntity(0.25, -0.25, -0.25, "Textures\Battle\Fire\Ember,0,128,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 5, 1) BattleScreen.BattleQuery.Add(BurnAnimation) - 'Actual damage ReduceHP(reduceAmount, True, True, BattleScreen, .OwnPokemon.GetDisplayName() & " is hurt by the burn.", "burn") End If @@ -6155,24 +6141,21 @@ If .OppPokemon.Status = Pokemon.StatusProblems.Poison Then 'Opp Poison 'Poison animation Dim PoisonAnimation As AnimationQueryObject = New AnimationQueryObject(BattleScreen.OppPokemonNPC, False) - PoisonAnimation.AnimationPlaySound("Battle\Effects\Poisoned", 0, 0) - Dim BubbleEntity1 As Entity = PoisonAnimation.SpawnEntity(New Vector3(-0.25, -0.25, -0.25), TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 0, 32, 32)), New Vector3(0.5F), 1, 0, 1) + PoisonAnimation.AnimationSpawnFadingEntity(-0.25, -0.25, -0.25, "Textures\Battle\Poison\Bubble,0,0,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 0, 1) - PoisonAnimation.AnimationChangeTexture(BubbleEntity1, False, TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 32, 32, 32)), 1, 1) - Dim BubbleEntity2 As Entity = PoisonAnimation.SpawnEntity(New Vector3(0.25, -0.25, 0.25), TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 0, 32, 32)), New Vector3(0.5F), 1, 1, 1) + PoisonAnimation.AnimationSpawnFadingEntity(-0.25, -0.25, -0.25, "Textures\Battle\Poison\Bubble,0,32,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 1, 1) + PoisonAnimation.AnimationSpawnFadingEntity(0.25, -0.25, 0.25, "Textures\Battle\Poison\Bubble,0,0,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 1, 1) - PoisonAnimation.AnimationChangeTexture(BubbleEntity1, True, TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 64, 32, 32)), 2, 1) - PoisonAnimation.AnimationChangeTexture(BubbleEntity2, False, TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 32, 32, 32)), 2, 1) - Dim BubbleEntity3 As Entity = PoisonAnimation.SpawnEntity(New Vector3(0.25, -0.25, -0.25), TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 0, 32, 32)), New Vector3(0.5F), 1, 2, 1) + PoisonAnimation.AnimationSpawnFadingEntity(-0.25, -0.25, -0.25, "Textures\Battle\Poison\Bubble,0,64,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 2, 1) + PoisonAnimation.AnimationSpawnFadingEntity(0.25, -0.25, 0.25, "Textures\Battle\Poison\Bubble,0,32,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 2, 1) + PoisonAnimation.AnimationSpawnFadingEntity(0.25, -0.25, -0.25, "Textures\Battle\Poison\Bubble,0,0,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 2, 1) - PoisonAnimation.AnimationChangeTexture(BubbleEntity2, True, TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 64, 32, 32)), 3, 1) - PoisonAnimation.AnimationChangeTexture(BubbleEntity3, False, TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 32, 32, 32)), 3, 1) - - PoisonAnimation.AnimationChangeTexture(BubbleEntity3, True, TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 64, 32, 32)), 4, 1) + PoisonAnimation.AnimationSpawnFadingEntity(0.25, -0.25, 0.25, "Textures\Battle\Poison\Bubble,0,64,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 3, 1) + PoisonAnimation.AnimationSpawnFadingEntity(0.25, -0.25, -0.25, "Textures\Battle\Poison\Bubble,0,32,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 3, 1) + PoisonAnimation.AnimationSpawnFadingEntity(0.25, -0.25, -0.25, "Textures\Battle\Poison\Bubble,0,64,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 4, 2) BattleScreen.BattleQuery.Add(PoisonAnimation) - 'Actual damage ReduceHP(CInt(.OppPokemon.MaxHP / 8), False, False, BattleScreen, "The poison hurt " & .OppPokemon.GetDisplayName() & ".", "poison") End If @@ -6182,22 +6165,20 @@ Dim multiplier As Double = (.FieldEffects.OppPoisonCounter / 16) 'Poison animation Dim PoisonAnimation As AnimationQueryObject = New AnimationQueryObject(BattleScreen.OppPokemonNPC, False) - PoisonAnimation.AnimationPlaySound("Battle\Effects\Poisoned", 0, 0) - Dim BubbleEntity1 As Entity = PoisonAnimation.SpawnEntity(New Vector3(-0.25, -0.25, -0.25), TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 0, 32, 32)), New Vector3(0.5F), 1, 0, 1) + PoisonAnimation.AnimationSpawnFadingEntity(-0.25, -0.25, -0.25, "Textures\Battle\Poison\Bubble,0,0,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 0, 1) - PoisonAnimation.AnimationChangeTexture(BubbleEntity1, False, TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 32, 32, 32)), 1, 1) - Dim BubbleEntity2 As Entity = PoisonAnimation.SpawnEntity(New Vector3(0.25, -0.25, 0.25), TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 0, 32, 32)), New Vector3(0.5F), 1, 1, 1) + PoisonAnimation.AnimationSpawnFadingEntity(-0.25, -0.25, -0.25, "Textures\Battle\Poison\Bubble,0,32,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 1, 1) + PoisonAnimation.AnimationSpawnFadingEntity(0.25, -0.25, 0.25, "Textures\Battle\Poison\Bubble,0,0,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 1, 1) - PoisonAnimation.AnimationChangeTexture(BubbleEntity1, True, TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 64, 32, 32)), 2, 1) - PoisonAnimation.AnimationChangeTexture(BubbleEntity2, False, TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 32, 32, 32)), 2, 1) - Dim BubbleEntity3 As Entity = PoisonAnimation.SpawnEntity(New Vector3(0.25, -0.25, -0.25), TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 0, 32, 32)), New Vector3(0.5F), 1, 2, 1) + PoisonAnimation.AnimationSpawnFadingEntity(-0.25, -0.25, -0.25, "Textures\Battle\Poison\Bubble,0,64,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 2, 1) + PoisonAnimation.AnimationSpawnFadingEntity(0.25, -0.25, 0.25, "Textures\Battle\Poison\Bubble,0,32,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 2, 1) + PoisonAnimation.AnimationSpawnFadingEntity(0.25, -0.25, -0.25, "Textures\Battle\Poison\Bubble,0,0,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 2, 1) - PoisonAnimation.AnimationChangeTexture(BubbleEntity2, True, TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 64, 32, 32)), 3, 1) - PoisonAnimation.AnimationChangeTexture(BubbleEntity3, False, TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 32, 32, 32)), 3, 1) - - PoisonAnimation.AnimationChangeTexture(BubbleEntity3, True, TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 64, 32, 32)), 4, 1) + PoisonAnimation.AnimationSpawnFadingEntity(0.25, -0.25, 0.25, "Textures\Battle\Poison\Bubble,0,64,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 3, 1) + PoisonAnimation.AnimationSpawnFadingEntity(0.25, -0.25, -0.25, "Textures\Battle\Poison\Bubble,0,32,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 3, 1) + PoisonAnimation.AnimationSpawnFadingEntity(0.25, -0.25, -0.25, "Textures\Battle\Poison\Bubble,0,64,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 4, 2) BattleScreen.BattleQuery.Add(PoisonAnimation) 'Actual damage ReduceHP(CInt(.OppPokemon.MaxHP * multiplier), False, False, BattleScreen, "The toxic hurt " & .OppPokemon.GetDisplayName() & ".", "badpoison") @@ -6216,14 +6197,12 @@ 'Burn animation Dim BurnAnimation As AnimationQueryObject = New AnimationQueryObject(BattleScreen.OppPokemonNPC, False) BurnAnimation.AnimationPlaySound("Battle\Effects\Burned", 0, 0) - - Dim FlameEntity As Entity = BurnAnimation.SpawnEntity(New Vector3(CSng(BattleScreen.OppPokemonNPC.Position.X - 0.25), CSng(BattleScreen.OwnPokemonNPC.Position.Y - 0.25), CSng(BattleScreen.OwnPokemonNPC.Position.Z - 0.25)), TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 0, 32, 32)), New Vector3(0.5, 0.5, 0.5), 1.0F) - BurnAnimation.AnimationChangeTexture(FlameEntity, False, TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 32, 32, 32)), 2, 1) - BurnAnimation.AnimationChangeTexture(FlameEntity, False, TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 64, 32, 32)), 3, 1) - BurnAnimation.AnimationChangeTexture(FlameEntity, False, TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 96, 32, 32)), 4, 1) - BurnAnimation.AnimationChangeTexture(FlameEntity, True, TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 128, 32, 32)), 5, 2) + MoveAnimation.AnimationSpawnFadingEntity(0.25, -0.25, -0.25, "Textures\Battle\Fire\Ember,0,0,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 1, 1) + MoveAnimation.AnimationSpawnFadingEntity(0.25, -0.25, -0.25, "Textures\Battle\Fire\Ember,0,32,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 2, 1) + MoveAnimation.AnimationSpawnFadingEntity(0.25, -0.25, -0.25, "Textures\Battle\Fire\Ember,0,64,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 3, 1) + MoveAnimation.AnimationSpawnFadingEntity(0.25, -0.25, -0.25, "Textures\Battle\Fire\Ember,0,96,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 4, 1) + MoveAnimation.AnimationSpawnFadingEntity(0.25, -0.25, -0.25, "Textures\Battle\Fire\Ember,0,128,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 5, 1) BattleScreen.BattleQuery.Add(BurnAnimation) - 'Actual damage ReduceHP(reduceAmount, False, False, BattleScreen, .OppPokemon.GetDisplayName() & " is hurt by the burn.", "burn") End If @@ -6748,38 +6727,38 @@ End If Else If BattleScreen.IsTrainerBattle = True Then - EndBattle(EndBattleReasons.LoseTrainer, BattleScreen, False) - If BattleScreen.IsRemoteBattle = True Then - EndBattle(EndBattleReasons.LoseTrainer, BattleScreen, True) - End If - Else - EndBattle(EndBattleReasons.LoseWild, BattleScreen, False) - End If - End If - End With - End Sub + EndBattle(EndBattleReasons.LoseTrainer, BattleScreen, False) + If BattleScreen.IsRemoteBattle = True Then + EndBattle(EndBattleReasons.LoseTrainer, BattleScreen, True) + End If + Else + EndBattle(EndBattleReasons.LoseWild, BattleScreen, False) + End If + End If + End With + End Sub - Public Sub ApplyOwnBatonPass(ByVal BattleScreen As BattleScreen) - If BattleScreen.FieldEffects.OwnUsedBatonPass = True Then - BattleScreen.FieldEffects.OwnUsedBatonPass = False + Public Sub ApplyOwnBatonPass(ByVal BattleScreen As BattleScreen) + If BattleScreen.FieldEffects.OwnUsedBatonPass = True Then + BattleScreen.FieldEffects.OwnUsedBatonPass = False - BattleScreen.OwnPokemon.StatAttack = BattleScreen.FieldEffects.OwnBatonPassStats(0) - BattleScreen.OwnPokemon.StatDefense = BattleScreen.FieldEffects.OwnBatonPassStats(1) - BattleScreen.OwnPokemon.StatSpAttack = BattleScreen.FieldEffects.OwnBatonPassStats(2) - BattleScreen.OwnPokemon.StatSpDefense = BattleScreen.FieldEffects.OwnBatonPassStats(3) - BattleScreen.OwnPokemon.StatSpeed = BattleScreen.FieldEffects.OwnBatonPassStats(4) - BattleScreen.OwnPokemon.Evasion = BattleScreen.FieldEffects.OwnBatonPassStats(5) - BattleScreen.OwnPokemon.Accuracy = BattleScreen.FieldEffects.OwnBatonPassStats(6) + BattleScreen.OwnPokemon.StatAttack = BattleScreen.FieldEffects.OwnBatonPassStats(0) + BattleScreen.OwnPokemon.StatDefense = BattleScreen.FieldEffects.OwnBatonPassStats(1) + BattleScreen.OwnPokemon.StatSpAttack = BattleScreen.FieldEffects.OwnBatonPassStats(2) + BattleScreen.OwnPokemon.StatSpDefense = BattleScreen.FieldEffects.OwnBatonPassStats(3) + BattleScreen.OwnPokemon.StatSpeed = BattleScreen.FieldEffects.OwnBatonPassStats(4) + BattleScreen.OwnPokemon.Evasion = BattleScreen.FieldEffects.OwnBatonPassStats(5) + BattleScreen.OwnPokemon.Accuracy = BattleScreen.FieldEffects.OwnBatonPassStats(6) - If BattleScreen.FieldEffects.OwnBatonPassConfusion = True Then - BattleScreen.FieldEffects.OwnBatonPassConfusion = False - BattleScreen.OwnPokemon.AddVolatileStatus(Pokemon.VolatileStatus.Confusion) - End If - End If - End Sub + If BattleScreen.FieldEffects.OwnBatonPassConfusion = True Then + BattleScreen.FieldEffects.OwnBatonPassConfusion = False + BattleScreen.OwnPokemon.AddVolatileStatus(Pokemon.VolatileStatus.Confusion) + End If + End If + End Sub - Public Sub SwitchInOwn(ByVal BattleScreen As BattleScreen, ByVal NewPokemonIndex As Integer, ByVal FirstTime As Boolean, ByVal InsertIndex As Integer, Optional ByVal message As String = "") - HasSwitchedInOwn = True + Public Sub SwitchInOwn(ByVal BattleScreen As BattleScreen, ByVal NewPokemonIndex As Integer, ByVal FirstTime As Boolean, ByVal InsertIndex As Integer, Optional ByVal message As String = "") + HasSwitchedInOwn = True If FirstTime = False Then Dim insertMessage As String = message @@ -6796,28 +6775,24 @@ Dim SmokeReturned As Integer = 0 Do Dim SmokePosition = New Vector3(CSng(Random.Next(-10, 10) / 10), CSng(Random.Next(-10, 10) / 10), CSng(Random.Next(-10, 10) / 10)) - Dim SmokeDestination As Vector3 = New Vector3(0, 0, 0) + Dim SmokeDestination = New Vector3(0, 0, 0) - Dim SmokeTexture As Texture2D = TextureManager.GetTexture("Textures\Battle\Smoke") + Dim SmokeTexture As String = "Textures\Battle\Cloud" Dim SmokeScale = New Vector3(CSng(Random.Next(2, 6) / 10)) Dim SmokeSpeed = CSng(Random.Next(1, 3) / 10.0F) - Dim SmokeEntity As Entity = BallReturn.SpawnEntity(SmokePosition, SmokeTexture, SmokeScale, 1.0F) - - BallReturn.AnimationMove(SmokeEntity, True, SmokeDestination.X, SmokeDestination.Y, SmokeDestination.Z, SmokeSpeed, False, False, 0.0F, 0.0F) - + BallReturn.AnimationSpawnMovingEntity(SmokePosition.X, SmokePosition.Y, SmokePosition.Z, SmokeTexture, SmokeScale.X, SmokeScale.Y, SmokeScale.Z, SmokeDestination.X, SmokeDestination.Y, SmokeDestination.Z, SmokeSpeed, False, False, 0.0F, 0.0F) Threading.Interlocked.Increment(SmokeReturned) Loop While SmokeReturned <= 38 ' Pokemon disappears - BallReturn.AnimationFade(Nothing, False, 1, False, 0, 1, 0) - BallReturn.AnimationMove(Nothing, False, 0, 0.5, 0, 0.5, False, False, 2, 0,,, 3) + BallReturn.AnimationFadePokemonEntity(1, False, 0, 1, 0) + BallReturn.AnimationMovePokemonEntity(0, 0.5, 0, 0.5, False, False, 2, 0,,, 4) ' Ball returns BallReturn.AnimationPlaySound("Battle\Pokeball\Throw", 1, 0) - Dim BallReturnEntity As Entity = BallReturn.SpawnEntity(BattleScreen.OwnPokemonNPC.Position, TextureManager.GetTexture(BattleScreen.OwnPokemon.CatchBall.TextureSource), New Vector3(0.3F), 1.0F) - BallReturn.AnimationMove(BallReturnEntity, True, BattleScreen.OwnPokemonNPC.Position.X - 2, BattleScreen.OwnPokemonNPC.Position.Y, BattleScreen.OwnPokemonNPC.Position.Z, 0.1, False, True, 1, 0,, 0.3) + BallReturn.AnimationSpawnMovingEntity(0, 0, 0, BattleScreen.OwnPokemon.CatchBall.TextureSource, 0.3F, 0.3F, 0.3F, -2, 0, 0, 0.1, False, True, 1, 0,, 0.3) BattleScreen.AddToQuery(InsertIndex, BallReturn) @@ -6855,311 +6830,304 @@ ' Ball is thrown Dim BallThrow As AnimationQueryObject = New AnimationQueryObject(BattleScreen.OwnPokemonNPC, False, BattleScreen.OwnPokemonModel) - BallThrow.AnimationPlaySound("Battle\Pokeball\Throw", 0, 0) - - Dim BallThrowEntity As Entity = BallReturn.SpawnEntity(BattleScreen.OwnPokemonNPC.Position + New Vector3(-2, -0.15, 0), TextureManager.GetTexture(BattleScreen.OwnPokemon.CatchBall.TextureSource), New Vector3(0.3F), 1.0F) - BallThrow.AnimationMove(BallThrowEntity, True, BattleScreen.OwnPokemonNPC.Position.X, CSng(BattleScreen.OwnPokemonNPC.Position.Y + 0.35), BattleScreen.OwnPokemonNPC.Position.Z, 0.1, False, True, 0F, 0F,, 0.3) + BallThrow.AnimationSpawnMovingEntity(-2, -0.15, 0, BattleScreen.OwnPokemon.CatchBall.TextureSource, 0.3F, 0.3F, 0.3F, 0, 0.35, 0, 0.1, False, True, 0F, 0F,, 0.3) ' Ball Opens BallThrow.AnimationPlaySound("Battle\Pokeball\Open", 3, 0) - Dim SmokeSpawned As Integer = 0 Do Dim SmokePosition = New Vector3(0, 0.35, 0) Dim SmokeDestination = New Vector3(CSng(Random.Next(-10, 10) / 10), CSng(Random.Next(-10, 10) / 10), CSng(Random.Next(-10, 10) / 10)) - Dim SmokeTexture As Texture2D = TextureManager.GetTexture("Textures\Battle\Smoke") + Dim SmokeTexture As String = "Textures\Battle\Cloud" Dim SmokeScale = New Vector3(CSng(Random.Next(2, 6) / 10)) Dim SmokeSpeed = CSng(Random.Next(1, 3) / 10.0F) - Dim SmokeEntity As Entity = BallThrow.SpawnEntity(SmokePosition, SmokeTexture, SmokeScale, 1.0F) - - BallThrow.AnimationMove(SmokeEntity, True, SmokeDestination.X, SmokeDestination.Y, SmokeDestination.Z, SmokeSpeed, False, False, 3.0F, 0.0F) - + BallThrow.AnimationSpawnMovingEntity(SmokePosition.X, SmokePosition.Y, SmokePosition.Z, SmokeTexture, SmokeScale.X, SmokeScale.Y, SmokeScale.Z, SmokeDestination.X, SmokeDestination.Y, SmokeDestination.Z, SmokeSpeed, False, False, 3.0F, 0.0F) Threading.Interlocked.Increment(SmokeSpawned) Loop While SmokeSpawned <= 38 ' Pokemon appears - BallThrow.AnimationFade(Nothing, False, 1, True, 1, 4, 0) + BallThrow.AnimationFadePokemonEntity(1, True, 1, 4, 0) BallThrow.AnimationPlaySound(CStr(BattleScreen.OwnPokemon.Number), 4, 0,, True) ' Pokémon falls down - BallThrow.AnimationMove(Nothing, False, 0, 0, 0, 0.05F, False, False, 4, 0,,, 3) + BallThrow.AnimationMovePokemonEntity(0, 0, 0, 0.05F, False, False, 4, 0,,, 4) BattleScreen.AddToQuery(InsertIndex, BallThrow) End If With BattleScreen - If .FieldEffects.UsedPokemon.Contains(NewPokemonIndex) = False Then - .FieldEffects.UsedPokemon.Add(NewPokemonIndex) - End If + If .FieldEffects.UsedPokemon.Contains(NewPokemonIndex) = False Then + .FieldEffects.UsedPokemon.Add(NewPokemonIndex) + End If - If Not .OwnPokemon.Item Is Nothing Then - If .OwnPokemon.Item.Name.ToLower() = "amulet coin" Or .OwnPokemon.Item.Name.ToLower() = "luck incense" Then - If .FieldEffects.CanUseItem(True) = True And .FieldEffects.CanUseOwnItem(True, BattleScreen) = True Then - BattleScreen.FieldEffects.AmuletCoin += 1 - End If - End If - End If + If Not .OwnPokemon.Item Is Nothing Then + If .OwnPokemon.Item.Name.ToLower() = "amulet coin" Or .OwnPokemon.Item.Name.ToLower() = "luck incense" Then + If .FieldEffects.CanUseItem(True) = True And .FieldEffects.CanUseOwnItem(True, BattleScreen) = True Then + BattleScreen.FieldEffects.AmuletCoin += 1 + End If + End If + End If - Dim p As Pokemon = .OwnPokemon - Dim op As Pokemon = .OppPokemon + Dim p As Pokemon = .OwnPokemon + Dim op As Pokemon = .OppPokemon - Dim spikeAffected As Boolean = True - Dim rockAffected As Boolean = True + Dim spikeAffected As Boolean = True + Dim rockAffected As Boolean = True - spikeAffected = BattleScreen.FieldEffects.IsGrounded(True, BattleScreen) + spikeAffected = BattleScreen.FieldEffects.IsGrounded(True, BattleScreen) - 'Spikes - If spikeAffected = True Then - If .FieldEffects.OppSpikes > 0 And (p.Ability.Name.ToLower() <> "magic guard" Or BattleScreen.FieldEffects.CanUseAbility(True, BattleScreen, 1) = False) Then - Dim spikeDamage As Double = 1D - Select Case .FieldEffects.OppSpikes - Case 1 - spikeDamage = (p.MaxHP / 100) * 12.5D - Case 2 - spikeDamage = (p.MaxHP / 100) * 16.7D - Case 3 - spikeDamage = (p.MaxHP / 100) * 25D - End Select - ReduceHP(CInt(spikeDamage), True, False, BattleScreen, "The Spikes hurt " & p.GetDisplayName() & "!", "spikes") - End If - End If + 'Spikes + If spikeAffected = True Then + If .FieldEffects.OppSpikes > 0 And (p.Ability.Name.ToLower() <> "magic guard" Or BattleScreen.FieldEffects.CanUseAbility(True, BattleScreen, 1) = False) Then + Dim spikeDamage As Double = 1D + Select Case .FieldEffects.OppSpikes + Case 1 + spikeDamage = (p.MaxHP / 100) * 12.5D + Case 2 + spikeDamage = (p.MaxHP / 100) * 16.7D + Case 3 + spikeDamage = (p.MaxHP / 100) * 25D + End Select + ReduceHP(CInt(spikeDamage), True, False, BattleScreen, "The Spikes hurt " & p.GetDisplayName() & "!", "spikes") + End If + End If - 'Sticky Web - If spikeAffected = True Then - If .FieldEffects.OppStickyWeb > 0 Then + 'Sticky Web + If spikeAffected = True Then + If .FieldEffects.OppStickyWeb > 0 Then - LowerStat(True, True, BattleScreen, "Speed", 1, "Your pokemon was caught in a Sticky Web!", "stickyweb") + LowerStat(True, True, BattleScreen, "Speed", 1, "Your pokemon was caught in a Sticky Web!", "stickyweb") - End If - End If + End If + End If - 'Toxic Spikes - If spikeAffected = True Then - If .FieldEffects.OppToxicSpikes > 0 And p.Status = Pokemon.StatusProblems.None And p.Type1.Type <> Element.Types.Poison And p.Type2.Type <> Element.Types.Poison Then - Select Case .FieldEffects.OppToxicSpikes - Case 1 - InflictPoison(True, False, BattleScreen, False, "The Toxic Spikes hurt " & p.GetDisplayName() & "!", "toxicspikes") - Case 2 - InflictPoison(True, False, BattleScreen, True, "The Toxic Spikes hurt " & p.GetDisplayName() & "!", "toxicspikes") - End Select - End If - If .FieldEffects.OppToxicSpikes > 0 Then - If p.Type1.Type = Element.Types.Poison Or p.Type2.Type = Element.Types.Poison Then - .AddToQuery(InsertIndex, New TextQueryObject(p.GetDisplayName() & " removed the Toxic Spikes!")) - .FieldEffects.OppToxicSpikes = 0 - End If - End If - End If + 'Toxic Spikes + If spikeAffected = True Then + If .FieldEffects.OppToxicSpikes > 0 And p.Status = Pokemon.StatusProblems.None And p.Type1.Type <> Element.Types.Poison And p.Type2.Type <> Element.Types.Poison Then + Select Case .FieldEffects.OppToxicSpikes + Case 1 + InflictPoison(True, False, BattleScreen, False, "The Toxic Spikes hurt " & p.GetDisplayName() & "!", "toxicspikes") + Case 2 + InflictPoison(True, False, BattleScreen, True, "The Toxic Spikes hurt " & p.GetDisplayName() & "!", "toxicspikes") + End Select + End If + If .FieldEffects.OppToxicSpikes > 0 Then + If p.Type1.Type = Element.Types.Poison Or p.Type2.Type = Element.Types.Poison Then + .AddToQuery(InsertIndex, New TextQueryObject(p.GetDisplayName() & " removed the Toxic Spikes!")) + .FieldEffects.OppToxicSpikes = 0 + End If + End If + End If - 'Stealth Rock - If rockAffected = True Then - If .FieldEffects.OppStealthRock > 0 And (p.Ability.Name.ToLower() <> "magic guard" Or BattleScreen.FieldEffects.CanUseAbility(True, BattleScreen, 1) = False) Then - Dim rocksDamage As Double = 1D + 'Stealth Rock + If rockAffected = True Then + If .FieldEffects.OppStealthRock > 0 And (p.Ability.Name.ToLower() <> "magic guard" Or BattleScreen.FieldEffects.CanUseAbility(True, BattleScreen, 1) = False) Then + Dim rocksDamage As Double = 1D - Dim effectiveness As Single = BattleCalculation.ReverseTypeEffectiveness(Element.GetElementMultiplier(New Element(Element.Types.Rock), p.Type1)) * BattleCalculation.ReverseTypeEffectiveness(Element.GetElementMultiplier(New Element(Element.Types.Rock), p.Type2)) - Select Case effectiveness - Case 0.25F - rocksDamage = (p.MaxHP / 100) * 3.125D - Case 0.5F - rocksDamage = (p.MaxHP / 100) * 6.25D - Case 1.0F - rocksDamage = (p.MaxHP / 100) * 12.5D - Case 2.0F - rocksDamage = (p.MaxHP / 100) * 25D - Case 4.0F - rocksDamage = (p.MaxHP / 100) * 50D - End Select + Dim effectiveness As Single = BattleCalculation.ReverseTypeEffectiveness(Element.GetElementMultiplier(New Element(Element.Types.Rock), p.Type1)) * BattleCalculation.ReverseTypeEffectiveness(Element.GetElementMultiplier(New Element(Element.Types.Rock), p.Type2)) + Select Case effectiveness + Case 0.25F + rocksDamage = (p.MaxHP / 100) * 3.125D + Case 0.5F + rocksDamage = (p.MaxHP / 100) * 6.25D + Case 1.0F + rocksDamage = (p.MaxHP / 100) * 12.5D + Case 2.0F + rocksDamage = (p.MaxHP / 100) * 25D + Case 4.0F + rocksDamage = (p.MaxHP / 100) * 50D + End Select - ReduceHP(CInt(rocksDamage), True, False, BattleScreen, "The Stealth Rocks hurt " & p.GetDisplayName() & "!", "stealthrocks") - End If - End If + ReduceHP(CInt(rocksDamage), True, False, BattleScreen, "The Stealth Rocks hurt " & p.GetDisplayName() & "!", "stealthrocks") + End If + End If - TriggerAbilityEffect(BattleScreen, True) - TriggerItemEffect(BattleScreen, True) + TriggerAbilityEffect(BattleScreen, True) + TriggerItemEffect(BattleScreen, True) - If .OwnPokemon.Status = Pokemon.StatusProblems.Sleep Then - .FieldEffects.OwnSleepTurns = Core.Random.Next(1, 4) - End If + If .OwnPokemon.Status = Pokemon.StatusProblems.Sleep Then + .FieldEffects.OwnSleepTurns = Core.Random.Next(1, 4) + End If - If BattleScreen.FieldEffects.OwnHealingWish = True Then - BattleScreen.FieldEffects.OwnHealingWish = False + If BattleScreen.FieldEffects.OwnHealingWish = True Then + BattleScreen.FieldEffects.OwnHealingWish = False - If .OwnPokemon.HP < .OwnPokemon.MaxHP Or .OwnPokemon.Status <> Pokemon.StatusProblems.None Then - GainHP(.OwnPokemon.MaxHP - .OwnPokemon.HP, True, True, BattleScreen, "The Healing Wish came true for " & .OwnPokemon.GetDisplayName() & "!", "move:healingwish") - CureStatusProblem(True, True, BattleScreen, "", "move:healingwish") - End If - End If - End With - End Sub + If .OwnPokemon.HP < .OwnPokemon.MaxHP Or .OwnPokemon.Status <> Pokemon.StatusProblems.None Then + GainHP(.OwnPokemon.MaxHP - .OwnPokemon.HP, True, True, BattleScreen, "The Healing Wish came true for " & .OwnPokemon.GetDisplayName() & "!", "move:healingwish") + CureStatusProblem(True, True, BattleScreen, "", "move:healingwish") + End If + End If + End With + End Sub - Public Sub SwitchOutOpp(ByVal BattleScreen As BattleScreen, ByVal index As Integer, Optional ByVal message As String = "") - With BattleScreen - 'Natural cure cures status problems - If .OppPokemon.Ability.Name.ToLower() = "natural cure" Then - If .OppPokemon.Status <> Pokemon.StatusProblems.Fainted And .OppPokemon.Status <> Pokemon.StatusProblems.None Then - .OppPokemon.Status = Pokemon.StatusProblems.None - .BattleQuery.Add(New TextQueryObject(.OppPokemon.GetDisplayName() & "'s status problem got healed by Natural Cure")) - End If - End If - 'Regenerator ability heals 1/3 of it's max HP - If .OppPokemon.Ability.Name.ToLower() = "regenerator" Then - If Not (.OppPokemon.Status = Pokemon.StatusProblems.Fainted Or .OppPokemon.HP = 0) Then - Dim restoreHP = CInt(.OppPokemon.MaxHP / 3) - If restoreHP > 0 And .OppPokemon.HP < .OppPokemon.MaxHP And .OppPokemon.HP > 0 Then - BattleScreen.Battle.GainHP(restoreHP, False, True, BattleScreen, .OppPokemon.GetDisplayName() & "'s HP was restored!", "ability:regenerator") - End If - End If - End If - 'save baton pass stuff: - If .FieldEffects.OppUsedBatonPass = True Then - .FieldEffects.OppBatonPassStats = New List(Of Integer) - With .OppPokemon - BattleScreen.FieldEffects.OppBatonPassStats.AddRange({ .StatAttack, .StatDefense, .StatSpAttack, .StatSpDefense, .StatSpeed, .Evasion, .Accuracy}) - End With - .FieldEffects.OppBatonPassConfusion = .OppPokemon.HasVolatileStatus(Pokemon.VolatileStatus.Confusion) = True - End If + Public Sub SwitchOutOpp(ByVal BattleScreen As BattleScreen, ByVal index As Integer, Optional ByVal message As String = "") + With BattleScreen + 'Natural cure cures status problems + If .OppPokemon.Ability.Name.ToLower() = "natural cure" Then + If .OppPokemon.Status <> Pokemon.StatusProblems.Fainted And .OppPokemon.Status <> Pokemon.StatusProblems.None Then + .OppPokemon.Status = Pokemon.StatusProblems.None + .BattleQuery.Add(New TextQueryObject(.OppPokemon.GetDisplayName() & "'s status problem got healed by Natural Cure")) + End If + End If + 'Regenerator ability heals 1/3 of it's max HP + If .OppPokemon.Ability.Name.ToLower() = "regenerator" Then + If Not (.OppPokemon.Status = Pokemon.StatusProblems.Fainted Or .OppPokemon.HP = 0) Then + Dim restoreHP = CInt(.OppPokemon.MaxHP / 3) + If restoreHP > 0 And .OppPokemon.HP < .OppPokemon.MaxHP And .OppPokemon.HP > 0 Then + BattleScreen.Battle.GainHP(restoreHP, False, True, BattleScreen, .OppPokemon.GetDisplayName() & "'s HP was restored!", "ability:regenerator") + End If + End If + End If + 'save baton pass stuff: + If .FieldEffects.OppUsedBatonPass = True Then + .FieldEffects.OppBatonPassStats = New List(Of Integer) + With .OppPokemon + BattleScreen.FieldEffects.OppBatonPassStats.AddRange({ .StatAttack, .StatDefense, .StatSpAttack, .StatSpDefense, .StatSpeed, .Evasion, .Accuracy}) + End With + .FieldEffects.OppBatonPassConfusion = .OppPokemon.HasVolatileStatus(Pokemon.VolatileStatus.Confusion) = True + End If - 'Set the original objects of Pokemon - .OppPokemon.ResetTemp() + 'Set the original objects of Pokemon + .OppPokemon.ResetTemp() - 'Remove volatiles - .OppPokemon.ClearAllVolatiles() + 'Remove volatiles + .OppPokemon.ClearAllVolatiles() - 'Resetting FieldEffects - With .FieldEffects - .OppSleepTurns = 0 - .OppTruantRound = 0 - .OppTaunt = 0 - .OppSmacked = 0 - .OppRageCounter = 0 - .OppUproar = 0 - If .OppUsedBatonPass = False Then .OppFocusEnergy = 0 - .OppEndure = 0 - .OppProtectCounter = 0 - .OppDetectCounter = 0 - .OppKingsShieldCounter = 0 - .OppProtectMovesCount = 0 - If .OppUsedBatonPass = False Then .OppIngrain = 0 - If .OppUsedBatonPass = False Then .OppSubstitute = 0 - If .OppUsedBatonPass = False Then .OppMagnetRise = 0 - If .OppUsedBatonPass = False Then .OppAquaRing = 0 - .OppPoisonCounter = 0 - .OppNightmare = 0 - If .OppUsedBatonPass = False Then .OppCurse = 0 - .OppOutrage = 0 - .OppThrash = 0 - .OppPetalDance = 0 - .OppEncore = 0 - .OppEncoreMove = Nothing - If .OppUsedBatonPass = False Then .OppEmbargo = 0 - .OppYawn = 0 - If .OppUsedBatonPass = False Then .OppPerishSongCount = 0 - .OppConfusionTurns = 0 - .OppTorment = 0 - .OppTormentMove = Nothing - .OppChoiceMove = Nothing - .OppRecharge = 0 - .OppRolloutCounter = 0 - .OppIceBallCounter = 0 - .OppDefenseCurl = 0 - .OppCharge = 0 - .OppSolarBeam = 0 - .OppSolarBlade = 0 - If .OppUsedBatonPass = False Then .OppLeechSeed = 0 - If .OppUsedBatonPass = False Then .OppLockOn = 0 - .OppLansatBerry = 0 - .OppCustapBerry = 0 - .OppTrappedCounter = 0 - .OppFuryCutter = 0 - .OppEchoedVoice = 0 - .OppPokemonTurns = 0 - .OppStockpileCount = 0 - .OppDestinyBond = False - .OppGastroAcid = False + 'Resetting FieldEffects + With .FieldEffects + .OppSleepTurns = 0 + .OppTruantRound = 0 + .OppTaunt = 0 + .OppSmacked = 0 + .OppRageCounter = 0 + .OppUproar = 0 + If .OppUsedBatonPass = False Then .OppFocusEnergy = 0 + .OppEndure = 0 + .OppProtectCounter = 0 + .OppDetectCounter = 0 + .OppKingsShieldCounter = 0 + .OppProtectMovesCount = 0 + If .OppUsedBatonPass = False Then .OppIngrain = 0 + If .OppUsedBatonPass = False Then .OppSubstitute = 0 + If .OppUsedBatonPass = False Then .OppMagnetRise = 0 + If .OppUsedBatonPass = False Then .OppAquaRing = 0 + .OppPoisonCounter = 0 + .OppNightmare = 0 + If .OppUsedBatonPass = False Then .OppCurse = 0 + .OppOutrage = 0 + .OppThrash = 0 + .OppPetalDance = 0 + .OppEncore = 0 + .OppEncoreMove = Nothing + If .OppUsedBatonPass = False Then .OppEmbargo = 0 + .OppYawn = 0 + If .OppUsedBatonPass = False Then .OppPerishSongCount = 0 + .OppConfusionTurns = 0 + .OppTorment = 0 + .OppTormentMove = Nothing + .OppChoiceMove = Nothing + .OppRecharge = 0 + .OppRolloutCounter = 0 + .OppIceBallCounter = 0 + .OppDefenseCurl = 0 + .OppCharge = 0 + .OppSolarBeam = 0 + .OppSolarBlade = 0 + If .OppUsedBatonPass = False Then .OppLeechSeed = 0 + If .OppUsedBatonPass = False Then .OppLockOn = 0 + .OppLansatBerry = 0 + .OppCustapBerry = 0 + .OppTrappedCounter = 0 + .OppFuryCutter = 0 + .OppEchoedVoice = 0 + .OppPokemonTurns = 0 + .OppStockpileCount = 0 + .OppDestinyBond = False + .OppGastroAcid = False - .OppFlyCounter = 0 - .OppDigCounter = 0 - .OppBounceCounter = 0 - .OppDiveCounter = 0 - .OppShadowForceCounter = 0 - .OppPhantomForceCounter = 0 - .OppSkyDropCounter = 0 - .OppGeomancyCounter = 0 - .OppSkyAttackCounter = 0 - .OppRazorWindCounter = 0 - .OppSkullBashCounter = 0 + .OppFlyCounter = 0 + .OppDigCounter = 0 + .OppBounceCounter = 0 + .OppDiveCounter = 0 + .OppShadowForceCounter = 0 + .OppPhantomForceCounter = 0 + .OppSkyDropCounter = 0 + .OppGeomancyCounter = 0 + .OppSkyAttackCounter = 0 + .OppRazorWindCounter = 0 + .OppSkullBashCounter = 0 - .OppForesight = 0 - .OppOdorSleuth = 0 - .OppMiracleEye = 0 + .OppForesight = 0 + .OppOdorSleuth = 0 + .OppMiracleEye = 0 - .OppWrap = 0 - .OppWhirlpool = 0 - .OppBind = 0 - .OppClamp = 0 - .OppFireSpin = 0 - .OppMagmaStorm = 0 - .OppSandTomb = 0 - .OppInfestation = 0 + .OppWrap = 0 + .OppWhirlpool = 0 + .OppBind = 0 + .OppClamp = 0 + .OppFireSpin = 0 + .OppMagmaStorm = 0 + .OppSandTomb = 0 + .OppInfestation = 0 - .OppBideCounter = 0 - .OppBideDamage = 0 + .OppBideCounter = 0 + .OppBideDamage = 0 - .OppRoostUsed = False + .OppRoostUsed = False - 'Own stuff that depends on opp pokemon presence - .OwnTrappedCounter = 0 - .OwnWrap = 0 - .OwnWhirlpool = 0 - .OwnBind = 0 - .OwnClamp = 0 - .OwnFireSpin = 0 - .OwnMagmaStorm = 0 - .OwnSandTomb = 0 - .OwnInfestation = 0 + 'Own stuff that depends on opp pokemon presence + .OwnTrappedCounter = 0 + .OwnWrap = 0 + .OwnWhirlpool = 0 + .OwnBind = 0 + .OwnClamp = 0 + .OwnFireSpin = 0 + .OwnMagmaStorm = 0 + .OwnSandTomb = 0 + .OwnInfestation = 0 - If BattleScreen.OwnPokemon.HasVolatileStatus(Pokemon.VolatileStatus.Infatuation) Then - BattleScreen.OwnPokemon.RemoveVolatileStatus(Pokemon.VolatileStatus.Infatuation) - End If - End With - End With + If BattleScreen.OwnPokemon.HasVolatileStatus(Pokemon.VolatileStatus.Infatuation) Then + BattleScreen.OwnPokemon.RemoveVolatileStatus(Pokemon.VolatileStatus.Infatuation) + End If + End With + End With - BattleScreen.OppPokemon.Ability.SwitchOut(BattleScreen.OppPokemon) + BattleScreen.OppPokemon.Ability.SwitchOut(BattleScreen.OppPokemon) - If BattleScreen.IsTrainerBattle = False Then + If BattleScreen.IsTrainerBattle = False Then ChangeCameraAngle(1, False, BattleScreen) Dim Faint As AnimationQueryObject = New AnimationQueryObject(BattleScreen.OppPokemonNPC, True, BattleScreen.OppPokemonModel) Faint.AnimationPlaySound(CStr(BattleScreen.OppPokemon.Number), 0, 2, False, True) - Faint.AnimationMove(Nothing, False, 0, -1, 0, 0.1, False, False, 2, 0,,, 3) + Faint.AnimationMovePokemonEntity(0, -1, 0, 0.1, False, False, 2, 0,,, 4) BattleScreen.BattleQuery.Add(Faint) BattleScreen.BattleQuery.Add(New ToggleEntityQueryObject(True, ToggleEntityQueryObject.BattleEntities.OppPokemon, 2, -1, -1, -1, -1)) - EndBattle(EndBattleReasons.WinWild, BattleScreen, False) - Else - If BattleScreen.TrainerHasFightablePokemon() = True Then - If BattleScreen.OppPokemon.HP <= 0 Or BattleScreen.OppPokemon.Status = Pokemon.StatusProblems.Fainted Then - GainEXP(BattleScreen) - End If + EndBattle(EndBattleReasons.WinWild, BattleScreen, False) + Else + If BattleScreen.TrainerHasFightablePokemon() = True Then + If BattleScreen.OppPokemon.HP <= 0 Or BattleScreen.OppPokemon.Status = Pokemon.StatusProblems.Fainted Then + GainEXP(BattleScreen) + End If If BattleScreen.IsRemoteBattle And BattleScreen.OppFaint Then - 'Next pokemon is selected by the opponent. - Else - SwitchInOpp(BattleScreen, False, index) - End If - Else - GainEXP(BattleScreen) + 'Next pokemon is selected by the opponent. + Else + SwitchInOpp(BattleScreen, False, index) + End If + Else + GainEXP(BattleScreen) If message = "" Then - message = BattleScreen.Trainer.Name & ": ""Come back, " & BattleScreen.OppPokemon.GetDisplayName() & "!""" - End If + message = BattleScreen.Trainer.Name & ": ""Come back, " & BattleScreen.OppPokemon.GetDisplayName() & "!""" + End If - BattleScreen.BattleQuery.Add(New TextQueryObject(message)) + BattleScreen.BattleQuery.Add(New TextQueryObject(message)) Dim BallReturn As AnimationQueryObject = New AnimationQueryObject(BattleScreen.OppPokemonNPC, True, BattleScreen.OppPokemonModel) @@ -7170,57 +7138,56 @@ Dim SmokePosition = New Vector3(CSng(Random.Next(-10, 10) / 10), CSng(Random.Next(-10, 10) / 10), CSng(Random.Next(-10, 10) / 10)) Dim SmokeDestination = New Vector3(0, 0, 0) - Dim SmokeTexture As Texture2D = TextureManager.GetTexture("Textures\Battle\Smoke") + Dim SmokeTexture As String = "Textures\Battle\Cloud" Dim SmokeScale = New Vector3(CSng(Random.Next(2, 6) / 10)) Dim SmokeSpeed = CSng(Random.Next(1, 3) / 10.0F) - Dim SmokeEntity = BallReturn.SpawnEntity(SmokePosition, SmokeTexture, SmokeScale, 1) - BallReturn.AnimationMove(SmokeEntity, True, SmokeDestination.X, SmokeDestination.Y, SmokeDestination.Z, SmokeSpeed, False, False, 0.0F, 0.0F) + + BallReturn.AnimationSpawnMovingEntity(SmokePosition.X, SmokePosition.Y, SmokePosition.Z, SmokeTexture, SmokeScale.X, SmokeScale.Y, SmokeScale.Z, SmokeDestination.X, SmokeDestination.Y, SmokeDestination.Z, SmokeSpeed, False, False, 0.0F, 0.0F) Threading.Interlocked.Increment(SmokeReturned) Loop While SmokeReturned <= 38 ' Pokemon disappears - BallReturn.AnimationFade(Nothing, False, 1, False, 0, 1, 0) - BallReturn.AnimationMove(Nothing, False, 0, 0.5, 0, 0.5, False, False, 2, 0,,, 4) + BallReturn.AnimationFadePokemonEntity(1, False, 0, 1, 0) + BallReturn.AnimationMovePokemonEntity(0, 0.5, 0, 0.5, False, False, 2, 0,,, 4) ' Ball returns BallReturn.AnimationPlaySound("Battle\Pokeball\Throw", 1, 0) - Dim BallReturnEntity = BallReturn.SpawnEntity(New Vector3(0, 0, 0), TextureManager.GetTexture(BattleScreen.OppPokemon.CatchBall.TextureSource), New Vector3(0.3F), 1.0F) - BallReturn.AnimationMove(BallReturnEntity, True, -2, 0, 0, 0.1, False, True, 0F, 0F,, 0.3) + BallReturn.AnimationSpawnMovingEntity(0, 0, 0, BattleScreen.OppPokemon.CatchBall.TextureSource, 0.3F, 0.3F, 0.3F, -2, 0, 0, 0.1, False, True, 1, 0,, 0.3) BattleScreen.BattleQuery.Add(BallReturn) EndBattle(EndBattleReasons.WinTrainer, BattleScreen, False) - If BattleScreen.IsRemoteBattle = True Then - EndBattle(EndBattleReasons.WinTrainer, BattleScreen, True) - End If - End If - End If - End Sub + If BattleScreen.IsRemoteBattle = True Then + EndBattle(EndBattleReasons.WinTrainer, BattleScreen, True) + End If + End If + End If + End Sub - Public Sub ApplyOppBatonPass(ByVal BattleScreen As BattleScreen) - If BattleScreen.FieldEffects.OppUsedBatonPass = True Then - BattleScreen.FieldEffects.OppUsedBatonPass = False + Public Sub ApplyOppBatonPass(ByVal BattleScreen As BattleScreen) + If BattleScreen.FieldEffects.OppUsedBatonPass = True Then + BattleScreen.FieldEffects.OppUsedBatonPass = False - BattleScreen.OppPokemon.StatAttack = BattleScreen.FieldEffects.OppBatonPassStats(0) - BattleScreen.OppPokemon.StatDefense = BattleScreen.FieldEffects.OppBatonPassStats(1) - BattleScreen.OppPokemon.StatSpAttack = BattleScreen.FieldEffects.OppBatonPassStats(2) - BattleScreen.OppPokemon.StatSpDefense = BattleScreen.FieldEffects.OppBatonPassStats(3) - BattleScreen.OppPokemon.StatSpeed = BattleScreen.FieldEffects.OppBatonPassStats(4) - BattleScreen.OppPokemon.Evasion = BattleScreen.FieldEffects.OppBatonPassStats(5) - BattleScreen.OppPokemon.Accuracy = BattleScreen.FieldEffects.OppBatonPassStats(6) + BattleScreen.OppPokemon.StatAttack = BattleScreen.FieldEffects.OppBatonPassStats(0) + BattleScreen.OppPokemon.StatDefense = BattleScreen.FieldEffects.OppBatonPassStats(1) + BattleScreen.OppPokemon.StatSpAttack = BattleScreen.FieldEffects.OppBatonPassStats(2) + BattleScreen.OppPokemon.StatSpDefense = BattleScreen.FieldEffects.OppBatonPassStats(3) + BattleScreen.OppPokemon.StatSpeed = BattleScreen.FieldEffects.OppBatonPassStats(4) + BattleScreen.OppPokemon.Evasion = BattleScreen.FieldEffects.OppBatonPassStats(5) + BattleScreen.OppPokemon.Accuracy = BattleScreen.FieldEffects.OppBatonPassStats(6) - If BattleScreen.FieldEffects.OppBatonPassConfusion = True Then - BattleScreen.FieldEffects.OppBatonPassConfusion = False - BattleScreen.OppPokemon.AddVolatileStatus(Pokemon.VolatileStatus.Confusion) - End If - End If - End Sub + If BattleScreen.FieldEffects.OppBatonPassConfusion = True Then + BattleScreen.FieldEffects.OppBatonPassConfusion = False + BattleScreen.OppPokemon.AddVolatileStatus(Pokemon.VolatileStatus.Confusion) + End If + End If + End Sub - Public Sub SwitchInOpp(ByVal BattleScreen As BattleScreen, ByVal FirstTime As Boolean, ByVal index As Integer) + Public Sub SwitchInOpp(ByVal BattleScreen As BattleScreen, ByVal FirstTime As Boolean, ByVal index As Integer) - If FirstTime = False Then - HasSwitchedInOpp = True + If FirstTime = False Then + HasSwitchedInOpp = True BattleScreen.BattleQuery.Add(New TextQueryObject(BattleScreen.Trainer.Name & ": ""Come back, " & BattleScreen.OppPokemon.GetDisplayName() & "!""")) Dim BallReturn As AnimationQueryObject = New AnimationQueryObject(BattleScreen.OppPokemonNPC, True, BattleScreen.OppPokemonModel) @@ -7232,249 +7199,246 @@ Dim SmokePosition = New Vector3(CSng(Random.Next(-10, 10) / 10), CSng(Random.Next(-10, 10) / 10), CSng(Random.Next(-10, 10) / 10)) Dim SmokeDestination = New Vector3(0, 0, 0) - Dim SmokeTexture As Texture2D = TextureManager.GetTexture("Textures\Battle\Smoke") + Dim SmokeTexture As String = "Textures\Battle\Cloud" Dim SmokeScale = New Vector3(CSng(Random.Next(2, 6) / 10)) Dim SmokeSpeed = CSng(Random.Next(1, 3) / 10.0F) - Dim SmokeEntity = BallReturn.SpawnEntity(SmokePosition, SmokeTexture, SmokeScale, 1) - BallReturn.AnimationMove(SmokeEntity, True, SmokeDestination.X, SmokeDestination.Y, SmokeDestination.Z, SmokeSpeed, False, False, 0.0F, 0.0F) + + BallReturn.AnimationSpawnMovingEntity(SmokePosition.X, SmokePosition.Y, SmokePosition.Z, SmokeTexture, SmokeScale.X, SmokeScale.Y, SmokeScale.Z, SmokeDestination.X, SmokeDestination.Y, SmokeDestination.Z, SmokeSpeed, False, False, 0.0F, 0.0F) Threading.Interlocked.Increment(SmokeReturned) Loop While SmokeReturned <= 38 ' Pokemon disappears - BallReturn.AnimationFade(Nothing, False, 1, False, 0, 1, 0) - BallReturn.AnimationMove(Nothing, False, 0, 0.5, 0, 0.5, False, False, 2, 0,,, 4) + BallReturn.AnimationFadePokemonEntity(1, False, 0, 1, 0) + BallReturn.AnimationMovePokemonEntity(0, 0.5, 0, 0.5, False, False, 2, 0,,, 4) ' Ball returns BallReturn.AnimationPlaySound("Battle\Pokeball\Throw", 1, 0) - Dim BallReturnEntity = BallReturn.SpawnEntity(New Vector3(0, 0, 0), TextureManager.GetTexture(BattleScreen.OppPokemon.CatchBall.TextureSource), New Vector3(0.3F), 1.0F) - BallReturn.AnimationMove(BallReturnEntity, True, -2, 0, 0, 0.1, False, True, 0F, 0F,, 0.3) + BallReturn.AnimationSpawnMovingEntity(0, 0, 0, BattleScreen.OppPokemon.CatchBall.TextureSource, 0.3F, 0.3F, 0.3F, -2, 0, 0, 0.1, False, True, 1, 0,, 0.3) BattleScreen.BattleQuery.Add(BallReturn) BattleScreen.SendInNewTrainerPokemon(index) - Me.ApplyOppBatonPass(BattleScreen) + Me.ApplyOppBatonPass(BattleScreen) - If BattleScreen.ParticipatedPokemon.Contains(BattleScreen.OwnPokemonIndex) = False Then - BattleScreen.ParticipatedPokemon.Add(BattleScreen.OwnPokemonIndex) - End If + If BattleScreen.ParticipatedPokemon.Contains(BattleScreen.OwnPokemonIndex) = False Then + BattleScreen.ParticipatedPokemon.Add(BattleScreen.OwnPokemonIndex) + End If - Dim oppShiny As String = "N" - If BattleScreen.OppPokemon.IsShiny = True Then - oppShiny = "S" - End If + Dim oppShiny As String = "N" + If BattleScreen.OppPokemon.IsShiny = True Then + oppShiny = "S" + End If - Dim oppModel As String = BattleScreen.GetModelName(False) + Dim oppModel As String = BattleScreen.GetModelName(False) - If oppModel = "" Then - BattleScreen.BattleQuery.Add(New ToggleEntityQueryObject(True, ToggleEntityQueryObject.BattleEntities.OppPokemon, PokemonForms.GetOverworldSpriteName(BattleScreen.OppPokemon), -1, -1, 0, 1)) - Else - BattleScreen.BattleQuery.Add(New ToggleEntityQueryObject(False, oppModel, -1, -1, 1, 0)) - End If + If oppModel = "" Then + BattleScreen.BattleQuery.Add(New ToggleEntityQueryObject(True, ToggleEntityQueryObject.BattleEntities.OppPokemon, PokemonForms.GetOverworldSpriteName(BattleScreen.OppPokemon), -1, -1, 0, 1)) + Else + BattleScreen.BattleQuery.Add(New ToggleEntityQueryObject(False, oppModel, -1, -1, 1, 0)) + End If - BattleScreen.BattleQuery.Add(New ToggleEntityQueryObject(True, ToggleEntityQueryObject.BattleEntities.OppPokemon, 1, -1, -1, -1, -1)) + BattleScreen.BattleQuery.Add(New ToggleEntityQueryObject(True, ToggleEntityQueryObject.BattleEntities.OppPokemon, 1, -1, -1, -1, -1)) BattleScreen.BattleQuery.Add(New TextQueryObject(BattleScreen.Trainer.Name & ": ""Go, " & BattleScreen.OppPokemon.GetDisplayName() & "!""")) ' Ball is thrown Dim BallThrow As AnimationQueryObject = New AnimationQueryObject(BattleScreen.OppPokemonNPC, True, BattleScreen.OppPokemonModel) BallThrow.AnimationPlaySound("Battle\Pokeball\Throw", 0, 0) - Dim BallThrowEntity = BallThrow.SpawnEntity(New Vector3(-2, -0.15, 0), TextureManager.GetTexture(BattleScreen.OwnPokemon.CatchBall.TextureSource), New Vector3(0.3F), 1.0F) - BallThrow.AnimationMove(BallThrowEntity, True, 0, 0.35, 0, 0.1, False, True, 0F, 0F,, 0.3) + BallThrow.AnimationSpawnMovingEntity(-2, -0.15, 0, BattleScreen.OwnPokemon.CatchBall.TextureSource, 0.3F, 0.3F, 0.3F, 0, 0.35, 0, 0.1, False, True, 0F, 0F,, 0.3) - ' Ball opens + ' Ball Opens BallThrow.AnimationPlaySound("Battle\Pokeball\Open", 3, 0) Dim SmokeSpawned As Integer = 0 Do Dim SmokePosition = New Vector3(0, 0.35, 0) Dim SmokeDestination = New Vector3(CSng(Random.Next(-10, 10) / 10), CSng(Random.Next(-10, 10) / 10), CSng(Random.Next(-10, 10) / 10)) - Dim SmokeTexture As Texture2D = TextureManager.GetTexture("Textures\Battle\Smoke") + Dim SmokeTexture As String = "Textures\Battle\Cloud" Dim SmokeScale = New Vector3(CSng(Random.Next(2, 6) / 10)) Dim SmokeSpeed = CSng(Random.Next(1, 3) / 10.0F) - Dim SmokeEntity = BallReturn.SpawnEntity(SmokePosition, SmokeTexture, SmokeScale, 1) - BallThrow.AnimationMove(SmokeEntity, True, SmokeDestination.X, SmokeDestination.Y, SmokeDestination.Z, SmokeSpeed, False, False, 3.0F, 0.0F) + BallThrow.AnimationSpawnMovingEntity(SmokePosition.X, SmokePosition.Y, SmokePosition.Z, SmokeTexture, SmokeScale.X, SmokeScale.Y, SmokeScale.Z, SmokeDestination.X, SmokeDestination.Y, SmokeDestination.Z, SmokeSpeed, False, False, 3.0F, 0.0F) Threading.Interlocked.Increment(SmokeSpawned) Loop While SmokeSpawned <= 38 ' Pokemon appears - BallThrow.AnimationFade(Nothing, False, 1, True, 1, 4, 0) + BallThrow.AnimationFadePokemonEntity(1, True, 1, 4, 0) BallThrow.AnimationPlaySound(CStr(BattleScreen.OppPokemon.Number), 4, 0,, True) ' Pokémon falls down - BallThrow.AnimationMove(Nothing, False, 0, 0, 0, 0.05F, False, False, 4, 0,,, 4) + BallThrow.AnimationMovePokemonEntity(0, 0, 0, 0.05F, False, False, 4, 0,,, 4) BattleScreen.BattleQuery.Add(BallThrow) End If - With BattleScreen - Dim p As Pokemon = .OppPokemon - Dim op As Pokemon = .OwnPokemon + With BattleScreen + Dim p As Pokemon = .OppPokemon + Dim op As Pokemon = .OwnPokemon - Dim spikeAffected As Boolean = True - Dim rockAffected As Boolean = True + Dim spikeAffected As Boolean = True + Dim rockAffected As Boolean = True - spikeAffected = BattleScreen.FieldEffects.IsGrounded(False, BattleScreen) + spikeAffected = BattleScreen.FieldEffects.IsGrounded(False, BattleScreen) - If spikeAffected = True Then - If .FieldEffects.OwnSpikes > 0 And p.Ability.Name.ToLower() <> "magic guard" Then - Dim spikeDamage As Double = 1D - Select Case .FieldEffects.OwnSpikes - Case 1 - spikeDamage = (p.MaxHP / 100) * 12.5D - Case 2 - spikeDamage = (p.MaxHP / 100) * 16.7D - Case 3 - spikeDamage = (p.MaxHP / 100) * 25D - End Select - ReduceHP(CInt(spikeDamage), False, True, BattleScreen, "The Spikes hurt " & p.GetDisplayName() & "!", "spikes") - End If - End If - 'Sticky Web - If spikeAffected = True Then - If .FieldEffects.OwnStickyWeb > 0 Then + If spikeAffected = True Then + If .FieldEffects.OwnSpikes > 0 And p.Ability.Name.ToLower() <> "magic guard" Then + Dim spikeDamage As Double = 1D + Select Case .FieldEffects.OwnSpikes + Case 1 + spikeDamage = (p.MaxHP / 100) * 12.5D + Case 2 + spikeDamage = (p.MaxHP / 100) * 16.7D + Case 3 + spikeDamage = (p.MaxHP / 100) * 25D + End Select + ReduceHP(CInt(spikeDamage), False, True, BattleScreen, "The Spikes hurt " & p.GetDisplayName() & "!", "spikes") + End If + End If + 'Sticky Web + If spikeAffected = True Then + If .FieldEffects.OwnStickyWeb > 0 Then - LowerStat(False, False, BattleScreen, "Speed", 1, "The opposing pokemon was caught in a Sticky Web!", "stickyweb") + LowerStat(False, False, BattleScreen, "Speed", 1, "The opposing pokemon was caught in a Sticky Web!", "stickyweb") - End If - End If - If spikeAffected = True Then - If .FieldEffects.OwnToxicSpikes > 0 And p.Status = Pokemon.StatusProblems.None And p.Type1.Type <> Element.Types.Poison And p.Type2.Type <> Element.Types.Poison Then - Select Case .FieldEffects.OwnToxicSpikes - Case 1 - InflictPoison(False, True, BattleScreen, False, "The Toxic Spikes hurt " & p.GetDisplayName() & "!", "toxicspikes") - Case 2 - InflictPoison(False, True, BattleScreen, True, "The Toxic Spikes hurt " & p.GetDisplayName() & "!", "toxicspikes") - End Select - End If - If .FieldEffects.OwnToxicSpikes > 0 Then - If p.Type1.Type = Element.Types.Poison Or p.Type2.Type = Element.Types.Poison Then - .BattleQuery.Add(New TextQueryObject(p.GetDisplayName() & " removed the Toxic Spikes!")) - .FieldEffects.OwnToxicSpikes = 0 - End If - End If - End If + End If + End If + If spikeAffected = True Then + If .FieldEffects.OwnToxicSpikes > 0 And p.Status = Pokemon.StatusProblems.None And p.Type1.Type <> Element.Types.Poison And p.Type2.Type <> Element.Types.Poison Then + Select Case .FieldEffects.OwnToxicSpikes + Case 1 + InflictPoison(False, True, BattleScreen, False, "The Toxic Spikes hurt " & p.GetDisplayName() & "!", "toxicspikes") + Case 2 + InflictPoison(False, True, BattleScreen, True, "The Toxic Spikes hurt " & p.GetDisplayName() & "!", "toxicspikes") + End Select + End If + If .FieldEffects.OwnToxicSpikes > 0 Then + If p.Type1.Type = Element.Types.Poison Or p.Type2.Type = Element.Types.Poison Then + .BattleQuery.Add(New TextQueryObject(p.GetDisplayName() & " removed the Toxic Spikes!")) + .FieldEffects.OwnToxicSpikes = 0 + End If + End If + End If - If rockAffected = True Then - If .FieldEffects.OwnStealthRock > 0 And p.Ability.Name.ToLower() <> "magic guard" Then - Dim rocksDamage As Double = 1D + If rockAffected = True Then + If .FieldEffects.OwnStealthRock > 0 And p.Ability.Name.ToLower() <> "magic guard" Then + Dim rocksDamage As Double = 1D - Dim effectiveness As Single = BattleCalculation.ReverseTypeEffectiveness(Element.GetElementMultiplier(New Element(Element.Types.Rock), p.Type1)) * BattleCalculation.ReverseTypeEffectiveness(Element.GetElementMultiplier(New Element(Element.Types.Rock), p.Type2)) - Select Case effectiveness - Case 0.25F - rocksDamage = (p.MaxHP / 100) * 3.125D - Case 0.5F - rocksDamage = (p.MaxHP / 100) * 6.25D - Case 1.0F - rocksDamage = (p.MaxHP / 100) * 12.5D - Case 2.0F - rocksDamage = (p.MaxHP / 100) * 25D - Case 4.0F - rocksDamage = (p.MaxHP / 100) * 50D - End Select + Dim effectiveness As Single = BattleCalculation.ReverseTypeEffectiveness(Element.GetElementMultiplier(New Element(Element.Types.Rock), p.Type1)) * BattleCalculation.ReverseTypeEffectiveness(Element.GetElementMultiplier(New Element(Element.Types.Rock), p.Type2)) + Select Case effectiveness + Case 0.25F + rocksDamage = (p.MaxHP / 100) * 3.125D + Case 0.5F + rocksDamage = (p.MaxHP / 100) * 6.25D + Case 1.0F + rocksDamage = (p.MaxHP / 100) * 12.5D + Case 2.0F + rocksDamage = (p.MaxHP / 100) * 25D + Case 4.0F + rocksDamage = (p.MaxHP / 100) * 50D + End Select - ReduceHP(CInt(rocksDamage), False, True, BattleScreen, "The Stealth Rocks hurt " & p.GetDisplayName() & "!", "stealthrocks") - End If - End If + ReduceHP(CInt(rocksDamage), False, True, BattleScreen, "The Stealth Rocks hurt " & p.GetDisplayName() & "!", "stealthrocks") + End If + End If - TriggerAbilityEffect(BattleScreen, False) - TriggerItemEffect(BattleScreen, False) + TriggerAbilityEffect(BattleScreen, False) + TriggerItemEffect(BattleScreen, False) - If .OppPokemon.Status = Pokemon.StatusProblems.Sleep Then - .FieldEffects.OppSleepTurns = Core.Random.Next(1, 4) - End If + If .OppPokemon.Status = Pokemon.StatusProblems.Sleep Then + .FieldEffects.OppSleepTurns = Core.Random.Next(1, 4) + End If - If BattleScreen.FieldEffects.OppHealingWish = True Then - BattleScreen.FieldEffects.OppHealingWish = False + If BattleScreen.FieldEffects.OppHealingWish = True Then + BattleScreen.FieldEffects.OppHealingWish = False - If .OppPokemon.HP < .OppPokemon.MaxHP Or .OppPokemon.Status <> Pokemon.StatusProblems.None Then - GainHP(.OppPokemon.MaxHP - .OppPokemon.HP, False, False, BattleScreen, "The Healing Wish came true for " & .OppPokemon.GetDisplayName() & "!", "move:healingwish") - CureStatusProblem(False, False, BattleScreen, "", "move:healingwish") - End If - End If - End With - End Sub + If .OppPokemon.HP < .OppPokemon.MaxHP Or .OppPokemon.Status <> Pokemon.StatusProblems.None Then + GainHP(.OppPokemon.MaxHP - .OppPokemon.HP, False, False, BattleScreen, "The Healing Wish came true for " & .OppPokemon.GetDisplayName() & "!", "move:healingwish") + CureStatusProblem(False, False, BattleScreen, "", "move:healingwish") + End If + End If + End With + End Sub #End Region #Region "EndBattle" - Enum EndBattleReasons - WinWild - LoseWild - WinTrainer - LoseTrainer - WinPvP - LosePvP - End Enum + Enum EndBattleReasons + WinWild + LoseWild + WinTrainer + LoseTrainer + WinPvP + LosePvP + End Enum - Public Sub EndBattle(ByVal reason As EndBattleReasons, ByVal BattleScreen As BattleScreen, ByVal AddPVP As Boolean) - BattleScreen.OwnFaint = False - BattleScreen.OppFaint = False - IsAfterFaint = False - If AddPVP = True Then - Select Case reason - Case EndBattleReasons.WinTrainer 'Lost - Dim q As New CameraQueryObject(New Vector3(12, 0, 13), Screen.Camera.Position, 0.03F, 0.03F, (MathHelper.Pi * 0.5F), Screen.Camera.Yaw, 0.0F, Screen.Camera.Pitch, 0.02F, 0.02F) - q.ApplyCurrentCamera = True - BattleScreen.TempPVPBattleQuery.Add(BattleScreen.BattleQuery.Count - 5, q) + Public Sub EndBattle(ByVal reason As EndBattleReasons, ByVal BattleScreen As BattleScreen, ByVal AddPVP As Boolean) + BattleScreen.OwnFaint = False + BattleScreen.OppFaint = False + IsAfterFaint = False + If AddPVP = True Then + Select Case reason + Case EndBattleReasons.WinTrainer 'Lost + Dim q As New CameraQueryObject(New Vector3(12, 0, 13), Screen.Camera.Position, 0.03F, 0.03F, (MathHelper.Pi * 0.5F), Screen.Camera.Yaw, 0.0F, Screen.Camera.Pitch, 0.02F, 0.02F) + q.ApplyCurrentCamera = True + BattleScreen.TempPVPBattleQuery.Add(BattleScreen.BattleQuery.Count - 5, q) - BattleScreen.TempPVPBattleQuery.Add(BattleScreen.BattleQuery.Count - 4, New TextQueryObject("You lost the battle!")) - BattleScreen.TempPVPBattleQuery.Add(BattleScreen.BattleQuery.Count - 3, New TextQueryObject("")) - BattleScreen.TempPVPBattleQuery.Add(BattleScreen.BattleQuery.Count - 2, New TextQueryObject("")) + BattleScreen.TempPVPBattleQuery.Add(BattleScreen.BattleQuery.Count - 4, New TextQueryObject("You lost the battle!")) + BattleScreen.TempPVPBattleQuery.Add(BattleScreen.BattleQuery.Count - 3, New TextQueryObject("")) + BattleScreen.TempPVPBattleQuery.Add(BattleScreen.BattleQuery.Count - 2, New TextQueryObject("")) - BattleScreen.TempPVPBattleQuery.Add(BattleScreen.BattleQuery.Count - 1, New EndBattleQueryObject(True)) - Case EndBattleReasons.LoseTrainer 'Won - Dim q As New CameraQueryObject(New Vector3(15, 0, 13), Screen.Camera.Position, 0.03F, 0.03F, -(MathHelper.Pi * 0.5F), Screen.Camera.Yaw, 0.0F, Screen.Camera.Pitch, 0.02F, 0.02F) - q.ApplyCurrentCamera = True - BattleScreen.TempPVPBattleQuery.Add(BattleScreen.BattleQuery.Count - 3, q) + BattleScreen.TempPVPBattleQuery.Add(BattleScreen.BattleQuery.Count - 1, New EndBattleQueryObject(True)) + Case EndBattleReasons.LoseTrainer 'Won + Dim q As New CameraQueryObject(New Vector3(15, 0, 13), Screen.Camera.Position, 0.03F, 0.03F, -(MathHelper.Pi * 0.5F), Screen.Camera.Yaw, 0.0F, Screen.Camera.Pitch, 0.02F, 0.02F) + q.ApplyCurrentCamera = True + BattleScreen.TempPVPBattleQuery.Add(BattleScreen.BattleQuery.Count - 3, q) - BattleScreen.TempPVPBattleQuery.Add(BattleScreen.BattleQuery.Count - 2, New TextQueryObject("Pokémon Trainer " & Core.Player.Name & " was defeated!")) + BattleScreen.TempPVPBattleQuery.Add(BattleScreen.BattleQuery.Count - 2, New TextQueryObject("Pokémon Trainer " & Core.Player.Name & " was defeated!")) - BattleScreen.TempPVPBattleQuery.Add(BattleScreen.BattleQuery.Count - 1, New EndBattleQueryObject(True)) - End Select - Else - Select Case reason - Case EndBattleReasons.WinWild - Won = True - Core.Player.AddPoints(1, "Won against wild Pokémon.") + BattleScreen.TempPVPBattleQuery.Add(BattleScreen.BattleQuery.Count - 1, New EndBattleQueryObject(True)) + End Select + Else + Select Case reason + Case EndBattleReasons.WinWild + Won = True + Core.Player.AddPoints(1, "Won against wild Pokémon.") - BattleScreen.BattleQuery.Add(New PlayMusicQueryObject("wild_defeat")) - ChangeCameraAngle(1, True, BattleScreen) + BattleScreen.BattleQuery.Add(New PlayMusicQueryObject("wild_defeat")) + ChangeCameraAngle(1, True, BattleScreen) - GainEXP(BattleScreen) + GainEXP(BattleScreen) - If BattleScreen.FieldEffects.OwnPayDayCounter > 0 Then - Core.Player.Money += BattleScreen.FieldEffects.OwnPayDayCounter - BattleScreen.BattleQuery.Add(New TextQueryObject(Core.Player.Name & " picked up $" & BattleScreen.FieldEffects.OwnPayDayCounter & "!")) - End If + If BattleScreen.FieldEffects.OwnPayDayCounter > 0 Then + Core.Player.Money += BattleScreen.FieldEffects.OwnPayDayCounter + BattleScreen.BattleQuery.Add(New TextQueryObject(Core.Player.Name & " picked up $" & BattleScreen.FieldEffects.OwnPayDayCounter & "!")) + End If - BattleScreen.BattleQuery.Add(New EndBattleQueryObject(False)) - Case EndBattleReasons.WinTrainer - Won = True - Core.Player.AddPoints(3, "Won against trainer.") + BattleScreen.BattleQuery.Add(New EndBattleQueryObject(False)) + Case EndBattleReasons.WinTrainer + Won = True + Core.Player.AddPoints(3, "Won against trainer.") - Core.Player.Money += BattleScreen.GetTrainerMoney() + Core.Player.Money += BattleScreen.GetTrainerMoney() - BattleScreen.BattleQuery.Add(New PlayMusicQueryObject(BattleScreen.Trainer.GetDefeatMusic())) + BattleScreen.BattleQuery.Add(New PlayMusicQueryObject(BattleScreen.Trainer.GetDefeatMusic())) - Dim q As New CameraQueryObject(New Vector3(15, 0, 13), Screen.Camera.Position, 0.03F, 0.03F, -(MathHelper.Pi * 0.5F), Screen.Camera.Yaw, 0.0F, Screen.Camera.Pitch, 0.04F, 0.02F) - q.ApplyCurrentCamera = True - BattleScreen.BattleQuery.Add(q) + Dim q As New CameraQueryObject(New Vector3(15, 0, 13), Screen.Camera.Position, 0.03F, 0.03F, -(MathHelper.Pi * 0.5F), Screen.Camera.Yaw, 0.0F, Screen.Camera.Pitch, 0.04F, 0.02F) + q.ApplyCurrentCamera = True + BattleScreen.BattleQuery.Add(q) - BattleScreen.BattleQuery.Add(New TextQueryObject(BattleScreen.Trainer.TrainerType & " " & BattleScreen.Trainer.Name & " was defeated!")) - BattleScreen.BattleQuery.Add(New TextQueryObject(BattleScreen.Trainer.OutroMessage)) + BattleScreen.BattleQuery.Add(New TextQueryObject(BattleScreen.Trainer.TrainerType & " " & BattleScreen.Trainer.Name & " was defeated!")) + BattleScreen.BattleQuery.Add(New TextQueryObject(BattleScreen.Trainer.OutroMessage)) - If BattleScreen.GetTrainerMoney() > 0 Then - BattleScreen.BattleQuery.Add(New TextQueryObject(Core.Player.Name & " got $" & BattleScreen.GetTrainerMoney() & "!")) - End If + If BattleScreen.GetTrainerMoney() > 0 Then + BattleScreen.BattleQuery.Add(New TextQueryObject(Core.Player.Name & " got $" & BattleScreen.GetTrainerMoney() & "!")) + End If - BattleScreen.BattleQuery.Add(New EndBattleQueryObject(False)) - Case EndBattleReasons.LoseTrainer, EndBattleReasons.LoseWild - Won = False + BattleScreen.BattleQuery.Add(New EndBattleQueryObject(False)) + Case EndBattleReasons.LoseTrainer, EndBattleReasons.LoseWild + Won = False Dim q As New CameraQueryObject(New Vector3(12, 0, 13), Screen.Camera.Position, 0.03F, 0.03F, (MathHelper.Pi * 0.5F), Screen.Camera.Yaw, 0.0F, Screen.Camera.Pitch, 0.02F, 0.02F) q.ApplyCurrentCamera = True BattleScreen.BattleQuery.Add(q) diff --git a/P3D/Pokemon/Attacks/Fire/Ember.vb b/P3D/Pokemon/Attacks/Fire/Ember.vb index 1356505d9..bb5fae6fe 100644 --- a/P3D/Pokemon/Attacks/Fire/Ember.vb +++ b/P3D/Pokemon/Attacks/Fire/Ember.vb @@ -65,14 +65,10 @@ Public Overrides Sub InternalUserPokemonMoveAnimation(ByVal BattleScreen As BattleScreen, ByVal own As Boolean, ByVal CurrentPokemon As Pokemon, ByVal CurrentEntity As NPC, ByVal CurrentModel As ModelEntity) Dim MoveAnimation As AnimationQueryObject = New AnimationQueryObject(CurrentEntity, own) - Dim FireballEntity As Entity = MoveAnimation.SpawnEntity(New Vector3(0.0, 0.0, 0.0), TextureManager.GetTexture("Textures\Battle\Fire\FireBall"), New Vector3(0.5F), 1.0F) - - MoveAnimation.AnimationMove(FireballEntity, True, 2.0, 0.0, 0.0, 0.05, False, True, 0.0, 0.0,, -0.5, 0) - MoveAnimation.AnimationPlaySound("Battle\Attacks\Fire\Ember_Start", 0, 0) + MoveAnimation.AnimationSpawnMovingEntity(0.0, 0, 0.0, "Textures\Battle\Fire\FireBall", 0.5, 0.5, 0.5, 2.0, 0.0, 0.0, 0.05, False, True, 0.0, 0.0,, -0.5, 0) + MoveAnimation.AnimationPlaySound("Battle\Attacks\Ember_Start", 0, 0) For i = 0 To 12 - Dim SmokeEntity = MoveAnimation.SpawnEntity(New Vector3(CSng(i * 0.2), 0.0, 0.0), TextureManager.GetTexture("Textures\Battle\Fire\Smoke"), New Vector3(0.2), 1) - MoveAnimation.AnimationFade(SmokeEntity, True, 0.02, False, 0.0, CSng(i * 0.2), 0.0) - + MoveAnimation.AnimationSpawnFadingEntity(CSng(i * 0.2), 0.0, 0.0, "Textures\Battle\Fire\Smoke", 0.2, 0.2, 0.2, 0.02, False, 0.0, CSng(i * 0.2), 0.0) i += 1 Next BattleScreen.BattleQuery.Add(MoveAnimation) @@ -80,37 +76,32 @@ Public Overrides Sub InternalOpponentPokemonMoveAnimation(ByVal BattleScreen As BattleScreen, ByVal own As Boolean, ByVal CurrentPokemon As Pokemon, ByVal CurrentEntity As NPC, ByVal CurrentModel As ModelEntity) Dim MoveAnimation As AnimationQueryObject = New AnimationQueryObject(CurrentEntity, own) - Dim FireballEntity As Entity = MoveAnimation.SpawnEntity(New Vector3(2.0, 0.0, 0.0), TextureManager.GetTexture("Textures\Battle\Fire\FireBall"), New Vector3(0.5F), 1.0F) - - MoveAnimation.AnimationMove(FireballEntity, True, 0.0, 0.0, 0.0, 0.05, False, True, 0.0, 0.0,, -0.5, 0) + MoveAnimation.AnimationSpawnMovingEntity(2.0, 0, 0.0, "Textures\Battle\Fire\FireBall", 0.5, 0.5, 0.5, 0.0, 0.0, 0.0, 0.05, False, True, 0.0, 0.0, 0.1, 0.5, 0) For i = 0 To 12 - Dim SmokeEntity = MoveAnimation.SpawnEntity(New Vector3(CSng(3.0 - i * 0.2), 0.0, 0.0), TextureManager.GetTexture("Textures\Battle\Fire\Smoke"), New Vector3(0.2), 1) - MoveAnimation.AnimationFade(SmokeEntity, True, 0.02, False, 0.0, CSng(i * 0.2), 0.0) - + MoveAnimation.AnimationSpawnFadingEntity(CSng(3.0 - i * 0.2), 0.0, 0.0, "Textures\Battle\Fire\Smoke", 0.2, 0.2, 0.2, 0.02, False, 0.0, CSng(i * 0.2), 0.0) i += 1 Next - MoveAnimation.AnimationPlaySound("Battle\Attacks\Fire\Ember_Hit", 2, 0) + MoveAnimation.AnimationPlaySound("Battle\Attacks\Ember_Hit", 2, 0) + MoveAnimation.AnimationSpawnFadingEntity(-0.25, -0.25, -0.25, "Textures\Battle\Fire\Ember,0,0,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 1, 1) + MoveAnimation.AnimationSpawnFadingEntity(0.25, -0.25, 0.25, "Textures\Battle\Fire\Ember,0,0,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 1, 1) + MoveAnimation.AnimationSpawnFadingEntity(0.25, -0.25, -0.25, "Textures\Battle\Fire\Ember,0,0,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 1, 1) - Dim FireEntity1 As Entity = MoveAnimation.SpawnEntity(New Vector3(-0.25, -0.25, -0.25), TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 0, 32, 32), ""), New Vector3(0.5F), 1, 1, 1) - Dim FireEntity2 As Entity = MoveAnimation.SpawnEntity(New Vector3(0.25, -0.25, 0.25), TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 0, 32, 32), ""), New Vector3(0.5F), 1, 1, 1) - Dim FireEntity3 As Entity = MoveAnimation.SpawnEntity(New Vector3(0.25, -0.25, -0.25), TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 0, 32, 32), ""), New Vector3(0.5F), 1, 1, 1) + MoveAnimation.AnimationSpawnFadingEntity(-0.25, -0.25, -0.25, "Textures\Battle\Fire\Ember,0,32,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 2, 1) + MoveAnimation.AnimationSpawnFadingEntity(0.25, -0.25, 0.25, "Textures\Battle\Fire\Ember,0,32,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 2, 1) + MoveAnimation.AnimationSpawnFadingEntity(0.25, -0.25, -0.25, "Textures\Battle\Fire\Ember,0,32,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 2, 1) - MoveAnimation.AnimationChangeTexture(FireEntity1, False, TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 32, 32, 32)), 2, 1) - MoveAnimation.AnimationChangeTexture(FireEntity2, False, TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 32, 32, 32)), 2, 1) - MoveAnimation.AnimationChangeTexture(FireEntity3, False, TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 32, 32, 32)), 2, 1) + MoveAnimation.AnimationSpawnFadingEntity(-0.25, -0.25, -0.25, "Textures\Battle\Fire\Ember,0,64,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 3, 1) + MoveAnimation.AnimationSpawnFadingEntity(0.25, -0.25, 0.25, "Textures\Battle\Fire\Ember,0,64,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 3, 1) + MoveAnimation.AnimationSpawnFadingEntity(0.25, -0.25, -0.25, "Textures\Battle\Fire\Ember,0,64,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 3, 1) - MoveAnimation.AnimationChangeTexture(FireEntity1, False, TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 64, 32, 32)), 3, 1) - MoveAnimation.AnimationChangeTexture(FireEntity2, False, TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 64, 32, 32)), 3, 1) - MoveAnimation.AnimationChangeTexture(FireEntity3, False, TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 64, 32, 32)), 3, 1) + MoveAnimation.AnimationSpawnFadingEntity(-0.25, -0.25, -0.25, "Textures\Battle\Fire\Ember,0,96,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 4, 1) + MoveAnimation.AnimationSpawnFadingEntity(0.25, -0.25, 0.25, "Textures\Battle\Fire\Ember,0,96,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 4, 1) + MoveAnimation.AnimationSpawnFadingEntity(0.25, -0.25, -0.25, "Textures\Battle\Fire\Ember,0,96,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 4, 1) - MoveAnimation.AnimationChangeTexture(FireEntity1, False, TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 96, 32, 32)), 4, 1) - MoveAnimation.AnimationChangeTexture(FireEntity2, False, TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 96, 32, 32)), 4, 1) - MoveAnimation.AnimationChangeTexture(FireEntity3, False, TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 96, 32, 32)), 4, 1) - - MoveAnimation.AnimationChangeTexture(FireEntity1, True, TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 128, 32, 32)), 5, 1) - MoveAnimation.AnimationChangeTexture(FireEntity2, True, TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 128, 32, 32)), 5, 1) - MoveAnimation.AnimationChangeTexture(FireEntity3, True, TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 128, 32, 32)), 5, 1) + MoveAnimation.AnimationSpawnFadingEntity(-0.25, -0.25, -0.25, "Textures\Battle\Fire\Ember,0,128,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 5, 1) + MoveAnimation.AnimationSpawnFadingEntity(0.25, -0.25, 0.25, "Textures\Battle\Fire\Ember,0,128,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 5, 1) + MoveAnimation.AnimationSpawnFadingEntity(0.25, -0.25, -0.25, "Textures\Battle\Fire\Ember,0,128,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 5, 1) BattleScreen.BattleQuery.Add(MoveAnimation) End Sub diff --git a/P3D/Pokemon/Attacks/Normal/Growl.vb b/P3D/Pokemon/Attacks/Normal/Growl.vb index 369515629..5c35961e3 100644 --- a/P3D/Pokemon/Attacks/Normal/Growl.vb +++ b/P3D/Pokemon/Attacks/Normal/Growl.vb @@ -64,14 +64,11 @@ Public Overrides Sub InternalUserPokemonMoveAnimation(ByVal BattleScreen As BattleScreen, ByVal own As Boolean, ByVal CurrentPokemon As Pokemon, ByVal CurrentEntity As NPC, ByVal CurrentModel As ModelEntity) Dim MoveAnimation As AnimationQueryObject = New AnimationQueryObject(CurrentEntity, own) - MoveAnimation.AnimationPlaySound(CStr(CurrentPokemon.Number), 0, 0,, True) - Dim SoundwaveEntity = MoveAnimation.SpawnEntity(New Vector3(0.25, -0.25, -0.25), TextureManager.GetTexture("Textures\Battle\Normal\Growl", New Rectangle(0, 0, 32, 32), ""), New Vector3(0.5F), 1, 0, 1) - - MoveAnimation.AnimationChangeTexture(SoundwaveEntity, False, TextureManager.GetTexture("Textures\Battle\Normal\Growl", New Rectangle(0, 32, 32, 32), ""), 1, 1) - MoveAnimation.AnimationChangeTexture(SoundwaveEntity, False, TextureManager.GetTexture("Textures\Battle\Normal\Growl", New Rectangle(0, 0, 32, 32), ""), 2, 1) - MoveAnimation.AnimationChangeTexture(SoundwaveEntity, True, TextureManager.GetTexture("Textures\Battle\Normal\Growl", New Rectangle(0, 32, 32, 32), ""), 3, 1) - + MoveAnimation.AnimationSpawnFadingEntity(0.25, -0.25, -0.25, "Textures\Battle\Normal\Growl,0,0,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 0, 1) + MoveAnimation.AnimationSpawnFadingEntity(0.25, -0.25, -0.25, "Textures\Battle\Normal\Growl,0,32,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 1, 1) + MoveAnimation.AnimationSpawnFadingEntity(0.25, -0.25, -0.25, "Textures\Battle\Normal\Growl,0,0,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 2, 1) + MoveAnimation.AnimationSpawnFadingEntity(0.25, -0.25, -0.25, "Textures\Battle\Normal\Growl,0,32,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 3, 1) BattleScreen.BattleQuery.Add(MoveAnimation) End Sub End Class diff --git a/P3D/Pokemon/Attacks/Normal/Pound.vb b/P3D/Pokemon/Attacks/Normal/Pound.vb index d14a3c279..467c5891d 100644 --- a/P3D/Pokemon/Attacks/Normal/Pound.vb +++ b/P3D/Pokemon/Attacks/Normal/Pound.vb @@ -55,11 +55,10 @@ Me.AIField2 = AIField.Nothing End Sub - Public Overrides Sub InternalOpponentPokemonMoveAnimation(ByVal BattleScreen As BattleScreen, ByVal own As Boolean, ByVal CurrentPokemon As Pokemon, ByVal CurrentEntity As NPC, ByVal CurrentModel As ModelEntity) + Public Overrides Sub InternalUserPokemonMoveAnimation(ByVal BattleScreen As BattleScreen, ByVal own As Boolean, ByVal CurrentPokemon As Pokemon, ByVal CurrentEntity As NPC, ByVal CurrentModel As ModelEntity) Dim MoveAnimation As AnimationQueryObject = New AnimationQueryObject(CurrentEntity, own) MoveAnimation.AnimationPlaySound("Battle\Attacks\Pound", 0.5, 2.5) - Dim PoundEntity = MoveAnimation.SpawnEntity(New Vector3(0.25, -0.25, -0.25), TextureManager.GetTexture("Textures\Battle\Normal\Growl", New Rectangle(0, 0, 32, 32), ""), New Vector3(0.5F), 1, 0, 3) - MoveAnimation.AnimationFade(PoundEntity, True, 1.0F, False, 0.0F, 3, 0) + MoveAnimation.AnimationSpawnFadingEntity(0, -0.25, 0, "Textures\Battle\Normal\Pound", 0.5, 0.5, 0.5, 0.02, False, 1.0, 0, 3) BattleScreen.BattleQuery.Add(MoveAnimation) End Sub diff --git a/P3D/Pokemon/Attacks/Normal/Tackle.vb b/P3D/Pokemon/Attacks/Normal/Tackle.vb index 668b4b545..6d8954700 100644 --- a/P3D/Pokemon/Attacks/Normal/Tackle.vb +++ b/P3D/Pokemon/Attacks/Normal/Tackle.vb @@ -54,16 +54,15 @@ Public Overrides Sub InternalUserPokemonMoveAnimation(ByVal BattleScreen As BattleScreen, ByVal own As Boolean, ByVal CurrentPokemon As Pokemon, ByVal CurrentEntity As NPC, ByVal CurrentModel As ModelEntity) Dim MoveAnimation As AnimationQueryObject = New AnimationQueryObject(CurrentEntity, own, CurrentModel) - MoveAnimation.AnimationMove(Nothing, False, 0.5, 0, 0, 0.3, False, False, 0, 0,,, 2) - MoveAnimation.AnimationMove(Nothing, False, 0, 0, 0, 0.3, False, False, 1, 0,,, 2) + MoveAnimation.AnimationMovePokemonEntity(0.5, 0, 0, 0.3, False, False, 0, 0,,, 2) + MoveAnimation.AnimationMovePokemonEntity(0, 0, 0, 0.3, False, False, 1, 0,,, 2) BattleScreen.BattleQuery.Add(MoveAnimation) End Sub Public Overrides Sub InternalOpponentPokemonMoveAnimation(ByVal BattleScreen As BattleScreen, ByVal own As Boolean, ByVal CurrentPokemon As Pokemon, ByVal CurrentEntity As NPC, ByVal CurrentModel As ModelEntity) Dim MoveAnimation As AnimationQueryObject = New AnimationQueryObject(CurrentEntity, own) - MoveAnimation.AnimationPlaySound("Battle\Attacks\Normal\Tackle", 0, 2) - Dim SpawnEntity = MoveAnimation.SpawnEntity(New Vector3(0, -0.25, 0), TextureManager.GetTexture("Textures\Battle\Normal\Tackle"), New Vector3(1.0F), 1.0F) - MoveAnimation.AnimationFade(SpawnEntity, True, 0.02, False, 1.0F, 0, 2) + MoveAnimation.AnimationPlaySound("Battle\Attacks\Tackle", 0, 2) + MoveAnimation.AnimationSpawnFadingEntity(0, -0.25, 0, "Textures\Battle\Normal\Tackle", 0.5, 0.5, 0.5, 0.02, False, 1.0, 0, 2) BattleScreen.BattleQuery.Add(MoveAnimation) End Sub End Class diff --git a/P3D/Pokemon/Attacks/Poison/PoisonSting.vb b/P3D/Pokemon/Attacks/Poison/PoisonSting.vb index fa0fb7abe..36622416b 100644 --- a/P3D/Pokemon/Attacks/Poison/PoisonSting.vb +++ b/P3D/Pokemon/Attacks/Poison/PoisonSting.vb @@ -67,38 +67,30 @@ Public Overrides Sub InternalUserPokemonMoveAnimation(ByVal BattleScreen As BattleScreen, ByVal own As Boolean, ByVal CurrentPokemon As Pokemon, ByVal CurrentEntity As NPC, ByVal CurrentModel As ModelEntity) Dim MoveAnimation As AnimationQueryObject = New AnimationQueryObject(CurrentEntity, own) - Dim StingerEntity As Entity = MoveAnimation.SpawnEntity(CurrentEntity.Position, TextureManager.GetTexture("Textures\Battle\Poison\Stinger"), New Vector3(0.5F), 1.0F) - - MoveAnimation.AnimationPlaySound("Battle\Attacks\Poison\PoisonSting_Start", 0, 0) - MoveAnimation.AnimationMove(StingerEntity, True, 2.0, 0.0, 0.0, 0.05, False, False, 0.0, 0.0,,, 0) - + MoveAnimation.AnimationSpawnMovingEntity(0.0, 0, 0.0, "Textures\Battle\Poison\Stinger", 0.5, 0.5, 0.5, 2.0, 0.0, 0.0, 0.05, False, False, 0.0, 0.0,,, 0) + MoveAnimation.AnimationPlaySound("Battle\Attacks\PoisonSting_Start", 0, 0) BattleScreen.BattleQuery.Add(MoveAnimation) End Sub Public Overrides Sub InternalOpponentPokemonMoveAnimation(ByVal BattleScreen As BattleScreen, ByVal own As Boolean, ByVal CurrentPokemon As Pokemon, ByVal CurrentEntity As NPC, ByVal CurrentModel As ModelEntity) Dim MoveAnimation As AnimationQueryObject = New AnimationQueryObject(CurrentEntity, own) - Dim StingerEntity As Entity = MoveAnimation.SpawnEntity(New Vector3(2.0, 0, 0.0), TextureManager.GetTexture("Textures\Battle\Poison\Stinger"), New Vector3(0.5F), 1) + MoveAnimation.AnimationSpawnMovingEntity(2.0, 0, 0.0, "Textures\Battle\Poison\Stinger", 0.5, 0.5, 0.5, 0.0, 0.0, 0.0, 0.05, False, False, 0.0, 0.0,,, 0) - MoveAnimation.AnimationMove(StingerEntity, True, 0.0, 0.0, 0.0, 0.05, False, False, 0.0, 0.0,,, 0) + MoveAnimation.AnimationPlaySound("Battle\Attacks\PoisonSting_Hit", 1, 0) + MoveAnimation.AnimationSpawnFadingEntity(-0.25, -0.25, -0.25, "Textures\Battle\Poison\Bubble,0,0,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 1, 1) - MoveAnimation.AnimationPlaySound("Battle\Attacks\Poison\PoisonSting_Hit", 1, 0) + MoveAnimation.AnimationSpawnFadingEntity(-0.25, -0.25, -0.25, "Textures\Battle\Poison\Bubble,0,32,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 2, 1) + MoveAnimation.AnimationSpawnFadingEntity(0.25, -0.25, 0.25, "Textures\Battle\Poison\Bubble,0,0,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 2, 1) - Dim BubbleEntity1 As Entity = MoveAnimation.SpawnEntity(New Vector3(-0.25, -0.25, -0.25), TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 0, 32, 32)), New Vector3(0.5F), 1, 1, 1) + MoveAnimation.AnimationSpawnFadingEntity(-0.25, -0.25, -0.25, "Textures\Battle\Poison\Bubble,0,64,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 3, 1) + MoveAnimation.AnimationSpawnFadingEntity(0.25, -0.25, 0.25, "Textures\Battle\Poison\Bubble,0,32,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 3, 1) + MoveAnimation.AnimationSpawnFadingEntity(0.25, -0.25, -0.25, "Textures\Battle\Poison\Bubble,0,0,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 3, 1) - MoveAnimation.AnimationChangeTexture(BubbleEntity1, False, TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 32, 32, 32)), 2, 1) + MoveAnimation.AnimationSpawnFadingEntity(0.25, -0.25, 0.25, "Textures\Battle\Poison\Bubble,0,64,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 4, 1) + MoveAnimation.AnimationSpawnFadingEntity(0.25, -0.25, -0.25, "Textures\Battle\Poison\Bubble,0,32,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 4, 1) - Dim BubbleEntity2 As Entity = MoveAnimation.SpawnEntity(New Vector3(0.25, -0.25, 0.25), TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 0, 32, 32)), New Vector3(0.5F), 1, 2, 1) - - MoveAnimation.AnimationChangeTexture(BubbleEntity1, True, TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 64, 32, 32)), 3, 1) - MoveAnimation.AnimationChangeTexture(BubbleEntity2, False, TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 32, 32, 32)), 3, 1) - - Dim BubbleEntity3 As Entity = MoveAnimation.SpawnEntity(New Vector3(0.25, -0.25, -0.25), TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 0, 32, 32)), New Vector3(0.5F), 1, 3, 1) - - MoveAnimation.AnimationChangeTexture(BubbleEntity2, True, TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 64, 32, 32)), 4, 1) - MoveAnimation.AnimationChangeTexture(BubbleEntity3, False, TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 32, 32, 32)), 4, 1) - - MoveAnimation.AnimationChangeTexture(BubbleEntity3, True, TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 64, 32, 32)), 5, 1) + MoveAnimation.AnimationSpawnFadingEntity(0.25, -0.25, -0.25, "Textures\Battle\Poison\Bubble,0,64,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 5, 2) BattleScreen.BattleQuery.Add(MoveAnimation) End Sub From 79edf72d1ce3ce3b5221d6d472805bd259bfa1d5 Mon Sep 17 00:00:00 2001 From: JappaWakka Date: Sat, 2 Oct 2021 17:40:48 +0200 Subject: [PATCH 09/57] Fix Burned animation error --- P3D/Battle/BattleSystemV2/Battle.vb | 32 ++++++++++++++--------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/P3D/Battle/BattleSystemV2/Battle.vb b/P3D/Battle/BattleSystemV2/Battle.vb index 2b322aaa2..2b69ba9cc 100644 --- a/P3D/Battle/BattleSystemV2/Battle.vb +++ b/P3D/Battle/BattleSystemV2/Battle.vb @@ -2705,13 +2705,13 @@ p.Status = Pokemon.StatusProblems.Burn ChangeCameraAngle(1, own, BattleScreen) 'Burn animation - Dim BurnAnimation As AnimationQueryObject = New AnimationQueryObject(pNPC, own) + Dim BurnAnimation As AnimationQueryObject = New AnimationQueryObject(CType(pNPC, NPC), own) BurnAnimation.AnimationPlaySound("Battle\Effects\Burned", 0, 0) - MoveAnimation.AnimationSpawnFadingEntity(0.25, -0.25, -0.25, "Textures\Battle\Fire\Ember,0,0,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 1, 1) - MoveAnimation.AnimationSpawnFadingEntity(0.25, -0.25, -0.25, "Textures\Battle\Fire\Ember,0,32,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 2, 1) - MoveAnimation.AnimationSpawnFadingEntity(0.25, -0.25, -0.25, "Textures\Battle\Fire\Ember,0,64,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 3, 1) - MoveAnimation.AnimationSpawnFadingEntity(0.25, -0.25, -0.25, "Textures\Battle\Fire\Ember,0,96,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 4, 1) - MoveAnimation.AnimationSpawnFadingEntity(0.25, -0.25, -0.25, "Textures\Battle\Fire\Ember,0,128,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 5, 1) + BurnAnimation.AnimationSpawnFadingEntity(0.25, -0.25, -0.25, "Textures\Battle\Fire\Ember,0,0,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 1, 1) + BurnAnimation.AnimationSpawnFadingEntity(0.25, -0.25, -0.25, "Textures\Battle\Fire\Ember,0,32,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 2, 1) + BurnAnimation.AnimationSpawnFadingEntity(0.25, -0.25, -0.25, "Textures\Battle\Fire\Ember,0,64,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 3, 1) + BurnAnimation.AnimationSpawnFadingEntity(0.25, -0.25, -0.25, "Textures\Battle\Fire\Ember,0,96,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 4, 1) + BurnAnimation.AnimationSpawnFadingEntity(0.25, -0.25, -0.25, "Textures\Battle\Fire\Ember,0,128,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 5, 1) BattleScreen.BattleQuery.Add(BurnAnimation) Select Case message Case "" 'Print default message only @@ -5406,11 +5406,11 @@ 'Burn animation Dim BurnAnimation As AnimationQueryObject = New AnimationQueryObject(BattleScreen.OwnPokemonNPC, False) BurnAnimation.AnimationPlaySound("Battle\Effects\Burned", 0, 0) - MoveAnimation.AnimationSpawnFadingEntity(0.25, -0.25, -0.25, "Textures\Battle\Fire\Ember,0,0,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 1, 1) - MoveAnimation.AnimationSpawnFadingEntity(0.25, -0.25, -0.25, "Textures\Battle\Fire\Ember,0,32,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 2, 1) - MoveAnimation.AnimationSpawnFadingEntity(0.25, -0.25, -0.25, "Textures\Battle\Fire\Ember,0,64,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 3, 1) - MoveAnimation.AnimationSpawnFadingEntity(0.25, -0.25, -0.25, "Textures\Battle\Fire\Ember,0,96,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 4, 1) - MoveAnimation.AnimationSpawnFadingEntity(0.25, -0.25, -0.25, "Textures\Battle\Fire\Ember,0,128,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 5, 1) + BurnAnimation.AnimationSpawnFadingEntity(0.25, -0.25, -0.25, "Textures\Battle\Fire\Ember,0,0,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 1, 1) + BurnAnimation.AnimationSpawnFadingEntity(0.25, -0.25, -0.25, "Textures\Battle\Fire\Ember,0,32,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 2, 1) + BurnAnimation.AnimationSpawnFadingEntity(0.25, -0.25, -0.25, "Textures\Battle\Fire\Ember,0,64,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 3, 1) + BurnAnimation.AnimationSpawnFadingEntity(0.25, -0.25, -0.25, "Textures\Battle\Fire\Ember,0,96,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 4, 1) + BurnAnimation.AnimationSpawnFadingEntity(0.25, -0.25, -0.25, "Textures\Battle\Fire\Ember,0,128,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 5, 1) BattleScreen.BattleQuery.Add(BurnAnimation) 'Actual damage ReduceHP(reduceAmount, True, True, BattleScreen, .OwnPokemon.GetDisplayName() & " is hurt by the burn.", "burn") @@ -6197,11 +6197,11 @@ 'Burn animation Dim BurnAnimation As AnimationQueryObject = New AnimationQueryObject(BattleScreen.OppPokemonNPC, False) BurnAnimation.AnimationPlaySound("Battle\Effects\Burned", 0, 0) - MoveAnimation.AnimationSpawnFadingEntity(0.25, -0.25, -0.25, "Textures\Battle\Fire\Ember,0,0,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 1, 1) - MoveAnimation.AnimationSpawnFadingEntity(0.25, -0.25, -0.25, "Textures\Battle\Fire\Ember,0,32,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 2, 1) - MoveAnimation.AnimationSpawnFadingEntity(0.25, -0.25, -0.25, "Textures\Battle\Fire\Ember,0,64,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 3, 1) - MoveAnimation.AnimationSpawnFadingEntity(0.25, -0.25, -0.25, "Textures\Battle\Fire\Ember,0,96,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 4, 1) - MoveAnimation.AnimationSpawnFadingEntity(0.25, -0.25, -0.25, "Textures\Battle\Fire\Ember,0,128,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 5, 1) + BurnAnimation.AnimationSpawnFadingEntity(0.25, -0.25, -0.25, "Textures\Battle\Fire\Ember,0,0,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 1, 1) + BurnAnimation.AnimationSpawnFadingEntity(0.25, -0.25, -0.25, "Textures\Battle\Fire\Ember,0,32,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 2, 1) + BurnAnimation.AnimationSpawnFadingEntity(0.25, -0.25, -0.25, "Textures\Battle\Fire\Ember,0,64,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 3, 1) + BurnAnimation.AnimationSpawnFadingEntity(0.25, -0.25, -0.25, "Textures\Battle\Fire\Ember,0,96,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 4, 1) + BurnAnimation.AnimationSpawnFadingEntity(0.25, -0.25, -0.25, "Textures\Battle\Fire\Ember,0,128,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 5, 1) BattleScreen.BattleQuery.Add(BurnAnimation) 'Actual damage ReduceHP(reduceAmount, False, False, BattleScreen, .OppPokemon.GetDisplayName() & " is hurt by the burn.", "burn") From d20abdf6df6fb09c3c6923ae6a5166ae6c16a7f0 Mon Sep 17 00:00:00 2001 From: JappaWakka Date: Sun, 3 Oct 2021 11:02:18 +0200 Subject: [PATCH 10/57] Hit Animation + Restructure of attack sound effects + Absorb animation MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Attack sound effects are now in the folder of the type of their attack Pokémon flicker briefly when hit --- P3D/Battle/BattleSystemV2/Battle.vb | 9 +++++++++ P3D/Pokemon/Attacks/Fire/Ember.vb | 4 ++-- P3D/Pokemon/Attacks/Normal/Pound.vb | 2 +- P3D/Pokemon/Attacks/Normal/Tackle.vb | 2 +- P3D/Pokemon/Attacks/Poison/PoisonSting.vb | 4 ++-- 5 files changed, 15 insertions(+), 6 deletions(-) diff --git a/P3D/Battle/BattleSystemV2/Battle.vb b/P3D/Battle/BattleSystemV2/Battle.vb index 2b69ba9cc..6247835f1 100644 --- a/P3D/Battle/BattleSystemV2/Battle.vb +++ b/P3D/Battle/BattleSystemV2/Battle.vb @@ -3978,8 +3978,10 @@ Public Sub ReduceHP(ByVal HPAmount As Integer, ByVal own As Boolean, ByVal from As Boolean, ByVal BattleScreen As BattleScreen, ByVal message As String, ByVal cause As String, ByVal sound As String) Dim p As Pokemon = BattleScreen.OwnPokemon + Dim pNPC As Entity = BattleScreen.OwnPokemonNPC If own = False Then p = BattleScreen.OppPokemon + pNPC = BattleScreen.OppPokemonNPC End If If p.HP > 0 And p.Status <> Pokemon.StatusProblems.Fainted Then @@ -3996,6 +3998,13 @@ BattleScreen.BattleQuery.Add(New PlaySoundQueryObject(sound, False, 0.0F)) End If + Dim HitAnimation As AnimationQueryObject = New AnimationQueryObject(CType(pNPC, NPC), own) + HitAnimation.AnimationFadePokemonEntity(1, False, 0, 0, 0) + HitAnimation.AnimationFadePokemonEntity(1, True, 1, 1, 0) + HitAnimation.AnimationFadePokemonEntity(1, False, 0, 2, 0) + HitAnimation.AnimationFadePokemonEntity(1, True, 1, 3, 0) + BattleScreen.BattleQuery.Add(HitAnimation) + If own = True Then BattleScreen.BattleQuery.Add(New MathHPQueryObject(p.HP, p.MaxHP, HPAmount, New Vector2(200, 256))) Else diff --git a/P3D/Pokemon/Attacks/Fire/Ember.vb b/P3D/Pokemon/Attacks/Fire/Ember.vb index bb5fae6fe..6719f780d 100644 --- a/P3D/Pokemon/Attacks/Fire/Ember.vb +++ b/P3D/Pokemon/Attacks/Fire/Ember.vb @@ -66,7 +66,7 @@ Public Overrides Sub InternalUserPokemonMoveAnimation(ByVal BattleScreen As BattleScreen, ByVal own As Boolean, ByVal CurrentPokemon As Pokemon, ByVal CurrentEntity As NPC, ByVal CurrentModel As ModelEntity) Dim MoveAnimation As AnimationQueryObject = New AnimationQueryObject(CurrentEntity, own) MoveAnimation.AnimationSpawnMovingEntity(0.0, 0, 0.0, "Textures\Battle\Fire\FireBall", 0.5, 0.5, 0.5, 2.0, 0.0, 0.0, 0.05, False, True, 0.0, 0.0,, -0.5, 0) - MoveAnimation.AnimationPlaySound("Battle\Attacks\Ember_Start", 0, 0) + MoveAnimation.AnimationPlaySound("Battle\Attacks\Fire\Ember_Start", 0, 0) For i = 0 To 12 MoveAnimation.AnimationSpawnFadingEntity(CSng(i * 0.2), 0.0, 0.0, "Textures\Battle\Fire\Smoke", 0.2, 0.2, 0.2, 0.02, False, 0.0, CSng(i * 0.2), 0.0) i += 1 @@ -82,7 +82,7 @@ MoveAnimation.AnimationSpawnFadingEntity(CSng(3.0 - i * 0.2), 0.0, 0.0, "Textures\Battle\Fire\Smoke", 0.2, 0.2, 0.2, 0.02, False, 0.0, CSng(i * 0.2), 0.0) i += 1 Next - MoveAnimation.AnimationPlaySound("Battle\Attacks\Ember_Hit", 2, 0) + MoveAnimation.AnimationPlaySound("Battle\Attacks\Fire\Ember_Hit", 2, 0) MoveAnimation.AnimationSpawnFadingEntity(-0.25, -0.25, -0.25, "Textures\Battle\Fire\Ember,0,0,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 1, 1) MoveAnimation.AnimationSpawnFadingEntity(0.25, -0.25, 0.25, "Textures\Battle\Fire\Ember,0,0,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 1, 1) MoveAnimation.AnimationSpawnFadingEntity(0.25, -0.25, -0.25, "Textures\Battle\Fire\Ember,0,0,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 1, 1) diff --git a/P3D/Pokemon/Attacks/Normal/Pound.vb b/P3D/Pokemon/Attacks/Normal/Pound.vb index 467c5891d..25785556e 100644 --- a/P3D/Pokemon/Attacks/Normal/Pound.vb +++ b/P3D/Pokemon/Attacks/Normal/Pound.vb @@ -55,7 +55,7 @@ Me.AIField2 = AIField.Nothing End Sub - Public Overrides Sub InternalUserPokemonMoveAnimation(ByVal BattleScreen As BattleScreen, ByVal own As Boolean, ByVal CurrentPokemon As Pokemon, ByVal CurrentEntity As NPC, ByVal CurrentModel As ModelEntity) + Public Overrides Sub InternalOpponentPokemonMoveAnimation(ByVal BattleScreen As BattleScreen, ByVal own As Boolean, ByVal CurrentPokemon As Pokemon, ByVal CurrentEntity As NPC, ByVal CurrentModel As ModelEntity) Dim MoveAnimation As AnimationQueryObject = New AnimationQueryObject(CurrentEntity, own) MoveAnimation.AnimationPlaySound("Battle\Attacks\Pound", 0.5, 2.5) MoveAnimation.AnimationSpawnFadingEntity(0, -0.25, 0, "Textures\Battle\Normal\Pound", 0.5, 0.5, 0.5, 0.02, False, 1.0, 0, 3) diff --git a/P3D/Pokemon/Attacks/Normal/Tackle.vb b/P3D/Pokemon/Attacks/Normal/Tackle.vb index 6d8954700..c3a075d95 100644 --- a/P3D/Pokemon/Attacks/Normal/Tackle.vb +++ b/P3D/Pokemon/Attacks/Normal/Tackle.vb @@ -61,7 +61,7 @@ Public Overrides Sub InternalOpponentPokemonMoveAnimation(ByVal BattleScreen As BattleScreen, ByVal own As Boolean, ByVal CurrentPokemon As Pokemon, ByVal CurrentEntity As NPC, ByVal CurrentModel As ModelEntity) Dim MoveAnimation As AnimationQueryObject = New AnimationQueryObject(CurrentEntity, own) - MoveAnimation.AnimationPlaySound("Battle\Attacks\Tackle", 0, 2) + MoveAnimation.AnimationPlaySound("Battle\Attacks\Normal\Tackle", 0, 2) MoveAnimation.AnimationSpawnFadingEntity(0, -0.25, 0, "Textures\Battle\Normal\Tackle", 0.5, 0.5, 0.5, 0.02, False, 1.0, 0, 2) BattleScreen.BattleQuery.Add(MoveAnimation) End Sub diff --git a/P3D/Pokemon/Attacks/Poison/PoisonSting.vb b/P3D/Pokemon/Attacks/Poison/PoisonSting.vb index 36622416b..9684f8379 100644 --- a/P3D/Pokemon/Attacks/Poison/PoisonSting.vb +++ b/P3D/Pokemon/Attacks/Poison/PoisonSting.vb @@ -68,7 +68,7 @@ Public Overrides Sub InternalUserPokemonMoveAnimation(ByVal BattleScreen As BattleScreen, ByVal own As Boolean, ByVal CurrentPokemon As Pokemon, ByVal CurrentEntity As NPC, ByVal CurrentModel As ModelEntity) Dim MoveAnimation As AnimationQueryObject = New AnimationQueryObject(CurrentEntity, own) MoveAnimation.AnimationSpawnMovingEntity(0.0, 0, 0.0, "Textures\Battle\Poison\Stinger", 0.5, 0.5, 0.5, 2.0, 0.0, 0.0, 0.05, False, False, 0.0, 0.0,,, 0) - MoveAnimation.AnimationPlaySound("Battle\Attacks\PoisonSting_Start", 0, 0) + MoveAnimation.AnimationPlaySound("Battle\Attacks\Poison\PoisonSting_Start", 0, 0) BattleScreen.BattleQuery.Add(MoveAnimation) End Sub @@ -77,7 +77,7 @@ MoveAnimation.AnimationSpawnMovingEntity(2.0, 0, 0.0, "Textures\Battle\Poison\Stinger", 0.5, 0.5, 0.5, 0.0, 0.0, 0.0, 0.05, False, False, 0.0, 0.0,,, 0) - MoveAnimation.AnimationPlaySound("Battle\Attacks\PoisonSting_Hit", 1, 0) + MoveAnimation.AnimationPlaySound("Battle\Attacks\Poison\PoisonSting_Hit", 1, 0) MoveAnimation.AnimationSpawnFadingEntity(-0.25, -0.25, -0.25, "Textures\Battle\Poison\Bubble,0,0,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 1, 1) MoveAnimation.AnimationSpawnFadingEntity(-0.25, -0.25, -0.25, "Textures\Battle\Poison\Bubble,0,32,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 2, 1) From 02ed129c85e0394cb8443a0ca48b44ff7b04d0c1 Mon Sep 17 00:00:00 2001 From: JappaWakka Date: Thu, 14 Oct 2021 01:21:10 +0200 Subject: [PATCH 11/57] Battle Animation System Rework about halfway done Updated to work with the new animation system: - Catch animation - Burn animation - Attack: Tackle --- P3D/Battle/BattleSystemV2/Battle.vb | 122 ++++++++++++++++----------- P3D/Pokemon/Attacks/Normal/Tackle.vb | 4 +- 2 files changed, 73 insertions(+), 53 deletions(-) diff --git a/P3D/Battle/BattleSystemV2/Battle.vb b/P3D/Battle/BattleSystemV2/Battle.vb index 6247835f1..823bea6f1 100644 --- a/P3D/Battle/BattleSystemV2/Battle.vb +++ b/P3D/Battle/BattleSystemV2/Battle.vb @@ -2705,14 +2705,20 @@ p.Status = Pokemon.StatusProblems.Burn ChangeCameraAngle(1, own, BattleScreen) 'Burn animation - Dim BurnAnimation As AnimationQueryObject = New AnimationQueryObject(CType(pNPC, NPC), own) + Dim BurnAnimation As AnimationQueryObject = New AnimationQueryObject(pNPC, own) BurnAnimation.AnimationPlaySound("Battle\Effects\Burned", 0, 0) - BurnAnimation.AnimationSpawnFadingEntity(0.25, -0.25, -0.25, "Textures\Battle\Fire\Ember,0,0,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 1, 1) - BurnAnimation.AnimationSpawnFadingEntity(0.25, -0.25, -0.25, "Textures\Battle\Fire\Ember,0,32,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 2, 1) - BurnAnimation.AnimationSpawnFadingEntity(0.25, -0.25, -0.25, "Textures\Battle\Fire\Ember,0,64,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 3, 1) - BurnAnimation.AnimationSpawnFadingEntity(0.25, -0.25, -0.25, "Textures\Battle\Fire\Ember,0,96,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 4, 1) - BurnAnimation.AnimationSpawnFadingEntity(0.25, -0.25, -0.25, "Textures\Battle\Fire\Ember,0,128,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 5, 1) + Dim FlameEntity As Entity = BurnAnimation.SpawnEntity(New Vector3(CSng(pNPC.Position.X - 0.25), CSng(pNPC.Position.Y - 0.25), CSng(pNPC.Position.Z - 0.25)), TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 0, 32, 32)), New Vector3(0.5, 0.5, 0.5), 1.0F) + BurnAnimation.AnimationChangeTexture(FlameEntity, TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 32, 32, 32)), 2, 1) + BurnAnimation.AnimationChangeTexture(FlameEntity, TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 64, 32, 32)), 3, 1) + BurnAnimation.AnimationChangeTexture(FlameEntity, TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 96, 32, 32)), 4, 1) + BurnAnimation.AnimationChangeTexture(FlameEntity, TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 128, 32, 32)), 5, 1) + BurnAnimation.AnimationFadeEntity(FlameEntity, 1, False, 0.0F, 6, 1, 1) BattleScreen.BattleQuery.Add(BurnAnimation) + + If FlameEntity.Opacity = 0.0F Then + BurnAnimation.RemoveEntity(FlameEntity) + End If + Select Case message Case "" 'Print default message only BattleScreen.BattleQuery.Add(New TextQueryObject(p.GetDisplayName() & " got burned!")) @@ -2723,30 +2729,30 @@ BattleScreen.BattleQuery.Add(New TextQueryObject(p.GetDisplayName() & " got burned!")) End Select If p.Ability.Name.ToLower() = "synchronize" AndAlso from <> own Then - Me.InflictBurn(Not own, Not own, BattleScreen, "Synchronize passed over the burn.", "synchronize") - End If + Me.InflictBurn(Not own, Not own, BattleScreen, "Synchronize passed over the burn.", "synchronize") + End If - If Not p.Item Is Nothing Then - If p.Item.Name.ToLower() = "rawst" AndAlso BattleScreen.FieldEffects.CanUseItem(own) = True AndAlso BattleScreen.FieldEffects.CanUseOwnItem(own, BattleScreen) = True Then - If RemoveHeldItem(own, own, BattleScreen, "", "berry:rawst") = True Then - BattleScreen.BattleQuery.Add(New PlaySoundQueryObject("Use_Item", False)) - CureStatusProblem(own, own, BattleScreen, "The Rawst Berry cured the burn of " & p.GetDisplayName() & "!", "berry:rawst") + If Not p.Item Is Nothing Then + If p.Item.Name.ToLower() = "rawst" AndAlso BattleScreen.FieldEffects.CanUseItem(own) = True AndAlso BattleScreen.FieldEffects.CanUseOwnItem(own, BattleScreen) = True Then + If RemoveHeldItem(own, own, BattleScreen, "", "berry:rawst") = True Then + BattleScreen.BattleQuery.Add(New PlaySoundQueryObject("Use_Item", False)) + CureStatusProblem(own, own, BattleScreen, "The Rawst Berry cured the burn of " & p.GetDisplayName() & "!", "berry:rawst") + End If End If End If - End If - If Not p.Item Is Nothing Then - If p.Item.Name.ToLower() = "lum" AndAlso BattleScreen.FieldEffects.CanUseItem(own) = True AndAlso BattleScreen.FieldEffects.CanUseOwnItem(own, BattleScreen) = True Then - If RemoveHeldItem(own, own, BattleScreen, "", "berry:lum") = True Then - BattleScreen.BattleQuery.Add(New PlaySoundQueryObject("Use_Item", False)) - CureStatusProblem(own, own, BattleScreen, "The Lum Berry cured the burn of " & p.GetDisplayName() & "!", "berry:lum") + If Not p.Item Is Nothing Then + If p.Item.Name.ToLower() = "lum" AndAlso BattleScreen.FieldEffects.CanUseItem(own) = True AndAlso BattleScreen.FieldEffects.CanUseOwnItem(own, BattleScreen) = True Then + If RemoveHeldItem(own, own, BattleScreen, "", "berry:lum") = True Then + BattleScreen.BattleQuery.Add(New PlaySoundQueryObject("Use_Item", False)) + CureStatusProblem(own, own, BattleScreen, "The Lum Berry cured the burn of " & p.GetDisplayName() & "!", "berry:lum") + End If End If End If - End If - Return True + Return True + End If End If - End If End If End If End If @@ -3411,7 +3417,7 @@ End If '***STAT INCREASE ANIMATION*** - Dim MoveAnimation As AnimationQueryObject = New AnimationQueryObject(pNPC, Not own) + Dim StatAnimation As AnimationQueryObject = New AnimationQueryObject(pNPC, Not own) Dim maxAmount As Integer = 20 * val Dim currentAmount As Integer = 0 While currentAmount <= maxAmount @@ -3427,11 +3433,11 @@ Destination.X = xPos Destination.Z = zPos Dim startDelay As Double = 5.0 * Random.NextDouble() - MoveAnimation.AnimationSpawnMovingEntity(Position.X, Position.Y, Position.Z, Texture, Scale.X, Scale.Y, Scale.Z, Destination.X, Destination.Y, Destination.Z, 0.05F, False, True, CSng(startDelay), 0.0F) + StatAnimation.AnimationSpawnMovingEntity(Position.X, Position.Y, Position.Z, Texture, Scale.X, Scale.Y, Scale.Z, Destination.X, Destination.Y, Destination.Z, 0.05F, False, True, CSng(startDelay), 0.0F) Threading.Interlocked.Increment(currentAmount) End While BattleScreen.BattleQuery.Add(New PlaySoundQueryObject("Battle\Effects\Stat_Raise", False)) - BattleScreen.BattleQuery.Add(MoveAnimation) + BattleScreen.BattleQuery.Add(StatAnimation) Dim printMessage As String = p.GetDisplayName() & "'s " & statString Select Case val @@ -3998,11 +4004,11 @@ BattleScreen.BattleQuery.Add(New PlaySoundQueryObject(sound, False, 0.0F)) End If - Dim HitAnimation As AnimationQueryObject = New AnimationQueryObject(CType(pNPC, NPC), own) - HitAnimation.AnimationFadePokemonEntity(1, False, 0, 0, 0) - HitAnimation.AnimationFadePokemonEntity(1, True, 1, 1, 0) - HitAnimation.AnimationFadePokemonEntity(1, False, 0, 2, 0) - HitAnimation.AnimationFadePokemonEntity(1, True, 1, 3, 0) + Dim HitAnimation As AnimationQueryObject = New AnimationQueryObject(pNPC, own) + HitAnimation.AnimationFadeEntity(Nothing, 1, False, 0, 0, 0) + HitAnimation.AnimationFadeEntity(Nothing, 1, True, 1, 1, 0) + HitAnimation.AnimationFadeEntity(Nothing, 1, False, 0, 2, 0) + HitAnimation.AnimationFadeEntity(Nothing, 1, True, 1, 3, 0) BattleScreen.BattleQuery.Add(HitAnimation) If own = True Then @@ -5415,12 +5421,19 @@ 'Burn animation Dim BurnAnimation As AnimationQueryObject = New AnimationQueryObject(BattleScreen.OwnPokemonNPC, False) BurnAnimation.AnimationPlaySound("Battle\Effects\Burned", 0, 0) - BurnAnimation.AnimationSpawnFadingEntity(0.25, -0.25, -0.25, "Textures\Battle\Fire\Ember,0,0,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 1, 1) - BurnAnimation.AnimationSpawnFadingEntity(0.25, -0.25, -0.25, "Textures\Battle\Fire\Ember,0,32,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 2, 1) - BurnAnimation.AnimationSpawnFadingEntity(0.25, -0.25, -0.25, "Textures\Battle\Fire\Ember,0,64,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 3, 1) - BurnAnimation.AnimationSpawnFadingEntity(0.25, -0.25, -0.25, "Textures\Battle\Fire\Ember,0,96,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 4, 1) - BurnAnimation.AnimationSpawnFadingEntity(0.25, -0.25, -0.25, "Textures\Battle\Fire\Ember,0,128,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 5, 1) + + Dim FlameEntity As Entity = BurnAnimation.SpawnEntity(New Vector3(CSng(BattleScreen.OwnPokemonNPC.Position.X + 0.25), CSng(BattleScreen.OwnPokemonNPC.Position.Y - 0.25), CSng(BattleScreen.OwnPokemonNPC.Position.Z + 0.25)), TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 0, 32, 32)), New Vector3(0.5, 0.5, 0.5), 1.0F) + BurnAnimation.AnimationChangeTexture(FlameEntity, TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 32, 32, 32)), 2, 1) + BurnAnimation.AnimationChangeTexture(FlameEntity, TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 64, 32, 32)), 3, 1) + BurnAnimation.AnimationChangeTexture(FlameEntity, TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 96, 32, 32)), 4, 1) + BurnAnimation.AnimationChangeTexture(FlameEntity, TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 128, 32, 32)), 5, 1) + BurnAnimation.AnimationFadeEntity(FlameEntity, 1, False, 0.0F, 6, 1, 1) BattleScreen.BattleQuery.Add(BurnAnimation) + + If FlameEntity.Opacity = 0.0F Then + BurnAnimation.RemoveEntity(FlameEntity) + End If + 'Actual damage ReduceHP(reduceAmount, True, True, BattleScreen, .OwnPokemon.GetDisplayName() & " is hurt by the burn.", "burn") End If @@ -6206,12 +6219,19 @@ 'Burn animation Dim BurnAnimation As AnimationQueryObject = New AnimationQueryObject(BattleScreen.OppPokemonNPC, False) BurnAnimation.AnimationPlaySound("Battle\Effects\Burned", 0, 0) - BurnAnimation.AnimationSpawnFadingEntity(0.25, -0.25, -0.25, "Textures\Battle\Fire\Ember,0,0,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 1, 1) - BurnAnimation.AnimationSpawnFadingEntity(0.25, -0.25, -0.25, "Textures\Battle\Fire\Ember,0,32,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 2, 1) - BurnAnimation.AnimationSpawnFadingEntity(0.25, -0.25, -0.25, "Textures\Battle\Fire\Ember,0,64,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 3, 1) - BurnAnimation.AnimationSpawnFadingEntity(0.25, -0.25, -0.25, "Textures\Battle\Fire\Ember,0,96,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 4, 1) - BurnAnimation.AnimationSpawnFadingEntity(0.25, -0.25, -0.25, "Textures\Battle\Fire\Ember,0,128,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 5, 1) + + Dim FlameEntity As Entity = BurnAnimation.SpawnEntity(New Vector3(CSng(BattleScreen.OppPokemonNPC.Position.X - 0.25), CSng(BattleScreen.OwnPokemonNPC.Position.Y - 0.25), CSng(BattleScreen.OwnPokemonNPC.Position.Z - 0.25)), TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 0, 32, 32)), New Vector3(0.5, 0.5, 0.5), 1.0F) + BurnAnimation.AnimationChangeTexture(FlameEntity, TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 32, 32, 32)), 2, 1) + BurnAnimation.AnimationChangeTexture(FlameEntity, TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 64, 32, 32)), 3, 1) + BurnAnimation.AnimationChangeTexture(FlameEntity, TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 96, 32, 32)), 4, 1) + BurnAnimation.AnimationChangeTexture(FlameEntity, TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 128, 32, 32)), 5, 1) + BurnAnimation.AnimationFadeEntity(FlameEntity, 1, False, 0.0F, 6, 1, 1) BattleScreen.BattleQuery.Add(BurnAnimation) + + If FlameEntity.Opacity = 0.0F Then + BurnAnimation.RemoveEntity(FlameEntity) + End If + 'Actual damage ReduceHP(reduceAmount, False, False, BattleScreen, .OppPokemon.GetDisplayName() & " is hurt by the burn.", "burn") End If @@ -6796,8 +6816,8 @@ Loop While SmokeReturned <= 38 ' Pokemon disappears - BallReturn.AnimationFadePokemonEntity(1, False, 0, 1, 0) - BallReturn.AnimationMovePokemonEntity(0, 0.5, 0, 0.5, False, False, 2, 0,,, 4) + BallReturn.AnimationFadeEntity(Nothing, 1, False, 0, 1, 0) + BallReturn.AnimationMoveEntity(Nothing, 0, 0.5, 0, 0.5, False, False, 2, 0,,, 3) ' Ball returns BallReturn.AnimationPlaySound("Battle\Pokeball\Throw", 1, 0) @@ -6859,11 +6879,11 @@ Loop While SmokeSpawned <= 38 ' Pokemon appears - BallThrow.AnimationFadePokemonEntity(1, True, 1, 4, 0) + BallThrow.AnimationFadeEntity(Nothing, 1, True, 1, 4, 0) BallThrow.AnimationPlaySound(CStr(BattleScreen.OwnPokemon.Number), 4, 0,, True) ' Pokémon falls down - BallThrow.AnimationMovePokemonEntity(0, 0, 0, 0.05F, False, False, 4, 0,,, 4) + BallThrow.AnimationMoveEntity(Nothing, 0, 0, 0, 0.05F, False, False, 4, 0,,, 3) BattleScreen.AddToQuery(InsertIndex, BallThrow) End If @@ -7112,7 +7132,7 @@ ChangeCameraAngle(1, False, BattleScreen) Dim Faint As AnimationQueryObject = New AnimationQueryObject(BattleScreen.OppPokemonNPC, True, BattleScreen.OppPokemonModel) Faint.AnimationPlaySound(CStr(BattleScreen.OppPokemon.Number), 0, 2, False, True) - Faint.AnimationMovePokemonEntity(0, -1, 0, 0.1, False, False, 2, 0,,, 4) + Faint.AnimationMoveEntity(Nothing, 0, -1, 0, 0.1, False, False, 2, 0,,, 3) BattleScreen.BattleQuery.Add(Faint) BattleScreen.BattleQuery.Add(New ToggleEntityQueryObject(True, ToggleEntityQueryObject.BattleEntities.OppPokemon, 2, -1, -1, -1, -1)) @@ -7157,8 +7177,8 @@ Loop While SmokeReturned <= 38 ' Pokemon disappears - BallReturn.AnimationFadePokemonEntity(1, False, 0, 1, 0) - BallReturn.AnimationMovePokemonEntity(0, 0.5, 0, 0.5, False, False, 2, 0,,, 4) + BallReturn.AnimationFadeEntity(Nothing, 1, False, 0, 1, 0) + BallReturn.AnimationMoveEntity(Nothing, 0, 0.5, 0, 0.5, False, False, 2, 0,,, 4) ' Ball returns BallReturn.AnimationPlaySound("Battle\Pokeball\Throw", 1, 0) @@ -7218,8 +7238,8 @@ Loop While SmokeReturned <= 38 ' Pokemon disappears - BallReturn.AnimationFadePokemonEntity(1, False, 0, 1, 0) - BallReturn.AnimationMovePokemonEntity(0, 0.5, 0, 0.5, False, False, 2, 0,,, 4) + BallReturn.AnimationFadeEntity(Nothing, 1, False, 0, 1, 0) + BallReturn.AnimationMoveEntity(Nothing, 0, 0.5, 0, 0.5, False, False, 2, 0,,, 4) ' Ball returns BallReturn.AnimationPlaySound("Battle\Pokeball\Throw", 1, 0) @@ -7273,11 +7293,11 @@ Loop While SmokeSpawned <= 38 ' Pokemon appears - BallThrow.AnimationFadePokemonEntity(1, True, 1, 4, 0) + BallThrow.AnimationFadeEntity(Nothing, 1, True, 1, 4, 0) BallThrow.AnimationPlaySound(CStr(BattleScreen.OppPokemon.Number), 4, 0,, True) ' Pokémon falls down - BallThrow.AnimationMovePokemonEntity(0, 0, 0, 0.05F, False, False, 4, 0,,, 4) + BallThrow.AnimationMoveEntity(Nothing, 0, 0, 0, 0.05F, False, False, 4, 0,,, 4) BattleScreen.BattleQuery.Add(BallThrow) End If diff --git a/P3D/Pokemon/Attacks/Normal/Tackle.vb b/P3D/Pokemon/Attacks/Normal/Tackle.vb index c3a075d95..4d53f749d 100644 --- a/P3D/Pokemon/Attacks/Normal/Tackle.vb +++ b/P3D/Pokemon/Attacks/Normal/Tackle.vb @@ -54,8 +54,8 @@ Public Overrides Sub InternalUserPokemonMoveAnimation(ByVal BattleScreen As BattleScreen, ByVal own As Boolean, ByVal CurrentPokemon As Pokemon, ByVal CurrentEntity As NPC, ByVal CurrentModel As ModelEntity) Dim MoveAnimation As AnimationQueryObject = New AnimationQueryObject(CurrentEntity, own, CurrentModel) - MoveAnimation.AnimationMovePokemonEntity(0.5, 0, 0, 0.3, False, False, 0, 0,,, 2) - MoveAnimation.AnimationMovePokemonEntity(0, 0, 0, 0.3, False, False, 1, 0,,, 2) + MoveAnimation.AnimationMoveEntity(Nothing, 0.5, 0, 0, 0.3, False, False, 0, 0,,, 2) + MoveAnimation.AnimationMoveEntity(Nothing, 0, 0, 0, 0.3, False, False, 1, 0,,, 2) BattleScreen.BattleQuery.Add(MoveAnimation) End Sub From ea12c8f5f4d1aa966154e22a8012d6f2e589bc3b Mon Sep 17 00:00:00 2001 From: JappaWakka Date: Thu, 14 Oct 2021 17:50:44 +0200 Subject: [PATCH 12/57] I was not halfway done MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit I've updated Poison Sting, through which I realized I hadn't taken some usage cases into consideration, so the system should be more robust and useful now I've also updated the animation for Switching In your own Pokémon and I've added an animation for when the Pokémon breaks out of the ball when you're trying to catch it --- P3D/Battle/BattleSystemV2/Battle.vb | 1086 ++++++++++----------- P3D/Pokemon/Attacks/Fire/Ember.vb | 4 +- P3D/Pokemon/Attacks/Grass/Absorb.vb | 2 +- P3D/Pokemon/Attacks/Normal/Growl.vb | 2 +- P3D/Pokemon/Attacks/Normal/Pound.vb | 2 +- P3D/Pokemon/Attacks/Normal/Tackle.vb | 9 +- P3D/Pokemon/Attacks/Poison/PoisonSting.vb | 34 +- 7 files changed, 571 insertions(+), 568 deletions(-) diff --git a/P3D/Battle/BattleSystemV2/Battle.vb b/P3D/Battle/BattleSystemV2/Battle.vb index 823bea6f1..a93c5e4bc 100644 --- a/P3D/Battle/BattleSystemV2/Battle.vb +++ b/P3D/Battle/BattleSystemV2/Battle.vb @@ -2706,19 +2706,14 @@ ChangeCameraAngle(1, own, BattleScreen) 'Burn animation Dim BurnAnimation As AnimationQueryObject = New AnimationQueryObject(pNPC, own) - BurnAnimation.AnimationPlaySound("Battle\Effects\Burned", 0, 0) + BurnAnimation.PlaySound("Battle\Effects\Burned", 0, 0) Dim FlameEntity As Entity = BurnAnimation.SpawnEntity(New Vector3(CSng(pNPC.Position.X - 0.25), CSng(pNPC.Position.Y - 0.25), CSng(pNPC.Position.Z - 0.25)), TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 0, 32, 32)), New Vector3(0.5, 0.5, 0.5), 1.0F) - BurnAnimation.AnimationChangeTexture(FlameEntity, TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 32, 32, 32)), 2, 1) - BurnAnimation.AnimationChangeTexture(FlameEntity, TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 64, 32, 32)), 3, 1) - BurnAnimation.AnimationChangeTexture(FlameEntity, TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 96, 32, 32)), 4, 1) - BurnAnimation.AnimationChangeTexture(FlameEntity, TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 128, 32, 32)), 5, 1) - BurnAnimation.AnimationFadeEntity(FlameEntity, 1, False, 0.0F, 6, 1, 1) + BurnAnimation.ChangeEntityTexture(FlameEntity, False, TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 32, 32, 32)), 2, 1) + BurnAnimation.ChangeEntityTexture(FlameEntity, False, TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 64, 32, 32)), 3, 1) + BurnAnimation.ChangeEntityTexture(FlameEntity, False, TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 96, 32, 32)), 4, 1) + BurnAnimation.ChangeEntityTexture(FlameEntity, True, TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 128, 32, 32)), 5, 2) BattleScreen.BattleQuery.Add(BurnAnimation) - If FlameEntity.Opacity = 0.0F Then - BurnAnimation.RemoveEntity(FlameEntity) - End If - Select Case message Case "" 'Print default message only BattleScreen.BattleQuery.Add(New TextQueryObject(p.GetDisplayName() & " got burned!")) @@ -2729,30 +2724,30 @@ BattleScreen.BattleQuery.Add(New TextQueryObject(p.GetDisplayName() & " got burned!")) End Select If p.Ability.Name.ToLower() = "synchronize" AndAlso from <> own Then - Me.InflictBurn(Not own, Not own, BattleScreen, "Synchronize passed over the burn.", "synchronize") - End If - - If Not p.Item Is Nothing Then - If p.Item.Name.ToLower() = "rawst" AndAlso BattleScreen.FieldEffects.CanUseItem(own) = True AndAlso BattleScreen.FieldEffects.CanUseOwnItem(own, BattleScreen) = True Then - If RemoveHeldItem(own, own, BattleScreen, "", "berry:rawst") = True Then - BattleScreen.BattleQuery.Add(New PlaySoundQueryObject("Use_Item", False)) - CureStatusProblem(own, own, BattleScreen, "The Rawst Berry cured the burn of " & p.GetDisplayName() & "!", "berry:rawst") - End If - End If - End If - - If Not p.Item Is Nothing Then - If p.Item.Name.ToLower() = "lum" AndAlso BattleScreen.FieldEffects.CanUseItem(own) = True AndAlso BattleScreen.FieldEffects.CanUseOwnItem(own, BattleScreen) = True Then - If RemoveHeldItem(own, own, BattleScreen, "", "berry:lum") = True Then - BattleScreen.BattleQuery.Add(New PlaySoundQueryObject("Use_Item", False)) - CureStatusProblem(own, own, BattleScreen, "The Lum Berry cured the burn of " & p.GetDisplayName() & "!", "berry:lum") - End If - End If - End If - - Return True + Me.InflictBurn(Not own, Not own, BattleScreen, "Synchronize passed over the burn.", "synchronize") End If + + If Not p.Item Is Nothing Then + If p.Item.Name.ToLower() = "rawst" AndAlso BattleScreen.FieldEffects.CanUseItem(own) = True AndAlso BattleScreen.FieldEffects.CanUseOwnItem(own, BattleScreen) = True Then + If RemoveHeldItem(own, own, BattleScreen, "", "berry:rawst") = True Then + BattleScreen.BattleQuery.Add(New PlaySoundQueryObject("Use_Item", False)) + CureStatusProblem(own, own, BattleScreen, "The Rawst Berry cured the burn of " & p.GetDisplayName() & "!", "berry:rawst") + End If + End If + End If + + If Not p.Item Is Nothing Then + If p.Item.Name.ToLower() = "lum" AndAlso BattleScreen.FieldEffects.CanUseItem(own) = True AndAlso BattleScreen.FieldEffects.CanUseOwnItem(own, BattleScreen) = True Then + If RemoveHeldItem(own, own, BattleScreen, "", "berry:lum") = True Then + BattleScreen.BattleQuery.Add(New PlaySoundQueryObject("Use_Item", False)) + CureStatusProblem(own, own, BattleScreen, "The Lum Berry cured the burn of " & p.GetDisplayName() & "!", "berry:lum") + End If + End If + End If + + Return True End If + End If End If End If End If @@ -3421,19 +3416,18 @@ Dim maxAmount As Integer = 20 * val Dim currentAmount As Integer = 0 While currentAmount <= maxAmount - Dim Texture As String = "Textures\Battle\StatChange\statDown" - Dim Position As Vector3 = New Vector3(0, -0.4, 0) - Dim Destination As Vector3 = New Vector3(0, 0.8, 0) - Dim Scale As Vector3 = New Vector3(0.2F) + Dim Texture As Texture2D = TextureManager.GetTexture("Textures\Battle\StatChange\statUp") Dim xPos = CSng((Random.NextDouble() - 0.5) * 1.2) Dim zPos = CSng((Random.NextDouble() - 0.5) * 1.2) - Position.X = xPos - Position.Z = zPos - Destination.X = xPos - Destination.Z = zPos + Dim Position As New Vector3(xPos + pNPC.Position.X, CSng(pNPC.Position.Y - 0.4), pNPC.Position.Z + zPos) + Dim Destination As New Vector3(xPos + pNPC.Position.X, CSng(pNPC.Position.Y + 0.8), zPos + pNPC.Position.Z) + Dim Scale As New Vector3(0.2F) + + Dim StatEntity As Entity = StatAnimation.SpawnEntity(Position, Texture, Scale, 1.0F) Dim startDelay As Double = 5.0 * Random.NextDouble() - StatAnimation.AnimationSpawnMovingEntity(Position.X, Position.Y, Position.Z, Texture, Scale.X, Scale.Y, Scale.Z, Destination.X, Destination.Y, Destination.Z, 0.05F, False, True, CSng(startDelay), 0.0F) + + StatAnimation.MoveEntity(Nothing, True, Destination.X, Destination.Y, Destination.Z, 0.05F, False, True, CSng(startDelay), 0.0F) Threading.Interlocked.Increment(currentAmount) End While BattleScreen.BattleQuery.Add(New PlaySoundQueryObject("Battle\Effects\Stat_Raise", False)) @@ -3699,27 +3693,26 @@ End If End If '***STAT DECREASE ANIMATION*** - Dim MoveAnimation As AnimationQueryObject = New AnimationQueryObject(pNPC, Not own) + Dim StatAnimation As AnimationQueryObject = New AnimationQueryObject(pNPC, Not own) Dim maxAmount As Integer = 20 * val Dim currentAmount As Integer = 0 While currentAmount <= maxAmount - Dim Texture As String = "Textures\Battle\StatChange\statDown" - Dim Position As Vector3 = New Vector3(0, 0.8, 0) - Dim Destination As Vector3 = New Vector3(0, -0.4, 0) - Dim Scale As Vector3 = New Vector3(0.2F) + Dim Texture As Texture2D = TextureManager.GetTexture("Textures\Battle\StatChange\statDown") Dim xPos = CSng((Random.NextDouble() - 0.5) * 1.2) Dim zPos = CSng((Random.NextDouble() - 0.5) * 1.2) - Position.X = xPos - Position.Z = zPos - Destination.X = xPos - Destination.Z = zPos + Dim Position As New Vector3(xPos + pNPC.Position.X, CSng(pNPC.Position.Y + 0.8), pNPC.Position.Z + zPos) + Dim Destination As New Vector3(xPos + pNPC.Position.X, CSng(pNPC.Position.Y - 0.4), zPos + pNPC.Position.Z) + Dim Scale As New Vector3(0.2F) + + Dim StatEntity As Entity = StatAnimation.SpawnEntity(Position, Texture, Scale, 1.0F) Dim startDelay As Double = 5.0 * Random.NextDouble() - MoveAnimation.AnimationSpawnMovingEntity(Position.X, Position.Y, Position.Z, Texture, Scale.X, Scale.Y, Scale.Z, Destination.X, Destination.Y, Destination.Z, 0.05F, False, True, CSng(startDelay), 0.0F) + + StatAnimation.MoveEntity(Nothing, True, Destination.X, Destination.Y, Destination.Z, 0.05F, False, True, CSng(startDelay), 0.0F) Threading.Interlocked.Increment(currentAmount) End While - MoveAnimation.AnimationPlaySound("Battle\Effects\Stat_Lower", 0.0F, 10.0F) - BattleScreen.BattleQuery.Add(MoveAnimation) + StatAnimation.PlaySound("Battle\Effects\Stat_Lower", 0.0F, 10.0F) + BattleScreen.BattleQuery.Add(StatAnimation) Dim printMessage As String = p.GetDisplayName() & "'s " & statString Select Case val @@ -4005,10 +3998,10 @@ End If Dim HitAnimation As AnimationQueryObject = New AnimationQueryObject(pNPC, own) - HitAnimation.AnimationFadeEntity(Nothing, 1, False, 0, 0, 0) - HitAnimation.AnimationFadeEntity(Nothing, 1, True, 1, 1, 0) - HitAnimation.AnimationFadeEntity(Nothing, 1, False, 0, 2, 0) - HitAnimation.AnimationFadeEntity(Nothing, 1, True, 1, 3, 0) + HitAnimation.FadeEntity(Nothing, False, 1, False, 0, 0, 0) + HitAnimation.FadeEntity(Nothing, False, 1, True, 1, 1, 0) + HitAnimation.FadeEntity(Nothing, False, 1, False, 0, 2, 0) + HitAnimation.FadeEntity(Nothing, False, 1, True, 1, 3, 0) BattleScreen.BattleQuery.Add(HitAnimation) If own = True Then @@ -4763,14 +4756,14 @@ #End Region - ''' - ''' Switches camera to angle - ''' - ''' 0=main battle/1=own pokemon/2=opp pokemon - ''' If the code comes from the own player or not. - ''' Battlescreen reference - ''' If the call should get added the PVP list or the own queue. - Public Sub ChangeCameraAngle(ByVal direction As Integer, ByVal own As Boolean, ByVal BattleScreen As BattleScreen, Optional ByVal AddPVP As Boolean = False) + ''' + ''' Switches camera to angle + ''' + ''' 0=main battle/1=own pokemon/2=opp pokemon + ''' If the code comes from the own player or not. + ''' Battlescreen reference + ''' If the call should get added the PVP list or the own queue. + Public Sub ChangeCameraAngle(ByVal direction As Integer, ByVal own As Boolean, ByVal BattleScreen As BattleScreen, Optional ByVal AddPVP As Boolean = False) Dim q As CameraQueryObject = Nothing Select Case direction @@ -5364,7 +5357,7 @@ If .OwnPokemon.Status = Pokemon.StatusProblems.Poison Then 'Own Poison 'Poison animation Dim PoisonAnimation As AnimationQueryObject = New AnimationQueryObject(BattleScreen.OwnPokemonNPC, True) - PoisonAnimation.AnimationPlaySound("Battle\Effects\Poisoned", 0, 0) + PoisonAnimation.PlaySound("Battle\Effects\Poisoned", 0, 0) PoisonAnimation.AnimationSpawnFadingEntity(-0.25, -0.25, -0.25, "Textures\Battle\Poison\Bubble,0,0,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 0, 1) PoisonAnimation.AnimationSpawnFadingEntity(-0.25, -0.25, -0.25, "Textures\Battle\Poison\Bubble,0,32,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 1, 1) @@ -5388,7 +5381,7 @@ Dim multiplier As Double = (.FieldEffects.OwnPoisonCounter / 16) 'Poison animation Dim PoisonAnimation As AnimationQueryObject = New AnimationQueryObject(BattleScreen.OwnPokemonNPC, True) - PoisonAnimation.AnimationPlaySound("Battle\Effects\Poisoned", 0, 0) + PoisonAnimation.PlaySound("Battle\Effects\Poisoned", 0, 0) PoisonAnimation.AnimationSpawnFadingEntity(-0.25, -0.25, -0.25, "Textures\Battle\Poison\Bubble,0,0,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 0, 1) PoisonAnimation.AnimationSpawnFadingEntity(-0.25, -0.25, -0.25, "Textures\Battle\Poison\Bubble,0,32,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 1, 1) @@ -5420,20 +5413,15 @@ 'Burn animation Dim BurnAnimation As AnimationQueryObject = New AnimationQueryObject(BattleScreen.OwnPokemonNPC, False) - BurnAnimation.AnimationPlaySound("Battle\Effects\Burned", 0, 0) + BurnAnimation.PlaySound("Battle\Effects\Burned", 0, 0) Dim FlameEntity As Entity = BurnAnimation.SpawnEntity(New Vector3(CSng(BattleScreen.OwnPokemonNPC.Position.X + 0.25), CSng(BattleScreen.OwnPokemonNPC.Position.Y - 0.25), CSng(BattleScreen.OwnPokemonNPC.Position.Z + 0.25)), TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 0, 32, 32)), New Vector3(0.5, 0.5, 0.5), 1.0F) - BurnAnimation.AnimationChangeTexture(FlameEntity, TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 32, 32, 32)), 2, 1) - BurnAnimation.AnimationChangeTexture(FlameEntity, TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 64, 32, 32)), 3, 1) - BurnAnimation.AnimationChangeTexture(FlameEntity, TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 96, 32, 32)), 4, 1) - BurnAnimation.AnimationChangeTexture(FlameEntity, TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 128, 32, 32)), 5, 1) - BurnAnimation.AnimationFadeEntity(FlameEntity, 1, False, 0.0F, 6, 1, 1) + BurnAnimation.ChangeEntityTexture(FlameEntity, False, TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 32, 32, 32)), 2, 1) + BurnAnimation.ChangeEntityTexture(FlameEntity, False, TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 64, 32, 32)), 3, 1) + BurnAnimation.ChangeEntityTexture(FlameEntity, False, TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 96, 32, 32)), 4, 1) + BurnAnimation.ChangeEntityTexture(FlameEntity, True, TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 128, 32, 32)), 5, 2) BattleScreen.BattleQuery.Add(BurnAnimation) - If FlameEntity.Opacity = 0.0F Then - BurnAnimation.RemoveEntity(FlameEntity) - End If - 'Actual damage ReduceHP(reduceAmount, True, True, BattleScreen, .OwnPokemon.GetDisplayName() & " is hurt by the burn.", "burn") End If @@ -6163,7 +6151,7 @@ If .OppPokemon.Status = Pokemon.StatusProblems.Poison Then 'Opp Poison 'Poison animation Dim PoisonAnimation As AnimationQueryObject = New AnimationQueryObject(BattleScreen.OppPokemonNPC, False) - PoisonAnimation.AnimationPlaySound("Battle\Effects\Poisoned", 0, 0) + PoisonAnimation.PlaySound("Battle\Effects\Poisoned", 0, 0) PoisonAnimation.AnimationSpawnFadingEntity(-0.25, -0.25, -0.25, "Textures\Battle\Poison\Bubble,0,0,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 0, 1) PoisonAnimation.AnimationSpawnFadingEntity(-0.25, -0.25, -0.25, "Textures\Battle\Poison\Bubble,0,32,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 1, 1) @@ -6187,7 +6175,7 @@ Dim multiplier As Double = (.FieldEffects.OppPoisonCounter / 16) 'Poison animation Dim PoisonAnimation As AnimationQueryObject = New AnimationQueryObject(BattleScreen.OppPokemonNPC, False) - PoisonAnimation.AnimationPlaySound("Battle\Effects\Poisoned", 0, 0) + PoisonAnimation.PlaySound("Battle\Effects\Poisoned", 0, 0) PoisonAnimation.AnimationSpawnFadingEntity(-0.25, -0.25, -0.25, "Textures\Battle\Poison\Bubble,0,0,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 0, 1) PoisonAnimation.AnimationSpawnFadingEntity(-0.25, -0.25, -0.25, "Textures\Battle\Poison\Bubble,0,32,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 1, 1) @@ -6218,20 +6206,15 @@ End If 'Burn animation Dim BurnAnimation As AnimationQueryObject = New AnimationQueryObject(BattleScreen.OppPokemonNPC, False) - BurnAnimation.AnimationPlaySound("Battle\Effects\Burned", 0, 0) + BurnAnimation.PlaySound("Battle\Effects\Burned", 0, 0) Dim FlameEntity As Entity = BurnAnimation.SpawnEntity(New Vector3(CSng(BattleScreen.OppPokemonNPC.Position.X - 0.25), CSng(BattleScreen.OwnPokemonNPC.Position.Y - 0.25), CSng(BattleScreen.OwnPokemonNPC.Position.Z - 0.25)), TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 0, 32, 32)), New Vector3(0.5, 0.5, 0.5), 1.0F) - BurnAnimation.AnimationChangeTexture(FlameEntity, TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 32, 32, 32)), 2, 1) - BurnAnimation.AnimationChangeTexture(FlameEntity, TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 64, 32, 32)), 3, 1) - BurnAnimation.AnimationChangeTexture(FlameEntity, TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 96, 32, 32)), 4, 1) - BurnAnimation.AnimationChangeTexture(FlameEntity, TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 128, 32, 32)), 5, 1) - BurnAnimation.AnimationFadeEntity(FlameEntity, 1, False, 0.0F, 6, 1, 1) + BurnAnimation.ChangeEntityTexture(FlameEntity, False, TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 32, 32, 32)), 2, 1) + BurnAnimation.ChangeEntityTexture(FlameEntity, False, TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 64, 32, 32)), 3, 1) + BurnAnimation.ChangeEntityTexture(FlameEntity, False, TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 96, 32, 32)), 4, 1) + BurnAnimation.ChangeEntityTexture(FlameEntity, True, TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 128, 32, 32)), 5, 2) BattleScreen.BattleQuery.Add(BurnAnimation) - If FlameEntity.Opacity = 0.0F Then - BurnAnimation.RemoveEntity(FlameEntity) - End If - 'Actual damage ReduceHP(reduceAmount, False, False, BattleScreen, .OppPokemon.GetDisplayName() & " is hurt by the burn.", "burn") End If @@ -6756,38 +6739,38 @@ End If Else If BattleScreen.IsTrainerBattle = True Then - EndBattle(EndBattleReasons.LoseTrainer, BattleScreen, False) - If BattleScreen.IsRemoteBattle = True Then - EndBattle(EndBattleReasons.LoseTrainer, BattleScreen, True) - End If - Else - EndBattle(EndBattleReasons.LoseWild, BattleScreen, False) - End If - End If - End With - End Sub + EndBattle(EndBattleReasons.LoseTrainer, BattleScreen, False) + If BattleScreen.IsRemoteBattle = True Then + EndBattle(EndBattleReasons.LoseTrainer, BattleScreen, True) + End If + Else + EndBattle(EndBattleReasons.LoseWild, BattleScreen, False) + End If + End If + End With + End Sub - Public Sub ApplyOwnBatonPass(ByVal BattleScreen As BattleScreen) - If BattleScreen.FieldEffects.OwnUsedBatonPass = True Then - BattleScreen.FieldEffects.OwnUsedBatonPass = False + Public Sub ApplyOwnBatonPass(ByVal BattleScreen As BattleScreen) + If BattleScreen.FieldEffects.OwnUsedBatonPass = True Then + BattleScreen.FieldEffects.OwnUsedBatonPass = False - BattleScreen.OwnPokemon.StatAttack = BattleScreen.FieldEffects.OwnBatonPassStats(0) - BattleScreen.OwnPokemon.StatDefense = BattleScreen.FieldEffects.OwnBatonPassStats(1) - BattleScreen.OwnPokemon.StatSpAttack = BattleScreen.FieldEffects.OwnBatonPassStats(2) - BattleScreen.OwnPokemon.StatSpDefense = BattleScreen.FieldEffects.OwnBatonPassStats(3) - BattleScreen.OwnPokemon.StatSpeed = BattleScreen.FieldEffects.OwnBatonPassStats(4) - BattleScreen.OwnPokemon.Evasion = BattleScreen.FieldEffects.OwnBatonPassStats(5) - BattleScreen.OwnPokemon.Accuracy = BattleScreen.FieldEffects.OwnBatonPassStats(6) + BattleScreen.OwnPokemon.StatAttack = BattleScreen.FieldEffects.OwnBatonPassStats(0) + BattleScreen.OwnPokemon.StatDefense = BattleScreen.FieldEffects.OwnBatonPassStats(1) + BattleScreen.OwnPokemon.StatSpAttack = BattleScreen.FieldEffects.OwnBatonPassStats(2) + BattleScreen.OwnPokemon.StatSpDefense = BattleScreen.FieldEffects.OwnBatonPassStats(3) + BattleScreen.OwnPokemon.StatSpeed = BattleScreen.FieldEffects.OwnBatonPassStats(4) + BattleScreen.OwnPokemon.Evasion = BattleScreen.FieldEffects.OwnBatonPassStats(5) + BattleScreen.OwnPokemon.Accuracy = BattleScreen.FieldEffects.OwnBatonPassStats(6) - If BattleScreen.FieldEffects.OwnBatonPassConfusion = True Then - BattleScreen.FieldEffects.OwnBatonPassConfusion = False - BattleScreen.OwnPokemon.AddVolatileStatus(Pokemon.VolatileStatus.Confusion) - End If - End If - End Sub + If BattleScreen.FieldEffects.OwnBatonPassConfusion = True Then + BattleScreen.FieldEffects.OwnBatonPassConfusion = False + BattleScreen.OwnPokemon.AddVolatileStatus(Pokemon.VolatileStatus.Confusion) + End If + End If + End Sub - Public Sub SwitchInOwn(ByVal BattleScreen As BattleScreen, ByVal NewPokemonIndex As Integer, ByVal FirstTime As Boolean, ByVal InsertIndex As Integer, Optional ByVal message As String = "") - HasSwitchedInOwn = True + Public Sub SwitchInOwn(ByVal BattleScreen As BattleScreen, ByVal NewPokemonIndex As Integer, ByVal FirstTime As Boolean, ByVal InsertIndex As Integer, Optional ByVal message As String = "") + HasSwitchedInOwn = True If FirstTime = False Then Dim insertMessage As String = message @@ -6800,28 +6783,32 @@ Dim BallReturn As AnimationQueryObject = New AnimationQueryObject(BattleScreen.OwnPokemonNPC, False, BattleScreen.OwnPokemonModel) ' Ball Closes - BallReturn.AnimationPlaySound("Battle\Pokeball\Open", 0, 0) + BallReturn.PlaySound("Battle\Pokeball\Open", 0, 0) Dim SmokeReturned As Integer = 0 Do Dim SmokePosition = New Vector3(CSng(Random.Next(-10, 10) / 10), CSng(Random.Next(-10, 10) / 10), CSng(Random.Next(-10, 10) / 10)) - Dim SmokeDestination = New Vector3(0, 0, 0) + Dim SmokeDestination As Vector3 = New Vector3(0, 0, 0) - Dim SmokeTexture As String = "Textures\Battle\Cloud" + Dim SmokeTexture As Texture2D = TextureManager.GetTexture("Textures\Battle\Smoke") Dim SmokeScale = New Vector3(CSng(Random.Next(2, 6) / 10)) Dim SmokeSpeed = CSng(Random.Next(1, 3) / 10.0F) - BallReturn.AnimationSpawnMovingEntity(SmokePosition.X, SmokePosition.Y, SmokePosition.Z, SmokeTexture, SmokeScale.X, SmokeScale.Y, SmokeScale.Z, SmokeDestination.X, SmokeDestination.Y, SmokeDestination.Z, SmokeSpeed, False, False, 0.0F, 0.0F) + Dim SmokeEntity As Entity = BallReturn.SpawnEntity(SmokePosition, SmokeTexture, SmokeScale, 1.0F) + + BallReturn.MoveEntity(SmokeEntity, True, SmokeDestination.X, SmokeDestination.Y, SmokeDestination.Z, SmokeSpeed, False, False, 0.0F, 0.0F) + Threading.Interlocked.Increment(SmokeReturned) Loop While SmokeReturned <= 38 ' Pokemon disappears - BallReturn.AnimationFadeEntity(Nothing, 1, False, 0, 1, 0) - BallReturn.AnimationMoveEntity(Nothing, 0, 0.5, 0, 0.5, False, False, 2, 0,,, 3) + BallReturn.FadeEntity(Nothing, False, 1, False, 0, 1, 0) + BallReturn.MoveEntity(Nothing, False, 0, 0.5, 0, 0.5, False, False, 2, 0,,, 3) ' Ball returns - BallReturn.AnimationPlaySound("Battle\Pokeball\Throw", 1, 0) - BallReturn.AnimationSpawnMovingEntity(0, 0, 0, BattleScreen.OwnPokemon.CatchBall.TextureSource, 0.3F, 0.3F, 0.3F, -2, 0, 0, 0.1, False, True, 1, 0,, 0.3) + BallReturn.PlaySound("Battle\Pokeball\Throw", 1, 0) + Dim BallReturnEntity As Entity = BallReturn.SpawnEntity(BattleScreen.OwnPokemonNPC.Position, TextureManager.GetTexture(BattleScreen.OwnPokemon.CatchBall.TextureSource), New Vector3(0.3F), 1.0F) + BallReturn.MoveEntity(BallReturnEntity, True, BattleScreen.OwnPokemonNPC.Position.X - 2, BattleScreen.OwnPokemonNPC.Position.Y, BattleScreen.OwnPokemonNPC.Position.Z, 0.1, False, True, 1, 0,, 0.3) BattleScreen.AddToQuery(InsertIndex, BallReturn) @@ -6859,315 +6846,322 @@ ' Ball is thrown Dim BallThrow As AnimationQueryObject = New AnimationQueryObject(BattleScreen.OwnPokemonNPC, False, BattleScreen.OwnPokemonModel) - BallThrow.AnimationPlaySound("Battle\Pokeball\Throw", 0, 0) - BallThrow.AnimationSpawnMovingEntity(-2, -0.15, 0, BattleScreen.OwnPokemon.CatchBall.TextureSource, 0.3F, 0.3F, 0.3F, 0, 0.35, 0, 0.1, False, True, 0F, 0F,, 0.3) + + BallThrow.PlaySound("Battle\Pokeball\Throw", 0, 0) + + Dim BallThrowEntity As Entity = BallReturn.SpawnEntity(BattleScreen.OwnPokemonNPC.Position + New Vector3(-2, -0.15, 0), TextureManager.GetTexture(BattleScreen.OwnPokemon.CatchBall.TextureSource), New Vector3(0.3F), 1.0F) + BallThrow.MoveEntity(BallThrowEntity, True, BattleScreen.OwnPokemonNPC.Position.X, CSng(BattleScreen.OwnPokemonNPC.Position.Y + 0.35), BattleScreen.OwnPokemonNPC.Position.Z, 0.1, False, True, 0F, 0F,, 0.3) ' Ball Opens - BallThrow.AnimationPlaySound("Battle\Pokeball\Open", 3, 0) + BallThrow.PlaySound("Battle\Pokeball\Open", 3, 0) + Dim SmokeSpawned As Integer = 0 Do Dim SmokePosition = New Vector3(0, 0.35, 0) Dim SmokeDestination = New Vector3(CSng(Random.Next(-10, 10) / 10), CSng(Random.Next(-10, 10) / 10), CSng(Random.Next(-10, 10) / 10)) - Dim SmokeTexture As String = "Textures\Battle\Cloud" + Dim SmokeTexture As Texture2D = TextureManager.GetTexture("Textures\Battle\Smoke") Dim SmokeScale = New Vector3(CSng(Random.Next(2, 6) / 10)) Dim SmokeSpeed = CSng(Random.Next(1, 3) / 10.0F) - BallThrow.AnimationSpawnMovingEntity(SmokePosition.X, SmokePosition.Y, SmokePosition.Z, SmokeTexture, SmokeScale.X, SmokeScale.Y, SmokeScale.Z, SmokeDestination.X, SmokeDestination.Y, SmokeDestination.Z, SmokeSpeed, False, False, 3.0F, 0.0F) + Dim SmokeEntity As Entity = BallThrow.SpawnEntity(SmokePosition, SmokeTexture, SmokeScale, 1.0F) + + BallThrow.MoveEntity(SmokeEntity, True, SmokeDestination.X, SmokeDestination.Y, SmokeDestination.Z, SmokeSpeed, False, False, 3.0F, 0.0F) + Threading.Interlocked.Increment(SmokeSpawned) Loop While SmokeSpawned <= 38 ' Pokemon appears - BallThrow.AnimationFadeEntity(Nothing, 1, True, 1, 4, 0) - BallThrow.AnimationPlaySound(CStr(BattleScreen.OwnPokemon.Number), 4, 0,, True) + BallThrow.FadeEntity(Nothing, False, 1, True, 1, 4, 0) + BallThrow.PlaySound(CStr(BattleScreen.OwnPokemon.Number), 4, 0,, True) ' Pokémon falls down - BallThrow.AnimationMoveEntity(Nothing, 0, 0, 0, 0.05F, False, False, 4, 0,,, 3) + BallThrow.MoveEntity(Nothing, False, 0, 0, 0, 0.05F, False, False, 4, 0,,, 3) BattleScreen.AddToQuery(InsertIndex, BallThrow) End If With BattleScreen - If .FieldEffects.UsedPokemon.Contains(NewPokemonIndex) = False Then - .FieldEffects.UsedPokemon.Add(NewPokemonIndex) - End If + If .FieldEffects.UsedPokemon.Contains(NewPokemonIndex) = False Then + .FieldEffects.UsedPokemon.Add(NewPokemonIndex) + End If - If Not .OwnPokemon.Item Is Nothing Then - If .OwnPokemon.Item.Name.ToLower() = "amulet coin" Or .OwnPokemon.Item.Name.ToLower() = "luck incense" Then - If .FieldEffects.CanUseItem(True) = True And .FieldEffects.CanUseOwnItem(True, BattleScreen) = True Then - BattleScreen.FieldEffects.AmuletCoin += 1 - End If - End If - End If + If Not .OwnPokemon.Item Is Nothing Then + If .OwnPokemon.Item.Name.ToLower() = "amulet coin" Or .OwnPokemon.Item.Name.ToLower() = "luck incense" Then + If .FieldEffects.CanUseItem(True) = True And .FieldEffects.CanUseOwnItem(True, BattleScreen) = True Then + BattleScreen.FieldEffects.AmuletCoin += 1 + End If + End If + End If - Dim p As Pokemon = .OwnPokemon - Dim op As Pokemon = .OppPokemon + Dim p As Pokemon = .OwnPokemon + Dim op As Pokemon = .OppPokemon - Dim spikeAffected As Boolean = True - Dim rockAffected As Boolean = True + Dim spikeAffected As Boolean = True + Dim rockAffected As Boolean = True - spikeAffected = BattleScreen.FieldEffects.IsGrounded(True, BattleScreen) + spikeAffected = BattleScreen.FieldEffects.IsGrounded(True, BattleScreen) - 'Spikes - If spikeAffected = True Then - If .FieldEffects.OppSpikes > 0 And (p.Ability.Name.ToLower() <> "magic guard" Or BattleScreen.FieldEffects.CanUseAbility(True, BattleScreen, 1) = False) Then - Dim spikeDamage As Double = 1D - Select Case .FieldEffects.OppSpikes - Case 1 - spikeDamage = (p.MaxHP / 100) * 12.5D - Case 2 - spikeDamage = (p.MaxHP / 100) * 16.7D - Case 3 - spikeDamage = (p.MaxHP / 100) * 25D - End Select - ReduceHP(CInt(spikeDamage), True, False, BattleScreen, "The Spikes hurt " & p.GetDisplayName() & "!", "spikes") - End If - End If + 'Spikes + If spikeAffected = True Then + If .FieldEffects.OppSpikes > 0 And (p.Ability.Name.ToLower() <> "magic guard" Or BattleScreen.FieldEffects.CanUseAbility(True, BattleScreen, 1) = False) Then + Dim spikeDamage As Double = 1D + Select Case .FieldEffects.OppSpikes + Case 1 + spikeDamage = (p.MaxHP / 100) * 12.5D + Case 2 + spikeDamage = (p.MaxHP / 100) * 16.7D + Case 3 + spikeDamage = (p.MaxHP / 100) * 25D + End Select + ReduceHP(CInt(spikeDamage), True, False, BattleScreen, "The Spikes hurt " & p.GetDisplayName() & "!", "spikes") + End If + End If - 'Sticky Web - If spikeAffected = True Then - If .FieldEffects.OppStickyWeb > 0 Then + 'Sticky Web + If spikeAffected = True Then + If .FieldEffects.OppStickyWeb > 0 Then - LowerStat(True, True, BattleScreen, "Speed", 1, "Your pokemon was caught in a Sticky Web!", "stickyweb") + LowerStat(True, True, BattleScreen, "Speed", 1, "Your pokemon was caught in a Sticky Web!", "stickyweb") - End If - End If + End If + End If - 'Toxic Spikes - If spikeAffected = True Then - If .FieldEffects.OppToxicSpikes > 0 And p.Status = Pokemon.StatusProblems.None And p.Type1.Type <> Element.Types.Poison And p.Type2.Type <> Element.Types.Poison Then - Select Case .FieldEffects.OppToxicSpikes - Case 1 - InflictPoison(True, False, BattleScreen, False, "The Toxic Spikes hurt " & p.GetDisplayName() & "!", "toxicspikes") - Case 2 - InflictPoison(True, False, BattleScreen, True, "The Toxic Spikes hurt " & p.GetDisplayName() & "!", "toxicspikes") - End Select - End If - If .FieldEffects.OppToxicSpikes > 0 Then - If p.Type1.Type = Element.Types.Poison Or p.Type2.Type = Element.Types.Poison Then - .AddToQuery(InsertIndex, New TextQueryObject(p.GetDisplayName() & " removed the Toxic Spikes!")) - .FieldEffects.OppToxicSpikes = 0 - End If - End If - End If + 'Toxic Spikes + If spikeAffected = True Then + If .FieldEffects.OppToxicSpikes > 0 And p.Status = Pokemon.StatusProblems.None And p.Type1.Type <> Element.Types.Poison And p.Type2.Type <> Element.Types.Poison Then + Select Case .FieldEffects.OppToxicSpikes + Case 1 + InflictPoison(True, False, BattleScreen, False, "The Toxic Spikes hurt " & p.GetDisplayName() & "!", "toxicspikes") + Case 2 + InflictPoison(True, False, BattleScreen, True, "The Toxic Spikes hurt " & p.GetDisplayName() & "!", "toxicspikes") + End Select + End If + If .FieldEffects.OppToxicSpikes > 0 Then + If p.Type1.Type = Element.Types.Poison Or p.Type2.Type = Element.Types.Poison Then + .AddToQuery(InsertIndex, New TextQueryObject(p.GetDisplayName() & " removed the Toxic Spikes!")) + .FieldEffects.OppToxicSpikes = 0 + End If + End If + End If - 'Stealth Rock - If rockAffected = True Then - If .FieldEffects.OppStealthRock > 0 And (p.Ability.Name.ToLower() <> "magic guard" Or BattleScreen.FieldEffects.CanUseAbility(True, BattleScreen, 1) = False) Then - Dim rocksDamage As Double = 1D + 'Stealth Rock + If rockAffected = True Then + If .FieldEffects.OppStealthRock > 0 And (p.Ability.Name.ToLower() <> "magic guard" Or BattleScreen.FieldEffects.CanUseAbility(True, BattleScreen, 1) = False) Then + Dim rocksDamage As Double = 1D - Dim effectiveness As Single = BattleCalculation.ReverseTypeEffectiveness(Element.GetElementMultiplier(New Element(Element.Types.Rock), p.Type1)) * BattleCalculation.ReverseTypeEffectiveness(Element.GetElementMultiplier(New Element(Element.Types.Rock), p.Type2)) - Select Case effectiveness - Case 0.25F - rocksDamage = (p.MaxHP / 100) * 3.125D - Case 0.5F - rocksDamage = (p.MaxHP / 100) * 6.25D - Case 1.0F - rocksDamage = (p.MaxHP / 100) * 12.5D - Case 2.0F - rocksDamage = (p.MaxHP / 100) * 25D - Case 4.0F - rocksDamage = (p.MaxHP / 100) * 50D - End Select + Dim effectiveness As Single = BattleCalculation.ReverseTypeEffectiveness(Element.GetElementMultiplier(New Element(Element.Types.Rock), p.Type1)) * BattleCalculation.ReverseTypeEffectiveness(Element.GetElementMultiplier(New Element(Element.Types.Rock), p.Type2)) + Select Case effectiveness + Case 0.25F + rocksDamage = (p.MaxHP / 100) * 3.125D + Case 0.5F + rocksDamage = (p.MaxHP / 100) * 6.25D + Case 1.0F + rocksDamage = (p.MaxHP / 100) * 12.5D + Case 2.0F + rocksDamage = (p.MaxHP / 100) * 25D + Case 4.0F + rocksDamage = (p.MaxHP / 100) * 50D + End Select - ReduceHP(CInt(rocksDamage), True, False, BattleScreen, "The Stealth Rocks hurt " & p.GetDisplayName() & "!", "stealthrocks") - End If - End If + ReduceHP(CInt(rocksDamage), True, False, BattleScreen, "The Stealth Rocks hurt " & p.GetDisplayName() & "!", "stealthrocks") + End If + End If - TriggerAbilityEffect(BattleScreen, True) - TriggerItemEffect(BattleScreen, True) + TriggerAbilityEffect(BattleScreen, True) + TriggerItemEffect(BattleScreen, True) - If .OwnPokemon.Status = Pokemon.StatusProblems.Sleep Then - .FieldEffects.OwnSleepTurns = Core.Random.Next(1, 4) - End If + If .OwnPokemon.Status = Pokemon.StatusProblems.Sleep Then + .FieldEffects.OwnSleepTurns = Core.Random.Next(1, 4) + End If - If BattleScreen.FieldEffects.OwnHealingWish = True Then - BattleScreen.FieldEffects.OwnHealingWish = False + If BattleScreen.FieldEffects.OwnHealingWish = True Then + BattleScreen.FieldEffects.OwnHealingWish = False - If .OwnPokemon.HP < .OwnPokemon.MaxHP Or .OwnPokemon.Status <> Pokemon.StatusProblems.None Then - GainHP(.OwnPokemon.MaxHP - .OwnPokemon.HP, True, True, BattleScreen, "The Healing Wish came true for " & .OwnPokemon.GetDisplayName() & "!", "move:healingwish") - CureStatusProblem(True, True, BattleScreen, "", "move:healingwish") - End If - End If - End With - End Sub + If .OwnPokemon.HP < .OwnPokemon.MaxHP Or .OwnPokemon.Status <> Pokemon.StatusProblems.None Then + GainHP(.OwnPokemon.MaxHP - .OwnPokemon.HP, True, True, BattleScreen, "The Healing Wish came true for " & .OwnPokemon.GetDisplayName() & "!", "move:healingwish") + CureStatusProblem(True, True, BattleScreen, "", "move:healingwish") + End If + End If + End With + End Sub - Public Sub SwitchOutOpp(ByVal BattleScreen As BattleScreen, ByVal index As Integer, Optional ByVal message As String = "") - With BattleScreen - 'Natural cure cures status problems - If .OppPokemon.Ability.Name.ToLower() = "natural cure" Then - If .OppPokemon.Status <> Pokemon.StatusProblems.Fainted And .OppPokemon.Status <> Pokemon.StatusProblems.None Then - .OppPokemon.Status = Pokemon.StatusProblems.None - .BattleQuery.Add(New TextQueryObject(.OppPokemon.GetDisplayName() & "'s status problem got healed by Natural Cure")) - End If - End If - 'Regenerator ability heals 1/3 of it's max HP - If .OppPokemon.Ability.Name.ToLower() = "regenerator" Then - If Not (.OppPokemon.Status = Pokemon.StatusProblems.Fainted Or .OppPokemon.HP = 0) Then - Dim restoreHP = CInt(.OppPokemon.MaxHP / 3) - If restoreHP > 0 And .OppPokemon.HP < .OppPokemon.MaxHP And .OppPokemon.HP > 0 Then - BattleScreen.Battle.GainHP(restoreHP, False, True, BattleScreen, .OppPokemon.GetDisplayName() & "'s HP was restored!", "ability:regenerator") - End If - End If - End If - 'save baton pass stuff: - If .FieldEffects.OppUsedBatonPass = True Then - .FieldEffects.OppBatonPassStats = New List(Of Integer) - With .OppPokemon - BattleScreen.FieldEffects.OppBatonPassStats.AddRange({ .StatAttack, .StatDefense, .StatSpAttack, .StatSpDefense, .StatSpeed, .Evasion, .Accuracy}) - End With - .FieldEffects.OppBatonPassConfusion = .OppPokemon.HasVolatileStatus(Pokemon.VolatileStatus.Confusion) = True - End If + Public Sub SwitchOutOpp(ByVal BattleScreen As BattleScreen, ByVal index As Integer, Optional ByVal message As String = "") + With BattleScreen + 'Natural cure cures status problems + If .OppPokemon.Ability.Name.ToLower() = "natural cure" Then + If .OppPokemon.Status <> Pokemon.StatusProblems.Fainted And .OppPokemon.Status <> Pokemon.StatusProblems.None Then + .OppPokemon.Status = Pokemon.StatusProblems.None + .BattleQuery.Add(New TextQueryObject(.OppPokemon.GetDisplayName() & "'s status problem got healed by Natural Cure")) + End If + End If + 'Regenerator ability heals 1/3 of it's max HP + If .OppPokemon.Ability.Name.ToLower() = "regenerator" Then + If Not (.OppPokemon.Status = Pokemon.StatusProblems.Fainted Or .OppPokemon.HP = 0) Then + Dim restoreHP = CInt(.OppPokemon.MaxHP / 3) + If restoreHP > 0 And .OppPokemon.HP < .OppPokemon.MaxHP And .OppPokemon.HP > 0 Then + BattleScreen.Battle.GainHP(restoreHP, False, True, BattleScreen, .OppPokemon.GetDisplayName() & "'s HP was restored!", "ability:regenerator") + End If + End If + End If + 'save baton pass stuff: + If .FieldEffects.OppUsedBatonPass = True Then + .FieldEffects.OppBatonPassStats = New List(Of Integer) + With .OppPokemon + BattleScreen.FieldEffects.OppBatonPassStats.AddRange({ .StatAttack, .StatDefense, .StatSpAttack, .StatSpDefense, .StatSpeed, .Evasion, .Accuracy}) + End With + .FieldEffects.OppBatonPassConfusion = .OppPokemon.HasVolatileStatus(Pokemon.VolatileStatus.Confusion) = True + End If - 'Set the original objects of Pokemon - .OppPokemon.ResetTemp() + 'Set the original objects of Pokemon + .OppPokemon.ResetTemp() - 'Remove volatiles - .OppPokemon.ClearAllVolatiles() + 'Remove volatiles + .OppPokemon.ClearAllVolatiles() - 'Resetting FieldEffects - With .FieldEffects - .OppSleepTurns = 0 - .OppTruantRound = 0 - .OppTaunt = 0 - .OppSmacked = 0 - .OppRageCounter = 0 - .OppUproar = 0 - If .OppUsedBatonPass = False Then .OppFocusEnergy = 0 - .OppEndure = 0 - .OppProtectCounter = 0 - .OppDetectCounter = 0 - .OppKingsShieldCounter = 0 - .OppProtectMovesCount = 0 - If .OppUsedBatonPass = False Then .OppIngrain = 0 - If .OppUsedBatonPass = False Then .OppSubstitute = 0 - If .OppUsedBatonPass = False Then .OppMagnetRise = 0 - If .OppUsedBatonPass = False Then .OppAquaRing = 0 - .OppPoisonCounter = 0 - .OppNightmare = 0 - If .OppUsedBatonPass = False Then .OppCurse = 0 - .OppOutrage = 0 - .OppThrash = 0 - .OppPetalDance = 0 - .OppEncore = 0 - .OppEncoreMove = Nothing - If .OppUsedBatonPass = False Then .OppEmbargo = 0 - .OppYawn = 0 - If .OppUsedBatonPass = False Then .OppPerishSongCount = 0 - .OppConfusionTurns = 0 - .OppTorment = 0 - .OppTormentMove = Nothing - .OppChoiceMove = Nothing - .OppRecharge = 0 - .OppRolloutCounter = 0 - .OppIceBallCounter = 0 - .OppDefenseCurl = 0 - .OppCharge = 0 - .OppSolarBeam = 0 - .OppSolarBlade = 0 - If .OppUsedBatonPass = False Then .OppLeechSeed = 0 - If .OppUsedBatonPass = False Then .OppLockOn = 0 - .OppLansatBerry = 0 - .OppCustapBerry = 0 - .OppTrappedCounter = 0 - .OppFuryCutter = 0 - .OppEchoedVoice = 0 - .OppPokemonTurns = 0 - .OppStockpileCount = 0 - .OppDestinyBond = False - .OppGastroAcid = False + 'Resetting FieldEffects + With .FieldEffects + .OppSleepTurns = 0 + .OppTruantRound = 0 + .OppTaunt = 0 + .OppSmacked = 0 + .OppRageCounter = 0 + .OppUproar = 0 + If .OppUsedBatonPass = False Then .OppFocusEnergy = 0 + .OppEndure = 0 + .OppProtectCounter = 0 + .OppDetectCounter = 0 + .OppKingsShieldCounter = 0 + .OppProtectMovesCount = 0 + If .OppUsedBatonPass = False Then .OppIngrain = 0 + If .OppUsedBatonPass = False Then .OppSubstitute = 0 + If .OppUsedBatonPass = False Then .OppMagnetRise = 0 + If .OppUsedBatonPass = False Then .OppAquaRing = 0 + .OppPoisonCounter = 0 + .OppNightmare = 0 + If .OppUsedBatonPass = False Then .OppCurse = 0 + .OppOutrage = 0 + .OppThrash = 0 + .OppPetalDance = 0 + .OppEncore = 0 + .OppEncoreMove = Nothing + If .OppUsedBatonPass = False Then .OppEmbargo = 0 + .OppYawn = 0 + If .OppUsedBatonPass = False Then .OppPerishSongCount = 0 + .OppConfusionTurns = 0 + .OppTorment = 0 + .OppTormentMove = Nothing + .OppChoiceMove = Nothing + .OppRecharge = 0 + .OppRolloutCounter = 0 + .OppIceBallCounter = 0 + .OppDefenseCurl = 0 + .OppCharge = 0 + .OppSolarBeam = 0 + .OppSolarBlade = 0 + If .OppUsedBatonPass = False Then .OppLeechSeed = 0 + If .OppUsedBatonPass = False Then .OppLockOn = 0 + .OppLansatBerry = 0 + .OppCustapBerry = 0 + .OppTrappedCounter = 0 + .OppFuryCutter = 0 + .OppEchoedVoice = 0 + .OppPokemonTurns = 0 + .OppStockpileCount = 0 + .OppDestinyBond = False + .OppGastroAcid = False - .OppFlyCounter = 0 - .OppDigCounter = 0 - .OppBounceCounter = 0 - .OppDiveCounter = 0 - .OppShadowForceCounter = 0 - .OppPhantomForceCounter = 0 - .OppSkyDropCounter = 0 - .OppGeomancyCounter = 0 - .OppSkyAttackCounter = 0 - .OppRazorWindCounter = 0 - .OppSkullBashCounter = 0 + .OppFlyCounter = 0 + .OppDigCounter = 0 + .OppBounceCounter = 0 + .OppDiveCounter = 0 + .OppShadowForceCounter = 0 + .OppPhantomForceCounter = 0 + .OppSkyDropCounter = 0 + .OppGeomancyCounter = 0 + .OppSkyAttackCounter = 0 + .OppRazorWindCounter = 0 + .OppSkullBashCounter = 0 - .OppForesight = 0 - .OppOdorSleuth = 0 - .OppMiracleEye = 0 + .OppForesight = 0 + .OppOdorSleuth = 0 + .OppMiracleEye = 0 - .OppWrap = 0 - .OppWhirlpool = 0 - .OppBind = 0 - .OppClamp = 0 - .OppFireSpin = 0 - .OppMagmaStorm = 0 - .OppSandTomb = 0 - .OppInfestation = 0 + .OppWrap = 0 + .OppWhirlpool = 0 + .OppBind = 0 + .OppClamp = 0 + .OppFireSpin = 0 + .OppMagmaStorm = 0 + .OppSandTomb = 0 + .OppInfestation = 0 - .OppBideCounter = 0 - .OppBideDamage = 0 + .OppBideCounter = 0 + .OppBideDamage = 0 - .OppRoostUsed = False + .OppRoostUsed = False - 'Own stuff that depends on opp pokemon presence - .OwnTrappedCounter = 0 - .OwnWrap = 0 - .OwnWhirlpool = 0 - .OwnBind = 0 - .OwnClamp = 0 - .OwnFireSpin = 0 - .OwnMagmaStorm = 0 - .OwnSandTomb = 0 - .OwnInfestation = 0 + 'Own stuff that depends on opp pokemon presence + .OwnTrappedCounter = 0 + .OwnWrap = 0 + .OwnWhirlpool = 0 + .OwnBind = 0 + .OwnClamp = 0 + .OwnFireSpin = 0 + .OwnMagmaStorm = 0 + .OwnSandTomb = 0 + .OwnInfestation = 0 - If BattleScreen.OwnPokemon.HasVolatileStatus(Pokemon.VolatileStatus.Infatuation) Then - BattleScreen.OwnPokemon.RemoveVolatileStatus(Pokemon.VolatileStatus.Infatuation) - End If - End With - End With + If BattleScreen.OwnPokemon.HasVolatileStatus(Pokemon.VolatileStatus.Infatuation) Then + BattleScreen.OwnPokemon.RemoveVolatileStatus(Pokemon.VolatileStatus.Infatuation) + End If + End With + End With - BattleScreen.OppPokemon.Ability.SwitchOut(BattleScreen.OppPokemon) + BattleScreen.OppPokemon.Ability.SwitchOut(BattleScreen.OppPokemon) - If BattleScreen.IsTrainerBattle = False Then + If BattleScreen.IsTrainerBattle = False Then ChangeCameraAngle(1, False, BattleScreen) Dim Faint As AnimationQueryObject = New AnimationQueryObject(BattleScreen.OppPokemonNPC, True, BattleScreen.OppPokemonModel) - Faint.AnimationPlaySound(CStr(BattleScreen.OppPokemon.Number), 0, 2, False, True) - Faint.AnimationMoveEntity(Nothing, 0, -1, 0, 0.1, False, False, 2, 0,,, 3) + Faint.PlaySound(CStr(BattleScreen.OppPokemon.Number), 0, 2, False, True) + Faint.MoveEntity(Nothing, False, 0, -1, 0, 0.1, False, False, 2, 0,,, 3) BattleScreen.BattleQuery.Add(Faint) BattleScreen.BattleQuery.Add(New ToggleEntityQueryObject(True, ToggleEntityQueryObject.BattleEntities.OppPokemon, 2, -1, -1, -1, -1)) - EndBattle(EndBattleReasons.WinWild, BattleScreen, False) - Else - If BattleScreen.TrainerHasFightablePokemon() = True Then - If BattleScreen.OppPokemon.HP <= 0 Or BattleScreen.OppPokemon.Status = Pokemon.StatusProblems.Fainted Then - GainEXP(BattleScreen) - End If + EndBattle(EndBattleReasons.WinWild, BattleScreen, False) + Else + If BattleScreen.TrainerHasFightablePokemon() = True Then + If BattleScreen.OppPokemon.HP <= 0 Or BattleScreen.OppPokemon.Status = Pokemon.StatusProblems.Fainted Then + GainEXP(BattleScreen) + End If If BattleScreen.IsRemoteBattle And BattleScreen.OppFaint Then - 'Next pokemon is selected by the opponent. - Else - SwitchInOpp(BattleScreen, False, index) - End If - Else - GainEXP(BattleScreen) + 'Next pokemon is selected by the opponent. + Else + SwitchInOpp(BattleScreen, False, index) + End If + Else + GainEXP(BattleScreen) If message = "" Then - message = BattleScreen.Trainer.Name & ": ""Come back, " & BattleScreen.OppPokemon.GetDisplayName() & "!""" - End If + message = BattleScreen.Trainer.Name & ": ""Come back, " & BattleScreen.OppPokemon.GetDisplayName() & "!""" + End If - BattleScreen.BattleQuery.Add(New TextQueryObject(message)) + BattleScreen.BattleQuery.Add(New TextQueryObject(message)) Dim BallReturn As AnimationQueryObject = New AnimationQueryObject(BattleScreen.OppPokemonNPC, True, BattleScreen.OppPokemonModel) ' Ball Closes - BallReturn.AnimationPlaySound("Battle\Pokeball\Open", 0, 0) + BallReturn.PlaySound("Battle\Pokeball\Open", 0, 0) Dim SmokeReturned As Integer = 0 Do Dim SmokePosition = New Vector3(CSng(Random.Next(-10, 10) / 10), CSng(Random.Next(-10, 10) / 10), CSng(Random.Next(-10, 10) / 10)) Dim SmokeDestination = New Vector3(0, 0, 0) - Dim SmokeTexture As String = "Textures\Battle\Cloud" + Dim SmokeTexture As String = "Textures\Battle\Smoke" Dim SmokeScale = New Vector3(CSng(Random.Next(2, 6) / 10)) Dim SmokeSpeed = CSng(Random.Next(1, 3) / 10.0F) @@ -7178,57 +7172,57 @@ ' Pokemon disappears BallReturn.AnimationFadeEntity(Nothing, 1, False, 0, 1, 0) - BallReturn.AnimationMoveEntity(Nothing, 0, 0.5, 0, 0.5, False, False, 2, 0,,, 4) + BallReturn.MoveEntity(Nothing, False, 0, 0.5, 0, 0.5, False, False, 2, 0,,, 4) ' Ball returns - BallReturn.AnimationPlaySound("Battle\Pokeball\Throw", 1, 0) + BallReturn.PlaySound("Battle\Pokeball\Throw", 1, 0) BallReturn.AnimationSpawnMovingEntity(0, 0, 0, BattleScreen.OppPokemon.CatchBall.TextureSource, 0.3F, 0.3F, 0.3F, -2, 0, 0, 0.1, False, True, 1, 0,, 0.3) BattleScreen.BattleQuery.Add(BallReturn) EndBattle(EndBattleReasons.WinTrainer, BattleScreen, False) - If BattleScreen.IsRemoteBattle = True Then - EndBattle(EndBattleReasons.WinTrainer, BattleScreen, True) - End If - End If - End If - End Sub + If BattleScreen.IsRemoteBattle = True Then + EndBattle(EndBattleReasons.WinTrainer, BattleScreen, True) + End If + End If + End If + End Sub - Public Sub ApplyOppBatonPass(ByVal BattleScreen As BattleScreen) - If BattleScreen.FieldEffects.OppUsedBatonPass = True Then - BattleScreen.FieldEffects.OppUsedBatonPass = False + Public Sub ApplyOppBatonPass(ByVal BattleScreen As BattleScreen) + If BattleScreen.FieldEffects.OppUsedBatonPass = True Then + BattleScreen.FieldEffects.OppUsedBatonPass = False - BattleScreen.OppPokemon.StatAttack = BattleScreen.FieldEffects.OppBatonPassStats(0) - BattleScreen.OppPokemon.StatDefense = BattleScreen.FieldEffects.OppBatonPassStats(1) - BattleScreen.OppPokemon.StatSpAttack = BattleScreen.FieldEffects.OppBatonPassStats(2) - BattleScreen.OppPokemon.StatSpDefense = BattleScreen.FieldEffects.OppBatonPassStats(3) - BattleScreen.OppPokemon.StatSpeed = BattleScreen.FieldEffects.OppBatonPassStats(4) - BattleScreen.OppPokemon.Evasion = BattleScreen.FieldEffects.OppBatonPassStats(5) - BattleScreen.OppPokemon.Accuracy = BattleScreen.FieldEffects.OppBatonPassStats(6) + BattleScreen.OppPokemon.StatAttack = BattleScreen.FieldEffects.OppBatonPassStats(0) + BattleScreen.OppPokemon.StatDefense = BattleScreen.FieldEffects.OppBatonPassStats(1) + BattleScreen.OppPokemon.StatSpAttack = BattleScreen.FieldEffects.OppBatonPassStats(2) + BattleScreen.OppPokemon.StatSpDefense = BattleScreen.FieldEffects.OppBatonPassStats(3) + BattleScreen.OppPokemon.StatSpeed = BattleScreen.FieldEffects.OppBatonPassStats(4) + BattleScreen.OppPokemon.Evasion = BattleScreen.FieldEffects.OppBatonPassStats(5) + BattleScreen.OppPokemon.Accuracy = BattleScreen.FieldEffects.OppBatonPassStats(6) - If BattleScreen.FieldEffects.OppBatonPassConfusion = True Then - BattleScreen.FieldEffects.OppBatonPassConfusion = False - BattleScreen.OppPokemon.AddVolatileStatus(Pokemon.VolatileStatus.Confusion) - End If - End If - End Sub + If BattleScreen.FieldEffects.OppBatonPassConfusion = True Then + BattleScreen.FieldEffects.OppBatonPassConfusion = False + BattleScreen.OppPokemon.AddVolatileStatus(Pokemon.VolatileStatus.Confusion) + End If + End If + End Sub - Public Sub SwitchInOpp(ByVal BattleScreen As BattleScreen, ByVal FirstTime As Boolean, ByVal index As Integer) + Public Sub SwitchInOpp(ByVal BattleScreen As BattleScreen, ByVal FirstTime As Boolean, ByVal index As Integer) - If FirstTime = False Then - HasSwitchedInOpp = True + If FirstTime = False Then + HasSwitchedInOpp = True BattleScreen.BattleQuery.Add(New TextQueryObject(BattleScreen.Trainer.Name & ": ""Come back, " & BattleScreen.OppPokemon.GetDisplayName() & "!""")) Dim BallReturn As AnimationQueryObject = New AnimationQueryObject(BattleScreen.OppPokemonNPC, True, BattleScreen.OppPokemonModel) ' Ball Closes - BallReturn.AnimationPlaySound("Battle\Pokeball\Open", 0, 0) + BallReturn.PlaySound("Battle\Pokeball\Open", 0, 0) Dim SmokeReturned As Integer = 0 Do Dim SmokePosition = New Vector3(CSng(Random.Next(-10, 10) / 10), CSng(Random.Next(-10, 10) / 10), CSng(Random.Next(-10, 10) / 10)) Dim SmokeDestination = New Vector3(0, 0, 0) - Dim SmokeTexture As String = "Textures\Battle\Cloud" + Dim SmokeTexture As String = "Textures\Battle\Smoke" Dim SmokeScale = New Vector3(CSng(Random.Next(2, 6) / 10)) Dim SmokeSpeed = CSng(Random.Next(1, 3) / 10.0F) @@ -7239,51 +7233,51 @@ ' Pokemon disappears BallReturn.AnimationFadeEntity(Nothing, 1, False, 0, 1, 0) - BallReturn.AnimationMoveEntity(Nothing, 0, 0.5, 0, 0.5, False, False, 2, 0,,, 4) + BallReturn.MoveEntity(Nothing, False, 0, 0.5, 0, 0.5, False, False, 2, 0,,, 4) ' Ball returns - BallReturn.AnimationPlaySound("Battle\Pokeball\Throw", 1, 0) + BallReturn.PlaySound("Battle\Pokeball\Throw", 1, 0) BallReturn.AnimationSpawnMovingEntity(0, 0, 0, BattleScreen.OppPokemon.CatchBall.TextureSource, 0.3F, 0.3F, 0.3F, -2, 0, 0, 0.1, False, True, 1, 0,, 0.3) BattleScreen.BattleQuery.Add(BallReturn) BattleScreen.SendInNewTrainerPokemon(index) - Me.ApplyOppBatonPass(BattleScreen) + Me.ApplyOppBatonPass(BattleScreen) - If BattleScreen.ParticipatedPokemon.Contains(BattleScreen.OwnPokemonIndex) = False Then - BattleScreen.ParticipatedPokemon.Add(BattleScreen.OwnPokemonIndex) - End If + If BattleScreen.ParticipatedPokemon.Contains(BattleScreen.OwnPokemonIndex) = False Then + BattleScreen.ParticipatedPokemon.Add(BattleScreen.OwnPokemonIndex) + End If - Dim oppShiny As String = "N" - If BattleScreen.OppPokemon.IsShiny = True Then - oppShiny = "S" - End If + Dim oppShiny As String = "N" + If BattleScreen.OppPokemon.IsShiny = True Then + oppShiny = "S" + End If - Dim oppModel As String = BattleScreen.GetModelName(False) + Dim oppModel As String = BattleScreen.GetModelName(False) - If oppModel = "" Then - BattleScreen.BattleQuery.Add(New ToggleEntityQueryObject(True, ToggleEntityQueryObject.BattleEntities.OppPokemon, PokemonForms.GetOverworldSpriteName(BattleScreen.OppPokemon), -1, -1, 0, 1)) - Else - BattleScreen.BattleQuery.Add(New ToggleEntityQueryObject(False, oppModel, -1, -1, 1, 0)) - End If + If oppModel = "" Then + BattleScreen.BattleQuery.Add(New ToggleEntityQueryObject(True, ToggleEntityQueryObject.BattleEntities.OppPokemon, PokemonForms.GetOverworldSpriteName(BattleScreen.OppPokemon), -1, -1, 0, 1)) + Else + BattleScreen.BattleQuery.Add(New ToggleEntityQueryObject(False, oppModel, -1, -1, 1, 0)) + End If - BattleScreen.BattleQuery.Add(New ToggleEntityQueryObject(True, ToggleEntityQueryObject.BattleEntities.OppPokemon, 1, -1, -1, -1, -1)) + BattleScreen.BattleQuery.Add(New ToggleEntityQueryObject(True, ToggleEntityQueryObject.BattleEntities.OppPokemon, 1, -1, -1, -1, -1)) BattleScreen.BattleQuery.Add(New TextQueryObject(BattleScreen.Trainer.Name & ": ""Go, " & BattleScreen.OppPokemon.GetDisplayName() & "!""")) ' Ball is thrown Dim BallThrow As AnimationQueryObject = New AnimationQueryObject(BattleScreen.OppPokemonNPC, True, BattleScreen.OppPokemonModel) - BallThrow.AnimationPlaySound("Battle\Pokeball\Throw", 0, 0) + BallThrow.PlaySound("Battle\Pokeball\Throw", 0, 0) BallThrow.AnimationSpawnMovingEntity(-2, -0.15, 0, BattleScreen.OwnPokemon.CatchBall.TextureSource, 0.3F, 0.3F, 0.3F, 0, 0.35, 0, 0.1, False, True, 0F, 0F,, 0.3) ' Ball Opens - BallThrow.AnimationPlaySound("Battle\Pokeball\Open", 3, 0) + BallThrow.PlaySound("Battle\Pokeball\Open", 3, 0) Dim SmokeSpawned As Integer = 0 Do Dim SmokePosition = New Vector3(0, 0.35, 0) Dim SmokeDestination = New Vector3(CSng(Random.Next(-10, 10) / 10), CSng(Random.Next(-10, 10) / 10), CSng(Random.Next(-10, 10) / 10)) - Dim SmokeTexture As String = "Textures\Battle\Cloud" + Dim SmokeTexture As String = "Textures\Battle\Smoke" Dim SmokeScale = New Vector3(CSng(Random.Next(2, 6) / 10)) Dim SmokeSpeed = CSng(Random.Next(1, 3) / 10.0F) @@ -7294,180 +7288,180 @@ ' Pokemon appears BallThrow.AnimationFadeEntity(Nothing, 1, True, 1, 4, 0) - BallThrow.AnimationPlaySound(CStr(BattleScreen.OppPokemon.Number), 4, 0,, True) + BallThrow.PlaySound(CStr(BattleScreen.OppPokemon.Number), 4, 0,, True) ' Pokémon falls down - BallThrow.AnimationMoveEntity(Nothing, 0, 0, 0, 0.05F, False, False, 4, 0,,, 4) + BallThrow.MoveEntity(Nothing, False, 0, 0, 0, 0.05F, False, False, 4, 0,,, 4) BattleScreen.BattleQuery.Add(BallThrow) End If - With BattleScreen - Dim p As Pokemon = .OppPokemon - Dim op As Pokemon = .OwnPokemon + With BattleScreen + Dim p As Pokemon = .OppPokemon + Dim op As Pokemon = .OwnPokemon - Dim spikeAffected As Boolean = True - Dim rockAffected As Boolean = True + Dim spikeAffected As Boolean = True + Dim rockAffected As Boolean = True - spikeAffected = BattleScreen.FieldEffects.IsGrounded(False, BattleScreen) + spikeAffected = BattleScreen.FieldEffects.IsGrounded(False, BattleScreen) - If spikeAffected = True Then - If .FieldEffects.OwnSpikes > 0 And p.Ability.Name.ToLower() <> "magic guard" Then - Dim spikeDamage As Double = 1D - Select Case .FieldEffects.OwnSpikes - Case 1 - spikeDamage = (p.MaxHP / 100) * 12.5D - Case 2 - spikeDamage = (p.MaxHP / 100) * 16.7D - Case 3 - spikeDamage = (p.MaxHP / 100) * 25D - End Select - ReduceHP(CInt(spikeDamage), False, True, BattleScreen, "The Spikes hurt " & p.GetDisplayName() & "!", "spikes") - End If - End If - 'Sticky Web - If spikeAffected = True Then - If .FieldEffects.OwnStickyWeb > 0 Then + If spikeAffected = True Then + If .FieldEffects.OwnSpikes > 0 And p.Ability.Name.ToLower() <> "magic guard" Then + Dim spikeDamage As Double = 1D + Select Case .FieldEffects.OwnSpikes + Case 1 + spikeDamage = (p.MaxHP / 100) * 12.5D + Case 2 + spikeDamage = (p.MaxHP / 100) * 16.7D + Case 3 + spikeDamage = (p.MaxHP / 100) * 25D + End Select + ReduceHP(CInt(spikeDamage), False, True, BattleScreen, "The Spikes hurt " & p.GetDisplayName() & "!", "spikes") + End If + End If + 'Sticky Web + If spikeAffected = True Then + If .FieldEffects.OwnStickyWeb > 0 Then - LowerStat(False, False, BattleScreen, "Speed", 1, "The opposing pokemon was caught in a Sticky Web!", "stickyweb") + LowerStat(False, False, BattleScreen, "Speed", 1, "The opposing pokemon was caught in a Sticky Web!", "stickyweb") - End If - End If - If spikeAffected = True Then - If .FieldEffects.OwnToxicSpikes > 0 And p.Status = Pokemon.StatusProblems.None And p.Type1.Type <> Element.Types.Poison And p.Type2.Type <> Element.Types.Poison Then - Select Case .FieldEffects.OwnToxicSpikes - Case 1 - InflictPoison(False, True, BattleScreen, False, "The Toxic Spikes hurt " & p.GetDisplayName() & "!", "toxicspikes") - Case 2 - InflictPoison(False, True, BattleScreen, True, "The Toxic Spikes hurt " & p.GetDisplayName() & "!", "toxicspikes") - End Select - End If - If .FieldEffects.OwnToxicSpikes > 0 Then - If p.Type1.Type = Element.Types.Poison Or p.Type2.Type = Element.Types.Poison Then - .BattleQuery.Add(New TextQueryObject(p.GetDisplayName() & " removed the Toxic Spikes!")) - .FieldEffects.OwnToxicSpikes = 0 - End If - End If - End If + End If + End If + If spikeAffected = True Then + If .FieldEffects.OwnToxicSpikes > 0 And p.Status = Pokemon.StatusProblems.None And p.Type1.Type <> Element.Types.Poison And p.Type2.Type <> Element.Types.Poison Then + Select Case .FieldEffects.OwnToxicSpikes + Case 1 + InflictPoison(False, True, BattleScreen, False, "The Toxic Spikes hurt " & p.GetDisplayName() & "!", "toxicspikes") + Case 2 + InflictPoison(False, True, BattleScreen, True, "The Toxic Spikes hurt " & p.GetDisplayName() & "!", "toxicspikes") + End Select + End If + If .FieldEffects.OwnToxicSpikes > 0 Then + If p.Type1.Type = Element.Types.Poison Or p.Type2.Type = Element.Types.Poison Then + .BattleQuery.Add(New TextQueryObject(p.GetDisplayName() & " removed the Toxic Spikes!")) + .FieldEffects.OwnToxicSpikes = 0 + End If + End If + End If - If rockAffected = True Then - If .FieldEffects.OwnStealthRock > 0 And p.Ability.Name.ToLower() <> "magic guard" Then - Dim rocksDamage As Double = 1D + If rockAffected = True Then + If .FieldEffects.OwnStealthRock > 0 And p.Ability.Name.ToLower() <> "magic guard" Then + Dim rocksDamage As Double = 1D - Dim effectiveness As Single = BattleCalculation.ReverseTypeEffectiveness(Element.GetElementMultiplier(New Element(Element.Types.Rock), p.Type1)) * BattleCalculation.ReverseTypeEffectiveness(Element.GetElementMultiplier(New Element(Element.Types.Rock), p.Type2)) - Select Case effectiveness - Case 0.25F - rocksDamage = (p.MaxHP / 100) * 3.125D - Case 0.5F - rocksDamage = (p.MaxHP / 100) * 6.25D - Case 1.0F - rocksDamage = (p.MaxHP / 100) * 12.5D - Case 2.0F - rocksDamage = (p.MaxHP / 100) * 25D - Case 4.0F - rocksDamage = (p.MaxHP / 100) * 50D - End Select + Dim effectiveness As Single = BattleCalculation.ReverseTypeEffectiveness(Element.GetElementMultiplier(New Element(Element.Types.Rock), p.Type1)) * BattleCalculation.ReverseTypeEffectiveness(Element.GetElementMultiplier(New Element(Element.Types.Rock), p.Type2)) + Select Case effectiveness + Case 0.25F + rocksDamage = (p.MaxHP / 100) * 3.125D + Case 0.5F + rocksDamage = (p.MaxHP / 100) * 6.25D + Case 1.0F + rocksDamage = (p.MaxHP / 100) * 12.5D + Case 2.0F + rocksDamage = (p.MaxHP / 100) * 25D + Case 4.0F + rocksDamage = (p.MaxHP / 100) * 50D + End Select - ReduceHP(CInt(rocksDamage), False, True, BattleScreen, "The Stealth Rocks hurt " & p.GetDisplayName() & "!", "stealthrocks") - End If - End If + ReduceHP(CInt(rocksDamage), False, True, BattleScreen, "The Stealth Rocks hurt " & p.GetDisplayName() & "!", "stealthrocks") + End If + End If - TriggerAbilityEffect(BattleScreen, False) - TriggerItemEffect(BattleScreen, False) + TriggerAbilityEffect(BattleScreen, False) + TriggerItemEffect(BattleScreen, False) - If .OppPokemon.Status = Pokemon.StatusProblems.Sleep Then - .FieldEffects.OppSleepTurns = Core.Random.Next(1, 4) - End If + If .OppPokemon.Status = Pokemon.StatusProblems.Sleep Then + .FieldEffects.OppSleepTurns = Core.Random.Next(1, 4) + End If - If BattleScreen.FieldEffects.OppHealingWish = True Then - BattleScreen.FieldEffects.OppHealingWish = False + If BattleScreen.FieldEffects.OppHealingWish = True Then + BattleScreen.FieldEffects.OppHealingWish = False - If .OppPokemon.HP < .OppPokemon.MaxHP Or .OppPokemon.Status <> Pokemon.StatusProblems.None Then - GainHP(.OppPokemon.MaxHP - .OppPokemon.HP, False, False, BattleScreen, "The Healing Wish came true for " & .OppPokemon.GetDisplayName() & "!", "move:healingwish") - CureStatusProblem(False, False, BattleScreen, "", "move:healingwish") - End If - End If - End With - End Sub + If .OppPokemon.HP < .OppPokemon.MaxHP Or .OppPokemon.Status <> Pokemon.StatusProblems.None Then + GainHP(.OppPokemon.MaxHP - .OppPokemon.HP, False, False, BattleScreen, "The Healing Wish came true for " & .OppPokemon.GetDisplayName() & "!", "move:healingwish") + CureStatusProblem(False, False, BattleScreen, "", "move:healingwish") + End If + End If + End With + End Sub #End Region #Region "EndBattle" - Enum EndBattleReasons - WinWild - LoseWild - WinTrainer - LoseTrainer - WinPvP - LosePvP - End Enum + Enum EndBattleReasons + WinWild + LoseWild + WinTrainer + LoseTrainer + WinPvP + LosePvP + End Enum - Public Sub EndBattle(ByVal reason As EndBattleReasons, ByVal BattleScreen As BattleScreen, ByVal AddPVP As Boolean) - BattleScreen.OwnFaint = False - BattleScreen.OppFaint = False - IsAfterFaint = False - If AddPVP = True Then - Select Case reason - Case EndBattleReasons.WinTrainer 'Lost - Dim q As New CameraQueryObject(New Vector3(12, 0, 13), Screen.Camera.Position, 0.03F, 0.03F, (MathHelper.Pi * 0.5F), Screen.Camera.Yaw, 0.0F, Screen.Camera.Pitch, 0.02F, 0.02F) - q.ApplyCurrentCamera = True - BattleScreen.TempPVPBattleQuery.Add(BattleScreen.BattleQuery.Count - 5, q) + Public Sub EndBattle(ByVal reason As EndBattleReasons, ByVal BattleScreen As BattleScreen, ByVal AddPVP As Boolean) + BattleScreen.OwnFaint = False + BattleScreen.OppFaint = False + IsAfterFaint = False + If AddPVP = True Then + Select Case reason + Case EndBattleReasons.WinTrainer 'Lost + Dim q As New CameraQueryObject(New Vector3(12, 0, 13), Screen.Camera.Position, 0.03F, 0.03F, (MathHelper.Pi * 0.5F), Screen.Camera.Yaw, 0.0F, Screen.Camera.Pitch, 0.02F, 0.02F) + q.ApplyCurrentCamera = True + BattleScreen.TempPVPBattleQuery.Add(BattleScreen.BattleQuery.Count - 5, q) - BattleScreen.TempPVPBattleQuery.Add(BattleScreen.BattleQuery.Count - 4, New TextQueryObject("You lost the battle!")) - BattleScreen.TempPVPBattleQuery.Add(BattleScreen.BattleQuery.Count - 3, New TextQueryObject("")) - BattleScreen.TempPVPBattleQuery.Add(BattleScreen.BattleQuery.Count - 2, New TextQueryObject("")) + BattleScreen.TempPVPBattleQuery.Add(BattleScreen.BattleQuery.Count - 4, New TextQueryObject("You lost the battle!")) + BattleScreen.TempPVPBattleQuery.Add(BattleScreen.BattleQuery.Count - 3, New TextQueryObject("")) + BattleScreen.TempPVPBattleQuery.Add(BattleScreen.BattleQuery.Count - 2, New TextQueryObject("")) - BattleScreen.TempPVPBattleQuery.Add(BattleScreen.BattleQuery.Count - 1, New EndBattleQueryObject(True)) - Case EndBattleReasons.LoseTrainer 'Won - Dim q As New CameraQueryObject(New Vector3(15, 0, 13), Screen.Camera.Position, 0.03F, 0.03F, -(MathHelper.Pi * 0.5F), Screen.Camera.Yaw, 0.0F, Screen.Camera.Pitch, 0.02F, 0.02F) - q.ApplyCurrentCamera = True - BattleScreen.TempPVPBattleQuery.Add(BattleScreen.BattleQuery.Count - 3, q) + BattleScreen.TempPVPBattleQuery.Add(BattleScreen.BattleQuery.Count - 1, New EndBattleQueryObject(True)) + Case EndBattleReasons.LoseTrainer 'Won + Dim q As New CameraQueryObject(New Vector3(15, 0, 13), Screen.Camera.Position, 0.03F, 0.03F, -(MathHelper.Pi * 0.5F), Screen.Camera.Yaw, 0.0F, Screen.Camera.Pitch, 0.02F, 0.02F) + q.ApplyCurrentCamera = True + BattleScreen.TempPVPBattleQuery.Add(BattleScreen.BattleQuery.Count - 3, q) - BattleScreen.TempPVPBattleQuery.Add(BattleScreen.BattleQuery.Count - 2, New TextQueryObject("Pokémon Trainer " & Core.Player.Name & " was defeated!")) + BattleScreen.TempPVPBattleQuery.Add(BattleScreen.BattleQuery.Count - 2, New TextQueryObject("Pokémon Trainer " & Core.Player.Name & " was defeated!")) - BattleScreen.TempPVPBattleQuery.Add(BattleScreen.BattleQuery.Count - 1, New EndBattleQueryObject(True)) - End Select - Else - Select Case reason - Case EndBattleReasons.WinWild - Won = True - Core.Player.AddPoints(1, "Won against wild Pokémon.") + BattleScreen.TempPVPBattleQuery.Add(BattleScreen.BattleQuery.Count - 1, New EndBattleQueryObject(True)) + End Select + Else + Select Case reason + Case EndBattleReasons.WinWild + Won = True + Core.Player.AddPoints(1, "Won against wild Pokémon.") - BattleScreen.BattleQuery.Add(New PlayMusicQueryObject("wild_defeat")) - ChangeCameraAngle(1, True, BattleScreen) + BattleScreen.BattleQuery.Add(New PlayMusicQueryObject("wild_defeat")) + ChangeCameraAngle(1, True, BattleScreen) - GainEXP(BattleScreen) + GainEXP(BattleScreen) - If BattleScreen.FieldEffects.OwnPayDayCounter > 0 Then - Core.Player.Money += BattleScreen.FieldEffects.OwnPayDayCounter - BattleScreen.BattleQuery.Add(New TextQueryObject(Core.Player.Name & " picked up $" & BattleScreen.FieldEffects.OwnPayDayCounter & "!")) - End If + If BattleScreen.FieldEffects.OwnPayDayCounter > 0 Then + Core.Player.Money += BattleScreen.FieldEffects.OwnPayDayCounter + BattleScreen.BattleQuery.Add(New TextQueryObject(Core.Player.Name & " picked up $" & BattleScreen.FieldEffects.OwnPayDayCounter & "!")) + End If - BattleScreen.BattleQuery.Add(New EndBattleQueryObject(False)) - Case EndBattleReasons.WinTrainer - Won = True - Core.Player.AddPoints(3, "Won against trainer.") + BattleScreen.BattleQuery.Add(New EndBattleQueryObject(False)) + Case EndBattleReasons.WinTrainer + Won = True + Core.Player.AddPoints(3, "Won against trainer.") - Core.Player.Money += BattleScreen.GetTrainerMoney() + Core.Player.Money += BattleScreen.GetTrainerMoney() - BattleScreen.BattleQuery.Add(New PlayMusicQueryObject(BattleScreen.Trainer.GetDefeatMusic())) + BattleScreen.BattleQuery.Add(New PlayMusicQueryObject(BattleScreen.Trainer.GetDefeatMusic())) - Dim q As New CameraQueryObject(New Vector3(15, 0, 13), Screen.Camera.Position, 0.03F, 0.03F, -(MathHelper.Pi * 0.5F), Screen.Camera.Yaw, 0.0F, Screen.Camera.Pitch, 0.04F, 0.02F) - q.ApplyCurrentCamera = True - BattleScreen.BattleQuery.Add(q) + Dim q As New CameraQueryObject(New Vector3(15, 0, 13), Screen.Camera.Position, 0.03F, 0.03F, -(MathHelper.Pi * 0.5F), Screen.Camera.Yaw, 0.0F, Screen.Camera.Pitch, 0.04F, 0.02F) + q.ApplyCurrentCamera = True + BattleScreen.BattleQuery.Add(q) - BattleScreen.BattleQuery.Add(New TextQueryObject(BattleScreen.Trainer.TrainerType & " " & BattleScreen.Trainer.Name & " was defeated!")) - BattleScreen.BattleQuery.Add(New TextQueryObject(BattleScreen.Trainer.OutroMessage)) + BattleScreen.BattleQuery.Add(New TextQueryObject(BattleScreen.Trainer.TrainerType & " " & BattleScreen.Trainer.Name & " was defeated!")) + BattleScreen.BattleQuery.Add(New TextQueryObject(BattleScreen.Trainer.OutroMessage)) - If BattleScreen.GetTrainerMoney() > 0 Then - BattleScreen.BattleQuery.Add(New TextQueryObject(Core.Player.Name & " got $" & BattleScreen.GetTrainerMoney() & "!")) - End If + If BattleScreen.GetTrainerMoney() > 0 Then + BattleScreen.BattleQuery.Add(New TextQueryObject(Core.Player.Name & " got $" & BattleScreen.GetTrainerMoney() & "!")) + End If - BattleScreen.BattleQuery.Add(New EndBattleQueryObject(False)) - Case EndBattleReasons.LoseTrainer, EndBattleReasons.LoseWild - Won = False + BattleScreen.BattleQuery.Add(New EndBattleQueryObject(False)) + Case EndBattleReasons.LoseTrainer, EndBattleReasons.LoseWild + Won = False Dim q As New CameraQueryObject(New Vector3(12, 0, 13), Screen.Camera.Position, 0.03F, 0.03F, (MathHelper.Pi * 0.5F), Screen.Camera.Yaw, 0.0F, Screen.Camera.Pitch, 0.02F, 0.02F) q.ApplyCurrentCamera = True BattleScreen.BattleQuery.Add(q) diff --git a/P3D/Pokemon/Attacks/Fire/Ember.vb b/P3D/Pokemon/Attacks/Fire/Ember.vb index 6719f780d..03a9cfffc 100644 --- a/P3D/Pokemon/Attacks/Fire/Ember.vb +++ b/P3D/Pokemon/Attacks/Fire/Ember.vb @@ -66,7 +66,7 @@ Public Overrides Sub InternalUserPokemonMoveAnimation(ByVal BattleScreen As BattleScreen, ByVal own As Boolean, ByVal CurrentPokemon As Pokemon, ByVal CurrentEntity As NPC, ByVal CurrentModel As ModelEntity) Dim MoveAnimation As AnimationQueryObject = New AnimationQueryObject(CurrentEntity, own) MoveAnimation.AnimationSpawnMovingEntity(0.0, 0, 0.0, "Textures\Battle\Fire\FireBall", 0.5, 0.5, 0.5, 2.0, 0.0, 0.0, 0.05, False, True, 0.0, 0.0,, -0.5, 0) - MoveAnimation.AnimationPlaySound("Battle\Attacks\Fire\Ember_Start", 0, 0) + MoveAnimation.PlaySound("Battle\Attacks\Fire\Ember_Start", 0, 0) For i = 0 To 12 MoveAnimation.AnimationSpawnFadingEntity(CSng(i * 0.2), 0.0, 0.0, "Textures\Battle\Fire\Smoke", 0.2, 0.2, 0.2, 0.02, False, 0.0, CSng(i * 0.2), 0.0) i += 1 @@ -82,7 +82,7 @@ MoveAnimation.AnimationSpawnFadingEntity(CSng(3.0 - i * 0.2), 0.0, 0.0, "Textures\Battle\Fire\Smoke", 0.2, 0.2, 0.2, 0.02, False, 0.0, CSng(i * 0.2), 0.0) i += 1 Next - MoveAnimation.AnimationPlaySound("Battle\Attacks\Fire\Ember_Hit", 2, 0) + MoveAnimation.PlaySound("Battle\Attacks\Fire\Ember_Hit", 2, 0) MoveAnimation.AnimationSpawnFadingEntity(-0.25, -0.25, -0.25, "Textures\Battle\Fire\Ember,0,0,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 1, 1) MoveAnimation.AnimationSpawnFadingEntity(0.25, -0.25, 0.25, "Textures\Battle\Fire\Ember,0,0,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 1, 1) MoveAnimation.AnimationSpawnFadingEntity(0.25, -0.25, -0.25, "Textures\Battle\Fire\Ember,0,0,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 1, 1) diff --git a/P3D/Pokemon/Attacks/Grass/Absorb.vb b/P3D/Pokemon/Attacks/Grass/Absorb.vb index 9590c3d18..318503d28 100644 --- a/P3D/Pokemon/Attacks/Grass/Absorb.vb +++ b/P3D/Pokemon/Attacks/Grass/Absorb.vb @@ -96,7 +96,7 @@ Dim MoveAnimation As AnimationQueryObject = New AnimationQueryObject(CurrentEntity, own) Dim maxAmount As Integer = 8 Dim currentAmount As Integer = 0 - MoveAnimation.AnimationPlaySound("Battle\Attacks\Grass\Absorb", 0, 0) + MoveAnimation.PlaySound("Battle\Attacks\Grass\Absorb", 0, 0) While currentAmount <= maxAmount Dim yPos As Single = CSng(Random.NextDouble() * 0.5) Dim zPos As Single = CSng(Random.Next(-5, 5) * 0.15) diff --git a/P3D/Pokemon/Attacks/Normal/Growl.vb b/P3D/Pokemon/Attacks/Normal/Growl.vb index 5c35961e3..e01dafc73 100644 --- a/P3D/Pokemon/Attacks/Normal/Growl.vb +++ b/P3D/Pokemon/Attacks/Normal/Growl.vb @@ -64,7 +64,7 @@ Public Overrides Sub InternalUserPokemonMoveAnimation(ByVal BattleScreen As BattleScreen, ByVal own As Boolean, ByVal CurrentPokemon As Pokemon, ByVal CurrentEntity As NPC, ByVal CurrentModel As ModelEntity) Dim MoveAnimation As AnimationQueryObject = New AnimationQueryObject(CurrentEntity, own) - MoveAnimation.AnimationPlaySound(CStr(CurrentPokemon.Number), 0, 0,, True) + MoveAnimation.PlaySound(CStr(CurrentPokemon.Number), 0, 0,, True) MoveAnimation.AnimationSpawnFadingEntity(0.25, -0.25, -0.25, "Textures\Battle\Normal\Growl,0,0,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 0, 1) MoveAnimation.AnimationSpawnFadingEntity(0.25, -0.25, -0.25, "Textures\Battle\Normal\Growl,0,32,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 1, 1) MoveAnimation.AnimationSpawnFadingEntity(0.25, -0.25, -0.25, "Textures\Battle\Normal\Growl,0,0,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 2, 1) diff --git a/P3D/Pokemon/Attacks/Normal/Pound.vb b/P3D/Pokemon/Attacks/Normal/Pound.vb index 25785556e..5cf85b3e2 100644 --- a/P3D/Pokemon/Attacks/Normal/Pound.vb +++ b/P3D/Pokemon/Attacks/Normal/Pound.vb @@ -57,7 +57,7 @@ Public Overrides Sub InternalOpponentPokemonMoveAnimation(ByVal BattleScreen As BattleScreen, ByVal own As Boolean, ByVal CurrentPokemon As Pokemon, ByVal CurrentEntity As NPC, ByVal CurrentModel As ModelEntity) Dim MoveAnimation As AnimationQueryObject = New AnimationQueryObject(CurrentEntity, own) - MoveAnimation.AnimationPlaySound("Battle\Attacks\Pound", 0.5, 2.5) + MoveAnimation.PlaySound("Battle\Attacks\Pound", 0.5, 2.5) MoveAnimation.AnimationSpawnFadingEntity(0, -0.25, 0, "Textures\Battle\Normal\Pound", 0.5, 0.5, 0.5, 0.02, False, 1.0, 0, 3) BattleScreen.BattleQuery.Add(MoveAnimation) End Sub diff --git a/P3D/Pokemon/Attacks/Normal/Tackle.vb b/P3D/Pokemon/Attacks/Normal/Tackle.vb index 4d53f749d..99e61e709 100644 --- a/P3D/Pokemon/Attacks/Normal/Tackle.vb +++ b/P3D/Pokemon/Attacks/Normal/Tackle.vb @@ -54,15 +54,16 @@ Public Overrides Sub InternalUserPokemonMoveAnimation(ByVal BattleScreen As BattleScreen, ByVal own As Boolean, ByVal CurrentPokemon As Pokemon, ByVal CurrentEntity As NPC, ByVal CurrentModel As ModelEntity) Dim MoveAnimation As AnimationQueryObject = New AnimationQueryObject(CurrentEntity, own, CurrentModel) - MoveAnimation.AnimationMoveEntity(Nothing, 0.5, 0, 0, 0.3, False, False, 0, 0,,, 2) - MoveAnimation.AnimationMoveEntity(Nothing, 0, 0, 0, 0.3, False, False, 1, 0,,, 2) + MoveAnimation.MoveEntity(Nothing, False, 0.5, 0, 0, 0.3, False, False, 0, 0,,, 2) + MoveAnimation.MoveEntity(Nothing, False, 0, 0, 0, 0.3, False, False, 1, 0,,, 2) BattleScreen.BattleQuery.Add(MoveAnimation) End Sub Public Overrides Sub InternalOpponentPokemonMoveAnimation(ByVal BattleScreen As BattleScreen, ByVal own As Boolean, ByVal CurrentPokemon As Pokemon, ByVal CurrentEntity As NPC, ByVal CurrentModel As ModelEntity) Dim MoveAnimation As AnimationQueryObject = New AnimationQueryObject(CurrentEntity, own) - MoveAnimation.AnimationPlaySound("Battle\Attacks\Normal\Tackle", 0, 2) - MoveAnimation.AnimationSpawnFadingEntity(0, -0.25, 0, "Textures\Battle\Normal\Tackle", 0.5, 0.5, 0.5, 0.02, False, 1.0, 0, 2) + MoveAnimation.PlaySound("Battle\Attacks\Normal\Tackle", 0, 2) + Dim SpawnEntity = MoveAnimation.SpawnEntity(New Vector3(0, -0.25, 0), TextureManager.GetTexture("Textures\Battle\Normal\Tackle"), New Vector3(1.0F), 1.0F) + MoveAnimation.FadeEntity(SpawnEntity, True, 0.02, False, 1.0F, 0, 2) BattleScreen.BattleQuery.Add(MoveAnimation) End Sub End Class diff --git a/P3D/Pokemon/Attacks/Poison/PoisonSting.vb b/P3D/Pokemon/Attacks/Poison/PoisonSting.vb index 9684f8379..3cc76f0a4 100644 --- a/P3D/Pokemon/Attacks/Poison/PoisonSting.vb +++ b/P3D/Pokemon/Attacks/Poison/PoisonSting.vb @@ -67,30 +67,38 @@ Public Overrides Sub InternalUserPokemonMoveAnimation(ByVal BattleScreen As BattleScreen, ByVal own As Boolean, ByVal CurrentPokemon As Pokemon, ByVal CurrentEntity As NPC, ByVal CurrentModel As ModelEntity) Dim MoveAnimation As AnimationQueryObject = New AnimationQueryObject(CurrentEntity, own) - MoveAnimation.AnimationSpawnMovingEntity(0.0, 0, 0.0, "Textures\Battle\Poison\Stinger", 0.5, 0.5, 0.5, 2.0, 0.0, 0.0, 0.05, False, False, 0.0, 0.0,,, 0) - MoveAnimation.AnimationPlaySound("Battle\Attacks\Poison\PoisonSting_Start", 0, 0) + Dim StingerEntity As Entity = MoveAnimation.SpawnEntity(CurrentEntity.Position, TextureManager.GetTexture("Textures\Battle\Poison\Stinger"), New Vector3(0.5F), 1.0F) + + MoveAnimation.PlaySound("Battle\Attacks\Poison\PoisonSting_Start", 0, 0) + MoveAnimation.MoveEntity(StingerEntity, True, 2.0, 0.0, 0.0, 0.05, False, False, 0.0, 0.0,,, 0) + BattleScreen.BattleQuery.Add(MoveAnimation) End Sub Public Overrides Sub InternalOpponentPokemonMoveAnimation(ByVal BattleScreen As BattleScreen, ByVal own As Boolean, ByVal CurrentPokemon As Pokemon, ByVal CurrentEntity As NPC, ByVal CurrentModel As ModelEntity) Dim MoveAnimation As AnimationQueryObject = New AnimationQueryObject(CurrentEntity, own) - MoveAnimation.AnimationSpawnMovingEntity(2.0, 0, 0.0, "Textures\Battle\Poison\Stinger", 0.5, 0.5, 0.5, 0.0, 0.0, 0.0, 0.05, False, False, 0.0, 0.0,,, 0) + Dim StingerEntity As Entity = MoveAnimation.SpawnEntity(New Vector3(2.0, 0, 0.0), TextureManager.GetTexture("Textures\Battle\Poison\Stinger"), New Vector3(0.5F), 1) - MoveAnimation.AnimationPlaySound("Battle\Attacks\Poison\PoisonSting_Hit", 1, 0) - MoveAnimation.AnimationSpawnFadingEntity(-0.25, -0.25, -0.25, "Textures\Battle\Poison\Bubble,0,0,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 1, 1) + MoveAnimation.MoveEntity(StingerEntity, True, 0.0, 0.0, 0.0, 0.05, False, False, 0.0, 0.0,,, 0) - MoveAnimation.AnimationSpawnFadingEntity(-0.25, -0.25, -0.25, "Textures\Battle\Poison\Bubble,0,32,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 2, 1) - MoveAnimation.AnimationSpawnFadingEntity(0.25, -0.25, 0.25, "Textures\Battle\Poison\Bubble,0,0,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 2, 1) + MoveAnimation.PlaySound("Battle\Attacks\Poison\PoisonSting_Hit", 1, 0) - MoveAnimation.AnimationSpawnFadingEntity(-0.25, -0.25, -0.25, "Textures\Battle\Poison\Bubble,0,64,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 3, 1) - MoveAnimation.AnimationSpawnFadingEntity(0.25, -0.25, 0.25, "Textures\Battle\Poison\Bubble,0,32,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 3, 1) - MoveAnimation.AnimationSpawnFadingEntity(0.25, -0.25, -0.25, "Textures\Battle\Poison\Bubble,0,0,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 3, 1) + Dim BubbleEntity1 As Entity = MoveAnimation.SpawnEntity(New Vector3(-0.25, -0.25, -0.25), TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 0, 32, 32)), New Vector3(0.5F), 1, 1, 1) - MoveAnimation.AnimationSpawnFadingEntity(0.25, -0.25, 0.25, "Textures\Battle\Poison\Bubble,0,64,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 4, 1) - MoveAnimation.AnimationSpawnFadingEntity(0.25, -0.25, -0.25, "Textures\Battle\Poison\Bubble,0,32,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 4, 1) + MoveAnimation.ChangeEntityTexture(BubbleEntity1, False, TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 32, 32, 32)), 2, 1) - MoveAnimation.AnimationSpawnFadingEntity(0.25, -0.25, -0.25, "Textures\Battle\Poison\Bubble,0,64,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 5, 2) + Dim BubbleEntity2 As Entity = MoveAnimation.SpawnEntity(New Vector3(0.25, -0.25, 0.25), TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 0, 32, 32)), New Vector3(0.5F), 1, 2, 1) + + MoveAnimation.ChangeEntityTexture(BubbleEntity1, True, TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 64, 32, 32)), 3, 1) + MoveAnimation.ChangeEntityTexture(BubbleEntity2, False, TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 32, 32, 32)), 3, 1) + + Dim BubbleEntity3 As Entity = MoveAnimation.SpawnEntity(New Vector3(0.25, -0.25, -0.25), TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 0, 32, 32)), New Vector3(0.5F), 1, 3, 1) + + MoveAnimation.ChangeEntityTexture(BubbleEntity2, True, TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 64, 32, 32)), 4, 1) + MoveAnimation.ChangeEntityTexture(BubbleEntity3, False, TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 32, 32, 32)), 4, 1) + + MoveAnimation.ChangeEntityTexture(BubbleEntity3, True, TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 64, 32, 32)), 5, 1) BattleScreen.BattleQuery.Add(MoveAnimation) End Sub From 944cf6ae712dfdc2961a74cd062e1bf7f4ae31a8 Mon Sep 17 00:00:00 2001 From: JappaWakka Date: Thu, 21 Oct 2021 20:42:40 +0200 Subject: [PATCH 13/57] Updated everything to the new Battle Animations system and the newest commands MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Updated Attacks: Ember, Absorb, Growl, Pound Updated status effects & shared animations: Poisoned, Switching Pokémon (own and opponent's) --- P3D/Battle/BattleSystemV2/Battle.vb | 217 ++++++++++++---------- P3D/Pokemon/Attacks/Fire/Ember.vb | 51 ++--- P3D/Pokemon/Attacks/Grass/Absorb.vb | 2 +- P3D/Pokemon/Attacks/Normal/Growl.vb | 13 +- P3D/Pokemon/Attacks/Normal/Pound.vb | 5 +- P3D/Pokemon/Attacks/Normal/Tackle.vb | 8 +- P3D/Pokemon/Attacks/Poison/PoisonSting.vb | 20 +- 7 files changed, 171 insertions(+), 145 deletions(-) diff --git a/P3D/Battle/BattleSystemV2/Battle.vb b/P3D/Battle/BattleSystemV2/Battle.vb index a93c5e4bc..058885f11 100644 --- a/P3D/Battle/BattleSystemV2/Battle.vb +++ b/P3D/Battle/BattleSystemV2/Battle.vb @@ -2706,12 +2706,12 @@ ChangeCameraAngle(1, own, BattleScreen) 'Burn animation Dim BurnAnimation As AnimationQueryObject = New AnimationQueryObject(pNPC, own) - BurnAnimation.PlaySound("Battle\Effects\Burned", 0, 0) + BurnAnimation.AnimationPlaySound("Battle\Effects\Burned", 0, 0) Dim FlameEntity As Entity = BurnAnimation.SpawnEntity(New Vector3(CSng(pNPC.Position.X - 0.25), CSng(pNPC.Position.Y - 0.25), CSng(pNPC.Position.Z - 0.25)), TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 0, 32, 32)), New Vector3(0.5, 0.5, 0.5), 1.0F) - BurnAnimation.ChangeEntityTexture(FlameEntity, False, TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 32, 32, 32)), 2, 1) - BurnAnimation.ChangeEntityTexture(FlameEntity, False, TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 64, 32, 32)), 3, 1) - BurnAnimation.ChangeEntityTexture(FlameEntity, False, TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 96, 32, 32)), 4, 1) - BurnAnimation.ChangeEntityTexture(FlameEntity, True, TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 128, 32, 32)), 5, 2) + BurnAnimation.AnimationChangeTexture(FlameEntity, False, TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 32, 32, 32)), 2, 1) + BurnAnimation.AnimationChangeTexture(FlameEntity, False, TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 64, 32, 32)), 3, 1) + BurnAnimation.AnimationChangeTexture(FlameEntity, False, TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 96, 32, 32)), 4, 1) + BurnAnimation.AnimationChangeTexture(FlameEntity, True, TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 128, 32, 32)), 5, 2) BattleScreen.BattleQuery.Add(BurnAnimation) Select Case message @@ -3427,7 +3427,7 @@ Dim StatEntity As Entity = StatAnimation.SpawnEntity(Position, Texture, Scale, 1.0F) Dim startDelay As Double = 5.0 * Random.NextDouble() - StatAnimation.MoveEntity(Nothing, True, Destination.X, Destination.Y, Destination.Z, 0.05F, False, True, CSng(startDelay), 0.0F) + StatAnimation.AnimationMove(Nothing, True, Destination.X, Destination.Y, Destination.Z, 0.05F, False, True, CSng(startDelay), 0.0F) Threading.Interlocked.Increment(currentAmount) End While BattleScreen.BattleQuery.Add(New PlaySoundQueryObject("Battle\Effects\Stat_Raise", False)) @@ -3708,10 +3708,10 @@ Dim StatEntity As Entity = StatAnimation.SpawnEntity(Position, Texture, Scale, 1.0F) Dim startDelay As Double = 5.0 * Random.NextDouble() - StatAnimation.MoveEntity(Nothing, True, Destination.X, Destination.Y, Destination.Z, 0.05F, False, True, CSng(startDelay), 0.0F) + StatAnimation.AnimationMove(Nothing, True, Destination.X, Destination.Y, Destination.Z, 0.05F, False, True, CSng(startDelay), 0.0F) Threading.Interlocked.Increment(currentAmount) End While - StatAnimation.PlaySound("Battle\Effects\Stat_Lower", 0.0F, 10.0F) + StatAnimation.AnimationPlaySound("Battle\Effects\Stat_Lower", 0.0F, 10.0F) BattleScreen.BattleQuery.Add(StatAnimation) Dim printMessage As String = p.GetDisplayName() & "'s " & statString @@ -3998,10 +3998,10 @@ End If Dim HitAnimation As AnimationQueryObject = New AnimationQueryObject(pNPC, own) - HitAnimation.FadeEntity(Nothing, False, 1, False, 0, 0, 0) - HitAnimation.FadeEntity(Nothing, False, 1, True, 1, 1, 0) - HitAnimation.FadeEntity(Nothing, False, 1, False, 0, 2, 0) - HitAnimation.FadeEntity(Nothing, False, 1, True, 1, 3, 0) + HitAnimation.AnimationFade(Nothing, False, 1, False, 0, 0, 0) + HitAnimation.AnimationFade(Nothing, False, 1, True, 1, 1, 0) + HitAnimation.AnimationFade(Nothing, False, 1, False, 0, 2, 0) + HitAnimation.AnimationFade(Nothing, False, 1, True, 1, 3, 0) BattleScreen.BattleQuery.Add(HitAnimation) If own = True Then @@ -5357,20 +5357,22 @@ If .OwnPokemon.Status = Pokemon.StatusProblems.Poison Then 'Own Poison 'Poison animation Dim PoisonAnimation As AnimationQueryObject = New AnimationQueryObject(BattleScreen.OwnPokemonNPC, True) - PoisonAnimation.PlaySound("Battle\Effects\Poisoned", 0, 0) - PoisonAnimation.AnimationSpawnFadingEntity(-0.25, -0.25, -0.25, "Textures\Battle\Poison\Bubble,0,0,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 0, 1) - PoisonAnimation.AnimationSpawnFadingEntity(-0.25, -0.25, -0.25, "Textures\Battle\Poison\Bubble,0,32,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 1, 1) - PoisonAnimation.AnimationSpawnFadingEntity(0.25, -0.25, 0.25, "Textures\Battle\Poison\Bubble,0,0,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 1, 1) + PoisonAnimation.AnimationPlaySound("Battle\Effects\Poisoned", 0, 0) + Dim BubbleEntity1 As Entity = PoisonAnimation.SpawnEntity(New Vector3(-0.25, -0.25, -0.25), TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 0, 32, 32)), New Vector3(0.5F), 1, 0, 1) - PoisonAnimation.AnimationSpawnFadingEntity(-0.25, -0.25, -0.25, "Textures\Battle\Poison\Bubble,0,64,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 2, 1) - PoisonAnimation.AnimationSpawnFadingEntity(0.25, -0.25, 0.25, "Textures\Battle\Poison\Bubble,0,32,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 2, 1) - PoisonAnimation.AnimationSpawnFadingEntity(0.25, -0.25, -0.25, "Textures\Battle\Poison\Bubble,0,0,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 2, 1) + PoisonAnimation.AnimationChangeTexture(BubbleEntity1, False, TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 32, 32, 32)), 1, 1) + Dim BubbleEntity2 As Entity = PoisonAnimation.SpawnEntity(New Vector3(0.25, -0.25, 0.25), TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 0, 32, 32)), New Vector3(0.5F), 1, 1, 1) - PoisonAnimation.AnimationSpawnFadingEntity(0.25, -0.25, 0.25, "Textures\Battle\Poison\Bubble,0,64,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 3, 1) - PoisonAnimation.AnimationSpawnFadingEntity(0.25, -0.25, -0.25, "Textures\Battle\Poison\Bubble,0,32,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 3, 1) + PoisonAnimation.AnimationChangeTexture(BubbleEntity1, True, TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 64, 32, 32)), 2, 1) + PoisonAnimation.AnimationChangeTexture(BubbleEntity2, False, TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 32, 32, 32)), 2, 1) + Dim BubbleEntity3 As Entity = PoisonAnimation.SpawnEntity(New Vector3(0.25, -0.25, -0.25), TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 0, 32, 32)), New Vector3(0.5F), 1, 2, 1) + + PoisonAnimation.AnimationChangeTexture(BubbleEntity2, True, TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 64, 32, 32)), 3, 1) + PoisonAnimation.AnimationChangeTexture(BubbleEntity3, False, TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 32, 32, 32)), 3, 1) + + PoisonAnimation.AnimationChangeTexture(BubbleEntity3, True, TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 64, 32, 32)), 4, 1) - PoisonAnimation.AnimationSpawnFadingEntity(0.25, -0.25, -0.25, "Textures\Battle\Poison\Bubble,0,64,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 4, 2) BattleScreen.BattleQuery.Add(PoisonAnimation) 'Actual damage ReduceHP(CInt(.OwnPokemon.MaxHP / 8), True, True, BattleScreen, "The poison hurt " & .OwnPokemon.GetDisplayName() & ".", "poison") @@ -5381,20 +5383,22 @@ Dim multiplier As Double = (.FieldEffects.OwnPoisonCounter / 16) 'Poison animation Dim PoisonAnimation As AnimationQueryObject = New AnimationQueryObject(BattleScreen.OwnPokemonNPC, True) - PoisonAnimation.PlaySound("Battle\Effects\Poisoned", 0, 0) - PoisonAnimation.AnimationSpawnFadingEntity(-0.25, -0.25, -0.25, "Textures\Battle\Poison\Bubble,0,0,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 0, 1) - PoisonAnimation.AnimationSpawnFadingEntity(-0.25, -0.25, -0.25, "Textures\Battle\Poison\Bubble,0,32,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 1, 1) - PoisonAnimation.AnimationSpawnFadingEntity(0.25, -0.25, 0.25, "Textures\Battle\Poison\Bubble,0,0,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 1, 1) + PoisonAnimation.AnimationPlaySound("Battle\Effects\Poisoned", 0, 0) + Dim BubbleEntity1 As Entity = PoisonAnimation.SpawnEntity(New Vector3(-0.25, -0.25, -0.25), TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 0, 32, 32)), New Vector3(0.5F), 1, 0, 1) - PoisonAnimation.AnimationSpawnFadingEntity(-0.25, -0.25, -0.25, "Textures\Battle\Poison\Bubble,0,64,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 2, 1) - PoisonAnimation.AnimationSpawnFadingEntity(0.25, -0.25, 0.25, "Textures\Battle\Poison\Bubble,0,32,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 2, 1) - PoisonAnimation.AnimationSpawnFadingEntity(0.25, -0.25, -0.25, "Textures\Battle\Poison\Bubble,0,0,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 2, 1) + PoisonAnimation.AnimationChangeTexture(BubbleEntity1, False, TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 32, 32, 32)), 1, 1) + Dim BubbleEntity2 As Entity = PoisonAnimation.SpawnEntity(New Vector3(0.25, -0.25, 0.25), TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 0, 32, 32)), New Vector3(0.5F), 1, 1, 1) - PoisonAnimation.AnimationSpawnFadingEntity(0.25, -0.25, 0.25, "Textures\Battle\Poison\Bubble,0,64,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 3, 1) - PoisonAnimation.AnimationSpawnFadingEntity(0.25, -0.25, -0.25, "Textures\Battle\Poison\Bubble,0,32,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 3, 1) + PoisonAnimation.AnimationChangeTexture(BubbleEntity1, True, TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 64, 32, 32)), 2, 1) + PoisonAnimation.AnimationChangeTexture(BubbleEntity2, False, TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 32, 32, 32)), 2, 1) + Dim BubbleEntity3 As Entity = PoisonAnimation.SpawnEntity(New Vector3(0.25, -0.25, -0.25), TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 0, 32, 32)), New Vector3(0.5F), 1, 2, 1) + + PoisonAnimation.AnimationChangeTexture(BubbleEntity2, True, TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 64, 32, 32)), 3, 1) + PoisonAnimation.AnimationChangeTexture(BubbleEntity3, False, TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 32, 32, 32)), 3, 1) + + PoisonAnimation.AnimationChangeTexture(BubbleEntity3, True, TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 64, 32, 32)), 4, 1) - PoisonAnimation.AnimationSpawnFadingEntity(0.25, -0.25, -0.25, "Textures\Battle\Poison\Bubble,0,64,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 4, 2) BattleScreen.BattleQuery.Add(PoisonAnimation) 'Actual damage ReduceHP(CInt(.OwnPokemon.MaxHP * multiplier), True, True, BattleScreen, "The toxic hurt " & .OwnPokemon.GetDisplayName() & ".", "badpoison") @@ -5413,13 +5417,13 @@ 'Burn animation Dim BurnAnimation As AnimationQueryObject = New AnimationQueryObject(BattleScreen.OwnPokemonNPC, False) - BurnAnimation.PlaySound("Battle\Effects\Burned", 0, 0) + BurnAnimation.AnimationPlaySound("Battle\Effects\Burned", 0, 0) Dim FlameEntity As Entity = BurnAnimation.SpawnEntity(New Vector3(CSng(BattleScreen.OwnPokemonNPC.Position.X + 0.25), CSng(BattleScreen.OwnPokemonNPC.Position.Y - 0.25), CSng(BattleScreen.OwnPokemonNPC.Position.Z + 0.25)), TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 0, 32, 32)), New Vector3(0.5, 0.5, 0.5), 1.0F) - BurnAnimation.ChangeEntityTexture(FlameEntity, False, TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 32, 32, 32)), 2, 1) - BurnAnimation.ChangeEntityTexture(FlameEntity, False, TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 64, 32, 32)), 3, 1) - BurnAnimation.ChangeEntityTexture(FlameEntity, False, TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 96, 32, 32)), 4, 1) - BurnAnimation.ChangeEntityTexture(FlameEntity, True, TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 128, 32, 32)), 5, 2) + BurnAnimation.AnimationChangeTexture(FlameEntity, False, TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 32, 32, 32)), 2, 1) + BurnAnimation.AnimationChangeTexture(FlameEntity, False, TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 64, 32, 32)), 3, 1) + BurnAnimation.AnimationChangeTexture(FlameEntity, False, TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 96, 32, 32)), 4, 1) + BurnAnimation.AnimationChangeTexture(FlameEntity, True, TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 128, 32, 32)), 5, 2) BattleScreen.BattleQuery.Add(BurnAnimation) 'Actual damage @@ -6151,21 +6155,24 @@ If .OppPokemon.Status = Pokemon.StatusProblems.Poison Then 'Opp Poison 'Poison animation Dim PoisonAnimation As AnimationQueryObject = New AnimationQueryObject(BattleScreen.OppPokemonNPC, False) - PoisonAnimation.PlaySound("Battle\Effects\Poisoned", 0, 0) - PoisonAnimation.AnimationSpawnFadingEntity(-0.25, -0.25, -0.25, "Textures\Battle\Poison\Bubble,0,0,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 0, 1) - PoisonAnimation.AnimationSpawnFadingEntity(-0.25, -0.25, -0.25, "Textures\Battle\Poison\Bubble,0,32,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 1, 1) - PoisonAnimation.AnimationSpawnFadingEntity(0.25, -0.25, 0.25, "Textures\Battle\Poison\Bubble,0,0,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 1, 1) + PoisonAnimation.AnimationPlaySound("Battle\Effects\Poisoned", 0, 0) + Dim BubbleEntity1 As Entity = PoisonAnimation.SpawnEntity(New Vector3(-0.25, -0.25, -0.25), TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 0, 32, 32)), New Vector3(0.5F), 1, 0, 1) - PoisonAnimation.AnimationSpawnFadingEntity(-0.25, -0.25, -0.25, "Textures\Battle\Poison\Bubble,0,64,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 2, 1) - PoisonAnimation.AnimationSpawnFadingEntity(0.25, -0.25, 0.25, "Textures\Battle\Poison\Bubble,0,32,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 2, 1) - PoisonAnimation.AnimationSpawnFadingEntity(0.25, -0.25, -0.25, "Textures\Battle\Poison\Bubble,0,0,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 2, 1) + PoisonAnimation.AnimationChangeTexture(BubbleEntity1, False, TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 32, 32, 32)), 1, 1) + Dim BubbleEntity2 As Entity = PoisonAnimation.SpawnEntity(New Vector3(0.25, -0.25, 0.25), TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 0, 32, 32)), New Vector3(0.5F), 1, 1, 1) - PoisonAnimation.AnimationSpawnFadingEntity(0.25, -0.25, 0.25, "Textures\Battle\Poison\Bubble,0,64,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 3, 1) - PoisonAnimation.AnimationSpawnFadingEntity(0.25, -0.25, -0.25, "Textures\Battle\Poison\Bubble,0,32,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 3, 1) + PoisonAnimation.AnimationChangeTexture(BubbleEntity1, True, TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 64, 32, 32)), 2, 1) + PoisonAnimation.AnimationChangeTexture(BubbleEntity2, False, TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 32, 32, 32)), 2, 1) + Dim BubbleEntity3 As Entity = PoisonAnimation.SpawnEntity(New Vector3(0.25, -0.25, -0.25), TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 0, 32, 32)), New Vector3(0.5F), 1, 2, 1) + + PoisonAnimation.AnimationChangeTexture(BubbleEntity2, True, TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 64, 32, 32)), 3, 1) + PoisonAnimation.AnimationChangeTexture(BubbleEntity3, False, TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 32, 32, 32)), 3, 1) + + PoisonAnimation.AnimationChangeTexture(BubbleEntity3, True, TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 64, 32, 32)), 4, 1) - PoisonAnimation.AnimationSpawnFadingEntity(0.25, -0.25, -0.25, "Textures\Battle\Poison\Bubble,0,64,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 4, 2) BattleScreen.BattleQuery.Add(PoisonAnimation) + 'Actual damage ReduceHP(CInt(.OppPokemon.MaxHP / 8), False, False, BattleScreen, "The poison hurt " & .OppPokemon.GetDisplayName() & ".", "poison") End If @@ -6175,20 +6182,22 @@ Dim multiplier As Double = (.FieldEffects.OppPoisonCounter / 16) 'Poison animation Dim PoisonAnimation As AnimationQueryObject = New AnimationQueryObject(BattleScreen.OppPokemonNPC, False) - PoisonAnimation.PlaySound("Battle\Effects\Poisoned", 0, 0) - PoisonAnimation.AnimationSpawnFadingEntity(-0.25, -0.25, -0.25, "Textures\Battle\Poison\Bubble,0,0,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 0, 1) - PoisonAnimation.AnimationSpawnFadingEntity(-0.25, -0.25, -0.25, "Textures\Battle\Poison\Bubble,0,32,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 1, 1) - PoisonAnimation.AnimationSpawnFadingEntity(0.25, -0.25, 0.25, "Textures\Battle\Poison\Bubble,0,0,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 1, 1) + PoisonAnimation.AnimationPlaySound("Battle\Effects\Poisoned", 0, 0) + Dim BubbleEntity1 As Entity = PoisonAnimation.SpawnEntity(New Vector3(-0.25, -0.25, -0.25), TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 0, 32, 32)), New Vector3(0.5F), 1, 0, 1) - PoisonAnimation.AnimationSpawnFadingEntity(-0.25, -0.25, -0.25, "Textures\Battle\Poison\Bubble,0,64,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 2, 1) - PoisonAnimation.AnimationSpawnFadingEntity(0.25, -0.25, 0.25, "Textures\Battle\Poison\Bubble,0,32,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 2, 1) - PoisonAnimation.AnimationSpawnFadingEntity(0.25, -0.25, -0.25, "Textures\Battle\Poison\Bubble,0,0,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 2, 1) + PoisonAnimation.AnimationChangeTexture(BubbleEntity1, False, TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 32, 32, 32)), 1, 1) + Dim BubbleEntity2 As Entity = PoisonAnimation.SpawnEntity(New Vector3(0.25, -0.25, 0.25), TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 0, 32, 32)), New Vector3(0.5F), 1, 1, 1) - PoisonAnimation.AnimationSpawnFadingEntity(0.25, -0.25, 0.25, "Textures\Battle\Poison\Bubble,0,64,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 3, 1) - PoisonAnimation.AnimationSpawnFadingEntity(0.25, -0.25, -0.25, "Textures\Battle\Poison\Bubble,0,32,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 3, 1) + PoisonAnimation.AnimationChangeTexture(BubbleEntity1, True, TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 64, 32, 32)), 2, 1) + PoisonAnimation.AnimationChangeTexture(BubbleEntity2, False, TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 32, 32, 32)), 2, 1) + Dim BubbleEntity3 As Entity = PoisonAnimation.SpawnEntity(New Vector3(0.25, -0.25, -0.25), TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 0, 32, 32)), New Vector3(0.5F), 1, 2, 1) + + PoisonAnimation.AnimationChangeTexture(BubbleEntity2, True, TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 64, 32, 32)), 3, 1) + PoisonAnimation.AnimationChangeTexture(BubbleEntity3, False, TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 32, 32, 32)), 3, 1) + + PoisonAnimation.AnimationChangeTexture(BubbleEntity3, True, TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 64, 32, 32)), 4, 1) - PoisonAnimation.AnimationSpawnFadingEntity(0.25, -0.25, -0.25, "Textures\Battle\Poison\Bubble,0,64,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 4, 2) BattleScreen.BattleQuery.Add(PoisonAnimation) 'Actual damage ReduceHP(CInt(.OppPokemon.MaxHP * multiplier), False, False, BattleScreen, "The toxic hurt " & .OppPokemon.GetDisplayName() & ".", "badpoison") @@ -6206,13 +6215,13 @@ End If 'Burn animation Dim BurnAnimation As AnimationQueryObject = New AnimationQueryObject(BattleScreen.OppPokemonNPC, False) - BurnAnimation.PlaySound("Battle\Effects\Burned", 0, 0) + BurnAnimation.AnimationPlaySound("Battle\Effects\Burned", 0, 0) Dim FlameEntity As Entity = BurnAnimation.SpawnEntity(New Vector3(CSng(BattleScreen.OppPokemonNPC.Position.X - 0.25), CSng(BattleScreen.OwnPokemonNPC.Position.Y - 0.25), CSng(BattleScreen.OwnPokemonNPC.Position.Z - 0.25)), TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 0, 32, 32)), New Vector3(0.5, 0.5, 0.5), 1.0F) - BurnAnimation.ChangeEntityTexture(FlameEntity, False, TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 32, 32, 32)), 2, 1) - BurnAnimation.ChangeEntityTexture(FlameEntity, False, TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 64, 32, 32)), 3, 1) - BurnAnimation.ChangeEntityTexture(FlameEntity, False, TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 96, 32, 32)), 4, 1) - BurnAnimation.ChangeEntityTexture(FlameEntity, True, TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 128, 32, 32)), 5, 2) + BurnAnimation.AnimationChangeTexture(FlameEntity, False, TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 32, 32, 32)), 2, 1) + BurnAnimation.AnimationChangeTexture(FlameEntity, False, TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 64, 32, 32)), 3, 1) + BurnAnimation.AnimationChangeTexture(FlameEntity, False, TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 96, 32, 32)), 4, 1) + BurnAnimation.AnimationChangeTexture(FlameEntity, True, TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 128, 32, 32)), 5, 2) BattleScreen.BattleQuery.Add(BurnAnimation) 'Actual damage @@ -6783,7 +6792,7 @@ Dim BallReturn As AnimationQueryObject = New AnimationQueryObject(BattleScreen.OwnPokemonNPC, False, BattleScreen.OwnPokemonModel) ' Ball Closes - BallReturn.PlaySound("Battle\Pokeball\Open", 0, 0) + BallReturn.AnimationPlaySound("Battle\Pokeball\Open", 0, 0) Dim SmokeReturned As Integer = 0 Do Dim SmokePosition = New Vector3(CSng(Random.Next(-10, 10) / 10), CSng(Random.Next(-10, 10) / 10), CSng(Random.Next(-10, 10) / 10)) @@ -6796,19 +6805,19 @@ Dim SmokeEntity As Entity = BallReturn.SpawnEntity(SmokePosition, SmokeTexture, SmokeScale, 1.0F) - BallReturn.MoveEntity(SmokeEntity, True, SmokeDestination.X, SmokeDestination.Y, SmokeDestination.Z, SmokeSpeed, False, False, 0.0F, 0.0F) + BallReturn.AnimationMove(SmokeEntity, True, SmokeDestination.X, SmokeDestination.Y, SmokeDestination.Z, SmokeSpeed, False, False, 0.0F, 0.0F) Threading.Interlocked.Increment(SmokeReturned) Loop While SmokeReturned <= 38 ' Pokemon disappears - BallReturn.FadeEntity(Nothing, False, 1, False, 0, 1, 0) - BallReturn.MoveEntity(Nothing, False, 0, 0.5, 0, 0.5, False, False, 2, 0,,, 3) + BallReturn.AnimationFade(Nothing, False, 1, False, 0, 1, 0) + BallReturn.AnimationMove(Nothing, False, 0, 0.5, 0, 0.5, False, False, 2, 0,,, 3) ' Ball returns - BallReturn.PlaySound("Battle\Pokeball\Throw", 1, 0) + BallReturn.AnimationPlaySound("Battle\Pokeball\Throw", 1, 0) Dim BallReturnEntity As Entity = BallReturn.SpawnEntity(BattleScreen.OwnPokemonNPC.Position, TextureManager.GetTexture(BattleScreen.OwnPokemon.CatchBall.TextureSource), New Vector3(0.3F), 1.0F) - BallReturn.MoveEntity(BallReturnEntity, True, BattleScreen.OwnPokemonNPC.Position.X - 2, BattleScreen.OwnPokemonNPC.Position.Y, BattleScreen.OwnPokemonNPC.Position.Z, 0.1, False, True, 1, 0,, 0.3) + BallReturn.AnimationMove(BallReturnEntity, True, BattleScreen.OwnPokemonNPC.Position.X - 2, BattleScreen.OwnPokemonNPC.Position.Y, BattleScreen.OwnPokemonNPC.Position.Z, 0.1, False, True, 1, 0,, 0.3) BattleScreen.AddToQuery(InsertIndex, BallReturn) @@ -6847,13 +6856,13 @@ ' Ball is thrown Dim BallThrow As AnimationQueryObject = New AnimationQueryObject(BattleScreen.OwnPokemonNPC, False, BattleScreen.OwnPokemonModel) - BallThrow.PlaySound("Battle\Pokeball\Throw", 0, 0) + BallThrow.AnimationPlaySound("Battle\Pokeball\Throw", 0, 0) Dim BallThrowEntity As Entity = BallReturn.SpawnEntity(BattleScreen.OwnPokemonNPC.Position + New Vector3(-2, -0.15, 0), TextureManager.GetTexture(BattleScreen.OwnPokemon.CatchBall.TextureSource), New Vector3(0.3F), 1.0F) - BallThrow.MoveEntity(BallThrowEntity, True, BattleScreen.OwnPokemonNPC.Position.X, CSng(BattleScreen.OwnPokemonNPC.Position.Y + 0.35), BattleScreen.OwnPokemonNPC.Position.Z, 0.1, False, True, 0F, 0F,, 0.3) + BallThrow.AnimationMove(BallThrowEntity, True, BattleScreen.OwnPokemonNPC.Position.X, CSng(BattleScreen.OwnPokemonNPC.Position.Y + 0.35), BattleScreen.OwnPokemonNPC.Position.Z, 0.1, False, True, 0F, 0F,, 0.3) ' Ball Opens - BallThrow.PlaySound("Battle\Pokeball\Open", 3, 0) + BallThrow.AnimationPlaySound("Battle\Pokeball\Open", 3, 0) Dim SmokeSpawned As Integer = 0 Do @@ -6867,17 +6876,17 @@ Dim SmokeEntity As Entity = BallThrow.SpawnEntity(SmokePosition, SmokeTexture, SmokeScale, 1.0F) - BallThrow.MoveEntity(SmokeEntity, True, SmokeDestination.X, SmokeDestination.Y, SmokeDestination.Z, SmokeSpeed, False, False, 3.0F, 0.0F) + BallThrow.AnimationMove(SmokeEntity, True, SmokeDestination.X, SmokeDestination.Y, SmokeDestination.Z, SmokeSpeed, False, False, 3.0F, 0.0F) Threading.Interlocked.Increment(SmokeSpawned) Loop While SmokeSpawned <= 38 ' Pokemon appears - BallThrow.FadeEntity(Nothing, False, 1, True, 1, 4, 0) - BallThrow.PlaySound(CStr(BattleScreen.OwnPokemon.Number), 4, 0,, True) + BallThrow.AnimationFade(Nothing, False, 1, True, 1, 4, 0) + BallThrow.AnimationPlaySound(CStr(BattleScreen.OwnPokemon.Number), 4, 0,, True) ' Pokémon falls down - BallThrow.MoveEntity(Nothing, False, 0, 0, 0, 0.05F, False, False, 4, 0,,, 3) + BallThrow.AnimationMove(Nothing, False, 0, 0, 0, 0.05F, False, False, 4, 0,,, 3) BattleScreen.AddToQuery(InsertIndex, BallThrow) End If @@ -7125,8 +7134,8 @@ If BattleScreen.IsTrainerBattle = False Then ChangeCameraAngle(1, False, BattleScreen) Dim Faint As AnimationQueryObject = New AnimationQueryObject(BattleScreen.OppPokemonNPC, True, BattleScreen.OppPokemonModel) - Faint.PlaySound(CStr(BattleScreen.OppPokemon.Number), 0, 2, False, True) - Faint.MoveEntity(Nothing, False, 0, -1, 0, 0.1, False, False, 2, 0,,, 3) + Faint.AnimationPlaySound(CStr(BattleScreen.OppPokemon.Number), 0, 2, False, True) + Faint.AnimationMove(Nothing, False, 0, -1, 0, 0.1, False, False, 2, 0,,, 3) BattleScreen.BattleQuery.Add(Faint) BattleScreen.BattleQuery.Add(New ToggleEntityQueryObject(True, ToggleEntityQueryObject.BattleEntities.OppPokemon, 2, -1, -1, -1, -1)) @@ -7155,28 +7164,29 @@ Dim BallReturn As AnimationQueryObject = New AnimationQueryObject(BattleScreen.OppPokemonNPC, True, BattleScreen.OppPokemonModel) ' Ball Closes - BallReturn.PlaySound("Battle\Pokeball\Open", 0, 0) + BallReturn.AnimationPlaySound("Battle\Pokeball\Open", 0, 0) Dim SmokeReturned As Integer = 0 Do Dim SmokePosition = New Vector3(CSng(Random.Next(-10, 10) / 10), CSng(Random.Next(-10, 10) / 10), CSng(Random.Next(-10, 10) / 10)) Dim SmokeDestination = New Vector3(0, 0, 0) - Dim SmokeTexture As String = "Textures\Battle\Smoke" + Dim SmokeTexture As Texture2D = TextureManager.GetTexture("Textures\Battle\Smoke") Dim SmokeScale = New Vector3(CSng(Random.Next(2, 6) / 10)) Dim SmokeSpeed = CSng(Random.Next(1, 3) / 10.0F) - - BallReturn.AnimationSpawnMovingEntity(SmokePosition.X, SmokePosition.Y, SmokePosition.Z, SmokeTexture, SmokeScale.X, SmokeScale.Y, SmokeScale.Z, SmokeDestination.X, SmokeDestination.Y, SmokeDestination.Z, SmokeSpeed, False, False, 0.0F, 0.0F) + Dim SmokeEntity = BallReturn.SpawnEntity(SmokePosition, SmokeTexture, SmokeScale, 1) + BallReturn.AnimationMove(SmokeEntity, True, SmokeDestination.X, SmokeDestination.Y, SmokeDestination.Z, SmokeSpeed, False, False, 0.0F, 0.0F) Threading.Interlocked.Increment(SmokeReturned) Loop While SmokeReturned <= 38 ' Pokemon disappears - BallReturn.AnimationFadeEntity(Nothing, 1, False, 0, 1, 0) - BallReturn.MoveEntity(Nothing, False, 0, 0.5, 0, 0.5, False, False, 2, 0,,, 4) + BallReturn.AnimationFade(Nothing, False, 1, False, 0, 1, 0) + BallReturn.AnimationMove(Nothing, False, 0, 0.5, 0, 0.5, False, False, 2, 0,,, 4) ' Ball returns - BallReturn.PlaySound("Battle\Pokeball\Throw", 1, 0) - BallReturn.AnimationSpawnMovingEntity(0, 0, 0, BattleScreen.OppPokemon.CatchBall.TextureSource, 0.3F, 0.3F, 0.3F, -2, 0, 0, 0.1, False, True, 1, 0,, 0.3) + BallReturn.AnimationPlaySound("Battle\Pokeball\Throw", 1, 0) + Dim BallReturnEntity = BallReturn.SpawnEntity(New Vector3(0, 0, 0), TextureManager.GetTexture(BattleScreen.OppPokemon.CatchBall.TextureSource), New Vector3(0.3F), 1.0F) + BallReturn.AnimationMove(BallReturnEntity, True, -2, 0, 0, 0.1, False, True, 0F, 0F,, 0.3) BattleScreen.BattleQuery.Add(BallReturn) @@ -7216,28 +7226,29 @@ Dim BallReturn As AnimationQueryObject = New AnimationQueryObject(BattleScreen.OppPokemonNPC, True, BattleScreen.OppPokemonModel) ' Ball Closes - BallReturn.PlaySound("Battle\Pokeball\Open", 0, 0) + BallReturn.AnimationPlaySound("Battle\Pokeball\Open", 0, 0) Dim SmokeReturned As Integer = 0 Do Dim SmokePosition = New Vector3(CSng(Random.Next(-10, 10) / 10), CSng(Random.Next(-10, 10) / 10), CSng(Random.Next(-10, 10) / 10)) Dim SmokeDestination = New Vector3(0, 0, 0) - Dim SmokeTexture As String = "Textures\Battle\Smoke" + Dim SmokeTexture As Texture2D = TextureManager.GetTexture("Textures\Battle\Smoke") Dim SmokeScale = New Vector3(CSng(Random.Next(2, 6) / 10)) Dim SmokeSpeed = CSng(Random.Next(1, 3) / 10.0F) - - BallReturn.AnimationSpawnMovingEntity(SmokePosition.X, SmokePosition.Y, SmokePosition.Z, SmokeTexture, SmokeScale.X, SmokeScale.Y, SmokeScale.Z, SmokeDestination.X, SmokeDestination.Y, SmokeDestination.Z, SmokeSpeed, False, False, 0.0F, 0.0F) + Dim SmokeEntity = BallReturn.SpawnEntity(SmokePosition, SmokeTexture, SmokeScale, 1) + BallReturn.AnimationMove(SmokeEntity, True, SmokeDestination.X, SmokeDestination.Y, SmokeDestination.Z, SmokeSpeed, False, False, 0.0F, 0.0F) Threading.Interlocked.Increment(SmokeReturned) Loop While SmokeReturned <= 38 ' Pokemon disappears - BallReturn.AnimationFadeEntity(Nothing, 1, False, 0, 1, 0) - BallReturn.MoveEntity(Nothing, False, 0, 0.5, 0, 0.5, False, False, 2, 0,,, 4) + BallReturn.AnimationFade(Nothing, False, 1, False, 0, 1, 0) + BallReturn.AnimationMove(Nothing, False, 0, 0.5, 0, 0.5, False, False, 2, 0,,, 4) ' Ball returns - BallReturn.PlaySound("Battle\Pokeball\Throw", 1, 0) - BallReturn.AnimationSpawnMovingEntity(0, 0, 0, BattleScreen.OppPokemon.CatchBall.TextureSource, 0.3F, 0.3F, 0.3F, -2, 0, 0, 0.1, False, True, 1, 0,, 0.3) + BallReturn.AnimationPlaySound("Battle\Pokeball\Throw", 1, 0) + Dim BallReturnEntity = BallReturn.SpawnEntity(New Vector3(0, 0, 0), TextureManager.GetTexture(BattleScreen.OppPokemon.CatchBall.TextureSource), New Vector3(0.3F), 1.0F) + BallReturn.AnimationMove(BallReturnEntity, True, -2, 0, 0, 0.1, False, True, 0F, 0F,, 0.3) BattleScreen.BattleQuery.Add(BallReturn) @@ -7267,31 +7278,33 @@ ' Ball is thrown Dim BallThrow As AnimationQueryObject = New AnimationQueryObject(BattleScreen.OppPokemonNPC, True, BattleScreen.OppPokemonModel) - BallThrow.PlaySound("Battle\Pokeball\Throw", 0, 0) - BallThrow.AnimationSpawnMovingEntity(-2, -0.15, 0, BattleScreen.OwnPokemon.CatchBall.TextureSource, 0.3F, 0.3F, 0.3F, 0, 0.35, 0, 0.1, False, True, 0F, 0F,, 0.3) + BallThrow.AnimationPlaySound("Battle\Pokeball\Throw", 0, 0) + Dim BallThrowEntity = BallThrow.SpawnEntity(New Vector3(-2, -0.15, 0), TextureManager.GetTexture(BattleScreen.OwnPokemon.CatchBall.TextureSource), New Vector3(0.3F), 1.0F) + BallThrow.AnimationMove(BallThrowEntity, True, 0, 0.35, 0, 0.1, False, True, 0F, 0F,, 0.3) - ' Ball Opens - BallThrow.PlaySound("Battle\Pokeball\Open", 3, 0) + ' Ball opens + BallThrow.AnimationPlaySound("Battle\Pokeball\Open", 3, 0) Dim SmokeSpawned As Integer = 0 Do Dim SmokePosition = New Vector3(0, 0.35, 0) Dim SmokeDestination = New Vector3(CSng(Random.Next(-10, 10) / 10), CSng(Random.Next(-10, 10) / 10), CSng(Random.Next(-10, 10) / 10)) - Dim SmokeTexture As String = "Textures\Battle\Smoke" + Dim SmokeTexture As Texture2D = TextureManager.GetTexture("Textures\Battle\Smoke") Dim SmokeScale = New Vector3(CSng(Random.Next(2, 6) / 10)) Dim SmokeSpeed = CSng(Random.Next(1, 3) / 10.0F) + Dim SmokeEntity = BallReturn.SpawnEntity(SmokePosition, SmokeTexture, SmokeScale, 1) - BallThrow.AnimationSpawnMovingEntity(SmokePosition.X, SmokePosition.Y, SmokePosition.Z, SmokeTexture, SmokeScale.X, SmokeScale.Y, SmokeScale.Z, SmokeDestination.X, SmokeDestination.Y, SmokeDestination.Z, SmokeSpeed, False, False, 3.0F, 0.0F) + BallThrow.AnimationMove(SmokeEntity, True, SmokeDestination.X, SmokeDestination.Y, SmokeDestination.Z, SmokeSpeed, False, False, 3.0F, 0.0F) Threading.Interlocked.Increment(SmokeSpawned) Loop While SmokeSpawned <= 38 ' Pokemon appears - BallThrow.AnimationFadeEntity(Nothing, 1, True, 1, 4, 0) - BallThrow.PlaySound(CStr(BattleScreen.OppPokemon.Number), 4, 0,, True) + BallThrow.AnimationFade(Nothing, False, 1, True, 1, 4, 0) + BallThrow.AnimationPlaySound(CStr(BattleScreen.OppPokemon.Number), 4, 0,, True) ' Pokémon falls down - BallThrow.MoveEntity(Nothing, False, 0, 0, 0, 0.05F, False, False, 4, 0,,, 4) + BallThrow.AnimationMove(Nothing, False, 0, 0, 0, 0.05F, False, False, 4, 0,,, 4) BattleScreen.BattleQuery.Add(BallThrow) End If diff --git a/P3D/Pokemon/Attacks/Fire/Ember.vb b/P3D/Pokemon/Attacks/Fire/Ember.vb index 03a9cfffc..1356505d9 100644 --- a/P3D/Pokemon/Attacks/Fire/Ember.vb +++ b/P3D/Pokemon/Attacks/Fire/Ember.vb @@ -65,10 +65,14 @@ Public Overrides Sub InternalUserPokemonMoveAnimation(ByVal BattleScreen As BattleScreen, ByVal own As Boolean, ByVal CurrentPokemon As Pokemon, ByVal CurrentEntity As NPC, ByVal CurrentModel As ModelEntity) Dim MoveAnimation As AnimationQueryObject = New AnimationQueryObject(CurrentEntity, own) - MoveAnimation.AnimationSpawnMovingEntity(0.0, 0, 0.0, "Textures\Battle\Fire\FireBall", 0.5, 0.5, 0.5, 2.0, 0.0, 0.0, 0.05, False, True, 0.0, 0.0,, -0.5, 0) - MoveAnimation.PlaySound("Battle\Attacks\Fire\Ember_Start", 0, 0) + Dim FireballEntity As Entity = MoveAnimation.SpawnEntity(New Vector3(0.0, 0.0, 0.0), TextureManager.GetTexture("Textures\Battle\Fire\FireBall"), New Vector3(0.5F), 1.0F) + + MoveAnimation.AnimationMove(FireballEntity, True, 2.0, 0.0, 0.0, 0.05, False, True, 0.0, 0.0,, -0.5, 0) + MoveAnimation.AnimationPlaySound("Battle\Attacks\Fire\Ember_Start", 0, 0) For i = 0 To 12 - MoveAnimation.AnimationSpawnFadingEntity(CSng(i * 0.2), 0.0, 0.0, "Textures\Battle\Fire\Smoke", 0.2, 0.2, 0.2, 0.02, False, 0.0, CSng(i * 0.2), 0.0) + Dim SmokeEntity = MoveAnimation.SpawnEntity(New Vector3(CSng(i * 0.2), 0.0, 0.0), TextureManager.GetTexture("Textures\Battle\Fire\Smoke"), New Vector3(0.2), 1) + MoveAnimation.AnimationFade(SmokeEntity, True, 0.02, False, 0.0, CSng(i * 0.2), 0.0) + i += 1 Next BattleScreen.BattleQuery.Add(MoveAnimation) @@ -76,32 +80,37 @@ Public Overrides Sub InternalOpponentPokemonMoveAnimation(ByVal BattleScreen As BattleScreen, ByVal own As Boolean, ByVal CurrentPokemon As Pokemon, ByVal CurrentEntity As NPC, ByVal CurrentModel As ModelEntity) Dim MoveAnimation As AnimationQueryObject = New AnimationQueryObject(CurrentEntity, own) + Dim FireballEntity As Entity = MoveAnimation.SpawnEntity(New Vector3(2.0, 0.0, 0.0), TextureManager.GetTexture("Textures\Battle\Fire\FireBall"), New Vector3(0.5F), 1.0F) + + MoveAnimation.AnimationMove(FireballEntity, True, 0.0, 0.0, 0.0, 0.05, False, True, 0.0, 0.0,, -0.5, 0) - MoveAnimation.AnimationSpawnMovingEntity(2.0, 0, 0.0, "Textures\Battle\Fire\FireBall", 0.5, 0.5, 0.5, 0.0, 0.0, 0.0, 0.05, False, True, 0.0, 0.0, 0.1, 0.5, 0) For i = 0 To 12 - MoveAnimation.AnimationSpawnFadingEntity(CSng(3.0 - i * 0.2), 0.0, 0.0, "Textures\Battle\Fire\Smoke", 0.2, 0.2, 0.2, 0.02, False, 0.0, CSng(i * 0.2), 0.0) + Dim SmokeEntity = MoveAnimation.SpawnEntity(New Vector3(CSng(3.0 - i * 0.2), 0.0, 0.0), TextureManager.GetTexture("Textures\Battle\Fire\Smoke"), New Vector3(0.2), 1) + MoveAnimation.AnimationFade(SmokeEntity, True, 0.02, False, 0.0, CSng(i * 0.2), 0.0) + i += 1 Next - MoveAnimation.PlaySound("Battle\Attacks\Fire\Ember_Hit", 2, 0) - MoveAnimation.AnimationSpawnFadingEntity(-0.25, -0.25, -0.25, "Textures\Battle\Fire\Ember,0,0,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 1, 1) - MoveAnimation.AnimationSpawnFadingEntity(0.25, -0.25, 0.25, "Textures\Battle\Fire\Ember,0,0,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 1, 1) - MoveAnimation.AnimationSpawnFadingEntity(0.25, -0.25, -0.25, "Textures\Battle\Fire\Ember,0,0,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 1, 1) + MoveAnimation.AnimationPlaySound("Battle\Attacks\Fire\Ember_Hit", 2, 0) - MoveAnimation.AnimationSpawnFadingEntity(-0.25, -0.25, -0.25, "Textures\Battle\Fire\Ember,0,32,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 2, 1) - MoveAnimation.AnimationSpawnFadingEntity(0.25, -0.25, 0.25, "Textures\Battle\Fire\Ember,0,32,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 2, 1) - MoveAnimation.AnimationSpawnFadingEntity(0.25, -0.25, -0.25, "Textures\Battle\Fire\Ember,0,32,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 2, 1) + Dim FireEntity1 As Entity = MoveAnimation.SpawnEntity(New Vector3(-0.25, -0.25, -0.25), TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 0, 32, 32), ""), New Vector3(0.5F), 1, 1, 1) + Dim FireEntity2 As Entity = MoveAnimation.SpawnEntity(New Vector3(0.25, -0.25, 0.25), TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 0, 32, 32), ""), New Vector3(0.5F), 1, 1, 1) + Dim FireEntity3 As Entity = MoveAnimation.SpawnEntity(New Vector3(0.25, -0.25, -0.25), TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 0, 32, 32), ""), New Vector3(0.5F), 1, 1, 1) - MoveAnimation.AnimationSpawnFadingEntity(-0.25, -0.25, -0.25, "Textures\Battle\Fire\Ember,0,64,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 3, 1) - MoveAnimation.AnimationSpawnFadingEntity(0.25, -0.25, 0.25, "Textures\Battle\Fire\Ember,0,64,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 3, 1) - MoveAnimation.AnimationSpawnFadingEntity(0.25, -0.25, -0.25, "Textures\Battle\Fire\Ember,0,64,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 3, 1) + MoveAnimation.AnimationChangeTexture(FireEntity1, False, TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 32, 32, 32)), 2, 1) + MoveAnimation.AnimationChangeTexture(FireEntity2, False, TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 32, 32, 32)), 2, 1) + MoveAnimation.AnimationChangeTexture(FireEntity3, False, TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 32, 32, 32)), 2, 1) - MoveAnimation.AnimationSpawnFadingEntity(-0.25, -0.25, -0.25, "Textures\Battle\Fire\Ember,0,96,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 4, 1) - MoveAnimation.AnimationSpawnFadingEntity(0.25, -0.25, 0.25, "Textures\Battle\Fire\Ember,0,96,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 4, 1) - MoveAnimation.AnimationSpawnFadingEntity(0.25, -0.25, -0.25, "Textures\Battle\Fire\Ember,0,96,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 4, 1) + MoveAnimation.AnimationChangeTexture(FireEntity1, False, TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 64, 32, 32)), 3, 1) + MoveAnimation.AnimationChangeTexture(FireEntity2, False, TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 64, 32, 32)), 3, 1) + MoveAnimation.AnimationChangeTexture(FireEntity3, False, TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 64, 32, 32)), 3, 1) - MoveAnimation.AnimationSpawnFadingEntity(-0.25, -0.25, -0.25, "Textures\Battle\Fire\Ember,0,128,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 5, 1) - MoveAnimation.AnimationSpawnFadingEntity(0.25, -0.25, 0.25, "Textures\Battle\Fire\Ember,0,128,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 5, 1) - MoveAnimation.AnimationSpawnFadingEntity(0.25, -0.25, -0.25, "Textures\Battle\Fire\Ember,0,128,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 5, 1) + MoveAnimation.AnimationChangeTexture(FireEntity1, False, TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 96, 32, 32)), 4, 1) + MoveAnimation.AnimationChangeTexture(FireEntity2, False, TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 96, 32, 32)), 4, 1) + MoveAnimation.AnimationChangeTexture(FireEntity3, False, TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 96, 32, 32)), 4, 1) + + MoveAnimation.AnimationChangeTexture(FireEntity1, True, TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 128, 32, 32)), 5, 1) + MoveAnimation.AnimationChangeTexture(FireEntity2, True, TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 128, 32, 32)), 5, 1) + MoveAnimation.AnimationChangeTexture(FireEntity3, True, TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 128, 32, 32)), 5, 1) BattleScreen.BattleQuery.Add(MoveAnimation) End Sub diff --git a/P3D/Pokemon/Attacks/Grass/Absorb.vb b/P3D/Pokemon/Attacks/Grass/Absorb.vb index 318503d28..9590c3d18 100644 --- a/P3D/Pokemon/Attacks/Grass/Absorb.vb +++ b/P3D/Pokemon/Attacks/Grass/Absorb.vb @@ -96,7 +96,7 @@ Dim MoveAnimation As AnimationQueryObject = New AnimationQueryObject(CurrentEntity, own) Dim maxAmount As Integer = 8 Dim currentAmount As Integer = 0 - MoveAnimation.PlaySound("Battle\Attacks\Grass\Absorb", 0, 0) + MoveAnimation.AnimationPlaySound("Battle\Attacks\Grass\Absorb", 0, 0) While currentAmount <= maxAmount Dim yPos As Single = CSng(Random.NextDouble() * 0.5) Dim zPos As Single = CSng(Random.Next(-5, 5) * 0.15) diff --git a/P3D/Pokemon/Attacks/Normal/Growl.vb b/P3D/Pokemon/Attacks/Normal/Growl.vb index e01dafc73..369515629 100644 --- a/P3D/Pokemon/Attacks/Normal/Growl.vb +++ b/P3D/Pokemon/Attacks/Normal/Growl.vb @@ -64,11 +64,14 @@ Public Overrides Sub InternalUserPokemonMoveAnimation(ByVal BattleScreen As BattleScreen, ByVal own As Boolean, ByVal CurrentPokemon As Pokemon, ByVal CurrentEntity As NPC, ByVal CurrentModel As ModelEntity) Dim MoveAnimation As AnimationQueryObject = New AnimationQueryObject(CurrentEntity, own) - MoveAnimation.PlaySound(CStr(CurrentPokemon.Number), 0, 0,, True) - MoveAnimation.AnimationSpawnFadingEntity(0.25, -0.25, -0.25, "Textures\Battle\Normal\Growl,0,0,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 0, 1) - MoveAnimation.AnimationSpawnFadingEntity(0.25, -0.25, -0.25, "Textures\Battle\Normal\Growl,0,32,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 1, 1) - MoveAnimation.AnimationSpawnFadingEntity(0.25, -0.25, -0.25, "Textures\Battle\Normal\Growl,0,0,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 2, 1) - MoveAnimation.AnimationSpawnFadingEntity(0.25, -0.25, -0.25, "Textures\Battle\Normal\Growl,0,32,32,32", 0.5, 0.5, 0.5, 0.02, False, 1.0, 3, 1) + + MoveAnimation.AnimationPlaySound(CStr(CurrentPokemon.Number), 0, 0,, True) + Dim SoundwaveEntity = MoveAnimation.SpawnEntity(New Vector3(0.25, -0.25, -0.25), TextureManager.GetTexture("Textures\Battle\Normal\Growl", New Rectangle(0, 0, 32, 32), ""), New Vector3(0.5F), 1, 0, 1) + + MoveAnimation.AnimationChangeTexture(SoundwaveEntity, False, TextureManager.GetTexture("Textures\Battle\Normal\Growl", New Rectangle(0, 32, 32, 32), ""), 1, 1) + MoveAnimation.AnimationChangeTexture(SoundwaveEntity, False, TextureManager.GetTexture("Textures\Battle\Normal\Growl", New Rectangle(0, 0, 32, 32), ""), 2, 1) + MoveAnimation.AnimationChangeTexture(SoundwaveEntity, True, TextureManager.GetTexture("Textures\Battle\Normal\Growl", New Rectangle(0, 32, 32, 32), ""), 3, 1) + BattleScreen.BattleQuery.Add(MoveAnimation) End Sub End Class diff --git a/P3D/Pokemon/Attacks/Normal/Pound.vb b/P3D/Pokemon/Attacks/Normal/Pound.vb index 5cf85b3e2..d14a3c279 100644 --- a/P3D/Pokemon/Attacks/Normal/Pound.vb +++ b/P3D/Pokemon/Attacks/Normal/Pound.vb @@ -57,8 +57,9 @@ Public Overrides Sub InternalOpponentPokemonMoveAnimation(ByVal BattleScreen As BattleScreen, ByVal own As Boolean, ByVal CurrentPokemon As Pokemon, ByVal CurrentEntity As NPC, ByVal CurrentModel As ModelEntity) Dim MoveAnimation As AnimationQueryObject = New AnimationQueryObject(CurrentEntity, own) - MoveAnimation.PlaySound("Battle\Attacks\Pound", 0.5, 2.5) - MoveAnimation.AnimationSpawnFadingEntity(0, -0.25, 0, "Textures\Battle\Normal\Pound", 0.5, 0.5, 0.5, 0.02, False, 1.0, 0, 3) + MoveAnimation.AnimationPlaySound("Battle\Attacks\Pound", 0.5, 2.5) + Dim PoundEntity = MoveAnimation.SpawnEntity(New Vector3(0.25, -0.25, -0.25), TextureManager.GetTexture("Textures\Battle\Normal\Growl", New Rectangle(0, 0, 32, 32), ""), New Vector3(0.5F), 1, 0, 3) + MoveAnimation.AnimationFade(PoundEntity, True, 1.0F, False, 0.0F, 3, 0) BattleScreen.BattleQuery.Add(MoveAnimation) End Sub diff --git a/P3D/Pokemon/Attacks/Normal/Tackle.vb b/P3D/Pokemon/Attacks/Normal/Tackle.vb index 99e61e709..668b4b545 100644 --- a/P3D/Pokemon/Attacks/Normal/Tackle.vb +++ b/P3D/Pokemon/Attacks/Normal/Tackle.vb @@ -54,16 +54,16 @@ Public Overrides Sub InternalUserPokemonMoveAnimation(ByVal BattleScreen As BattleScreen, ByVal own As Boolean, ByVal CurrentPokemon As Pokemon, ByVal CurrentEntity As NPC, ByVal CurrentModel As ModelEntity) Dim MoveAnimation As AnimationQueryObject = New AnimationQueryObject(CurrentEntity, own, CurrentModel) - MoveAnimation.MoveEntity(Nothing, False, 0.5, 0, 0, 0.3, False, False, 0, 0,,, 2) - MoveAnimation.MoveEntity(Nothing, False, 0, 0, 0, 0.3, False, False, 1, 0,,, 2) + MoveAnimation.AnimationMove(Nothing, False, 0.5, 0, 0, 0.3, False, False, 0, 0,,, 2) + MoveAnimation.AnimationMove(Nothing, False, 0, 0, 0, 0.3, False, False, 1, 0,,, 2) BattleScreen.BattleQuery.Add(MoveAnimation) End Sub Public Overrides Sub InternalOpponentPokemonMoveAnimation(ByVal BattleScreen As BattleScreen, ByVal own As Boolean, ByVal CurrentPokemon As Pokemon, ByVal CurrentEntity As NPC, ByVal CurrentModel As ModelEntity) Dim MoveAnimation As AnimationQueryObject = New AnimationQueryObject(CurrentEntity, own) - MoveAnimation.PlaySound("Battle\Attacks\Normal\Tackle", 0, 2) + MoveAnimation.AnimationPlaySound("Battle\Attacks\Normal\Tackle", 0, 2) Dim SpawnEntity = MoveAnimation.SpawnEntity(New Vector3(0, -0.25, 0), TextureManager.GetTexture("Textures\Battle\Normal\Tackle"), New Vector3(1.0F), 1.0F) - MoveAnimation.FadeEntity(SpawnEntity, True, 0.02, False, 1.0F, 0, 2) + MoveAnimation.AnimationFade(SpawnEntity, True, 0.02, False, 1.0F, 0, 2) BattleScreen.BattleQuery.Add(MoveAnimation) End Sub End Class diff --git a/P3D/Pokemon/Attacks/Poison/PoisonSting.vb b/P3D/Pokemon/Attacks/Poison/PoisonSting.vb index 3cc76f0a4..fa0fb7abe 100644 --- a/P3D/Pokemon/Attacks/Poison/PoisonSting.vb +++ b/P3D/Pokemon/Attacks/Poison/PoisonSting.vb @@ -69,8 +69,8 @@ Dim MoveAnimation As AnimationQueryObject = New AnimationQueryObject(CurrentEntity, own) Dim StingerEntity As Entity = MoveAnimation.SpawnEntity(CurrentEntity.Position, TextureManager.GetTexture("Textures\Battle\Poison\Stinger"), New Vector3(0.5F), 1.0F) - MoveAnimation.PlaySound("Battle\Attacks\Poison\PoisonSting_Start", 0, 0) - MoveAnimation.MoveEntity(StingerEntity, True, 2.0, 0.0, 0.0, 0.05, False, False, 0.0, 0.0,,, 0) + MoveAnimation.AnimationPlaySound("Battle\Attacks\Poison\PoisonSting_Start", 0, 0) + MoveAnimation.AnimationMove(StingerEntity, True, 2.0, 0.0, 0.0, 0.05, False, False, 0.0, 0.0,,, 0) BattleScreen.BattleQuery.Add(MoveAnimation) End Sub @@ -80,25 +80,25 @@ Dim StingerEntity As Entity = MoveAnimation.SpawnEntity(New Vector3(2.0, 0, 0.0), TextureManager.GetTexture("Textures\Battle\Poison\Stinger"), New Vector3(0.5F), 1) - MoveAnimation.MoveEntity(StingerEntity, True, 0.0, 0.0, 0.0, 0.05, False, False, 0.0, 0.0,,, 0) + MoveAnimation.AnimationMove(StingerEntity, True, 0.0, 0.0, 0.0, 0.05, False, False, 0.0, 0.0,,, 0) - MoveAnimation.PlaySound("Battle\Attacks\Poison\PoisonSting_Hit", 1, 0) + MoveAnimation.AnimationPlaySound("Battle\Attacks\Poison\PoisonSting_Hit", 1, 0) Dim BubbleEntity1 As Entity = MoveAnimation.SpawnEntity(New Vector3(-0.25, -0.25, -0.25), TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 0, 32, 32)), New Vector3(0.5F), 1, 1, 1) - MoveAnimation.ChangeEntityTexture(BubbleEntity1, False, TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 32, 32, 32)), 2, 1) + MoveAnimation.AnimationChangeTexture(BubbleEntity1, False, TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 32, 32, 32)), 2, 1) Dim BubbleEntity2 As Entity = MoveAnimation.SpawnEntity(New Vector3(0.25, -0.25, 0.25), TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 0, 32, 32)), New Vector3(0.5F), 1, 2, 1) - MoveAnimation.ChangeEntityTexture(BubbleEntity1, True, TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 64, 32, 32)), 3, 1) - MoveAnimation.ChangeEntityTexture(BubbleEntity2, False, TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 32, 32, 32)), 3, 1) + MoveAnimation.AnimationChangeTexture(BubbleEntity1, True, TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 64, 32, 32)), 3, 1) + MoveAnimation.AnimationChangeTexture(BubbleEntity2, False, TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 32, 32, 32)), 3, 1) Dim BubbleEntity3 As Entity = MoveAnimation.SpawnEntity(New Vector3(0.25, -0.25, -0.25), TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 0, 32, 32)), New Vector3(0.5F), 1, 3, 1) - MoveAnimation.ChangeEntityTexture(BubbleEntity2, True, TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 64, 32, 32)), 4, 1) - MoveAnimation.ChangeEntityTexture(BubbleEntity3, False, TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 32, 32, 32)), 4, 1) + MoveAnimation.AnimationChangeTexture(BubbleEntity2, True, TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 64, 32, 32)), 4, 1) + MoveAnimation.AnimationChangeTexture(BubbleEntity3, False, TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 32, 32, 32)), 4, 1) - MoveAnimation.ChangeEntityTexture(BubbleEntity3, True, TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 64, 32, 32)), 5, 1) + MoveAnimation.AnimationChangeTexture(BubbleEntity3, True, TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 64, 32, 32)), 5, 1) BattleScreen.BattleQuery.Add(MoveAnimation) End Sub From 7fba875d024200ad9a6bbba367d9bc429c4bc370 Mon Sep 17 00:00:00 2001 From: JappaWakkaP3D <31563291+JappaWakka@users.noreply.github.com> Date: Sun, 24 Oct 2021 01:56:29 +0200 Subject: [PATCH 14/57] Fixed a lot of animation system bugs Fixed: * Spawned entities not appearing * Animations getting removed too soon * Incorrect relative positioning * Ember textures being searched for in the wrong place --- P3D/Battle/BattleAnimations/BAEntityMove.vb | 3 +- .../BattleAnimations/BattleAnimation3D.vb | 11 +++--- P3D/Battle/BattleSystemV2/Battle.vb | 26 +++++++------- P3D/Battle/BattleSystemV2/BattleScreen.vb | 2 +- .../QueryObjects/AnimationQueryObject.vb | 36 ++++++++++--------- P3D/Pokemon/Attacks/Attack.vb | 2 ++ P3D/Pokemon/Attacks/Fire/Ember.vb | 24 ++++++------- P3D/Pokemon/Attacks/Grass/Absorb.vb | 2 +- P3D/Pokemon/Attacks/Normal/Tackle.vb | 10 +++--- P3D/Pokemon/Attacks/Poison/PoisonSting.vb | 2 +- 10 files changed, 60 insertions(+), 58 deletions(-) diff --git a/P3D/Battle/BattleAnimations/BAEntityMove.vb b/P3D/Battle/BattleAnimations/BAEntityMove.vb index 8e7685f6f..cb5fa1e0e 100644 --- a/P3D/Battle/BattleAnimations/BAEntityMove.vb +++ b/P3D/Battle/BattleAnimations/BAEntityMove.vb @@ -59,8 +59,7 @@ Private Sub Spin() If Me.SpinX = True Then - Dim targetEntity = Me.TargetEntity - targetEntity.Rotation.X += SpinSpeedX + TargetEntity.Rotation.X += SpinSpeedX End If If Me.SpinZ = True Then TargetEntity.Rotation.Z += SpinSpeedZ diff --git a/P3D/Battle/BattleAnimations/BattleAnimation3D.vb b/P3D/Battle/BattleAnimations/BattleAnimation3D.vb index 8011ce1d2..48e63f3a0 100644 --- a/P3D/Battle/BattleAnimations/BattleAnimation3D.vb +++ b/P3D/Battle/BattleAnimations/BattleAnimation3D.vb @@ -25,18 +25,15 @@ Public Ready As Boolean = False Public startDelay As Single Public endDelay As Single - Public SpawnedEntity As Entity = Nothing + Public SpawnedEntity As Boolean = False - Public Sub New(ByVal Position As Vector3, ByVal Texture As Texture2D, ByVal Scale As Vector3, ByVal startDelay As Single, ByVal endDelay As Single, Optional SpawnedEntity As Entity = Nothing) + Public Sub New(ByVal Position As Vector3, ByVal Texture As Texture2D, ByVal Scale As Vector3, ByVal startDelay As Single, ByVal endDelay As Single, Optional SpawnedEntity As Boolean = False) MyBase.New(Position.X, Position.Y, Position.Z, "BattleAnimation", {Texture}, {0, 0}, False, 0, Scale, BaseModel.BillModel, 0, "", New Vector3(1.0F)) - Me.Visible = Visible Me.startDelay = startDelay Me.endDelay = endDelay - If SpawnedEntity IsNot Nothing Then - Me.SpawnedEntity = SpawnedEntity - End If + Me.SpawnedEntity = SpawnedEntity Me.CreateWorldEveryFrame = True Me.DropUpdateUnlessDrawn = False @@ -62,7 +59,7 @@ startDelay = 0.0F End If Else - If SpawnedEntity IsNot Nothing Then + If SpawnedEntity = True Then Ready = True End If DoActionActive() diff --git a/P3D/Battle/BattleSystemV2/Battle.vb b/P3D/Battle/BattleSystemV2/Battle.vb index 058885f11..63e067b6f 100644 --- a/P3D/Battle/BattleSystemV2/Battle.vb +++ b/P3D/Battle/BattleSystemV2/Battle.vb @@ -1496,7 +1496,7 @@ End If 'Own Pokémon move animation! This displays any effects that should display on the user of the move. - moveUsed.UserPokemonMoveAnimation(BattleScreen, own) + moveUsed.UserPokemonMoveAnimation(BattleScreen, Not own) If moveUsed.Target <> Attack.Targets.Self And moveUsed.FocusOppPokemon = True Then If own = True Then @@ -2707,7 +2707,7 @@ 'Burn animation Dim BurnAnimation As AnimationQueryObject = New AnimationQueryObject(pNPC, own) BurnAnimation.AnimationPlaySound("Battle\Effects\Burned", 0, 0) - Dim FlameEntity As Entity = BurnAnimation.SpawnEntity(New Vector3(CSng(pNPC.Position.X - 0.25), CSng(pNPC.Position.Y - 0.25), CSng(pNPC.Position.Z - 0.25)), TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 0, 32, 32)), New Vector3(0.5, 0.5, 0.5), 1.0F) + Dim FlameEntity As Entity = BurnAnimation.SpawnEntity(New Vector3(CSng(-0.25), CSng(-0.25), CSng(-0.25)), TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 0, 32, 32)), New Vector3(0.5, 0.5, 0.5), 1.0F) BurnAnimation.AnimationChangeTexture(FlameEntity, False, TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 32, 32, 32)), 2, 1) BurnAnimation.AnimationChangeTexture(FlameEntity, False, TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 64, 32, 32)), 3, 1) BurnAnimation.AnimationChangeTexture(FlameEntity, False, TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 96, 32, 32)), 4, 1) @@ -3420,8 +3420,8 @@ Dim xPos = CSng((Random.NextDouble() - 0.5) * 1.2) Dim zPos = CSng((Random.NextDouble() - 0.5) * 1.2) - Dim Position As New Vector3(xPos + pNPC.Position.X, CSng(pNPC.Position.Y - 0.4), pNPC.Position.Z + zPos) - Dim Destination As New Vector3(xPos + pNPC.Position.X, CSng(pNPC.Position.Y + 0.8), zPos + pNPC.Position.Z) + Dim Position As New Vector3(xPos, -0.4, zPos) + Dim Destination As New Vector3(xPos, 0.8, zPos) Dim Scale As New Vector3(0.2F) Dim StatEntity As Entity = StatAnimation.SpawnEntity(Position, Texture, Scale, 1.0F) @@ -3701,8 +3701,8 @@ Dim xPos = CSng((Random.NextDouble() - 0.5) * 1.2) Dim zPos = CSng((Random.NextDouble() - 0.5) * 1.2) - Dim Position As New Vector3(xPos + pNPC.Position.X, CSng(pNPC.Position.Y + 0.8), pNPC.Position.Z + zPos) - Dim Destination As New Vector3(xPos + pNPC.Position.X, CSng(pNPC.Position.Y - 0.4), zPos + pNPC.Position.Z) + Dim Position As New Vector3(xPos, 0.8, zPos) + Dim Destination As New Vector3(xPos, -0.4, zPos) Dim Scale As New Vector3(0.2F) Dim StatEntity As Entity = StatAnimation.SpawnEntity(Position, Texture, Scale, 1.0F) @@ -5419,7 +5419,7 @@ Dim BurnAnimation As AnimationQueryObject = New AnimationQueryObject(BattleScreen.OwnPokemonNPC, False) BurnAnimation.AnimationPlaySound("Battle\Effects\Burned", 0, 0) - Dim FlameEntity As Entity = BurnAnimation.SpawnEntity(New Vector3(CSng(BattleScreen.OwnPokemonNPC.Position.X + 0.25), CSng(BattleScreen.OwnPokemonNPC.Position.Y - 0.25), CSng(BattleScreen.OwnPokemonNPC.Position.Z + 0.25)), TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 0, 32, 32)), New Vector3(0.5, 0.5, 0.5), 1.0F) + Dim FlameEntity As Entity = BurnAnimation.SpawnEntity(New Vector3(0.25F, 0.25F, 0.25), TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 0, 32, 32), ""), New Vector3(0.5, 0.5, 0.5), 1.0F) BurnAnimation.AnimationChangeTexture(FlameEntity, False, TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 32, 32, 32)), 2, 1) BurnAnimation.AnimationChangeTexture(FlameEntity, False, TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 64, 32, 32)), 3, 1) BurnAnimation.AnimationChangeTexture(FlameEntity, False, TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 96, 32, 32)), 4, 1) @@ -6214,10 +6214,10 @@ reduceAmount = CInt(.OppPokemon.MaxHP / 16) End If 'Burn animation - Dim BurnAnimation As AnimationQueryObject = New AnimationQueryObject(BattleScreen.OppPokemonNPC, False) + Dim BurnAnimation As AnimationQueryObject = New AnimationQueryObject(BattleScreen.OppPokemonNPC, True) BurnAnimation.AnimationPlaySound("Battle\Effects\Burned", 0, 0) - Dim FlameEntity As Entity = BurnAnimation.SpawnEntity(New Vector3(CSng(BattleScreen.OppPokemonNPC.Position.X - 0.25), CSng(BattleScreen.OwnPokemonNPC.Position.Y - 0.25), CSng(BattleScreen.OwnPokemonNPC.Position.Z - 0.25)), TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 0, 32, 32)), New Vector3(0.5, 0.5, 0.5), 1.0F) + Dim FlameEntity As Entity = BurnAnimation.SpawnEntity(New Vector3(0.25, 0.25, 0.25), TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 0, 32, 32)), New Vector3(0.5, 0.5, 0.5), 1.0F) BurnAnimation.AnimationChangeTexture(FlameEntity, False, TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 32, 32, 32)), 2, 1) BurnAnimation.AnimationChangeTexture(FlameEntity, False, TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 64, 32, 32)), 3, 1) BurnAnimation.AnimationChangeTexture(FlameEntity, False, TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 96, 32, 32)), 4, 1) @@ -6816,8 +6816,8 @@ ' Ball returns BallReturn.AnimationPlaySound("Battle\Pokeball\Throw", 1, 0) - Dim BallReturnEntity As Entity = BallReturn.SpawnEntity(BattleScreen.OwnPokemonNPC.Position, TextureManager.GetTexture(BattleScreen.OwnPokemon.CatchBall.TextureSource), New Vector3(0.3F), 1.0F) - BallReturn.AnimationMove(BallReturnEntity, True, BattleScreen.OwnPokemonNPC.Position.X - 2, BattleScreen.OwnPokemonNPC.Position.Y, BattleScreen.OwnPokemonNPC.Position.Z, 0.1, False, True, 1, 0,, 0.3) + Dim BallReturnEntity As Entity = BallReturn.SpawnEntity(New Vector3(0.0F), TextureManager.GetTexture(BattleScreen.OwnPokemon.CatchBall.TextureSource), New Vector3(0.3F), 1.0F) + BallReturn.AnimationMove(BallReturnEntity, True, -2, 0, 0, 0.1, False, True, 1, 0,, 0.3) BattleScreen.AddToQuery(InsertIndex, BallReturn) @@ -6858,8 +6858,8 @@ BallThrow.AnimationPlaySound("Battle\Pokeball\Throw", 0, 0) - Dim BallThrowEntity As Entity = BallReturn.SpawnEntity(BattleScreen.OwnPokemonNPC.Position + New Vector3(-2, -0.15, 0), TextureManager.GetTexture(BattleScreen.OwnPokemon.CatchBall.TextureSource), New Vector3(0.3F), 1.0F) - BallThrow.AnimationMove(BallThrowEntity, True, BattleScreen.OwnPokemonNPC.Position.X, CSng(BattleScreen.OwnPokemonNPC.Position.Y + 0.35), BattleScreen.OwnPokemonNPC.Position.Z, 0.1, False, True, 0F, 0F,, 0.3) + Dim BallThrowEntity As Entity = BallReturn.SpawnEntity(New Vector3(-2, -0.15, 0), TextureManager.GetTexture(BattleScreen.OwnPokemon.CatchBall.TextureSource), New Vector3(0.3F), 1.0F) + BallThrow.AnimationMove(BallThrowEntity, True, 0, 0.35, 0, 0.1, False, True, 0F, 0F,, 0.3) ' Ball Opens BallThrow.AnimationPlaySound("Battle\Pokeball\Open", 3, 0) diff --git a/P3D/Battle/BattleSystemV2/BattleScreen.vb b/P3D/Battle/BattleSystemV2/BattleScreen.vb index a4dcf7821..f96d4e96d 100644 --- a/P3D/Battle/BattleSystemV2/BattleScreen.vb +++ b/P3D/Battle/BattleSystemV2/BattleScreen.vb @@ -815,7 +815,7 @@ nextIndex: If BattleQuery.Count > cIndex Then Dim cQueryObject As QueryObject = BattleQuery(cIndex) If cQueryObject.QueryType = QueryObject.QueryTypes.MoveAnimation Then - If CType(cQueryObject, AnimationQueryObject).DrawBeforeEntities = False Then + If CType(cQueryObject, AnimationQueryObject).DrawBeforeEntities = True Then cQuery.Add(cQueryObject) Else ForegroundAnimationList.Add(CType(cQueryObject, AnimationQueryObject)) diff --git a/P3D/Battle/BattleSystemV2/QueryObjects/AnimationQueryObject.vb b/P3D/Battle/BattleSystemV2/QueryObjects/AnimationQueryObject.vb index fba7a46b3..919bc52ce 100644 --- a/P3D/Battle/BattleSystemV2/QueryObjects/AnimationQueryObject.vb +++ b/P3D/Battle/BattleSystemV2/QueryObjects/AnimationQueryObject.vb @@ -21,6 +21,7 @@ Public Sub New(ByVal entity As Entity, ByVal BattleFlipped As Boolean, Optional ByVal model As ModelEntity = Nothing, Optional DrawBeforeEntities As Boolean = False) MyBase.New(QueryTypes.MoveAnimation) Me.AnimationSequence = New List(Of BattleAnimation3D) + Me.SpawnedEntities = New List(Of Entity) Me.DrawBeforeEntities = DrawBeforeEntities If BattleFlipped <> Nothing Then Me.BattleFlipped = BattleFlipped @@ -40,6 +41,9 @@ RenderObjects.Add(a) End If Next + For Each entity As BattleAnimation3D In Me.SpawnedEntities + RenderObjects.Add(entity) + Next If RenderObjects.Count > 0 Then RenderObjects = (From r In RenderObjects Order By r.CameraDistance Descending).ToList() End If @@ -60,9 +64,6 @@ i -= 1 AnimationSequence.Remove(a) Else - If a.SpawnedEntity IsNot Nothing And a.Ready = True Then - SpawnedEntities.Add(a.SpawnedEntity) - End If a.Update() End If End If @@ -75,6 +76,7 @@ Animation.UpdateEntity() Next For Each Entity As Entity In SpawnedEntities + Entity.Update() Entity.UpdateEntity() Next End If @@ -89,21 +91,23 @@ End Sub Public Function SpawnEntity(ByVal Position As Vector3, ByVal Texture As Texture2D, ByVal Scale As Vector3, ByVal Opacity As Single, Optional ByVal startDelay As Single = 0.0F, Optional ByVal endDelay As Single = 0.0F) As Entity - If Not BattleFlipped = Nothing Then - If BattleFlipped = True Then - Position.X = CurrentEntity.Position.X - Position.X * 2.0F - Position.Z = CurrentEntity.Position.Z - Position.Z * 2.0F - Else - Position.X = CurrentEntity.Position.X + Position.X * 2.0F - Position.Z = CurrentEntity.Position.Z + Position.Z * 2.0F - End If - End If - - Dim SpawnedEntity As Entity = New Entity(Position.X, Position.Y, Position.Z, "BattleAnimation", {Texture}, {0, 0}, False, 0, Scale, BaseModel.BillModel, 0, "", New Vector3(1.0F)) + Dim SpawnedEntity = New BattleAnimation3D(Position, Texture, Scale, 0, 0, False) SpawnedEntity.Opacity = Opacity - Dim SpawnDelayEntity As BattleAnimation3D = New BattleAnimation3D(New Vector3(0.0F), TextureManager.DefaultTexture, New Vector3(1.0F), startDelay, endDelay, SpawnedEntity) + If Not BattleFlipped = Nothing Then + If BattleFlipped = True Then + SpawnedEntity.Position.X = CurrentEntity.Position.X - Position.X + SpawnedEntity.Position.Y = CurrentEntity.Position.Y + Position.Y + SpawnedEntity.Position.Z = CurrentEntity.Position.Z - Position.Z + Else + SpawnedEntity.Position.X = CurrentEntity.Position.X + Position.X + SpawnedEntity.Position.Y = CurrentEntity.Position.Y + Position.Y + SpawnedEntity.Position.Z = CurrentEntity.Position.Z + Position.Z + End If + End If + SpawnedEntities.Add(SpawnedEntity) + Dim SpawnDelayEntity As BattleAnimation3D = New BattleAnimation3D(New Vector3(0.0F), TextureManager.DefaultTexture, New Vector3(1.0F), startDelay, endDelay, True) AnimationSequence.Add(SpawnDelayEntity) Return SpawnedEntity End Function @@ -124,7 +128,7 @@ If RemoveEntityAfter = True Then If baEntityTextureChange.CanRemove = True Then - RemoveEntity(Entity) + RemoveEntity(TextureChangeEntity) End If End If End Sub diff --git a/P3D/Pokemon/Attacks/Attack.vb b/P3D/Pokemon/Attacks/Attack.vb index cf379b4c5..4c6f982c4 100644 --- a/P3D/Pokemon/Attacks/Attack.vb +++ b/P3D/Pokemon/Attacks/Attack.vb @@ -2169,6 +2169,7 @@ Dim CurrentEntity As NPC = BattleScreen.OwnPokemonNPC Dim CurrentModel As ModelEntity = BattleScreen.OwnPokemonModel If own = False Then + CurrentPokemon = BattleScreen.OppPokemon CurrentEntity = BattleScreen.OppPokemonNPC CurrentModel = BattleScreen.OppPokemonModel End If @@ -2186,6 +2187,7 @@ Dim CurrentEntity As NPC = BattleScreen.OppPokemonNPC Dim CurrentModel As ModelEntity = BattleScreen.OppPokemonModel If own = False Then + CurrentPokemon = BattleScreen.OwnPokemon CurrentEntity = BattleScreen.OwnPokemonNPC CurrentModel = BattleScreen.OwnPokemonModel End If diff --git a/P3D/Pokemon/Attacks/Fire/Ember.vb b/P3D/Pokemon/Attacks/Fire/Ember.vb index 1356505d9..bcc8306f3 100644 --- a/P3D/Pokemon/Attacks/Fire/Ember.vb +++ b/P3D/Pokemon/Attacks/Fire/Ember.vb @@ -96,21 +96,21 @@ Dim FireEntity2 As Entity = MoveAnimation.SpawnEntity(New Vector3(0.25, -0.25, 0.25), TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 0, 32, 32), ""), New Vector3(0.5F), 1, 1, 1) Dim FireEntity3 As Entity = MoveAnimation.SpawnEntity(New Vector3(0.25, -0.25, -0.25), TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 0, 32, 32), ""), New Vector3(0.5F), 1, 1, 1) - MoveAnimation.AnimationChangeTexture(FireEntity1, False, TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 32, 32, 32)), 2, 1) - MoveAnimation.AnimationChangeTexture(FireEntity2, False, TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 32, 32, 32)), 2, 1) - MoveAnimation.AnimationChangeTexture(FireEntity3, False, TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 32, 32, 32)), 2, 1) + MoveAnimation.AnimationChangeTexture(FireEntity1, False, TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 32, 32, 32), ""), 2, 1) + MoveAnimation.AnimationChangeTexture(FireEntity2, False, TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 32, 32, 32), ""), 2, 1) + MoveAnimation.AnimationChangeTexture(FireEntity3, False, TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 32, 32, 32), ""), 2, 1) - MoveAnimation.AnimationChangeTexture(FireEntity1, False, TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 64, 32, 32)), 3, 1) - MoveAnimation.AnimationChangeTexture(FireEntity2, False, TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 64, 32, 32)), 3, 1) - MoveAnimation.AnimationChangeTexture(FireEntity3, False, TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 64, 32, 32)), 3, 1) + MoveAnimation.AnimationChangeTexture(FireEntity1, False, TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 64, 32, 32), ""), 3, 1) + MoveAnimation.AnimationChangeTexture(FireEntity2, False, TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 64, 32, 32), ""), 3, 1) + MoveAnimation.AnimationChangeTexture(FireEntity3, False, TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 64, 32, 32), ""), 3, 1) - MoveAnimation.AnimationChangeTexture(FireEntity1, False, TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 96, 32, 32)), 4, 1) - MoveAnimation.AnimationChangeTexture(FireEntity2, False, TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 96, 32, 32)), 4, 1) - MoveAnimation.AnimationChangeTexture(FireEntity3, False, TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 96, 32, 32)), 4, 1) + MoveAnimation.AnimationChangeTexture(FireEntity1, False, TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 96, 32, 32), ""), 4, 1) + MoveAnimation.AnimationChangeTexture(FireEntity2, False, TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 96, 32, 32), ""), 4, 1) + MoveAnimation.AnimationChangeTexture(FireEntity3, False, TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 96, 32, 32), ""), 4, 1) - MoveAnimation.AnimationChangeTexture(FireEntity1, True, TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 128, 32, 32)), 5, 1) - MoveAnimation.AnimationChangeTexture(FireEntity2, True, TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 128, 32, 32)), 5, 1) - MoveAnimation.AnimationChangeTexture(FireEntity3, True, TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 128, 32, 32)), 5, 1) + MoveAnimation.AnimationChangeTexture(FireEntity1, True, TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 128, 32, 32), ""), 5, 1) + MoveAnimation.AnimationChangeTexture(FireEntity2, True, TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 128, 32, 32), ""), 5, 1) + MoveAnimation.AnimationChangeTexture(FireEntity3, True, TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 128, 32, 32), ""), 5, 1) BattleScreen.BattleQuery.Add(MoveAnimation) End Sub diff --git a/P3D/Pokemon/Attacks/Grass/Absorb.vb b/P3D/Pokemon/Attacks/Grass/Absorb.vb index 9590c3d18..f895c3cf2 100644 --- a/P3D/Pokemon/Attacks/Grass/Absorb.vb +++ b/P3D/Pokemon/Attacks/Grass/Absorb.vb @@ -101,7 +101,7 @@ Dim yPos As Single = CSng(Random.NextDouble() * 0.5) Dim zPos As Single = CSng(Random.Next(-5, 5) * 0.15) Dim AbsorbEntity = MoveAnimation.SpawnEntity(New Vector3(0.0, 0.0, 0.0), TextureManager.GetTexture("Textures\Battle\Grass\Absorb"), New Vector3(0.35F), 1) - MoveAnimation.AnimationMove(AbsorbEntity, True, 1.5, yPos, zPos, 0.03, False, True, CSng(currentAmount), 0.0, 0.1, 0.5) + MoveAnimation.AnimationMove(AbsorbEntity, True, -1.5, yPos, zPos, 0.03, False, True, CSng(currentAmount), 0.0, 0.1, 0.5) Threading.Interlocked.Increment(currentAmount) End While diff --git a/P3D/Pokemon/Attacks/Normal/Tackle.vb b/P3D/Pokemon/Attacks/Normal/Tackle.vb index 668b4b545..e0d981ea9 100644 --- a/P3D/Pokemon/Attacks/Normal/Tackle.vb +++ b/P3D/Pokemon/Attacks/Normal/Tackle.vb @@ -54,16 +54,16 @@ Public Overrides Sub InternalUserPokemonMoveAnimation(ByVal BattleScreen As BattleScreen, ByVal own As Boolean, ByVal CurrentPokemon As Pokemon, ByVal CurrentEntity As NPC, ByVal CurrentModel As ModelEntity) Dim MoveAnimation As AnimationQueryObject = New AnimationQueryObject(CurrentEntity, own, CurrentModel) - MoveAnimation.AnimationMove(Nothing, False, 0.5, 0, 0, 0.3, False, False, 0, 0,,, 2) - MoveAnimation.AnimationMove(Nothing, False, 0, 0, 0, 0.3, False, False, 1, 0,,, 2) + MoveAnimation.AnimationMove(Nothing, False, -0.5F, 0, 0, 0.3F, False, False, 0, 0,,, 2) + MoveAnimation.AnimationMove(Nothing, False, 0, 0, 0, 0.3F, False, False, 1, 0,,, 2) BattleScreen.BattleQuery.Add(MoveAnimation) End Sub Public Overrides Sub InternalOpponentPokemonMoveAnimation(ByVal BattleScreen As BattleScreen, ByVal own As Boolean, ByVal CurrentPokemon As Pokemon, ByVal CurrentEntity As NPC, ByVal CurrentModel As ModelEntity) Dim MoveAnimation As AnimationQueryObject = New AnimationQueryObject(CurrentEntity, own) - MoveAnimation.AnimationPlaySound("Battle\Attacks\Normal\Tackle", 0, 2) - Dim SpawnEntity = MoveAnimation.SpawnEntity(New Vector3(0, -0.25, 0), TextureManager.GetTexture("Textures\Battle\Normal\Tackle"), New Vector3(1.0F), 1.0F) - MoveAnimation.AnimationFade(SpawnEntity, True, 0.02, False, 1.0F, 0, 2) + MoveAnimation.AnimationPlaySound("Battle\Attacks\Normal\Tackle", 0, 0) + Dim SpawnEntity = MoveAnimation.SpawnEntity(New Vector3(0, 0, 0), TextureManager.GetTexture("Textures\Battle\Normal\Tackle"), New Vector3(0.5F), 1.0F, 0, 2) + MoveAnimation.AnimationFade(SpawnEntity, True, 1.0F, False, 0.0F, 2, 0) BattleScreen.BattleQuery.Add(MoveAnimation) End Sub End Class diff --git a/P3D/Pokemon/Attacks/Poison/PoisonSting.vb b/P3D/Pokemon/Attacks/Poison/PoisonSting.vb index fa0fb7abe..f270a269e 100644 --- a/P3D/Pokemon/Attacks/Poison/PoisonSting.vb +++ b/P3D/Pokemon/Attacks/Poison/PoisonSting.vb @@ -67,7 +67,7 @@ Public Overrides Sub InternalUserPokemonMoveAnimation(ByVal BattleScreen As BattleScreen, ByVal own As Boolean, ByVal CurrentPokemon As Pokemon, ByVal CurrentEntity As NPC, ByVal CurrentModel As ModelEntity) Dim MoveAnimation As AnimationQueryObject = New AnimationQueryObject(CurrentEntity, own) - Dim StingerEntity As Entity = MoveAnimation.SpawnEntity(CurrentEntity.Position, TextureManager.GetTexture("Textures\Battle\Poison\Stinger"), New Vector3(0.5F), 1.0F) + Dim StingerEntity As Entity = MoveAnimation.SpawnEntity(New Vector3(0.0, 0.0, 0.0), TextureManager.GetTexture("Textures\Battle\Poison\Stinger"), New Vector3(0.5F), 1.0F) MoveAnimation.AnimationPlaySound("Battle\Attacks\Poison\PoisonSting_Start", 0, 0) MoveAnimation.AnimationMove(StingerEntity, True, 2.0, 0.0, 0.0, 0.05, False, False, 0.0, 0.0,,, 0) From 72599bfd168ba29ef06c6246b1c1445d99612b72 Mon Sep 17 00:00:00 2001 From: JappaWakkaP3D <31563291+JappaWakka@users.noreply.github.com> Date: Fri, 29 Oct 2021 15:58:28 +0200 Subject: [PATCH 15/57] Fixed spawned animation entities not being positioned/moved correctly + Added Heal animation + Made other animations be affected by battleanimations option --- P3D/Battle/BattleSystemV2/Battle.vb | 504 ++++++++++-------- .../QueryObjects/AnimationQueryObject.vb | 45 +- P3D/Content/Sounds/Battle/Effects/Heal.wav | Bin 0 -> 83280 bytes P3D/Pokemon/Attacks/Attack.vb | 16 +- P3D/Pokemon/Attacks/Fire/Ember.vb | 18 +- P3D/Pokemon/Attacks/Grass/Absorb.vb | 4 +- P3D/Pokemon/Attacks/Normal/Growl.vb | 4 +- P3D/Pokemon/Attacks/Normal/Pound.vb | 6 +- P3D/Pokemon/Attacks/Normal/Tackle.vb | 8 +- P3D/Pokemon/Attacks/Poison/PoisonSting.vb | 14 +- 10 files changed, 339 insertions(+), 280 deletions(-) create mode 100644 P3D/Content/Sounds/Battle/Effects/Heal.wav diff --git a/P3D/Battle/BattleSystemV2/Battle.vb b/P3D/Battle/BattleSystemV2/Battle.vb index 63e067b6f..bc3d6609f 100644 --- a/P3D/Battle/BattleSystemV2/Battle.vb +++ b/P3D/Battle/BattleSystemV2/Battle.vb @@ -1496,7 +1496,7 @@ End If 'Own Pokémon move animation! This displays any effects that should display on the user of the move. - moveUsed.UserPokemonMoveAnimation(BattleScreen, Not own) + moveUsed.UserPokemonMoveAnimation(BattleScreen, own) If moveUsed.Target <> Attack.Targets.Self And moveUsed.FocusOppPokemon = True Then If own = True Then @@ -3412,26 +3412,28 @@ End If '***STAT INCREASE ANIMATION*** - Dim StatAnimation As AnimationQueryObject = New AnimationQueryObject(pNPC, Not own) - Dim maxAmount As Integer = 20 * val - Dim currentAmount As Integer = 0 - While currentAmount <= maxAmount - Dim Texture As Texture2D = TextureManager.GetTexture("Textures\Battle\StatChange\statUp") - Dim xPos = CSng((Random.NextDouble() - 0.5) * 1.2) - Dim zPos = CSng((Random.NextDouble() - 0.5) * 1.2) + If Core.Player.ShowBattleAnimations <> 0 Then + Dim StatAnimation As AnimationQueryObject = New AnimationQueryObject(pNPC, Not own) + Dim maxAmount As Integer = 20 * val + Dim currentAmount As Integer = 0 + While currentAmount <= maxAmount + Dim Texture As Texture2D = TextureManager.GetTexture("Textures\Battle\StatChange\statUp") + Dim xPos = CSng((Random.NextDouble() - 0.5) * 1.2) + Dim zPos = CSng((Random.NextDouble() - 0.5) * 1.2) - Dim Position As New Vector3(xPos, -0.4, zPos) - Dim Destination As New Vector3(xPos, 0.8, zPos) - Dim Scale As New Vector3(0.2F) + Dim Position As New Vector3(xPos, -0.4, zPos) + Dim Destination As New Vector3(xPos, 0.8, zPos) + Dim Scale As New Vector3(0.2F) - Dim StatEntity As Entity = StatAnimation.SpawnEntity(Position, Texture, Scale, 1.0F) - Dim startDelay As Double = 5.0 * Random.NextDouble() + Dim StatEntity As Entity = StatAnimation.SpawnEntity(Position, Texture, Scale, 1.0F) + Dim startDelay As Double = 5.0 * Random.NextDouble() - StatAnimation.AnimationMove(Nothing, True, Destination.X, Destination.Y, Destination.Z, 0.05F, False, True, CSng(startDelay), 0.0F) - Threading.Interlocked.Increment(currentAmount) - End While + StatAnimation.AnimationMove(Nothing, True, Destination.X, Destination.Y, Destination.Z, 0.05F, False, True, CSng(startDelay), 0.0F) + Threading.Interlocked.Increment(currentAmount) + End While + BattleScreen.BattleQuery.Add(StatAnimation) + End If BattleScreen.BattleQuery.Add(New PlaySoundQueryObject("Battle\Effects\Stat_Raise", False)) - BattleScreen.BattleQuery.Add(StatAnimation) Dim printMessage As String = p.GetDisplayName() & "'s " & statString Select Case val @@ -3693,27 +3695,28 @@ End If End If '***STAT DECREASE ANIMATION*** - Dim StatAnimation As AnimationQueryObject = New AnimationQueryObject(pNPC, Not own) - Dim maxAmount As Integer = 20 * val - Dim currentAmount As Integer = 0 - While currentAmount <= maxAmount - Dim Texture As Texture2D = TextureManager.GetTexture("Textures\Battle\StatChange\statDown") - Dim xPos = CSng((Random.NextDouble() - 0.5) * 1.2) - Dim zPos = CSng((Random.NextDouble() - 0.5) * 1.2) + If Core.Player.ShowBattleAnimations <> 0 Then + Dim StatAnimation As AnimationQueryObject = New AnimationQueryObject(pNPC, Not own) + Dim maxAmount As Integer = 20 * val + Dim currentAmount As Integer = 0 + While currentAmount <= maxAmount + Dim Texture As Texture2D = TextureManager.GetTexture("Textures\Battle\StatChange\statDown") + Dim xPos = CSng((Random.NextDouble() - 0.5) * 1.2) + Dim zPos = CSng((Random.NextDouble() - 0.5) * 1.2) - Dim Position As New Vector3(xPos, 0.8, zPos) - Dim Destination As New Vector3(xPos, -0.4, zPos) - Dim Scale As New Vector3(0.2F) + Dim Position As New Vector3(xPos, 0.8, zPos) + Dim Destination As New Vector3(xPos, -0.4, zPos) + Dim Scale As New Vector3(0.2F) - Dim StatEntity As Entity = StatAnimation.SpawnEntity(Position, Texture, Scale, 1.0F) - Dim startDelay As Double = 5.0 * Random.NextDouble() - - StatAnimation.AnimationMove(Nothing, True, Destination.X, Destination.Y, Destination.Z, 0.05F, False, True, CSng(startDelay), 0.0F) - Threading.Interlocked.Increment(currentAmount) - End While - StatAnimation.AnimationPlaySound("Battle\Effects\Stat_Lower", 0.0F, 10.0F) - BattleScreen.BattleQuery.Add(StatAnimation) + Dim StatEntity As Entity = StatAnimation.SpawnEntity(Position, Texture, Scale, 1.0F) + Dim startDelay As Double = 5.0 * Random.NextDouble() + StatAnimation.AnimationMove(Nothing, True, Destination.X, Destination.Y, Destination.Z, 0.05F, False, True, CSng(startDelay), 0.0F) + Threading.Interlocked.Increment(currentAmount) + End While + BattleScreen.BattleQuery.Add(StatAnimation) + End If + BattleScreen.BattleQuery.Add(New PlaySoundQueryObject("Battle\Effects\Stat_Lower", False)) Dim printMessage As String = p.GetDisplayName() & "'s " & statString Select Case val Case 2 @@ -3941,8 +3944,10 @@ Public Sub GainHP(ByVal HPAmount As Integer, ByVal own As Boolean, ByVal from As Boolean, ByVal BattleScreen As BattleScreen, ByVal message As String, ByVal cause As String) Dim p As Pokemon = BattleScreen.OwnPokemon + Dim pNPC As NPC = BattleScreen.OwnPokemonNPC If own = False Then p = BattleScreen.OppPokemon + pNPC = BattleScreen.OppPokemonNPC End If If p.HP < p.MaxHP And p.HP > 0 And p.Status <> Pokemon.StatusProblems.Fainted Then @@ -3962,6 +3967,30 @@ BattleScreen.BattleQuery.Add(New MathHPQueryObject(p.HP, p.MaxHP, -HPAmount, New Vector2(300, 256))) End If + '***HP INCREASE ANIMATION*** + If Core.Player.ShowBattleAnimations <> 0 Then + Dim StatAnimation As AnimationQueryObject = New AnimationQueryObject(pNPC, Not own) + Dim maxAmount As Integer = 20 + Dim currentAmount As Integer = 0 + While currentAmount <= maxAmount + Dim Texture As Texture2D = TextureManager.GetTexture("Textures\Battle\StatChange\Heal") + Dim xPos = CSng((Random.NextDouble() - 0.5) * 1.2) + Dim zPos = CSng((Random.NextDouble() - 0.5) * 1.2) + + Dim Position As New Vector3(xPos, -0.4, zPos) + Dim Destination As New Vector3(xPos, 0.8, zPos) + Dim Scale As New Vector3(0.2F) + + Dim StatEntity As Entity = StatAnimation.SpawnEntity(Position, Texture, Scale, 1.0F) + Dim startDelay As Double = 5.0 * Random.NextDouble() + + StatAnimation.AnimationMove(Nothing, True, Destination.X, Destination.Y, Destination.Z, 0.05F, False, True, CSng(startDelay), 0.0F) + Threading.Interlocked.Increment(currentAmount) + End While + BattleScreen.BattleQuery.Add(StatAnimation) + End If + BattleScreen.BattleQuery.Add(New PlaySoundQueryObject("Battle\Effects\Heal", False)) + If message <> "" Then BattleScreen.BattleQuery.Add(New TextQueryObject(message)) End If @@ -3996,14 +4025,14 @@ End If BattleScreen.BattleQuery.Add(New PlaySoundQueryObject(sound, False, 0.0F)) End If - - Dim HitAnimation As AnimationQueryObject = New AnimationQueryObject(pNPC, own) - HitAnimation.AnimationFade(Nothing, False, 1, False, 0, 0, 0) - HitAnimation.AnimationFade(Nothing, False, 1, True, 1, 1, 0) - HitAnimation.AnimationFade(Nothing, False, 1, False, 0, 2, 0) - HitAnimation.AnimationFade(Nothing, False, 1, True, 1, 3, 0) - BattleScreen.BattleQuery.Add(HitAnimation) - + If Core.Player.ShowBattleAnimations <> 0 Then + Dim HitAnimation As AnimationQueryObject = New AnimationQueryObject(pNPC, own) + HitAnimation.AnimationFade(Nothing, False, 1, False, 0, 0, 0) + HitAnimation.AnimationFade(Nothing, False, 1, True, 1, 1, 0) + HitAnimation.AnimationFade(Nothing, False, 1, False, 0, 2, 0) + HitAnimation.AnimationFade(Nothing, False, 1, True, 1, 3, 0) + BattleScreen.BattleQuery.Add(HitAnimation) + End If If own = True Then BattleScreen.BattleQuery.Add(New MathHPQueryObject(p.HP, p.MaxHP, HPAmount, New Vector2(200, 256))) Else @@ -5356,24 +5385,26 @@ If .OwnPokemon.Ability.Name.ToLower() <> "magic guard" Then If .OwnPokemon.Status = Pokemon.StatusProblems.Poison Then 'Own Poison 'Poison animation - Dim PoisonAnimation As AnimationQueryObject = New AnimationQueryObject(BattleScreen.OwnPokemonNPC, True) + If Core.Player.ShowBattleAnimations <> 0 Then + Dim PoisonAnimation As AnimationQueryObject = New AnimationQueryObject(BattleScreen.OwnPokemonNPC, True) - PoisonAnimation.AnimationPlaySound("Battle\Effects\Poisoned", 0, 0) - Dim BubbleEntity1 As Entity = PoisonAnimation.SpawnEntity(New Vector3(-0.25, -0.25, -0.25), TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 0, 32, 32)), New Vector3(0.5F), 1, 0, 1) + PoisonAnimation.AnimationPlaySound("Battle\Effects\Poisoned", 0, 0) + Dim BubbleEntity1 As Entity = PoisonAnimation.SpawnEntity(New Vector3(-0.25, -0.25, -0.25), TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 0, 32, 32)), New Vector3(0.5F), 1, 0, 1) - PoisonAnimation.AnimationChangeTexture(BubbleEntity1, False, TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 32, 32, 32)), 1, 1) - Dim BubbleEntity2 As Entity = PoisonAnimation.SpawnEntity(New Vector3(0.25, -0.25, 0.25), TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 0, 32, 32)), New Vector3(0.5F), 1, 1, 1) + PoisonAnimation.AnimationChangeTexture(BubbleEntity1, False, TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 32, 32, 32)), 1, 1) + Dim BubbleEntity2 As Entity = PoisonAnimation.SpawnEntity(New Vector3(0.25, -0.25, 0.25), TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 0, 32, 32)), New Vector3(0.5F), 1, 1, 1) - PoisonAnimation.AnimationChangeTexture(BubbleEntity1, True, TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 64, 32, 32)), 2, 1) - PoisonAnimation.AnimationChangeTexture(BubbleEntity2, False, TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 32, 32, 32)), 2, 1) - Dim BubbleEntity3 As Entity = PoisonAnimation.SpawnEntity(New Vector3(0.25, -0.25, -0.25), TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 0, 32, 32)), New Vector3(0.5F), 1, 2, 1) + PoisonAnimation.AnimationChangeTexture(BubbleEntity1, True, TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 64, 32, 32)), 2, 1) + PoisonAnimation.AnimationChangeTexture(BubbleEntity2, False, TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 32, 32, 32)), 2, 1) + Dim BubbleEntity3 As Entity = PoisonAnimation.SpawnEntity(New Vector3(0.25, -0.25, -0.25), TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 0, 32, 32)), New Vector3(0.5F), 1, 2, 1) - PoisonAnimation.AnimationChangeTexture(BubbleEntity2, True, TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 64, 32, 32)), 3, 1) - PoisonAnimation.AnimationChangeTexture(BubbleEntity3, False, TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 32, 32, 32)), 3, 1) + PoisonAnimation.AnimationChangeTexture(BubbleEntity2, True, TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 64, 32, 32)), 3, 1) + PoisonAnimation.AnimationChangeTexture(BubbleEntity3, False, TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 32, 32, 32)), 3, 1) - PoisonAnimation.AnimationChangeTexture(BubbleEntity3, True, TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 64, 32, 32)), 4, 1) + PoisonAnimation.AnimationChangeTexture(BubbleEntity3, True, TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 64, 32, 32)), 4, 1) - BattleScreen.BattleQuery.Add(PoisonAnimation) + BattleScreen.BattleQuery.Add(PoisonAnimation) + End If 'Actual damage ReduceHP(CInt(.OwnPokemon.MaxHP / 8), True, True, BattleScreen, "The poison hurt " & .OwnPokemon.GetDisplayName() & ".", "poison") End If @@ -5382,24 +5413,26 @@ .FieldEffects.OwnPoisonCounter += 1 Dim multiplier As Double = (.FieldEffects.OwnPoisonCounter / 16) 'Poison animation - Dim PoisonAnimation As AnimationQueryObject = New AnimationQueryObject(BattleScreen.OwnPokemonNPC, True) + If Core.Player.ShowBattleAnimations <> 0 Then + Dim PoisonAnimation As AnimationQueryObject = New AnimationQueryObject(BattleScreen.OwnPokemonNPC, True) - PoisonAnimation.AnimationPlaySound("Battle\Effects\Poisoned", 0, 0) - Dim BubbleEntity1 As Entity = PoisonAnimation.SpawnEntity(New Vector3(-0.25, -0.25, -0.25), TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 0, 32, 32)), New Vector3(0.5F), 1, 0, 1) + PoisonAnimation.AnimationPlaySound("Battle\Effects\Poisoned", 0, 0) + Dim BubbleEntity1 As Entity = PoisonAnimation.SpawnEntity(New Vector3(-0.25, -0.25, -0.25), TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 0, 32, 32)), New Vector3(0.5F), 1, 0, 1) - PoisonAnimation.AnimationChangeTexture(BubbleEntity1, False, TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 32, 32, 32)), 1, 1) - Dim BubbleEntity2 As Entity = PoisonAnimation.SpawnEntity(New Vector3(0.25, -0.25, 0.25), TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 0, 32, 32)), New Vector3(0.5F), 1, 1, 1) + PoisonAnimation.AnimationChangeTexture(BubbleEntity1, False, TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 32, 32, 32)), 1, 1) + Dim BubbleEntity2 As Entity = PoisonAnimation.SpawnEntity(New Vector3(0.25, -0.25, 0.25), TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 0, 32, 32)), New Vector3(0.5F), 1, 1, 1) - PoisonAnimation.AnimationChangeTexture(BubbleEntity1, True, TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 64, 32, 32)), 2, 1) - PoisonAnimation.AnimationChangeTexture(BubbleEntity2, False, TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 32, 32, 32)), 2, 1) - Dim BubbleEntity3 As Entity = PoisonAnimation.SpawnEntity(New Vector3(0.25, -0.25, -0.25), TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 0, 32, 32)), New Vector3(0.5F), 1, 2, 1) + PoisonAnimation.AnimationChangeTexture(BubbleEntity1, True, TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 64, 32, 32)), 2, 1) + PoisonAnimation.AnimationChangeTexture(BubbleEntity2, False, TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 32, 32, 32)), 2, 1) + Dim BubbleEntity3 As Entity = PoisonAnimation.SpawnEntity(New Vector3(0.25, -0.25, -0.25), TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 0, 32, 32)), New Vector3(0.5F), 1, 2, 1) - PoisonAnimation.AnimationChangeTexture(BubbleEntity2, True, TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 64, 32, 32)), 3, 1) - PoisonAnimation.AnimationChangeTexture(BubbleEntity3, False, TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 32, 32, 32)), 3, 1) + PoisonAnimation.AnimationChangeTexture(BubbleEntity2, True, TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 64, 32, 32)), 3, 1) + PoisonAnimation.AnimationChangeTexture(BubbleEntity3, False, TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 32, 32, 32)), 3, 1) - PoisonAnimation.AnimationChangeTexture(BubbleEntity3, True, TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 64, 32, 32)), 4, 1) + PoisonAnimation.AnimationChangeTexture(BubbleEntity3, True, TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 64, 32, 32)), 4, 1) - BattleScreen.BattleQuery.Add(PoisonAnimation) + BattleScreen.BattleQuery.Add(PoisonAnimation) + End If 'Actual damage ReduceHP(CInt(.OwnPokemon.MaxHP * multiplier), True, True, BattleScreen, "The toxic hurt " & .OwnPokemon.GetDisplayName() & ".", "badpoison") End If @@ -5416,16 +5449,17 @@ End If 'Burn animation - Dim BurnAnimation As AnimationQueryObject = New AnimationQueryObject(BattleScreen.OwnPokemonNPC, False) - BurnAnimation.AnimationPlaySound("Battle\Effects\Burned", 0, 0) - - Dim FlameEntity As Entity = BurnAnimation.SpawnEntity(New Vector3(0.25F, 0.25F, 0.25), TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 0, 32, 32), ""), New Vector3(0.5, 0.5, 0.5), 1.0F) - BurnAnimation.AnimationChangeTexture(FlameEntity, False, TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 32, 32, 32)), 2, 1) - BurnAnimation.AnimationChangeTexture(FlameEntity, False, TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 64, 32, 32)), 3, 1) - BurnAnimation.AnimationChangeTexture(FlameEntity, False, TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 96, 32, 32)), 4, 1) - BurnAnimation.AnimationChangeTexture(FlameEntity, True, TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 128, 32, 32)), 5, 2) - BattleScreen.BattleQuery.Add(BurnAnimation) + If Core.Player.ShowBattleAnimations <> 0 Then + Dim BurnAnimation As AnimationQueryObject = New AnimationQueryObject(BattleScreen.OwnPokemonNPC, False) + BurnAnimation.AnimationPlaySound("Battle\Effects\Burned", 0, 0) + Dim FlameEntity As Entity = BurnAnimation.SpawnEntity(New Vector3(0.25F, 0.25F, 0.25), TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 0, 32, 32), ""), New Vector3(0.5, 0.5, 0.5), 1.0F) + BurnAnimation.AnimationChangeTexture(FlameEntity, False, TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 32, 32, 32)), 2, 1) + BurnAnimation.AnimationChangeTexture(FlameEntity, False, TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 64, 32, 32)), 3, 1) + BurnAnimation.AnimationChangeTexture(FlameEntity, False, TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 96, 32, 32)), 4, 1) + BurnAnimation.AnimationChangeTexture(FlameEntity, True, TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 128, 32, 32)), 5, 2) + BattleScreen.BattleQuery.Add(BurnAnimation) + End If 'Actual damage ReduceHP(reduceAmount, True, True, BattleScreen, .OwnPokemon.GetDisplayName() & " is hurt by the burn.", "burn") End If @@ -6154,25 +6188,26 @@ If .OppPokemon.Ability.Name.ToLower() <> "magic guard" Then If .OppPokemon.Status = Pokemon.StatusProblems.Poison Then 'Opp Poison 'Poison animation - Dim PoisonAnimation As AnimationQueryObject = New AnimationQueryObject(BattleScreen.OppPokemonNPC, False) + If Core.Player.ShowBattleAnimations <> 0 Then + Dim PoisonAnimation As AnimationQueryObject = New AnimationQueryObject(BattleScreen.OppPokemonNPC, False) - PoisonAnimation.AnimationPlaySound("Battle\Effects\Poisoned", 0, 0) - Dim BubbleEntity1 As Entity = PoisonAnimation.SpawnEntity(New Vector3(-0.25, -0.25, -0.25), TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 0, 32, 32)), New Vector3(0.5F), 1, 0, 1) + PoisonAnimation.AnimationPlaySound("Battle\Effects\Poisoned", 0, 0) + Dim BubbleEntity1 As Entity = PoisonAnimation.SpawnEntity(New Vector3(-0.25, -0.25, -0.25), TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 0, 32, 32)), New Vector3(0.5F), 1, 0, 1) - PoisonAnimation.AnimationChangeTexture(BubbleEntity1, False, TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 32, 32, 32)), 1, 1) - Dim BubbleEntity2 As Entity = PoisonAnimation.SpawnEntity(New Vector3(0.25, -0.25, 0.25), TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 0, 32, 32)), New Vector3(0.5F), 1, 1, 1) + PoisonAnimation.AnimationChangeTexture(BubbleEntity1, False, TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 32, 32, 32)), 1, 1) + Dim BubbleEntity2 As Entity = PoisonAnimation.SpawnEntity(New Vector3(0.25, -0.25, 0.25), TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 0, 32, 32)), New Vector3(0.5F), 1, 1, 1) - PoisonAnimation.AnimationChangeTexture(BubbleEntity1, True, TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 64, 32, 32)), 2, 1) - PoisonAnimation.AnimationChangeTexture(BubbleEntity2, False, TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 32, 32, 32)), 2, 1) - Dim BubbleEntity3 As Entity = PoisonAnimation.SpawnEntity(New Vector3(0.25, -0.25, -0.25), TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 0, 32, 32)), New Vector3(0.5F), 1, 2, 1) + PoisonAnimation.AnimationChangeTexture(BubbleEntity1, True, TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 64, 32, 32)), 2, 1) + PoisonAnimation.AnimationChangeTexture(BubbleEntity2, False, TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 32, 32, 32)), 2, 1) + Dim BubbleEntity3 As Entity = PoisonAnimation.SpawnEntity(New Vector3(0.25, -0.25, -0.25), TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 0, 32, 32)), New Vector3(0.5F), 1, 2, 1) - PoisonAnimation.AnimationChangeTexture(BubbleEntity2, True, TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 64, 32, 32)), 3, 1) - PoisonAnimation.AnimationChangeTexture(BubbleEntity3, False, TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 32, 32, 32)), 3, 1) + PoisonAnimation.AnimationChangeTexture(BubbleEntity2, True, TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 64, 32, 32)), 3, 1) + PoisonAnimation.AnimationChangeTexture(BubbleEntity3, False, TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 32, 32, 32)), 3, 1) - PoisonAnimation.AnimationChangeTexture(BubbleEntity3, True, TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 64, 32, 32)), 4, 1) - - BattleScreen.BattleQuery.Add(PoisonAnimation) + PoisonAnimation.AnimationChangeTexture(BubbleEntity3, True, TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 64, 32, 32)), 4, 1) + BattleScreen.BattleQuery.Add(PoisonAnimation) + End If 'Actual damage ReduceHP(CInt(.OppPokemon.MaxHP / 8), False, False, BattleScreen, "The poison hurt " & .OppPokemon.GetDisplayName() & ".", "poison") End If @@ -6180,27 +6215,29 @@ If .OppPokemon.Status = Pokemon.StatusProblems.BadPoison Then 'Opp Toxic .FieldEffects.OppPoisonCounter += 1 Dim multiplier As Double = (.FieldEffects.OppPoisonCounter / 16) - 'Poison animation - Dim PoisonAnimation As AnimationQueryObject = New AnimationQueryObject(BattleScreen.OppPokemonNPC, False) + If Core.Player.ShowBattleAnimations <> 0 Then + 'Poison animation + Dim PoisonAnimation As AnimationQueryObject = New AnimationQueryObject(BattleScreen.OppPokemonNPC, False) - PoisonAnimation.AnimationPlaySound("Battle\Effects\Poisoned", 0, 0) - Dim BubbleEntity1 As Entity = PoisonAnimation.SpawnEntity(New Vector3(-0.25, -0.25, -0.25), TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 0, 32, 32)), New Vector3(0.5F), 1, 0, 1) + PoisonAnimation.AnimationPlaySound("Battle\Effects\Poisoned", 0, 0) + Dim BubbleEntity1 As Entity = PoisonAnimation.SpawnEntity(New Vector3(-0.25, -0.25, -0.25), TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 0, 32, 32)), New Vector3(0.5F), 1, 0, 1) - PoisonAnimation.AnimationChangeTexture(BubbleEntity1, False, TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 32, 32, 32)), 1, 1) - Dim BubbleEntity2 As Entity = PoisonAnimation.SpawnEntity(New Vector3(0.25, -0.25, 0.25), TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 0, 32, 32)), New Vector3(0.5F), 1, 1, 1) + PoisonAnimation.AnimationChangeTexture(BubbleEntity1, False, TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 32, 32, 32)), 1, 1) + Dim BubbleEntity2 As Entity = PoisonAnimation.SpawnEntity(New Vector3(0.25, -0.25, 0.25), TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 0, 32, 32)), New Vector3(0.5F), 1, 1, 1) - PoisonAnimation.AnimationChangeTexture(BubbleEntity1, True, TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 64, 32, 32)), 2, 1) - PoisonAnimation.AnimationChangeTexture(BubbleEntity2, False, TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 32, 32, 32)), 2, 1) - Dim BubbleEntity3 As Entity = PoisonAnimation.SpawnEntity(New Vector3(0.25, -0.25, -0.25), TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 0, 32, 32)), New Vector3(0.5F), 1, 2, 1) + PoisonAnimation.AnimationChangeTexture(BubbleEntity1, True, TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 64, 32, 32)), 2, 1) + PoisonAnimation.AnimationChangeTexture(BubbleEntity2, False, TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 32, 32, 32)), 2, 1) + Dim BubbleEntity3 As Entity = PoisonAnimation.SpawnEntity(New Vector3(0.25, -0.25, -0.25), TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 0, 32, 32)), New Vector3(0.5F), 1, 2, 1) - PoisonAnimation.AnimationChangeTexture(BubbleEntity2, True, TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 64, 32, 32)), 3, 1) - PoisonAnimation.AnimationChangeTexture(BubbleEntity3, False, TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 32, 32, 32)), 3, 1) + PoisonAnimation.AnimationChangeTexture(BubbleEntity2, True, TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 64, 32, 32)), 3, 1) + PoisonAnimation.AnimationChangeTexture(BubbleEntity3, False, TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 32, 32, 32)), 3, 1) - PoisonAnimation.AnimationChangeTexture(BubbleEntity3, True, TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 64, 32, 32)), 4, 1) + PoisonAnimation.AnimationChangeTexture(BubbleEntity3, True, TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 64, 32, 32)), 4, 1) - BattleScreen.BattleQuery.Add(PoisonAnimation) - 'Actual damage - ReduceHP(CInt(.OppPokemon.MaxHP * multiplier), False, False, BattleScreen, "The toxic hurt " & .OppPokemon.GetDisplayName() & ".", "badpoison") + BattleScreen.BattleQuery.Add(PoisonAnimation) + 'Actual damage + ReduceHP(CInt(.OppPokemon.MaxHP * multiplier), False, False, BattleScreen, "The toxic hurt " & .OppPokemon.GetDisplayName() & ".", "badpoison") + End If End If End If End If @@ -6214,16 +6251,17 @@ reduceAmount = CInt(.OppPokemon.MaxHP / 16) End If 'Burn animation - Dim BurnAnimation As AnimationQueryObject = New AnimationQueryObject(BattleScreen.OppPokemonNPC, True) - BurnAnimation.AnimationPlaySound("Battle\Effects\Burned", 0, 0) - - Dim FlameEntity As Entity = BurnAnimation.SpawnEntity(New Vector3(0.25, 0.25, 0.25), TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 0, 32, 32)), New Vector3(0.5, 0.5, 0.5), 1.0F) - BurnAnimation.AnimationChangeTexture(FlameEntity, False, TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 32, 32, 32)), 2, 1) - BurnAnimation.AnimationChangeTexture(FlameEntity, False, TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 64, 32, 32)), 3, 1) - BurnAnimation.AnimationChangeTexture(FlameEntity, False, TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 96, 32, 32)), 4, 1) - BurnAnimation.AnimationChangeTexture(FlameEntity, True, TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 128, 32, 32)), 5, 2) - BattleScreen.BattleQuery.Add(BurnAnimation) + If Core.Player.ShowBattleAnimations <> 0 Then + Dim BurnAnimation As AnimationQueryObject = New AnimationQueryObject(BattleScreen.OppPokemonNPC, True) + BurnAnimation.AnimationPlaySound("Battle\Effects\Burned", 0, 0) + Dim FlameEntity As Entity = BurnAnimation.SpawnEntity(New Vector3(0.25, 0.25, 0.25), TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 0, 32, 32)), New Vector3(0.5, 0.5, 0.5), 1.0F) + BurnAnimation.AnimationChangeTexture(FlameEntity, False, TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 32, 32, 32)), 2, 1) + BurnAnimation.AnimationChangeTexture(FlameEntity, False, TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 64, 32, 32)), 3, 1) + BurnAnimation.AnimationChangeTexture(FlameEntity, False, TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 96, 32, 32)), 4, 1) + BurnAnimation.AnimationChangeTexture(FlameEntity, True, TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 128, 32, 32)), 5, 2) + BattleScreen.BattleQuery.Add(BurnAnimation) + End If 'Actual damage ReduceHP(reduceAmount, False, False, BattleScreen, .OppPokemon.GetDisplayName() & " is hurt by the burn.", "burn") End If @@ -6790,35 +6828,37 @@ BattleScreen.AddToQuery(InsertIndex, New TextQueryObject(insertMessage)) Dim BallReturn As AnimationQueryObject = New AnimationQueryObject(BattleScreen.OwnPokemonNPC, False, BattleScreen.OwnPokemonModel) + If Core.Player.ShowBattleAnimations <> 0 Then + ' Ball Closes + BallReturn.AnimationPlaySound("Battle\Pokeball\Open", 0, 0) + Dim SmokeReturned As Integer = 0 + Do + Dim SmokePosition = New Vector3(CSng(Random.Next(-10, 10) / 10), CSng(Random.Next(-10, 10) / 10), CSng(Random.Next(-10, 10) / 10)) + Dim SmokeDestination As Vector3 = New Vector3(0, 0, 0) - ' Ball Closes - BallReturn.AnimationPlaySound("Battle\Pokeball\Open", 0, 0) - Dim SmokeReturned As Integer = 0 - Do - Dim SmokePosition = New Vector3(CSng(Random.Next(-10, 10) / 10), CSng(Random.Next(-10, 10) / 10), CSng(Random.Next(-10, 10) / 10)) - Dim SmokeDestination As Vector3 = New Vector3(0, 0, 0) + Dim SmokeTexture As Texture2D = TextureManager.GetTexture("Textures\Battle\Smoke") - Dim SmokeTexture As Texture2D = TextureManager.GetTexture("Textures\Battle\Smoke") + Dim SmokeScale = New Vector3(CSng(Random.Next(2, 6) / 10)) + Dim SmokeSpeed = CSng(Random.Next(1, 3) / 20.0F) - Dim SmokeScale = New Vector3(CSng(Random.Next(2, 6) / 10)) - Dim SmokeSpeed = CSng(Random.Next(1, 3) / 10.0F) + Dim SmokeEntity As Entity = BallReturn.SpawnEntity(SmokePosition, SmokeTexture, SmokeScale, 1.0F) - Dim SmokeEntity As Entity = BallReturn.SpawnEntity(SmokePosition, SmokeTexture, SmokeScale, 1.0F) - - BallReturn.AnimationMove(SmokeEntity, True, SmokeDestination.X, SmokeDestination.Y, SmokeDestination.Z, SmokeSpeed, False, False, 0.0F, 0.0F) - - Threading.Interlocked.Increment(SmokeReturned) - Loop While SmokeReturned <= 38 + BallReturn.AnimationMove(SmokeEntity, True, SmokeDestination.X, SmokeDestination.Y, SmokeDestination.Z, SmokeSpeed, False, False, 0.0F, 0.0F) + Threading.Interlocked.Increment(SmokeReturned) + Loop While SmokeReturned <= 38 + End If ' Pokemon disappears + BallReturn.AnimationFade(Nothing, False, 1, False, 0, 1, 0) - BallReturn.AnimationMove(Nothing, False, 0, 0.5, 0, 0.5, False, False, 2, 0,,, 3) - - ' Ball returns - BallReturn.AnimationPlaySound("Battle\Pokeball\Throw", 1, 0) - Dim BallReturnEntity As Entity = BallReturn.SpawnEntity(New Vector3(0.0F), TextureManager.GetTexture(BattleScreen.OwnPokemon.CatchBall.TextureSource), New Vector3(0.3F), 1.0F) - BallReturn.AnimationMove(BallReturnEntity, True, -2, 0, 0, 0.1, False, True, 1, 0,, 0.3) + If Core.Player.ShowBattleAnimations <> 0 Then + BallReturn.AnimationMove(Nothing, False, 0, 0.5, 0, 0.5, False, False, 2, 0,,, 3) + ' Ball returns + BallReturn.AnimationPlaySound("Battle\Pokeball\Throw", 1, 0) + Dim BallReturnEntity As Entity = BallReturn.SpawnEntity(Nothing, BattleScreen.OwnPokemon.CatchBall.Texture, New Vector3(0.3F), 1.0F) + BallReturn.AnimationMove(BallReturnEntity, True, -2, 0, 0, 0.1, False, True, 1, 0,, 0.3) + End If BattleScreen.AddToQuery(InsertIndex, BallReturn) Dim index As Integer = NewPokemonIndex @@ -6856,37 +6896,40 @@ ' Ball is thrown Dim BallThrow As AnimationQueryObject = New AnimationQueryObject(BattleScreen.OwnPokemonNPC, False, BattleScreen.OwnPokemonModel) - BallThrow.AnimationPlaySound("Battle\Pokeball\Throw", 0, 0) + If Core.Player.ShowBattleAnimations <> 0 Then + BallThrow.AnimationPlaySound("Battle\Pokeball\Throw", 0, 0) - Dim BallThrowEntity As Entity = BallReturn.SpawnEntity(New Vector3(-2, -0.15, 0), TextureManager.GetTexture(BattleScreen.OwnPokemon.CatchBall.TextureSource), New Vector3(0.3F), 1.0F) - BallThrow.AnimationMove(BallThrowEntity, True, 0, 0.35, 0, 0.1, False, True, 0F, 0F,, 0.3) + Dim BallThrowEntity As Entity = BallThrow.SpawnEntity(New Vector3(-2, -0.15, 0), BattleScreen.OwnPokemon.CatchBall.Texture, New Vector3(0.3F), 1.0F) + BallThrow.AnimationMove(BallThrowEntity, True, 0, 0.35, 0, 0.1, False, True, 0F, 0F,, 0.3) - ' Ball Opens - BallThrow.AnimationPlaySound("Battle\Pokeball\Open", 3, 0) + ' Ball Opens + BallThrow.AnimationPlaySound("Battle\Pokeball\Open", 3, 0) - Dim SmokeSpawned As Integer = 0 - Do - Dim SmokePosition = New Vector3(0, 0.35, 0) - Dim SmokeDestination = New Vector3(CSng(Random.Next(-10, 10) / 10), CSng(Random.Next(-10, 10) / 10), CSng(Random.Next(-10, 10) / 10)) + Dim SmokeSpawned As Integer = 0 + Do + Dim SmokeDestination = New Vector3(CSng(Random.Next(-10, 10) / 10), CSng(Random.Next(-10, 10) / 10), CSng(Random.Next(-10, 10) / 10)) - Dim SmokeTexture As Texture2D = TextureManager.GetTexture("Textures\Battle\Smoke") + Dim SmokeTexture As Texture2D = TextureManager.GetTexture("Textures\Battle\Smoke") - Dim SmokeScale = New Vector3(CSng(Random.Next(2, 6) / 10)) - Dim SmokeSpeed = CSng(Random.Next(1, 3) / 10.0F) + Dim SmokeScale = New Vector3(CSng(Random.Next(2, 6) / 10)) + Dim SmokeSpeed = CSng(Random.Next(1, 3) / 10.0F) - Dim SmokeEntity As Entity = BallThrow.SpawnEntity(SmokePosition, SmokeTexture, SmokeScale, 1.0F) + Dim SmokeEntity As Entity = BallThrow.SpawnEntity(Nothing, SmokeTexture, SmokeScale, 1.0F) - BallThrow.AnimationMove(SmokeEntity, True, SmokeDestination.X, SmokeDestination.Y, SmokeDestination.Z, SmokeSpeed, False, False, 3.0F, 0.0F) + BallThrow.AnimationMove(SmokeEntity, True, SmokeDestination.X, SmokeDestination.Y, SmokeDestination.Z, SmokeSpeed, False, False, 3.0F, 0.0F) - Threading.Interlocked.Increment(SmokeSpawned) - Loop While SmokeSpawned <= 38 + Threading.Interlocked.Increment(SmokeSpawned) + Loop While SmokeSpawned <= 38 + End If ' Pokemon appears BallThrow.AnimationFade(Nothing, False, 1, True, 1, 4, 0) BallThrow.AnimationPlaySound(CStr(BattleScreen.OwnPokemon.Number), 4, 0,, True) - ' Pokémon falls down - BallThrow.AnimationMove(Nothing, False, 0, 0, 0, 0.05F, False, False, 4, 0,,, 3) + If Core.Player.ShowBattleAnimations <> 0 Then + ' Pokémon falls down + BallThrow.AnimationMove(Nothing, False, 0, 0, 0, 0.05F, False, False, 4, 0,,, 3) + End If BattleScreen.AddToQuery(InsertIndex, BallThrow) End If @@ -7133,10 +7176,12 @@ If BattleScreen.IsTrainerBattle = False Then ChangeCameraAngle(1, False, BattleScreen) - Dim Faint As AnimationQueryObject = New AnimationQueryObject(BattleScreen.OppPokemonNPC, True, BattleScreen.OppPokemonModel) - Faint.AnimationPlaySound(CStr(BattleScreen.OppPokemon.Number), 0, 2, False, True) - Faint.AnimationMove(Nothing, False, 0, -1, 0, 0.1, False, False, 2, 0,,, 3) - BattleScreen.BattleQuery.Add(Faint) + If Core.Player.ShowBattleAnimations <> 0 Then + Dim Faint As AnimationQueryObject = New AnimationQueryObject(BattleScreen.OppPokemonNPC, True, BattleScreen.OppPokemonModel) + Faint.AnimationPlaySound(CStr(BattleScreen.OppPokemon.Number), 0, 2, False, True) + Faint.AnimationMove(Nothing, False, 0, -1, 0, 0.1, False, False, 2, 0,,, 3) + BattleScreen.BattleQuery.Add(Faint) + End If BattleScreen.BattleQuery.Add(New ToggleEntityQueryObject(True, ToggleEntityQueryObject.BattleEntities.OppPokemon, 2, -1, -1, -1, -1)) @@ -7161,34 +7206,38 @@ BattleScreen.BattleQuery.Add(New TextQueryObject(message)) - Dim BallReturn As AnimationQueryObject = New AnimationQueryObject(BattleScreen.OppPokemonNPC, True, BattleScreen.OppPokemonModel) - ' Ball Closes - BallReturn.AnimationPlaySound("Battle\Pokeball\Open", 0, 0) - Dim SmokeReturned As Integer = 0 - Do - Dim SmokePosition = New Vector3(CSng(Random.Next(-10, 10) / 10), CSng(Random.Next(-10, 10) / 10), CSng(Random.Next(-10, 10) / 10)) - Dim SmokeDestination = New Vector3(0, 0, 0) + If Core.Player.ShowBattleAnimations <> 0 Then + Dim BallReturn As AnimationQueryObject = New AnimationQueryObject(BattleScreen.OppPokemonNPC, True, BattleScreen.OppPokemonModel) + ' Ball Closes + BallReturn.AnimationPlaySound("Battle\Pokeball\Open", 0, 0) + Dim SmokeReturned As Integer = 0 + Do + Dim SmokePosition = New Vector3(CSng(Random.Next(-10, 10) / 10), CSng(Random.Next(-10, 10) / 10), CSng(Random.Next(-10, 10) / 10)) + Dim SmokeDestination = New Vector3(0, 0, 0) - Dim SmokeTexture As Texture2D = TextureManager.GetTexture("Textures\Battle\Smoke") + Dim SmokeTexture As Texture2D = TextureManager.GetTexture("Textures\Battle\Smoke") - Dim SmokeScale = New Vector3(CSng(Random.Next(2, 6) / 10)) - Dim SmokeSpeed = CSng(Random.Next(1, 3) / 10.0F) - Dim SmokeEntity = BallReturn.SpawnEntity(SmokePosition, SmokeTexture, SmokeScale, 1) - BallReturn.AnimationMove(SmokeEntity, True, SmokeDestination.X, SmokeDestination.Y, SmokeDestination.Z, SmokeSpeed, False, False, 0.0F, 0.0F) - Threading.Interlocked.Increment(SmokeReturned) - Loop While SmokeReturned <= 38 + Dim SmokeScale = New Vector3(CSng(Random.Next(2, 6) / 10)) + Dim SmokeSpeed = CSng(Random.Next(1, 3) / 10.0F) + Dim SmokeEntity = BallReturn.SpawnEntity(SmokePosition, SmokeTexture, SmokeScale, 1) + BallReturn.AnimationMove(SmokeEntity, True, SmokeDestination.X, SmokeDestination.Y, SmokeDestination.Z, SmokeSpeed, False, False, 0.0F, 0.0F) + Threading.Interlocked.Increment(SmokeReturned) + Loop While SmokeReturned <= 38 - ' Pokemon disappears - BallReturn.AnimationFade(Nothing, False, 1, False, 0, 1, 0) - BallReturn.AnimationMove(Nothing, False, 0, 0.5, 0, 0.5, False, False, 2, 0,,, 4) + ' Pokemon disappears + BallReturn.AnimationFade(Nothing, False, 1, False, 0, 1, 0) - ' Ball returns - BallReturn.AnimationPlaySound("Battle\Pokeball\Throw", 1, 0) - Dim BallReturnEntity = BallReturn.SpawnEntity(New Vector3(0, 0, 0), TextureManager.GetTexture(BattleScreen.OppPokemon.CatchBall.TextureSource), New Vector3(0.3F), 1.0F) - BallReturn.AnimationMove(BallReturnEntity, True, -2, 0, 0, 0.1, False, True, 0F, 0F,, 0.3) + BallReturn.AnimationMove(Nothing, False, 0, 0.5, 0, 0.5, False, False, 2, 0,,, 4) - BattleScreen.BattleQuery.Add(BallReturn) + ' Ball returns + BallReturn.AnimationPlaySound("Battle\Pokeball\Throw", 1, 0) + Dim BallReturnEntity = BallReturn.SpawnEntity(New Vector3(0, 0, 0), BattleScreen.OppPokemon.CatchBall.Texture, New Vector3(0.3F), 1.0F) + BallReturn.AnimationMove(BallReturnEntity, True, -2, 0, 0, 0.1, False, True, 0F, 0F,, 0.3) + BattleScreen.BattleQuery.Add(BallReturn) + Else + BattleScreen.BattleQuery.Add(New ToggleEntityQueryObject(True, ToggleEntityQueryObject.BattleEntities.OppPokemon, 2, -1, -1, -1, -1)) + End If EndBattle(EndBattleReasons.WinTrainer, BattleScreen, False) If BattleScreen.IsRemoteBattle = True Then @@ -7223,35 +7272,38 @@ HasSwitchedInOpp = True BattleScreen.BattleQuery.Add(New TextQueryObject(BattleScreen.Trainer.Name & ": ""Come back, " & BattleScreen.OppPokemon.GetDisplayName() & "!""")) - Dim BallReturn As AnimationQueryObject = New AnimationQueryObject(BattleScreen.OppPokemonNPC, True, BattleScreen.OppPokemonModel) + If Core.Player.ShowBattleAnimations <> 0 Then + Dim BallReturn As AnimationQueryObject = New AnimationQueryObject(BattleScreen.OppPokemonNPC, True, BattleScreen.OppPokemonModel) - ' Ball Closes - BallReturn.AnimationPlaySound("Battle\Pokeball\Open", 0, 0) - Dim SmokeReturned As Integer = 0 - Do - Dim SmokePosition = New Vector3(CSng(Random.Next(-10, 10) / 10), CSng(Random.Next(-10, 10) / 10), CSng(Random.Next(-10, 10) / 10)) - Dim SmokeDestination = New Vector3(0, 0, 0) + ' Ball Closes + BallReturn.AnimationPlaySound("Battle\Pokeball\Open", 0, 0) + Dim SmokeReturned As Integer = 0 + Do + Dim SmokePosition = New Vector3(CSng(Random.Next(-10, 10) / 10), CSng(Random.Next(-10, 10) / 10), CSng(Random.Next(-10, 10) / 10)) + Dim SmokeDestination = New Vector3(0, 0, 0) - Dim SmokeTexture As Texture2D = TextureManager.GetTexture("Textures\Battle\Smoke") + Dim SmokeTexture As Texture2D = TextureManager.GetTexture("Textures\Battle\Smoke") - Dim SmokeScale = New Vector3(CSng(Random.Next(2, 6) / 10)) - Dim SmokeSpeed = CSng(Random.Next(1, 3) / 10.0F) - Dim SmokeEntity = BallReturn.SpawnEntity(SmokePosition, SmokeTexture, SmokeScale, 1) - BallReturn.AnimationMove(SmokeEntity, True, SmokeDestination.X, SmokeDestination.Y, SmokeDestination.Z, SmokeSpeed, False, False, 0.0F, 0.0F) - Threading.Interlocked.Increment(SmokeReturned) - Loop While SmokeReturned <= 38 + Dim SmokeScale = New Vector3(CSng(Random.Next(2, 6) / 10)) + Dim SmokeSpeed = CSng(Random.Next(1, 3) / 10.0F) + Dim SmokeEntity = BallReturn.SpawnEntity(SmokePosition, SmokeTexture, SmokeScale, 1) + BallReturn.AnimationMove(SmokeEntity, True, SmokeDestination.X, SmokeDestination.Y, SmokeDestination.Z, SmokeSpeed, False, False, 0.0F, 0.0F) + Threading.Interlocked.Increment(SmokeReturned) + Loop While SmokeReturned <= 38 - ' Pokemon disappears - BallReturn.AnimationFade(Nothing, False, 1, False, 0, 1, 0) - BallReturn.AnimationMove(Nothing, False, 0, 0.5, 0, 0.5, False, False, 2, 0,,, 4) + ' Pokemon disappears + BallReturn.AnimationFade(Nothing, False, 1, False, 0, 1, 0) + BallReturn.AnimationMove(Nothing, False, 0, 0.5, 0, 0.5, False, False, 2, 0,,, 4) - ' Ball returns - BallReturn.AnimationPlaySound("Battle\Pokeball\Throw", 1, 0) - Dim BallReturnEntity = BallReturn.SpawnEntity(New Vector3(0, 0, 0), TextureManager.GetTexture(BattleScreen.OppPokemon.CatchBall.TextureSource), New Vector3(0.3F), 1.0F) - BallReturn.AnimationMove(BallReturnEntity, True, -2, 0, 0, 0.1, False, True, 0F, 0F,, 0.3) - - BattleScreen.BattleQuery.Add(BallReturn) + ' Ball returns + BallReturn.AnimationPlaySound("Battle\Pokeball\Throw", 1, 0) + Dim BallReturnEntity = BallReturn.SpawnEntity(New Vector3(0, 0, 0), BattleScreen.OppPokemon.CatchBall.Texture, New Vector3(0.3F), 1.0F) + BallReturn.AnimationMove(BallReturnEntity, True, -2, 0, 0, 0.1, False, True, 0F, 0F,, 0.3) + BattleScreen.BattleQuery.Add(BallReturn) + Else + BattleScreen.BattleQuery.Add(New ToggleEntityQueryObject(True, ToggleEntityQueryObject.BattleEntities.OppPokemon, 1, -1, -1, -1, -1)) + End If BattleScreen.SendInNewTrainerPokemon(index) Me.ApplyOppBatonPass(BattleScreen) @@ -7275,38 +7327,40 @@ BattleScreen.BattleQuery.Add(New ToggleEntityQueryObject(True, ToggleEntityQueryObject.BattleEntities.OppPokemon, 1, -1, -1, -1, -1)) BattleScreen.BattleQuery.Add(New TextQueryObject(BattleScreen.Trainer.Name & ": ""Go, " & BattleScreen.OppPokemon.GetDisplayName() & "!""")) - ' Ball is thrown - Dim BallThrow As AnimationQueryObject = New AnimationQueryObject(BattleScreen.OppPokemonNPC, True, BattleScreen.OppPokemonModel) + If Core.Player.ShowBattleAnimations <> 0 Then + ' Ball is thrown + Dim BallThrow As AnimationQueryObject = New AnimationQueryObject(BattleScreen.OppPokemonNPC, True, BattleScreen.OppPokemonModel) - BallThrow.AnimationPlaySound("Battle\Pokeball\Throw", 0, 0) - Dim BallThrowEntity = BallThrow.SpawnEntity(New Vector3(-2, -0.15, 0), TextureManager.GetTexture(BattleScreen.OwnPokemon.CatchBall.TextureSource), New Vector3(0.3F), 1.0F) - BallThrow.AnimationMove(BallThrowEntity, True, 0, 0.35, 0, 0.1, False, True, 0F, 0F,, 0.3) + BallThrow.AnimationPlaySound("Battle\Pokeball\Throw", 0, 0) + Dim BallThrowEntity = BallThrow.SpawnEntity(New Vector3(-2, -0.15, 0), BattleScreen.OwnPokemon.CatchBall.Texture, New Vector3(0.3F), 1.0F) + BallThrow.AnimationMove(BallThrowEntity, True, 0, 0.35, 0, 0.1, False, True, 0F, 0F,, 0.3) - ' Ball opens - BallThrow.AnimationPlaySound("Battle\Pokeball\Open", 3, 0) - Dim SmokeSpawned As Integer = 0 - Do - Dim SmokePosition = New Vector3(0, 0.35, 0) - Dim SmokeDestination = New Vector3(CSng(Random.Next(-10, 10) / 10), CSng(Random.Next(-10, 10) / 10), CSng(Random.Next(-10, 10) / 10)) + ' Ball opens + BallThrow.AnimationPlaySound("Battle\Pokeball\Open", 3, 0) + Dim SmokeSpawned As Integer = 0 + Do + Dim SmokePosition = New Vector3(0, 0.35, 0) + Dim SmokeDestination = New Vector3(CSng(Random.Next(-10, 10) / 10), CSng(Random.Next(-10, 10) / 10), CSng(Random.Next(-10, 10) / 10)) - Dim SmokeTexture As Texture2D = TextureManager.GetTexture("Textures\Battle\Smoke") + Dim SmokeTexture As Texture2D = TextureManager.GetTexture("Textures\Battle\Smoke") - Dim SmokeScale = New Vector3(CSng(Random.Next(2, 6) / 10)) - Dim SmokeSpeed = CSng(Random.Next(1, 3) / 10.0F) - Dim SmokeEntity = BallReturn.SpawnEntity(SmokePosition, SmokeTexture, SmokeScale, 1) + Dim SmokeScale = New Vector3(CSng(Random.Next(2, 6) / 10)) + Dim SmokeSpeed = CSng(Random.Next(1, 3) / 10.0F) + Dim SmokeEntity = BallThrow.SpawnEntity(SmokePosition, SmokeTexture, SmokeScale, 1) - BallThrow.AnimationMove(SmokeEntity, True, SmokeDestination.X, SmokeDestination.Y, SmokeDestination.Z, SmokeSpeed, False, False, 3.0F, 0.0F) - Threading.Interlocked.Increment(SmokeSpawned) - Loop While SmokeSpawned <= 38 + BallThrow.AnimationMove(SmokeEntity, True, SmokeDestination.X, SmokeDestination.Y, SmokeDestination.Z, SmokeSpeed, False, False, 3.0F, 0.0F) + Threading.Interlocked.Increment(SmokeSpawned) + Loop While SmokeSpawned <= 38 - ' Pokemon appears - BallThrow.AnimationFade(Nothing, False, 1, True, 1, 4, 0) - BallThrow.AnimationPlaySound(CStr(BattleScreen.OppPokemon.Number), 4, 0,, True) + ' Pokemon appears + BallThrow.AnimationFade(Nothing, False, 1, True, 1, 4, 0) + BallThrow.AnimationPlaySound(CStr(BattleScreen.OppPokemon.Number), 4, 0,, True) - ' Pokémon falls down - BallThrow.AnimationMove(Nothing, False, 0, 0, 0, 0.05F, False, False, 4, 0,,, 4) + ' Pokémon falls down + BallThrow.AnimationMove(Nothing, False, 0, 0, 0, 0.05F, False, False, 4, 0,,, 4) - BattleScreen.BattleQuery.Add(BallThrow) + BattleScreen.BattleQuery.Add(BallThrow) + End If End If With BattleScreen diff --git a/P3D/Battle/BattleSystemV2/QueryObjects/AnimationQueryObject.vb b/P3D/Battle/BattleSystemV2/QueryObjects/AnimationQueryObject.vb index 919bc52ce..5e1b293b4 100644 --- a/P3D/Battle/BattleSystemV2/QueryObjects/AnimationQueryObject.vb +++ b/P3D/Battle/BattleSystemV2/QueryObjects/AnimationQueryObject.vb @@ -91,20 +91,15 @@ End Sub Public Function SpawnEntity(ByVal Position As Vector3, ByVal Texture As Texture2D, ByVal Scale As Vector3, ByVal Opacity As Single, Optional ByVal startDelay As Single = 0.0F, Optional ByVal endDelay As Single = 0.0F) As Entity - Dim SpawnedEntity = New BattleAnimation3D(Position, Texture, Scale, 0, 0, False) + Dim NewPosition As Vector3 + If Not Position = Nothing Then + NewPosition = CurrentEntity.Position + Position + Else + NewPosition = CurrentEntity.Position + End If + Dim SpawnedEntity = New BattleAnimation3D(NewPosition, Texture, Scale, 0, 0, False) SpawnedEntity.Opacity = Opacity - If Not BattleFlipped = Nothing Then - If BattleFlipped = True Then - SpawnedEntity.Position.X = CurrentEntity.Position.X - Position.X - SpawnedEntity.Position.Y = CurrentEntity.Position.Y + Position.Y - SpawnedEntity.Position.Z = CurrentEntity.Position.Z - Position.Z - Else - SpawnedEntity.Position.X = CurrentEntity.Position.X + Position.X - SpawnedEntity.Position.Y = CurrentEntity.Position.Y + Position.Y - SpawnedEntity.Position.Z = CurrentEntity.Position.Z + Position.Z - End If - End If SpawnedEntities.Add(SpawnedEntity) Dim SpawnDelayEntity As BattleAnimation3D = New BattleAnimation3D(New Vector3(0.0F), TextureManager.DefaultTexture, New Vector3(1.0F), startDelay, endDelay, True) @@ -135,28 +130,34 @@ Public Sub AnimationMove(ByVal Entity As Entity, ByVal RemoveEntityAfter As Boolean, ByVal DestinationX As Single, ByVal DestinationY As Single, ByVal DestinationZ As Single, ByVal Speed As Single, ByVal SpinX As Boolean, ByVal SpinZ As Boolean, ByVal startDelay As Single, ByVal endDelay As Single, Optional ByVal SpinXSpeed As Single = 0.1F, Optional ByVal SpinZSpeed As Single = 0.1F, Optional MovementCurve As Integer = 3) Dim MoveEntity As Entity + Dim ModelEntity As Entity = Nothing Dim Destination As Vector3 + If Entity Is Nothing Then + MoveEntity = CurrentEntity + If Me.CurrentModel IsNot Nothing Then + ModelEntity = Me.CurrentModel + End If + Else + MoveEntity = Entity + End If + If Not BattleFlipped = Nothing Then If BattleFlipped = True Then DestinationX -= DestinationX * 2.0F DestinationZ -= DestinationZ * 2.0F End If - If Entity Is Nothing Then - MoveEntity = CurrentEntity - Else - MoveEntity = Entity - End If - Destination = CurrentEntity.Position + New Vector3(DestinationX, DestinationY, DestinationZ) + End If + If CurrentEntity Is Nothing Then + Destination = MoveEntity.Position + New Vector3(DestinationX, DestinationY, DestinationZ) Else - MoveEntity = Entity - Destination = New Vector3(DestinationX, DestinationY, DestinationZ) + Destination = CurrentEntity.Position + New Vector3(DestinationX, DestinationY, DestinationZ) End If Dim baEntityMove As BAEntityMove = New BAEntityMove(MoveEntity, Destination, Speed, SpinX, SpinZ, startDelay, endDelay, SpinXSpeed, SpinZSpeed, MovementCurve) AnimationSequence.Add(baEntityMove) - If Me.CurrentModel IsNot Nothing Then + If ModelEntity IsNot Nothing Then Dim baModelMove As BAEntityMove = New BAEntityMove(CType(CurrentModel, Entity), Destination, Speed, SpinX, SpinZ, startDelay, endDelay, SpinXSpeed, SpinZSpeed, MovementCurve) AnimationSequence.Add(baModelMove) End If @@ -232,7 +233,7 @@ AnimationSequence.Add(baSound) End Sub - Public Sub AnimationBackground(Texture As Texture2D, ByVal RemoveEntityAfter As Boolean, ByVal TransitionSpeed As Single, ByVal FadeIn As Boolean, ByVal FadeOut As Boolean, ByVal EndState As Single, ByVal startDelay As Single, ByVal endDelay As Single, Optional ByVal startState As Single = 0.0F) + Public Sub AnimationBackground(Texture As Texture2D, ByVal TransitionSpeed As Single, ByVal FadeIn As Boolean, ByVal FadeOut As Boolean, ByVal EndState As Single, ByVal startDelay As Single, ByVal endDelay As Single, Optional ByVal startState As Single = 0.0F) Dim baBackground As BABackground = New BABackground(Texture, TransitionSpeed, FadeIn, FadeOut, EndState, startDelay, endDelay, startState) AnimationSequence.Add(baBackground) End Sub diff --git a/P3D/Content/Sounds/Battle/Effects/Heal.wav b/P3D/Content/Sounds/Battle/Effects/Heal.wav new file mode 100644 index 0000000000000000000000000000000000000000..6e952de6dad7a40b4ea42386f074fc8e8bb996f3 GIT binary patch literal 83280 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 0 Then + Dim BattleFlip As Boolean = False Dim CurrentPokemon As Pokemon = BattleScreen.OwnPokemon Dim CurrentEntity As NPC = BattleScreen.OwnPokemonNPC Dim CurrentModel As ModelEntity = BattleScreen.OwnPokemonModel If own = False Then + BattleFlip = True CurrentPokemon = BattleScreen.OppPokemon CurrentEntity = BattleScreen.OppPokemonNPC CurrentModel = BattleScreen.OppPokemonModel End If - Me.InternalUserPokemonMoveAnimation(BattleScreen, own, CurrentPokemon, CurrentEntity, CurrentModel) + Me.InternalUserPokemonMoveAnimation(BattleScreen, BattleFlip, CurrentPokemon, CurrentEntity, CurrentModel) End If End Sub - Public Overridable Sub InternalUserPokemonMoveAnimation(ByVal BattleScreen As BattleScreen, ByVal own As Boolean, ByVal CurrentPokemon As Pokemon, ByVal CurrentEntity As NPC, ByVal CurrentModel As ModelEntity) + Public Overridable Sub InternalUserPokemonMoveAnimation(ByVal BattleScreen As BattleScreen, ByVal BattleFlip As Boolean, ByVal CurrentPokemon As Pokemon, ByVal CurrentEntity As NPC, ByVal CurrentModel As ModelEntity) 'Override this method in the attack class to insert the move animation query objects into the queue. End Sub Public Sub OpponentPokemonMoveAnimation(ByVal BattleScreen As BattleScreen, ByVal own As Boolean) - If Core.Player.ShowBattleAnimations = 1 Then + If Core.Player.ShowBattleAnimations <> 0 Then + Dim BattleFlip As Boolean = False Dim CurrentPokemon As Pokemon = BattleScreen.OppPokemon Dim CurrentEntity As NPC = BattleScreen.OppPokemonNPC Dim CurrentModel As ModelEntity = BattleScreen.OppPokemonModel If own = False Then + BattleFlip = True CurrentPokemon = BattleScreen.OwnPokemon CurrentEntity = BattleScreen.OwnPokemonNPC CurrentModel = BattleScreen.OwnPokemonModel End If - Me.InternalOpponentPokemonMoveAnimation(BattleScreen, own, CurrentPokemon, CurrentEntity, CurrentModel) + Me.InternalOpponentPokemonMoveAnimation(BattleScreen, BattleFlip, CurrentPokemon, CurrentEntity, CurrentModel) End If End Sub - Public Overridable Sub InternalOpponentPokemonMoveAnimation(ByVal BattleScreen As BattleScreen, ByVal own As Boolean, ByVal CurrentPokemon As Pokemon, ByVal CurrentEntity As NPC, ByVal CurrentModel As ModelEntity) + Public Overridable Sub InternalOpponentPokemonMoveAnimation(ByVal BattleScreen As BattleScreen, ByVal BattleFlip As Boolean, ByVal CurrentPokemon As Pokemon, ByVal CurrentEntity As NPC, ByVal CurrentModel As ModelEntity) 'Override this method in the attack class to insert the move animation query objects into the queue. End Sub diff --git a/P3D/Pokemon/Attacks/Fire/Ember.vb b/P3D/Pokemon/Attacks/Fire/Ember.vb index bcc8306f3..a1dbe0b35 100644 --- a/P3D/Pokemon/Attacks/Fire/Ember.vb +++ b/P3D/Pokemon/Attacks/Fire/Ember.vb @@ -63,14 +63,14 @@ End If End Sub - Public Overrides Sub InternalUserPokemonMoveAnimation(ByVal BattleScreen As BattleScreen, ByVal own As Boolean, ByVal CurrentPokemon As Pokemon, ByVal CurrentEntity As NPC, ByVal CurrentModel As ModelEntity) - Dim MoveAnimation As AnimationQueryObject = New AnimationQueryObject(CurrentEntity, own) - Dim FireballEntity As Entity = MoveAnimation.SpawnEntity(New Vector3(0.0, 0.0, 0.0), TextureManager.GetTexture("Textures\Battle\Fire\FireBall"), New Vector3(0.5F), 1.0F) + Public Overrides Sub InternalUserPokemonMoveAnimation(ByVal BattleScreen As BattleScreen, ByVal BattleFlip As Boolean, ByVal CurrentPokemon As Pokemon, ByVal CurrentEntity As NPC, ByVal CurrentModel As ModelEntity) + Dim MoveAnimation = New AnimationQueryObject(CurrentEntity, BattleFlip) + Dim FireballEntity = MoveAnimation.SpawnEntity(Nothing, TextureManager.GetTexture("Textures\Battle\Fire\FireBall"), New Vector3(0.5F), 1.0F) MoveAnimation.AnimationMove(FireballEntity, True, 2.0, 0.0, 0.0, 0.05, False, True, 0.0, 0.0,, -0.5, 0) MoveAnimation.AnimationPlaySound("Battle\Attacks\Fire\Ember_Start", 0, 0) For i = 0 To 12 - Dim SmokeEntity = MoveAnimation.SpawnEntity(New Vector3(CSng(i * 0.2), 0.0, 0.0), TextureManager.GetTexture("Textures\Battle\Fire\Smoke"), New Vector3(0.2), 1) + Dim SmokeEntity = MoveAnimation.SpawnEntity(New Vector3(CSng(i * 0.2), 0.0, 0.0), TextureManager.GetTexture("Textures\Battle\Fire\Smoke"), New Vector3(0.2), 1, CSng(i * 0.2)) MoveAnimation.AnimationFade(SmokeEntity, True, 0.02, False, 0.0, CSng(i * 0.2), 0.0) i += 1 @@ -78,14 +78,14 @@ BattleScreen.BattleQuery.Add(MoveAnimation) End Sub - Public Overrides Sub InternalOpponentPokemonMoveAnimation(ByVal BattleScreen As BattleScreen, ByVal own As Boolean, ByVal CurrentPokemon As Pokemon, ByVal CurrentEntity As NPC, ByVal CurrentModel As ModelEntity) - Dim MoveAnimation As AnimationQueryObject = New AnimationQueryObject(CurrentEntity, own) - Dim FireballEntity As Entity = MoveAnimation.SpawnEntity(New Vector3(2.0, 0.0, 0.0), TextureManager.GetTexture("Textures\Battle\Fire\FireBall"), New Vector3(0.5F), 1.0F) + Public Overrides Sub InternalOpponentPokemonMoveAnimation(ByVal BattleScreen As BattleScreen, ByVal BattleFlip As Boolean, ByVal CurrentPokemon As Pokemon, ByVal CurrentEntity As NPC, ByVal CurrentModel As ModelEntity) + Dim MoveAnimation = New AnimationQueryObject(CurrentEntity, BattleFlip) + Dim FireballEntity = MoveAnimation.SpawnEntity(New Vector3(-2.0, 0.0, 0.0), TextureManager.GetTexture("Textures\Battle\Fire\FireBall"), New Vector3(0.5F), 1.0F) - MoveAnimation.AnimationMove(FireballEntity, True, 0.0, 0.0, 0.0, 0.05, False, True, 0.0, 0.0,, -0.5, 0) + MoveAnimation.AnimationMove(FireballEntity, True, 2.0, 0.0, 0.0, 0.05, False, True, 0.0, 0.0,, -0.5, 0) For i = 0 To 12 - Dim SmokeEntity = MoveAnimation.SpawnEntity(New Vector3(CSng(3.0 - i * 0.2), 0.0, 0.0), TextureManager.GetTexture("Textures\Battle\Fire\Smoke"), New Vector3(0.2), 1) + Dim SmokeEntity = MoveAnimation.SpawnEntity(New Vector3(CSng(-2.0 + i * 0.2), 0.0, 0.0), TextureManager.GetTexture("Textures\Battle\Fire\Smoke"), New Vector3(0.2), 1, CSng(i * 0.2)) MoveAnimation.AnimationFade(SmokeEntity, True, 0.02, False, 0.0, CSng(i * 0.2), 0.0) i += 1 diff --git a/P3D/Pokemon/Attacks/Grass/Absorb.vb b/P3D/Pokemon/Attacks/Grass/Absorb.vb index f895c3cf2..b728851a3 100644 --- a/P3D/Pokemon/Attacks/Grass/Absorb.vb +++ b/P3D/Pokemon/Attacks/Grass/Absorb.vb @@ -92,8 +92,8 @@ End If End Sub - Public Overrides Sub InternalOpponentPokemonMoveAnimation(ByVal BattleScreen As BattleScreen, ByVal own As Boolean, ByVal CurrentPokemon As Pokemon, ByVal CurrentEntity As NPC, ByVal CurrentModel As ModelEntity) - Dim MoveAnimation As AnimationQueryObject = New AnimationQueryObject(CurrentEntity, own) + Public Overrides Sub InternalOpponentPokemonMoveAnimation(ByVal BattleScreen As BattleScreen, ByVal BattleFlip As Boolean, ByVal CurrentPokemon As Pokemon, ByVal CurrentEntity As NPC, ByVal CurrentModel As ModelEntity) + Dim MoveAnimation As AnimationQueryObject = New AnimationQueryObject(CurrentEntity, BattleFlip) Dim maxAmount As Integer = 8 Dim currentAmount As Integer = 0 MoveAnimation.AnimationPlaySound("Battle\Attacks\Grass\Absorb", 0, 0) diff --git a/P3D/Pokemon/Attacks/Normal/Growl.vb b/P3D/Pokemon/Attacks/Normal/Growl.vb index 369515629..9558524c9 100644 --- a/P3D/Pokemon/Attacks/Normal/Growl.vb +++ b/P3D/Pokemon/Attacks/Normal/Growl.vb @@ -62,8 +62,8 @@ End If End Sub - Public Overrides Sub InternalUserPokemonMoveAnimation(ByVal BattleScreen As BattleScreen, ByVal own As Boolean, ByVal CurrentPokemon As Pokemon, ByVal CurrentEntity As NPC, ByVal CurrentModel As ModelEntity) - Dim MoveAnimation As AnimationQueryObject = New AnimationQueryObject(CurrentEntity, own) + Public Overrides Sub InternalUserPokemonMoveAnimation(ByVal BattleScreen As BattleScreen, ByVal BattleFlip As Boolean, ByVal CurrentPokemon As Pokemon, ByVal CurrentEntity As NPC, ByVal CurrentModel As ModelEntity) + Dim MoveAnimation As AnimationQueryObject = New AnimationQueryObject(CurrentEntity, BattleFlip) MoveAnimation.AnimationPlaySound(CStr(CurrentPokemon.Number), 0, 0,, True) Dim SoundwaveEntity = MoveAnimation.SpawnEntity(New Vector3(0.25, -0.25, -0.25), TextureManager.GetTexture("Textures\Battle\Normal\Growl", New Rectangle(0, 0, 32, 32), ""), New Vector3(0.5F), 1, 0, 1) diff --git a/P3D/Pokemon/Attacks/Normal/Pound.vb b/P3D/Pokemon/Attacks/Normal/Pound.vb index d14a3c279..b3441945a 100644 --- a/P3D/Pokemon/Attacks/Normal/Pound.vb +++ b/P3D/Pokemon/Attacks/Normal/Pound.vb @@ -55,10 +55,10 @@ Me.AIField2 = AIField.Nothing End Sub - Public Overrides Sub InternalOpponentPokemonMoveAnimation(ByVal BattleScreen As BattleScreen, ByVal own As Boolean, ByVal CurrentPokemon As Pokemon, ByVal CurrentEntity As NPC, ByVal CurrentModel As ModelEntity) - Dim MoveAnimation As AnimationQueryObject = New AnimationQueryObject(CurrentEntity, own) + Public Overrides Sub InternalOpponentPokemonMoveAnimation(ByVal BattleScreen As BattleScreen, ByVal BattleFlip As Boolean, ByVal CurrentPokemon As Pokemon, ByVal CurrentEntity As NPC, ByVal CurrentModel As ModelEntity) + Dim MoveAnimation As AnimationQueryObject = New AnimationQueryObject(CurrentEntity, BattleFlip) MoveAnimation.AnimationPlaySound("Battle\Attacks\Pound", 0.5, 2.5) - Dim PoundEntity = MoveAnimation.SpawnEntity(New Vector3(0.25, -0.25, -0.25), TextureManager.GetTexture("Textures\Battle\Normal\Growl", New Rectangle(0, 0, 32, 32), ""), New Vector3(0.5F), 1, 0, 3) + Dim PoundEntity = MoveAnimation.SpawnEntity(New Vector3(-0.25, -0.25, -0.25), TextureManager.GetTexture("Textures\Battle\Normal\Growl", New Rectangle(0, 0, 32, 32), ""), New Vector3(0.5F), 1, 0, 3) MoveAnimation.AnimationFade(PoundEntity, True, 1.0F, False, 0.0F, 3, 0) BattleScreen.BattleQuery.Add(MoveAnimation) End Sub diff --git a/P3D/Pokemon/Attacks/Normal/Tackle.vb b/P3D/Pokemon/Attacks/Normal/Tackle.vb index e0d981ea9..9179a9538 100644 --- a/P3D/Pokemon/Attacks/Normal/Tackle.vb +++ b/P3D/Pokemon/Attacks/Normal/Tackle.vb @@ -52,15 +52,15 @@ '#End End Sub - Public Overrides Sub InternalUserPokemonMoveAnimation(ByVal BattleScreen As BattleScreen, ByVal own As Boolean, ByVal CurrentPokemon As Pokemon, ByVal CurrentEntity As NPC, ByVal CurrentModel As ModelEntity) - Dim MoveAnimation As AnimationQueryObject = New AnimationQueryObject(CurrentEntity, own, CurrentModel) + Public Overrides Sub InternalUserPokemonMoveAnimation(ByVal BattleScreen As BattleScreen, ByVal BattleFlip As Boolean, ByVal CurrentPokemon As Pokemon, ByVal CurrentEntity As NPC, ByVal CurrentModel As ModelEntity) + Dim MoveAnimation As AnimationQueryObject = New AnimationQueryObject(CurrentEntity, BattleFlip, CurrentModel) MoveAnimation.AnimationMove(Nothing, False, -0.5F, 0, 0, 0.3F, False, False, 0, 0,,, 2) MoveAnimation.AnimationMove(Nothing, False, 0, 0, 0, 0.3F, False, False, 1, 0,,, 2) BattleScreen.BattleQuery.Add(MoveAnimation) End Sub - Public Overrides Sub InternalOpponentPokemonMoveAnimation(ByVal BattleScreen As BattleScreen, ByVal own As Boolean, ByVal CurrentPokemon As Pokemon, ByVal CurrentEntity As NPC, ByVal CurrentModel As ModelEntity) - Dim MoveAnimation As AnimationQueryObject = New AnimationQueryObject(CurrentEntity, own) + Public Overrides Sub InternalOpponentPokemonMoveAnimation(ByVal BattleScreen As BattleScreen, ByVal BattleFlip As Boolean, ByVal CurrentPokemon As Pokemon, ByVal CurrentEntity As NPC, ByVal CurrentModel As ModelEntity) + Dim MoveAnimation As AnimationQueryObject = New AnimationQueryObject(CurrentEntity, BattleFlip) MoveAnimation.AnimationPlaySound("Battle\Attacks\Normal\Tackle", 0, 0) Dim SpawnEntity = MoveAnimation.SpawnEntity(New Vector3(0, 0, 0), TextureManager.GetTexture("Textures\Battle\Normal\Tackle"), New Vector3(0.5F), 1.0F, 0, 2) MoveAnimation.AnimationFade(SpawnEntity, True, 1.0F, False, 0.0F, 2, 0) diff --git a/P3D/Pokemon/Attacks/Poison/PoisonSting.vb b/P3D/Pokemon/Attacks/Poison/PoisonSting.vb index f270a269e..7c872fc53 100644 --- a/P3D/Pokemon/Attacks/Poison/PoisonSting.vb +++ b/P3D/Pokemon/Attacks/Poison/PoisonSting.vb @@ -65,9 +65,9 @@ End If End Sub - Public Overrides Sub InternalUserPokemonMoveAnimation(ByVal BattleScreen As BattleScreen, ByVal own As Boolean, ByVal CurrentPokemon As Pokemon, ByVal CurrentEntity As NPC, ByVal CurrentModel As ModelEntity) - Dim MoveAnimation As AnimationQueryObject = New AnimationQueryObject(CurrentEntity, own) - Dim StingerEntity As Entity = MoveAnimation.SpawnEntity(New Vector3(0.0, 0.0, 0.0), TextureManager.GetTexture("Textures\Battle\Poison\Stinger"), New Vector3(0.5F), 1.0F) + Public Overrides Sub InternalUserPokemonMoveAnimation(ByVal BattleScreen As BattleScreen, ByVal BattleFlip As Boolean, ByVal CurrentPokemon As Pokemon, ByVal CurrentEntity As NPC, ByVal CurrentModel As ModelEntity) + Dim MoveAnimation As AnimationQueryObject = New AnimationQueryObject(CurrentEntity, BattleFlip) + Dim StingerEntity As Entity = MoveAnimation.SpawnEntity(Nothing, TextureManager.GetTexture("Textures\Battle\Poison\Stinger"), New Vector3(0.5F), 1.0F) MoveAnimation.AnimationPlaySound("Battle\Attacks\Poison\PoisonSting_Start", 0, 0) MoveAnimation.AnimationMove(StingerEntity, True, 2.0, 0.0, 0.0, 0.05, False, False, 0.0, 0.0,,, 0) @@ -75,12 +75,12 @@ BattleScreen.BattleQuery.Add(MoveAnimation) End Sub - Public Overrides Sub InternalOpponentPokemonMoveAnimation(ByVal BattleScreen As BattleScreen, ByVal own As Boolean, ByVal CurrentPokemon As Pokemon, ByVal CurrentEntity As NPC, ByVal CurrentModel As ModelEntity) - Dim MoveAnimation As AnimationQueryObject = New AnimationQueryObject(CurrentEntity, own) + Public Overrides Sub InternalOpponentPokemonMoveAnimation(ByVal BattleScreen As BattleScreen, ByVal BattleFlip As Boolean, ByVal CurrentPokemon As Pokemon, ByVal CurrentEntity As NPC, ByVal CurrentModel As ModelEntity) + Dim MoveAnimation As AnimationQueryObject = New AnimationQueryObject(CurrentEntity, BattleFlip) - Dim StingerEntity As Entity = MoveAnimation.SpawnEntity(New Vector3(2.0, 0, 0.0), TextureManager.GetTexture("Textures\Battle\Poison\Stinger"), New Vector3(0.5F), 1) + Dim StingerEntity As Entity = MoveAnimation.SpawnEntity(New Vector3(-2.0, 0, 0.0), TextureManager.GetTexture("Textures\Battle\Poison\Stinger"), New Vector3(0.5F), 1) - MoveAnimation.AnimationMove(StingerEntity, True, 0.0, 0.0, 0.0, 0.05, False, False, 0.0, 0.0,,, 0) + MoveAnimation.AnimationMove(StingerEntity, True, 2.0, 0.0, 0.0, 0.05, False, False, 0.0, 0.0,,, 0) MoveAnimation.AnimationPlaySound("Battle\Attacks\Poison\PoisonSting_Hit", 1, 0) From 3900fe7191ccb456606ba2d836fbc300a7e4bf58 Mon Sep 17 00:00:00 2001 From: JappaWakkaP3D <31563291+JappaWakka@users.noreply.github.com> Date: Fri, 29 Oct 2021 18:54:00 +0200 Subject: [PATCH 16/57] =?UTF-8?q?Fixed=20Spawned=20Entities=20not=20being?= =?UTF-8?q?=20removed=20after=20the=20animation=20is=20done=20+=20Made=20t?= =?UTF-8?q?he=20switch=20Pok=C3=A9mon=20animation=20look=20better?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- P3D/Battle/BattleAnimations/BAEntityMove.vb | 19 ++++- .../BattleAnimations/BAEntityOpacity.vb | 10 ++- P3D/Battle/BattleAnimations/BAEntityRotate.vb | 18 +++-- P3D/Battle/BattleAnimations/BAEntityScale.vb | 10 ++- .../BattleAnimations/BAEntityTextureChange.vb | 10 ++- .../BattleAnimations/BattleAnimation3D.vb | 6 ++ P3D/Battle/BattleSystemV2/Battle.vb | 27 +++---- .../QueryObjects/AnimationQueryObject.vb | 80 ++++++++++--------- P3D/Pokemon/Attacks/Fire/Ember.vb | 4 +- P3D/Pokemon/Attacks/Poison/PoisonSting.vb | 2 +- 10 files changed, 117 insertions(+), 69 deletions(-) diff --git a/P3D/Battle/BattleAnimations/BAEntityMove.vb b/P3D/Battle/BattleAnimations/BAEntityMove.vb index cb5fa1e0e..daf6a2eba 100644 --- a/P3D/Battle/BattleAnimations/BAEntityMove.vb +++ b/P3D/Battle/BattleAnimations/BAEntityMove.vb @@ -5,6 +5,7 @@ Public TargetEntity As Entity Public Destination As Vector3 Public MoveSpeed As Single + Public MoveYSpeed As Single Public InterpolationSpeed As Single Public SpinX As Boolean = False Public SpinZ As Boolean = False @@ -13,6 +14,7 @@ Public MovementCurve As Integer = 3 Private EasedIn As Boolean = False Private EasedOut As Boolean = False + Public RemoveEntityAfter As Boolean Public Enum Curves As Integer EaseIn EaseOut @@ -20,11 +22,17 @@ Linear End Enum - Public Sub New(ByRef Entity As Entity, ByVal Destination As Vector3, ByVal Speed As Single, ByVal SpinX As Boolean, ByVal SpinZ As Boolean, ByVal startDelay As Single, ByVal endDelay As Single, Optional ByVal SpinXSpeed As Single = 0.1F, Optional ByVal SpinZSpeed As Single = 0.1F, Optional MovementCurve As Integer = 3) + Public Sub New(ByRef Entity As Entity, ByVal RemoveEntityAfter As Boolean, ByVal Destination As Vector3, ByVal Speed As Single, ByVal SpinX As Boolean, ByVal SpinZ As Boolean, ByVal startDelay As Single, ByVal endDelay As Single, Optional ByVal SpinXSpeed As Single = 0.1F, Optional ByVal SpinZSpeed As Single = 0.1F, Optional MovementCurve As Integer = 3, Optional MoveYSpeed As Single = 0.0F) MyBase.New(New Vector3(0.0F), TextureManager.DefaultTexture, New Vector3(1.0F), startDelay, endDelay) + Me.RemoveEntityAfter = RemoveEntityAfter Me.Destination = Destination Me.MoveSpeed = Speed + If MoveYSpeed = 0F Then + Me.MoveYSpeed = MoveSpeed + Else + Me.MoveYSpeed = MoveYSpeed + End If Me.MovementCurve = CType(MovementCurve, Curves) Me.SpinX = SpinX @@ -121,13 +129,13 @@ End If End If If TargetEntity.Position.Y < Me.Destination.Y Then - TargetEntity.Position.Y += Me.MoveSpeed + TargetEntity.Position.Y += Me.MoveYSpeed If TargetEntity.Position.Y >= Me.Destination.Y Then TargetEntity.Position.Y = Me.Destination.Y End If ElseIf TargetEntity.Position.Y > Me.Destination.Y Then - TargetEntity.Position.Y -= Me.MoveSpeed + TargetEntity.Position.Y -= Me.MoveYSpeed If TargetEntity.Position.Y <= Me.Destination.Y Then TargetEntity.Position.Y = Me.Destination.Y @@ -185,5 +193,10 @@ Me.Ready = True End If End Sub + Public Overrides Sub DoRemoveEntity() + If Me.RemoveEntityAfter = True Then + TargetEntity.CanBeRemoved = True + End If + End Sub End Class \ No newline at end of file diff --git a/P3D/Battle/BattleAnimations/BAEntityOpacity.vb b/P3D/Battle/BattleAnimations/BAEntityOpacity.vb index 959d733b5..0f6fe5f55 100644 --- a/P3D/Battle/BattleAnimations/BAEntityOpacity.vb +++ b/P3D/Battle/BattleAnimations/BAEntityOpacity.vb @@ -6,9 +6,11 @@ Public TransitionSpeed As Single = 0.01F Public FadeIn As Boolean = False Public EndState As Single = 0.0F + Public RemoveEntityAfter As Boolean - Public Sub New(ByVal entity As Entity, ByVal TransitionSpeed As Single, ByVal FadeIn As Boolean, ByVal EndState As Single, ByVal startDelay As Single, ByVal endDelay As Single, Optional ByVal StartState As Single = 1.0F) + Public Sub New(ByVal entity As Entity, ByVal RemoveEntityAfter As Boolean, ByVal TransitionSpeed As Single, ByVal FadeIn As Boolean, ByVal EndState As Single, ByVal startDelay As Single, ByVal endDelay As Single, Optional ByVal StartState As Single = 1.0F) MyBase.New(New Vector3(0.0F), TextureManager.DefaultTexture, New Vector3(1.0F), startDelay, endDelay) + Me.RemoveEntityAfter = RemoveEntityAfter Me.EndState = EndState Me.FadeIn = FadeIn Me.TransitionSpeed = TransitionSpeed @@ -41,5 +43,9 @@ Me.Ready = True End If End Sub - + Public Overrides Sub DoRemoveEntity() + If Me.RemoveEntityAfter = True Then + TargetEntity.CanBeRemoved = True + End If + End Sub End Class \ No newline at end of file diff --git a/P3D/Battle/BattleAnimations/BAEntityRotate.vb b/P3D/Battle/BattleAnimations/BAEntityRotate.vb index cbcda0f7b..2ac3c8b7e 100644 --- a/P3D/Battle/BattleAnimations/BAEntityRotate.vb +++ b/P3D/Battle/BattleAnimations/BAEntityRotate.vb @@ -9,18 +9,19 @@ Dim ReturnVector As Vector3 Dim hasReturned As Boolean = False Dim DoRotation As Vector3 = New Vector3(1.0F) + Public RemoveEntityAfter As Boolean = False - Public Sub New(ByVal Entity As Entity, ByVal RotationSpeedVector As Vector3, ByVal EndRotation As Vector3, ByVal startDelay As Single, ByVal endDelay As Single) + Public Sub New(ByVal Entity As Entity, ByVal RemoveEntityAfter As Boolean, ByVal RotationSpeedVector As Vector3, ByVal EndRotation As Vector3, ByVal startDelay As Single, ByVal endDelay As Single) MyBase.New(New Vector3(0.0F), TextureManager.DefaultTexture, New Vector3(1.0F), startDelay, endDelay) - + Me.RemoveEntityAfter = RemoveEntityAfter Me.RotationSpeedVector = RotationSpeedVector Me.EndRotation = EndRotation Me.ReturnVector = Me.Rotation Me.TargetEntity = Entity End Sub - Public Sub New(ByVal Entity As Entity, ByVal RotationSpeedVector As Vector3, ByVal EndRotation As Vector3, ByVal startDelay As Single, ByVal endDelay As Single, ByVal DoXRotation As Boolean, ByVal DoYRotation As Boolean, ByVal DoZRotation As Boolean) - Me.New(Entity, RotationSpeedVector, EndRotation, startDelay, endDelay) + Public Sub New(ByVal Entity As Entity, ByVal RemoveEntityAfter As Boolean, ByVal RotationSpeedVector As Vector3, ByVal EndRotation As Vector3, ByVal startDelay As Single, ByVal endDelay As Single, ByVal DoXRotation As Boolean, ByVal DoYRotation As Boolean, ByVal DoZRotation As Boolean) + Me.New(Entity, RemoveEntityAfter, RotationSpeedVector, EndRotation, startDelay, endDelay) If DoXRotation = False Then DoRotation.X = 0.0F @@ -33,8 +34,8 @@ End If End Sub - Public Sub New(ByVal Entity As Entity, ByVal RotationSpeedVector As Vector3, ByVal EndRotation As Vector3, ByVal startDelay As Single, ByVal endDelay As Single, ByVal DoXRotation As Boolean, ByVal DoYRotation As Boolean, ByVal DoZRotation As Boolean, ByVal DoReturn As Boolean) - Me.New(Entity, RotationSpeedVector, EndRotation, startDelay, endDelay, DoXRotation, DoYRotation, DoZRotation) + Public Sub New(ByVal Entity As Entity, ByVal RemoveEntityAfter As Boolean, ByVal RotationSpeedVector As Vector3, ByVal EndRotation As Vector3, ByVal startDelay As Single, ByVal endDelay As Single, ByVal DoXRotation As Boolean, ByVal DoYRotation As Boolean, ByVal DoZRotation As Boolean, ByVal DoReturn As Boolean) + Me.New(Entity, RemoveEntityAfter, RotationSpeedVector, EndRotation, startDelay, endDelay, DoXRotation, DoYRotation, DoZRotation) Me.DoReturn = DoReturn End Sub @@ -128,4 +129,9 @@ Return True End Function + Public Overrides Sub DoRemoveEntity() + If Me.RemoveEntityAfter = True Then + TargetEntity.CanBeRemoved = True + End If + End Sub End Class \ No newline at end of file diff --git a/P3D/Battle/BattleAnimations/BAEntityScale.vb b/P3D/Battle/BattleAnimations/BAEntityScale.vb index 1e687de4c..a99c261dd 100644 --- a/P3D/Battle/BattleAnimations/BAEntityScale.vb +++ b/P3D/Battle/BattleAnimations/BAEntityScale.vb @@ -9,10 +9,11 @@ Public Anchors As String '1 = Bottom, 2 = Top, 3 = Left, 4 = Right. Combinations are possible. Public Change As New Vector3(1) + Public RemoveEntityAfter As Boolean - Public Sub New(ByVal Entity As Entity, ByVal Scale As Vector3, ByVal Grow As Boolean, ByVal EndSize As Vector3, ByVal SizeSpeed As Single, ByVal startDelay As Single, ByVal endDelay As Single, ByVal Anchors As String) + Public Sub New(ByVal Entity As Entity, ByVal RemoveEntityAfter As Boolean, ByVal Scale As Vector3, ByVal Grow As Boolean, ByVal EndSize As Vector3, ByVal SizeSpeed As Single, ByVal startDelay As Single, ByVal endDelay As Single, ByVal Anchors As String) MyBase.New(New Vector3(0.0F), TextureManager.DefaultTexture, Scale, startDelay, endDelay) - + Me.RemoveEntityAfter = RemoveEntityAfter Me.Anchors = Anchors Me.Grow = Grow Me.EndSize = EndSize @@ -104,5 +105,10 @@ Public Sub SetChange(ByVal changeX As Single, ByVal changeY As Single, ByVal changeZ As Single) Me.Change = New Vector3(changeX, changeY, changeZ) End Sub + Public Overrides Sub DoRemoveEntity() + If Me.RemoveEntityAfter = True Then + TargetEntity.CanBeRemoved = True + End If + End Sub End Class \ No newline at end of file diff --git a/P3D/Battle/BattleAnimations/BAEntityTextureChange.vb b/P3D/Battle/BattleAnimations/BAEntityTextureChange.vb index 4b266b706..ced0d473b 100644 --- a/P3D/Battle/BattleAnimations/BAEntityTextureChange.vb +++ b/P3D/Battle/BattleAnimations/BAEntityTextureChange.vb @@ -4,10 +4,11 @@ Public Texture As Texture2D Public TargetEntity As Entity + Public RemoveEntityAfter As Boolean - Public Sub New(ByVal Entity As Entity, Texture As Texture2D, ByVal startDelay As Single, ByVal endDelay As Single) + Public Sub New(ByVal Entity As Entity, ByVal RemoveEntityAfter As Boolean, Texture As Texture2D, ByVal startDelay As Single, ByVal endDelay As Single) MyBase.New(New Vector3(0.0F), TextureManager.DefaultTexture, New Vector3(1.0F), startDelay, endDelay) - + Me.RemoveEntityAfter = RemoveEntityAfter Me.TargetEntity = Entity Me.Texture = Texture Me.AnimationType = AnimationTypes.Texture @@ -18,4 +19,9 @@ Me.Ready = True End Sub + Public Overrides Sub DoRemoveEntity() + If Me.RemoveEntityAfter = True Then + TargetEntity.CanBeRemoved = True + End If + End Sub End Class \ No newline at end of file diff --git a/P3D/Battle/BattleAnimations/BattleAnimation3D.vb b/P3D/Battle/BattleAnimations/BattleAnimation3D.vb index 48e63f3a0..1eb6bfeb2 100644 --- a/P3D/Battle/BattleAnimations/BattleAnimation3D.vb +++ b/P3D/Battle/BattleAnimations/BattleAnimation3D.vb @@ -50,6 +50,7 @@ End If Else CanRemove = True + DoRemoveEntity() End If Else If startDelay > 0.0F Then @@ -61,6 +62,8 @@ Else If SpawnedEntity = True Then Ready = True + Else + Me.Visible = True End If DoActionActive() End If @@ -87,6 +90,9 @@ Public Overridable Sub DoActionActive() 'Insert code in Inherits class here. End Sub + Public Overridable Sub DoRemoveEntity() + 'Insert code in Inherits class here. + End Sub Public Overrides Sub Render() If Me.startDelay <= 0.0F Then diff --git a/P3D/Battle/BattleSystemV2/Battle.vb b/P3D/Battle/BattleSystemV2/Battle.vb index bc3d6609f..6efb7304a 100644 --- a/P3D/Battle/BattleSystemV2/Battle.vb +++ b/P3D/Battle/BattleSystemV2/Battle.vb @@ -6842,7 +6842,6 @@ Dim SmokeSpeed = CSng(Random.Next(1, 3) / 20.0F) Dim SmokeEntity As Entity = BallReturn.SpawnEntity(SmokePosition, SmokeTexture, SmokeScale, 1.0F) - BallReturn.AnimationMove(SmokeEntity, True, SmokeDestination.X, SmokeDestination.Y, SmokeDestination.Z, SmokeSpeed, False, False, 0.0F, 0.0F) Threading.Interlocked.Increment(SmokeReturned) @@ -6900,7 +6899,7 @@ BallThrow.AnimationPlaySound("Battle\Pokeball\Throw", 0, 0) Dim BallThrowEntity As Entity = BallThrow.SpawnEntity(New Vector3(-2, -0.15, 0), BattleScreen.OwnPokemon.CatchBall.Texture, New Vector3(0.3F), 1.0F) - BallThrow.AnimationMove(BallThrowEntity, True, 0, 0.35, 0, 0.1, False, True, 0F, 0F,, 0.3) + BallThrow.AnimationMove(BallThrowEntity, True, 0, 0.35, 0, 0.1, False, True, 0F, 0.5F,, 0.3,, 0.025F) ' Ball Opens BallThrow.AnimationPlaySound("Battle\Pokeball\Open", 3, 0) @@ -6912,10 +6911,9 @@ Dim SmokeTexture As Texture2D = TextureManager.GetTexture("Textures\Battle\Smoke") Dim SmokeScale = New Vector3(CSng(Random.Next(2, 6) / 10)) - Dim SmokeSpeed = CSng(Random.Next(1, 3) / 10.0F) - - Dim SmokeEntity As Entity = BallThrow.SpawnEntity(Nothing, SmokeTexture, SmokeScale, 1.0F) + Dim SmokeSpeed = CSng(Random.Next(1, 3) / 20.0F) + Dim SmokeEntity As Entity = BallThrow.SpawnEntity(Nothing, SmokeTexture, SmokeScale, 1.0F, 3) BallThrow.AnimationMove(SmokeEntity, True, SmokeDestination.X, SmokeDestination.Y, SmokeDestination.Z, SmokeSpeed, False, False, 3.0F, 0.0F) Threading.Interlocked.Increment(SmokeSpawned) @@ -6923,12 +6921,12 @@ End If ' Pokemon appears - BallThrow.AnimationFade(Nothing, False, 1, True, 1, 4, 0) + BallThrow.AnimationFade(Nothing, False, 1, True, 1, 3, 0) BallThrow.AnimationPlaySound(CStr(BattleScreen.OwnPokemon.Number), 4, 0,, True) If Core.Player.ShowBattleAnimations <> 0 Then ' Pokémon falls down - BallThrow.AnimationMove(Nothing, False, 0, 0, 0, 0.05F, False, False, 4, 0,,, 3) + BallThrow.AnimationMove(Nothing, False, 0, 0, 0, 0.05F, False, False, 5, 0,,, 3) End If BattleScreen.AddToQuery(InsertIndex, BallThrow) @@ -7219,9 +7217,10 @@ Dim SmokeTexture As Texture2D = TextureManager.GetTexture("Textures\Battle\Smoke") Dim SmokeScale = New Vector3(CSng(Random.Next(2, 6) / 10)) - Dim SmokeSpeed = CSng(Random.Next(1, 3) / 10.0F) + Dim SmokeSpeed = CSng(Random.Next(1, 3) / 20.0F) Dim SmokeEntity = BallReturn.SpawnEntity(SmokePosition, SmokeTexture, SmokeScale, 1) BallReturn.AnimationMove(SmokeEntity, True, SmokeDestination.X, SmokeDestination.Y, SmokeDestination.Z, SmokeSpeed, False, False, 0.0F, 0.0F) + Threading.Interlocked.Increment(SmokeReturned) Loop While SmokeReturned <= 38 @@ -7285,7 +7284,7 @@ Dim SmokeTexture As Texture2D = TextureManager.GetTexture("Textures\Battle\Smoke") Dim SmokeScale = New Vector3(CSng(Random.Next(2, 6) / 10)) - Dim SmokeSpeed = CSng(Random.Next(1, 3) / 10.0F) + Dim SmokeSpeed = CSng(Random.Next(1, 3) / 20.0F) Dim SmokeEntity = BallReturn.SpawnEntity(SmokePosition, SmokeTexture, SmokeScale, 1) BallReturn.AnimationMove(SmokeEntity, True, SmokeDestination.X, SmokeDestination.Y, SmokeDestination.Z, SmokeSpeed, False, False, 0.0F, 0.0F) Threading.Interlocked.Increment(SmokeReturned) @@ -7333,7 +7332,7 @@ BallThrow.AnimationPlaySound("Battle\Pokeball\Throw", 0, 0) Dim BallThrowEntity = BallThrow.SpawnEntity(New Vector3(-2, -0.15, 0), BattleScreen.OwnPokemon.CatchBall.Texture, New Vector3(0.3F), 1.0F) - BallThrow.AnimationMove(BallThrowEntity, True, 0, 0.35, 0, 0.1, False, True, 0F, 0F,, 0.3) + BallThrow.AnimationMove(BallThrowEntity, True, 0, 0.35, 0, 0.1, False, True, 0F, 0.5F,, 0.3,, 0.025F) ' Ball opens BallThrow.AnimationPlaySound("Battle\Pokeball\Open", 3, 0) @@ -7345,19 +7344,19 @@ Dim SmokeTexture As Texture2D = TextureManager.GetTexture("Textures\Battle\Smoke") Dim SmokeScale = New Vector3(CSng(Random.Next(2, 6) / 10)) - Dim SmokeSpeed = CSng(Random.Next(1, 3) / 10.0F) - Dim SmokeEntity = BallThrow.SpawnEntity(SmokePosition, SmokeTexture, SmokeScale, 1) + Dim SmokeSpeed = CSng(Random.Next(1, 3) / 20.0F) + Dim SmokeEntity = BallThrow.SpawnEntity(SmokePosition, SmokeTexture, SmokeScale, 1, 3) BallThrow.AnimationMove(SmokeEntity, True, SmokeDestination.X, SmokeDestination.Y, SmokeDestination.Z, SmokeSpeed, False, False, 3.0F, 0.0F) Threading.Interlocked.Increment(SmokeSpawned) Loop While SmokeSpawned <= 38 ' Pokemon appears - BallThrow.AnimationFade(Nothing, False, 1, True, 1, 4, 0) + BallThrow.AnimationFade(Nothing, False, 1, True, 1, 3, 0) BallThrow.AnimationPlaySound(CStr(BattleScreen.OppPokemon.Number), 4, 0,, True) ' Pokémon falls down - BallThrow.AnimationMove(Nothing, False, 0, 0, 0, 0.05F, False, False, 4, 0,,, 4) + BallThrow.AnimationMove(Nothing, False, 0, 0, 0, 0.05F, False, False, 5, 0,,, 4) BattleScreen.BattleQuery.Add(BallThrow) End If diff --git a/P3D/Battle/BattleSystemV2/QueryObjects/AnimationQueryObject.vb b/P3D/Battle/BattleSystemV2/QueryObjects/AnimationQueryObject.vb index 5e1b293b4..5dda41573 100644 --- a/P3D/Battle/BattleSystemV2/QueryObjects/AnimationQueryObject.vb +++ b/P3D/Battle/BattleSystemV2/QueryObjects/AnimationQueryObject.vb @@ -79,6 +79,16 @@ Entity.Update() Entity.UpdateEntity() Next + For i = 0 To Me.SpawnedEntities.Count - 1 + If i <= SpawnedEntities.Count - 1 Then + Dim entity As Entity = SpawnedEntities(i) + + If entity.CanBeRemoved = True Then + i -= 1 + RemoveEntity(entity) + End If + End If + Next End If End Sub @@ -97,13 +107,12 @@ Else NewPosition = CurrentEntity.Position End If - Dim SpawnedEntity = New BattleAnimation3D(NewPosition, Texture, Scale, 0, 0, False) + Dim SpawnedEntity = New BattleAnimation3D(NewPosition, Texture, Scale, startDelay, endDelay, False) SpawnedEntity.Opacity = Opacity + SpawnedEntity.Visible = False SpawnedEntities.Add(SpawnedEntity) - Dim SpawnDelayEntity As BattleAnimation3D = New BattleAnimation3D(New Vector3(0.0F), TextureManager.DefaultTexture, New Vector3(1.0F), startDelay, endDelay, True) - AnimationSequence.Add(SpawnDelayEntity) Return SpawnedEntity End Function Public Sub RemoveEntity(Entity As Entity) @@ -118,17 +127,12 @@ TextureChangeEntity = Entity End If - Dim baEntityTextureChange As BAEntityTextureChange = New BAEntityTextureChange(TextureChangeEntity, Texture, startDelay, endDelay) + Dim baEntityTextureChange As BAEntityTextureChange = New BAEntityTextureChange(TextureChangeEntity, RemoveEntityAfter, Texture, startDelay, endDelay) AnimationSequence.Add(baEntityTextureChange) - If RemoveEntityAfter = True Then - If baEntityTextureChange.CanRemove = True Then - RemoveEntity(TextureChangeEntity) - End If - End If End Sub - Public Sub AnimationMove(ByVal Entity As Entity, ByVal RemoveEntityAfter As Boolean, ByVal DestinationX As Single, ByVal DestinationY As Single, ByVal DestinationZ As Single, ByVal Speed As Single, ByVal SpinX As Boolean, ByVal SpinZ As Boolean, ByVal startDelay As Single, ByVal endDelay As Single, Optional ByVal SpinXSpeed As Single = 0.1F, Optional ByVal SpinZSpeed As Single = 0.1F, Optional MovementCurve As Integer = 3) + Public Sub AnimationMove(ByVal Entity As Entity, ByVal RemoveEntityAfter As Boolean, ByVal DestinationX As Single, ByVal DestinationY As Single, ByVal DestinationZ As Single, ByVal Speed As Single, ByVal SpinX As Boolean, ByVal SpinZ As Boolean, ByVal startDelay As Single, ByVal endDelay As Single, Optional ByVal SpinXSpeed As Single = 0.1F, Optional ByVal SpinZSpeed As Single = 0.1F, Optional MovementCurve As Integer = 3, Optional MoveYSpeed As Single = 0.0F) Dim MoveEntity As Entity Dim ModelEntity As Entity = Nothing Dim Destination As Vector3 @@ -139,7 +143,7 @@ ModelEntity = Me.CurrentModel End If Else - MoveEntity = Entity + MoveEntity = Entity End If If Not BattleFlipped = Nothing Then @@ -154,77 +158,79 @@ Destination = CurrentEntity.Position + New Vector3(DestinationX, DestinationY, DestinationZ) End If - Dim baEntityMove As BAEntityMove = New BAEntityMove(MoveEntity, Destination, Speed, SpinX, SpinZ, startDelay, endDelay, SpinXSpeed, SpinZSpeed, MovementCurve) + Dim baEntityMove As BAEntityMove = New BAEntityMove(MoveEntity, RemoveEntityAfter, Destination, Speed, SpinX, SpinZ, startDelay, endDelay, SpinXSpeed, SpinZSpeed, MovementCurve, MoveYSpeed) AnimationSequence.Add(baEntityMove) If ModelEntity IsNot Nothing Then - Dim baModelMove As BAEntityMove = New BAEntityMove(CType(CurrentModel, Entity), Destination, Speed, SpinX, SpinZ, startDelay, endDelay, SpinXSpeed, SpinZSpeed, MovementCurve) + Dim baModelMove As BAEntityMove = New BAEntityMove(CType(CurrentModel, Entity), False, Destination, Speed, SpinX, SpinZ, startDelay, endDelay, SpinXSpeed, SpinZSpeed, MovementCurve, MoveYSpeed) AnimationSequence.Add(baModelMove) End If - If RemoveEntityAfter = True Then - If baEntityMove.CanRemove = True Then - RemoveEntity(MoveEntity) - End If - End If End Sub Public Sub AnimationFade(ByVal Entity As Entity, ByVal RemoveEntityAfter As Boolean, ByVal TransitionSpeed As Single, ByVal FadeIn As Boolean, ByVal EndState As Single, ByVal startDelay As Single, ByVal endDelay As Single, Optional ByVal startState As Single = -1.0F) Dim FadeEntity As Entity + Dim FadeModel As Entity = Nothing If Entity Is Nothing Then FadeEntity = CurrentEntity + If Me.CurrentModel IsNot Nothing Then + FadeModel = Me.CurrentModel + End If Else FadeEntity = Entity End If If startState = -1.0F Then startState = FadeEntity.Opacity - Dim baEntityOpacity As BAEntityOpacity = New BAEntityOpacity(FadeEntity, TransitionSpeed, FadeIn, EndState, startDelay, endDelay, startState) + Dim baEntityOpacity As BAEntityOpacity = New BAEntityOpacity(FadeEntity, RemoveEntityAfter, TransitionSpeed, FadeIn, EndState, startDelay, endDelay, startState) AnimationSequence.Add(baEntityOpacity) - If Me.CurrentModel IsNot Nothing Then - Dim baModelOpacity As BAEntityOpacity = New BAEntityOpacity(CType(CurrentModel, Entity), TransitionSpeed, FadeIn, EndState, startDelay, endDelay, startState) + If FadeModel IsNot Nothing Then + Dim baModelOpacity As BAEntityOpacity = New BAEntityOpacity(CType(FadeModel, Entity), False, TransitionSpeed, FadeIn, EndState, startDelay, endDelay, startState) AnimationSequence.Add(baModelOpacity) End If - If RemoveEntityAfter = True Then - If baEntityOpacity.CanRemove = True Then - RemoveEntity(FadeEntity) - End If - End If End Sub Public Sub AnimationRotate(Entity As Entity, ByVal RemoveEntityAfter As Boolean, ByVal RotationSpeedX As Single, ByVal RotationSpeedY As Single, ByVal RotationSpeedZ As Single, ByVal EndRotationX As Single, ByVal EndRotationY As Single, ByVal EndRotationZ As Single, ByVal startDelay As Single, ByVal endDelay As Single, ByVal DoXRotation As Boolean, ByVal DoYRotation As Boolean, ByVal DoZRotation As Boolean, ByVal DoReturn As Boolean) Dim RotateEntity As Entity + Dim RotateModel As Entity = Nothing If Entity Is Nothing Then RotateEntity = CurrentEntity + If Me.CurrentModel IsNot Nothing Then + RotateModel = Me.CurrentModel + End If Else RotateEntity = Entity End If Dim RotationSpeedVector As Vector3 = New Vector3(RotationSpeedX, RotationSpeedY, RotationSpeedZ) Dim EndRotation As Vector3 = New Vector3(EndRotationX, EndRotationY, EndRotationZ) - Dim baEntityRotate As BAEntityRotate = New BAEntityRotate(RotateEntity, RotationSpeedVector, EndRotation, startDelay, endDelay, DoXRotation, DoYRotation, DoZRotation, DoReturn) + Dim baEntityRotate As BAEntityRotate = New BAEntityRotate(RotateEntity, RemoveEntityAfter, RotationSpeedVector, EndRotation, startDelay, endDelay, DoXRotation, DoYRotation, DoZRotation, DoReturn) AnimationSequence.Add(baEntityRotate) - If RemoveEntityAfter = True Then - If baEntityRotate.CanRemove = True Then - RemoveEntity(RotateEntity) - End If + + If RotateModel IsNot Nothing Then + Dim baModelOpacity As BAEntityRotate = New BAEntityRotate(CType(RotateModel, Entity), False, RotationSpeedVector, EndRotation, startDelay, endDelay, DoXRotation, DoYRotation, DoZRotation, DoReturn) + AnimationSequence.Add(baModelOpacity) End If + End Sub Public Sub AnimationScale(ByVal Entity As Entity, ByVal RemoveEntityAfter As Boolean, ByVal Grow As Boolean, ByVal EndSizeX As Single, ByVal EndSizeY As Single, ByVal EndSizeZ As Single, ByVal SizeSpeed As Single, ByVal startDelay As Single, ByVal endDelay As Single, Optional ByVal Anchors As String = "1") Dim ScaleEntity As Entity + Dim ScaleModel As Entity = Nothing If Entity Is Nothing Then ScaleEntity = CurrentEntity + If Me.CurrentModel IsNot Nothing Then + ScaleModel = Me.CurrentModel + End If Else ScaleEntity = Entity End If Dim Scale As Vector3 = ScaleEntity.Scale Dim EndSize As Vector3 = New Vector3(EndSizeX, EndSizeY, EndSizeZ) - Dim baBillSize As BAEntityScale = New BAEntityScale(ScaleEntity, Scale, Grow, EndSize, SizeSpeed, startDelay, endDelay, Anchors) - AnimationSequence.Add(baBillSize) - If RemoveEntityAfter = True Then - If baBillSize.CanRemove = True Then - RemoveEntity(ScaleEntity) - End If + Dim baEntityScale As BAEntityScale = New BAEntityScale(ScaleEntity, RemoveEntityAfter, Scale, Grow, EndSize, SizeSpeed, startDelay, endDelay, Anchors) + AnimationSequence.Add(baEntityScale) + + If ScaleModel IsNot Nothing Then + Dim baModelScale As BAEntityScale = New BAEntityScale(CType(ScaleModel, Entity), False, Scale, Grow, EndSize, SizeSpeed, startDelay, endDelay, Anchors) End If End Sub diff --git a/P3D/Pokemon/Attacks/Fire/Ember.vb b/P3D/Pokemon/Attacks/Fire/Ember.vb index a1dbe0b35..d8e04c15a 100644 --- a/P3D/Pokemon/Attacks/Fire/Ember.vb +++ b/P3D/Pokemon/Attacks/Fire/Ember.vb @@ -82,10 +82,10 @@ Dim MoveAnimation = New AnimationQueryObject(CurrentEntity, BattleFlip) Dim FireballEntity = MoveAnimation.SpawnEntity(New Vector3(-2.0, 0.0, 0.0), TextureManager.GetTexture("Textures\Battle\Fire\FireBall"), New Vector3(0.5F), 1.0F) - MoveAnimation.AnimationMove(FireballEntity, True, 2.0, 0.0, 0.0, 0.05, False, True, 0.0, 0.0,, -0.5, 0) + MoveAnimation.AnimationMove(FireballEntity, True, 0.0, 0.0, 0.0, 0.05, False, True, 0.0, 0.0,, -0.5, 0) For i = 0 To 12 - Dim SmokeEntity = MoveAnimation.SpawnEntity(New Vector3(CSng(-2.0 + i * 0.2), 0.0, 0.0), TextureManager.GetTexture("Textures\Battle\Fire\Smoke"), New Vector3(0.2), 1, CSng(i * 0.2)) + Dim SmokeEntity = MoveAnimation.SpawnEntity(New Vector3(CSng(-3.0 + i * 0.2), 0.0, 0.0), TextureManager.GetTexture("Textures\Battle\Fire\Smoke"), New Vector3(0.2), 1, CSng(i * 0.2)) MoveAnimation.AnimationFade(SmokeEntity, True, 0.02, False, 0.0, CSng(i * 0.2), 0.0) i += 1 diff --git a/P3D/Pokemon/Attacks/Poison/PoisonSting.vb b/P3D/Pokemon/Attacks/Poison/PoisonSting.vb index 7c872fc53..8104dbcd4 100644 --- a/P3D/Pokemon/Attacks/Poison/PoisonSting.vb +++ b/P3D/Pokemon/Attacks/Poison/PoisonSting.vb @@ -80,7 +80,7 @@ Dim StingerEntity As Entity = MoveAnimation.SpawnEntity(New Vector3(-2.0, 0, 0.0), TextureManager.GetTexture("Textures\Battle\Poison\Stinger"), New Vector3(0.5F), 1) - MoveAnimation.AnimationMove(StingerEntity, True, 2.0, 0.0, 0.0, 0.05, False, False, 0.0, 0.0,,, 0) + MoveAnimation.AnimationMove(StingerEntity, True, 0.0, 0.0, 0.0, 0.05, False, False, 0.0, 0.0,,, 0) MoveAnimation.AnimationPlaySound("Battle\Attacks\Poison\PoisonSting_Hit", 1, 0) From 4b3b900e40202ada7463191f6b8a1e1852f3cb88 Mon Sep 17 00:00:00 2001 From: "Jasper \"JappaWakka\" Speelman" <31563291+JappaWakka@users.noreply.github.com> Date: Fri, 5 Nov 2021 23:09:33 +0100 Subject: [PATCH 17/57] Start of battle pokeball throw animation and some little fixes --- P3D/Battle/BattleSystemV2/Battle.vb | 16 +- P3D/Battle/BattleSystemV2/BattleScreen.vb | 232 +++++++++++++++++++--- 2 files changed, 208 insertions(+), 40 deletions(-) diff --git a/P3D/Battle/BattleSystemV2/Battle.vb b/P3D/Battle/BattleSystemV2/Battle.vb index 6efb7304a..0a74526d1 100644 --- a/P3D/Battle/BattleSystemV2/Battle.vb +++ b/P3D/Battle/BattleSystemV2/Battle.vb @@ -7227,7 +7227,7 @@ ' Pokemon disappears BallReturn.AnimationFade(Nothing, False, 1, False, 0, 1, 0) - BallReturn.AnimationMove(Nothing, False, 0, 0.5, 0, 0.5, False, False, 2, 0,,, 4) + BallReturn.AnimationMove(Nothing, False, 0, 0.5, 0, 0.5, False, False, 2, 0,,, 3) ' Ball returns BallReturn.AnimationPlaySound("Battle\Pokeball\Throw", 1, 0) @@ -7292,7 +7292,7 @@ ' Pokemon disappears BallReturn.AnimationFade(Nothing, False, 1, False, 0, 1, 0) - BallReturn.AnimationMove(Nothing, False, 0, 0.5, 0, 0.5, False, False, 2, 0,,, 4) + BallReturn.AnimationMove(Nothing, False, 0, 0.5, 0, 0.5, False, False, 2, 0,,, 3) ' Ball returns BallReturn.AnimationPlaySound("Battle\Pokeball\Throw", 1, 0) @@ -7326,12 +7326,12 @@ BattleScreen.BattleQuery.Add(New ToggleEntityQueryObject(True, ToggleEntityQueryObject.BattleEntities.OppPokemon, 1, -1, -1, -1, -1)) BattleScreen.BattleQuery.Add(New TextQueryObject(BattleScreen.Trainer.Name & ": ""Go, " & BattleScreen.OppPokemon.GetDisplayName() & "!""")) + Dim BallThrow As AnimationQueryObject = New AnimationQueryObject(BattleScreen.OppPokemonNPC, True, BattleScreen.OppPokemonModel) If Core.Player.ShowBattleAnimations <> 0 Then ' Ball is thrown - Dim BallThrow As AnimationQueryObject = New AnimationQueryObject(BattleScreen.OppPokemonNPC, True, BattleScreen.OppPokemonModel) BallThrow.AnimationPlaySound("Battle\Pokeball\Throw", 0, 0) - Dim BallThrowEntity = BallThrow.SpawnEntity(New Vector3(-2, -0.15, 0), BattleScreen.OwnPokemon.CatchBall.Texture, New Vector3(0.3F), 1.0F) + Dim BallThrowEntity = BallThrow.SpawnEntity(New Vector3(-2, -0.15, 0), BattleScreen.OppPokemon.CatchBall.Texture, New Vector3(0.3F), 1.0F) BallThrow.AnimationMove(BallThrowEntity, True, 0, 0.35, 0, 0.1, False, True, 0F, 0.5F,, 0.3,, 0.025F) ' Ball opens @@ -7350,11 +7350,11 @@ BallThrow.AnimationMove(SmokeEntity, True, SmokeDestination.X, SmokeDestination.Y, SmokeDestination.Z, SmokeSpeed, False, False, 3.0F, 0.0F) Threading.Interlocked.Increment(SmokeSpawned) Loop While SmokeSpawned <= 38 - - ' Pokemon appears - BallThrow.AnimationFade(Nothing, False, 1, True, 1, 3, 0) + End If + ' Pokemon appears + BallThrow.AnimationFade(Nothing, False, 1, True, 1, 3, 0) BallThrow.AnimationPlaySound(CStr(BattleScreen.OppPokemon.Number), 4, 0,, True) - + If Core.Player.ShowBattleAnimations <> 0 Then ' Pokémon falls down BallThrow.AnimationMove(Nothing, False, 0, 0, 0, 0.05F, False, False, 5, 0,,, 4) diff --git a/P3D/Battle/BattleSystemV2/BattleScreen.vb b/P3D/Battle/BattleSystemV2/BattleScreen.vb index f96d4e96d..e2d56b0df 100644 --- a/P3D/Battle/BattleSystemV2/BattleScreen.vb +++ b/P3D/Battle/BattleSystemV2/BattleScreen.vb @@ -225,12 +225,17 @@ Dim ownModel As String = GetModelName(True) Dim oppModel As String = GetModelName(False) + Dim InitiallyVisibleOwn As Integer = 1 + If Core.Player.ShowBattleAnimations <> 0 Then + InitiallyVisibleOwn = 0 + End If + If ownModel = "" Then - OwnPokemonNPC = CType(Entity.GetNewEntity("NPC", New Vector3(12, 0, 13) + BattleMapOffset, {Nothing}, {0, 0}, False, New Vector3(0), New Vector3(1), BaseModel.BillModel, 0, "", True, New Vector3(1), 1, "", "", New Vector3(0), {PokemonForms.GetOverworldSpriteName(OwnPokemon), 3, WildPokemon.GetDisplayName(), 0, True, "Still", New List(Of Rectangle)}), NPC) + OwnPokemonNPC = CType(Entity.GetNewEntity("NPC", New Vector3(12, 0, 13) + BattleMapOffset, {Nothing}, {0, 0}, False, New Vector3(0), New Vector3(1), BaseModel.BillModel, 0, "", True, New Vector3(1), 1, "", "", New Vector3(0), {PokemonForms.GetOverworldSpriteName(OwnPokemon), 3, WildPokemon.GetDisplayName(), 0, True, "Still", New List(Of Rectangle)}, InitiallyVisibleOwn), NPC) OwnPokemonModel = CType(Entity.GetNewEntity("ModelEntity", New Vector3(12, -0.5F, 13) + BattleMapOffset, {}, {}, False, New Vector3(MathHelper.Pi * 0.5F, MathHelper.Pi * 0.5F, 0), New Vector3(0.07F), BaseModel.BlockModel, 0, "Models\Bulbasaur\Normal", False, New Vector3(1), 0, "", "", New Vector3(0), Nothing), ModelEntity) Else OwnPokemonNPC = CType(Entity.GetNewEntity("NPC", New Vector3(12, 0, 13) + BattleMapOffset, {Nothing}, {0, 0}, False, New Vector3(0), New Vector3(1), BaseModel.BillModel, 0, "", False, New Vector3(1), 0, "", "", New Vector3(0), {PokemonForms.GetOverworldSpriteName(OwnPokemon), 3, WildPokemon.GetDisplayName(), 0, True, "Still", New List(Of Rectangle)}), NPC) - OwnPokemonModel = CType(Entity.GetNewEntity("ModelEntity", New Vector3(12, -0.5F, 13) + BattleMapOffset, {}, {}, False, New Vector3(MathHelper.Pi * 0.5F, MathHelper.Pi * 0.5F, 0), New Vector3(0.07F), BaseModel.BlockModel, 1, ownModel, True, New Vector3(1), 0, "", "", New Vector3(0), Nothing), ModelEntity) + OwnPokemonModel = CType(Entity.GetNewEntity("ModelEntity", New Vector3(12, -0.5F, 13) + BattleMapOffset, {}, {}, False, New Vector3(MathHelper.Pi * 0.5F, MathHelper.Pi * 0.5F, 0), New Vector3(0.07F), BaseModel.BlockModel, 1, ownModel, True, New Vector3(1), 0, "", "", New Vector3(0), Nothing, InitiallyVisibleOwn), ModelEntity) End If Screen.Level.Entities.Add(OwnPokemonNPC) @@ -276,9 +281,50 @@ Dim q3 As CameraQueryObject = New CameraQueryObject(New Vector3(14, 0, 11), New Vector3(14, 0, 15), 0.01F, 0.01F, MathHelper.PiOver2, MathHelper.PiOver2, 0.0F, 0.0F) q3.PassThis = True - Dim q31 As New PlaySoundQueryObject(OwnPokemon.Number.ToString(), True, 3.0F) Dim q4 As TextQueryObject = New TextQueryObject("Go, " & Me.OwnPokemon.GetDisplayName() & "!") + Me.BattleQuery.AddRange({cq, q1, q, q2, q22, q3, q4}) + + ' Ball is thrown + Dim BallThrow As AnimationQueryObject = New AnimationQueryObject(Me.OwnPokemonNPC, False, Me.OwnPokemonModel) + + If Core.Player.ShowBattleAnimations <> 0 Then + BallThrow.AnimationPlaySound("Battle\Pokeball\Throw", 0, 0) + BallThrow.AnimationMove(Nothing, False, 0, 0.5, 0, 0.5, False, False, 2, 0,,, 3) + + Dim BallThrowEntity As Entity = BallThrow.SpawnEntity(New Vector3(-2, -0.15, 0), Me.OwnPokemon.CatchBall.Texture, New Vector3(0.3F), 1.0F) + BallThrow.AnimationMove(BallThrowEntity, True, 0, 0.35, 0, 0.1, False, True, 0F, 0.5F,, 0.3,, 0.025F) + + ' Ball Opens + BallThrow.AnimationPlaySound("Battle\Pokeball\Open", 3, 0) + + Dim SmokeSpawned As Integer = 0 + Do + Dim SmokeDestination = New Vector3(CSng(Random.Next(-10, 10) / 10), CSng(Random.Next(-10, 10) / 10), CSng(Random.Next(-10, 10) / 10)) + + Dim SmokeTexture As Texture2D = TextureManager.GetTexture("Textures\Battle\Smoke") + + Dim SmokeScale = New Vector3(CSng(Random.Next(2, 6) / 10)) + Dim SmokeSpeed = CSng(Random.Next(1, 3) / 20.0F) + + Dim SmokeEntity As Entity = BallThrow.SpawnEntity(Nothing, SmokeTexture, SmokeScale, 1.0F, 3) + BallThrow.AnimationMove(SmokeEntity, True, SmokeDestination.X, SmokeDestination.Y, SmokeDestination.Z, SmokeSpeed, False, False, 3.0F, 0.0F) + + Threading.Interlocked.Increment(SmokeSpawned) + Loop While SmokeSpawned <= 38 + End If + + ' Pokemon appears + BallThrow.AnimationFade(Nothing, False, 1, True, 1, 3, 0) + BallThrow.AnimationPlaySound(CStr(Me.OwnPokemon.Number), 4, 0,, True) + + If Core.Player.ShowBattleAnimations <> 0 Then + ' Pokémon falls down + BallThrow.AnimationMove(Nothing, False, 0, 0, 0, 0.05F, False, False, 5, 0,,, 3) + End If + + Me.BattleQuery.Add(BallThrow) + Dim q5 As ToggleMenuQueryObject = New ToggleMenuQueryObject(Me.BattleMenu.Visible) Dim cq1 As ScreenFadeQueryObject = New ScreenFadeQueryObject(ScreenFadeQueryObject.FadeTypes.Vertical, Color.Black, True, 16) @@ -286,8 +332,6 @@ cq2.PassThis = True - Me.BattleQuery.AddRange({cq, q1, q, q2, q22, q3, q31, q4}) - Battle.SwitchInOwn(Me, meIndex, True, -1) Battle.SwitchInOpp(Me, True, 0) @@ -359,23 +403,33 @@ Dim ownModel As String = GetModelName(True) Dim oppModel As String = GetModelName(False) + Dim InitiallyVisibleOwn As Integer = 1 + If Core.Player.ShowBattleAnimations <> 0 Then + InitiallyVisibleOwn = 0 + End If + If ownModel = "" Then - OwnPokemonNPC = CType(Entity.GetNewEntity("NPC", New Vector3(12, 0, 12.5F) + BattleMapOffset, {Nothing}, {0, 0}, False, New Vector3(0), New Vector3(1), BaseModel.BillModel, 0, "", True, New Vector3(1), 1, "", "", New Vector3(0), {PokemonForms.GetOverworldSpriteName(OwnPokemon), 3, OwnPokemon.GetDisplayName(), 0, True, "Still", New List(Of Rectangle)}), NPC) + OwnPokemonNPC = CType(Entity.GetNewEntity("NPC", New Vector3(12, 0, 13) + BattleMapOffset, {Nothing}, {0, 0}, False, New Vector3(0), New Vector3(1), BaseModel.BillModel, 0, "", True, New Vector3(1), 1, "", "", New Vector3(0), {PokemonForms.GetOverworldSpriteName(OwnPokemon), 3, OwnPokemon.GetDisplayName(), 0, True, "Still", New List(Of Rectangle)}, InitiallyVisibleOwn), NPC) OwnPokemonModel = CType(Entity.GetNewEntity("ModelEntity", New Vector3(12, -0.5F, 12.5F) + BattleMapOffset, {}, {}, False, New Vector3(MathHelper.Pi * 0.5F, MathHelper.Pi * 0.5F, 0), New Vector3(0.07F), BaseModel.BlockModel, 0, "Models\Bulbasaur\Normal", False, New Vector3(1), 0, "", "", New Vector3(0), Nothing), ModelEntity) Else - OwnPokemonNPC = CType(Entity.GetNewEntity("NPC", New Vector3(12, 0, 12.5F) + BattleMapOffset, {Nothing}, {0, 0}, False, New Vector3(0), New Vector3(1), BaseModel.BillModel, 0, "", False, New Vector3(1), 0, "", "", New Vector3(0), {PokemonForms.GetOverworldSpriteName(OwnPokemon), 3, OwnPokemon.GetDisplayName(), 0, True, "Still", New List(Of Rectangle)}), NPC) - OwnPokemonModel = CType(Entity.GetNewEntity("ModelEntity", New Vector3(12, -0.5F, 12.5F) + BattleMapOffset, {}, {}, False, New Vector3(MathHelper.Pi * 0.5F, MathHelper.Pi * 0.5F, 0), New Vector3(0.07F), BaseModel.BlockModel, 1, ownModel, True, New Vector3(1), 0, "", "", New Vector3(0), Nothing), ModelEntity) + OwnPokemonNPC = CType(Entity.GetNewEntity("NPC", New Vector3(12, 0, 13) + BattleMapOffset, {Nothing}, {0, 0}, False, New Vector3(0), New Vector3(1), BaseModel.BillModel, 0, "", False, New Vector3(1), 0, "", "", New Vector3(0), {PokemonForms.GetOverworldSpriteName(OwnPokemon), 3, OwnPokemon.GetDisplayName(), 0, True, "Still", New List(Of Rectangle)}), NPC) + OwnPokemonModel = CType(Entity.GetNewEntity("ModelEntity", New Vector3(12, -0.5F, 12.5F) + BattleMapOffset, {}, {}, False, New Vector3(MathHelper.Pi * 0.5F, MathHelper.Pi * 0.5F, 0), New Vector3(0.07F), BaseModel.BlockModel, 1, ownModel, True, New Vector3(1), 0, "", "", New Vector3(0), Nothing, InitiallyVisibleOwn), ModelEntity) End If Screen.Level.Entities.Add(OwnPokemonNPC) Screen.Level.Entities.Add(OwnPokemonModel) + Dim InitiallyVisibleOpp As Integer = 1 + If Core.Player.ShowBattleAnimations <> 0 Then + InitiallyVisibleOpp = 0 + End If + If oppModel = "" Then - OppPokemonNPC = CType(Entity.GetNewEntity("NPC", New Vector3(15, 0, 12.5F) + BattleMapOffset, {Nothing}, {0, 0}, False, New Vector3(0), New Vector3(1), BaseModel.BillModel, 0, "", True, New Vector3(1), 1, "", "", New Vector3(0), {PokemonForms.GetOverworldSpriteName(OppPokemon), 1, OppPokemon.GetDisplayName(), 1, True, "Still", New List(Of Rectangle)}), NPC) + OppPokemonNPC = CType(Entity.GetNewEntity("NPC", New Vector3(15, 0, 13) + BattleMapOffset, {Nothing}, {0, 0}, False, New Vector3(0), New Vector3(1), BaseModel.BillModel, 0, "", True, New Vector3(1), 1, "", "", New Vector3(0), {PokemonForms.GetOverworldSpriteName(OppPokemon), 1, OppPokemon.GetDisplayName(), 1, True, "Still", New List(Of Rectangle)}, InitiallyVisibleOpp), NPC) OppPokemonModel = CType(Entity.GetNewEntity("ModelEntity", New Vector3(15, -0.5F, 12.5F) + BattleMapOffset, {}, {}, False, New Vector3(MathHelper.Pi * 0.5F, MathHelper.Pi * 1.5F, 0), New Vector3(0.07F), BaseModel.BlockModel, 0, "Models\Bulbasaur\Normal", False, New Vector3(1), 0, "", "", New Vector3(0), Nothing), ModelEntity) Else - OppPokemonNPC = CType(Entity.GetNewEntity("NPC", New Vector3(15, 0, 12.5F) + BattleMapOffset, {Nothing}, {0, 0}, False, New Vector3(0), New Vector3(1), BaseModel.BillModel, 0, "", False, New Vector3(1), 0, "", "", New Vector3(0), {PokemonForms.GetOverworldSpriteName(OppPokemon), 1, OppPokemon.GetDisplayName(), 1, True, "Still", New List(Of Rectangle)}), NPC) - OppPokemonModel = CType(Entity.GetNewEntity("ModelEntity", New Vector3(15, -0.5F, 12.5F) + BattleMapOffset, {}, {}, False, New Vector3(MathHelper.Pi * 0.5F, MathHelper.Pi * 1.5F, 0), New Vector3(0.07F), BaseModel.BlockModel, 1, oppModel, True, New Vector3(1), 0, "", "", New Vector3(0), Nothing), ModelEntity) + OppPokemonNPC = CType(Entity.GetNewEntity("NPC", New Vector3(15, 0, 13) + BattleMapOffset, {Nothing}, {0, 0}, False, New Vector3(0), New Vector3(1), BaseModel.BillModel, 0, "", False, New Vector3(1), 0, "", "", New Vector3(0), {PokemonForms.GetOverworldSpriteName(OppPokemon), 1, OppPokemon.GetDisplayName(), 1, True, "Still", New List(Of Rectangle)}), NPC) + OppPokemonModel = CType(Entity.GetNewEntity("ModelEntity", New Vector3(15, -0.5F, 12.5F) + BattleMapOffset, {}, {}, False, New Vector3(MathHelper.Pi * 0.5F, MathHelper.Pi * 1.5F, 0), New Vector3(0.07F), BaseModel.BlockModel, 1, oppModel, True, New Vector3(1), 0, "", "", New Vector3(0), Nothing, InitiallyVisibleOpp), ModelEntity) End If Screen.Level.Entities.Add(OppPokemonNPC) @@ -401,22 +455,93 @@ Dim q As CameraQueryObject = New CameraQueryObject(New Vector3(13, 0, 15), New Vector3(21, 0, 15), 0.05F, 0.05F, -0.8F, 1.4F, 0.0F, 0.0F, 0.016F, 0.016F) q.PassThis = True - Dim hisher As String = "his" - If Trainer.Gender = 1 Then - hisher = "her" + Dim q1 As TextQueryObject = New TextQueryObject(Trainer.Name & " wants to battle!") + + ' Ball is thrown + Dim BallThrowOpp As AnimationQueryObject = New AnimationQueryObject(OppPokemonNPC, True, OppPokemonModel) + + If Core.Player.ShowBattleAnimations <> 0 Then + BallThrowOpp.AnimationPlaySound("Battle\Pokeball\Throw", 0, 0) + BallThrowOpp.AnimationMove(Nothing, False, 0, 0.5, 0, 0.5, False, False, 2, 0,,, 3) + Dim BallThrowEntity As Entity = BallThrowOpp.SpawnEntity(New Vector3(-2, -0.15, 0), Me.OppPokemon.CatchBall.Texture, New Vector3(0.3F), 1.0F) + BallThrowOpp.AnimationMove(BallThrowEntity, True, 0, 0.35, 0, 0.1, False, True, 0F, 0.5F,, 0.3,, 0.025F) + + ' Ball Opens + BallThrowOpp.AnimationPlaySound("Battle\Pokeball\Open", 3, 0) + Dim SmokeSpawnedOpp As Integer = 0 + Do + Dim SmokeDestination = New Vector3(CSng(Random.Next(-10, 10) / 10), CSng(Random.Next(-10, 10) / 10), CSng(Random.Next(-10, 10) / 10)) + + Dim SmokeTexture As Texture2D = TextureManager.GetTexture("Textures\Battle\Smoke") + + Dim SmokeScale = New Vector3(CSng(Random.Next(2, 6) / 10)) + Dim SmokeSpeed = CSng(Random.Next(1, 3) / 20.0F) + + Dim SmokeEntity As Entity = BallThrowOpp.SpawnEntity(Nothing, SmokeTexture, SmokeScale, 1.0F, 3) + BallThrowOpp.AnimationMove(SmokeEntity, True, SmokeDestination.X, SmokeDestination.Y, SmokeDestination.Z, SmokeSpeed, False, False, 3.0F, 0.0F) + + Threading.Interlocked.Increment(SmokeSpawnedOpp) + Loop While SmokeSpawnedOpp <= 38 + End If + ' Pokemon appears + BallThrowOpp.AnimationFade(Nothing, False, 1, True, 1, 3, 0) + BallThrowOpp.AnimationPlaySound(CStr(Me.OppPokemon.Number), 4, 0,, True) + + ' Pokémon falls down + If Core.Player.ShowBattleAnimations <> 0 Then + ' Pokémon falls down + BallThrowOpp.AnimationMove(Nothing, False, 0, 0, 0, 0.05F, False, False, 4, 0,,, 3) End If - Dim q1 As New PlaySoundQueryObject(OppPokemon.Number.ToString(), True, 5.0F) - Dim q2 As TextQueryObject = New TextQueryObject(Trainer.Name & " and " & hisher & " " & Me.OppPokemon.GetDisplayName() & " want to battle!") - - Dim q22 As CameraQueryObject = New CameraQueryObject(New Vector3(14, 0, 15), New Vector3(13, 0, 15), 0.05F, 0.05F, MathHelper.PiOver2, -0.8F, 0.0F, 0.0F, 0.05F, 0.05F) + Dim q2 As CameraQueryObject = New CameraQueryObject(New Vector3(14, 0, 15), New Vector3(13, 0, 15), 0.05F, 0.05F, MathHelper.PiOver2, -0.8F, 0.0F, 0.0F, 0.05F, 0.05F) Dim q3 As CameraQueryObject = New CameraQueryObject(New Vector3(14, 0, 11), New Vector3(14, 0, 15), 0.01F, 0.01F, MathHelper.PiOver2, MathHelper.PiOver2, 0.0F, 0.0F) q3.PassThis = True - Dim q31 As New PlaySoundQueryObject(OwnPokemon.Number.ToString(), True, 3.0F) Dim q4 As TextQueryObject = New TextQueryObject("Go, " & Me.OwnPokemon.GetDisplayName() & "!") + Me.BattleQuery.AddRange({cq, q, q1, BallThrowOpp, q2, q3, q4}) + + ' Ball is thrown + Dim BallThrowOwn As AnimationQueryObject = New AnimationQueryObject(Me.OwnPokemonNPC, False, Me.OwnPokemonModel) + + If Core.Player.ShowBattleAnimations <> 0 Then + BallThrowOwn.AnimationPlaySound("Battle\Pokeball\Throw", 0, 0) + BallThrowOwn.AnimationMove(Nothing, False, 0, 0.5, 0, 0.5, False, False, 2, 0,,, 3) + + Dim BallThrowEntity As Entity = BallThrowOwn.SpawnEntity(New Vector3(-2, -0.15, 0), Me.OwnPokemon.CatchBall.Texture, New Vector3(0.3F), 1.0F) + BallThrowOwn.AnimationMove(BallThrowEntity, True, 0, 0.35, 0, 0.1, False, True, 0F, 0.5F,, 0.3,, 0.025F) + + ' Ball Opens + BallThrowOwn.AnimationPlaySound("Battle\Pokeball\Open", 3, 0) + + Dim SmokeSpawned As Integer = 0 + Do + Dim SmokeDestination = New Vector3(CSng(Random.Next(-10, 10) / 10), CSng(Random.Next(-10, 10) / 10), CSng(Random.Next(-10, 10) / 10)) + + Dim SmokeTexture As Texture2D = TextureManager.GetTexture("Textures\Battle\Smoke") + + Dim SmokeScale = New Vector3(CSng(Random.Next(2, 6) / 10)) + Dim SmokeSpeed = CSng(Random.Next(1, 3) / 20.0F) + + Dim SmokeEntity As Entity = BallThrowOwn.SpawnEntity(Nothing, SmokeTexture, SmokeScale, 1.0F, 3) + BallThrowOwn.AnimationMove(SmokeEntity, True, SmokeDestination.X, SmokeDestination.Y, SmokeDestination.Z, SmokeSpeed, False, False, 3.0F, 0.0F) + + Threading.Interlocked.Increment(SmokeSpawned) + Loop While SmokeSpawned <= 38 + End If + + ' Pokemon appears + BallThrowOwn.AnimationFade(Nothing, False, 1, True, 1, 3, 0) + BallThrowOwn.AnimationPlaySound(CStr(Me.OwnPokemon.Number), 4, 0,, True) + + If Core.Player.ShowBattleAnimations <> 0 Then + ' Pokémon falls down + BallThrowOwn.AnimationMove(Nothing, False, 0, 0, 0, 0.05F, False, False, 5, 0,,, 3) + End If + + Me.BattleQuery.Add(BallThrowOwn) + Dim q5 As ToggleMenuQueryObject = New ToggleMenuQueryObject(Me.BattleMenu.Visible) Dim cq1 As ScreenFadeQueryObject = New ScreenFadeQueryObject(ScreenFadeQueryObject.FadeTypes.Vertical, Color.Black, True, 16) @@ -424,8 +549,6 @@ cq2.PassThis = True - Me.BattleQuery.AddRange({cq, q, q1, q2, q22, q3, q31, q4}) - Battle.SwitchInOwn(Me, meIndex, True, OwnPokemonIndex) Battle.SwitchInOpp(Me, True, OppPokemonIndex) TempPVPBattleQuery.Clear() @@ -496,10 +619,10 @@ Dim oppModel As String = GetModelName(False) If ownModel = "" Then - OwnPokemonNPC = CType(Entity.GetNewEntity("NPC", New Vector3(12, 0, 12.5F) + BattleMapOffset, {Nothing}, {0, 0}, False, New Vector3(0), New Vector3(1), BaseModel.BillModel, 0, "", False, New Vector3(1), 1, "", "", New Vector3(0), {PokemonForms.GetOverworldSpriteName(OwnPokemon), 3, WildPokemon.GetDisplayName(), 0, True, "Still", New List(Of Rectangle)}), NPC) + OwnPokemonNPC = CType(Entity.GetNewEntity("NPC", New Vector3(12, 0, 13) + BattleMapOffset, {Nothing}, {0, 0}, False, New Vector3(0), New Vector3(1), BaseModel.BillModel, 0, "", False, New Vector3(1), 1, "", "", New Vector3(0), {PokemonForms.GetOverworldSpriteName(OwnPokemon), 3, WildPokemon.GetDisplayName(), 0, True, "Still", New List(Of Rectangle)}), NPC) OwnPokemonModel = CType(Entity.GetNewEntity("ModelEntity", New Vector3(12, -0.5F, 12.5F) + BattleMapOffset, {}, {}, False, New Vector3(MathHelper.Pi * 0.5F, MathHelper.Pi * 0.5F, 0), New Vector3(0.07F), BaseModel.BlockModel, 0, "Models\Bulbasaur\Normal", False, New Vector3(1), 0, "", "", New Vector3(0), Nothing), ModelEntity) Else - OwnPokemonNPC = CType(Entity.GetNewEntity("NPC", New Vector3(12, 0, 12.5F) + BattleMapOffset, {Nothing}, {0, 0}, False, New Vector3(0), New Vector3(1), BaseModel.BillModel, 0, "", False, New Vector3(1), 0, "", "", New Vector3(0), {PokemonForms.GetOverworldSpriteName(OwnPokemon), 3, WildPokemon.GetDisplayName(), 0, True, "Still", New List(Of Rectangle)}), NPC) + OwnPokemonNPC = CType(Entity.GetNewEntity("NPC", New Vector3(12, 0, 13) + BattleMapOffset, {Nothing}, {0, 0}, False, New Vector3(0), New Vector3(1), BaseModel.BillModel, 0, "", False, New Vector3(1), 0, "", "", New Vector3(0), {PokemonForms.GetOverworldSpriteName(OwnPokemon), 3, WildPokemon.GetDisplayName(), 0, True, "Still", New List(Of Rectangle)}), NPC) OwnPokemonModel = CType(Entity.GetNewEntity("ModelEntity", New Vector3(12, -0.5F, 12.5F) + BattleMapOffset, {}, {}, False, New Vector3(MathHelper.Pi * 0.5F, MathHelper.Pi * 0.5F, 0), New Vector3(0.07F), BaseModel.BlockModel, 1, ownModel, False, New Vector3(1), 0, "", "", New Vector3(0), Nothing), ModelEntity) End If @@ -507,10 +630,10 @@ Screen.Level.Entities.Add(OwnPokemonModel) If oppModel = "" Then - OppPokemonNPC = CType(Entity.GetNewEntity("NPC", New Vector3(15, 0, 12.5F) + BattleMapOffset, {Nothing}, {0, 0}, False, New Vector3(0), New Vector3(1), BaseModel.BillModel, 0, "", True, New Vector3(1), 1, "", "", New Vector3(0), {PokemonForms.GetOverworldSpriteName(WildPokemon), 1, WildPokemon.GetDisplayName(), 1, True, "Still", New List(Of Rectangle)}), NPC) + OppPokemonNPC = CType(Entity.GetNewEntity("NPC", New Vector3(15, 0, 13) + BattleMapOffset, {Nothing}, {0, 0}, False, New Vector3(0), New Vector3(1), BaseModel.BillModel, 0, "", True, New Vector3(1), 1, "", "", New Vector3(0), {PokemonForms.GetOverworldSpriteName(WildPokemon), 1, WildPokemon.GetDisplayName(), 1, True, "Still", New List(Of Rectangle)}), NPC) OppPokemonModel = CType(Entity.GetNewEntity("ModelEntity", New Vector3(15, -0.5F, 12.5F) + BattleMapOffset, {}, {}, False, New Vector3(MathHelper.Pi * 0.5F, MathHelper.Pi * 1.5F, 0), New Vector3(0.07F), BaseModel.BlockModel, 0, "Models\Bulbasaur\Normal", False, New Vector3(1), 0, "", "", New Vector3(0), Nothing), ModelEntity) Else - OppPokemonNPC = CType(Entity.GetNewEntity("NPC", New Vector3(15, 0, 12.5F) + BattleMapOffset, {Nothing}, {0, 0}, False, New Vector3(0), New Vector3(1), BaseModel.BillModel, 0, "", False, New Vector3(1), 0, "", "", New Vector3(0), {PokemonForms.GetOverworldSpriteName(WildPokemon), 1, WildPokemon.GetDisplayName(), 1, True, "Still", New List(Of Rectangle)}), NPC) + OppPokemonNPC = CType(Entity.GetNewEntity("NPC", New Vector3(15, 0, 13) + BattleMapOffset, {Nothing}, {0, 0}, False, New Vector3(0), New Vector3(1), BaseModel.BillModel, 0, "", False, New Vector3(1), 0, "", "", New Vector3(0), {PokemonForms.GetOverworldSpriteName(WildPokemon), 1, WildPokemon.GetDisplayName(), 1, True, "Still", New List(Of Rectangle)}), NPC) OppPokemonModel = CType(Entity.GetNewEntity("ModelEntity", New Vector3(15, -0.5F, 12.5F) + BattleMapOffset, {}, {}, False, New Vector3(MathHelper.Pi * 0.5F, MathHelper.Pi * 1.5F, 0), New Vector3(0.07F), BaseModel.BlockModel, 1, oppModel, True, New Vector3(1), 0, "", "", New Vector3(0), Nothing), ModelEntity) End If @@ -607,22 +730,27 @@ Dim ownModel As String = GetModelName(True) Dim oppModel As String = GetModelName(False) + Dim InitiallyVisibleOwn As Integer = 1 + If Core.Player.ShowBattleAnimations <> 0 Then + InitiallyVisibleOwn = 0 + End If + If ownModel = "" Then - OwnPokemonNPC = CType(Entity.GetNewEntity("NPC", New Vector3(12, 0, 12.5F) + BattleMapOffset, {Nothing}, {0, 0}, False, New Vector3(0), New Vector3(1), BaseModel.BillModel, 0, "", True, New Vector3(1), 1, "", "", New Vector3(0), {PokemonForms.GetOverworldSpriteName(OwnPokemon), 3, WildPokemon.GetDisplayName(), 0, True, "Still", New List(Of Rectangle)}), NPC) + OwnPokemonNPC = CType(Entity.GetNewEntity("NPC", New Vector3(12, 0, 13) + BattleMapOffset, {Nothing}, {0, 0}, False, New Vector3(0), New Vector3(1), BaseModel.BillModel, 0, "", True, New Vector3(1), 1, "", "", New Vector3(0), {PokemonForms.GetOverworldSpriteName(OwnPokemon), 3, OwnPokemon.GetDisplayName(), 0, True, "Still", New List(Of Rectangle)}, InitiallyVisibleOwn), NPC) OwnPokemonModel = CType(Entity.GetNewEntity("ModelEntity", New Vector3(12, -0.5F, 12.5F) + BattleMapOffset, {}, {}, False, New Vector3(MathHelper.Pi * 0.5F, MathHelper.Pi * 0.5F, 0), New Vector3(0.07F), BaseModel.BlockModel, 0, "Models\Bulbasaur\Normal", False, New Vector3(1), 0, "", "", New Vector3(0), Nothing), ModelEntity) Else - OwnPokemonNPC = CType(Entity.GetNewEntity("NPC", New Vector3(12, 0, 12.5F) + BattleMapOffset, {Nothing}, {0, 0}, False, New Vector3(0), New Vector3(1), BaseModel.BillModel, 0, "", False, New Vector3(1), 0, "", "", New Vector3(0), {PokemonForms.GetOverworldSpriteName(OwnPokemon), 3, WildPokemon.GetDisplayName(), 0, True, "Still", New List(Of Rectangle)}), NPC) - OwnPokemonModel = CType(Entity.GetNewEntity("ModelEntity", New Vector3(12, -0.5F, 12.5F) + BattleMapOffset, {}, {}, False, New Vector3(MathHelper.Pi * 0.5F, MathHelper.Pi * 0.5F, 0), New Vector3(0.07F), BaseModel.BlockModel, 1, ownModel, True, New Vector3(1), 0, "", "", New Vector3(0), Nothing), ModelEntity) + OwnPokemonNPC = CType(Entity.GetNewEntity("NPC", New Vector3(12, 0, 13) + BattleMapOffset, {Nothing}, {0, 0}, False, New Vector3(0), New Vector3(1), BaseModel.BillModel, 0, "", False, New Vector3(1), 0, "", "", New Vector3(0), {PokemonForms.GetOverworldSpriteName(OwnPokemon), 3, OwnPokemon.GetDisplayName(), 0, True, "Still", New List(Of Rectangle)}), NPC) + OwnPokemonModel = CType(Entity.GetNewEntity("ModelEntity", New Vector3(12, -0.5F, 12.5F) + BattleMapOffset, {}, {}, False, New Vector3(MathHelper.Pi * 0.5F, MathHelper.Pi * 0.5F, 0), New Vector3(0.07F), BaseModel.BlockModel, 1, ownModel, True, New Vector3(1), 0, "", "", New Vector3(0), Nothing, InitiallyVisibleOwn), ModelEntity) End If Screen.Level.Entities.Add(OwnPokemonNPC) Screen.Level.Entities.Add(OwnPokemonModel) If oppModel = "" Then - OppPokemonNPC = CType(Entity.GetNewEntity("NPC", New Vector3(15, 0, 12.5F) + BattleMapOffset, {Nothing}, {0, 0}, False, New Vector3(0), New Vector3(1), BaseModel.BillModel, 0, "", True, New Vector3(1), 1, "", "", New Vector3(0), {PokemonForms.GetOverworldSpriteName(WildPokemon), 1, WildPokemon.GetDisplayName(), 1, True, "Still", New List(Of Rectangle)}), NPC) + OppPokemonNPC = CType(Entity.GetNewEntity("NPC", New Vector3(15, 0, 13) + BattleMapOffset, {Nothing}, {0, 0}, False, New Vector3(0), New Vector3(1), BaseModel.BillModel, 0, "", True, New Vector3(1), 1, "", "", New Vector3(0), {PokemonForms.GetOverworldSpriteName(WildPokemon), 1, WildPokemon.GetDisplayName(), 1, True, "Still", New List(Of Rectangle)}), NPC) OppPokemonModel = CType(Entity.GetNewEntity("ModelEntity", New Vector3(15, -0.5F, 12.5F) + BattleMapOffset, {}, {}, False, New Vector3(MathHelper.Pi * 0.5F, MathHelper.Pi * 1.5F, 0), New Vector3(0.07F), BaseModel.BlockModel, 0, "Models\Bulbasaur\Normal", False, New Vector3(1), 0, "", "", New Vector3(0), Nothing), ModelEntity) Else - OppPokemonNPC = CType(Entity.GetNewEntity("NPC", New Vector3(15, 0, 12.5F) + BattleMapOffset, {Nothing}, {0, 0}, False, New Vector3(0), New Vector3(1), BaseModel.BillModel, 0, "", False, New Vector3(1), 0, "", "", New Vector3(0), {PokemonForms.GetOverworldSpriteName(WildPokemon), 1, WildPokemon.GetDisplayName(), 1, True, "Still", New List(Of Rectangle)}), NPC) + OppPokemonNPC = CType(Entity.GetNewEntity("NPC", New Vector3(15, 0, 13) + BattleMapOffset, {Nothing}, {0, 0}, False, New Vector3(0), New Vector3(1), BaseModel.BillModel, 0, "", False, New Vector3(1), 0, "", "", New Vector3(0), {PokemonForms.GetOverworldSpriteName(WildPokemon), 1, WildPokemon.GetDisplayName(), 1, True, "Still", New List(Of Rectangle)}), NPC) OppPokemonModel = CType(Entity.GetNewEntity("ModelEntity", New Vector3(15, -0.5F, 12.5F) + BattleMapOffset, {}, {}, False, New Vector3(MathHelper.Pi * 0.5F, MathHelper.Pi * 1.5F, 0), New Vector3(0.07F), BaseModel.BlockModel, 1, oppModel, True, New Vector3(1), 0, "", "", New Vector3(0), Nothing), ModelEntity) End If @@ -657,6 +785,48 @@ Dim q31 As New PlaySoundQueryObject(OwnPokemon.Number.ToString(), True, 3.0F) Dim q4 As TextQueryObject = New TextQueryObject("Go, " & Me.OwnPokemon.GetDisplayName() & "!") + Me.BattleQuery.AddRange({cq, q1, q, q2, q22, q3, q4}) + + ' Ball is thrown + Dim BallThrowOwn As AnimationQueryObject = New AnimationQueryObject(Me.OwnPokemonNPC, False, Me.OwnPokemonModel) + + If Core.Player.ShowBattleAnimations <> 0 Then + BallThrowOwn.AnimationPlaySound("Battle\Pokeball\Throw", 0, 0) + BallThrowOwn.AnimationMove(Nothing, False, 0, 0.5, 0, 0.5, False, False, 2, 0,,, 3) + + Dim BallThrowEntity As Entity = BallThrowOwn.SpawnEntity(New Vector3(-2, -0.15, 0), Me.OwnPokemon.CatchBall.Texture, New Vector3(0.3F), 1.0F) + BallThrowOwn.AnimationMove(BallThrowEntity, True, 0, 0.35, 0, 0.1, False, True, 0F, 0.5F,, 0.3,, 0.025F) + + ' Ball Opens + BallThrowOwn.AnimationPlaySound("Battle\Pokeball\Open", 3, 0) + + Dim SmokeSpawned As Integer = 0 + Do + Dim SmokeDestination = New Vector3(CSng(Random.Next(-10, 10) / 10), CSng(Random.Next(-10, 10) / 10), CSng(Random.Next(-10, 10) / 10)) + + Dim SmokeTexture As Texture2D = TextureManager.GetTexture("Textures\Battle\Smoke") + + Dim SmokeScale = New Vector3(CSng(Random.Next(2, 6) / 10)) + Dim SmokeSpeed = CSng(Random.Next(1, 3) / 20.0F) + + Dim SmokeEntity As Entity = BallThrowOwn.SpawnEntity(Nothing, SmokeTexture, SmokeScale, 1.0F, 3) + BallThrowOwn.AnimationMove(SmokeEntity, True, SmokeDestination.X, SmokeDestination.Y, SmokeDestination.Z, SmokeSpeed, False, False, 3.0F, 0.0F) + + Threading.Interlocked.Increment(SmokeSpawned) + Loop While SmokeSpawned <= 38 + End If + + ' Pokemon appears + BallThrowOwn.AnimationFade(Nothing, False, 1, True, 1, 3, 0) + BallThrowOwn.AnimationPlaySound(CStr(Me.OwnPokemon.Number), 4, 0,, True) + + If Core.Player.ShowBattleAnimations <> 0 Then + ' Pokémon falls down + BallThrowOwn.AnimationMove(Nothing, False, 0, 0, 0, 0.05F, False, False, 5, 0,,, 3) + End If + + Me.BattleQuery.Add(BallThrowOwn) + Dim q5 As ToggleMenuQueryObject = New ToggleMenuQueryObject(Me.BattleMenu.Visible) Dim cq1 As ScreenFadeQueryObject = New ScreenFadeQueryObject(ScreenFadeQueryObject.FadeTypes.Vertical, Color.Black, True, 16) @@ -664,8 +834,6 @@ cq2.PassThis = True - Me.BattleQuery.AddRange({cq, q, q1, q2, q22, q3, q31, q4}) - Battle.SwitchInOwn(Me, meIndex, True, -1) Battle.SwitchInOpp(Me, True, 0) From c1ec08fe7f3f40f3c16ac3c32113cb3cd27dd814 Mon Sep 17 00:00:00 2001 From: "Jasper \"JappaWakka\" Speelman" <31563291+JappaWakka@users.noreply.github.com> Date: Sat, 6 Nov 2021 11:26:34 +0100 Subject: [PATCH 18/57] Various Battle Improvements and Fixes MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Improved timing BlockIn & BlockOut BattleIntro animations * Removed player ball throw animations at the start of the battle for battles that are not pvp * Fixed absorb animation * Improved the faint animation and removed the unnecessary camera angle changes when a pokémon faints --- P3D/Battle/BattleSystemV2/Battle.vb | 39 ++++--- P3D/Battle/BattleSystemV2/BattleScreen.vb | 130 ++++------------------ P3D/Pokemon/Attacks/Grass/Absorb.vb | 10 +- P3D/Screens/BattleIntroScreen.vb | 6 +- 4 files changed, 49 insertions(+), 136 deletions(-) diff --git a/P3D/Battle/BattleSystemV2/Battle.vb b/P3D/Battle/BattleSystemV2/Battle.vb index 0a74526d1..3e1b9971a 100644 --- a/P3D/Battle/BattleSystemV2/Battle.vb +++ b/P3D/Battle/BattleSystemV2/Battle.vb @@ -2543,13 +2543,19 @@ p.HP = 0 p.Status = Pokemon.StatusProblems.Fainted Me.ChangeCameraAngle(1, own, BattleScreen) - BattleScreen.BattleQuery.Add(New PlaySoundQueryObject(p.Number.ToString(), True)) If message = "" Then message = p.GetDisplayName() & " fainted!" End If BattleScreen.BattleQuery.Add(New TextQueryObject(message)) + If BattleScreen.IsTrainerBattle = False AndAlso Core.Player.ShowBattleAnimations <> 0 Then + Dim FaintAnimation As AnimationQueryObject = New AnimationQueryObject(BattleScreen.OppPokemonNPC, True, BattleScreen.OppPokemonModel) + FaintAnimation.AnimationPlaySound(CStr(BattleScreen.OppPokemon.Number), 0, 2, False, True) + FaintAnimation.AnimationMove(Nothing, False, 0, -1, 0, 0.05, False, False, 2, 0,,, 3) + BattleScreen.BattleQuery.Add(FaintAnimation) + End If + Dim str = p.AdditionalData.ToLower() Select Case str Case "mega", "mega_x", "mega_y", "primal", "blade" @@ -3424,9 +3430,9 @@ Dim Position As New Vector3(xPos, -0.4, zPos) Dim Destination As New Vector3(xPos, 0.8, zPos) Dim Scale As New Vector3(0.2F) - - Dim StatEntity As Entity = StatAnimation.SpawnEntity(Position, Texture, Scale, 1.0F) Dim startDelay As Double = 5.0 * Random.NextDouble() + Dim StatEntity As Entity = StatAnimation.SpawnEntity(Position, Texture, Scale, 1.0F, CSng(startDelay)) + StatAnimation.AnimationMove(Nothing, True, Destination.X, Destination.Y, Destination.Z, 0.05F, False, True, CSng(startDelay), 0.0F) Threading.Interlocked.Increment(currentAmount) @@ -3707,9 +3713,9 @@ Dim Position As New Vector3(xPos, 0.8, zPos) Dim Destination As New Vector3(xPos, -0.4, zPos) Dim Scale As New Vector3(0.2F) - - Dim StatEntity As Entity = StatAnimation.SpawnEntity(Position, Texture, Scale, 1.0F) Dim startDelay As Double = 5.0 * Random.NextDouble() + Dim StatEntity As Entity = StatAnimation.SpawnEntity(Position, Texture, Scale, 1.0F, CSng(startDelay)) + StatAnimation.AnimationMove(Nothing, True, Destination.X, Destination.Y, Destination.Z, 0.05F, False, True, CSng(startDelay), 0.0F) Threading.Interlocked.Increment(currentAmount) @@ -3969,7 +3975,7 @@ '***HP INCREASE ANIMATION*** If Core.Player.ShowBattleAnimations <> 0 Then - Dim StatAnimation As AnimationQueryObject = New AnimationQueryObject(pNPC, Not own) + Dim HealAnimation As AnimationQueryObject = New AnimationQueryObject(pNPC, Not own) Dim maxAmount As Integer = 20 Dim currentAmount As Integer = 0 While currentAmount <= maxAmount @@ -3980,14 +3986,14 @@ Dim Position As New Vector3(xPos, -0.4, zPos) Dim Destination As New Vector3(xPos, 0.8, zPos) Dim Scale As New Vector3(0.2F) - - Dim StatEntity As Entity = StatAnimation.SpawnEntity(Position, Texture, Scale, 1.0F) Dim startDelay As Double = 5.0 * Random.NextDouble() + Dim HealEntity As Entity = HealAnimation.SpawnEntity(Position, Texture, Scale, 1.0F, CSng(startDelay)) - StatAnimation.AnimationMove(Nothing, True, Destination.X, Destination.Y, Destination.Z, 0.05F, False, True, CSng(startDelay), 0.0F) + + HealAnimation.AnimationMove(HealEntity, True, Destination.X, Destination.Y, Destination.Z, 0.05F, False, True, CSng(startDelay), 0.0F) Threading.Interlocked.Increment(currentAmount) End While - BattleScreen.BattleQuery.Add(StatAnimation) + BattleScreen.BattleQuery.Add(HealAnimation) End If BattleScreen.BattleQuery.Add(New PlaySoundQueryObject("Battle\Effects\Heal", False)) @@ -6847,18 +6853,18 @@ Threading.Interlocked.Increment(SmokeReturned) Loop While SmokeReturned <= 38 End If - ' Pokemon disappears - BallReturn.AnimationFade(Nothing, False, 1, False, 0, 1, 0) If Core.Player.ShowBattleAnimations <> 0 Then + ' Pokemon disappears + BallReturn.AnimationFade(Nothing, False, 1, False, 0, 1, 0) BallReturn.AnimationMove(Nothing, False, 0, 0.5, 0, 0.5, False, False, 2, 0,,, 3) ' Ball returns BallReturn.AnimationPlaySound("Battle\Pokeball\Throw", 1, 0) Dim BallReturnEntity As Entity = BallReturn.SpawnEntity(Nothing, BattleScreen.OwnPokemon.CatchBall.Texture, New Vector3(0.3F), 1.0F) BallReturn.AnimationMove(BallReturnEntity, True, -2, 0, 0, 0.1, False, True, 1, 0,, 0.3) + BattleScreen.AddToQuery(InsertIndex, BallReturn) End If - BattleScreen.AddToQuery(InsertIndex, BallReturn) Dim index As Integer = NewPokemonIndex If index <= -1 Then @@ -7173,13 +7179,6 @@ BattleScreen.OppPokemon.Ability.SwitchOut(BattleScreen.OppPokemon) If BattleScreen.IsTrainerBattle = False Then - ChangeCameraAngle(1, False, BattleScreen) - If Core.Player.ShowBattleAnimations <> 0 Then - Dim Faint As AnimationQueryObject = New AnimationQueryObject(BattleScreen.OppPokemonNPC, True, BattleScreen.OppPokemonModel) - Faint.AnimationPlaySound(CStr(BattleScreen.OppPokemon.Number), 0, 2, False, True) - Faint.AnimationMove(Nothing, False, 0, -1, 0, 0.1, False, False, 2, 0,,, 3) - BattleScreen.BattleQuery.Add(Faint) - End If BattleScreen.BattleQuery.Add(New ToggleEntityQueryObject(True, ToggleEntityQueryObject.BattleEntities.OppPokemon, 2, -1, -1, -1, -1)) diff --git a/P3D/Battle/BattleSystemV2/BattleScreen.vb b/P3D/Battle/BattleSystemV2/BattleScreen.vb index e2d56b0df..2dbd82486 100644 --- a/P3D/Battle/BattleSystemV2/BattleScreen.vb +++ b/P3D/Battle/BattleSystemV2/BattleScreen.vb @@ -225,17 +225,12 @@ Dim ownModel As String = GetModelName(True) Dim oppModel As String = GetModelName(False) - Dim InitiallyVisibleOwn As Integer = 1 - If Core.Player.ShowBattleAnimations <> 0 Then - InitiallyVisibleOwn = 0 - End If - If ownModel = "" Then - OwnPokemonNPC = CType(Entity.GetNewEntity("NPC", New Vector3(12, 0, 13) + BattleMapOffset, {Nothing}, {0, 0}, False, New Vector3(0), New Vector3(1), BaseModel.BillModel, 0, "", True, New Vector3(1), 1, "", "", New Vector3(0), {PokemonForms.GetOverworldSpriteName(OwnPokemon), 3, WildPokemon.GetDisplayName(), 0, True, "Still", New List(Of Rectangle)}, InitiallyVisibleOwn), NPC) + OwnPokemonNPC = CType(Entity.GetNewEntity("NPC", New Vector3(12, 0, 13) + BattleMapOffset, {Nothing}, {0, 0}, False, New Vector3(0), New Vector3(1), BaseModel.BillModel, 0, "", True, New Vector3(1), 1, "", "", New Vector3(0), {PokemonForms.GetOverworldSpriteName(OwnPokemon), 3, WildPokemon.GetDisplayName(), 0, True, "Still", New List(Of Rectangle)}, 1), NPC) OwnPokemonModel = CType(Entity.GetNewEntity("ModelEntity", New Vector3(12, -0.5F, 13) + BattleMapOffset, {}, {}, False, New Vector3(MathHelper.Pi * 0.5F, MathHelper.Pi * 0.5F, 0), New Vector3(0.07F), BaseModel.BlockModel, 0, "Models\Bulbasaur\Normal", False, New Vector3(1), 0, "", "", New Vector3(0), Nothing), ModelEntity) Else OwnPokemonNPC = CType(Entity.GetNewEntity("NPC", New Vector3(12, 0, 13) + BattleMapOffset, {Nothing}, {0, 0}, False, New Vector3(0), New Vector3(1), BaseModel.BillModel, 0, "", False, New Vector3(1), 0, "", "", New Vector3(0), {PokemonForms.GetOverworldSpriteName(OwnPokemon), 3, WildPokemon.GetDisplayName(), 0, True, "Still", New List(Of Rectangle)}), NPC) - OwnPokemonModel = CType(Entity.GetNewEntity("ModelEntity", New Vector3(12, -0.5F, 13) + BattleMapOffset, {}, {}, False, New Vector3(MathHelper.Pi * 0.5F, MathHelper.Pi * 0.5F, 0), New Vector3(0.07F), BaseModel.BlockModel, 1, ownModel, True, New Vector3(1), 0, "", "", New Vector3(0), Nothing, InitiallyVisibleOwn), ModelEntity) + OwnPokemonModel = CType(Entity.GetNewEntity("ModelEntity", New Vector3(12, -0.5F, 13) + BattleMapOffset, {}, {}, False, New Vector3(MathHelper.Pi * 0.5F, MathHelper.Pi * 0.5F, 0), New Vector3(0.07F), BaseModel.BlockModel, 1, ownModel, True, New Vector3(1), 0, "", "", New Vector3(0), Nothing, 1), ModelEntity) End If Screen.Level.Entities.Add(OwnPokemonNPC) @@ -281,49 +276,10 @@ Dim q3 As CameraQueryObject = New CameraQueryObject(New Vector3(14, 0, 11), New Vector3(14, 0, 15), 0.01F, 0.01F, MathHelper.PiOver2, MathHelper.PiOver2, 0.0F, 0.0F) q3.PassThis = True + Dim q31 As New PlaySoundQueryObject(OwnPokemon.Number.ToString(), True, 3.0F) Dim q4 As TextQueryObject = New TextQueryObject("Go, " & Me.OwnPokemon.GetDisplayName() & "!") - Me.BattleQuery.AddRange({cq, q1, q, q2, q22, q3, q4}) - - ' Ball is thrown - Dim BallThrow As AnimationQueryObject = New AnimationQueryObject(Me.OwnPokemonNPC, False, Me.OwnPokemonModel) - - If Core.Player.ShowBattleAnimations <> 0 Then - BallThrow.AnimationPlaySound("Battle\Pokeball\Throw", 0, 0) - BallThrow.AnimationMove(Nothing, False, 0, 0.5, 0, 0.5, False, False, 2, 0,,, 3) - - Dim BallThrowEntity As Entity = BallThrow.SpawnEntity(New Vector3(-2, -0.15, 0), Me.OwnPokemon.CatchBall.Texture, New Vector3(0.3F), 1.0F) - BallThrow.AnimationMove(BallThrowEntity, True, 0, 0.35, 0, 0.1, False, True, 0F, 0.5F,, 0.3,, 0.025F) - - ' Ball Opens - BallThrow.AnimationPlaySound("Battle\Pokeball\Open", 3, 0) - - Dim SmokeSpawned As Integer = 0 - Do - Dim SmokeDestination = New Vector3(CSng(Random.Next(-10, 10) / 10), CSng(Random.Next(-10, 10) / 10), CSng(Random.Next(-10, 10) / 10)) - - Dim SmokeTexture As Texture2D = TextureManager.GetTexture("Textures\Battle\Smoke") - - Dim SmokeScale = New Vector3(CSng(Random.Next(2, 6) / 10)) - Dim SmokeSpeed = CSng(Random.Next(1, 3) / 20.0F) - - Dim SmokeEntity As Entity = BallThrow.SpawnEntity(Nothing, SmokeTexture, SmokeScale, 1.0F, 3) - BallThrow.AnimationMove(SmokeEntity, True, SmokeDestination.X, SmokeDestination.Y, SmokeDestination.Z, SmokeSpeed, False, False, 3.0F, 0.0F) - - Threading.Interlocked.Increment(SmokeSpawned) - Loop While SmokeSpawned <= 38 - End If - - ' Pokemon appears - BallThrow.AnimationFade(Nothing, False, 1, True, 1, 3, 0) - BallThrow.AnimationPlaySound(CStr(Me.OwnPokemon.Number), 4, 0,, True) - - If Core.Player.ShowBattleAnimations <> 0 Then - ' Pokémon falls down - BallThrow.AnimationMove(Nothing, False, 0, 0, 0, 0.05F, False, False, 5, 0,,, 3) - End If - - Me.BattleQuery.Add(BallThrow) + Me.BattleQuery.AddRange({cq, q1, q, q2, q22, q3, q31, q4}) Dim q5 As ToggleMenuQueryObject = New ToggleMenuQueryObject(Me.BattleMenu.Visible) @@ -404,7 +360,7 @@ Dim oppModel As String = GetModelName(False) Dim InitiallyVisibleOwn As Integer = 1 - If Core.Player.ShowBattleAnimations <> 0 Then + If IsPVPBattle = True AndAlso Core.Player.ShowBattleAnimations <> 0 Then InitiallyVisibleOwn = 0 End If @@ -420,7 +376,7 @@ Screen.Level.Entities.Add(OwnPokemonModel) Dim InitiallyVisibleOpp As Integer = 1 - If Core.Player.ShowBattleAnimations <> 0 Then + If IsPVPBattle = True AndAlso Core.Player.ShowBattleAnimations <> 0 Then InitiallyVisibleOpp = 0 End If @@ -500,12 +456,17 @@ Dim q4 As TextQueryObject = New TextQueryObject("Go, " & Me.OwnPokemon.GetDisplayName() & "!") - Me.BattleQuery.AddRange({cq, q, q1, BallThrowOpp, q2, q3, q4}) + If IsPVPBattle = True AndAlso Core.Player.ShowBattleAnimations = 0 Then + Dim q31 As New PlaySoundQueryObject(OwnPokemon.Number.ToString(), True, 3.0F) + Me.BattleQuery.AddRange({cq, q, q1, BallThrowOpp, q2, q3, q31, q4}) + Else + Me.BattleQuery.AddRange({cq, q, q1, BallThrowOpp, q2, q3, q4}) + End If - ' Ball is thrown - Dim BallThrowOwn As AnimationQueryObject = New AnimationQueryObject(Me.OwnPokemonNPC, False, Me.OwnPokemonModel) + If IsPVPBattle = True AndAlso Core.Player.ShowBattleAnimations <> 0 Then + ' Ball is thrown + Dim BallThrowOwn As AnimationQueryObject = New AnimationQueryObject(Me.OwnPokemonNPC, False, Me.OwnPokemonModel) - If Core.Player.ShowBattleAnimations <> 0 Then BallThrowOwn.AnimationPlaySound("Battle\Pokeball\Throw", 0, 0) BallThrowOwn.AnimationMove(Nothing, False, 0, 0.5, 0, 0.5, False, False, 2, 0,,, 3) @@ -529,19 +490,17 @@ Threading.Interlocked.Increment(SmokeSpawned) Loop While SmokeSpawned <= 38 - End If - ' Pokemon appears - BallThrowOwn.AnimationFade(Nothing, False, 1, True, 1, 3, 0) - BallThrowOwn.AnimationPlaySound(CStr(Me.OwnPokemon.Number), 4, 0,, True) - If Core.Player.ShowBattleAnimations <> 0 Then + ' Pokemon appears + BallThrowOwn.AnimationFade(Nothing, False, 1, True, 1, 3, 0) + BallThrowOwn.AnimationPlaySound(CStr(Me.OwnPokemon.Number), 4, 0,, True) + ' Pokémon falls down BallThrowOwn.AnimationMove(Nothing, False, 0, 0, 0, 0.05F, False, False, 5, 0,,, 3) + Me.BattleQuery.Add(BallThrowOwn) End If - Me.BattleQuery.Add(BallThrowOwn) - Dim q5 As ToggleMenuQueryObject = New ToggleMenuQueryObject(Me.BattleMenu.Visible) Dim cq1 As ScreenFadeQueryObject = New ScreenFadeQueryObject(ScreenFadeQueryObject.FadeTypes.Vertical, Color.Black, True, 16) @@ -730,17 +689,12 @@ Dim ownModel As String = GetModelName(True) Dim oppModel As String = GetModelName(False) - Dim InitiallyVisibleOwn As Integer = 1 - If Core.Player.ShowBattleAnimations <> 0 Then - InitiallyVisibleOwn = 0 - End If - If ownModel = "" Then - OwnPokemonNPC = CType(Entity.GetNewEntity("NPC", New Vector3(12, 0, 13) + BattleMapOffset, {Nothing}, {0, 0}, False, New Vector3(0), New Vector3(1), BaseModel.BillModel, 0, "", True, New Vector3(1), 1, "", "", New Vector3(0), {PokemonForms.GetOverworldSpriteName(OwnPokemon), 3, OwnPokemon.GetDisplayName(), 0, True, "Still", New List(Of Rectangle)}, InitiallyVisibleOwn), NPC) + OwnPokemonNPC = CType(Entity.GetNewEntity("NPC", New Vector3(12, 0, 13) + BattleMapOffset, {Nothing}, {0, 0}, False, New Vector3(0), New Vector3(1), BaseModel.BillModel, 0, "", True, New Vector3(1), 1, "", "", New Vector3(0), {PokemonForms.GetOverworldSpriteName(OwnPokemon), 3, OwnPokemon.GetDisplayName(), 0, True, "Still", New List(Of Rectangle)}, 1), NPC) OwnPokemonModel = CType(Entity.GetNewEntity("ModelEntity", New Vector3(12, -0.5F, 12.5F) + BattleMapOffset, {}, {}, False, New Vector3(MathHelper.Pi * 0.5F, MathHelper.Pi * 0.5F, 0), New Vector3(0.07F), BaseModel.BlockModel, 0, "Models\Bulbasaur\Normal", False, New Vector3(1), 0, "", "", New Vector3(0), Nothing), ModelEntity) Else OwnPokemonNPC = CType(Entity.GetNewEntity("NPC", New Vector3(12, 0, 13) + BattleMapOffset, {Nothing}, {0, 0}, False, New Vector3(0), New Vector3(1), BaseModel.BillModel, 0, "", False, New Vector3(1), 0, "", "", New Vector3(0), {PokemonForms.GetOverworldSpriteName(OwnPokemon), 3, OwnPokemon.GetDisplayName(), 0, True, "Still", New List(Of Rectangle)}), NPC) - OwnPokemonModel = CType(Entity.GetNewEntity("ModelEntity", New Vector3(12, -0.5F, 12.5F) + BattleMapOffset, {}, {}, False, New Vector3(MathHelper.Pi * 0.5F, MathHelper.Pi * 0.5F, 0), New Vector3(0.07F), BaseModel.BlockModel, 1, ownModel, True, New Vector3(1), 0, "", "", New Vector3(0), Nothing, InitiallyVisibleOwn), ModelEntity) + OwnPokemonModel = CType(Entity.GetNewEntity("ModelEntity", New Vector3(12, -0.5F, 12.5F) + BattleMapOffset, {}, {}, False, New Vector3(MathHelper.Pi * 0.5F, MathHelper.Pi * 0.5F, 0), New Vector3(0.07F), BaseModel.BlockModel, 1, ownModel, True, New Vector3(1), 0, "", "", New Vector3(0), Nothing, 1), ModelEntity) End If Screen.Level.Entities.Add(OwnPokemonNPC) @@ -787,46 +741,6 @@ Me.BattleQuery.AddRange({cq, q1, q, q2, q22, q3, q4}) - ' Ball is thrown - Dim BallThrowOwn As AnimationQueryObject = New AnimationQueryObject(Me.OwnPokemonNPC, False, Me.OwnPokemonModel) - - If Core.Player.ShowBattleAnimations <> 0 Then - BallThrowOwn.AnimationPlaySound("Battle\Pokeball\Throw", 0, 0) - BallThrowOwn.AnimationMove(Nothing, False, 0, 0.5, 0, 0.5, False, False, 2, 0,,, 3) - - Dim BallThrowEntity As Entity = BallThrowOwn.SpawnEntity(New Vector3(-2, -0.15, 0), Me.OwnPokemon.CatchBall.Texture, New Vector3(0.3F), 1.0F) - BallThrowOwn.AnimationMove(BallThrowEntity, True, 0, 0.35, 0, 0.1, False, True, 0F, 0.5F,, 0.3,, 0.025F) - - ' Ball Opens - BallThrowOwn.AnimationPlaySound("Battle\Pokeball\Open", 3, 0) - - Dim SmokeSpawned As Integer = 0 - Do - Dim SmokeDestination = New Vector3(CSng(Random.Next(-10, 10) / 10), CSng(Random.Next(-10, 10) / 10), CSng(Random.Next(-10, 10) / 10)) - - Dim SmokeTexture As Texture2D = TextureManager.GetTexture("Textures\Battle\Smoke") - - Dim SmokeScale = New Vector3(CSng(Random.Next(2, 6) / 10)) - Dim SmokeSpeed = CSng(Random.Next(1, 3) / 20.0F) - - Dim SmokeEntity As Entity = BallThrowOwn.SpawnEntity(Nothing, SmokeTexture, SmokeScale, 1.0F, 3) - BallThrowOwn.AnimationMove(SmokeEntity, True, SmokeDestination.X, SmokeDestination.Y, SmokeDestination.Z, SmokeSpeed, False, False, 3.0F, 0.0F) - - Threading.Interlocked.Increment(SmokeSpawned) - Loop While SmokeSpawned <= 38 - End If - - ' Pokemon appears - BallThrowOwn.AnimationFade(Nothing, False, 1, True, 1, 3, 0) - BallThrowOwn.AnimationPlaySound(CStr(Me.OwnPokemon.Number), 4, 0,, True) - - If Core.Player.ShowBattleAnimations <> 0 Then - ' Pokémon falls down - BallThrowOwn.AnimationMove(Nothing, False, 0, 0, 0, 0.05F, False, False, 5, 0,,, 3) - End If - - Me.BattleQuery.Add(BallThrowOwn) - Dim q5 As ToggleMenuQueryObject = New ToggleMenuQueryObject(Me.BattleMenu.Visible) Dim cq1 As ScreenFadeQueryObject = New ScreenFadeQueryObject(ScreenFadeQueryObject.FadeTypes.Vertical, Color.Black, True, 16) diff --git a/P3D/Pokemon/Attacks/Grass/Absorb.vb b/P3D/Pokemon/Attacks/Grass/Absorb.vb index b728851a3..efd2552a5 100644 --- a/P3D/Pokemon/Attacks/Grass/Absorb.vb +++ b/P3D/Pokemon/Attacks/Grass/Absorb.vb @@ -94,14 +94,14 @@ Public Overrides Sub InternalOpponentPokemonMoveAnimation(ByVal BattleScreen As BattleScreen, ByVal BattleFlip As Boolean, ByVal CurrentPokemon As Pokemon, ByVal CurrentEntity As NPC, ByVal CurrentModel As ModelEntity) Dim MoveAnimation As AnimationQueryObject = New AnimationQueryObject(CurrentEntity, BattleFlip) - Dim maxAmount As Integer = 8 + Dim maxAmount As Integer = 12 Dim currentAmount As Integer = 0 MoveAnimation.AnimationPlaySound("Battle\Attacks\Grass\Absorb", 0, 0) While currentAmount <= maxAmount - Dim yPos As Single = CSng(Random.NextDouble() * 0.5) - Dim zPos As Single = CSng(Random.Next(-5, 5) * 0.15) - Dim AbsorbEntity = MoveAnimation.SpawnEntity(New Vector3(0.0, 0.0, 0.0), TextureManager.GetTexture("Textures\Battle\Grass\Absorb"), New Vector3(0.35F), 1) - MoveAnimation.AnimationMove(AbsorbEntity, True, -1.5, yPos, zPos, 0.03, False, True, CSng(currentAmount), 0.0, 0.1, 0.5) + Dim yPos As Single = CSng(Random.Next(-1, 3) * 0.15) + Dim zPos As Single = CSng(Random.Next(-3, 3) * 0.15) + Dim AbsorbEntity = MoveAnimation.SpawnEntity(New Vector3(0.0, 0.0, 0.0), TextureManager.GetTexture("Textures\Battle\Grass\Absorb"), New Vector3(0.35F), 1, CSng(currentAmount * 0.8)) + MoveAnimation.AnimationMove(AbsorbEntity, True, -1.5, yPos, zPos, 0.03, False, True, CSng(currentAmount * 0.8), 0.0, 0.1, 0.5,, 0.005F) Threading.Interlocked.Increment(currentAmount) End While diff --git a/P3D/Screens/BattleIntroScreen.vb b/P3D/Screens/BattleIntroScreen.vb index 3e5bd3c49..121fdaeb2 100644 --- a/P3D/Screens/BattleIntroScreen.vb +++ b/P3D/Screens/BattleIntroScreen.vb @@ -455,7 +455,7 @@ If Animations.Count = 0 Then Animations.Add(New Rectangle(CInt(Core.windowSize.Width / 2 - (Core.windowSize.Width / 100 / 2)), CInt(Core.windowSize.Height / 2 - (Core.windowSize.Height / 100 / 2)), CInt(Core.windowSize.Width / 100), CInt(Core.windowSize.Height / 100))) Else - Dim Speed As Integer = CInt(Me.duration.TotalMilliseconds / Core.windowSize.Height * 6) + Dim Speed As Integer = CInt(Me.duration.TotalMilliseconds / Core.windowSize.Height * 3) If Animations(0).Height >= Core.windowSize.Height + 128 Then ready = True End If @@ -476,10 +476,10 @@ If Animations.Count = 0 Then Animations.Add(New Rectangle(0, 0, Core.windowSize.Width, Core.windowSize.Height)) Else - If value >= Core.windowSize.Height / 2 - 4 Then + If value >= Core.windowSize.Height / 2 + 4 Then ready = True Else - value += CInt(Math.Ceiling(Me.duration.TotalMilliseconds / Core.windowSize.Height * 3)) + value += CInt(Math.Ceiling(Me.duration.TotalMilliseconds / Core.windowSize.Height)) End If End If End Sub From dc9ec6bd23a11838b663fb1cbf3192f4ad52e819 Mon Sep 17 00:00:00 2001 From: "Jasper \"JappaWakka\" Speelman" <31563291+JappaWakka@users.noreply.github.com> Date: Sat, 6 Nov 2021 12:03:55 +0100 Subject: [PATCH 19/57] Fixed mistakes in Stat Animations + Updated Pound animation + Improved Tackle animation --- P3D/Battle/BattleSystemV2/Battle.vb | 4 ++-- P3D/Battle/BattleSystemV2/BattleMenu.vb | 8 ++++---- P3D/Pokemon/Attacks/Normal/Pound.vb | 2 +- P3D/Pokemon/Attacks/Normal/Tackle.vb | 2 +- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/P3D/Battle/BattleSystemV2/Battle.vb b/P3D/Battle/BattleSystemV2/Battle.vb index 3e1b9971a..d01e74b6c 100644 --- a/P3D/Battle/BattleSystemV2/Battle.vb +++ b/P3D/Battle/BattleSystemV2/Battle.vb @@ -3434,7 +3434,7 @@ Dim StatEntity As Entity = StatAnimation.SpawnEntity(Position, Texture, Scale, 1.0F, CSng(startDelay)) - StatAnimation.AnimationMove(Nothing, True, Destination.X, Destination.Y, Destination.Z, 0.05F, False, True, CSng(startDelay), 0.0F) + StatAnimation.AnimationMove(StatEntity, True, Destination.X, Destination.Y, Destination.Z, 0.05F, False, True, CSng(startDelay), 0.0F) Threading.Interlocked.Increment(currentAmount) End While BattleScreen.BattleQuery.Add(StatAnimation) @@ -3717,7 +3717,7 @@ Dim StatEntity As Entity = StatAnimation.SpawnEntity(Position, Texture, Scale, 1.0F, CSng(startDelay)) - StatAnimation.AnimationMove(Nothing, True, Destination.X, Destination.Y, Destination.Z, 0.05F, False, True, CSng(startDelay), 0.0F) + StatAnimation.AnimationMove(StatEntity, True, Destination.X, Destination.Y, Destination.Z, 0.05F, False, True, CSng(startDelay), 0.0F) Threading.Interlocked.Increment(currentAmount) End While BattleScreen.BattleQuery.Add(StatAnimation) diff --git a/P3D/Battle/BattleSystemV2/BattleMenu.vb b/P3D/Battle/BattleSystemV2/BattleMenu.vb index 870ecb4e9..16b265fa8 100644 --- a/P3D/Battle/BattleSystemV2/BattleMenu.vb +++ b/P3D/Battle/BattleSystemV2/BattleMenu.vb @@ -384,7 +384,7 @@ Core.SpriteBatch.Draw(Me.IconUnselected, New Rectangle(Core.ScreenSize.Width - (AllExtended + extraExtended) + 28, 132 + Index * 96, 48, 48), Color.White) If isSelected = True Then Core.SpriteBatch.Draw(Me.IconSelected, New Rectangle(Core.ScreenSize.Width - (AllExtended + extraExtended) + 28, 132 + Index * 96, 48, 48), New Color(255, 255, 255, (SelExtended + AllExtended))) - Core.SpriteBatch.DrawString(FontManager.MainFont, Me.Text, New Vector2(Core.ScreenSize.Width - (AllExtended + extraExtended) + 86, 144 + Index * 96), New Color(0, 0, 0, (SelExtended + AllExtended))) + Core.SpriteBatch.DrawString(FontManager.MainFont, Me.Text, New Vector2(CInt(Core.ScreenSize.Width - (AllExtended + extraExtended) + 86), CInt(144 + Index * 96)), New Color(0, 0, 0, (SelExtended + AllExtended))) Else If IconFading > 0 Then Core.SpriteBatch.Draw(Me.IconSelected, New Rectangle(Core.ScreenSize.Width - (AllExtended) + 28, 132 + Index * 96, 48, 48), New Color(255, 255, 255, IconFading)) @@ -471,10 +471,10 @@ Dim ppColor As Color = GetPPColor() ppColor.A = CByte((extraExtended + AllExtended - deductAlpha).Clamp(0, 255)) - Core.SpriteBatch.DrawString(FontManager.MiniFont, Me.Move.CurrentPP & "/" & Me.Move.MaxPP, New Vector2(Core.ScreenSize.Width - (AllExtended + extraExtended) + 28, 150 + Index * 96), ppColor) - Core.SpriteBatch.DrawString(FontManager.MainFont, Me.Move.Name, New Vector2(Core.ScreenSize.Width - (AllExtended + extraExtended) + 86, 144 + Index * 96), New Color(0, 0, 0, (SelExtended + AllExtended) - deductAlpha)) + Core.SpriteBatch.DrawString(FontManager.MainFont, Me.Move.CurrentPP & "/" & Me.Move.MaxPP, New Vector2(CInt(Core.ScreenSize.Width - (AllExtended + extraExtended) + 28), CInt(152 + Index * 96)), ppColor) + Core.SpriteBatch.DrawString(FontManager.MainFont, Me.Move.Name, New Vector2(CInt(Core.ScreenSize.Width - (AllExtended + extraExtended) + 86), CInt(132 + Index * 96)), New Color(0, 0, 0, (SelExtended + AllExtended) - deductAlpha)) Else - Core.SpriteBatch.DrawString(FontManager.MiniFont, Me.Move.Name, New Vector2(Core.ScreenSize.Width - (AllExtended + extraExtended) + 28, 150 + Index * 96), New Color(0, 0, 0, 255 - (extraExtended + AllExtended) - deductAlpha)) + Core.SpriteBatch.DrawString(FontManager.MainFont, Me.Move.Name, New Vector2(Core.ScreenSize.Width - (AllExtended + extraExtended) + 28, 152 + Index * 96), New Color(0, 0, 0, 255 - (extraExtended + AllExtended) - deductAlpha)) End If End Sub diff --git a/P3D/Pokemon/Attacks/Normal/Pound.vb b/P3D/Pokemon/Attacks/Normal/Pound.vb index b3441945a..8b4525c2b 100644 --- a/P3D/Pokemon/Attacks/Normal/Pound.vb +++ b/P3D/Pokemon/Attacks/Normal/Pound.vb @@ -58,7 +58,7 @@ Public Overrides Sub InternalOpponentPokemonMoveAnimation(ByVal BattleScreen As BattleScreen, ByVal BattleFlip As Boolean, ByVal CurrentPokemon As Pokemon, ByVal CurrentEntity As NPC, ByVal CurrentModel As ModelEntity) Dim MoveAnimation As AnimationQueryObject = New AnimationQueryObject(CurrentEntity, BattleFlip) MoveAnimation.AnimationPlaySound("Battle\Attacks\Pound", 0.5, 2.5) - Dim PoundEntity = MoveAnimation.SpawnEntity(New Vector3(-0.25, -0.25, -0.25), TextureManager.GetTexture("Textures\Battle\Normal\Growl", New Rectangle(0, 0, 32, 32), ""), New Vector3(0.5F), 1, 0, 3) + Dim PoundEntity = MoveAnimation.SpawnEntity(New Vector3(0, -0.2, 0), TextureManager.GetTexture("Textures\Battle\Normal\Pound"), New Vector3(0.5F), 1, 0, 3) MoveAnimation.AnimationFade(PoundEntity, True, 1.0F, False, 0.0F, 3, 0) BattleScreen.BattleQuery.Add(MoveAnimation) End Sub diff --git a/P3D/Pokemon/Attacks/Normal/Tackle.vb b/P3D/Pokemon/Attacks/Normal/Tackle.vb index 9179a9538..9db1f6f88 100644 --- a/P3D/Pokemon/Attacks/Normal/Tackle.vb +++ b/P3D/Pokemon/Attacks/Normal/Tackle.vb @@ -62,7 +62,7 @@ Public Overrides Sub InternalOpponentPokemonMoveAnimation(ByVal BattleScreen As BattleScreen, ByVal BattleFlip As Boolean, ByVal CurrentPokemon As Pokemon, ByVal CurrentEntity As NPC, ByVal CurrentModel As ModelEntity) Dim MoveAnimation As AnimationQueryObject = New AnimationQueryObject(CurrentEntity, BattleFlip) MoveAnimation.AnimationPlaySound("Battle\Attacks\Normal\Tackle", 0, 0) - Dim SpawnEntity = MoveAnimation.SpawnEntity(New Vector3(0, 0, 0), TextureManager.GetTexture("Textures\Battle\Normal\Tackle"), New Vector3(0.5F), 1.0F, 0, 2) + Dim SpawnEntity = MoveAnimation.SpawnEntity(New Vector3(0, -0.2, 0), TextureManager.GetTexture("Textures\Battle\Normal\Tackle"), New Vector3(0.5F), 1.0F, 0, 2) MoveAnimation.AnimationFade(SpawnEntity, True, 1.0F, False, 0.0F, 2, 0) BattleScreen.BattleQuery.Add(MoveAnimation) End Sub From 71cdb5e0c04e28532a3e0715e41480d7de28bd1b Mon Sep 17 00:00:00 2001 From: "Jasper \"JappaWakka\" Speelman" <31563291+JappaWakka@users.noreply.github.com> Date: Sat, 6 Nov 2021 18:22:17 +0100 Subject: [PATCH 20/57] Added Paralysis Animation --- P3D/Battle/BattleSystemV2/Battle.vb | 72 +++++++++++++++++- .../Textures/Battle/Electric/Sparks.png | Bin 0 -> 395 bytes P3D/P3D.vbproj | 3 + 3 files changed, 72 insertions(+), 3 deletions(-) create mode 100644 P3D/Content/Textures/Battle/Electric/Sparks.png diff --git a/P3D/Battle/BattleSystemV2/Battle.vb b/P3D/Battle/BattleSystemV2/Battle.vb index d01e74b6c..6cef7836a 100644 --- a/P3D/Battle/BattleSystemV2/Battle.vb +++ b/P3D/Battle/BattleSystemV2/Battle.vb @@ -1122,14 +1122,20 @@ 'p: the attacking pokemon 'op: the target pokemon Dim p As Pokemon + Dim pNPC As NPC Dim op As Pokemon + Dim opNPC As NPC If own Then p = BattleScreen.OwnPokemon op = BattleScreen.OppPokemon + pNPC = BattleScreen.OwnPokemonNPC + opNPC = BattleScreen.OppPokemonNPC BattleScreen.FieldEffects.OwnLastMove = moveUsed Else p = BattleScreen.OppPokemon op = BattleScreen.OwnPokemon + pNPC = BattleScreen.OppPokemonNPC + opNPC = BattleScreen.OwnPokemonNPC BattleScreen.FieldEffects.OppLastMove = moveUsed End If If WildHasEscaped Then @@ -1405,7 +1411,36 @@ If p.Status = Pokemon.StatusProblems.Paralyzed Then If Core.Random.Next(0, 4) = 0 Then - BattleScreen.BattleQuery.Add(New PlaySoundQueryObject("Battle\Effects\Paralyzed", False)) + If Core.Player.ShowBattleAnimations <> 0 Then + Dim ParalyzedAnimation As AnimationQueryObject = New AnimationQueryObject(pNPC, Not own) + + ParalyzedAnimation.AnimationPlaySound("Battle\Effects\Paralyzed", 0, 0) + Dim maxAmount As Integer = 4 + Dim currentAmount As Integer = 0 + While currentAmount <= maxAmount + Dim Texture As Texture2D = TextureManager.GetTexture("Textures\Battle\Electric\Sparks", New Rectangle(0, 0, 16, 16), "") + Dim xPos = CSng(Random.Next(-4, 4) / 8) + Dim zPos = CSng(Random.Next(-4, 4) / 8) + + Dim Position As New Vector3(xPos, -0.25, zPos) + Dim Destination As New Vector3(xPos - xPos * 2, 0, zPos - zPos * 2) + Dim Scale As New Vector3(0.25F) + Dim startDelay As Double = 5.0 * Random.NextDouble() + Dim ShockEntity = ParalyzedAnimation.SpawnEntity(Position, Texture, Scale, 1.0F, CSng(startDelay)) + ParalyzedAnimation.AnimationMove(ShockEntity, True, Destination.X, Destination.Y, Destination.Z, 0.025F, False, True, CSng(startDelay), 0.0F) + ParalyzedAnimation.AnimationChangeTexture(ShockEntity, False, TextureManager.GetTexture("Textures\Battle\Electric\Sparks", New Rectangle(16, 0, 16, 16), ""), CSng(startDelay + 1), 1) + ParalyzedAnimation.AnimationChangeTexture(ShockEntity, False, TextureManager.GetTexture("Textures\Battle\Electric\Sparks", New Rectangle(32, 0, 16, 16), ""), CSng(startDelay + 2), 1) + ParalyzedAnimation.AnimationChangeTexture(ShockEntity, False, TextureManager.GetTexture("Textures\Battle\Electric\Sparks", New Rectangle(48, 0, 16, 16), ""), CSng(startDelay + 3), 1) + ParalyzedAnimation.AnimationChangeTexture(ShockEntity, False, TextureManager.GetTexture("Textures\Battle\Electric\Sparks", New Rectangle(64, 0, 16, 16), ""), CSng(startDelay + 4), 1) + ParalyzedAnimation.AnimationChangeTexture(ShockEntity, False, TextureManager.GetTexture("Textures\Battle\Electric\Sparks", New Rectangle(72, 0, 16, 16), ""), CSng(startDelay + 5), 1) + + Threading.Interlocked.Increment(currentAmount) + End While + + BattleScreen.BattleQuery.Add(ParalyzedAnimation) + Else + BattleScreen.BattleQuery.Add(New PlaySoundQueryObject("Battle\Effects\Paralyzed", False)) + End If BattleScreen.BattleQuery.Add(New TextQueryObject(p.GetDisplayName() & " is fully paralyzed!" & Environment.NewLine & "It cannot move!")) Exit Sub End If @@ -2873,7 +2908,9 @@ Public Function InflictParalysis(ByVal own As Boolean, ByVal from As Boolean, ByVal BattleScreen As BattleScreen, ByVal message As String, ByVal cause As String) As Boolean Dim p As Pokemon = BattleScreen.OwnPokemon Dim op As Pokemon = BattleScreen.OppPokemon + Dim pNPC As NPC = BattleScreen.OwnPokemonNPC If own = False Then + pNPC = BattleScreen.OppPokemonNPC p = BattleScreen.OppPokemon op = BattleScreen.OwnPokemon End If @@ -2934,7 +2971,36 @@ 'Works! p.Status = Pokemon.StatusProblems.Paralyzed ChangeCameraAngle(1, own, BattleScreen) - BattleScreen.BattleQuery.Add(New PlaySoundQueryObject("Battle\Effects\Paralyzed", False)) + If Core.Player.ShowBattleAnimations <> 0 Then + Dim ParalyzedAnimation As AnimationQueryObject = New AnimationQueryObject(pNPC, Not own) + + ParalyzedAnimation.AnimationPlaySound("Battle\Effects\Paralyzed", 0, 0) + Dim maxAmount As Integer = 4 + Dim currentAmount As Integer = 0 + While currentAmount <= maxAmount + Dim Texture As Texture2D = TextureManager.GetTexture("Textures\Battle\Electric\Sparks", New Rectangle(0, 0, 16, 16), "") + Dim xPos = CSng(Random.Next(-4, 4) / 8) + Dim zPos = CSng(Random.Next(-4, 4) / 8) + + Dim Position As New Vector3(xPos, -0.25, zPos) + Dim Destination As New Vector3(xPos - xPos * 2, 0, zPos - zPos * 2) + Dim Scale As New Vector3(0.25F) + Dim startDelay As Double = 5.0 * Random.NextDouble() + Dim ShockEntity = ParalyzedAnimation.SpawnEntity(Position, Texture, Scale, 1.0F, CSng(startDelay)) + ParalyzedAnimation.AnimationMove(ShockEntity, False, Destination.X, Destination.Y, Destination.Z, 0.025F, False, True, CSng(startDelay), 0.0F) + ParalyzedAnimation.AnimationChangeTexture(ShockEntity, False, TextureManager.GetTexture("Textures\Battle\Electric\Sparks", New Rectangle(16, 0, 16, 16), ""), CSng(startDelay + 1), 0) + ParalyzedAnimation.AnimationChangeTexture(ShockEntity, False, TextureManager.GetTexture("Textures\Battle\Electric\Sparks", New Rectangle(32, 0, 16, 16), ""), CSng(startDelay + 2), 0) + ParalyzedAnimation.AnimationChangeTexture(ShockEntity, False, TextureManager.GetTexture("Textures\Battle\Electric\Sparks", New Rectangle(48, 0, 16, 16), ""), CSng(startDelay + 3), 0) + ParalyzedAnimation.AnimationChangeTexture(ShockEntity, False, TextureManager.GetTexture("Textures\Battle\Electric\Sparks", New Rectangle(64, 0, 16, 16), ""), CSng(startDelay + 4), 0) + ParalyzedAnimation.AnimationChangeTexture(ShockEntity, True, TextureManager.GetTexture("Textures\Battle\Electric\Sparks", New Rectangle(72, 0, 16, 16), ""), CSng(startDelay + 5), 0) + + Threading.Interlocked.Increment(currentAmount) + End While + + BattleScreen.BattleQuery.Add(ParalyzedAnimation) + Else + BattleScreen.BattleQuery.Add(New PlaySoundQueryObject("Battle\Effects\Paralyzed", False)) + End If Select Case message Case "" 'Print default message only BattleScreen.BattleQuery.Add(New TextQueryObject(p.GetDisplayName() & " is paralyzed!" & Environment.NewLine & "It can't move!")) @@ -7352,7 +7418,7 @@ End If ' Pokemon appears BallThrow.AnimationFade(Nothing, False, 1, True, 1, 3, 0) - BallThrow.AnimationPlaySound(CStr(BattleScreen.OppPokemon.Number), 4, 0,, True) + BallThrow.AnimationPlaySound(CStr(BattleScreen.OppPokemon.Number), 4, 0,, True) If Core.Player.ShowBattleAnimations <> 0 Then ' Pokémon falls down BallThrow.AnimationMove(Nothing, False, 0, 0, 0, 0.05F, False, False, 5, 0,,, 4) diff --git a/P3D/Content/Textures/Battle/Electric/Sparks.png b/P3D/Content/Textures/Battle/Electric/Sparks.png new file mode 100644 index 0000000000000000000000000000000000000000..1c0bd76cbcf60d508a167d8028fd663d8814364f GIT binary patch literal 395 zcmV;60d)R}P)AHIP00009a7bBm000XT z000XT0n*)m`~Uy|8+1ijbW?9;ba!ELWdK8EY;$>YAX9X8WNB|8RBvx=!KdMT0003N zNklKMP+n_x10U?=S#4r*p&FjJ8%pe3boZ*(Bmi?q3Un zv?@WKbgs=5R5{t#Iawlm0ccrxo-3`-04o}p0HXGzK6uKcwm%a9LlBPuEb& PreserveNewest + + PreserveNewest + PreserveNewest From 51b9eb649a50cabebbb4e5cf71886c5fc6b6b2c2 Mon Sep 17 00:00:00 2001 From: "Jasper \"JappaWakka\" Speelman" <31563291+JappaWakka@users.noreply.github.com> Date: Sun, 21 Nov 2021 12:59:21 +0100 Subject: [PATCH 21/57] Fix for missing texture in Poisoned & Burned animations as well as poison sting. --- P3D/Battle/BattleSystemV2/Battle.vb | 100 +++++++++++----------- P3D/Pokemon/Attacks/Poison/PoisonSting.vb | 18 ++-- 2 files changed, 59 insertions(+), 59 deletions(-) diff --git a/P3D/Battle/BattleSystemV2/Battle.vb b/P3D/Battle/BattleSystemV2/Battle.vb index 6cef7836a..6599327ce 100644 --- a/P3D/Battle/BattleSystemV2/Battle.vb +++ b/P3D/Battle/BattleSystemV2/Battle.vb @@ -2748,11 +2748,11 @@ 'Burn animation Dim BurnAnimation As AnimationQueryObject = New AnimationQueryObject(pNPC, own) BurnAnimation.AnimationPlaySound("Battle\Effects\Burned", 0, 0) - Dim FlameEntity As Entity = BurnAnimation.SpawnEntity(New Vector3(CSng(-0.25), CSng(-0.25), CSng(-0.25)), TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 0, 32, 32)), New Vector3(0.5, 0.5, 0.5), 1.0F) - BurnAnimation.AnimationChangeTexture(FlameEntity, False, TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 32, 32, 32)), 2, 1) - BurnAnimation.AnimationChangeTexture(FlameEntity, False, TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 64, 32, 32)), 3, 1) - BurnAnimation.AnimationChangeTexture(FlameEntity, False, TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 96, 32, 32)), 4, 1) - BurnAnimation.AnimationChangeTexture(FlameEntity, True, TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 128, 32, 32)), 5, 2) + Dim FlameEntity As Entity = BurnAnimation.SpawnEntity(New Vector3(CSng(-0.25), CSng(-0.25), CSng(-0.25)), TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 0, 32, 32), ""), New Vector3(0.5, 0.5, 0.5), 1.0F) + BurnAnimation.AnimationChangeTexture(FlameEntity, False, TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 32, 32, 32), ""), 2, 1) + BurnAnimation.AnimationChangeTexture(FlameEntity, False, TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 64, 32, 32), ""), 3, 1) + BurnAnimation.AnimationChangeTexture(FlameEntity, False, TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 96, 32, 32), ""), 4, 1) + BurnAnimation.AnimationChangeTexture(FlameEntity, True, TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 128, 32, 32), ""), 5, 2) BattleScreen.BattleQuery.Add(BurnAnimation) Select Case message @@ -5461,19 +5461,19 @@ Dim PoisonAnimation As AnimationQueryObject = New AnimationQueryObject(BattleScreen.OwnPokemonNPC, True) PoisonAnimation.AnimationPlaySound("Battle\Effects\Poisoned", 0, 0) - Dim BubbleEntity1 As Entity = PoisonAnimation.SpawnEntity(New Vector3(-0.25, -0.25, -0.25), TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 0, 32, 32)), New Vector3(0.5F), 1, 0, 1) + Dim BubbleEntity1 As Entity = PoisonAnimation.SpawnEntity(New Vector3(-0.25, -0.25, -0.25), TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 0, 32, 32), ""), New Vector3(0.5F), 1, 0, 1) - PoisonAnimation.AnimationChangeTexture(BubbleEntity1, False, TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 32, 32, 32)), 1, 1) - Dim BubbleEntity2 As Entity = PoisonAnimation.SpawnEntity(New Vector3(0.25, -0.25, 0.25), TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 0, 32, 32)), New Vector3(0.5F), 1, 1, 1) + PoisonAnimation.AnimationChangeTexture(BubbleEntity1, False, TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 32, 32, 32), ""), 1, 1) + Dim BubbleEntity2 As Entity = PoisonAnimation.SpawnEntity(New Vector3(0.25, -0.25, 0.25), TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 0, 32, 32), ""), New Vector3(0.5F), 1, 1, 1) - PoisonAnimation.AnimationChangeTexture(BubbleEntity1, True, TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 64, 32, 32)), 2, 1) - PoisonAnimation.AnimationChangeTexture(BubbleEntity2, False, TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 32, 32, 32)), 2, 1) - Dim BubbleEntity3 As Entity = PoisonAnimation.SpawnEntity(New Vector3(0.25, -0.25, -0.25), TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 0, 32, 32)), New Vector3(0.5F), 1, 2, 1) + PoisonAnimation.AnimationChangeTexture(BubbleEntity1, True, TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 64, 32, 32), ""), 2, 1) + PoisonAnimation.AnimationChangeTexture(BubbleEntity2, False, TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 32, 32, 32), ""), 2, 1) + Dim BubbleEntity3 As Entity = PoisonAnimation.SpawnEntity(New Vector3(0.25, -0.25, -0.25), TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 0, 32, 32), ""), New Vector3(0.5F), 1, 2, 1) - PoisonAnimation.AnimationChangeTexture(BubbleEntity2, True, TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 64, 32, 32)), 3, 1) - PoisonAnimation.AnimationChangeTexture(BubbleEntity3, False, TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 32, 32, 32)), 3, 1) + PoisonAnimation.AnimationChangeTexture(BubbleEntity2, True, TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 64, 32, 32), ""), 3, 1) + PoisonAnimation.AnimationChangeTexture(BubbleEntity3, False, TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 32, 32, 32), ""), 3, 1) - PoisonAnimation.AnimationChangeTexture(BubbleEntity3, True, TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 64, 32, 32)), 4, 1) + PoisonAnimation.AnimationChangeTexture(BubbleEntity3, True, TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 64, 32, 32), ""), 4, 1) BattleScreen.BattleQuery.Add(PoisonAnimation) End If @@ -5489,19 +5489,19 @@ Dim PoisonAnimation As AnimationQueryObject = New AnimationQueryObject(BattleScreen.OwnPokemonNPC, True) PoisonAnimation.AnimationPlaySound("Battle\Effects\Poisoned", 0, 0) - Dim BubbleEntity1 As Entity = PoisonAnimation.SpawnEntity(New Vector3(-0.25, -0.25, -0.25), TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 0, 32, 32)), New Vector3(0.5F), 1, 0, 1) + Dim BubbleEntity1 As Entity = PoisonAnimation.SpawnEntity(New Vector3(-0.25, -0.25, -0.25), TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 0, 32, 32), ""), New Vector3(0.5F), 1, 0, 1) - PoisonAnimation.AnimationChangeTexture(BubbleEntity1, False, TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 32, 32, 32)), 1, 1) - Dim BubbleEntity2 As Entity = PoisonAnimation.SpawnEntity(New Vector3(0.25, -0.25, 0.25), TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 0, 32, 32)), New Vector3(0.5F), 1, 1, 1) + PoisonAnimation.AnimationChangeTexture(BubbleEntity1, False, TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 32, 32, 32), ""), 1, 1) + Dim BubbleEntity2 As Entity = PoisonAnimation.SpawnEntity(New Vector3(0.25, -0.25, 0.25), TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 0, 32, 32), ""), New Vector3(0.5F), 1, 1, 1) - PoisonAnimation.AnimationChangeTexture(BubbleEntity1, True, TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 64, 32, 32)), 2, 1) - PoisonAnimation.AnimationChangeTexture(BubbleEntity2, False, TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 32, 32, 32)), 2, 1) - Dim BubbleEntity3 As Entity = PoisonAnimation.SpawnEntity(New Vector3(0.25, -0.25, -0.25), TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 0, 32, 32)), New Vector3(0.5F), 1, 2, 1) + PoisonAnimation.AnimationChangeTexture(BubbleEntity1, True, TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 64, 32, 32), ""), 2, 1) + PoisonAnimation.AnimationChangeTexture(BubbleEntity2, False, TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 32, 32, 32), ""), 2, 1) + Dim BubbleEntity3 As Entity = PoisonAnimation.SpawnEntity(New Vector3(0.25, -0.25, -0.25), TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 0, 32, 32), ""), New Vector3(0.5F), 1, 2, 1) - PoisonAnimation.AnimationChangeTexture(BubbleEntity2, True, TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 64, 32, 32)), 3, 1) - PoisonAnimation.AnimationChangeTexture(BubbleEntity3, False, TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 32, 32, 32)), 3, 1) + PoisonAnimation.AnimationChangeTexture(BubbleEntity2, True, TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 64, 32, 32), ""), 3, 1) + PoisonAnimation.AnimationChangeTexture(BubbleEntity3, False, TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 32, 32, 32), ""), 3, 1) - PoisonAnimation.AnimationChangeTexture(BubbleEntity3, True, TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 64, 32, 32)), 4, 1) + PoisonAnimation.AnimationChangeTexture(BubbleEntity3, True, TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 64, 32, 32), ""), 4, 1) BattleScreen.BattleQuery.Add(PoisonAnimation) End If @@ -5526,10 +5526,10 @@ BurnAnimation.AnimationPlaySound("Battle\Effects\Burned", 0, 0) Dim FlameEntity As Entity = BurnAnimation.SpawnEntity(New Vector3(0.25F, 0.25F, 0.25), TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 0, 32, 32), ""), New Vector3(0.5, 0.5, 0.5), 1.0F) - BurnAnimation.AnimationChangeTexture(FlameEntity, False, TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 32, 32, 32)), 2, 1) - BurnAnimation.AnimationChangeTexture(FlameEntity, False, TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 64, 32, 32)), 3, 1) - BurnAnimation.AnimationChangeTexture(FlameEntity, False, TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 96, 32, 32)), 4, 1) - BurnAnimation.AnimationChangeTexture(FlameEntity, True, TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 128, 32, 32)), 5, 2) + BurnAnimation.AnimationChangeTexture(FlameEntity, False, TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 32, 32, 32), ""), 2, 1) + BurnAnimation.AnimationChangeTexture(FlameEntity, False, TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 64, 32, 32), ""), 3, 1) + BurnAnimation.AnimationChangeTexture(FlameEntity, False, TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 96, 32, 32), ""), 4, 1) + BurnAnimation.AnimationChangeTexture(FlameEntity, True, TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 128, 32, 32), ""), 5, 2) BattleScreen.BattleQuery.Add(BurnAnimation) End If 'Actual damage @@ -6264,19 +6264,19 @@ Dim PoisonAnimation As AnimationQueryObject = New AnimationQueryObject(BattleScreen.OppPokemonNPC, False) PoisonAnimation.AnimationPlaySound("Battle\Effects\Poisoned", 0, 0) - Dim BubbleEntity1 As Entity = PoisonAnimation.SpawnEntity(New Vector3(-0.25, -0.25, -0.25), TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 0, 32, 32)), New Vector3(0.5F), 1, 0, 1) + Dim BubbleEntity1 As Entity = PoisonAnimation.SpawnEntity(New Vector3(-0.25, -0.25, -0.25), TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 0, 32, 32), ""), New Vector3(0.5F), 1, 0, 1) - PoisonAnimation.AnimationChangeTexture(BubbleEntity1, False, TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 32, 32, 32)), 1, 1) - Dim BubbleEntity2 As Entity = PoisonAnimation.SpawnEntity(New Vector3(0.25, -0.25, 0.25), TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 0, 32, 32)), New Vector3(0.5F), 1, 1, 1) + PoisonAnimation.AnimationChangeTexture(BubbleEntity1, False, TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 32, 32, 32), ""), 1, 1) + Dim BubbleEntity2 As Entity = PoisonAnimation.SpawnEntity(New Vector3(0.25, -0.25, 0.25), TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 0, 32, 32), ""), New Vector3(0.5F), 1, 1, 1) - PoisonAnimation.AnimationChangeTexture(BubbleEntity1, True, TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 64, 32, 32)), 2, 1) - PoisonAnimation.AnimationChangeTexture(BubbleEntity2, False, TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 32, 32, 32)), 2, 1) - Dim BubbleEntity3 As Entity = PoisonAnimation.SpawnEntity(New Vector3(0.25, -0.25, -0.25), TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 0, 32, 32)), New Vector3(0.5F), 1, 2, 1) + PoisonAnimation.AnimationChangeTexture(BubbleEntity1, True, TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 64, 32, 32), ""), 2, 1) + PoisonAnimation.AnimationChangeTexture(BubbleEntity2, False, TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 32, 32, 32), ""), 2, 1) + Dim BubbleEntity3 As Entity = PoisonAnimation.SpawnEntity(New Vector3(0.25, -0.25, -0.25), TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 0, 32, 32), ""), New Vector3(0.5F), 1, 2, 1) - PoisonAnimation.AnimationChangeTexture(BubbleEntity2, True, TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 64, 32, 32)), 3, 1) - PoisonAnimation.AnimationChangeTexture(BubbleEntity3, False, TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 32, 32, 32)), 3, 1) + PoisonAnimation.AnimationChangeTexture(BubbleEntity2, True, TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 64, 32, 32), ""), 3, 1) + PoisonAnimation.AnimationChangeTexture(BubbleEntity3, False, TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 32, 32, 32), ""), 3, 1) - PoisonAnimation.AnimationChangeTexture(BubbleEntity3, True, TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 64, 32, 32)), 4, 1) + PoisonAnimation.AnimationChangeTexture(BubbleEntity3, True, TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 64, 32, 32), ""), 4, 1) BattleScreen.BattleQuery.Add(PoisonAnimation) End If @@ -6292,19 +6292,19 @@ Dim PoisonAnimation As AnimationQueryObject = New AnimationQueryObject(BattleScreen.OppPokemonNPC, False) PoisonAnimation.AnimationPlaySound("Battle\Effects\Poisoned", 0, 0) - Dim BubbleEntity1 As Entity = PoisonAnimation.SpawnEntity(New Vector3(-0.25, -0.25, -0.25), TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 0, 32, 32)), New Vector3(0.5F), 1, 0, 1) + Dim BubbleEntity1 As Entity = PoisonAnimation.SpawnEntity(New Vector3(-0.25, -0.25, -0.25), TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 0, 32, 32), ""), New Vector3(0.5F), 1, 0, 1) - PoisonAnimation.AnimationChangeTexture(BubbleEntity1, False, TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 32, 32, 32)), 1, 1) - Dim BubbleEntity2 As Entity = PoisonAnimation.SpawnEntity(New Vector3(0.25, -0.25, 0.25), TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 0, 32, 32)), New Vector3(0.5F), 1, 1, 1) + PoisonAnimation.AnimationChangeTexture(BubbleEntity1, False, TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 32, 32, 32), ""), 1, 1) + Dim BubbleEntity2 As Entity = PoisonAnimation.SpawnEntity(New Vector3(0.25, -0.25, 0.25), TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 0, 32, 32), ""), New Vector3(0.5F), 1, 1, 1) - PoisonAnimation.AnimationChangeTexture(BubbleEntity1, True, TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 64, 32, 32)), 2, 1) - PoisonAnimation.AnimationChangeTexture(BubbleEntity2, False, TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 32, 32, 32)), 2, 1) - Dim BubbleEntity3 As Entity = PoisonAnimation.SpawnEntity(New Vector3(0.25, -0.25, -0.25), TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 0, 32, 32)), New Vector3(0.5F), 1, 2, 1) + PoisonAnimation.AnimationChangeTexture(BubbleEntity1, True, TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 64, 32, 32), ""), 2, 1) + PoisonAnimation.AnimationChangeTexture(BubbleEntity2, False, TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 32, 32, 32), ""), 2, 1) + Dim BubbleEntity3 As Entity = PoisonAnimation.SpawnEntity(New Vector3(0.25, -0.25, -0.25), TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 0, 32, 32), ""), New Vector3(0.5F), 1, 2, 1) - PoisonAnimation.AnimationChangeTexture(BubbleEntity2, True, TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 64, 32, 32)), 3, 1) - PoisonAnimation.AnimationChangeTexture(BubbleEntity3, False, TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 32, 32, 32)), 3, 1) + PoisonAnimation.AnimationChangeTexture(BubbleEntity2, True, TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 64, 32, 32), ""), 3, 1) + PoisonAnimation.AnimationChangeTexture(BubbleEntity3, False, TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 32, 32, 32), ""), 3, 1) - PoisonAnimation.AnimationChangeTexture(BubbleEntity3, True, TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 64, 32, 32)), 4, 1) + PoisonAnimation.AnimationChangeTexture(BubbleEntity3, True, TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 64, 32, 32), ""), 4, 1) BattleScreen.BattleQuery.Add(PoisonAnimation) 'Actual damage @@ -6327,11 +6327,11 @@ Dim BurnAnimation As AnimationQueryObject = New AnimationQueryObject(BattleScreen.OppPokemonNPC, True) BurnAnimation.AnimationPlaySound("Battle\Effects\Burned", 0, 0) - Dim FlameEntity As Entity = BurnAnimation.SpawnEntity(New Vector3(0.25, 0.25, 0.25), TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 0, 32, 32)), New Vector3(0.5, 0.5, 0.5), 1.0F) - BurnAnimation.AnimationChangeTexture(FlameEntity, False, TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 32, 32, 32)), 2, 1) - BurnAnimation.AnimationChangeTexture(FlameEntity, False, TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 64, 32, 32)), 3, 1) - BurnAnimation.AnimationChangeTexture(FlameEntity, False, TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 96, 32, 32)), 4, 1) - BurnAnimation.AnimationChangeTexture(FlameEntity, True, TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 128, 32, 32)), 5, 2) + Dim FlameEntity As Entity = BurnAnimation.SpawnEntity(New Vector3(0.25, 0.25, 0.25), TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 0, 32, 32), ""), New Vector3(0.5, 0.5, 0.5), 1.0F) + BurnAnimation.AnimationChangeTexture(FlameEntity, False, TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 32, 32, 32), ""), 2, 1) + BurnAnimation.AnimationChangeTexture(FlameEntity, False, TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 64, 32, 32), ""), 3, 1) + BurnAnimation.AnimationChangeTexture(FlameEntity, False, TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 96, 32, 32), ""), 4, 1) + BurnAnimation.AnimationChangeTexture(FlameEntity, True, TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 128, 32, 32), ""), 5, 2) BattleScreen.BattleQuery.Add(BurnAnimation) End If 'Actual damage diff --git a/P3D/Pokemon/Attacks/Poison/PoisonSting.vb b/P3D/Pokemon/Attacks/Poison/PoisonSting.vb index 8104dbcd4..9393f3042 100644 --- a/P3D/Pokemon/Attacks/Poison/PoisonSting.vb +++ b/P3D/Pokemon/Attacks/Poison/PoisonSting.vb @@ -84,21 +84,21 @@ MoveAnimation.AnimationPlaySound("Battle\Attacks\Poison\PoisonSting_Hit", 1, 0) - Dim BubbleEntity1 As Entity = MoveAnimation.SpawnEntity(New Vector3(-0.25, -0.25, -0.25), TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 0, 32, 32)), New Vector3(0.5F), 1, 1, 1) + Dim BubbleEntity1 As Entity = MoveAnimation.SpawnEntity(New Vector3(-0.25, -0.25, -0.25), TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 0, 32, 32), ""), New Vector3(0.5F), 1, 1, 1) - MoveAnimation.AnimationChangeTexture(BubbleEntity1, False, TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 32, 32, 32)), 2, 1) + MoveAnimation.AnimationChangeTexture(BubbleEntity1, False, TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 32, 32, 32), ""), 2, 1) - Dim BubbleEntity2 As Entity = MoveAnimation.SpawnEntity(New Vector3(0.25, -0.25, 0.25), TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 0, 32, 32)), New Vector3(0.5F), 1, 2, 1) + Dim BubbleEntity2 As Entity = MoveAnimation.SpawnEntity(New Vector3(0.25, -0.25, 0.25), TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 0, 32, 32), ""), New Vector3(0.5F), 1, 2, 1) - MoveAnimation.AnimationChangeTexture(BubbleEntity1, True, TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 64, 32, 32)), 3, 1) - MoveAnimation.AnimationChangeTexture(BubbleEntity2, False, TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 32, 32, 32)), 3, 1) + MoveAnimation.AnimationChangeTexture(BubbleEntity1, True, TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 64, 32, 32), ""), 3, 1) + MoveAnimation.AnimationChangeTexture(BubbleEntity2, False, TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 32, 32, 32), ""), 3, 1) - Dim BubbleEntity3 As Entity = MoveAnimation.SpawnEntity(New Vector3(0.25, -0.25, -0.25), TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 0, 32, 32)), New Vector3(0.5F), 1, 3, 1) + Dim BubbleEntity3 As Entity = MoveAnimation.SpawnEntity(New Vector3(0.25, -0.25, -0.25), TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 0, 32, 32), ""), New Vector3(0.5F), 1, 3, 1) - MoveAnimation.AnimationChangeTexture(BubbleEntity2, True, TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 64, 32, 32)), 4, 1) - MoveAnimation.AnimationChangeTexture(BubbleEntity3, False, TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 32, 32, 32)), 4, 1) + MoveAnimation.AnimationChangeTexture(BubbleEntity2, True, TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 64, 32, 32), ""), 4, 1) + MoveAnimation.AnimationChangeTexture(BubbleEntity3, False, TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 32, 32, 32), ""), 4, 1) - MoveAnimation.AnimationChangeTexture(BubbleEntity3, True, TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 64, 32, 32)), 5, 1) + MoveAnimation.AnimationChangeTexture(BubbleEntity3, True, TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 64, 32, 32), ""), 5, 1) BattleScreen.BattleQuery.Add(MoveAnimation) End Sub From e9d4cacd3c41c50bc588898f0d8c1581154e93e4 Mon Sep 17 00:00:00 2001 From: "Jasper \"JappaWakka\" Speelman" <31563291+JappaWakka@users.noreply.github.com> Date: Sun, 21 Nov 2021 15:00:39 +0100 Subject: [PATCH 22/57] Fix for faint animation --- P3D/Battle/BattleSystemV2/Battle.vb | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/P3D/Battle/BattleSystemV2/Battle.vb b/P3D/Battle/BattleSystemV2/Battle.vb index 6599327ce..b3c1bedc4 100644 --- a/P3D/Battle/BattleSystemV2/Battle.vb +++ b/P3D/Battle/BattleSystemV2/Battle.vb @@ -2585,10 +2585,12 @@ BattleScreen.BattleQuery.Add(New TextQueryObject(message)) If BattleScreen.IsTrainerBattle = False AndAlso Core.Player.ShowBattleAnimations <> 0 Then - Dim FaintAnimation As AnimationQueryObject = New AnimationQueryObject(BattleScreen.OppPokemonNPC, True, BattleScreen.OppPokemonModel) - FaintAnimation.AnimationPlaySound(CStr(BattleScreen.OppPokemon.Number), 0, 2, False, True) - FaintAnimation.AnimationMove(Nothing, False, 0, -1, 0, 0.05, False, False, 2, 0,,, 3) - BattleScreen.BattleQuery.Add(FaintAnimation) + If own = False Then + Dim FaintAnimation As AnimationQueryObject = New AnimationQueryObject(BattleScreen.OwnPokemonNPC, True, BattleScreen.OppPokemonModel) + FaintAnimation.AnimationPlaySound(CStr(BattleScreen.OppPokemon.Number), 0, 2, False, True) + FaintAnimation.AnimationMove(Nothing, False, 0, -1, 0, 0.05, False, False, 2, 0,,, 3) + BattleScreen.BattleQuery.Add(FaintAnimation) + End If End If Dim str = p.AdditionalData.ToLower() From bac3d2b2929527c63f64ebd2a12f11b62956ebc7 Mon Sep 17 00:00:00 2001 From: "Jasper \"JappaWakka\" Speelman" <31563291+JappaWakka@users.noreply.github.com> Date: Sun, 21 Nov 2021 15:01:38 +0100 Subject: [PATCH 23/57] Gave status effect textures a separate folder not related to a specific type. --- P3D/Battle/BattleSystemV2/Battle.vb | 142 ++++++++++++------ .../Textures/Battle/StatusEffect/Confused.png | Bin 0 -> 712 bytes .../Battle/StatusEffect/Paralyzed.png | Bin 0 -> 395 bytes .../Textures/Battle/StatusEffect/Poisoned.png | Bin 0 -> 372 bytes P3D/P3D.vbproj | 9 ++ 5 files changed, 103 insertions(+), 48 deletions(-) create mode 100644 P3D/Content/Textures/Battle/StatusEffect/Confused.png create mode 100644 P3D/Content/Textures/Battle/StatusEffect/Paralyzed.png create mode 100644 P3D/Content/Textures/Battle/StatusEffect/Poisoned.png diff --git a/P3D/Battle/BattleSystemV2/Battle.vb b/P3D/Battle/BattleSystemV2/Battle.vb index b3c1bedc4..84eb2270d 100644 --- a/P3D/Battle/BattleSystemV2/Battle.vb +++ b/P3D/Battle/BattleSystemV2/Battle.vb @@ -1418,7 +1418,7 @@ Dim maxAmount As Integer = 4 Dim currentAmount As Integer = 0 While currentAmount <= maxAmount - Dim Texture As Texture2D = TextureManager.GetTexture("Textures\Battle\Electric\Sparks", New Rectangle(0, 0, 16, 16), "") + Dim Texture As Texture2D = TextureManager.GetTexture("Textures\Battle\StatusEffect\Paralyzed", New Rectangle(0, 0, 16, 16), "") Dim xPos = CSng(Random.Next(-4, 4) / 8) Dim zPos = CSng(Random.Next(-4, 4) / 8) @@ -1428,11 +1428,11 @@ Dim startDelay As Double = 5.0 * Random.NextDouble() Dim ShockEntity = ParalyzedAnimation.SpawnEntity(Position, Texture, Scale, 1.0F, CSng(startDelay)) ParalyzedAnimation.AnimationMove(ShockEntity, True, Destination.X, Destination.Y, Destination.Z, 0.025F, False, True, CSng(startDelay), 0.0F) - ParalyzedAnimation.AnimationChangeTexture(ShockEntity, False, TextureManager.GetTexture("Textures\Battle\Electric\Sparks", New Rectangle(16, 0, 16, 16), ""), CSng(startDelay + 1), 1) - ParalyzedAnimation.AnimationChangeTexture(ShockEntity, False, TextureManager.GetTexture("Textures\Battle\Electric\Sparks", New Rectangle(32, 0, 16, 16), ""), CSng(startDelay + 2), 1) - ParalyzedAnimation.AnimationChangeTexture(ShockEntity, False, TextureManager.GetTexture("Textures\Battle\Electric\Sparks", New Rectangle(48, 0, 16, 16), ""), CSng(startDelay + 3), 1) - ParalyzedAnimation.AnimationChangeTexture(ShockEntity, False, TextureManager.GetTexture("Textures\Battle\Electric\Sparks", New Rectangle(64, 0, 16, 16), ""), CSng(startDelay + 4), 1) - ParalyzedAnimation.AnimationChangeTexture(ShockEntity, False, TextureManager.GetTexture("Textures\Battle\Electric\Sparks", New Rectangle(72, 0, 16, 16), ""), CSng(startDelay + 5), 1) + ParalyzedAnimation.AnimationChangeTexture(ShockEntity, False, TextureManager.GetTexture("Textures\Battle\StatusEffect\Paralyzed", New Rectangle(16, 0, 16, 16), ""), CSng(startDelay + 1), 1) + ParalyzedAnimation.AnimationChangeTexture(ShockEntity, False, TextureManager.GetTexture("Textures\Battle\StatusEffect\Paralyzed", New Rectangle(32, 0, 16, 16), ""), CSng(startDelay + 2), 1) + ParalyzedAnimation.AnimationChangeTexture(ShockEntity, False, TextureManager.GetTexture("Textures\Battle\StatusEffect\Paralyzed", New Rectangle(48, 0, 16, 16), ""), CSng(startDelay + 3), 1) + ParalyzedAnimation.AnimationChangeTexture(ShockEntity, False, TextureManager.GetTexture("Textures\Battle\StatusEffect\Paralyzed", New Rectangle(64, 0, 16, 16), ""), CSng(startDelay + 4), 1) + ParalyzedAnimation.AnimationChangeTexture(ShockEntity, False, TextureManager.GetTexture("Textures\Battle\StatusEffect\Paralyzed", New Rectangle(72, 0, 16, 16), ""), CSng(startDelay + 5), 1) Threading.Interlocked.Increment(currentAmount) End While @@ -2980,7 +2980,7 @@ Dim maxAmount As Integer = 4 Dim currentAmount As Integer = 0 While currentAmount <= maxAmount - Dim Texture As Texture2D = TextureManager.GetTexture("Textures\Battle\Electric\Sparks", New Rectangle(0, 0, 16, 16), "") + Dim Texture As Texture2D = TextureManager.GetTexture("Textures\Battle\StatusEffect\Paralyzed", New Rectangle(0, 0, 16, 16), "") Dim xPos = CSng(Random.Next(-4, 4) / 8) Dim zPos = CSng(Random.Next(-4, 4) / 8) @@ -2990,11 +2990,11 @@ Dim startDelay As Double = 5.0 * Random.NextDouble() Dim ShockEntity = ParalyzedAnimation.SpawnEntity(Position, Texture, Scale, 1.0F, CSng(startDelay)) ParalyzedAnimation.AnimationMove(ShockEntity, False, Destination.X, Destination.Y, Destination.Z, 0.025F, False, True, CSng(startDelay), 0.0F) - ParalyzedAnimation.AnimationChangeTexture(ShockEntity, False, TextureManager.GetTexture("Textures\Battle\Electric\Sparks", New Rectangle(16, 0, 16, 16), ""), CSng(startDelay + 1), 0) - ParalyzedAnimation.AnimationChangeTexture(ShockEntity, False, TextureManager.GetTexture("Textures\Battle\Electric\Sparks", New Rectangle(32, 0, 16, 16), ""), CSng(startDelay + 2), 0) - ParalyzedAnimation.AnimationChangeTexture(ShockEntity, False, TextureManager.GetTexture("Textures\Battle\Electric\Sparks", New Rectangle(48, 0, 16, 16), ""), CSng(startDelay + 3), 0) - ParalyzedAnimation.AnimationChangeTexture(ShockEntity, False, TextureManager.GetTexture("Textures\Battle\Electric\Sparks", New Rectangle(64, 0, 16, 16), ""), CSng(startDelay + 4), 0) - ParalyzedAnimation.AnimationChangeTexture(ShockEntity, True, TextureManager.GetTexture("Textures\Battle\Electric\Sparks", New Rectangle(72, 0, 16, 16), ""), CSng(startDelay + 5), 0) + ParalyzedAnimation.AnimationChangeTexture(ShockEntity, False, TextureManager.GetTexture("Textures\Battle\StatusEffect\Paralyzed", New Rectangle(16, 0, 16, 16), ""), CSng(startDelay + 1), 0) + ParalyzedAnimation.AnimationChangeTexture(ShockEntity, False, TextureManager.GetTexture("Textures\Battle\StatusEffect\Paralyzed", New Rectangle(32, 0, 16, 16), ""), CSng(startDelay + 2), 0) + ParalyzedAnimation.AnimationChangeTexture(ShockEntity, False, TextureManager.GetTexture("Textures\Battle\StatusEffect\Paralyzed", New Rectangle(48, 0, 16, 16), ""), CSng(startDelay + 3), 0) + ParalyzedAnimation.AnimationChangeTexture(ShockEntity, False, TextureManager.GetTexture("Textures\Battle\StatusEffect\Paralyzed", New Rectangle(64, 0, 16, 16), ""), CSng(startDelay + 4), 0) + ParalyzedAnimation.AnimationChangeTexture(ShockEntity, True, TextureManager.GetTexture("Textures\Battle\StatusEffect\Paralyzed", New Rectangle(72, 0, 16, 16), ""), CSng(startDelay + 5), 0) Threading.Interlocked.Increment(currentAmount) End While @@ -3304,10 +3304,14 @@ Public Function InflictConfusion(ByVal own As Boolean, ByVal from As Boolean, ByVal BattleScreen As BattleScreen, ByVal message As String, ByVal cause As String) As Boolean Dim p As Pokemon = BattleScreen.OwnPokemon + Dim pNPC As NPC = BattleScreen.OwnPokemonNPC Dim op As Pokemon = BattleScreen.OppPokemon + Dim opNPC As NPC = BattleScreen.OppPokemonNPC If own = False Then p = BattleScreen.OppPokemon + pNPC = BattleScreen.OppPokemonNPC op = BattleScreen.OwnPokemon + opNPC = BattleScreen.OwnPokemonNPC End If If p.HP <= 0 OrElse p.Status = Pokemon.StatusProblems.Fainted Then @@ -3340,6 +3344,48 @@ Return False Else 'Works! + If Core.Player.ShowBattleAnimations <> 0 Then + Dim ConfusionAnimation As New AnimationQueryObject(pNPC, Not own) + + ConfusionAnimation.AnimationPlaySound("Battle\Effects\Confused", 0, 0) + Dim DuckEntity1 As Entity = ConfusionAnimation.SpawnEntity(New Vector3(-0.25, 0.25, -0.25), TextureManager.GetTexture("Textures\Battle\StatusEffect\Confused", New Rectangle(0, 0, 16, 16), ""), New Vector3(0.5F), 1, 0, 1) + Dim DuckEntity2 As Entity = ConfusionAnimation.SpawnEntity(New Vector3(0.25, 0.25, 0.25), TextureManager.GetTexture("Textures\Battle\StatusEffect\Confused", New Rectangle(0, 0, 16, 16), ""), New Vector3(0.5F), 1, 0, 1) + Dim DuckEntity3 As Entity = ConfusionAnimation.SpawnEntity(New Vector3(0.25, 0.25, -0.25), TextureManager.GetTexture("Textures\Battle\StatusEffect\Confused", New Rectangle(0, 0, 16, 16), ""), New Vector3(0.5F), 1, 0, 1) + + ConfusionAnimation.AnimationChangeTexture(DuckEntity1, False, TextureManager.GetTexture("Textures\Battle\StatusEffect\Confused", New Rectangle(0, 16, 16, 16), ""), 0.5, 1) + ConfusionAnimation.AnimationChangeTexture(DuckEntity2, False, TextureManager.GetTexture("Textures\Battle\StatusEffect\Confused", New Rectangle(0, 16, 16, 16), ""), 0.5, 1) + ConfusionAnimation.AnimationChangeTexture(DuckEntity3, False, TextureManager.GetTexture("Textures\Battle\StatusEffect\Confused", New Rectangle(0, 16, 16, 16), ""), 0.5, 1) + + ConfusionAnimation.AnimationChangeTexture(DuckEntity1, False, TextureManager.GetTexture("Textures\Battle\StatusEffect\Confused", New Rectangle(0, 32, 16, 16), ""), 1.5F, 1) + ConfusionAnimation.AnimationChangeTexture(DuckEntity2, False, TextureManager.GetTexture("Textures\Battle\StatusEffect\Confused", New Rectangle(0, 32, 16, 16), ""), 1.5F, 1) + ConfusionAnimation.AnimationChangeTexture(DuckEntity3, False, TextureManager.GetTexture("Textures\Battle\StatusEffect\Confused", New Rectangle(0, 32, 16, 16), ""), 1.5F, 1) + + ConfusionAnimation.AnimationChangeTexture(DuckEntity1, False, TextureManager.GetTexture("Textures\Battle\StatusEffect\Confused", New Rectangle(0, 48, 16, 16), ""), 1.5F, 1) + ConfusionAnimation.AnimationChangeTexture(DuckEntity2, False, TextureManager.GetTexture("Textures\Battle\StatusEffect\Confused", New Rectangle(0, 48, 16, 16), ""), 1.5F, 1) + ConfusionAnimation.AnimationChangeTexture(DuckEntity3, False, TextureManager.GetTexture("Textures\Battle\StatusEffect\Confused", New Rectangle(0, 48, 16, 16), ""), 1.5F, 1) + + ConfusionAnimation.AnimationChangeTexture(DuckEntity1, False, TextureManager.GetTexture("Textures\Battle\StatusEffect\Confused", New Rectangle(0, 64, 16, 16), ""), 2, 1) + ConfusionAnimation.AnimationChangeTexture(DuckEntity2, False, TextureManager.GetTexture("Textures\Battle\StatusEffect\Confused", New Rectangle(0, 64, 16, 16), ""), 2, 1) + ConfusionAnimation.AnimationChangeTexture(DuckEntity3, False, TextureManager.GetTexture("Textures\Battle\StatusEffect\Confused", New Rectangle(0, 64, 16, 16), ""), 2, 1) + + ConfusionAnimation.AnimationChangeTexture(DuckEntity1, False, TextureManager.GetTexture("Textures\Battle\StatusEffect\Confused", New Rectangle(0, 16, 16, 16), ""), 2.5F, 1) + ConfusionAnimation.AnimationChangeTexture(DuckEntity2, False, TextureManager.GetTexture("Textures\Battle\StatusEffect\Confused", New Rectangle(0, 16, 16, 16), ""), 2.5F, 1) + ConfusionAnimation.AnimationChangeTexture(DuckEntity3, False, TextureManager.GetTexture("Textures\Battle\StatusEffect\Confused", New Rectangle(0, 16, 16, 16), ""), 2.5F, 1) + + ConfusionAnimation.AnimationChangeTexture(DuckEntity1, False, TextureManager.GetTexture("Textures\Battle\StatusEffect\Confused", New Rectangle(0, 32, 16, 16), ""), 3, 1) + ConfusionAnimation.AnimationChangeTexture(DuckEntity2, False, TextureManager.GetTexture("Textures\Battle\StatusEffect\Confused", New Rectangle(0, 32, 16, 16), ""), 3, 1) + ConfusionAnimation.AnimationChangeTexture(DuckEntity3, False, TextureManager.GetTexture("Textures\Battle\StatusEffect\Confused", New Rectangle(0, 32, 16, 16), ""), 3, 1) + + ConfusionAnimation.AnimationChangeTexture(DuckEntity1, False, TextureManager.GetTexture("Textures\Battle\StatusEffect\Confused", New Rectangle(0, 48, 16, 16), ""), 3.5F, 1) + ConfusionAnimation.AnimationChangeTexture(DuckEntity2, False, TextureManager.GetTexture("Textures\Battle\StatusEffect\Confused", New Rectangle(0, 48, 16, 16), ""), 3.5F, 1) + ConfusionAnimation.AnimationChangeTexture(DuckEntity3, False, TextureManager.GetTexture("Textures\Battle\StatusEffect\Confused", New Rectangle(0, 48, 16, 16), ""), 3.5F, 1) + + ConfusionAnimation.AnimationChangeTexture(DuckEntity1, True, TextureManager.GetTexture("Textures\Battle\StatusEffect\Confused", New Rectangle(0, 64, 16, 16), ""), 4, 1) + ConfusionAnimation.AnimationChangeTexture(DuckEntity2, True, TextureManager.GetTexture("Textures\Battle\StatusEffect\Confused", New Rectangle(0, 64, 16, 16), ""), 4, 1) + ConfusionAnimation.AnimationChangeTexture(DuckEntity3, True, TextureManager.GetTexture("Textures\Battle\StatusEffect\Confused", New Rectangle(0, 64, 16, 16), ""), 4, 1) + + BattleScreen.BattleQuery.Add(ConfusionAnimation) + End If p.AddVolatileStatus(Pokemon.VolatileStatus.Confusion) Select Case message Case "" 'Print default message only @@ -5463,19 +5509,19 @@ Dim PoisonAnimation As AnimationQueryObject = New AnimationQueryObject(BattleScreen.OwnPokemonNPC, True) PoisonAnimation.AnimationPlaySound("Battle\Effects\Poisoned", 0, 0) - Dim BubbleEntity1 As Entity = PoisonAnimation.SpawnEntity(New Vector3(-0.25, -0.25, -0.25), TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 0, 32, 32), ""), New Vector3(0.5F), 1, 0, 1) + Dim BubbleEntity1 As Entity = PoisonAnimation.SpawnEntity(New Vector3(-0.25, -0.25, -0.25), TextureManager.GetTexture("Textures\Battle\StatusEffect\Poisoned", New Rectangle(0, 0, 32, 32), ""), New Vector3(0.5F), 1, 0, 1) - PoisonAnimation.AnimationChangeTexture(BubbleEntity1, False, TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 32, 32, 32), ""), 1, 1) - Dim BubbleEntity2 As Entity = PoisonAnimation.SpawnEntity(New Vector3(0.25, -0.25, 0.25), TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 0, 32, 32), ""), New Vector3(0.5F), 1, 1, 1) + PoisonAnimation.AnimationChangeTexture(BubbleEntity1, False, TextureManager.GetTexture("Textures\Battle\StatusEffect\Poisoned", New Rectangle(0, 32, 32, 32), ""), 1, 1) + Dim BubbleEntity2 As Entity = PoisonAnimation.SpawnEntity(New Vector3(0.25, -0.25, 0.25), TextureManager.GetTexture("Textures\Battle\StatusEffect\Poisoned", New Rectangle(0, 0, 32, 32), ""), New Vector3(0.5F), 1, 1, 1) - PoisonAnimation.AnimationChangeTexture(BubbleEntity1, True, TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 64, 32, 32), ""), 2, 1) - PoisonAnimation.AnimationChangeTexture(BubbleEntity2, False, TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 32, 32, 32), ""), 2, 1) - Dim BubbleEntity3 As Entity = PoisonAnimation.SpawnEntity(New Vector3(0.25, -0.25, -0.25), TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 0, 32, 32), ""), New Vector3(0.5F), 1, 2, 1) + PoisonAnimation.AnimationChangeTexture(BubbleEntity1, True, TextureManager.GetTexture("Textures\Battle\StatusEffect\Poisoned", New Rectangle(0, 64, 32, 32), ""), 2, 1) + PoisonAnimation.AnimationChangeTexture(BubbleEntity2, False, TextureManager.GetTexture("Textures\Battle\StatusEffect\Poisoned", New Rectangle(0, 32, 32, 32), ""), 2, 1) + Dim BubbleEntity3 As Entity = PoisonAnimation.SpawnEntity(New Vector3(0.25, -0.25, -0.25), TextureManager.GetTexture("Textures\Battle\StatusEffect\Poisoned", New Rectangle(0, 0, 32, 32), ""), New Vector3(0.5F), 1, 2, 1) - PoisonAnimation.AnimationChangeTexture(BubbleEntity2, True, TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 64, 32, 32), ""), 3, 1) - PoisonAnimation.AnimationChangeTexture(BubbleEntity3, False, TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 32, 32, 32), ""), 3, 1) + PoisonAnimation.AnimationChangeTexture(BubbleEntity2, True, TextureManager.GetTexture("Textures\Battle\StatusEffect\Poisoned", New Rectangle(0, 64, 32, 32), ""), 3, 1) + PoisonAnimation.AnimationChangeTexture(BubbleEntity3, False, TextureManager.GetTexture("Textures\Battle\StatusEffect\Poisoned", New Rectangle(0, 32, 32, 32), ""), 3, 1) - PoisonAnimation.AnimationChangeTexture(BubbleEntity3, True, TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 64, 32, 32), ""), 4, 1) + PoisonAnimation.AnimationChangeTexture(BubbleEntity3, True, TextureManager.GetTexture("Textures\Battle\StatusEffect\Poisoned", New Rectangle(0, 64, 32, 32), ""), 4, 1) BattleScreen.BattleQuery.Add(PoisonAnimation) End If @@ -5491,19 +5537,19 @@ Dim PoisonAnimation As AnimationQueryObject = New AnimationQueryObject(BattleScreen.OwnPokemonNPC, True) PoisonAnimation.AnimationPlaySound("Battle\Effects\Poisoned", 0, 0) - Dim BubbleEntity1 As Entity = PoisonAnimation.SpawnEntity(New Vector3(-0.25, -0.25, -0.25), TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 0, 32, 32), ""), New Vector3(0.5F), 1, 0, 1) + Dim BubbleEntity1 As Entity = PoisonAnimation.SpawnEntity(New Vector3(-0.25, -0.25, -0.25), TextureManager.GetTexture("Textures\Battle\StatusEffect\Poisoned", New Rectangle(0, 0, 32, 32), ""), New Vector3(0.5F), 1, 0, 1) - PoisonAnimation.AnimationChangeTexture(BubbleEntity1, False, TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 32, 32, 32), ""), 1, 1) - Dim BubbleEntity2 As Entity = PoisonAnimation.SpawnEntity(New Vector3(0.25, -0.25, 0.25), TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 0, 32, 32), ""), New Vector3(0.5F), 1, 1, 1) + PoisonAnimation.AnimationChangeTexture(BubbleEntity1, False, TextureManager.GetTexture("Textures\Battle\StatusEffect\Poisoned", New Rectangle(0, 32, 32, 32), ""), 1, 1) + Dim BubbleEntity2 As Entity = PoisonAnimation.SpawnEntity(New Vector3(0.25, -0.25, 0.25), TextureManager.GetTexture("Textures\Battle\StatusEffect\Poisoned", New Rectangle(0, 0, 32, 32), ""), New Vector3(0.5F), 1, 1, 1) - PoisonAnimation.AnimationChangeTexture(BubbleEntity1, True, TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 64, 32, 32), ""), 2, 1) - PoisonAnimation.AnimationChangeTexture(BubbleEntity2, False, TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 32, 32, 32), ""), 2, 1) - Dim BubbleEntity3 As Entity = PoisonAnimation.SpawnEntity(New Vector3(0.25, -0.25, -0.25), TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 0, 32, 32), ""), New Vector3(0.5F), 1, 2, 1) + PoisonAnimation.AnimationChangeTexture(BubbleEntity1, True, TextureManager.GetTexture("Textures\Battle\StatusEffect\Poisoned", New Rectangle(0, 64, 32, 32), ""), 2, 1) + PoisonAnimation.AnimationChangeTexture(BubbleEntity2, False, TextureManager.GetTexture("Textures\Battle\StatusEffect\Poisoned", New Rectangle(0, 32, 32, 32), ""), 2, 1) + Dim BubbleEntity3 As Entity = PoisonAnimation.SpawnEntity(New Vector3(0.25, -0.25, -0.25), TextureManager.GetTexture("Textures\Battle\StatusEffect\Poisoned", New Rectangle(0, 0, 32, 32), ""), New Vector3(0.5F), 1, 2, 1) - PoisonAnimation.AnimationChangeTexture(BubbleEntity2, True, TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 64, 32, 32), ""), 3, 1) - PoisonAnimation.AnimationChangeTexture(BubbleEntity3, False, TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 32, 32, 32), ""), 3, 1) + PoisonAnimation.AnimationChangeTexture(BubbleEntity2, True, TextureManager.GetTexture("Textures\Battle\StatusEffect\Poisoned", New Rectangle(0, 64, 32, 32), ""), 3, 1) + PoisonAnimation.AnimationChangeTexture(BubbleEntity3, False, TextureManager.GetTexture("Textures\Battle\StatusEffect\Poisoned", New Rectangle(0, 32, 32, 32), ""), 3, 1) - PoisonAnimation.AnimationChangeTexture(BubbleEntity3, True, TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 64, 32, 32), ""), 4, 1) + PoisonAnimation.AnimationChangeTexture(BubbleEntity3, True, TextureManager.GetTexture("Textures\Battle\StatusEffect\Poisoned", New Rectangle(0, 64, 32, 32), ""), 4, 1) BattleScreen.BattleQuery.Add(PoisonAnimation) End If @@ -6266,19 +6312,19 @@ Dim PoisonAnimation As AnimationQueryObject = New AnimationQueryObject(BattleScreen.OppPokemonNPC, False) PoisonAnimation.AnimationPlaySound("Battle\Effects\Poisoned", 0, 0) - Dim BubbleEntity1 As Entity = PoisonAnimation.SpawnEntity(New Vector3(-0.25, -0.25, -0.25), TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 0, 32, 32), ""), New Vector3(0.5F), 1, 0, 1) + Dim BubbleEntity1 As Entity = PoisonAnimation.SpawnEntity(New Vector3(-0.25, -0.25, -0.25), TextureManager.GetTexture("Textures\Battle\StatusEffect\Poisoned", New Rectangle(0, 0, 32, 32), ""), New Vector3(0.5F), 1, 0, 1) - PoisonAnimation.AnimationChangeTexture(BubbleEntity1, False, TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 32, 32, 32), ""), 1, 1) - Dim BubbleEntity2 As Entity = PoisonAnimation.SpawnEntity(New Vector3(0.25, -0.25, 0.25), TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 0, 32, 32), ""), New Vector3(0.5F), 1, 1, 1) + PoisonAnimation.AnimationChangeTexture(BubbleEntity1, False, TextureManager.GetTexture("Textures\Battle\StatusEffect\Poisoned", New Rectangle(0, 32, 32, 32), ""), 1, 1) + Dim BubbleEntity2 As Entity = PoisonAnimation.SpawnEntity(New Vector3(0.25, -0.25, 0.25), TextureManager.GetTexture("Textures\Battle\StatusEffect\Poisoned", New Rectangle(0, 0, 32, 32), ""), New Vector3(0.5F), 1, 1, 1) - PoisonAnimation.AnimationChangeTexture(BubbleEntity1, True, TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 64, 32, 32), ""), 2, 1) - PoisonAnimation.AnimationChangeTexture(BubbleEntity2, False, TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 32, 32, 32), ""), 2, 1) - Dim BubbleEntity3 As Entity = PoisonAnimation.SpawnEntity(New Vector3(0.25, -0.25, -0.25), TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 0, 32, 32), ""), New Vector3(0.5F), 1, 2, 1) + PoisonAnimation.AnimationChangeTexture(BubbleEntity1, True, TextureManager.GetTexture("Textures\Battle\StatusEffect\Poisoned", New Rectangle(0, 64, 32, 32), ""), 2, 1) + PoisonAnimation.AnimationChangeTexture(BubbleEntity2, False, TextureManager.GetTexture("Textures\Battle\StatusEffect\Poisoned", New Rectangle(0, 32, 32, 32), ""), 2, 1) + Dim BubbleEntity3 As Entity = PoisonAnimation.SpawnEntity(New Vector3(0.25, -0.25, -0.25), TextureManager.GetTexture("Textures\Battle\StatusEffect\Poisoned", New Rectangle(0, 0, 32, 32), ""), New Vector3(0.5F), 1, 2, 1) - PoisonAnimation.AnimationChangeTexture(BubbleEntity2, True, TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 64, 32, 32), ""), 3, 1) - PoisonAnimation.AnimationChangeTexture(BubbleEntity3, False, TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 32, 32, 32), ""), 3, 1) + PoisonAnimation.AnimationChangeTexture(BubbleEntity2, True, TextureManager.GetTexture("Textures\Battle\StatusEffect\Poisoned", New Rectangle(0, 64, 32, 32), ""), 3, 1) + PoisonAnimation.AnimationChangeTexture(BubbleEntity3, False, TextureManager.GetTexture("Textures\Battle\StatusEffect\Poisoned", New Rectangle(0, 32, 32, 32), ""), 3, 1) - PoisonAnimation.AnimationChangeTexture(BubbleEntity3, True, TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 64, 32, 32), ""), 4, 1) + PoisonAnimation.AnimationChangeTexture(BubbleEntity3, True, TextureManager.GetTexture("Textures\Battle\StatusEffect\Poisoned", New Rectangle(0, 64, 32, 32), ""), 4, 1) BattleScreen.BattleQuery.Add(PoisonAnimation) End If @@ -6294,19 +6340,19 @@ Dim PoisonAnimation As AnimationQueryObject = New AnimationQueryObject(BattleScreen.OppPokemonNPC, False) PoisonAnimation.AnimationPlaySound("Battle\Effects\Poisoned", 0, 0) - Dim BubbleEntity1 As Entity = PoisonAnimation.SpawnEntity(New Vector3(-0.25, -0.25, -0.25), TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 0, 32, 32), ""), New Vector3(0.5F), 1, 0, 1) + Dim BubbleEntity1 As Entity = PoisonAnimation.SpawnEntity(New Vector3(-0.25, -0.25, -0.25), TextureManager.GetTexture("Textures\Battle\StatusEffect\Poisoned", New Rectangle(0, 0, 32, 32), ""), New Vector3(0.5F), 1, 0, 1) - PoisonAnimation.AnimationChangeTexture(BubbleEntity1, False, TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 32, 32, 32), ""), 1, 1) - Dim BubbleEntity2 As Entity = PoisonAnimation.SpawnEntity(New Vector3(0.25, -0.25, 0.25), TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 0, 32, 32), ""), New Vector3(0.5F), 1, 1, 1) + PoisonAnimation.AnimationChangeTexture(BubbleEntity1, False, TextureManager.GetTexture("Textures\Battle\StatusEffect\Poisoned", New Rectangle(0, 32, 32, 32), ""), 1, 1) + Dim BubbleEntity2 As Entity = PoisonAnimation.SpawnEntity(New Vector3(0.25, -0.25, 0.25), TextureManager.GetTexture("Textures\Battle\StatusEffect\Poisoned", New Rectangle(0, 0, 32, 32), ""), New Vector3(0.5F), 1, 1, 1) - PoisonAnimation.AnimationChangeTexture(BubbleEntity1, True, TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 64, 32, 32), ""), 2, 1) - PoisonAnimation.AnimationChangeTexture(BubbleEntity2, False, TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 32, 32, 32), ""), 2, 1) - Dim BubbleEntity3 As Entity = PoisonAnimation.SpawnEntity(New Vector3(0.25, -0.25, -0.25), TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 0, 32, 32), ""), New Vector3(0.5F), 1, 2, 1) + PoisonAnimation.AnimationChangeTexture(BubbleEntity1, True, TextureManager.GetTexture("Textures\Battle\StatusEffect\Poisoned", New Rectangle(0, 64, 32, 32), ""), 2, 1) + PoisonAnimation.AnimationChangeTexture(BubbleEntity2, False, TextureManager.GetTexture("Textures\Battle\StatusEffect\Poisoned", New Rectangle(0, 32, 32, 32), ""), 2, 1) + Dim BubbleEntity3 As Entity = PoisonAnimation.SpawnEntity(New Vector3(0.25, -0.25, -0.25), TextureManager.GetTexture("Textures\Battle\StatusEffect\Poisoned", New Rectangle(0, 0, 32, 32), ""), New Vector3(0.5F), 1, 2, 1) - PoisonAnimation.AnimationChangeTexture(BubbleEntity2, True, TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 64, 32, 32), ""), 3, 1) - PoisonAnimation.AnimationChangeTexture(BubbleEntity3, False, TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 32, 32, 32), ""), 3, 1) + PoisonAnimation.AnimationChangeTexture(BubbleEntity2, True, TextureManager.GetTexture("Textures\Battle\StatusEffect\Poisoned", New Rectangle(0, 64, 32, 32), ""), 3, 1) + PoisonAnimation.AnimationChangeTexture(BubbleEntity3, False, TextureManager.GetTexture("Textures\Battle\StatusEffect\Poisoned", New Rectangle(0, 32, 32, 32), ""), 3, 1) - PoisonAnimation.AnimationChangeTexture(BubbleEntity3, True, TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 64, 32, 32), ""), 4, 1) + PoisonAnimation.AnimationChangeTexture(BubbleEntity3, True, TextureManager.GetTexture("Textures\Battle\StatusEffect\Poisoned", New Rectangle(0, 64, 32, 32), ""), 4, 1) BattleScreen.BattleQuery.Add(PoisonAnimation) 'Actual damage diff --git a/P3D/Content/Textures/Battle/StatusEffect/Confused.png b/P3D/Content/Textures/Battle/StatusEffect/Confused.png new file mode 100644 index 0000000000000000000000000000000000000000..be3416b85b26d883e2e43787729a8e8d1b10553a GIT binary patch literal 712 zcmV;(0yq7MP)YAX9X8WNB|8RBvx=!KdMT00070 zNklAu~X6 ztI+(??umPa!h$PWAfSr|_ zB~D1O3!Si>%2VSK&@dkt5l9?RIoEYBAbmtDk3F$+#e>`d>{{0cwJ~gcfJ)8psy>hq uaex*wRqeqKj#0`40Gsr|2uc5fKKKpc^)`nk-`D>D0000AHIP00009a7bBm000XT z000XT0n*)m`~Uy|8+1ijbW?9;ba!ELWdK8EY;$>YAX9X8WNB|8RBvx=!KdMT0003N zNklKMP+n_x10U?=S#4r*p&FjJ8%pe3boZ*(Bmi?q3Un zv?@WKbgs=5R5{t#Iawlm0ccrxo-3`-04o}p0HXGzK6uKcwm%a9LlBPuEb&ld!zXGiP!j~ymbPbJHYi*@`A1LWj10lhhPUT`ue?8X; PreserveNewest + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + PreserveNewest From 3bdc124a997e34e94505b042f0a18f4b0c08e8a0 Mon Sep 17 00:00:00 2001 From: JappaWakkaP3D <31563291+JappaWakka@users.noreply.github.com> Date: Fri, 26 Nov 2021 21:56:38 +0100 Subject: [PATCH 24/57] Bugfixes & Tweaks * Growl displays correctly now * The sound played with stat change animations is now timed correctly * Stat change particles now fall straight down as intended * Fixed incorrect texture for Confusion * Stat Down texture is now blue and Stat Up texture is now orange/yellow --- P3D/Battle/BattleSystemV2/Battle.vb | 82 +++++++++--------- .../QueryObjects/AnimationQueryObject.vb | 12 ++- .../Textures/Battle/StatChange/statDown.png | Bin 234 -> 241 bytes .../Textures/Battle/StatChange/statUp.png | Bin 241 -> 234 bytes P3D/Pokemon/Attacks/Normal/Growl.vb | 8 +- 5 files changed, 55 insertions(+), 47 deletions(-) diff --git a/P3D/Battle/BattleSystemV2/Battle.vb b/P3D/Battle/BattleSystemV2/Battle.vb index 84eb2270d..b1f6a348f 100644 --- a/P3D/Battle/BattleSystemV2/Battle.vb +++ b/P3D/Battle/BattleSystemV2/Battle.vb @@ -3348,41 +3348,37 @@ Dim ConfusionAnimation As New AnimationQueryObject(pNPC, Not own) ConfusionAnimation.AnimationPlaySound("Battle\Effects\Confused", 0, 0) - Dim DuckEntity1 As Entity = ConfusionAnimation.SpawnEntity(New Vector3(-0.25, 0.25, -0.25), TextureManager.GetTexture("Textures\Battle\StatusEffect\Confused", New Rectangle(0, 0, 16, 16), ""), New Vector3(0.5F), 1, 0, 1) - Dim DuckEntity2 As Entity = ConfusionAnimation.SpawnEntity(New Vector3(0.25, 0.25, 0.25), TextureManager.GetTexture("Textures\Battle\StatusEffect\Confused", New Rectangle(0, 0, 16, 16), ""), New Vector3(0.5F), 1, 0, 1) - Dim DuckEntity3 As Entity = ConfusionAnimation.SpawnEntity(New Vector3(0.25, 0.25, -0.25), TextureManager.GetTexture("Textures\Battle\StatusEffect\Confused", New Rectangle(0, 0, 16, 16), ""), New Vector3(0.5F), 1, 0, 1) + Dim DuckEntity1 As Entity = ConfusionAnimation.SpawnEntity(New Vector3(-0.25, 0.25, -0.25), TextureManager.GetTexture("Textures\Battle\StatusEffect\Confused", New Rectangle(0, 0, 16, 16), ""), New Vector3(0.5F), 1, 0, 0.5) + Dim DuckEntity2 As Entity = ConfusionAnimation.SpawnEntity(New Vector3(0.25, 0.25, 0.25), TextureManager.GetTexture("Textures\Battle\StatusEffect\Confused", New Rectangle(0, 0, 16, 16), ""), New Vector3(0.5F), 1, 0, 0.5) + Dim DuckEntity3 As Entity = ConfusionAnimation.SpawnEntity(New Vector3(0.25, 0.25, -0.25), TextureManager.GetTexture("Textures\Battle\StatusEffect\Confused", New Rectangle(0, 0, 16, 16), ""), New Vector3(0.5F), 1, 0, 0.5) - ConfusionAnimation.AnimationChangeTexture(DuckEntity1, False, TextureManager.GetTexture("Textures\Battle\StatusEffect\Confused", New Rectangle(0, 16, 16, 16), ""), 0.5, 1) - ConfusionAnimation.AnimationChangeTexture(DuckEntity2, False, TextureManager.GetTexture("Textures\Battle\StatusEffect\Confused", New Rectangle(0, 16, 16, 16), ""), 0.5, 1) - ConfusionAnimation.AnimationChangeTexture(DuckEntity3, False, TextureManager.GetTexture("Textures\Battle\StatusEffect\Confused", New Rectangle(0, 16, 16, 16), ""), 0.5, 1) + ConfusionAnimation.AnimationChangeTexture(DuckEntity1, False, TextureManager.GetTexture("Textures\Battle\StatusEffect\Confused", New Rectangle(0, 16, 16, 16), ""), 0.5, 0.5) + ConfusionAnimation.AnimationChangeTexture(DuckEntity2, False, TextureManager.GetTexture("Textures\Battle\StatusEffect\Confused", New Rectangle(0, 16, 16, 16), ""), 0.5, 0.5) + ConfusionAnimation.AnimationChangeTexture(DuckEntity3, False, TextureManager.GetTexture("Textures\Battle\StatusEffect\Confused", New Rectangle(0, 16, 16, 16), ""), 0.5, 0.5) - ConfusionAnimation.AnimationChangeTexture(DuckEntity1, False, TextureManager.GetTexture("Textures\Battle\StatusEffect\Confused", New Rectangle(0, 32, 16, 16), ""), 1.5F, 1) - ConfusionAnimation.AnimationChangeTexture(DuckEntity2, False, TextureManager.GetTexture("Textures\Battle\StatusEffect\Confused", New Rectangle(0, 32, 16, 16), ""), 1.5F, 1) - ConfusionAnimation.AnimationChangeTexture(DuckEntity3, False, TextureManager.GetTexture("Textures\Battle\StatusEffect\Confused", New Rectangle(0, 32, 16, 16), ""), 1.5F, 1) + ConfusionAnimation.AnimationChangeTexture(DuckEntity1, False, TextureManager.GetTexture("Textures\Battle\StatusEffect\Confused", New Rectangle(0, 32, 16, 16), ""), 1.5F, 0.5) + ConfusionAnimation.AnimationChangeTexture(DuckEntity2, False, TextureManager.GetTexture("Textures\Battle\StatusEffect\Confused", New Rectangle(0, 32, 16, 16), ""), 1.5F, 0.5) + ConfusionAnimation.AnimationChangeTexture(DuckEntity3, False, TextureManager.GetTexture("Textures\Battle\StatusEffect\Confused", New Rectangle(0, 32, 16, 16), ""), 1.5F, 0.5) - ConfusionAnimation.AnimationChangeTexture(DuckEntity1, False, TextureManager.GetTexture("Textures\Battle\StatusEffect\Confused", New Rectangle(0, 48, 16, 16), ""), 1.5F, 1) - ConfusionAnimation.AnimationChangeTexture(DuckEntity2, False, TextureManager.GetTexture("Textures\Battle\StatusEffect\Confused", New Rectangle(0, 48, 16, 16), ""), 1.5F, 1) - ConfusionAnimation.AnimationChangeTexture(DuckEntity3, False, TextureManager.GetTexture("Textures\Battle\StatusEffect\Confused", New Rectangle(0, 48, 16, 16), ""), 1.5F, 1) + ConfusionAnimation.AnimationChangeTexture(DuckEntity1, False, TextureManager.GetTexture("Textures\Battle\StatusEffect\Confused", New Rectangle(0, 48, 16, 16), ""), 1.5F, 0.5) + ConfusionAnimation.AnimationChangeTexture(DuckEntity2, False, TextureManager.GetTexture("Textures\Battle\StatusEffect\Confused", New Rectangle(0, 48, 16, 16), ""), 1.5F, 0.5) + ConfusionAnimation.AnimationChangeTexture(DuckEntity3, False, TextureManager.GetTexture("Textures\Battle\StatusEffect\Confused", New Rectangle(0, 48, 16, 16), ""), 1.5F, 0.5) - ConfusionAnimation.AnimationChangeTexture(DuckEntity1, False, TextureManager.GetTexture("Textures\Battle\StatusEffect\Confused", New Rectangle(0, 64, 16, 16), ""), 2, 1) - ConfusionAnimation.AnimationChangeTexture(DuckEntity2, False, TextureManager.GetTexture("Textures\Battle\StatusEffect\Confused", New Rectangle(0, 64, 16, 16), ""), 2, 1) - ConfusionAnimation.AnimationChangeTexture(DuckEntity3, False, TextureManager.GetTexture("Textures\Battle\StatusEffect\Confused", New Rectangle(0, 64, 16, 16), ""), 2, 1) + ConfusionAnimation.AnimationChangeTexture(DuckEntity1, False, TextureManager.GetTexture("Textures\Battle\StatusEffect\Confused", New Rectangle(0, 0, 16, 16), ""), 2.0F, 0.5) + ConfusionAnimation.AnimationChangeTexture(DuckEntity2, False, TextureManager.GetTexture("Textures\Battle\StatusEffect\Confused", New Rectangle(0, 0, 16, 16), ""), 2.0F, 0.5) + ConfusionAnimation.AnimationChangeTexture(DuckEntity3, False, TextureManager.GetTexture("Textures\Battle\StatusEffect\Confused", New Rectangle(0, 0, 16, 16), ""), 2.0F, 0.5) - ConfusionAnimation.AnimationChangeTexture(DuckEntity1, False, TextureManager.GetTexture("Textures\Battle\StatusEffect\Confused", New Rectangle(0, 16, 16, 16), ""), 2.5F, 1) - ConfusionAnimation.AnimationChangeTexture(DuckEntity2, False, TextureManager.GetTexture("Textures\Battle\StatusEffect\Confused", New Rectangle(0, 16, 16, 16), ""), 2.5F, 1) - ConfusionAnimation.AnimationChangeTexture(DuckEntity3, False, TextureManager.GetTexture("Textures\Battle\StatusEffect\Confused", New Rectangle(0, 16, 16, 16), ""), 2.5F, 1) + ConfusionAnimation.AnimationChangeTexture(DuckEntity1, False, TextureManager.GetTexture("Textures\Battle\StatusEffect\Confused", New Rectangle(0, 16, 16, 16), ""), 2.5F, 0.5) + ConfusionAnimation.AnimationChangeTexture(DuckEntity2, False, TextureManager.GetTexture("Textures\Battle\StatusEffect\Confused", New Rectangle(0, 16, 16, 16), ""), 2.5F, 0.5) + ConfusionAnimation.AnimationChangeTexture(DuckEntity3, False, TextureManager.GetTexture("Textures\Battle\StatusEffect\Confused", New Rectangle(0, 16, 16, 16), ""), 2.5F, 0.5) - ConfusionAnimation.AnimationChangeTexture(DuckEntity1, False, TextureManager.GetTexture("Textures\Battle\StatusEffect\Confused", New Rectangle(0, 32, 16, 16), ""), 3, 1) - ConfusionAnimation.AnimationChangeTexture(DuckEntity2, False, TextureManager.GetTexture("Textures\Battle\StatusEffect\Confused", New Rectangle(0, 32, 16, 16), ""), 3, 1) - ConfusionAnimation.AnimationChangeTexture(DuckEntity3, False, TextureManager.GetTexture("Textures\Battle\StatusEffect\Confused", New Rectangle(0, 32, 16, 16), ""), 3, 1) + ConfusionAnimation.AnimationChangeTexture(DuckEntity1, False, TextureManager.GetTexture("Textures\Battle\StatusEffect\Confused", New Rectangle(0, 32, 16, 16), ""), 3, 0.5) + ConfusionAnimation.AnimationChangeTexture(DuckEntity2, False, TextureManager.GetTexture("Textures\Battle\StatusEffect\Confused", New Rectangle(0, 32, 16, 16), ""), 3, 0.5) + ConfusionAnimation.AnimationChangeTexture(DuckEntity3, False, TextureManager.GetTexture("Textures\Battle\StatusEffect\Confused", New Rectangle(0, 32, 16, 16), ""), 3, 0.5) - ConfusionAnimation.AnimationChangeTexture(DuckEntity1, False, TextureManager.GetTexture("Textures\Battle\StatusEffect\Confused", New Rectangle(0, 48, 16, 16), ""), 3.5F, 1) - ConfusionAnimation.AnimationChangeTexture(DuckEntity2, False, TextureManager.GetTexture("Textures\Battle\StatusEffect\Confused", New Rectangle(0, 48, 16, 16), ""), 3.5F, 1) - ConfusionAnimation.AnimationChangeTexture(DuckEntity3, False, TextureManager.GetTexture("Textures\Battle\StatusEffect\Confused", New Rectangle(0, 48, 16, 16), ""), 3.5F, 1) - - ConfusionAnimation.AnimationChangeTexture(DuckEntity1, True, TextureManager.GetTexture("Textures\Battle\StatusEffect\Confused", New Rectangle(0, 64, 16, 16), ""), 4, 1) - ConfusionAnimation.AnimationChangeTexture(DuckEntity2, True, TextureManager.GetTexture("Textures\Battle\StatusEffect\Confused", New Rectangle(0, 64, 16, 16), ""), 4, 1) - ConfusionAnimation.AnimationChangeTexture(DuckEntity3, True, TextureManager.GetTexture("Textures\Battle\StatusEffect\Confused", New Rectangle(0, 64, 16, 16), ""), 4, 1) + ConfusionAnimation.AnimationChangeTexture(DuckEntity1, False, TextureManager.GetTexture("Textures\Battle\StatusEffect\Confused", New Rectangle(0, 48, 16, 16), ""), 3.5F, 0.5) + ConfusionAnimation.AnimationChangeTexture(DuckEntity2, False, TextureManager.GetTexture("Textures\Battle\StatusEffect\Confused", New Rectangle(0, 48, 16, 16), ""), 3.5F, 0.5) + ConfusionAnimation.AnimationChangeTexture(DuckEntity3, False, TextureManager.GetTexture("Textures\Battle\StatusEffect\Confused", New Rectangle(0, 48, 16, 16), ""), 3.5F, 0.5) BattleScreen.BattleQuery.Add(ConfusionAnimation) End If @@ -3533,7 +3529,7 @@ '***STAT INCREASE ANIMATION*** If Core.Player.ShowBattleAnimations <> 0 Then - Dim StatAnimation As AnimationQueryObject = New AnimationQueryObject(pNPC, Not own) + Dim StatAnimation As AnimationQueryObject = New AnimationQueryObject(Nothing, Not own) Dim maxAmount As Integer = 20 * val Dim currentAmount As Integer = 0 While currentAmount <= maxAmount @@ -3542,19 +3538,19 @@ Dim zPos = CSng((Random.NextDouble() - 0.5) * 1.2) Dim Position As New Vector3(xPos, -0.4, zPos) - Dim Destination As New Vector3(xPos, 0.8, zPos) + Dim Destination As New Vector3(xPos, 1.2, zPos) Dim Scale As New Vector3(0.2F) Dim startDelay As Double = 5.0 * Random.NextDouble() - Dim StatEntity As Entity = StatAnimation.SpawnEntity(Position, Texture, Scale, 1.0F, CSng(startDelay)) - + Dim StatEntity As Entity = StatAnimation.SpawnEntity(pNPC.Position + Position, Texture, Scale, 1.0F, CSng(startDelay)) StatAnimation.AnimationMove(StatEntity, True, Destination.X, Destination.Y, Destination.Z, 0.05F, False, True, CSng(startDelay), 0.0F) Threading.Interlocked.Increment(currentAmount) End While + StatAnimation.AnimationPlaySound("Battle\Effects\Stat_Raise", 0, 0) BattleScreen.BattleQuery.Add(StatAnimation) + Else + BattleScreen.BattleQuery.Add(New PlaySoundQueryObject("Battle\Effects\Stat_Raise", False)) End If - BattleScreen.BattleQuery.Add(New PlaySoundQueryObject("Battle\Effects\Stat_Raise", False)) - Dim printMessage As String = p.GetDisplayName() & "'s " & statString Select Case val Case 2 @@ -3816,7 +3812,7 @@ End If '***STAT DECREASE ANIMATION*** If Core.Player.ShowBattleAnimations <> 0 Then - Dim StatAnimation As AnimationQueryObject = New AnimationQueryObject(pNPC, Not own) + Dim StatAnimation As AnimationQueryObject = New AnimationQueryObject(Nothing, Not own) Dim maxAmount As Integer = 20 * val Dim currentAmount As Integer = 0 While currentAmount <= maxAmount @@ -3825,18 +3821,18 @@ Dim zPos = CSng((Random.NextDouble() - 0.5) * 1.2) Dim Position As New Vector3(xPos, 0.8, zPos) - Dim Destination As New Vector3(xPos, -0.4, zPos) + Dim Destination As New Vector3(0, -1.2, 0) Dim Scale As New Vector3(0.2F) Dim startDelay As Double = 5.0 * Random.NextDouble() - Dim StatEntity As Entity = StatAnimation.SpawnEntity(Position, Texture, Scale, 1.0F, CSng(startDelay)) - - + Dim StatEntity As Entity = StatAnimation.SpawnEntity(pNPC.Position + Position, Texture, Scale, 1.0F, CSng(startDelay)) StatAnimation.AnimationMove(StatEntity, True, Destination.X, Destination.Y, Destination.Z, 0.05F, False, True, CSng(startDelay), 0.0F) Threading.Interlocked.Increment(currentAmount) End While + StatAnimation.AnimationPlaySound("Battle\Effects\Stat_Lower", 0, 0) BattleScreen.BattleQuery.Add(StatAnimation) + Else + BattleScreen.BattleQuery.Add(New PlaySoundQueryObject("Battle\Effects\Stat_Lower", False)) End If - BattleScreen.BattleQuery.Add(New PlaySoundQueryObject("Battle\Effects\Stat_Lower", False)) Dim printMessage As String = p.GetDisplayName() & "'s " & statString Select Case val Case 2 @@ -4103,14 +4099,14 @@ Dim startDelay As Double = 5.0 * Random.NextDouble() Dim HealEntity As Entity = HealAnimation.SpawnEntity(Position, Texture, Scale, 1.0F, CSng(startDelay)) - HealAnimation.AnimationMove(HealEntity, True, Destination.X, Destination.Y, Destination.Z, 0.05F, False, True, CSng(startDelay), 0.0F) Threading.Interlocked.Increment(currentAmount) End While + HealAnimation.AnimationPlaySound("Battle\Effects\Heal", 0, 0) BattleScreen.BattleQuery.Add(HealAnimation) + Else + BattleScreen.BattleQuery.Add(New PlaySoundQueryObject("Battle\Effects\Heal", False)) End If - BattleScreen.BattleQuery.Add(New PlaySoundQueryObject("Battle\Effects\Heal", False)) - If message <> "" Then BattleScreen.BattleQuery.Add(New TextQueryObject(message)) End If diff --git a/P3D/Battle/BattleSystemV2/QueryObjects/AnimationQueryObject.vb b/P3D/Battle/BattleSystemV2/QueryObjects/AnimationQueryObject.vb index 5dda41573..b40f6f933 100644 --- a/P3D/Battle/BattleSystemV2/QueryObjects/AnimationQueryObject.vb +++ b/P3D/Battle/BattleSystemV2/QueryObjects/AnimationQueryObject.vb @@ -103,9 +103,17 @@ Public Function SpawnEntity(ByVal Position As Vector3, ByVal Texture As Texture2D, ByVal Scale As Vector3, ByVal Opacity As Single, Optional ByVal startDelay As Single = 0.0F, Optional ByVal endDelay As Single = 0.0F) As Entity Dim NewPosition As Vector3 If Not Position = Nothing Then - NewPosition = CurrentEntity.Position + Position + If CurrentEntity IsNot Nothing Then + NewPosition = CurrentEntity.Position + Position + Else + NewPosition = Position + End If Else - NewPosition = CurrentEntity.Position + If CurrentEntity IsNot Nothing Then + NewPosition = CurrentEntity.Position + Else + NewPosition = New Vector3(0, 0, 0) + End If End If Dim SpawnedEntity = New BattleAnimation3D(NewPosition, Texture, Scale, startDelay, endDelay, False) SpawnedEntity.Opacity = Opacity diff --git a/P3D/Content/Textures/Battle/StatChange/statDown.png b/P3D/Content/Textures/Battle/StatChange/statDown.png index 44e7ba0409242e345a0af8a67b1a45622c3b066c..5b4326ff03cc65211babc811b91090390e76dc75 100644 GIT binary patch delta 153 zcmV;K0A~N{0r3HlV1Il`L_t(I%VYfi|33pIfRUyKcsB0*zrEg_k!%ApH{Sd|-CunG z4LJDn=YM-~cJd6!+<5bUfrA3WgaZ#4@VNrT0MEvq{}l`r7$Phb7$i6t7!)`d7#{p! zV0iI^fnmjo2MiA`JYYZ%RO-5bs$noVqLJd1IPjT?7ytm2&=PCmj2|la00000NkvXX Hu0mjf7xF<% delta 146 zcmV;D0B!&A0qOyeV1IQE=0|9l_~ zIH>ra-Tpp#2K<~T`JW*pfq`Mh0tS4pKr!H_A?JUF1OWyH0}ciTiwFh=h6V^ev4Vl& z!Vd<91s@pD1C_ciplTQll4ztfB@TRMA_f2exvOU3-CD-d01E&B07*qoM6N<$f&x@K A?EnA( diff --git a/P3D/Content/Textures/Battle/StatChange/statUp.png b/P3D/Content/Textures/Battle/StatChange/statUp.png index 5b4326ff03cc65211babc811b91090390e76dc75..44e7ba0409242e345a0af8a67b1a45622c3b066c 100644 GIT binary patch delta 146 zcmV;D0B!&A0qOyeV1IQE=0|9l_~ zIH>ra-Tpp#2K<~T`JW*pfq`Mh0tS4pKr!H_A?JUF1OWyH0}ciTiwFh=h6V^ev4Vl& z!Vd<91s@pD1C_ciplTQll4ztfB@TRMA_f2exvOU3-CD-d01E&B07*qoM6N<$f&x@K A?EnA( delta 153 zcmV;K0A~N{0r3HlV1Il`L_t(I%VYfi|33pIfRUyKcsB0*zrEg_k!%ApH{Sd|-CunG z4LJDn=YM-~cJd6!+<5bUfrA3WgaZ#4@VNrT0MEvq{}l`r7$Phb7$i6t7!)`d7#{p! zV0iI^fnmjo2MiA`JYYZ%RO-5bs$noVqLJd1IPjT?7ytm2&=PCmj2|la00000NkvXX Hu0mjf7xF<% diff --git a/P3D/Pokemon/Attacks/Normal/Growl.vb b/P3D/Pokemon/Attacks/Normal/Growl.vb index 9558524c9..7ab2ed77b 100644 --- a/P3D/Pokemon/Attacks/Normal/Growl.vb +++ b/P3D/Pokemon/Attacks/Normal/Growl.vb @@ -66,8 +66,12 @@ Dim MoveAnimation As AnimationQueryObject = New AnimationQueryObject(CurrentEntity, BattleFlip) MoveAnimation.AnimationPlaySound(CStr(CurrentPokemon.Number), 0, 0,, True) - Dim SoundwaveEntity = MoveAnimation.SpawnEntity(New Vector3(0.25, -0.25, -0.25), TextureManager.GetTexture("Textures\Battle\Normal\Growl", New Rectangle(0, 0, 32, 32), ""), New Vector3(0.5F), 1, 0, 1) - + Dim SoundwaveEntity As Entity + If BattleFlip = False Then + SoundwaveEntity = MoveAnimation.SpawnEntity(New Vector3(0.25, -0.25, 0), TextureManager.GetTexture("Textures\Battle\Normal\Growl", New Rectangle(0, 0, 32, 32), ""), New Vector3(0.5F), 1, 0, 1) + Else + SoundwaveEntity = MoveAnimation.SpawnEntity(New Vector3(-0.25, -0.25, 0), TextureManager.GetTexture("Textures\Battle\Normal\Growl", New Rectangle(0, 0, 32, 32), ""), New Vector3(0.5F), 1, 0, 1) + End If MoveAnimation.AnimationChangeTexture(SoundwaveEntity, False, TextureManager.GetTexture("Textures\Battle\Normal\Growl", New Rectangle(0, 32, 32, 32), ""), 1, 1) MoveAnimation.AnimationChangeTexture(SoundwaveEntity, False, TextureManager.GetTexture("Textures\Battle\Normal\Growl", New Rectangle(0, 0, 32, 32), ""), 2, 1) MoveAnimation.AnimationChangeTexture(SoundwaveEntity, True, TextureManager.GetTexture("Textures\Battle\Normal\Growl", New Rectangle(0, 32, 32, 32), ""), 3, 1) From 8bbbb729a75ad22cb49f2505a61c455511d7e7a4 Mon Sep 17 00:00:00 2001 From: JappaWakkaP3D <31563291+JappaWakka@users.noreply.github.com> Date: Fri, 26 Nov 2021 21:59:52 +0100 Subject: [PATCH 25/57] Fix for a bug where you couldn't use certain items outside of battle --- P3D/Screens/Inventory/NewInventoryScreen.vb | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/P3D/Screens/Inventory/NewInventoryScreen.vb b/P3D/Screens/Inventory/NewInventoryScreen.vb index 9d6c66594..425d907a0 100644 --- a/P3D/Screens/Inventory/NewInventoryScreen.vb +++ b/P3D/Screens/Inventory/NewInventoryScreen.vb @@ -821,16 +821,23 @@ Public Class NewInventoryScreen If Controls.Accept() AndAlso _items.Length > 0 Then Dim cItem As Item = Item.GetItemByID(_items(ItemIndex + PageIndex * 10).ItemID) SoundManager.PlaySound("select") - If cItem.CanBeUsedInBattle = True Then + If Me.PreScreen.Identification = Screen.Identifications.BattleScreen Then + If cItem.CanBeUsedInBattle = True Then + _infoItemOptionSelection = 0 + _isInfoShowing = True + SetInfoSettings() + SetItemOptions() + Else + TextBox.Show("This item can't~be used in Battle.") + End If + Else _infoItemOptionSelection = 0 _isInfoShowing = True SetInfoSettings() SetItemOptions() - Else - TextBox.Show("This item can't~be used in Battle.") End If - End If + End If If Controls.Dismiss() Then SoundManager.PlaySound("select") _tabInControl = True From 1ea2da7bb7324cd5a30cd19e4b81e0ed9c517deb Mon Sep 17 00:00:00 2001 From: JappaWakkaP3D <31563291+JappaWakka@users.noreply.github.com> Date: Sun, 28 Nov 2021 11:03:55 +0100 Subject: [PATCH 26/57] Added Asleep animation, fixed some code errors I made. Also added sound effects when animations are disabled. --- P3D/Battle/BattleSystemV2/Battle.vb | 97 +++++++++++++++++- P3D/Content/Sounds/Battle/Effects/Asleep.wav | Bin 0 -> 99812 bytes .../Textures/Battle/StatusEffect/Asleep.png | Bin 0 -> 290 bytes 3 files changed, 95 insertions(+), 2 deletions(-) create mode 100644 P3D/Content/Sounds/Battle/Effects/Asleep.wav create mode 100644 P3D/Content/Textures/Battle/StatusEffect/Asleep.png diff --git a/P3D/Battle/BattleSystemV2/Battle.vb b/P3D/Battle/BattleSystemV2/Battle.vb index b1f6a348f..7bd5483c0 100644 --- a/P3D/Battle/BattleSystemV2/Battle.vb +++ b/P3D/Battle/BattleSystemV2/Battle.vb @@ -1239,6 +1239,23 @@ End If Else If sleepTurns > 0 Then + If Core.Player.ShowBattleAnimations <> 0 Then + Dim SleepAnimation As New AnimationQueryObject(pNPC, Not own) + + SleepAnimation.AnimationPlaySound("Battle\Effects\Asleep", 0, 0) + Dim SleepEntity1 As Entity = SleepAnimation.SpawnEntity(New Vector3(0, 0.25, 0), TextureManager.GetTexture("Textures\Battle\StatusEffect\Asleep", New Rectangle(0, 0, 16, 16), ""), New Vector3(0.5F), 1, 0, 1) + SleepAnimation.AnimationChangeTexture(SleepEntity1, False, TextureManager.GetTexture("Textures\Battle\StatusEffect\Asleep", New Rectangle(0, 16, 16, 16), ""), 1, 1) + SleepAnimation.AnimationMove(SleepEntity1, True, 0, 0.5, 0.25, 0.01, False, False, 0, 0) + + Dim SleepEntity2 As Entity = SleepAnimation.SpawnEntity(New Vector3(0.25, 0.25, 0.25), TextureManager.GetTexture("Textures\Battle\StatusEffect\Asleep", New Rectangle(0, 0, 16, 16), ""), New Vector3(0.5F), 1, 1.5, 1) + + SleepAnimation.AnimationChangeTexture(SleepEntity2, False, TextureManager.GetTexture("Textures\Battle\StatusEffect\Asleep", New Rectangle(0, 16, 16, 16), ""), 2.5, 1) + SleepAnimation.AnimationMove(SleepEntity2, True, 0, 0.5, 0.25, 0.01, False, False, 2, 0) + + BattleScreen.BattleQuery.Add(SleepAnimation) + Else + BattleScreen.BattleQuery.Add(New PlaySoundQueryObject("Battle\Effects\Asleep", False)) + End If BattleScreen.BattleQuery.Add(New TextQueryObject(p.GetDisplayName() & " is fast asleep.")) Exit Sub Else @@ -1357,6 +1374,46 @@ BattleScreen.BattleQuery.Add(New TextQueryObject(p.GetDisplayName() & " is no longer confused!")) p.RemoveVolatileStatus(Pokemon.VolatileStatus.Confusion) Else + If Core.Player.ShowBattleAnimations <> 0 Then + Dim ConfusionAnimation As New AnimationQueryObject(pNPC, Not own) + + ConfusionAnimation.AnimationPlaySound("Battle\Effects\Confused", 0, 0) + Dim DuckEntity1 As Entity = ConfusionAnimation.SpawnEntity(New Vector3(-0.25, 0.25, -0.25), TextureManager.GetTexture("Textures\Battle\StatusEffect\Confused", New Rectangle(0, 0, 16, 16), ""), New Vector3(0.5F), 1, 0, 0.5) + Dim DuckEntity2 As Entity = ConfusionAnimation.SpawnEntity(New Vector3(0.25, 0.25, 0.25), TextureManager.GetTexture("Textures\Battle\StatusEffect\Confused", New Rectangle(0, 0, 16, 16), ""), New Vector3(0.5F), 1, 0, 0.5) + Dim DuckEntity3 As Entity = ConfusionAnimation.SpawnEntity(New Vector3(0.25, 0.25, -0.25), TextureManager.GetTexture("Textures\Battle\StatusEffect\Confused", New Rectangle(0, 0, 16, 16), ""), New Vector3(0.5F), 1, 0, 0.5) + + ConfusionAnimation.AnimationChangeTexture(DuckEntity1, False, TextureManager.GetTexture("Textures\Battle\StatusEffect\Confused", New Rectangle(0, 16, 16, 16), ""), 0.5, 0.5) + ConfusionAnimation.AnimationChangeTexture(DuckEntity2, False, TextureManager.GetTexture("Textures\Battle\StatusEffect\Confused", New Rectangle(0, 16, 16, 16), ""), 0.5, 0.5) + ConfusionAnimation.AnimationChangeTexture(DuckEntity3, False, TextureManager.GetTexture("Textures\Battle\StatusEffect\Confused", New Rectangle(0, 16, 16, 16), ""), 0.5, 0.5) + + ConfusionAnimation.AnimationChangeTexture(DuckEntity1, False, TextureManager.GetTexture("Textures\Battle\StatusEffect\Confused", New Rectangle(0, 32, 16, 16), ""), 1.5F, 0.5) + ConfusionAnimation.AnimationChangeTexture(DuckEntity2, False, TextureManager.GetTexture("Textures\Battle\StatusEffect\Confused", New Rectangle(0, 32, 16, 16), ""), 1.5F, 0.5) + ConfusionAnimation.AnimationChangeTexture(DuckEntity3, False, TextureManager.GetTexture("Textures\Battle\StatusEffect\Confused", New Rectangle(0, 32, 16, 16), ""), 1.5F, 0.5) + + ConfusionAnimation.AnimationChangeTexture(DuckEntity1, False, TextureManager.GetTexture("Textures\Battle\StatusEffect\Confused", New Rectangle(0, 48, 16, 16), ""), 1.5F, 0.5) + ConfusionAnimation.AnimationChangeTexture(DuckEntity2, False, TextureManager.GetTexture("Textures\Battle\StatusEffect\Confused", New Rectangle(0, 48, 16, 16), ""), 1.5F, 0.5) + ConfusionAnimation.AnimationChangeTexture(DuckEntity3, False, TextureManager.GetTexture("Textures\Battle\StatusEffect\Confused", New Rectangle(0, 48, 16, 16), ""), 1.5F, 0.5) + + ConfusionAnimation.AnimationChangeTexture(DuckEntity1, False, TextureManager.GetTexture("Textures\Battle\StatusEffect\Confused", New Rectangle(0, 0, 16, 16), ""), 2.0F, 0.5) + ConfusionAnimation.AnimationChangeTexture(DuckEntity2, False, TextureManager.GetTexture("Textures\Battle\StatusEffect\Confused", New Rectangle(0, 0, 16, 16), ""), 2.0F, 0.5) + ConfusionAnimation.AnimationChangeTexture(DuckEntity3, False, TextureManager.GetTexture("Textures\Battle\StatusEffect\Confused", New Rectangle(0, 0, 16, 16), ""), 2.0F, 0.5) + + ConfusionAnimation.AnimationChangeTexture(DuckEntity1, False, TextureManager.GetTexture("Textures\Battle\StatusEffect\Confused", New Rectangle(0, 16, 16, 16), ""), 2.5F, 0.5) + ConfusionAnimation.AnimationChangeTexture(DuckEntity2, False, TextureManager.GetTexture("Textures\Battle\StatusEffect\Confused", New Rectangle(0, 16, 16, 16), ""), 2.5F, 0.5) + ConfusionAnimation.AnimationChangeTexture(DuckEntity3, False, TextureManager.GetTexture("Textures\Battle\StatusEffect\Confused", New Rectangle(0, 16, 16, 16), ""), 2.5F, 0.5) + + ConfusionAnimation.AnimationChangeTexture(DuckEntity1, False, TextureManager.GetTexture("Textures\Battle\StatusEffect\Confused", New Rectangle(0, 32, 16, 16), ""), 3, 0.5) + ConfusionAnimation.AnimationChangeTexture(DuckEntity2, False, TextureManager.GetTexture("Textures\Battle\StatusEffect\Confused", New Rectangle(0, 32, 16, 16), ""), 3, 0.5) + ConfusionAnimation.AnimationChangeTexture(DuckEntity3, False, TextureManager.GetTexture("Textures\Battle\StatusEffect\Confused", New Rectangle(0, 32, 16, 16), ""), 3, 0.5) + + ConfusionAnimation.AnimationChangeTexture(DuckEntity1, False, TextureManager.GetTexture("Textures\Battle\StatusEffect\Confused", New Rectangle(0, 48, 16, 16), ""), 3.5F, 0.5) + ConfusionAnimation.AnimationChangeTexture(DuckEntity2, False, TextureManager.GetTexture("Textures\Battle\StatusEffect\Confused", New Rectangle(0, 48, 16, 16), ""), 3.5F, 0.5) + ConfusionAnimation.AnimationChangeTexture(DuckEntity3, False, TextureManager.GetTexture("Textures\Battle\StatusEffect\Confused", New Rectangle(0, 48, 16, 16), ""), 3.5F, 0.5) + + BattleScreen.BattleQuery.Add(ConfusionAnimation) + Else + BattleScreen.BattleQuery.Add(New PlaySoundQueryObject("Battle\Effects\Confused", False)) + End If BattleScreen.BattleQuery.Add(New TextQueryObject(p.GetDisplayName() & " is confused!")) 'Previously 'If Core.Random.Next(0, 2) = 0 Then' (Updated to gen 7's 33% instead of 50%) If Core.Random.Next(0, 3) = 0 Then @@ -3043,10 +3100,14 @@ Public Function InflictSleep(ByVal own As Boolean, ByVal from As Boolean, ByVal BattleScreen As BattleScreen, ByVal turnsPreset As Integer, ByVal message As String, ByVal cause As String) As Boolean Dim p As Pokemon = BattleScreen.OwnPokemon + Dim pNPC As NPC = BattleScreen.OwnPokemonNPC Dim op As Pokemon = BattleScreen.OppPokemon + Dim opNPC As NPC = BattleScreen.OppPokemonNPC If own = False Then p = BattleScreen.OppPokemon + pNPC = BattleScreen.OppPokemonNPC op = BattleScreen.OwnPokemon + opNPC = BattleScreen.OwnPokemonNPC End If If p.HP <= 0 OrElse p.Status = Pokemon.StatusProblems.Fainted Then @@ -3132,6 +3193,23 @@ Return False Else 'Works! + If Core.Player.ShowBattleAnimations <> 0 Then + Dim SleepAnimation As New AnimationQueryObject(pNPC, Not own) + + SleepAnimation.AnimationPlaySound("Battle\Effects\Asleep", 0, 0) + Dim SleepEntity1 As Entity = SleepAnimation.SpawnEntity(New Vector3(0, 0.25, 0), TextureManager.GetTexture("Textures\Battle\StatusEffect\Asleep", New Rectangle(0, 0, 16, 16), ""), New Vector3(0.5F), 1, 0, 1) + SleepAnimation.AnimationChangeTexture(SleepEntity1, False, TextureManager.GetTexture("Textures\Battle\StatusEffect\Asleep", New Rectangle(0, 16, 16, 16), ""), 1, 1) + SleepAnimation.AnimationMove(SleepEntity1, True, 0, 0.5, 0.25, 0.01, False, False, 0, 0) + + Dim SleepEntity2 As Entity = SleepAnimation.SpawnEntity(New Vector3(0.25, 0.25, 0.25), TextureManager.GetTexture("Textures\Battle\StatusEffect\Asleep", New Rectangle(0, 0, 16, 16), ""), New Vector3(0.5F), 1, 1.5, 1) + + SleepAnimation.AnimationChangeTexture(SleepEntity2, False, TextureManager.GetTexture("Textures\Battle\StatusEffect\Asleep", New Rectangle(0, 16, 16, 16), ""), 2.5, 1) + SleepAnimation.AnimationMove(SleepEntity2, True, 0, 0.5, 0.25, 0.01, False, False, 2, 0) + + BattleScreen.BattleQuery.Add(SleepAnimation) + Else + BattleScreen.BattleQuery.Add(New PlaySoundQueryObject("Battle\Effects\Asleep", False)) + End If If own = True Then BattleScreen.FieldEffects.OwnBideCounter = 0 BattleScreen.FieldEffects.OwnBideDamage = 0 @@ -3381,6 +3459,8 @@ ConfusionAnimation.AnimationChangeTexture(DuckEntity3, False, TextureManager.GetTexture("Textures\Battle\StatusEffect\Confused", New Rectangle(0, 48, 16, 16), ""), 3.5F, 0.5) BattleScreen.BattleQuery.Add(ConfusionAnimation) + Else + BattleScreen.BattleQuery.Add(New PlaySoundQueryObject("Battle\Effects\Confused", False)) End If p.AddVolatileStatus(Pokemon.VolatileStatus.Confusion) Select Case message @@ -5520,6 +5600,8 @@ PoisonAnimation.AnimationChangeTexture(BubbleEntity3, True, TextureManager.GetTexture("Textures\Battle\StatusEffect\Poisoned", New Rectangle(0, 64, 32, 32), ""), 4, 1) BattleScreen.BattleQuery.Add(PoisonAnimation) + Else + BattleScreen.BattleQuery.Add(New PlaySoundQueryObject("Battle\Effects\Poisoned", False)) End If 'Actual damage ReduceHP(CInt(.OwnPokemon.MaxHP / 8), True, True, BattleScreen, "The poison hurt " & .OwnPokemon.GetDisplayName() & ".", "poison") @@ -5548,6 +5630,8 @@ PoisonAnimation.AnimationChangeTexture(BubbleEntity3, True, TextureManager.GetTexture("Textures\Battle\StatusEffect\Poisoned", New Rectangle(0, 64, 32, 32), ""), 4, 1) BattleScreen.BattleQuery.Add(PoisonAnimation) + Else + BattleScreen.BattleQuery.Add(New PlaySoundQueryObject("Battle\Effects\Poisoned", False)) End If 'Actual damage ReduceHP(CInt(.OwnPokemon.MaxHP * multiplier), True, True, BattleScreen, "The toxic hurt " & .OwnPokemon.GetDisplayName() & ".", "badpoison") @@ -5575,6 +5659,8 @@ BurnAnimation.AnimationChangeTexture(FlameEntity, False, TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 96, 32, 32), ""), 4, 1) BurnAnimation.AnimationChangeTexture(FlameEntity, True, TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 128, 32, 32), ""), 5, 2) BattleScreen.BattleQuery.Add(BurnAnimation) + Else + BattleScreen.BattleQuery.Add(New PlaySoundQueryObject("Battle\Effects\Burned", False)) End If 'Actual damage ReduceHP(reduceAmount, True, True, BattleScreen, .OwnPokemon.GetDisplayName() & " is hurt by the burn.", "burn") @@ -6323,6 +6409,8 @@ PoisonAnimation.AnimationChangeTexture(BubbleEntity3, True, TextureManager.GetTexture("Textures\Battle\StatusEffect\Poisoned", New Rectangle(0, 64, 32, 32), ""), 4, 1) BattleScreen.BattleQuery.Add(PoisonAnimation) + Else + BattleScreen.BattleQuery.Add(New PlaySoundQueryObject("Battle\Effects\Poisoned", False)) End If 'Actual damage ReduceHP(CInt(.OppPokemon.MaxHP / 8), False, False, BattleScreen, "The poison hurt " & .OppPokemon.GetDisplayName() & ".", "poison") @@ -6351,9 +6439,12 @@ PoisonAnimation.AnimationChangeTexture(BubbleEntity3, True, TextureManager.GetTexture("Textures\Battle\StatusEffect\Poisoned", New Rectangle(0, 64, 32, 32), ""), 4, 1) BattleScreen.BattleQuery.Add(PoisonAnimation) - 'Actual damage - ReduceHP(CInt(.OppPokemon.MaxHP * multiplier), False, False, BattleScreen, "The toxic hurt " & .OppPokemon.GetDisplayName() & ".", "badpoison") + Else + BattleScreen.BattleQuery.Add(New PlaySoundQueryObject("Battle\Effects\Poisoned", False)) End If + 'Actual damage + ReduceHP(CInt(.OppPokemon.MaxHP * multiplier), False, False, BattleScreen, "The toxic hurt " & .OppPokemon.GetDisplayName() & ".", "badpoison") + End If End If End If @@ -6377,6 +6468,8 @@ BurnAnimation.AnimationChangeTexture(FlameEntity, False, TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 96, 32, 32), ""), 4, 1) BurnAnimation.AnimationChangeTexture(FlameEntity, True, TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 128, 32, 32), ""), 5, 2) BattleScreen.BattleQuery.Add(BurnAnimation) + Else + BattleScreen.BattleQuery.Add(New PlaySoundQueryObject("Battle\Effects\Burned", False)) End If 'Actual damage ReduceHP(reduceAmount, False, False, BattleScreen, .OppPokemon.GetDisplayName() & " is hurt by the burn.", "burn") diff --git a/P3D/Content/Sounds/Battle/Effects/Asleep.wav b/P3D/Content/Sounds/Battle/Effects/Asleep.wav new file mode 100644 index 0000000000000000000000000000000000000000..2807c5619284d4b8f3fe29e7e696e63fd16a26bd GIT binary patch literal 99812 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

EJfoy7jfp*|qH#^e{8C)JF3u(>&3sAtI3_ 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 literal 0 HcmV?d00001 diff --git a/P3D/Content/Textures/Battle/StatusEffect/Asleep.png b/P3D/Content/Textures/Battle/StatusEffect/Asleep.png new file mode 100644 index 0000000000000000000000000000000000000000..1a350b9bb0a565c6be795d636c0e602205903636 GIT binary patch literal 290 zcmeAS@N?(olHy`uVBq!ia0vp^0zj<5!3HFyJAa%3Qk(@Ik;M!Q+(IDCc Date: Sun, 28 Nov 2021 12:13:09 +0100 Subject: [PATCH 27/57] Add the new textures and sounds to the project solution --- P3D/P3D.vbproj | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/P3D/P3D.vbproj b/P3D/P3D.vbproj index 3e257df4f..7367fed6b 100644 --- a/P3D/P3D.vbproj +++ b/P3D/P3D.vbproj @@ -14704,6 +14704,9 @@ PreserveNewest + + PreserveNewest + PreserveNewest @@ -14713,6 +14716,9 @@ PreserveNewest + + PreserveNewest + PreserveNewest @@ -15409,6 +15415,9 @@ PreserveNewest + + PreserveNewest + PreserveNewest From c85ccd89ae9ca444e59605f53903446f7807fca7 Mon Sep 17 00:00:00 2001 From: JappaWakkaP3D <31563291+JappaWakka@users.noreply.github.com> Date: Fri, 3 Dec 2021 16:01:54 +0100 Subject: [PATCH 28/57] Added Frozen animation and Infatuated sound effect --- P3D/Battle/BattleSystemV2/Battle.vb | 28 +++++++++++++++++- P3D/Content/Sounds/Battle/Effects/Frozen.wav | Bin 49474 -> 70728 bytes .../Sounds/Battle/Effects/Infatuated.wav | Bin 0 -> 143648 bytes .../Textures/Battle/StatusEffect/Frozen.png | Bin 0 -> 439 bytes P3D/P3D.vbproj | 6 ++++ 5 files changed, 33 insertions(+), 1 deletion(-) create mode 100644 P3D/Content/Sounds/Battle/Effects/Infatuated.wav create mode 100644 P3D/Content/Textures/Battle/StatusEffect/Frozen.png diff --git a/P3D/Battle/BattleSystemV2/Battle.vb b/P3D/Battle/BattleSystemV2/Battle.vb index 7bd5483c0..0f258704f 100644 --- a/P3D/Battle/BattleSystemV2/Battle.vb +++ b/P3D/Battle/BattleSystemV2/Battle.vb @@ -2856,7 +2856,9 @@ Public Function InflictFreeze(ByVal own As Boolean, ByVal from As Boolean, ByVal BattleScreen As BattleScreen, ByVal message As String, ByVal cause As String) As Boolean Dim p As Pokemon = BattleScreen.OwnPokemon Dim op As Pokemon = BattleScreen.OppPokemon + Dim pNPC As NPC = BattleScreen.OwnPokemonNPC If own = False Then + pNPC = BattleScreen.OppPokemonNPC p = BattleScreen.OppPokemon op = BattleScreen.OwnPokemon End If @@ -2925,7 +2927,31 @@ 'Works! p.Status = Pokemon.StatusProblems.Freeze ChangeCameraAngle(1, own, BattleScreen) - BattleScreen.BattleQuery.Add(New PlaySoundQueryObject("Battle\Effects\Frozen", False)) + 'Frozen animation + If Core.Player.ShowBattleAnimations <> 0 Then + Dim FrozenAnimation As AnimationQueryObject = New AnimationQueryObject(pNPC, Not own) + + FrozenAnimation.AnimationPlaySound("Battle\Effects\Frozen", 0, 0) + Dim maxAmount As Integer = 8 + Dim currentAmount As Integer = 0 + While currentAmount <= maxAmount + Dim Texture As Texture2D = TextureManager.GetTexture("Textures\Battle\StatusEffect\Frozen", New Rectangle(0, 0, 32, 32), "") + Dim xPos = CSng(Random.Next(-4, 4) / 8) + Dim zPos = CSng(Random.Next(-4, 4) / 8) + + Dim Position As New Vector3(xPos, -0.25, zPos) + Dim Scale As New Vector3(0.25F) + Dim startDelay As Double = 5.0 * Random.NextDouble() + Dim SnowflakeEntity = FrozenAnimation.SpawnEntity(Position, Texture, Scale, 1.0F, CSng(startDelay)) + + FrozenAnimation.AnimationFade(SnowflakeEntity, True, 0.02, False, 0.0F, CSng(startDelay), 0.0) + Threading.Interlocked.Increment(currentAmount) + End While + + BattleScreen.BattleQuery.Add(FrozenAnimation) + Else + BattleScreen.BattleQuery.Add(New PlaySoundQueryObject("Battle\Effects\Frozen", False)) + End If Select Case message Case "" 'Print default message only BattleScreen.BattleQuery.Add(New TextQueryObject(p.GetDisplayName() & " was frozen solid!")) diff --git a/P3D/Content/Sounds/Battle/Effects/Frozen.wav b/P3D/Content/Sounds/Battle/Effects/Frozen.wav index 3634accf62737d6d60271b0bd817c7bd97caeb70..e21fa9775fdaa96752fed82aaeb4494f3e1fdd8b 100644 GIT binary patch literal 70728 zcma)_XS8Njm99(eW;nPEyDUp6N`7!#1pyHxDQ2KZ5>%wkf+#^y!B!-R7*Q}{#Ecj* z3(`myl|~TM7Es#IzqnYIC2|=IhJ$-sx$m=|^Ro6i_~X_$>f33p8Q%HMx%S@QK6@Rs z?_PU7W90*uJ%6|7?Rn&Dj^BLwvSrI2ux!EPt1+n^yli+gslDnA^6wZL8b1$nvq%a_if+zHQ5_ zZIeAL`D~s4wB*=Wa-2*vG385v2E5Lm808Ec5fMt`0?oMWsgU;x$WlFznl;R z(_69*e!rX$z9s9otiCz>f0J$c<3EUQ9VuI8xlO*+j!*M7{Gu&3pwTFRY^`HS5A5bB z79)?yf$uicRxuC>kI)XUl}1majqi;sQaP@L_ShnO9-Ggj^U-!%8Qn)u`iL$){MKXj zs98U-kywcMd`&C2x~(kzRS^93geFVaDqnAzc>23wd(-M|gV7fG7<0bGZJSuR#bhUT z%QZF9Mx5aE{n^r^NUC?@uH_?s@>z^PWN0)BAh1oO5Dnu-tY|M%jk>uuP@@l6Yk~61 zR2gd2utWxNlp}apo^_u`zz<&jCP?0tKGTYm~7rUt+u@Fk&}$aM8;N;#eQX5oy@pq9_VX_sAzMUy47t1HF6)e zQc-`EC0i`P^w+DG;?RsXPm6eSuyIryNQto7LTgzBFJ(Lox1BuPHb)*6q{$Df*3c+2 zW_A5BYs>w?tEIYSL+!O<$U8ZKMP)B>#tLFn<_zTY5$jjs z4!+%Ib@lw47A-6XHN6p6^@6w_(GMT!r%!l2q#J)^sAu@)Xbbux z?O2B{F=@qRPxrODYEyGpD{B$0vAV3chB>~s*3;wu7TFR{j2UNA&31DgR>IR?2I1eN zzTTYAZ&x$s<0lAM-DH7sux6kmrW`RZL{VGJUHJzqK;Us{$N31+o-+wsx6NLdxn0`I zP#BA3FmPOM=CDM|&}U=@gFSn}2V-oeJ6^%G@<3L1t9gcX=xi3bjm7%I68&U8W4)~G zxvI>apS^OPFmyDgERD9AEK|rH^Mh?7k5zi+XbMvD$y~FxGGvCkSqOW}Kk#5A@a(u12aB=6QOz?` z#s{o#qKgL-TNTLIt(2iDmqzrPAKAdTJKD)SGS*k8Gl67l> z)eBB}hOHDl^=!*JKusnms0myv=&8sKR-?Df7@VrF*p3g5>|RIr3|`+B`@?vL6!wA; z%%wLqYUvT#t>1DBud%OH&S;1-5{;1ce;_L+Ti%A(y?%F0XWLPoN~pd@&(YRv5$_pP zkF2m-(uc|;(p$Y5S-wIfrkBQd-XgM*ZVDhWsbv&3yWxPdiwr zb@R@;$FXvP*r1zjkhAU)=}`e?fLDshCy&g=`RJ!k8Exd)BQIDp>(yd}=3_Cn&Njmq z&_kQ|A2{AZM&5eWD*&X;a|!LpOTSU604Q>q^iA-ykEx?wZoQL*0>9@&tD?b&0b3hQG{k)zPcXLQQ@PJr& ztWnaF#!x0VLySPL5_(=m58LB6JaCjHV$=?=vOR+ZH(HC!Jd@Br^oS!2gPT@Eum=$s z(NWJOXX8Ep@%$W=kT`fl99k8qhaRs+<56_YyP?^m;@J^?%jp~htmjNLo8-+vww5E` ztYN7)cqErb_IVciWz|lC$lfe)pDRO9YoZ#B8_a=Td-J5`�X2|f#)A) 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 literal 49474 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

    ^2?2EYuGkoB~|yZ|stXU=lcC z++sW#m>zt-pmt#qe60s*XF5^N0fw#5Ezlj0<9er|$3Dhh+Lj`r-w_lRVps9A!XI-$ zFL1Gqaleh=iJi=>S=HGRd&nX(TJuqzolY}fhpHnuzsG*iQ#4M#C|j{S;KChpBUVW3 zD<9;E*oo=_{BR(8b?lS`O=1(xKJ_xPob-SmKZ&(rEo5(@g_m}Ls0Kv!o$F0{)1Kgv zP|NI=Icjj|Em$c%iGMK@o~W|b_z>jkPx_eZaF#>=vO{Hm{d)%0D4$y13^nBpu#gtD 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 diff --git a/P3D/Content/Sounds/Battle/Effects/Infatuated.wav b/P3D/Content/Sounds/Battle/Effects/Infatuated.wav new file mode 100644 index 0000000000000000000000000000000000000000..2ecea357b4330f88c2987ba93ee97505191f7059 GIT binary patch literal 143648 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 H>T~`d-&zUe literal 0 HcmV?d00001 diff --git a/P3D/Content/Textures/Battle/StatusEffect/Frozen.png b/P3D/Content/Textures/Battle/StatusEffect/Frozen.png new file mode 100644 index 0000000000000000000000000000000000000000..2ec075fc550f24c9895a6f7a91366ca36cc24990 GIT binary patch literal 439 zcmV;o0Z9IdP)YAX9X8WNB|8RBvx=!KdMT0003( zNklPmb!l?6b|#dnjeRU#VzGiM;X17P;> zew7MY05ta6_ssy1C9;YD=&;!*DqzJ)0#K@ZChyn}f*?2rOK9d(#D)3VfjA{g-qt zIUosu-)T8t`W*{aM5Ogsm(_?250_Km&>CR&$PW8Jsz+>c!B_Qxl-GCfgjRr+EoA8uGkY)d}&59?sbZQgJpfB!_N9Y{B9?q2-dITQSZDY(iGQ-}Pd0 h=*?(p(*4Bc^Z^b(7vDNpvLyfj002ovPDHLkV1jp$w3z?^ literal 0 HcmV?d00001 diff --git a/P3D/P3D.vbproj b/P3D/P3D.vbproj index 7367fed6b..32cc4e1b4 100644 --- a/P3D/P3D.vbproj +++ b/P3D/P3D.vbproj @@ -14713,12 +14713,18 @@ PreserveNewest + + PreserveNewest + PreserveNewest PreserveNewest + + PreserveNewest + PreserveNewest From 93f1228eb2b1e2d55be1d5b82ee485e40a825735 Mon Sep 17 00:00:00 2001 From: JappaWakkaP3D <31563291+JappaWakka@users.noreply.github.com> Date: Fri, 3 Dec 2021 18:37:19 +0100 Subject: [PATCH 29/57] Possible animation fixes * Confusion ducks are smaller and they should rotate slower now. * Fixed the Stat Raise animation from using the wrong destination coordinates. * Attempted to center the frozen animation more. * Added the frozen animation to the other place where it was needed. --- P3D/Battle/BattleSystemV2/Battle.vb | 158 +++++++++++++++++----------- 1 file changed, 98 insertions(+), 60 deletions(-) diff --git a/P3D/Battle/BattleSystemV2/Battle.vb b/P3D/Battle/BattleSystemV2/Battle.vb index 0f258704f..f2fa41fc3 100644 --- a/P3D/Battle/BattleSystemV2/Battle.vb +++ b/P3D/Battle/BattleSystemV2/Battle.vb @@ -1204,7 +1204,38 @@ If Core.Random.Next(0, 100) < 20 Then CureStatusProblem(own, own, BattleScreen, p.GetDisplayName() & " thawed out.", "own defrost") Else - BattleScreen.BattleQuery.Add(New PlaySoundQueryObject("Battle\Effects\Frozen", False)) + 'Frozen animation + If Core.Player.ShowBattleAnimations <> 0 Then + Dim FrozenAnimation As AnimationQueryObject = New AnimationQueryObject(Nothing, Not own) + + FrozenAnimation.AnimationPlaySound("Battle\Effects\Frozen", 0, 0) + Dim maxAmount As Integer = 8 + Dim currentAmount As Integer = 0 + While currentAmount <= maxAmount + Dim Texture As Texture2D = TextureManager.GetTexture("Textures\Battle\StatusEffect\Frozen", New Rectangle(0, 0, 32, 32), "") + Dim xPos As Single + Dim zPos As Single + If own = False Then + xPos = CSng(Random.Next(-2, 4) / 8) + zPos = CSng(Random.Next(-2, 4) / 8) + Else + xPos = CSng(Random.Next(-4, 2) / 8) + zPos = CSng(Random.Next(-4, 2) / 8) + End If + + Dim Position As New Vector3(xPos, -0.25, zPos) + Dim Scale As New Vector3(0.25F) + Dim startDelay As Double = 5.0 * Random.NextDouble() + Dim SnowflakeEntity = FrozenAnimation.SpawnEntity(pNPC.Position + Position, Texture, Scale, 1.0F, CSng(startDelay)) + + FrozenAnimation.AnimationFade(SnowflakeEntity, True, 0.02, False, 0.0F, CSng(startDelay), 0.0) + Threading.Interlocked.Increment(currentAmount) + End While + + BattleScreen.BattleQuery.Add(FrozenAnimation) + Else + BattleScreen.BattleQuery.Add(New PlaySoundQueryObject("Battle\Effects\Frozen", False)) + End If BattleScreen.BattleQuery.Add(New TextQueryObject(p.GetDisplayName() & " is frozen solid!")) Exit Sub End If @@ -1375,42 +1406,42 @@ p.RemoveVolatileStatus(Pokemon.VolatileStatus.Confusion) Else If Core.Player.ShowBattleAnimations <> 0 Then - Dim ConfusionAnimation As New AnimationQueryObject(pNPC, Not own) + Dim ConfusedAnimation As New AnimationQueryObject(pNPC, Not own) - ConfusionAnimation.AnimationPlaySound("Battle\Effects\Confused", 0, 0) - Dim DuckEntity1 As Entity = ConfusionAnimation.SpawnEntity(New Vector3(-0.25, 0.25, -0.25), TextureManager.GetTexture("Textures\Battle\StatusEffect\Confused", New Rectangle(0, 0, 16, 16), ""), New Vector3(0.5F), 1, 0, 0.5) - Dim DuckEntity2 As Entity = ConfusionAnimation.SpawnEntity(New Vector3(0.25, 0.25, 0.25), TextureManager.GetTexture("Textures\Battle\StatusEffect\Confused", New Rectangle(0, 0, 16, 16), ""), New Vector3(0.5F), 1, 0, 0.5) - Dim DuckEntity3 As Entity = ConfusionAnimation.SpawnEntity(New Vector3(0.25, 0.25, -0.25), TextureManager.GetTexture("Textures\Battle\StatusEffect\Confused", New Rectangle(0, 0, 16, 16), ""), New Vector3(0.5F), 1, 0, 0.5) + ConfusedAnimation.AnimationPlaySound("Battle\Effects\Confused", 0, 0) + Dim DuckEntity1 As Entity = ConfusedAnimation.SpawnEntity(New Vector3(-0.25, 0.25, -0.25), TextureManager.GetTexture("Textures\Battle\StatusEffect\Confused", New Rectangle(0, 0, 16, 16), ""), New Vector3(0.25F), 1, 0, 0) + Dim DuckEntity2 As Entity = ConfusedAnimation.SpawnEntity(New Vector3(0.25, 0.25, 0.25), TextureManager.GetTexture("Textures\Battle\StatusEffect\Confused", New Rectangle(0, 0, 16, 16), ""), New Vector3(0.25F), 1, 0, 0) + Dim DuckEntity3 As Entity = ConfusedAnimation.SpawnEntity(New Vector3(0.25, 0.25, -0.25), TextureManager.GetTexture("Textures\Battle\StatusEffect\Confused", New Rectangle(0, 0, 16, 16), ""), New Vector3(0.25F), 1, 0, 0) - ConfusionAnimation.AnimationChangeTexture(DuckEntity1, False, TextureManager.GetTexture("Textures\Battle\StatusEffect\Confused", New Rectangle(0, 16, 16, 16), ""), 0.5, 0.5) - ConfusionAnimation.AnimationChangeTexture(DuckEntity2, False, TextureManager.GetTexture("Textures\Battle\StatusEffect\Confused", New Rectangle(0, 16, 16, 16), ""), 0.5, 0.5) - ConfusionAnimation.AnimationChangeTexture(DuckEntity3, False, TextureManager.GetTexture("Textures\Battle\StatusEffect\Confused", New Rectangle(0, 16, 16, 16), ""), 0.5, 0.5) + ConfusedAnimation.AnimationChangeTexture(DuckEntity1, False, TextureManager.GetTexture("Textures\Battle\StatusEffect\Confused", New Rectangle(0, 16, 16, 16), ""), 0.75F, 0) + ConfusedAnimation.AnimationChangeTexture(DuckEntity2, False, TextureManager.GetTexture("Textures\Battle\StatusEffect\Confused", New Rectangle(0, 16, 16, 16), ""), 0.75F, 0) + ConfusedAnimation.AnimationChangeTexture(DuckEntity3, False, TextureManager.GetTexture("Textures\Battle\StatusEffect\Confused", New Rectangle(0, 16, 16, 16), ""), 0.75F, 0) - ConfusionAnimation.AnimationChangeTexture(DuckEntity1, False, TextureManager.GetTexture("Textures\Battle\StatusEffect\Confused", New Rectangle(0, 32, 16, 16), ""), 1.5F, 0.5) - ConfusionAnimation.AnimationChangeTexture(DuckEntity2, False, TextureManager.GetTexture("Textures\Battle\StatusEffect\Confused", New Rectangle(0, 32, 16, 16), ""), 1.5F, 0.5) - ConfusionAnimation.AnimationChangeTexture(DuckEntity3, False, TextureManager.GetTexture("Textures\Battle\StatusEffect\Confused", New Rectangle(0, 32, 16, 16), ""), 1.5F, 0.5) + ConfusedAnimation.AnimationChangeTexture(DuckEntity1, False, TextureManager.GetTexture("Textures\Battle\StatusEffect\Confused", New Rectangle(0, 32, 16, 16), ""), 1.5F, 0) + ConfusedAnimation.AnimationChangeTexture(DuckEntity2, False, TextureManager.GetTexture("Textures\Battle\StatusEffect\Confused", New Rectangle(0, 32, 16, 16), ""), 1.5F, 0) + ConfusedAnimation.AnimationChangeTexture(DuckEntity3, False, TextureManager.GetTexture("Textures\Battle\StatusEffect\Confused", New Rectangle(0, 32, 16, 16), ""), 1.5F, 0) - ConfusionAnimation.AnimationChangeTexture(DuckEntity1, False, TextureManager.GetTexture("Textures\Battle\StatusEffect\Confused", New Rectangle(0, 48, 16, 16), ""), 1.5F, 0.5) - ConfusionAnimation.AnimationChangeTexture(DuckEntity2, False, TextureManager.GetTexture("Textures\Battle\StatusEffect\Confused", New Rectangle(0, 48, 16, 16), ""), 1.5F, 0.5) - ConfusionAnimation.AnimationChangeTexture(DuckEntity3, False, TextureManager.GetTexture("Textures\Battle\StatusEffect\Confused", New Rectangle(0, 48, 16, 16), ""), 1.5F, 0.5) + ConfusedAnimation.AnimationChangeTexture(DuckEntity1, False, TextureManager.GetTexture("Textures\Battle\StatusEffect\Confused", New Rectangle(0, 48, 16, 16), ""), 2.25F, 0) + ConfusedAnimation.AnimationChangeTexture(DuckEntity2, False, TextureManager.GetTexture("Textures\Battle\StatusEffect\Confused", New Rectangle(0, 48, 16, 16), ""), 2.25F, 0) + ConfusedAnimation.AnimationChangeTexture(DuckEntity3, False, TextureManager.GetTexture("Textures\Battle\StatusEffect\Confused", New Rectangle(0, 48, 16, 16), ""), 2.25F, 0) - ConfusionAnimation.AnimationChangeTexture(DuckEntity1, False, TextureManager.GetTexture("Textures\Battle\StatusEffect\Confused", New Rectangle(0, 0, 16, 16), ""), 2.0F, 0.5) - ConfusionAnimation.AnimationChangeTexture(DuckEntity2, False, TextureManager.GetTexture("Textures\Battle\StatusEffect\Confused", New Rectangle(0, 0, 16, 16), ""), 2.0F, 0.5) - ConfusionAnimation.AnimationChangeTexture(DuckEntity3, False, TextureManager.GetTexture("Textures\Battle\StatusEffect\Confused", New Rectangle(0, 0, 16, 16), ""), 2.0F, 0.5) + ConfusedAnimation.AnimationChangeTexture(DuckEntity1, False, TextureManager.GetTexture("Textures\Battle\StatusEffect\Confused", New Rectangle(0, 0, 16, 16), ""), 3.0F, 0) + ConfusedAnimation.AnimationChangeTexture(DuckEntity2, False, TextureManager.GetTexture("Textures\Battle\StatusEffect\Confused", New Rectangle(0, 0, 16, 16), ""), 3.0F, 0) + ConfusedAnimation.AnimationChangeTexture(DuckEntity3, False, TextureManager.GetTexture("Textures\Battle\StatusEffect\Confused", New Rectangle(0, 0, 16, 16), ""), 3.0F, 0) - ConfusionAnimation.AnimationChangeTexture(DuckEntity1, False, TextureManager.GetTexture("Textures\Battle\StatusEffect\Confused", New Rectangle(0, 16, 16, 16), ""), 2.5F, 0.5) - ConfusionAnimation.AnimationChangeTexture(DuckEntity2, False, TextureManager.GetTexture("Textures\Battle\StatusEffect\Confused", New Rectangle(0, 16, 16, 16), ""), 2.5F, 0.5) - ConfusionAnimation.AnimationChangeTexture(DuckEntity3, False, TextureManager.GetTexture("Textures\Battle\StatusEffect\Confused", New Rectangle(0, 16, 16, 16), ""), 2.5F, 0.5) + ConfusedAnimation.AnimationChangeTexture(DuckEntity1, False, TextureManager.GetTexture("Textures\Battle\StatusEffect\Confused", New Rectangle(0, 16, 16, 16), ""), 3.75F, 0) + ConfusedAnimation.AnimationChangeTexture(DuckEntity2, False, TextureManager.GetTexture("Textures\Battle\StatusEffect\Confused", New Rectangle(0, 16, 16, 16), ""), 3.75F, 0) + ConfusedAnimation.AnimationChangeTexture(DuckEntity3, False, TextureManager.GetTexture("Textures\Battle\StatusEffect\Confused", New Rectangle(0, 16, 16, 16), ""), 3.75F, 0) - ConfusionAnimation.AnimationChangeTexture(DuckEntity1, False, TextureManager.GetTexture("Textures\Battle\StatusEffect\Confused", New Rectangle(0, 32, 16, 16), ""), 3, 0.5) - ConfusionAnimation.AnimationChangeTexture(DuckEntity2, False, TextureManager.GetTexture("Textures\Battle\StatusEffect\Confused", New Rectangle(0, 32, 16, 16), ""), 3, 0.5) - ConfusionAnimation.AnimationChangeTexture(DuckEntity3, False, TextureManager.GetTexture("Textures\Battle\StatusEffect\Confused", New Rectangle(0, 32, 16, 16), ""), 3, 0.5) + ConfusedAnimation.AnimationChangeTexture(DuckEntity1, False, TextureManager.GetTexture("Textures\Battle\StatusEffect\Confused", New Rectangle(0, 32, 16, 16), ""), 4.5F, 0) + ConfusedAnimation.AnimationChangeTexture(DuckEntity2, False, TextureManager.GetTexture("Textures\Battle\StatusEffect\Confused", New Rectangle(0, 32, 16, 16), ""), 4.5F, 0) + ConfusedAnimation.AnimationChangeTexture(DuckEntity3, False, TextureManager.GetTexture("Textures\Battle\StatusEffect\Confused", New Rectangle(0, 32, 16, 16), ""), 4.5F, 0) - ConfusionAnimation.AnimationChangeTexture(DuckEntity1, False, TextureManager.GetTexture("Textures\Battle\StatusEffect\Confused", New Rectangle(0, 48, 16, 16), ""), 3.5F, 0.5) - ConfusionAnimation.AnimationChangeTexture(DuckEntity2, False, TextureManager.GetTexture("Textures\Battle\StatusEffect\Confused", New Rectangle(0, 48, 16, 16), ""), 3.5F, 0.5) - ConfusionAnimation.AnimationChangeTexture(DuckEntity3, False, TextureManager.GetTexture("Textures\Battle\StatusEffect\Confused", New Rectangle(0, 48, 16, 16), ""), 3.5F, 0.5) + ConfusedAnimation.AnimationChangeTexture(DuckEntity1, True, TextureManager.GetTexture("Textures\Battle\StatusEffect\Confused", New Rectangle(0, 48, 16, 16), ""), 5.25F, 1) + ConfusedAnimation.AnimationChangeTexture(DuckEntity2, True, TextureManager.GetTexture("Textures\Battle\StatusEffect\Confused", New Rectangle(0, 48, 16, 16), ""), 5.25F, 1) + ConfusedAnimation.AnimationChangeTexture(DuckEntity3, True, TextureManager.GetTexture("Textures\Battle\StatusEffect\Confused", New Rectangle(0, 48, 16, 16), ""), 5.25F, 1) - BattleScreen.BattleQuery.Add(ConfusionAnimation) + BattleScreen.BattleQuery.Add(ConfusedAnimation) Else BattleScreen.BattleQuery.Add(New PlaySoundQueryObject("Battle\Effects\Confused", False)) End If @@ -2929,20 +2960,27 @@ ChangeCameraAngle(1, own, BattleScreen) 'Frozen animation If Core.Player.ShowBattleAnimations <> 0 Then - Dim FrozenAnimation As AnimationQueryObject = New AnimationQueryObject(pNPC, Not own) + Dim FrozenAnimation As AnimationQueryObject = New AnimationQueryObject(Nothing, Not own) FrozenAnimation.AnimationPlaySound("Battle\Effects\Frozen", 0, 0) Dim maxAmount As Integer = 8 Dim currentAmount As Integer = 0 While currentAmount <= maxAmount Dim Texture As Texture2D = TextureManager.GetTexture("Textures\Battle\StatusEffect\Frozen", New Rectangle(0, 0, 32, 32), "") - Dim xPos = CSng(Random.Next(-4, 4) / 8) - Dim zPos = CSng(Random.Next(-4, 4) / 8) + Dim xPos As Single + Dim zPos As Single + If own = False Then + xPos = CSng(Random.Next(-2, 4) / 8) + zPos = CSng(Random.Next(-2, 4) / 8) + Else + xPos = CSng(Random.Next(-4, 2) / 8) + zPos = CSng(Random.Next(-4, 2) / 8) + End If Dim Position As New Vector3(xPos, -0.25, zPos) Dim Scale As New Vector3(0.25F) Dim startDelay As Double = 5.0 * Random.NextDouble() - Dim SnowflakeEntity = FrozenAnimation.SpawnEntity(Position, Texture, Scale, 1.0F, CSng(startDelay)) + Dim SnowflakeEntity = FrozenAnimation.SpawnEntity(pNPC.Position + Position, Texture, Scale, 1.0F, CSng(startDelay)) FrozenAnimation.AnimationFade(SnowflakeEntity, True, 0.02, False, 0.0F, CSng(startDelay), 0.0) Threading.Interlocked.Increment(currentAmount) @@ -3449,42 +3487,42 @@ Else 'Works! If Core.Player.ShowBattleAnimations <> 0 Then - Dim ConfusionAnimation As New AnimationQueryObject(pNPC, Not own) + Dim ConfusedAnimation As New AnimationQueryObject(pNPC, Not own) - ConfusionAnimation.AnimationPlaySound("Battle\Effects\Confused", 0, 0) - Dim DuckEntity1 As Entity = ConfusionAnimation.SpawnEntity(New Vector3(-0.25, 0.25, -0.25), TextureManager.GetTexture("Textures\Battle\StatusEffect\Confused", New Rectangle(0, 0, 16, 16), ""), New Vector3(0.5F), 1, 0, 0.5) - Dim DuckEntity2 As Entity = ConfusionAnimation.SpawnEntity(New Vector3(0.25, 0.25, 0.25), TextureManager.GetTexture("Textures\Battle\StatusEffect\Confused", New Rectangle(0, 0, 16, 16), ""), New Vector3(0.5F), 1, 0, 0.5) - Dim DuckEntity3 As Entity = ConfusionAnimation.SpawnEntity(New Vector3(0.25, 0.25, -0.25), TextureManager.GetTexture("Textures\Battle\StatusEffect\Confused", New Rectangle(0, 0, 16, 16), ""), New Vector3(0.5F), 1, 0, 0.5) + ConfusedAnimation.AnimationPlaySound("Battle\Effects\Confused", 0, 0) + Dim DuckEntity1 As Entity = ConfusedAnimation.SpawnEntity(New Vector3(-0.25, 0.25, -0.25), TextureManager.GetTexture("Textures\Battle\StatusEffect\Confused", New Rectangle(0, 0, 16, 16), ""), New Vector3(0.25F), 1, 0, 0) + Dim DuckEntity2 As Entity = ConfusedAnimation.SpawnEntity(New Vector3(0.25, 0.25, 0.25), TextureManager.GetTexture("Textures\Battle\StatusEffect\Confused", New Rectangle(0, 0, 16, 16), ""), New Vector3(0.25F), 1, 0, 0) + Dim DuckEntity3 As Entity = ConfusedAnimation.SpawnEntity(New Vector3(0.25, 0.25, -0.25), TextureManager.GetTexture("Textures\Battle\StatusEffect\Confused", New Rectangle(0, 0, 16, 16), ""), New Vector3(0.25F), 1, 0, 0) - ConfusionAnimation.AnimationChangeTexture(DuckEntity1, False, TextureManager.GetTexture("Textures\Battle\StatusEffect\Confused", New Rectangle(0, 16, 16, 16), ""), 0.5, 0.5) - ConfusionAnimation.AnimationChangeTexture(DuckEntity2, False, TextureManager.GetTexture("Textures\Battle\StatusEffect\Confused", New Rectangle(0, 16, 16, 16), ""), 0.5, 0.5) - ConfusionAnimation.AnimationChangeTexture(DuckEntity3, False, TextureManager.GetTexture("Textures\Battle\StatusEffect\Confused", New Rectangle(0, 16, 16, 16), ""), 0.5, 0.5) + ConfusedAnimation.AnimationChangeTexture(DuckEntity1, False, TextureManager.GetTexture("Textures\Battle\StatusEffect\Confused", New Rectangle(0, 16, 16, 16), ""), 0.75F, 0) + ConfusedAnimation.AnimationChangeTexture(DuckEntity2, False, TextureManager.GetTexture("Textures\Battle\StatusEffect\Confused", New Rectangle(0, 16, 16, 16), ""), 0.75F, 0) + ConfusedAnimation.AnimationChangeTexture(DuckEntity3, False, TextureManager.GetTexture("Textures\Battle\StatusEffect\Confused", New Rectangle(0, 16, 16, 16), ""), 0.75F, 0) - ConfusionAnimation.AnimationChangeTexture(DuckEntity1, False, TextureManager.GetTexture("Textures\Battle\StatusEffect\Confused", New Rectangle(0, 32, 16, 16), ""), 1.5F, 0.5) - ConfusionAnimation.AnimationChangeTexture(DuckEntity2, False, TextureManager.GetTexture("Textures\Battle\StatusEffect\Confused", New Rectangle(0, 32, 16, 16), ""), 1.5F, 0.5) - ConfusionAnimation.AnimationChangeTexture(DuckEntity3, False, TextureManager.GetTexture("Textures\Battle\StatusEffect\Confused", New Rectangle(0, 32, 16, 16), ""), 1.5F, 0.5) + ConfusedAnimation.AnimationChangeTexture(DuckEntity1, False, TextureManager.GetTexture("Textures\Battle\StatusEffect\Confused", New Rectangle(0, 32, 16, 16), ""), 1.5F, 0) + ConfusedAnimation.AnimationChangeTexture(DuckEntity2, False, TextureManager.GetTexture("Textures\Battle\StatusEffect\Confused", New Rectangle(0, 32, 16, 16), ""), 1.5F, 0) + ConfusedAnimation.AnimationChangeTexture(DuckEntity3, False, TextureManager.GetTexture("Textures\Battle\StatusEffect\Confused", New Rectangle(0, 32, 16, 16), ""), 1.5F, 0) - ConfusionAnimation.AnimationChangeTexture(DuckEntity1, False, TextureManager.GetTexture("Textures\Battle\StatusEffect\Confused", New Rectangle(0, 48, 16, 16), ""), 1.5F, 0.5) - ConfusionAnimation.AnimationChangeTexture(DuckEntity2, False, TextureManager.GetTexture("Textures\Battle\StatusEffect\Confused", New Rectangle(0, 48, 16, 16), ""), 1.5F, 0.5) - ConfusionAnimation.AnimationChangeTexture(DuckEntity3, False, TextureManager.GetTexture("Textures\Battle\StatusEffect\Confused", New Rectangle(0, 48, 16, 16), ""), 1.5F, 0.5) + ConfusedAnimation.AnimationChangeTexture(DuckEntity1, False, TextureManager.GetTexture("Textures\Battle\StatusEffect\Confused", New Rectangle(0, 48, 16, 16), ""), 2.25F, 0) + ConfusedAnimation.AnimationChangeTexture(DuckEntity2, False, TextureManager.GetTexture("Textures\Battle\StatusEffect\Confused", New Rectangle(0, 48, 16, 16), ""), 2.25F, 0) + ConfusedAnimation.AnimationChangeTexture(DuckEntity3, False, TextureManager.GetTexture("Textures\Battle\StatusEffect\Confused", New Rectangle(0, 48, 16, 16), ""), 2.25F, 0) - ConfusionAnimation.AnimationChangeTexture(DuckEntity1, False, TextureManager.GetTexture("Textures\Battle\StatusEffect\Confused", New Rectangle(0, 0, 16, 16), ""), 2.0F, 0.5) - ConfusionAnimation.AnimationChangeTexture(DuckEntity2, False, TextureManager.GetTexture("Textures\Battle\StatusEffect\Confused", New Rectangle(0, 0, 16, 16), ""), 2.0F, 0.5) - ConfusionAnimation.AnimationChangeTexture(DuckEntity3, False, TextureManager.GetTexture("Textures\Battle\StatusEffect\Confused", New Rectangle(0, 0, 16, 16), ""), 2.0F, 0.5) + ConfusedAnimation.AnimationChangeTexture(DuckEntity1, False, TextureManager.GetTexture("Textures\Battle\StatusEffect\Confused", New Rectangle(0, 0, 16, 16), ""), 3.0F, 0) + ConfusedAnimation.AnimationChangeTexture(DuckEntity2, False, TextureManager.GetTexture("Textures\Battle\StatusEffect\Confused", New Rectangle(0, 0, 16, 16), ""), 3.0F, 0) + ConfusedAnimation.AnimationChangeTexture(DuckEntity3, False, TextureManager.GetTexture("Textures\Battle\StatusEffect\Confused", New Rectangle(0, 0, 16, 16), ""), 3.0F, 0) - ConfusionAnimation.AnimationChangeTexture(DuckEntity1, False, TextureManager.GetTexture("Textures\Battle\StatusEffect\Confused", New Rectangle(0, 16, 16, 16), ""), 2.5F, 0.5) - ConfusionAnimation.AnimationChangeTexture(DuckEntity2, False, TextureManager.GetTexture("Textures\Battle\StatusEffect\Confused", New Rectangle(0, 16, 16, 16), ""), 2.5F, 0.5) - ConfusionAnimation.AnimationChangeTexture(DuckEntity3, False, TextureManager.GetTexture("Textures\Battle\StatusEffect\Confused", New Rectangle(0, 16, 16, 16), ""), 2.5F, 0.5) + ConfusedAnimation.AnimationChangeTexture(DuckEntity1, False, TextureManager.GetTexture("Textures\Battle\StatusEffect\Confused", New Rectangle(0, 16, 16, 16), ""), 3.75F, 0) + ConfusedAnimation.AnimationChangeTexture(DuckEntity2, False, TextureManager.GetTexture("Textures\Battle\StatusEffect\Confused", New Rectangle(0, 16, 16, 16), ""), 3.75F, 0) + ConfusedAnimation.AnimationChangeTexture(DuckEntity3, False, TextureManager.GetTexture("Textures\Battle\StatusEffect\Confused", New Rectangle(0, 16, 16, 16), ""), 3.75F, 0) - ConfusionAnimation.AnimationChangeTexture(DuckEntity1, False, TextureManager.GetTexture("Textures\Battle\StatusEffect\Confused", New Rectangle(0, 32, 16, 16), ""), 3, 0.5) - ConfusionAnimation.AnimationChangeTexture(DuckEntity2, False, TextureManager.GetTexture("Textures\Battle\StatusEffect\Confused", New Rectangle(0, 32, 16, 16), ""), 3, 0.5) - ConfusionAnimation.AnimationChangeTexture(DuckEntity3, False, TextureManager.GetTexture("Textures\Battle\StatusEffect\Confused", New Rectangle(0, 32, 16, 16), ""), 3, 0.5) + ConfusedAnimation.AnimationChangeTexture(DuckEntity1, False, TextureManager.GetTexture("Textures\Battle\StatusEffect\Confused", New Rectangle(0, 32, 16, 16), ""), 4.5F, 0) + ConfusedAnimation.AnimationChangeTexture(DuckEntity2, False, TextureManager.GetTexture("Textures\Battle\StatusEffect\Confused", New Rectangle(0, 32, 16, 16), ""), 4.5F, 0) + ConfusedAnimation.AnimationChangeTexture(DuckEntity3, False, TextureManager.GetTexture("Textures\Battle\StatusEffect\Confused", New Rectangle(0, 32, 16, 16), ""), 4.5F, 0) - ConfusionAnimation.AnimationChangeTexture(DuckEntity1, False, TextureManager.GetTexture("Textures\Battle\StatusEffect\Confused", New Rectangle(0, 48, 16, 16), ""), 3.5F, 0.5) - ConfusionAnimation.AnimationChangeTexture(DuckEntity2, False, TextureManager.GetTexture("Textures\Battle\StatusEffect\Confused", New Rectangle(0, 48, 16, 16), ""), 3.5F, 0.5) - ConfusionAnimation.AnimationChangeTexture(DuckEntity3, False, TextureManager.GetTexture("Textures\Battle\StatusEffect\Confused", New Rectangle(0, 48, 16, 16), ""), 3.5F, 0.5) + ConfusedAnimation.AnimationChangeTexture(DuckEntity1, True, TextureManager.GetTexture("Textures\Battle\StatusEffect\Confused", New Rectangle(0, 48, 16, 16), ""), 5.25F, 1) + ConfusedAnimation.AnimationChangeTexture(DuckEntity2, True, TextureManager.GetTexture("Textures\Battle\StatusEffect\Confused", New Rectangle(0, 48, 16, 16), ""), 5.25F, 1) + ConfusedAnimation.AnimationChangeTexture(DuckEntity3, True, TextureManager.GetTexture("Textures\Battle\StatusEffect\Confused", New Rectangle(0, 48, 16, 16), ""), 5.25F, 1) - BattleScreen.BattleQuery.Add(ConfusionAnimation) + BattleScreen.BattleQuery.Add(ConfusedAnimation) Else BattleScreen.BattleQuery.Add(New PlaySoundQueryObject("Battle\Effects\Confused", False)) End If @@ -3644,7 +3682,7 @@ Dim zPos = CSng((Random.NextDouble() - 0.5) * 1.2) Dim Position As New Vector3(xPos, -0.4, zPos) - Dim Destination As New Vector3(xPos, 1.2, zPos) + Dim Destination As New Vector3(0, 1.2, 0) Dim Scale As New Vector3(0.2F) Dim startDelay As Double = 5.0 * Random.NextDouble() Dim StatEntity As Entity = StatAnimation.SpawnEntity(pNPC.Position + Position, Texture, Scale, 1.0F, CSng(startDelay)) From bf887b0e3a1ef2e7d70c489ec7dd60fb3e0bc90d Mon Sep 17 00:00:00 2001 From: JappaWakkaP3D <31563291+JappaWakka@users.noreply.github.com> Date: Tue, 14 Dec 2021 22:11:11 +0100 Subject: [PATCH 30/57] =?UTF-8?q?Fixed=20Bug:=20When=20the=20lead=20Pok?= =?UTF-8?q?=C3=A9mon=20faints=20and=20you=20switch=20to=20a=20different=20?= =?UTF-8?q?Pok=C3=A9mon,=20when=20the=20battle=20ends,=20your=20current=20?= =?UTF-8?q?Pok=C3=A9mon=20disappears?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- P3D/Battle/BattleSystemV2/Battle.vb | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/P3D/Battle/BattleSystemV2/Battle.vb b/P3D/Battle/BattleSystemV2/Battle.vb index f2fa41fc3..9a19a130b 100644 --- a/P3D/Battle/BattleSystemV2/Battle.vb +++ b/P3D/Battle/BattleSystemV2/Battle.vb @@ -2674,7 +2674,7 @@ If BattleScreen.IsTrainerBattle = False AndAlso Core.Player.ShowBattleAnimations <> 0 Then If own = False Then - Dim FaintAnimation As AnimationQueryObject = New AnimationQueryObject(BattleScreen.OwnPokemonNPC, True, BattleScreen.OppPokemonModel) + Dim FaintAnimation As AnimationQueryObject = New AnimationQueryObject(BattleScreen.OppPokemonNPC, True, BattleScreen.OppPokemonModel) FaintAnimation.AnimationPlaySound(CStr(BattleScreen.OppPokemon.Number), 0, 2, False, True) FaintAnimation.AnimationMove(Nothing, False, 0, -1, 0, 0.05, False, False, 2, 0,,, 3) BattleScreen.BattleQuery.Add(FaintAnimation) @@ -7121,17 +7121,17 @@ Loop While SmokeReturned <= 38 End If + ' Pokemon disappears + BallReturn.AnimationFade(Nothing, False, 1, False, 0, 1, 0) If Core.Player.ShowBattleAnimations <> 0 Then - ' Pokemon disappears - BallReturn.AnimationFade(Nothing, False, 1, False, 0, 1, 0) BallReturn.AnimationMove(Nothing, False, 0, 0.5, 0, 0.5, False, False, 2, 0,,, 3) ' Ball returns BallReturn.AnimationPlaySound("Battle\Pokeball\Throw", 1, 0) Dim BallReturnEntity As Entity = BallReturn.SpawnEntity(Nothing, BattleScreen.OwnPokemon.CatchBall.Texture, New Vector3(0.3F), 1.0F) BallReturn.AnimationMove(BallReturnEntity, True, -2, 0, 0, 0.1, False, True, 1, 0,, 0.3) - BattleScreen.AddToQuery(InsertIndex, BallReturn) End If + BattleScreen.AddToQuery(InsertIndex, BallReturn) Dim index As Integer = NewPokemonIndex If index <= -1 Then From 6dcb11c775dd4b7b6707ffca7457515ae43127ac Mon Sep 17 00:00:00 2001 From: JappaWakkaP3D <31563291+JappaWakka@users.noreply.github.com> Date: Mon, 20 Dec 2021 20:14:26 +0100 Subject: [PATCH 31/57] Mega Evolution Animation - Attempt 1 --- P3D/Battle/BattleSystemV2/Battle.vb | 40 +++++++++++++++++- .../Sounds/Battle/Effects/MegaEvolution.wav | Bin 0 -> 514532 bytes .../Battle/MegaEvolution/Mega_Phase1.png | Bin 0 -> 258 bytes .../Battle/MegaEvolution/Mega_Phase2.png | Bin 0 -> 4157 bytes P3D/P3D.vbproj | 9 ++++ 5 files changed, 48 insertions(+), 1 deletion(-) create mode 100644 P3D/Content/Sounds/Battle/Effects/MegaEvolution.wav create mode 100644 P3D/Content/Textures/Battle/MegaEvolution/Mega_Phase1.png create mode 100644 P3D/Content/Textures/Battle/MegaEvolution/Mega_Phase2.png diff --git a/P3D/Battle/BattleSystemV2/Battle.vb b/P3D/Battle/BattleSystemV2/Battle.vb index 9a19a130b..3800a3759 100644 --- a/P3D/Battle/BattleSystemV2/Battle.vb +++ b/P3D/Battle/BattleSystemV2/Battle.vb @@ -486,8 +486,10 @@ Sub DoMegaEvolution(ByVal BattleScreen As BattleScreen, ByVal own As Boolean) Dim p As Pokemon = BattleScreen.OwnPokemon + Dim pNPC As NPC = BattleScreen.OwnPokemonNPC If Not own Then p = BattleScreen.OppPokemon + pNPC = BattleScreen.OppPokemonNPC End If 'Transform a Pokemon into it's Mega Evolution Dim _base As String = p.GetDisplayName() @@ -504,7 +506,43 @@ p.CalculateStats() p.LoadAltAbility() Me.ChangeCameraAngle(1, own, BattleScreen) - BattleScreen.BattleQuery.Add(New ToggleEntityQueryObject(own, ToggleEntityQueryObject.BattleEntities.OwnPokemon, PokemonForms.GetOverworldSpriteName(p), 0, 1, -1, -1)) + '***Mega Evolution Animation*** + If Core.Player.ShowBattleAnimations <> 0 Then + Dim MegaAnimation As AnimationQueryObject = New AnimationQueryObject(Nothing, Not own) + MegaAnimation.AnimationPlaySound("Battle\Effects\MegaEvolution", 0, 0) + + Dim maxAmount As Integer = 16 + Dim currentAmount As Integer = 0 + While currentAmount <= maxAmount + Dim Texture As Texture2D = TextureManager.GetTexture("Textures\Battle\MegaEvolution\Mega_Phase1") + Dim xPos = CSng((Random.NextDouble() - 0.5) * 1.2) + Dim zPos = CSng((Random.NextDouble() - 0.5) * 1.2) + + Dim Position As New Vector3(xPos, 0.8, zPos) + + Dim Scale As New Vector3(0.5F) + Dim startDelay As Double = 5.0 * Random.NextDouble() + Dim Phase1Entity As Entity = MegaAnimation.SpawnEntity(pNPC.Position + Position, Texture, Scale, 1.0F, CSng(startDelay)) + + Dim Destination As New Vector3(CSng(pNPC.Position.X - Phase1Entity.Position.X), -0.8, CSng(pNPC.Position.Z - Phase1Entity.Position.Z)) + MegaAnimation.AnimationMove(Phase1Entity, True, Destination.X, Destination.Y, Destination.Z, 0.05F, False, True, CSng(startDelay), 0.0F) + Threading.Interlocked.Increment(currentAmount) + End While + + Dim Phase2Entity As Entity = MegaAnimation.SpawnEntity(pNPC.Position, TextureManager.GetTexture("Textures\Battle\MegaEvolution\Mega_Phase2"), New Vector3(0.0F), 1.0F, 2.0F, 0.0F) + MegaAnimation.AnimationRotate(Phase2Entity, False, 0, 0, 0.25F, 0, 0, 10.0F, 2, 0F, False, False, True, False) + MegaAnimation.AnimationScale(Phase2Entity, False, True, 1.0F, 1.0F, 1.0F, 0.05F, 2.0F, 0.0F) + BattleScreen.BattleQuery.Add(MegaAnimation) + If pNPC Is BattleScreen.OwnPokemonNPC Then + BattleScreen.OwnPokemonNPC.SetupSprite(PokemonForms.GetOverworldSpriteName(p), "", False) + Else + BattleScreen.OppPokemonNPC.SetupSprite(PokemonForms.GetOverworldSpriteName(p), "", False) + End If + Else + BattleScreen.BattleQuery.Add(New PlaySoundQueryObject("Battle\Effects\MegaEvolution", False)) + BattleScreen.BattleQuery.Add(New ToggleEntityQueryObject(own, ToggleEntityQueryObject.BattleEntities.OwnPokemon, PokemonForms.GetOverworldSpriteName(p), 0, 1, -1, -1)) + End If + BattleScreen.BattleQuery.Add(New TextQueryObject(_base & " has Mega Evolved!")) TriggerAbilityEffect(BattleScreen, own) End If diff --git a/P3D/Content/Sounds/Battle/Effects/MegaEvolution.wav b/P3D/Content/Sounds/Battle/Effects/MegaEvolution.wav new file mode 100644 index 0000000000000000000000000000000000000000..83da982da44c2d5019d4b49338e280797c832559 GIT binary patch literal 514532 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'&w@f8n=7K~jSjfvZi)D*kKHX^oRcvIG*mE3j1 z_u#)XV+Y>5ksD!c1YV=?W*>QD_%6^Ig*Oft{D$x*=(eNVW5{9`%hrr-pzeilL2ho; z)(qdqU^X`VC2j|vP0%*w*iPQ<(0^yq?gV8Ex?LO+**v@j=SFz9z_taQaLFN&!nb9# zq}okJ%x3CrNj+OKHewUprbM?iFq)HlYsQ9*&0y~UNAho{&SvCj8Qu!M5qTRPEyCM^ zw;pK+wKg^4)`Qs=pC;jL!rKwil!!J4a!Y(SWwb_a5#Bm{Gx4p6mzp+{uNA9}*f)`P zGngCDwJ|cbBffd~1~Rt6w^ew1aMt1925M`dZ8GXzZNv!TI(D@QNl?UVBfK@d9sX<4 zZo=M*NXfP?V=X@IK>c7_k4B_*8EfDj!q;POjcp?_lC52MC&Shj-FkHG&`G{_A2Hfv zUz4#aqeFOSP}*>GBIlnO?ZZ2=mU9O@I~dXj{52UX$+mk@a|PZTh;M^W*YMR? zR~uEX0(CXCCZiMae;T|acEOgKRud^mYl!WH{e$;PbZfAQt_wAFhIi!L&8SamU2WiX z4)0F34&lp@{{(3jah>p5ov|!qDF|!e%g_q0V06WQ1)7z}D~!x5GL|ECBTH9k`Tumw z4Sjd?;w^cX8yOa7bP4Yn{ta@M@E+)vW%K}ZiGe9OmuGZG?go8>y$gI5I;ngmysM%A z29NGodw{(JS`J3HaEV=-v6$ln<~IhyhqLGwXDl@EC0e|C8TOv!USvc`KEe9~+fvTo zg!c|#giRvnbM&L`?%}-*|6bS@;?o;0>pzUBCDidvc)##I;q%EQxIKvx^bfv$u=IlZ z7_lNPAWr;+i!6R({|}=--t)j&NCkbu`(o)E-k)>E zE+n-qgwJ6mbq#&2XnrGF$Z6<3)%qu=i)DQ2p@<% zAbc=~=;s;scCR}@ZC=QbSe(Y1fw zl69BY9bUJ<+6noCcRPc3Af}BGwGqsJSo)9J*Qm1YVLDp<@QxNiYQED`Jj%o?BjW6<%0+I(j<> zLeDKBOFC5DUDF-1=$8JDZyo8DXJ|4k)!bFw&+#4L=;sJoo@49hc!Av8(bpjux+Q2C z=osKQ3a;dv56w~LDv{K2*mH!ck9dAZp0CVPq&AViqK-03S>>?jpr^D_o|RNqRw>8% zAoj9Y=Rk*8TXd5?hv-9|{j8((L&T62-5jMfen&i_Ic&s~1L2_O0MZe3AN+FaIrZ7f zEG4I&i>OGX|0ojqQ~h^krg8v`a^x4J{j4RI=tMeT;6&*asdKM^eZaHtqh9R$vG0S1 zI)*rEx$C%xIffe7G{`mOK`pLM(2`<#Vma?P>p0_(^GU~3bl>6iln3Nfv8HmZ#YbZ6 zfN|FFJMJj2R8#hQc7T4^v)8ke~oK&BA8a) zrvHLpj2^?vuK%peAkQ98Rq_jWps%P@RrXNZP9u7k#|Bnqbi2_=zUr)bSWd4-l~ut0 zpsND516>vBwCg`9KPl6dY054z#AgOMrz=yHhj>FhbK;PqW%yAsAk=Tx+J?5aPkL3vK?VfF(X=HFv!w#y9 zg>Qpz_iUx!no1mUZaoiI(5_FTnkmX8MP$)Wq0Y}(O{TtSSYq+~4A0zpJla^!dGw8* z%^oM(jo{Syp+JL8<*mdyw=r^Eq^7ESqJe1|PJYYNCNN?!eQR(bVCt6%^3F(7#tkDur0(WBnf=jcz4%N|h~?7F?00$|}za=ufoEJ>M&%pzooPieUWd zS?O7Z^@Gn!JeGS}C@qzO#E)QKg+B5Y;4}wMki@4T8C#-RYQ!!hUtzs9wKXGlIf%=_ zZGlu6eRKR;K@wj?FG5|-@LAy*sth$M`3^3bhbY64he5-YC7z|8HpI+u{Nm{8?&03# z*a&TQ+_YS`Y;bIHY~fhXG1Kw0qr1DO`&axnBd>F8Fl<*X*DT_H!y>C2L|wIf2N z>{(3S?;y$kog#8kU8opG5nU|BSTFJ{^n6DhLzF>ihACoer?jK~V){_!Tjb*U5V*t- zf)B&92)g!48|4pl?cj^xg7q!-h2RMZ?jU6_-b0iHo&}zcN=H0fBMn76fD9d#l6nb{ zih`6xT0X{;^!P zT(b0W_jM0&_jmV(uXC(+ta7Y@{&e(n_jAj7onxhAxnnI?@K3IJU-w}5Aopy?EXO>@ ze8)x0-cTO{Gnbm?dpa3)c4psmJngY`GvqE*)QMW=q5a)cMlY++VO5&C z2e8lIJ+sl3)91oFE8Ug3o|&F5@Y(pz=jh0~JG+`q4vFgmZa=6GR35C-#Fk@!g7JZu z1?z)fHv?xj$bu%BX8ms^)d|WhbY1b2{J)S}s{9q|tMpfTE8k%0smw&~!Fm?i8M@&vz!CVy~=M(kpU& z4OP`E>s^WJORVf+Hb`Z$_C?p3L+q6x!RZZhFMNIhM{;z>{05k{)6*T%W;cn#P&TA@~2UJ=Q!p%1}OtU?7*L#!OAqxM9*}tPhT?E z)NANdJk$7p*;%QsS2xzR;C=Z2C|v$t2-U!^x?W9}Ke=5%k{V}trg$cURP&==?6n}l zsR@^uPUIAffn=U)`2YX2*o7v0rt)XD9j_Kc@a?ZiO_Mwm&`$OA|EL|v-(5i!-@$lI z1aB%n<2lzuKiWOcJ>LDJ`!`QDaVd&-6=R1zJyz-1k*Ou2= zd5s(I8OLkh5T&kOU$3Xv;q`4OHIDO)<$5>JYwLCOhPp_@jn}I0lo3R=0HXok^~up1 zoYu(0z-Ym>XvZu558$^$l2^#a_{clK1Tb3SH_kJLmDDsCjHdcn&uHZF$V2fSt~A2G z9y#0co+5i_2YOvJlA{qB$Ga!FXF7i6-Ez8PFV|?Id!qXn-VY|aC%gApc3F0EOkur) z)i%dA-VHW8cB9+OJA`m~7un(1YP_5LKrM~+Ce+uAI-BS}ct)}3rtEhV?-!$#=DJkV zR3A-UBRxM-=SV{@dllnu&{2(NsaesHucK_<0>7Iw*NXHM3&G-r51Yc!Y&1dCt z+-Lmgm}2DWpw|MsE_Dp>eCz2r5fy|Gd}I{66~5vb*MH-lR>Dd4E78FaUhWcJbmF^^^PEP=00Vz z(%&WAM9_+;)@q$aV}Fi@+aodHedF04AXYDyn`M|0;ik~^$p#y!f{*B&^+NhR|8Os{EVnGO{9!rE z-Tgw#63a5nLdzh>Fs{b84)I;aF~l(#+cL{vT+6QH@8#*{k^Ar2%J1ap;`s&*nfYF0 zmeSeNT`It%o2QrFmwLK*e&suq9-hvg*?jNO6TjbyoCS5mZ#FpHKoDMzU6hB)K;NK~ zYf%A`?_2unee`Z%OJrYgOx>vhbx%>0I zhkTbbz%j_N3fn+GQyz%XeB`JRLm!^Z`bWx#&8RzazSikbLJQ zwRb}&JLtmonM<9Wv9Cwv$vt_YncAM-pbR$GmKSXzPJ2RDa0Pyc$yPmQ>&`c{hJQv&%M={ zyC}WNtwBfds`?KdyDxFRN>B3-Hu13s;~+<{npRD_{L$wX{lu#>i?Oy=U6YRErR^o` zCGDl{N0`8d{DZaOV9KFs17qKL*8fJv&3Fh&(X#F zg6gCK@jGvLomT~?K8NrGY~qtZb$e_FY)R$^<~_{1jB@32m8bi-8D0tQWv>s+9&;4^ z$9LQI*kW8!uKVUh^CJ!~Ll<(P7ytT9))efs<}0+qc<@tPSX!PZ?FKC{MZWwj}x0eSctj~sRe?C z(YS(Nz>gpo3Vun&d4sa2|E_P|pc`#rBbxRr-sV~hO}d7+Aiqkt@a9yZ(#Kr7j`J9# zw<-0tf)0UqjBE4-k7@bX}54|6xR-m-g9?`2@ zBBdAkBli7}{@@SbMY)zmgC(e@5Y`gGee@tN3T9gasg35xy93vwwboI4==IRY{4iDQ zR=>oz5&hC@acs1$x2>_Qvt2V^HD7`1(+j*lvz7lbUpI@T4zl>xHT3n2a~?Xe-!T7U zE=<<1!17R+{NDL5-bnb%u6qE>62a>zmDYWq;=uwpn1?qo>Jg` z#ZfX?8vJeQePVa0o9R5hPnDWWp_h5tjhUsLmwxE0ZL4g{IWCzmm>VHhp6bi+S#4WsYlQAT6-a;cZd!NkE3(Oq@y=RTZ6|%rrT=($ts7N! z)yf3RVB1dD?rmys+L+T(CTGrGpiM_vk5p z3%ztZ@1gb3$`Vr+yJXqSQ65jR-7viFdCL-4o;c}!F139_%)eABcv9C!qE^_J+7{WC z*v^~JnLkWeZ)umc^fOnN@>i~P^dgrY=~w8X-XGk{?DRT4!7B!91vk=Tyi%}w@ESE$304dC zr~ZGa=L)^UrAm?eQM1JM)B3`%daF@ue{GO90QoXj;d{t@zwkG`VOd2_^QEBGqqcKgo0Uk?v;A*+jStpF zXcy>BzMNd=>1F<%f%+XeYX|EF>j#(9zq~fQK3N89!?eHgk$&jXhkY?PE8u78m44x) zzCQVWwf$!6Veeu8#rBKsAp7aUzI)Syy(`B|+t0S{^j{b07u!tRKJy;)Uara4u5zxQ zh&xX$iw(>(-lgQO7i<943reox+EDEbd4x9zHZ-bgh;<=;4e>dPZ6UqSC9W=dsc?b1 zNNtL*^ei8(jU;lI);QQWI2_&(z4Tunf%Y`9-@_$(p%Jx6Jw+|2=q>)iXM}c&e&>yY zO@bq|;o2etdjaP~>U{j0fVtDW%iN2d4zTyNm#4$}KJ#w#WZN{`Zu3raZ+jp6PIw>q z4BHIbRNEBWba)l|t8YVp+IyV*qqP(8=E0`HVcIBd3Al4W7kMuH4`k`J{-ZXAos80& z2Ac(sBabF-0e0~bc?@>xaXz0zbj|S-pC7ajk)yS-+I%{dkAcsD3$E;IEcQ7>G{b)! zwnKC&Zy9V6ls@d@JD(ov&4R6iN9i{{&_38c(Kf+WlfLK^ZR2gyAHBc5pM8pLvaK5Z z(kI&{+QerPwu$I!x@tf*UE{QITJvCY_A^)gk%|t{y}b?cXl=Z9oL=ZNsi#%2Wl)ZB z+5~MDeaqVf+XrXTvs}8y|45B?*e-aG&gWupjbGbf$KV9;r6+q^G_~k?KEXDYz14Hor}l5@XxncKyOR7N!nB@8?SW$dl$XWrH{LC$@epT;yaLA zdZO<~o3c=S(^e))g*GKkz*G*rfU1>pf0&O1v>|KlSlH6v5mAfa5Z*~f;WasU-#AK zHRkW>e_|>G_7;6OK^tvfu_T|A#bCP`wrrM#y$!EpVi6g z7V(Eqrq}y)b&A?K*p2HmMV+qwtnI{q5}0D&O5{}ZQ_0eqoV)29KOT9!eT;pvd4>6V z+c4X3+X&k-^HTG2_OZge*gVQU&fbzeHgPp~twgf~-3azO%r?aKlQvW9Nlg=sswb$D zXOcQW-A10x-i_YL=zpc|E#&DD>=B%#PNY^@cMDF&a}(>W-VNUF!9Kw$>R9zBZML?Z zxSzCH+BWzEYM!8u=R8Rr$MHMYZYs{yV6YLlK zjlFO5Zej1^@$DI0O65P=$J)QMeP?UsYUvt6{R_>D%oFSr?1OBBZ0%faT?65h>=W(6 z#opT0$~B$}X0gxl;EW~j@8nqTT~CfaLD5UD4dh%$z5Rl{gEQH~c>H=(-8f>`dDpVT z4c^}P_r*RI9MSbf`ceH+?MwWR>JJ9?59%0$i{B4m^oP&V=4%7NTJ7EBokzaD!GXcG z-qqylZ^TLbTy2iFj+*9}=bES6r?7+nW9mGhq^h>9ji`01%0>Z;LL_yQbIt;iBq$~+ok_99O$vH@r)J=mzw}%Fyt*TQZ`hRm*bN@Hi*k`3V=UTh&81IeO z-nSi>aca3u@2EUB6Hg;&jpoAd_L(S;{ZcgHY#QE&L zoNffYJa#UXUhF>*RB!woG#7A|p(VZLoLo9Ei>UtPhwa+;>1i--Lzq z7qk6B`hAo8C5y8tR^6p=7bNyi9sqVxY+p3R?ThsXC*A;b+OlB>|Cj!DF`Z(jMNN)s z=kMtM%H$nlre~a%acb1GsP-}KW4`jY1Jfa^VfB`ir?&WwI+FerH`^ZI~W25t#wIo30wXTr+FmE5my@(TR?*mcf&dvS$~pBle}gjlW||=a@GB*8Uk8 zBQ_~&A~qSD7}bh?Yky1skmRAsb7JSju40dsiK`Ol#Li}$`LT1UX}8tXW}E)1#2#!g zhmMf*@Uy6oVD3z!Vadajwa3cDHAX``_2(I#Rf*D@g^d6=n3+A%nn6B~d7Trwk#$Ru z#&GV{jT_C3oe{exac$z9jB_*2$vBG>v9VF(qQ-N&$8?WTubKY~e+z6()Yz!rG2LQD zM@@+Ofvvxfof-Q>;<`j>YVvpJts|cq`#sTY;?;>=nfX;hC#H2~_Ne482^|wgC69qI zEO|8k``GE=HYAQp9+BKBp-aMO{B+pTklqZw>UTnAL*mB7Y2as5TTQ%)-(fm)JDLfd z5`IWrpE#Ns3o|av*ej-2OcQ@ob{-WqB5F+3l8o~*_K4|+^^EBq(?4cZ)Uc@0+;Kj4 zUYv1R#`XLTUnh@E{tB%Q*y!Z1lcg(DeM908%-hO@wTT_sb876A*m23@lH1Y$E_Q0{ zH|({UoyNjz3x6v+Poef5o%M;EVQzxEDRCkk`3?!~62=gBNN9_nkUSCIhQux4Hq({P z1Z-^bH?h-Vw@@3#zQdx1M=i~`B;$aX0Wl5y4gC%L^*Igw%Xk%VNYoJSIWlT+)S#%r zF+*aOaI3b=_>%Yfrm%w|?XUL$C&o^Sl^@51Z@9-~>_>7Z>{e#`BmyG!Q9M#C3`Af{3{kH9MF691$ghh zx&4J*fVc(k{uK_C47mRIFR@Ud6jnI!U!qss3mQrWw}SZpDO%|A*J;%g}E|?=^HvFz+@0YyRumZ)CsC z>-8@)r1oF(p7EyQo%fZ#WxiY4?_@tqegQk{J?DL$x87g!R(xytEm8i@yg0Ad_VxDs ze~G2h%fk!y|B~h5wR!bR21*CofGx?5^a8!Ot?jmUY4#`+C=a7}ARl|@;%)l8aOI`- z53j*%U%j0#WGdd&SEU?!Wdh{_t?f4UOM0i+&tl(`-jm+D+2gXG!n?>%vGH=>V&5tD zKJ7i>eUta=)oW+BvvV+`9XsfK`f`D?Y*8){MoVwimnUuBrE`xvzU;$?f`Dh4VC0=y|7WCQKk1$)lB@>K#K2J{|%G@IzX{7Qj}fo%9rs8pm^ zh5Q+;5IP;v?PPc6+tJpnWW7<3i5bO?53)bZ{tkY&Z@zD#Z=UY~@5x8`-}Wycev9|> zk9dFfrXl~0dKNgH(Mo0qP07OB@$$;6;Gf~E;XB#gz&uT?8mJ!l6JHJA1zwdvHL%YN zx0~JFuEzbIvP(5~t`?{PrjwnS8Nx=is#32O=!V{V_cGnnoAouwpWxr;9sHTT*}lZ= zkFbR7>3H8hojm3m^I?)L8S9`I`4jQ&jK2D5xKebao?eHq!_M|HP%mv_H+uQ!4J zC-u5$bhrE1el-5zUHRU2f3lvo^xi>npxvA8``Ay|trxKmTy1vfL#%oHi=ANEiSL@X z=o1q^4t&f`35ki^LGQs2u=|1RhiYG}zx^>>nu&D+bwJh)=xzM|rv3?e?Z8w1OR(Rv zE&qyf|1R$Ggm?INdUtw%;_US9@MiR9_CMzh{_Wf$-MzQ(iQC^EWPb|x<3Rnur`+f5 zd+C|m->!@PKzkt5``Mob>ILp6{+2kz9&GXfa2}EW#(ce3p9U>qRT+eTNL_E&>wWs) zc&}dX(?8@4um{+0Q>%xzx_T`?3vbVF^KSJ{@_pmm?%iTM|F9+d6yGG@v+M!hpnsOV zUZ6oBiWlqkcDI`P9$VK7G{WizVwv)g$CK*?8nSOZ`wq3=f)RyzjQ8HF z57Ntf^9=)y(TGbN4rZ`D%oaizy^KGCiVIE}vd@^^kQ2ij_#3^Oy+5+!*S_&=H_jKx z9_EGozp{__P4;c_{y=w|H^!gMZ=o|1-68e}=3Bf7@4eRqmAm}I6EE>ldYaXcn%?gp zZV$ID{7CS(!Hgk)-E8wFy;1Dqx;Kj2ZSEA$8}Y;JukFv-X_P(MZoqx+!)X}!JfKM< zsJ&pTzq7wEX9Ih!_ips&^5^t#@NQtg9R6{>vA)sR*S;~nCV{4bTfC4T%X{^y*`WnH z-Qaf_%iNpP-emtT_^ob&(YyPjsOxS1F9J=lrhzw!U&r)L|7d!n+3hYnHV!oB_r1ZZ z@_OU{29-OBUx06hjRBLIck##Cg^j-w0nWe?DHY z&*PWR&lzivL4Umc=Dq*o{^gDOTd2N=i6>rMNKV5V?d zqdOVz;?4VkzJb0K>{^f)^X1=&em#1SZ-{TOZ-8&HcR6=hOs}|qD!O`$zYSY`3->(l z?du(Wy_v6XTXvhuybv2rv!~L(nD~;J=jmN04ikrX|6cF(Ylo@!H2V^7-nR|3=PqG- zA$Z?XpJHEtqc`#|;@i`|1phqPfxdpeBE0Hfntl2Zd!s$P;_r@L%#OwVCCnT63%rZG zQfVLPh_w%h*CEg$FpYV7#s6D-Iy?Rqr+4-BF8^QDzGrT-nWvZUFM)3#=p5+8eWuw$ zO{K4Wo@2_jr?k%UK7J>VfAJV}XT0iN0$t49`Q9boGVIyY*T{<5rwv^{^ucWx|@IBBy&b~dsb@TP`mG_tPr;UCmdZu@- zH$D4wr=}CBr;UCRr{%Slz!~1Y|K6U`*sB@%{kP&2YLtQvh4@{D*lE0RqMqPcKeO-KA zeHHy5_-A-$dgb5c?fi=VivA?FI*M*@X3Vzd*(Z4C{xI+R_X+e0$ZKoWj}y^hIQSD;VeNTOcGKS6J{t$#m2PkP6|9^(ATyY#wt=d{x-VAN^i5|D!*;gRcX56@Mc5e&7>$pMRmf!2X$8{Q~_0htOMOFSZln z9#LOxFQS*g|AOfs=nJ|ZdmlFc4Ki}>f7!(-5Zu{BRj(ZR{-(F@frQU~nB3njg z%(wLxe@6DG;jiXz>ub*@?S1m^n_b)cKBT^!nG0YKW|o+T68B+;5(kn$BwtFue_&wX zK;r&Ho&G5^^rn6yN4p>34$JH%_CETuf#4M{M|U82DK2A2)qm&TH!#UN$@`6Wiue8K zEYY>taUxmPXl2=WT|YCHHM+LHrhkdO++Kmkkif8j-n>7E?Zk!!hNIL!u-aZ@>&^Rv z=>Nn!`>PCgMBpB8)UUBu+j_J9AoaVvtG}N&_3!ap-REul`|J=8W+i;Rkv}9blnFxv z@pQ7YL$>H>Ud5M>iJs&g>utubmXrOmM(2ud?Q8C%9lZkmHTFt7jv1?nhr?fqAA!0Y|W(7=em z7|t!?R=#Gw+Pu;)-;_PZvRhr=?avvVn|~)kbaZoHOWz&d&mR>S8PGfZvBYc8-GQFY zHojx%{fHlp9~l@O(0l!wEuP-$zr%i`0;2-jVKiPC?YxEm3w@a_o*p_%J?$@}D z_9pw+xa;^W_IiH1_4YP<9KYLU?tVM&YTOU@W)SP`&CLFhzgzsu+_C%`8w~G8+$Qz; z`^Igy`GH?>i_zJ@jyJ$f2sHLJ@YVM>@{jZmGdnaSFBn~jz4Gua7~R0v(5DIdi^@23 z#|0(@w8=($t9=8F$X{9bivuM`mA%yB4<x9vzc9P zn7eJVi$)iXuIH=Ew9lEJFS@?3k*`p60d^=HJ=i{?2nT?n>M@%v#4^ zcqZc~a(+bX2kyCnzZ(gAiQnc%+%MdJyL~P0GK?#6>*!s@>u+e20#gGU_n%+fxW z;ZC7`k(v6N)i&mCw|}y)qP>DWck`dyHhTw^pV;jp`%eWc^d%4%*==p&dHfIP*5-F8 z6|OS1{@%9+n~K&>_MaAr*tdai1FQI3 zv6Ss;P--6ji<=en?Fe?*x*}HB1?ehX#s5c$c-$?gT@9FL1Ef-yy z|71!;5A^o)cK7!5mS=u5e>446*}sCn{w`cnN3{yMrWaRp!fJ@|aw*|=rIGtk^^ zAF!vh<1FkaW*@Zo+f&W_Rf*rzKOHCZskqa8_uBjD?qTn};P%;z(JUWbHoAtdCRW{7 zCc1odFZL+I?@^Ap4gaZ}jyo48&iCk_i93nL0c@{*k~_<5OZj~$%Aa78c3+70+`x>$ zF_SM&lwZzY;PvgJy#R_NllNaqap0zvfloboch~cJ+4Q+tXXsSJkK92Xq#~ zT*lw-=fhu)`d<5Idp=FkUcvvCvXTq7e6a7H?S1uJh(^M z@(42z!#_kkH?Y7Uv{`%pqTdm#;;ZcY&{xe@nYk6BD@Ru)lO2u2?8Ek~!2G~Mqkqgk z7I!diUSM(HNZg^gBldB+2kixB&$)?5*y?E9&&)bzA7$EMc3Tjb7tlXffobcX-Yj75 z;kW~EPuS`$K)I8@lfM!>RAKg4-cH^szKXt%{PU4c-j3c*{?7j6sOg`@ECxLbtp(^D ziaQ*)Ft8{vkN7ZJr|cuPdde5F-$Jl+$riHvar-ogL;QX#1IxI_&*aD0VLmwRv>4yn z-_>84xn+Ijd>xtF&ikcT|6HnvzZ;u$@mKU!@=251#m(TKq0Pniqj3`DC4r@ZgK_)f zR9(sBZ<%`}Za4Y7#8ce+0Ke4V*Yz>2_kXf9{F8qqbP%dkT) zCfA7mD7q{gmFHB8t{L6i-`&5LnKSt3k7ev~cF&}4Nv-1B#+S28*(L2VcCAp&P&aD5 zvF=Gdl4^!N!fJ*})9pd67qwCbS0mJeO!yLT54iWbPy5dKW~Kiw{Tbf{-;DIr)1Sld zaqn`sivKdclwI8JmDC4rNxLSTR`IRlKMK_d)d_tZDsC6E<$ERdWL_Zq*oGO&@N(s%H~DzO;I1ny#Aab^y+e# zPeY%9tP`q-|2)2l=?mM0c)NSM`-< zzHxkAYE6k7W77PL36Wl-_(lfNFn$OO_3F_pVi&ga*ai4csF2+conL*|eOujI-5axQ z$~GyzY(o00z8lyzU;R*n&>%3wl7=QVh;JA_oG7oI&;FcQgU}q7G??#*qz2q~Xwt}} z`sg=gmqzjR;v3)#FsVVP5h@Kr`Ru%QBY5?(t=YC_+rqp}_?yhX?z`>VmThCUG3h6! z*LFGV{A`)m9+WgZsd1=bs4*IYnKp)5IqlqbLnaJka^p~wkaqhV#89ve(9R2gIJo-p zpMe>XG>ZC`Y}>G{oFB9O;NIlk;@;riOgujQxb%(C|2)(*l*i76<*}QfC9ga;-w|kh zz`xVJA-s5?>hoxXwAS=zc?8A~AX-2FEdS%e-hIWtVz3^R_ zQ=Xc*%B3ZI55AdPnOq6sgfRb#1-=R4Os@A`*<4v&nX#-y55n=`EUswR@ANa{v(bML z{*5>rS!USTU5`?F!e*l$AAS(d?#co`J16qJ2Pc}EwB+xBk(#>tN>fu~uq;#_gzux3 z-E|-Bc;YzxePj2CBfAg_)cFZKD+%z6&p&?_HC} zg>TV+fLbkxY{cV7j$-(u|v6r28w1`CNtI zUu9N7SAHiSWsDCr8s^;Bbem+c-@?r&1&Fi|#1gTv^ z|5tRhV*z?n6)rz0X-3)8rqORg(1zjbm=S4w2KfV}V_-o-y;a|`! zf=*$oSIJZ_Zu-RxPW8*+#L|Sz?5HUv$O{@@ly6bjFK~q@!ukLBVrUgH6MsQNiWl*h z!M?&>AeWX*afBPuyBNL@F77IcMqzkYxo1IFDOXwa3cE@ZoeiH0m&6xmW^sHe{8_Yr z39EBCd@+26erebF@OhMEillmubCK`)aA|I$Oq~esyqQ^+xu>b9Q;N6*M>A`O>x65E zYlU~a_PTbtcDOzc*A0J!?IW*AeUEE5nA+h;yw|k{R4v2#2+ls@kHAEHEra_ARvl`) zsP1#sfLR;NUe|t<_P7qB`xEt#!!_U^pt_5Ss=J8~fY@WId(3=oQVV2NRO*DQg{zR& z##h7FLURwCgW&hMs)4ErTD=B(2)2&Im+)UQIdCTFkf5cjN#33JdTU!87s zFjd1J8b)PshvAF!Gx$T`J|vdbhXxzr9&-H*zX}+k4jR02+0U-S^eTg|PQ0I<*pm<9CXQvac)66VK?Ig7dsGq=>NAD#3^30PzZnPC0byY&EEV$F)%7Qyhtt_=ObdR7` znch*OdkWoh@K3Q*xo{a~oS}XkOa-!XaLeOQy3R1C40kz$;&IStL1>H9R8G0dm}%wV zo^+Ll@d4P9_zL0DSo!eT6wDcTrNgDj<;!CFmgifN+Igd1imB&_PGh=5>2L{-wvjK3 zmu4wuoo8-IQ!7cY9KGVyFQ9$Kb&l>i6P2QV4y}?fh1Z-?cp>Cv=Uo@+7b7ZzLJ2VE zT$iw7)FS(yXJ6GXP`&6X9xh5IY*A{LT)&uU7wBAcm0$}+#qq+PgCnlIG>fBI%=FZ~ zKwcs&ui9mlG@}gh8M@*X3Kt1qbzOGJU!i}I6Zu|s6%7|;##Pr9s)fw{MVa#p_bNiC zD3zkdH1`T7{Y!ksD2#Gp5Z9<&bX_xAV&sQe5>|ftMbRnDxeTT-J6&bB!e%FRi@?=J zSJ}N#_!l$^hYNtY&Ms0Z1~(r&-=L%Y3sWmd{~B>YkOfUe$m?*fp>qxFb-Zv_h;C8I zV{rM6Vm?@fiSkjq0WQDE@|fy%cDV^7PdG2z6bP$YknauGZKHXMo_4$K`W1|n@`KD9 z{uS1**iAG0mg`Omx*(X`@NdzPW&!eR#CJHk>EtE9jixY~n;)N(bB761)QmjgTww0F zav8j|v|q&E0+)xn`1;>o|33Lc#m7cJf!DiyCP2T?>R#Q}e zKl}*pBZGhB%D^r*u^){@v=TV)5l8wDT^Z3yV24a*)+79T;DpaWB~zGxDJ_+Z#>CBJ zxVG!D(fR}b2bvL|$Zz0>@rNskD1npY@`c|GKgRz7J_B6o>Lz{^-^G$pco&Ymjrj~B zz0r6|EghIAt|ws9fl);mUpPJWr$+a&nHj-7cBMz(7f#E}r?8U9g^cK{B3u$a1DHQt z&#^>TT4tsTzXR&s@Y_Vs=s$sx>-Wch?6Hcvic&rO^LZd#-J9PZobJ%^L*dJC0g zW@sDjnl#8o84JZpArfyLQn+=1mSM?~m9#G=Hn&*HGx`dRLm%ck3ayhR5?-f~S zNi}GAE-HVsYs8Bi0`Cbs@Z10$*9+qojJFdT}y-EHLyUG6z--S-ZyTQI0euMl4 z^*8bVxRk#nPfh-BikJQy*bCQ7blzas7tDSm{2KNDh+hZ$4_M(>Ae9yqWur(mvl7a_3(cV2R&)OKt&q=Ioc{U%5SjSKPdjop0B6GuUW5$ zQ?bW?Xr?Ag#W!Lv(UcBd=Reo$R_gG-jxvamPFu2HW;{6T&UuyqQeS>-2hFB^u*w@AEznu^@4_k(r z^(Oni!DjL=z`O*Vn%FYhniV#hFJQfCdB8Y$bv0eQNaQ98f%bCi)Zku%b6|$i{0DB3 z?@PWxzAyMXMmY#V`$WFNyU_E(m+o6cukI*D7^J>#=0~ysaTF+*6{PN<8#1#T_Ha{+ z_z*ph!D#X`sxO?soMgP?1cZ)V=Va=(wW`UGy4hlm-8;U{4+9jlR&?Vg80vvm=@hX z=}Pq(y?3amr~B0G`ZnBWPI@p>OK-hPJ&8!WJ~ege`RLo^8R$QD9;5#*8tG9=hxVUT zR1@20`Wf&xI!~#mCl*$kSb%xFGjg8Gk~-<`V6zfuB2FNVH(GJr zJBO8>{gg-3i=!6}F5bD%tVjA+@RDbTmzmujz|*vQ?3$gO9}vZxounI$X^(99tV9pc z$O=xV`>^8izY)d3`;Ayxc5vCTcxu^*W2~H3taFFX@8DwLJaA&@$AON=w2Snmc^9qw ze5D=@^B%ltD>sNNs7OaM?xJ%ajcjP#cXV4Z?x7t^Cx^k^CV#*#S*={~@4$)Y+%^+$ zvsZ5GKH9gbsjp59J~w;ZMk9{;9ZZw%I=2i)*jR8mKn6HMoR>J_)yrr2 z(#U6B1Amh#`K&@&|t$VqbGE(=E)L{PYTOgtoWKo zu&!{_SGOP*=@zuq%TFfdE7)aDQF7@N!GsrAl`HVCIKMbWtfJO0c-55`A}#kyD(wFlh0M!IRcy;-dJAM)Q($0bEH?=g}(;q8KLbW#>GzOIXEC zr6|5QtP*IQgLBm>!LG%uQl?rw1t))j?j=lKcF}w-OhjCvWW zrLZz6>8q@ybqlAt?nRFbB+^3AW&k?xd zmxEssZrK#9)WxWP{{TDc9D{ut_7Q58=^cSn*=%!yPI+*eQ4an|P!-^4RwevlGb4hp zO#dkLW1Qp8Vdn$uLv9wSRU$e@O*>UKQ!CT0XdMBq`Uh4OG=Fv~QmqX3sB@I+VbiS$ zt_t=u`B4-qfvCdynM~Y6)RfCUG@Z)uk5E7CR7LBMK^-(~p?{`##5ssgHRd03#5qh= zzA8runXsC4gy;ZP&8lwtRrwyGcMucq0KNvjDon3t)u0>khYahWQ=Mv6`iGqTRD|CT zTit#1YFhHutdFdN)P+4@wD&rD!5*R);Yz2fwU1dfnX!kul;pMBetdQ62Z^<({B9J) z-%Ym``ZYNFsMTcV9(--Q=I=*kFSw70|8Kum3Qk_z>;_lIs%7oOYjSm~HoNZT?zOEt zV0IauJ!WogX4SGjwst!^;fPfmtI7F<^AYD`cGyLC7k%M&8534W)ztkM{7=pf=M$?g z)mqecQ>#O5C(&*v()*Nr8<C}a@o#~%} z+=7m7@FQOQkF9z}^<(QZ^nP@E9i8nkwmU+rx&!Wy*k|yz;Xg%3 z80qie$Udd_8R+d)HiKydZ!=2L|IBJ=X__z%IiGMEp|Kf_?VvxU+JJluJn3&W3Omr> z2*0saAFT%1XG9TXWRHy?w8bVE;%tSx3Dd6iL2se51#4hvJ3mlwYHcvldMX>8hG3+=)>-E?rS}6E?InIw>kFgt1-^;(xye7LqWRtsybvl{j$&KgIYwM6TQn_4Z6Qd2PN!K`LN3;1jB>&VuDYQ_ZhTi{ocZ**3% zLko19VPAk<=QPJR$5ydzE2=BeZUtr~*p|##O}>U$*fq{dG+SBg$Tj~5<6Bs5z)PhC zHE~xkU$y1n*J9FNL#+kfmS%=#Y36D(LvvbTE5NrVZfUh}CLNj|A zytbyd6pcmjU-_@lYiCY7bRzm4EGe|-+uqm`7z^Pn;oHvYfVIOqf?wdwr`m~Zfze$A zasl%@TZ^2z_%8T)_>TC6_zu=WyyEu6i@|oVI$86e6APzl z9aDTKd?!=yY<0!AC+i0H|LTd=g|2j^GY{)xSX~Wg4z&f;q@?~F?A0z^(CUI>7c}Ow zaTk7#x$HB?nT6V1ryIRaV0z#?f|~El#^yO)iKQc(4YoUo&X{)4rad@at?rh3-SFMX zx=`)OcP5xw&J3gfz4JYOK6;(#_BNaJ1SM`y&P+!(+v!QC8x{E(uxFY2Ofz>jTI$Wj ztFCwsy3-BrJ4d=R$u(VS-(h{IO~(r_-^c1@=Ff1xb$VI-t?!&~oZi*|s$H$`ng5+L zjl5q9s;|`t^mMqr4XZDBY4kKT^?HH*-e~nPJ@I>?*N;0*V`^V8eV8-dnF{KAqd%2R z`cv&~^##}0e3kXb`e1!c)Z6+7^Z+8KgRF0<^krUul%`Sr zhWX#(Cld{_23k|-55NyFbA+EvWg1-}zd>UlyvasOEcFJVHi_t4;)&R|n6?~(O(GX_ zAoGNsOg%vvCe3N|C(J!nq9s|b2#w?{1E)tW()OHAH_bSosrgPYm76-8Kpk_G1NxU8v{o5 z(ZnM;`bKJ_seWxRqfKWF3POBs!F0YR8bLhP8R-c%rfNCRjsZYvxdAh%*uVSc9Hy4RHpcI+8Qk znLvFAK61bD)?|2MPex}Th!Jqd{|_@1ea#bVB8Z7rL}Riw7>!|I2O6yiN0=dIwx++b z$wbnh!gqr84K@JQH>Ns;od>e(6#A3+O5q!8Y6?Spsxk;o^`s#i#C`f>+M&NQz?n)d zqWKM&$tX-C?+0oiea)IoKGf=nezO#Bey`AszQ{ZVgVZVj1dA*#TR0e{Z z0#4nY>@dUXi=U3~gYQH2Tjoe{YRc}qLtpCRe{X%yR+`f*CH~&h*NKqb5Xmj_R+x_`-{;xToof)ty~5ced5l z>E_6H$9FUR?&dqwn#JsHj!@m5uFh=yEI6~k&cV7mo#D+V|K93`qPktdN#*~3yO^wt z(}kJy;m)w;vPWm91NlOuI3JbS*j!ZSS_}Bju;y`}&Q5!{3&}grA%Zpdy$rKuM*EvmRVi;veWXVa^v$WAGcWb=U^$3l!Jl zoBhu>0r9!B(b|}T*a+`)Q`=0fAyHFwg^_QBZL&6-JvZW2Sr2Xl`>Vd*_)S)0gKP}r zb9ULtP7R#~C~RiRCTkn0b!JWjquhXQ6MEWHnhm-0W~&i?3;r{FQ!{6iwZ+&b6gM+N znhn_JN8)YF(J~e!dd{Z?Bm8zMTaCgFxOKtEe~Ntu_fuz^LFoG<_7i)2?EGl$ zLgQm+J6Lr-gZD9b`R(MYf9iZf{F7Ce+72^Qm`|OZFg`)KF8v**|B3Sx{$ui8_}cj0 z_&RuD^!*9Gd|jswoZZB=(5eSs$~)L*FZ_?_?X~uh*QUFZs`Pe(--(x!bm|zL+U%w~ z)NyKXK6Pr-+XJr_-H*}P3I1cUn#|aTc1_~i?6n6q*)F1eRxPKxv&TAM=4k(qP}^ti zw`x%T|M@QcQ1aQC7!bV){AtO z@v5VDz&b=+72F{c9UwbIUe);-Uj<*C-iP?ZM)k0D7|sE7WL2HY@QxAf16$px0#cl+ zCX#Ap<{qI}**Su*ME@x0%BC;X51mQ|UkOANW<*Rn!dBs{zBq@iqu3#s{RrY~Vsff-o)0L`N6+u)s@&CmfwT@#IoeE%1uv-O#s_1-xk9;c;D-*IZ{Ug>% zOp3=~oaB4dRLavkPId~@Jx^n0opNmU0eeL_<;hMM%t?9`oYQEQrGE+~@#TfB=#)q6 zlvM%#NqjlHbWhPMOHXxaYeqSz445-S>XkFS()jY!Pg!T_mj-u+uCjoP$@A zei^3()zapaCO(aFIeal{7r~x|dk#C#R;8#%&?V71N97_K#hj8xr8pWT>6c`W^K{Nz z#i*2`f8M&peZ(vV?-xw$OK?lD{{?!*@fY#Mh)OY6{7ZDs8=m6g^wd?gD7?$~3n;0s znr2->_ZRD$nJvvi^pq61&G{X8Lu* zlcrP)(klo{@l`rPik+WYVJDw+)%uk^3ZSpL>>766@KntY`v!Rdu=$u#*vaMOF}Kab zZ}BUN>P5OYt(z!cvu;t(1Ns(uUeLcu-R^)DI*ub; zE{-&$C1#A7b%*J(mL>=t%dYBa_Z-x;cMh21<)WUAS}tm_sK#3HV6)PDK%`0cF(FmY zPCeqYqVOBlJK!GRv!QU0sX3S*o8ra#4Yub01}`f!?%{u9P8P$DrIv&FS)2#p?x7Sz z9BciKPG;j{@Zx2`eutSE{~KQ0Wo94Y*bS70!Dc)idFUK9g5e0OEyR5vyv!frq$LuSY`^ma^t&iNrt=ijMt`PwO-$#c zMOzgcy$o>Da(sN#I)7462O>T8#IQC0IeKqX^-^tX-T|2ojufAReTVv=)YCeDQF#l_UvSdEd2aoM zMjB>6$G?-ZYg)5Q0E`z*&jf|K8vb9F8~rH#*NyR-8?gR1yD=D*kkQplDLK{)PJntCl=`ot5LuYx zpl7j(hwqzaSKU+7G(j9`M0#!zF6RY2Ayre`LD@qbvi?Eq4a{=>p%#Ys58v0x{{{FO zGycP;Mnl{;I5MH$bY3UYychhAZ;)wvYVv>SrAF^1otI>P!?&E5=qeM}1@krR4H$1Y z|Ak(opUVBhN`*=)w;2CeuetxjzqC@hiNVuB^$qrVX>{Ho`!AH*DE%AKE~%KA%ALxs zDXC!p3okWO#CwhTsobg2eu=V}smuniq4yv6P38Q{7Me{L4fr9cqbcux%?&d2k~y!l zPb&AD?w4e5Xc|1jK=Xy+{2Tfw#76Gd-HKiVtB(BZY?T@>z1R7scE5p-XuJ%C;aG6O z%yZF+^yOa~z0_b`uwQd)j_Pk3tv9HqHnkUU|D~t@BCu|x8@thb!_0Y;*oDUHVE+lZ z%nWV=fP4KIxL-sK?q5WIhrD3k!v2Ey7CJ$;^Kcih`yKXrW-#KY zFYgAM#>~+#@K-3Aufx}aW)v*lBMPo`qugmhOaC2?haCgVNP|x%3NSm0Oy5X9jr(nI zQS9=ZZV=RS?v#dHmFJ;%=*uUQzYR{hfzY35ro}%48|h2mOB|%8UUKLOtPtl3ymYXH zOv{Pj<<>aq9==c&g310MSC#?vd+e5onz-*_KC`QKe$Sm5jE|EE&4kcHFp)~6qg?hL zI;tdueg|cPdx)O!kBlV}`;EpUeuGTz_c@thMD*S>`UxQ4r}H}+ncZ3GXCTYweiZsG zB!+6ghvJR0cF?5EMk@h_9&E%y&j-_pT{Y+e_ZGu--mqfg|fS|gUrG=yE~p;enT&wla1N~F!w`u zIS;Abqk2CD5z8Jqm>p~K?97X1uQ+yk5V`|57g~2i(e4=2Q7;;N1oI%IY8=dXJ(ii` z%>$TVa?rcOoZM!w7UslN&~M zw-~YHIoK-~6K<2;W6#^*bD^D+>RoDgLN`Ns-1*$U;`5owV&tZGlU}^h=3iBbZcb+3 z4c)@-prKuFnP2J}m;&H`rE}Y8eA9q`W>XBt)yGRFiL{G5IV;x z=`O)OCEOQ7=gFj5oZk7+X>`iLIfcfR&>54LG2AlfoC%!;D}|Eol5R0e!Yk=6Lwp+c zFXTnpvmCWzreBKeEWFb0vc{i>dluwb@MWk)bj};SbJR<-QyIfA$+s+foQ81@Y$;+* zJjq?kV`9peaGx|AoeZ4@obw=$)BONksg(XnxaCY% z(S0IxEL0x!X>i){17i8|W}mb4N`W~Kzoh#(ywjnhFf{K3x+g*v45KXQitKz0Tt(ut zZtZh~{1kVPekBx-kbQ_h1hX2rLuj3$rfH|pDv#DFYKN(vf?eKSnb}e~iEeq~lgyJ= zC6FH&e}sM&_lIa5HeU6kXdH)i7=MBzovO_HnYc1>72g3;c`U`bgMtDs&H zjJ7$<41KG>JRJHNlk(9}MG%^!O^$>40Q@n!mB3XauEf-8%!}+M?jhz^`(N!4`4RB@ z@io96z{{$G*dIDzrXIi_0;BptteVlR&bNyDAazB;YOgB9)v<%*s{IVUin|8)-iJwJ zAN=ZOPIdU2`w{s*&>w-T#yJq$%PuudttOQ{U}_m%)%JyIg4v6EdnXxB8FAHn&AquIM*d`$cix^=1i#H5d@tGkGru0X+sL+t8lbubR6`K; zFin%1_S{K-J@M!CHiBskwywLO`*Sm=k?|WrYl|&l>%;kxXd_4JpMh;etpQ%AA^gpB z8p0Q16Z*;Srdp+DO*m|?!=Fku1P2s67eiOrK zjBkRj*pW!RjbJ`ESgC1V6L(V(joe>g+O&ncnfb+9fL#N&DY_d&(rilSa}=9mV*L~-Ywn)b?TN97yXay6$Vot2@rp;qqZC^hEW5~a`4irk?Y^VflFg4g^;%-n?T zN@C4x2EVCcHFK|~)|_}Pel?ofT)FCNF;ye^TIPz`(%lNblDeYRp%p~hYXw~8tEdYZ z(Tw=D%xvavjjaH;25Z4?E5Wt_y9~dMBki^L=JeWN@@v?7IruhAZsBf^!WU?0tL33( z^j2|NnVs6YSA~{PTSILLJG66u31hiIE(Nv1;M=gHc38$)8CnXr9r;r9Wo^MP34KXz z3AL}Nv>^Tp&LYtAt=M5jXc4GYXeY+g z5k+~VqWZg3Jyaa=g=}94-;ijYV4*8#;o(08`j{FmHDGKp4_=Gq;wWmR! znes0CC$WDz&vS4|K^sIe{4|~BY2sQNB(!R%%+=(4YKna#PeHZ^F*^>CeH65 zvNA)+2Pu{nu1x%RPIh8x>t@2=!=lj=CeqJ>7e5xQ9AIPN;E z$8$G$3)Oh=G1Tr-Q|}H@9QYg_ML7*4hv$}2yTzUIqJ0xooasgSxj^M$i`;y3qI;JK zxB1>hM-%g)b<0#<`8-r}g3pWp6m?IUb-lp@)-vlH5-00@x zIChbm{3U!5PccskV$Hh(?n3Z9 z-z&^eE??MF3WRW)SQLK=#o|;hg1iX6IQ>_e@+HX6Q!fd#7;{T`N>eFDEz&E=yz^*X z2%a^Vb6}-&HpLhBlw`&^W|i@jg;yLetZ*gil{R`Mshu;NbHOvFcgA4O1PZ>3F%6ZC@pA5>M#+UI_pjHx8MNVLxL%LP5L&1Z=s-Ef~%6X2Xc^EqyJQAz~<0w%@6pz6< zjOK@E{7kPZy$^`1qj->B6);si)yxhN%|pRzR4Q?*g8Pu~&+H=YD%2tsA*-OI>8dH0 z{$b`+p(ce7*-!H-(W_}D$R7&sL%)XU*YJGg*&o~=tWI9tXy{Hq)2~YXP_PCp)%R2T z2!{Bo9e}fsyGyki8VAUvwU4?wHNk14I-c5Qw>q9$o?XGcsO)E-8dPg~_5}ABjs3yh zbfmb~Xw(E-lc_=-0J95}{BHa{yjXkr>gX$Uq_@jpYO_a8CX1>5ZcKaZ#B0_LPF?yn zm=npR_!B1G9l@RW-DI^rADjKf--(tqKEY~XyHVZ=Mw+|eeC(;~*@6F*{&p&wvIGAK z8ahIXy8})HBkZSiq*)(!O)z_c+py2bwi)g1=n7RAOkGbszMt?FUwz>;R~6YdCjJ!s z5&J2)J-8M92F%++q`Ph9&h^>tM<(d|Bj0T%tB=AKvK@v~4~*DbO;0%W>lyCW;3o1$ z#GiUTW8RObZwWSFj=ZqqZ63*APZhOp~UzW2!dyk0sBU6LL(k`)rXcHk zHnQXT;5yW{1lIupg-sPh35xyG338s-dbYq(3Dtx`DU1QY(c(;UNh5aW_m3>&CNco={BY! zZZm4DgR6zJZ9KR5?WH?!SBIPQ2$mdg+ekT+< zdAd?<@0rJ5^MW%$E@9@ZU>E9hsdNF+k+>V*uRL8m-Hk$5?mGv5S9o&_wlgYHQmq?a z`^*i_Mr&TME7jRd>;}IxXRfKvHvAr*9%h0z){VM*dZN$;{On+NvRUjRl{vu~%<1Xr zWoGokck#@i)5Bn9f||qjGx^Q}DUO)4nBARuGYwZ7>Pc7q@2StG(#`0q+KYKJ==a2b zANCHj`{H|F$*H;uR-Jb7W%?S~&= zOjCrJj7%qc1MDjrBj)kr=m zIEmSlgA>pnMyDS=O&k{-=o#+$CODqXl;9Awgw#!kdxm(%F;!mqWa2@@@)N)er8d|z z6dUZBNNqf|Dd_e0jPQ(tF%U0(X^1fngt!CI_=bEm@s!}#>@&(UAvh*D%rlbBhH{2^ z#)BQk2IGTc4gde{G927+Fj5{t^fg}0uhATzqBEL&lrs9G=qn%Q8SNQ^{t&(snLZNj z37k=IMx!}`zI4XI8%=c-`6x^?#(2h}GaU3pW}yJ{>);6HkMVph9{927j3k!w7|%F^ z9}Q{@y^&JD4<{STl#!+m%kam*lFk@7VvpdA1{bN1(`*pqFyY3TdL$bmZEQHEid4oM zrSS$m9354qI1J1LgBk0Yh#x{eidpg#nK6WTRB$M}PoO`Z%GaJ@@FwEFrZSS=V6b8g z`%qdwkfOz=$h3=IyVKiO2p)X`T{Cc&G)SIV!jk?KUx6gUIn z$`8U%0yl|xF!3PxQk;ybItadOAT|WAy{34kawd2Nu-D*VU+~jFPoz4P>i?taEWoWQ zzitmwd!M!G?(U95r<5oHf`o!1CEX#2s3_9i9fEWSiU`u(-QC@LoxMr@eq*k4^#9%W zt~G0nG3VO%`M&2q55Dtgu0He}?jOz56Mv+Cguhp)H(oDO@wolS52M~YGz#7b!zlVH zGy-04Jmp5C-96MjG}=FoNIk|<>rQPnnmyo-@%OO$7__>hIhxEUf47i2_uw1Hz!-r> zZ!+C^dVm=Nx4UsifmNk5@kF@8s7=5M(*taeP&ZEZ&{$N)kni?Cx$ab?u1Z%hi*MP@9BRO}Qy}?a6fwwMT1;Wxd|xnX3y~RXbassq`3+N@sFn zPJ-K!TBlG4;z?+C3{ABzllblqp)aX)=G_kUj@ZfmsbJb;Cu2J>#}xlG{21HT_>;&? z^G~PNCe#*w$53myGsuY74xVb_bfh+kiDz=elJ*pOOyjhJGZjudG}_?LH2zfoEdLCD zE8_M%%1cp-tIhDYKyePU&hY>2pMzElxU)g3E_@s7HxupFFu&lDZ9z4r-impI zYZdyOx~j8KnnRCy{<(hTWWT`9!Oo-79ADlSq2?&Hu)O@AnW0(eGbU&i`ZUxm^oxIi z|1;t*z-YSJ)LVg@h0ZVj`NVUW_Y3+q2lbiZ^}WCN7lIIaA-z7Ozm(>37SQuEdjD*h zX7pG#TsOZi+vm)&yH0+mN%Iyt=QzF88nE zS&G)j;H3Cbs4jLj*}5pM_OCS5uh@E~B%P0V8iZDnQ=b*sRsLW7V#=ys&k!GlRuZqY zxf{`UnO{>1T@S40SxKJ;yfJgQ5hZm143tY(&ap*3JWB=;MNAJRkd8vk$p z+My3aYyH359O|tZeuwjc%~_lHH}s_QEBHT%R={aM^?myN?q5e%n6=p2;C{pYPQ048 z(C>#nK>rWZe4l!~kf*sG#%jZ^W1d>@)>+2W_zi~QHSp^&VNK>;@Bb4$sYDg!{+q~b_g4&6u(@Qn`*->)gvy0>`gfVWew~WMl}w{zs65P_^sGRp3cl

    h-?4+UjkCjF36&j&-p0J%w^RlrmU{2-??%52efIjxg-VBZ z`S+l*m5KJ4#(#Ci-u#+-H%~d!7ILS*3|f0(mBQ|$S}Ii5;<8|N!P8gm#;Q+w`jw_$ z9_%hS(%FT2StcqQDoL#Z8mjCDy%(+0p##_w*n?QjwBNsvyt;`|3j98QY3v^AWlX;$ z{sH_*vSndL67MIo&mRdx-hOlpJo3>u2`P_jeK^vE&pDxe=DECzrd@a ztp0U=n*BTbXXCcn7*AYWD$uQgb$DuWjsj4Xf%3|limo} zz4y4f_!*KFnQ6Gkq=IV+5C^UPbJu*C)>}YDez=$!7 zzUnhPJe2H6&Jb!}`}%@c+y~5Xs?zI2Rvgdj-4D!9Fh+&HW|p6<;}9~!4+(!|^&xob zG6a5q@PoqreBXc_6z)%~Df)4S(tj{VQ^@;?_i*eW%M7uas+w#lT0im(2lW+Nip2W? zw7x@gi807#8$!Q+z5(EVw0IC2>hB$O5>9B%^{wHQ8N^X`VE7x~_wf7is|+xmL3HZx z`_4BQtDLX{s19VN@4yNF4e@u_f#L7M-}(j`{|D3i0oFh!{)zW@)G6DZ`VqzczVBiE2={y5--o{?(r>9bejplXx&y7}cYL!D>N&u=4a9y6PqF6u z!Rp_^`N8@Pq{l$IDkJ81%=M#U-yr7r2A1*z!rznsUNeCH5npG3@*MBG@tAfH=LawY zvEPULlN*ffho>+23j0I&C)9r+KLGt7Q4^;>l_BJ$HI&mg+?RN$P1j$ugO$p+_`-jU zKh*b=?DA-*B#_2UThH8W|p{??~I znZ7o6|8O7E>>uuhC(Xh16K5#=!92s5z_Y`cU+AytHQ3h&t>It?`$o{GHx>2L_YLt4 zCnvUa`cNB=it58nZ#as>(dtEykzo2@l^N;l9qt((;TwfN6nr1>Be1Lbxn&clj1#u(BbPQTIAM`C*#re}CGes|DgusyI+ z^ZNGW+eiDxgC2%PpKv$$V}0X@N03*CQO4=b#+ydha2HNDxLxcKXFMn`>KYbLUAlxj;!niy{4Y-Zb)+D_Q?!-xM2_qvY)8X% z43GCsCLTw2vaf5nLwFo^GSLLy9f?&HL%B|LX&-JEp5mKAeS&2tn>U48`|u?4>M@1N zMAMn%>%feYh^5t$X}ro5t4gaAbF}45_f7SEiAE=I(&<311CcP3E$)b&0BVM>UARqn z8um-LDbeu--sfKAAo`I(x?cq)F%|xda^;u*mflzfCoHpQQ z`dWuuTkkf^(JuTYxari?(bJg*rY)E@RA<2Zl3HsX@r9X5P8iviHebtd3#@uhB|Dpb ztw7Gg3il;>Wm|#L_q5~)(-N&YO!fu2xgb^bxUIp@;>>_GhxZJdxg|QSdBmSXr3Jn; zXZz;je}Tpvv|7@+B~dH#Gi{C*;pX7y(oddOm;PMiwIHk068>zmbA0nmN6O83+QRuX z{Il;DYBPO5bDEP8cP>a_Kc}0tKjX~zEg&(EJet}Q@n!}w7cM-VR*p|efFt_qj{2beqqxci- zLio~Dk7nRxn_?GYKgIrH`KElam`&g`C)=3Eo8@!7Cg>~zrnmiSctgu0GqS>#)e&d1jIQ)4uSvlOK8i+vutv9YAL zgzQ49P09Si-zHy<#>f0V%lHi%VH@)o%A4@F&X-cr-#T9grXg_?Dviv35?+jkmv0D8 z-crM;tD?okp2kwN8-`bqYXEn7G%iMWIX#w;TZvr^M!1IH8_;(petqlMfLK}mW%dT- zSNilf-t|TG!}ZWyO=dB<#^F_{)yIC!-=A;5#0|oA%+@Df#b09o2*xV9EXUVhikIFB z;uR?9Z@(`i--x^>T4R5?eL1*>RO-@K3afdRg8vO~xvw64&7hiQ`Uqbb*`YsQbz0# z$<+S$);B2KB$N)v>jySBJ3y zyz)YdquM4g?;55?xT?Ok;Lvr^p%ax=qz3G}W6e;b@F z;Hrcx!qi);Rd`phcn3JmvlC2ts&(X z;^>>V`_xIb9b|+nM=yD*?e*=pewFC8!@grDIjM_R0rm3XvUHHI4!hxrudMRBnXGKM z6m}o19n{L9y_=k>ddd^;GRdXVYlxfN3j@E zj0~5+mbOeO-a?iR7YpzA9X7Q?;ERzx%$F56PD!efs6{gW0pB5>{hSi~My0~VQ7aif zK<=RB)vE+r2Ms6wA!aI0heN0zpoi*3;b|VtuX*)59Q7SR^&q;%>3zso6xo>oVcuflB1DmJi{R@Vg;j`LNphO{7)Re$ocIu4F`J_xc(DqS zI|1ULuP{+DdK8XUI*g9Eny)Z=$FN6;kMlmvyLh-zI6wJQ(Qy&tqMSp-CD6!+(rNH9 zHb3j~c}>*U$vzLP{pnWG5Y{NaPw-suox`4>UWjT=;|Oz> z`EoJa1$yShUbOEy$G7D+)OomPVCP|$b7-99WECw?w`c^7>`sLv(pIl|d_ za-pGKSIK2YMZaTaDtUO$`!1uG4KF7%Uj%j0c*B-#m-QwIZo;uw? zOX|1yhIH0DoneHN?hWi6>v;>!3@E668$T`FyT0`3-^HdT&P44xXs;$r2Cz5C+(SDx z{$1aFxYv2^lNBce9NBx;3!UURCOX1niuWSKO?DZ(j1q~@Ih+(Tb- z>|?CDq@%9yS6;Y>FjJ6A6;4XeC)Q8gWN=c4lap14WPI;qdL^|u75N9oPXQ`9NBWO! z1~C((E4}2V{{ZGQs&{?TN<}pZ?{FOeEGOkBu%3WP0VaYtgw8`S z>Xs-Rfaiiuh<#4>xi2xf#9*ZnG_Kc6*~Bn{rXGYJKrbnJPkgdTOg$+|PS`~=fEPqh zz5_N1+-K+|#81R=IEhe{p6d&Ni3o?WKCJqvF0N_`!#?JF$!rPGV4)hi3DAE@^_efq zX7+{s@WW(+XlaTFW{dLq@dDKJ?S25N1krp!%|}Iy2yDo#gAKv)hhNYy%CrLEC_K$0 zy)euObP}K_tMgw@9rOi0uu{;h{JCIaRkXA&2LGCBT;ey_FwZN)zxKro$F*r?U;AGB z_;cEP=S$O&-Yas##s?KY94GwB_ZB}6z7IxR>k=m%FZ>pqRA2kvn5SNEiB(hP4M+6^ zFyDdyme}LGB^QUDZ<$4C&GFW1Z+w4)dS!FR3CE%$?mJj1Xo^_q#PZ9&@%;l%)i`$E z3CG69!~@!6Q2n}WKq@Qz2Ao3l6^}(4s*XXzVNR&@%#z=Z$mHP zB!KH#X}|uLBW-3U=kv$sUh``veGO8oui?k_zruS%MjUAh_YM;#pyuKD1I-|Wl9#}g z#8ZDCy_EuMt>bF$(FIDXW0|Jk4xRL8|KndtgdwddS#sd)C<%AUbz}d5F&}W>KDp_6_5pX}b?aP{r2SXp zKKH{@llS_lUvg%C#7*=2sOrwT?!@aZx^BjM_vIhbLHFBrr#;R8)Rfn~eBDdeJ$$iK z;-|*HN9_TsDY$2z*0eNBD*QAkrRJW#cmG`(-BH*5cHO5>!_gi3G+=Z`UU%q~)!e$D zuDkK+P|!Vi#rNouij3~W>%MzB>mZH0#A&g*_nw}kyYm@{Z*qq{BX{4g+uin?Sbe*0 z*x$y}4fu41PtSdI`59rQFV#%ZNZo#y{w;2XU!lKl z@%UETk{#PIip!QjHfSZuOc;Bav+0pQ(J|`L%xTSu{W;#z^ddlk#zwYv1 z;3mB8$ZLApm^dfw9AtD4UN`zL^7ii1pCxlKq?`4+yPqf8dUx)X(S7=C+*Q}M0Ns%n zT3p?=&trG(bArhSI|uK)rXo%*?&+WB4*q|4@^x2Uck*>FK0En~HmkT&(p%l~b9etF z^LRJ&Pl54n+~=j1*Y4JzC8rLjn4+bt$ z?yTpBdkW9Hd#`)!x`BT(`aXM1tXusjqVdX!A&jhU`Ri`Kwg8BG3T55EFT@P_xy>%C zUg{|B3A{q!bl3i*spzKuiBJ)8M~F{z-#tHf#ZPk6-MgbNxkXcm#2w!pWeHtUmS$)?H{905$?|) zp`*3{Xdi&?+3RM$`s;4Krtz$H1r+C-b^l(P2RYgaP?)S29pzqrQS@{pU%Z3Ns$2Tf zj70AMM_qJZUtOi3bA-sdqkouN^2NBDe~4Jy01goA=KUeN^?r=I^V(BTiWyWtNI%`= z_wMyeT|D6rfLAYV9PsY>>ps2q4IDvnH+T2Tz$?MM`vcr#kL2FE(CV$b^pTcV??_O( zr?0O#fVQIj@b}QE42qH5Vn0Y62}}3;_kr2V(QSXlyLcZY);581*0Utq`{9=44*ovw z-L9si~@+0K4s;zwXrws~rLR$d=+hdwDdy1nn^rMin*$}`grthWhZ2iXeX6f0la>cUCABKQAwx8K_lplt-Y z*%x(bf9N5f#eci^F-2qa!{&$ewM6D`F?F!J20BsWR>{hJy z1Zc~FHU?BOu6k_Yru=49ws9A}5;x^_Z-2A#gsckAi#@CD1e@%5+7&?5La#iy?Y7Hc zGi+@V&@^Itdj+a;|9&%j1*-TrprE}3y7jNy{xxC$No^}P^0jkdGq$Sj8PJx1jnu1g zzh4^&w7Woi2mT^g9aeR2=X<*YbcPSJ(N+L$ z5YQ$9Z36hiRJ>gUwYZnRj(hoQY-ZVY>_O zzWR7??KoHq=R>Vf^0od6OlU)cjt z&vp-Zy9!oz0%p_=@UsV}#h*F*aaw2wf03ACR;n-M{U~9Bm}9;g+^pPrnZ8(0ecFhwAA(*G~zD*QttRK zq1MEDHKs21Qf~S$W#2#}b^i~1v^PN0X)8cO>#P3SPY}ax zO8ytL#MPbx?JH;mZ!x~M5J>M+V(mVVCnaq-`2SYh4Hk2>aUiDV@fZH9sf_`j+AK>! zY4?EM&1|26_8NT7w`hC75-LCc&z^%{Y!`v{AAH6X^QmfofhJN%?P^f>rc9>21=5|* z4Sn7B*WB8}FxPr%Kf*$A+HfFr3-GhiYH9lmenvz45q@SW?L7D#ly)G9^BH;RNp~*l z&22Zq7wjMKb{r_yUW8VlW>f!ySX&vsKqF=+f%Xi{Cnt_}7if!tb{1$)g0>q7=j~$f zb|fg@iu?cieY7QE7PAW9ig`8LJkW}p6Kn5+HZN#bf^2K-Osuy{VV=#Q$yfoah@5`@!!gD)*7t;y6nl5Iu46Ztk+?LwGrI}zGrr?8)(9af5y z`M&o4&LFg-K-(kq4O6K|RXY>fQPeg^GO z(4K(~oUUNTq2HOf3yh9D-ND)tAdIJ@ zm(#9@iA0^LOGO%E*$L2<-2mciGs6Tjs`ua-4R1V;&||3x(;ck#DyX8}3!`lcZ9h<# z(O|pr8>wFxklKx)9SJ?ic4H=QcZ2pkNJD!URMXxCYv_rw$5%Cp!3AA5f2y<&f&94mz{n&9Jyfz*D zWYr;T8yF5-SZ#V3#7+lq$Aab`O03-t>Z5%N+QZP7Iff7qhB1WtV5&o?^`$nH9R}Lj z@C_L4j2MLaH$+nL_A(5%oe^J?Q>+aUgHiA{Is61#Q~k&h?rYmIF$hgIHLz5g&vPVG` z?Qr0T4`(1TnU=Gcz9SoXNn;10NPwaXa0Hzsnkp)MWu(JlvVSs27-f&t*aBCkH)3T&{m0I?03+P2lbMtn(`yq#n6jg3?rj= zGANd&`f5jm_Dc-s^akI@GQHU0@E=E-($hW(Sz)xRVwB~zDMDZ6*&a4s58Fr~v|{b2 z(8dN?Zx-!;P}G&)+U=n25>l5hjy6#AWKV6rcy)$ak?PMC-9nqbBF_rzGscsn12lZy6BXmfP3VkXZd9_6R731S9#Z)b(#>Gbe+SV(&YxK?!3u81$l&xzg@p?OrB z213(nbA~ovXeWhsS$N#p%<%==9n?v-o$a;I&WXA3)LZ*9T5_~=Lvzh!kArqkczY|< zZ5o-m?0wMQ2yMlfiKeQ;XfMToJ21Sx6fM!2%`S|V^bmd)bG2q8gEn8ZV6J)mCZB`R zmWo+?leT8GvaJ&H*w~;w8roGMu69{yH-+|ZXdi|4Su|%igEyPDO3X$fRLVRtj&>oG? z3^Ug>o0HQfiv{R<+^zKF%_Y50Ww5ZYy--4#vH`V_pnh^;*p+RdS@7mcYb#$Uv?31Q?d#n&bY z%^<7Y7wRjkp4!1tAFR49FrKt?ZVJD5ACW@|K;Et zu^VCuJ1rVd^#tT{7yXy%jNAP#^8l&KZQIaJ5A6rh{tIpLsEz*{%s+{1u~%aq zM>@5reL(yN`!8y-Gb3g%hBjl!ugTsD>3O?8Y8bwj?FIP&zXsYH;Cg#Fyd4~C!Edmg zA8X0iM$^lvqk4N=HnioVDp74Ts)Etx3Qe(*BcwK5NKZ-|(5Y@1_1eH@i4FWtHQ;VQ zTRS^yqM>~n+Qgx~8R}7kM=ILKp#x6MP_G^C>4A=5W3@L#R(NgXs9?Ct?C0=~_H}qWK`I))B0O~~$9or?&CFhvXcPM> z_7ayNzY~Tg*+T7IzOO7C?F`ugM%yzqYX!DllxOmtDC}T^#ZD&B&Wv4n>RAa+DRyLN z|Ai{r+o2sH($JQVGAKw(dpWe}!`s`TjU3z9-Jx&Pw`hxpc6j`^yF)ucyqz7|2(lBb zc8~00&&D2hXq2YkKA4(FowYNhJUclw*#Txy-}0cet)ncvLiVr^q>OFX5PlCjd$D^# zYj$n)&~^}IwDY4hvCxscg%(DYgCM+}Bc(${saIh4M=`L6P3eGj-pgD2L8Nwwrx+Md zs{~r!9*{^lnqQ0q*y1*43I5;dp#KP*;_xHk9kQ=GOlGhDFh|;|@54VtB%NX$O&dVO>0p5}|_Z zFFDDK1)1*{98IQk)cnG9QuYu>{SQ&`P)E=%!jVo9dK}{%MqhE!P~lJ^-o-*k`9div zCslo4A&!{G{Kx%;Lis}{{HOf|u&N1toJTr^LIu##+(*crunx!Zq+O88aWc}=1+bbWKm1cR!)bntJk-u%g)M@A411dTNyA9< ztZC(^mXC9WC@)H<$>$H{37y1BSshi+&+%*lY#zgT_6+!Z;Pw6a41bz=&(TLc&SP^M zSL%7K&sp-h(a`UeBb18?@*DpG`J7&iO?ZxThJ2n-ZcbjZx#)e~FRW%g&yknM z@Mo-&6V;3Ui|~ZJgu-cmF1Q!SNMGC>rj`q2Zu&`I-*nD@6-E~PE2e&hK4(z6?9U#` zPBtgMsgy5p)cG>HSxqCYd(Yi6_KDSw4?+0GRZSwceOV9txo znVoOD3`dGtLm8<_?F#d#vuCqnr7fN798G&2Zst%1zVim(D_%C9jKnvi<1F}@LzzNX ziL>HoBD#jJT;^!3I!Yr8@65cVe+!IfZ}`)b7dK|^4B&72)$xX3eT2TjWEnxpO63;z zy8jNjv|#U=nkGpbN*}rdD_yjPI^Tewk$jAmUS{HJ(KZdfa5v#)z@`tS?}0yU zC>8Z|_;=`$#-jWFdnnza`hd5-A%lI3=DTM-@1u3sPHGs^)g;2Fr1t}~Qlgrc9FmPYmTB+DUh6`y$Flm5M6QQB*#vbX1wB3Q=XT<#_Lk*u&XnxZM#uBldzX z4Sp}4kgAr!?#1rr*~e1~UYV$p{DnhLs*kZ7x5lOBDxkE7b!YGBWj5H3A(-B5z zKlMWqhk5TIR|d}Bh+=$uNz{uOqeN73>>&^b>06wdmq3ajVKXSnEY{Y zh2R{cdH}r=Q6B0j`64KYUzk~rf;<#ah)&1x3z0hxrx2Lqrh5#0VeoqYms71UxuW#Y zuW;COj+l-*YVt$qp5(|D19Jr3BH*QVjPFqAW6?SFD;!nOYK06_i2lbT3gUZ}LQyA( zkAjz`c!jAQBX@#xjHgIcfvEf_6y{wJR({TDut&h0jW}gob(c;75QV_!1LNhSdm7Zq zi2P&=kS!RMms2R}4BGjK@)MnjI0O46-URcy9ux{jouXC%OdfdZ zbc&i33*zVGId9$0+H7Yd&JmrWk2Fq!%g4#h$q!B$;m%Uejm}w{F*hnP^_=KlB=6Po zMCG88m(F>jaxwFH^gMf>KIcv8g4y%YZ{c$CT!^>;;%vl4Y<6Phg*ito)okcqw)lL6 zy629{Zn;Z_xJ2cAgp|&s;6;~-vq#65B637!WzMV7_A)j*@r8)X5mzFzQp*+HPZ}3Y z;}W$?oXZi}z+SP*E~9V>?@F}Je^&WRm|DkJagyfgC78kK=;_NZ&{RK1F3HtZ#|#Lvj1lLe)#5jVhO zh`JteGeT_TZ$w-Jc?0bX%ykP+`lz&^vk_lm=G)}bMWrK?l^$0>DswF&EqZr}uAr5L zdOGTvqEeg9Y;k&Gd1<3=!O4J^o}RbCr$ze?+;kw)!^wd9EqbLTx*KsfB282(>i4Oq zHqK2r8Sv7gq3(A$w`{KT(eYil!e)rNN&X)7G&VyTbfo9m^w^tJAAm_kUA@H9)amGX zn_4mqs$|6LPni;VC#zGZotRBc3o%QbTB}6mTDadQA2{ z`IPY0?@>fbFb@sw)usA~d@|}!z(0)kQ${5P|AaY{MkPj1aT3Ew^%;+TfoJF?iAsdV zb25po?#=NOZW3d7{gUH9W@@QCqm~d(3X~s_d(QKi+;j92Qdj;VzH51LlF}m~J=};y zQ4Tf=8^8v^t9zoT2zVjG2SG_EAu36EM??j=N~ei6j{{HkDOlM6^+ed`bWcd+MuhMl zqw&&g6kG?E^iJKpaBfk8YTpKk5ZGfpro)K1}g^pd+GQT1}oqk0_>p4K^P6 zm#DlzCjmOIB7DY^)(iXu94W^Ksd>bRAN9((afu?V=WAlk@W$**c=5=;;b@{)mX9A5 zm#i=9HT}d_^cJfqKAP$flmDCCi-@=A#6iciu|fO;UYIyw6QC#MH`IlH$vb}3JJ#hj z*}uuhfggvA`n-+!C*mFI|KP{~fHX;^Q>hDCw=ERMP<-CrF zMen##|G0QgJhFeg)WF5U7oImK4!)SN9Xh&ZO)Hi|1R2}$n@O@a#{+e6}jssS`-_SRn z^@-qut~!P36+us~>%#I*0+>D+el+4!b-+sfjT?m}q-V&uZnQ=e{1+VIybAy036m>w z5&M|GgL#&Cta6Fn1GW6w))BjIEnERf(e3FJrS88 zX!VnQ3Qq{dNvJ-fLk#9Ibr(cJD(d&t&T|k?z<9YQ_(`0k9Cb`={3q@sH>rI`5+^zN zhwxH@ctBqIPuz!aQczRRWR5f*Q+q;HwMXDnfKN>ADV1c{M_8ex`xu)Xn+yft^Wh&P3Z`cnmO-b zAA(Pbit?$2mvi4uYhAs1O7Q8y+(thw-W~TAHXYVG;-o_HKJ{Dp>ATaPRO4o0)m8;on3(BT)w8EWFd9wYU)`l4{}%pv{M+so_X2u3;AcYbD)BXHmw0jzUvw`U zM}05h<;042gM20@o0EeHE)t8M*~v+qnb_lIak8U#k)v4o>!_b+_MB9*qIU_ED|}N{ zCl|T%)UJTNh`orX$+D2wq^jhgUoJYFg_VcC=fGZa&oWaUxaaUM8B#VoIBDiEn+xoD zIC)UW#_tzX&jm&&Cnq=aopaC7GcVB@@R~zBA>^HIr`JB^WJl<(+KKRO*z&D(5PcnA_IH%yAviP(swx%nLJx=a4N613NM?n>%c9`5b_ZT`w zIC(jR(L2U(Q;0af;bij@pMWjxqo#En)Jf}clI$_EVyIdGjUwO+Fn?iALC#4yN2s0T z6rduj{Bc)0;ugg}ihm5;ab_#XY$x2J@Q;!yLj5Rp9ZeeJt9A_hA&#^P)AuO$sC(Er z;vL670IDQf`>B*5cZ6JFrx>*()DF4Do#K`&igt0Qq;t^SZ^~j8b0V4LfP2umMW`Kh zBhfg3MhP^EJ0*CEJDNdOCz5jj&S7#zsf({D5`2khef3cs>6C_16wG1xC5TJV^ zc9Spd?8cWZi+UOAd)yt=_MxxZUeG(-icST(m3AspF9otfG`0f%cI&&#Si3>*f>RcB z1?OF7hr8LW;8e!$0JVdeDiLYI3Z|ubcEFKtIdUFuCpd48vY>Xk+c}zIJCAqDgH>i5 zPi6eA)GC=`Mf58=+lVV-#n}R?3fZmZ?ZmI(Y$m^xylOg9+U#z{dc4X`6(-deRArJ1 zPBpx8(X(sN4Tis2Zs<1RuHK)2+ajG$g)ONZX`CY1l-DFzA zS0~I_v4S-u(l{ zCh-5o!qoyVzU-eM{&d%ot3|FRbBeXjeV$Teb zoeBQpU4yJtHQ5K8Kfub0T^suwacwYO?mcpKsMH{?3wAZV>*CiycLO|We2A~}J2jze zJFDH_+`8n~U{$G&{{fmGa()9>2fvn652g3;K0hkLv z{#SP;+V#<1fp!CI9rV_KT45FStpjhh`w{q+roEC}eR3<&`N(O&ky?H1N^avD2J-6d{Arx8_gmc#kj&TI?18iEmXDQCI+3Au&XRb=YJUlENJrxCGckZt5N zahAA?+$PSaC^R6idSkQ~G2^G$g?Q5Q&{AK-49nmzv|bCTeM+~6%)Ol4f`6+`oKKuZ z;Fh?*z*$O<#@6c><1L_1Q`4UhV`((A8JNaSGjPA4w8(9W#-|)9EFvfWQ+TTC7x~$p zXKM5CnmeC6vP-Bm;k!N~Uf|A0qnY8GVdum99Q!l&GwcHF0_!!8xCP3M;k5ua*Yfk> zOXo8x^TExhpSa4X_A`%s9r+8$GzH&+rzyEFoaW3lm+UV*bC~f9XD%AjpGR($R1@B_^FYjXThjXra4k4< z$jl)pza`lgPHUdendN792IouS=47O+Bg9x~uvlZVt)15-E z4j?DtcVr&fx$abYwL^0nM+!6CcGSe2PEB!JG`~b&R&ODvQf*Hx&1t4QgZE@2*(uc8 zIg>$k#7-jCcTVQC<7+zbNJ|=1$+abxHxa*+)6toTr&-#WzVs%b*O6Y6nZJYSbux|i zP8X+>P1PAs^K`%pKhcyYfERCyJD!~8Y--hC*Ro_N4*%t7J?YU2{6u&osZ9j0nKWBhrzd#n zNp~D)l;xz;4YjfE7~*bV$GIb5_d#bknDJF=lINy;~^*bJ+zco96SUtYueDD4MdZ0Ui-b37P z(GrU{@j&-G7XfgCP{>%H8*}oh z{RTOMseesIJ-;S5h@3dG1IYL1d~3D-u*CTZj^-JJ_mlGttRI~rV87<{cL!6If>5ge zWJ-fU{N(flF@(HuU%UNytKUz~P;xOfS)o!yDrCu};0g3hy-&*X<3z5AVL5UhYt5 zwA0t^LEO((&*9D}o}u7JnjJr8<{L+Zm*%H<5ZL{0XKr zj#^iy=*mnJIAfeHL|wp7B$8HluwC3vWV)F*hWS(*ixqM#{zN(n(UmifysWxUuxFyv z5&mRQ9l%VX-X5)PZU?tL{HdVYk(V6{M!lpsiKip^N#Hx8ryi4>$@m@7nuJCNo3ov% zbm85W{B(MJX;!=`&Q!EJ&~p-J3P-wAnYBIh2|b0n5S@71!4pPjGH0qY4Nr{DHq#_{ z9SkGRRO;=qZOKgs(}uZZr=r@H>@>4&$jvadnOM!BubzsXN<1UlP9u`0vfdn1omp0$ z=FCJ#*tTwKzN{^J-uaTKwc7?(8@Cntwr)$TeuWlb=D?fkv?iL#S4?+iJ6}?rX=*cx zW{{Pg<+Os=1}(9r@dfWMdCzd>Qk{l|m@PT2-8p2Y!RUB>9lY^$F^~sV}Ew$IiKUT2KO1Z4Ha3j=UAuNHsdTbTSa5$lm84Y z+1WfX8q%Lj+#LQF9P#H<{hU7Pu>gM-xmMJ~TR?RlNBtHMH#62}Xw0Yfv+2&m`vuHg z-e0&)UB%)xbDNo}>}Pg9XC7&Jb1iTd8b&$`oJHh6;aeAx{n=>>UK$HIpP>0U&nKqy zso90}S_ms9*MxdA_fuC{Ar?7{LCnW*=1N1kh2)yLja^|s<*3symR z&jzlnG?$QRLVYoI8BrtnAEULxR96r;pw|kN7o*(-?ZrgmE;Aj^7h<_7G=SgO{m88k zb|tL(s5RuMx*XKU#0@y!yCIn6h7n&+1H&%2zIDMhLaUz5R2S^8hSIw(xiw5t2ipk5 zQfH;J##v2e8G7na->u70_quK!_g88k;ngFrQ;*z7R6VT*?rQj}z^uZqMoD#Xe&vXz z%CF?t@cxk68s~Sa%Zb*KTScy}`#WB3YO>O*XPs5~$oD2}G0nb|e52@8=&fo33*72RSsMI6(0XcOL{(a_Jhmt1#1Et^4`~dzR(TH`- zQ_FgZ_dZV@6joDR4@Me)aB5SjMNLQkZ{$?3>AvUw>1+VC+WFJ@%c1F@4E7;V>ddRKy4yd)y_uCSE0U@TqU;(+FL@C`VQrI`Yc$>^7}EAhw}b(cKQGBFHje_RvF^UD$G1 zDU^dHep!zE-OgSZI~?W85bq)KxVxErr&Ai(8NiX*$5 zY4$k#(TTJ<6d!Q*ImKZevVMD+OA4h-Pu@Q2iuS_X2e*`4(%p~U!#Ti-L`%I(VfT_h zfX+VWpi|NsEsQ7?{)n31Me9RDB{c(yq90PG`tb1~Q+zc~0}sFlDL;e8ZDj6LWa<*1{q zw2Hci;j4$v5$71u0q~Ki6=a?hXcuDcW6W5X_!!v2Al2(2wGyBT5-D4RN3|lRQxsky zqT_Tr!lNDqz@BuDI|aaZdLCa;M22b@GEPea5}E974)+pXb~hXLGB!K*B31RvK_68wIN9*8 zkUwiGm!j*r+>1<@-Db*)LQeN`wAMwma*)YEE{mI$jyc?nXkSMo3%ML*FF9Ay&4TV# za#`G~SarJ`Jx5GVnpxpyM@P9U&NX^wruS96D;y!NIydk#Qol|%Gj-`nTbRsnvs&&t zen$72a}%2$dke&6^s_MgH8ifGk=4CHE)yLyyXo9aOnbxTy2-p5Ia$bMASbT0V|r#n zF%xW6)#HY9+qn)x_6F+LdEZ1o1Bgt_d7T~^vA4)xBd>|lxwnWjfJtw-4AHY@Fr4(# zfy?NovB|{Dh?m9`(}20lQJ=fc9o}g{-T|XoGoyC}KPxsRjC)|jPe+`VSd7$YDY}K9 z4y%)nbCWN40A4(=e%HANMn{vRbyKQYUOhN`Jh@@z`*4>|g_2iW_}5t9?*9@$6al7oK)FFDoJ^t|sRMy#w$y zfrnQd0MCD7?5KB)_2!6jUYLfQHl1dPqNk_z0=&=l zQxBW2k1YRjwpk&RPe3Go z0>i(C8=uT8nDN~>R*8pI$Cqdc`xf2U*jRy=O!<~x?@;^Oc}@TLAY*2V*JMfRXgNp0^9ehI^C%PuRxb8o}SI#?uxB>bE`>0m}Lk^)xK? zzv-*_-UMHx6*usAP)Ew@`8pVzT%5o=oY>UDN2XMLN# zLK+F+C!n{VM>=7impne=1Y}>4aft)OQiw3DLk}0e zFuzv>-y22baS{>-nNuC2c=Ja*0*N@@H@zfI0RJWbOUMUKszK&;&NqDg80%=HX+<3 z;G`vu=kT7Q8Kkq`Nx=&fB#N<*;VVuQNCr0{PcryV;60^>^b$wElLejy9|a$SP6qA? zyeC9Ssp>o-(((MqV3GwM5hpixa<~teDHZlU=Q$HSfc-T1kn;>LQ6L4?B!LG+DfsqB z*hgSe1X7}qEbtgya{T0``-prBJmtM!kLi_+SyKhl2JQ#%!hHfJ8G4Uk-sgFY+C3gG zR=1RBsQ*3cX^8GpO-=qjnUsMv9Cb@g56zK+{3DRJc^-kdYr4s)Kg1Va`YDOiqLG3) zeYBOHbW;b?p>Y$1N5S+UZle1zc!$g#Jk1b;xkJA+rke_z4#m6lP*puN`$HJ|g7krm zAW~z~TW8Ie3PwhrTj<`les_bn%-*4IT96q`Q>fd)8`QkKXVY0-`Rn8}gHIjE6u4*c z&0q$&(n^QTXip~IX?d~`rw!boV+Is5!?_A4E0rtYvtX}bg}#9mHxsC9bh*hRwajQ_ zf}1IjjVE2;I+I-uiY1H>*811Y!k80Uaxg5M0l+A9~%Ql18 zGn;8%pq`8RIrOjb$mTSrI5~`Yk=#X&m&p~l2$=U zoxFG#f@jdn8@LcWi_L>Q7d+3&1wJRwMG!d*dmhAjqI0I6hguGv3x>^&b`GBW%y|mj zrJ#CBNnOQ}_IY~c#^$D9Ubwjf`M{j!2zmBj@3d)nnY`fhpnE2G61H-u(9TDEnpn}P zV8K9v!13UTV4*-kvjwqv=%8v|xTg#&zW}@w!F<$DVNb))2eJUMCOV7aG4h2i&PU!m zC+K~e=LC9s7Yr0aH7}^bffF!f3y?W!)e}MKNk2b0A&Ra}(HQE%32qmMV!Au`4A3xg`cISQvJ{^8(Z zaL3V+Jx2c`^p)-r;v>O>rgMn+82m!ukE5jc2${pw591x7RxEG?zX&!G-9mv9=o}

    an61yLrqrv^beZ(cH9Dt*_go)%7BX^k0el$uEOQCe2 zWMD5D*?rhj(Qz4UQS{Y!4|(;CvBjtzCa3ryPb6_E&OSOHATEwy7H%Z(QuNqQ&ppB2 z)DD2y%j3OEQ}udB!aV?D7w?1E-NCYfGJ)N&N@MpEM+V9T%G0L=aRr`8Cf|=%DeN9_ z`*?Qo?B$dpC+=R$?FyEIE1mLK;mdP&2X~-dAyAS0Hkjh?_T@NrxNJxSg|V8qpVr+ zJ>GU$mB?-dzbm+f-c^`kD~#=?rf<-+noXHX%%*B(bSk2_9jtojROW0Z-a&l}R()la z-x_Tzqc3h1j%r(jo2geNsz|&&C|e~^4Syq*ZNYa9S=q4SD6Y)A8jp0V2CCEZFL>2V zr3&vYFyE!VIk<_u7jMKD;=g<~X4(|oK%eTyts2;f|9@PZb+}dK^Y%%pwe|v}rBgsa z0TsKD?(UH8?vU+gE6=X%yWGjref%s%Je zxn>_n_5)(#$KyYxhJ3~M^8S#zrR{uZJb52FWh^Sqy}_qw?+eNh|11tKUTH98L4D|y ziUX{-fbi{3Zz zH>!c%NH4W`Rp<9_3f6+EgCAnnk*kC5S~NCTHTAgO)YgEj4X-wcT8=a}fU1R6rP@wi z>}oLeowdPAGMmw=4rU`=t~R~eub3fnX|;OD+1M0jg?>)6Km!)br!>4Nk39uMUBNAX{hTZ z`0FT!B_Z?sH$9Z>bE35A684=vMsPu zozGQl0r&;M9O7-s&mq>vI8tlHYhEyqSSxS~z9)e^-JDlD@^jE=gRgj7Uag$D!CW-jl5N3hPtSAsU2U8W z+!mnbQ@J&^4T!nHEYS0VcwT%=_7l@-g`G!URogjp(3;JOw{v;T!0$*sDa{IIf}YFo zZR2#I_B3*zaNCk^PY1Kf&ww)*+ZJE!8F;gUX+b*}bAqYZ&S*^!+B+TNIKoId{7&ON zhrG0B@eQNXgAPt77#$p;JMx|ZMsFcz^PYmjEcB<_cWTg$dhK9HV=B4MRO{q)bEXHA z1KG}Kb>iC@+%(wJ!E^-Q6~D7(x?($$n?ZJJ&>e3Qwi^g_qB@=IZ!m-CWW#hNH-(qZ zR8AMPrt>54xkn1mndsb+Vlr!z5_5cF_*P)BDn?{37VV5Ok=Wa1O}PQ#AJ zPDZPT(~G*}!1Vz&HkcUnLaRG(;bkXcCxVyliQgSYyx%>pXI1Fy^tP<}nB~v*XZSPy zPHqQxI#%9vzVh31I&x%Z`Lq0X#O9K3?RIiM@u&Hd!Oixk`W@ZQAUe2RiMQp>vD{3* zt7&v5-qD=`Zx-=(V7r59$DK)~PS{SwW{{hL-^IMnM7p?BEi!}e6u%q(WH4RGOrxgq zT{)e>cSUiEKZ$zXu;CGAGH+>2=G)B_yMyRrm`Rosr@QG0C&g}@9>gZ1*Bv|Ap9rQW zy-eUt^?QJsgraagK~5kqt)A$PC*KPj;<}LSgU%Rq`nrmb2iFVUco-A?@!ZLL$Kg#f zI{|+p{y4t9VUMR`Pq#PR?$qjo?pR}qGoI6n+<0QW(C-Z<y0Ol^!xD|ZOE~(6&a0o ze|HR3`+yq+w-=bPWJVF|M@+d<;6`!>kncxVqx=!Z?vK}>GYW)WVvPW)^IvQveGDWk z=Eo@Zb(I~6H-Ix7hH6P?Fh~Ayf0*fvzz!fb3fmv9*h9&FOl%mjLB<%wTa2N^hwvK) z8fK(%z=8Rg_Ymw5Fj5}~Y6xejKLn1Byun02c8BUsd?-g>#lz^wXrWJRnEx@np>f!c z!N4Lm*jR(efy5X7V|O@p23v0<+!5|Tf1sgchm#v-I>YI4kWfSisw*^yxg#w*+#O6t zNFkITiB5m)P;q#VA=l5?1AN7W@5fO`!>BQmGteJ^#wfJ<6B~&gXt^=&Xtyu1vBY{4 z8*BK{sE%?K>jQ6q-`5{al@a)3!H*;-{Q=yO#K#cnYupiN4B*wrS65@X{p~%@9S=tA zaqvgQ<@%u8k1K`vBi&wpZ#wGh3n$wXjR{tH9Cdop<9NKW)avbzca<51?j-!~MEd#T z;Egwovg6#IrqI{o!u9ccn8rl1J;+UTCt`b0r5C+Sa3{mO|2yZKYF6F~Gt zp$k0K>q@*E-ek1oiLHpRQkg=0Ds~dzY1}S;XI~NV74M8jH@_1{N?nZC1v}N9PEOGf zH_e>^OB&ON3(*nm3~F_x<_vc>x%Nc6;)^?j)4}iH&va+Horrbd&T?nD?fiEBY|!no zGqKa*%_QEzZ%?((eA|PYX$rFKVT#|5_-t^>D>4g2d(#v~oOsPyuBxenxttmF+W}qS z+ku~r=Ks|Sdus2`f#1e&bE7^j`%Emb>EuP*8hYWt;xuWHwS)O zv-7Ym!Oth&%Hs3Lwcwt^JR{>TlD6*L-&YnjvQ)eB~B``v_bc5Oc}5 z#Wu$e<1PI~s64*=JCdLcD(rt?0*l*-7GleDiP4J}L7>=S#O;>#_=Y-f5 zhF<2bw2m5sZsa$B(b#Wj?1p}QG@25tM@)99y8^EA^|(zz)dLeo>c^qfpZcw9><09- z%5B734C#v@yPSAK^Ob4ntDA;s)${B4tK2p2YHF>-Hb6;;dRVcQ6K1u$&aI1WfL?N1^;Ws-;nX5hpKonr*2Y^)wYBK2<L7Pc`XNxM~)yf!*Y80#n0!l--QK#_H5IwHk3T z^`W}L)S}9IbT(7FYFu8ms?k|(zY4W#qpSRSw+in%#MZf6+?v!Ae zZ3a^ny9MSZ-kZs9akrvTnb0F(RdYkm-lzNyZ9B`!N~5QMg@+(<+zo}ZzrSNF85Qu+pwRx zyWO&WS@M;*;Y(WOIJ?M|=e-+TS<@&FqMT)Sqp*ug74SYJwg+q(vb#~NKxBuzm-?lt zxrZZ#PhDx2BliKEFt?XnsQm%I^K-bu?d1sdA-KJ8OIu$bpjHl);$?WN*LVF--7nqG z!R&VTVfVTpkl%;>j4K;|_WaM^hn_H>TW6nR-}m3Aw%GgJFSws^RYw|Mq5m1kugL5H zQ`&zI>=*94SjFDKhI)I^`2g>IUmAM9!}%Ki9`1*{-zN5z)%XgfFX;6>`uM{A#{JrT z%YO^(*LYvL?}1hHUH?sf;RpVgaAe;B^EQ!pdFlP7yC2jSaNi>)|7&n>!+P8Q*0lD6 z_=4WQqtDksyw82zG~NRB4Q$noKi_~>UR7oH!}|uds=mPy?hUfyzG)Fz=?M9)tJpVK zp}&f=uc0H(_xPdyTUPggdjQtA?)NZX2lHK=Ek&QwQSMFa;d}QDzZCo*K`b6+K|xaz%uUkv|O_htVj-lYsvlFEmy!jHt&#jAdCzl497*a5huh#ho)q95f- z@>_o7cf8DR{t>0a?n|J>`w{$MPI2>J=KB&VCHr%wm3M| zlmD~fe>N+H(Er6WN}&28M>UFJOHiXI_Xz02aCKfJ6WW(R=zWA(5$sX2hp8OeVy5*1 zh!SWN_K&*9P2~vrVnm9PkrlqE{{mVsfqKCz7bITXG>?%h>>q<$7^`}Pi65h85im#L z>Rp)lajF-#exE1)oBM+QJh78xkH9_-?kM>p{z+^B>?!Q8#8q24)%?xSCt)AMSH;49 zA%{9`arxxa(S?-xY5kY9lF8xe5|;uoZ^lXzmC1gF?< zymX$od_L-(rq}$~Q^X3uD1i68|2r&sr-^77Wr&sVYher~LEa#8=hdk+0v_~+1!1N z=iE!wIn7&2*|>SYopmp8&T?eWxjBek1a}5cs?xhiJZBvCGVinQMb3E;7v1b&F7nFZ z=K!0-zrs5UHn(xb&q1Z^^dM|DRC4-R{OA0u?iKerKP%bn^mz&IB7QdivU{1|kd>2- zOsJjRdJ21!&NVQZP5C)$Uq&}88du!w=wz~Z7C#fQYs6G5D_18AN4l5LxWQ4~o9h9ZMN`Nu#IE4qz|R0Lo1ekYh|YDxT&3Q1u-Cz+r`DfDFB$I&(VKV~QMgVI zH{4tBGoY5qzddHZw{ zLCb~j`40X);;DRTxcIW-#<&rD>89lVjW4W&chCLXO@)nceByt@NMRVCxLCs6b5rti z{S(m-p32y4ydHYO-6qY z!Q4a3fuEG$|Bw3^Tv9L(Ehmi!ZgTu&{xj75huky%BkbSAAA?CkMpj6%ACh_KK0-4& z_Q;QU=!lYCL)uVZxa7s^d6)B6z&sxO6Vsbn%I8=?po`6qc*r&07 zOy>#Te~3PgC59*5WAG1&BmJfc4C#l(1ExO-^F*O2Ppaq*N97iNlxdP)_MI;-4aitF$WOye)Bs~Q2d zBiNK&*Yc_pgX_WbW6BE`AuBH+8v&<$gs*&`^A{Oemv{i5WF%&6oVXeuIVnm14!N{w z-XZrFo*PMnew2(K6E4Qvi=^h2n)h9c-^HfIkAO|XH+3W}`3T>%e7(rCaZ%Yj@P$kp z$p9`@BuW*jJ&Wf>(oySAYNm^%$4^aE@wE79%*xk0LOx^UR_tahJ^oGljKWJ}*>r|T zgMNCDx5%YK;dbmc2;K0T7HmckH)2BEj!E}6@0;YMDfV^VnZaEneb32y7YGgF- zO{=eWI@7rYKRrCDq$7GKc0G2*Dqe$^3C)a=%zUqszeP@p;r9l4{hk}Kt3+;cGlJK> zN$eWYjFBvykb9kokcufMmCMGvLcJTYEHH)0Z1tYwcU&_);WD9_HS!$aEX1$kXTg{D zbCE0fS5bN{k}YyMc9HjWw6fr30iQjRgKs9j+4&V&iCzGklUGK#xrknXlMQ{3km%h>a=3uxvflNHSzd~-xD!MMmTJCDsp?i`p) zTw!zIUnHI#wCs7)IEzMZ`Z`>l|EpdH4#Im-y*e?npk~>gzmuXJUED{y{HNKMyY_xO|4sPyF{-{z!hjT;R{a z%|)HFhE-MNPRCB6D*o?i<%M%5mXF-;*!*#}02NQ6UI3-Mk%Dl3Gu_{*`8)3dk>{zI z7qtTLen;^XF`fJtJwt`#v6HdFaF2sOOFlQ87woqb#O5b{DptsJ@`EbKD^xgz-pSYr zSf^r&D=J)mzEaH#`waG15PyIyVC;fq3zcQ9h!o>hEb?pY7tYbx zOGJv0If{3fTig_-C)A6Edy!Z%)nRU0liHf#*3|WH9L-vXbJa(gt1iL}^f9dFt%cBp zwI-jBGjANuFKagZ2=mF|T(c&(H4*(A`RAEW*2J}DrS(0@If7PE>KzS!A^IY^(k^1t z(uKgEU`9Ihj~MTmX{+|Hyu#V;!ps#*`6x5Js-!vYLXNr7SXU)@=15{GV-xSrgko;cGTq^U*KD)h|9^7)?h1 z$h>k%^bXlP^I>wDtq$j%4_FoTSdwXE;dEZ+tvV(6N;~XF)78>AKo6RC4(F>&@-78Z zbJjmuHk^Z2{uTH_Y0_F#(fS47naTlrDrGa;rKt7_v&EX=madLEIRHzsSDA^{Ja;%p zt*E%KF{S(p^UDXBMSc}~AZ|um>OU~8{5`mD!D%A7B(upsGTZzrR`cH9F_Rt6J|D1o zW=&>`p^WCE_4=0iidQ$O?;1a@DBaG$0YFA%rC#m-10ZX_ma_^b~p#F z`E5;aYtCD<+M3eVM7Q)l2m3j5(u$SgtJ(1{m}1_;_j8-SmRcFIny>zX_-A}SG<;cl z*iAP49h!gMLtYcz;^?i(>@c>6x|)>!fSF`XcJDGBRn#oD=C?J`EwpB+HUF*oY|UJk z$7+sSxm{!`@ZP~&)6YA>YHGU-F->D@R$6b(T8A^*JDJ(m47O&kHLI;z?r`RMFTUo& zl?}ONsi%qXoy05fTXr!4t;uc8U4M$FsqEeKQy$z-Y=t=PZl;TO+Dx}%dVdB|Q_q_7 z))cppVrw=$obaxMA5L_OQ-!;QoTkIKVm0Tz)v9mjH&vqEcAJ+DXSk(S**F!jniH>J z8k()vO!YP*JD7alMn%m-tMV2wRXCNIvDQ?#>Ik=$cvUnuV>Jn_x$dfFH-o8)ueof^ zNmplzS+mtrtqf`#`OWBRCVVr||E%g%i<{-H2CFJF#aoyy);#tmUg}^Y8Z|kUh-rF! z6Uv*IJJv*c6@J4O{&v-E4!jDnE#Nm2(>!?StDkVjx(+zah-R_(e}s6{7rn77tcw&v4AE4DbYYrrWl zl{L&UYZhB`;_J|>jaogrtrJ<=Wu&b+bIpai*1XYgVhYTX3m9QL~k>htJci7CfPMjF8pk`?eS+}HM`!5 zye7dlM;^|BtFv|%6+?A2)!l|UW=(0gK}pE=k z16<9q&&Sj3x_S$H)ZDtJ%for}>G0>FIs>-qXbxQS<5Fpd*N*pWtEC?1F_YbjS!+$A z&m`ZDTsT#(iSb#+X=n4;;%a_dbL5&C*L3*|Fr92xTi9vT>kL+L<#pQep2NE>HT0XN zg6U)$%4)*AGgdR;nn>>qUvX84&v(J^zLbcZr+F)?9W+Jn71Ynw`N-V~RVRBiAf?IC(yWm}bGdQ*$DW z88+|TgE??%_8>k9j%MPgkW~%MqfewKDQVhVbK;so*K~VNrw_Ph^h0r!xVpw4~V^e;j_8Q;(Ct zXga+QneL7z)_Z}IKQ0(cc0w?Q+lQEX98XMoW2q)B^&xz3rysY6X^*9czJ?z_?UBJ~ zH2b4C64n54qk>W7`=i#wX6M76q}Ll??6JK2aQd2RFR%mP%Z@`$IYmYV!$D4>zv1*Z z0IrnB2K~s7!HzaReDy(T0D7Z93)LTmFt6{(V4yRI>b>nZ_Xal@^l&nRz^U3mt2odZ z5sV-<&^nXSFzy&)!j8s{z>efA#$Y)8u)+`Ej3hJM5W~q2!XH81@Q5ju0mSthiSkgi zMg>DSeBlo@{?OoK=VNCG*`e4_XBavk!xNS-8iS}l487q*20BA57uuotgYkz2AEPlG zI~aec)q{@?9%qpAF){f=O;_*1@;G3K4HpU()fmL3Gt*Rlh%*e{V6=xh!|?`NZb&eU zw{m1TL%1WzOLru%kDY<&jIfM&!$N(-h54c222)K(h>>9WQ)ejt$Et)K5DY|PB;5YI zhLG(KR=ff9ES=%b0C1zMf^cFCwA?7u8xoA9=16A@*kSZE2)z-`C?ZlE81%y*gD=%F zX!S#Dq|*=Fz@QJgan5Ld!zk=Xt2Ge4k;F!E#-Py`{OCA8v}2sHPVb<%DGaC9c(}dL zQmtOx@t}KS#qEPt^)X=j!s(0Ok8dxoaKaBDJ_=3c#u5`&U5!P#H^_0=K46rY$Qeb= z3C?7=-OwKZXB3Eu;76P774(2Jfiupu`Wbf|i1AKO-s4SqBKfgS5BxsV=n?b`#Fzjk ztk;XaC(u(*Y*@c%(4Er@Mo-h9gkle4>f0-rXv`_j6l_;~sj5m>@O@!+!cK$Jm3L3e zO?0|rr5b*_2a}vhrr9;djgl~u=G`7M+A8+8jh@}BNYbGlGP zwWrZ@XAs>%b|Es=nM$rRzWNZm8?`2*HiaI#(dT6THr@CeOg8@Q}omJ`-w4-Ksu#=q*M7n`$kIqbI7OW}oI@9|M zNBv7nwj+#L#M*#UA8pX+YP^ngqF%(9jb0mYpTL-mH`i$&v?bdK{f@+^<97;XW80xK z3xuk4A||#_)9GP0w*&9CT*Xv#uGQ{@okkCxQEN^AbE!0w$ZTi6GY30^K0Cr|OLyU! zL$0;;&;dqk)H(!n;Izhe2wHJE1oNoZ+VE}YZ7yeyBaPNnR`r=g^t)OS`-GgTN>^1{ zTeK~G&2?IVnU8IWori6M6?z`0RnU^y0+{Nj9r)SgL%mk`^YG_63&FMEJs&HE6k8He z=Plx_bmmi|Wv~FoM_^i;b{G>{y!qr>U>9OPL3eSSmA?S5MbHeSs(oZfoaP)wnh{Za zk+aCqip{6yB6tg7E884YbL5xJ&hmw<1|TXq3?DK9h?MHZ1$#qhfj zon_8)r%})l)s{h%pfS9qhEpZ^>a-DdIY{ZKhsDkkbef>jj2;%#OK2OzX@*v48}VC~ z(RWkoFL73&EA6FLaS1h>2T~MvIT}moV+D5!XBn@i=ro{4Gpg4|aV63CUY9#74cUmS zxQ)Sy)fAjiE1Xr9Z%AC4jZl)-N~^xoSq;A~s=}*o6SB+UGzjVitDH4Xy`V0c#(eAX zZOB*r2G&V!ta__Wc5NJXC05*(Xb8O`&aX#}`uO3uUa&e2AMdXMzs6b1cLn^0@TH{s z_32|JvHJh3Qzx$88oFN%N4515b`1)3sH2$lWQDIA)PY}{_z}ZNh>f|<&s}U%sY)#(PxwSa!LCS7`Qv;n%_|?d5b~ZcJgQ`|ZQKXjTn2Vrzh?$`NKWsH*r|c~=Q4qgoSo74y|c4I)+XH^JM=4RhOg zZKUI^=vRYPnab6Tx5aSEi?I!DF{HQ6^y95^J3v$*w}W>jG`7XzHxpNf6@yB~-AafMQyF%JpgiBI)K~Aa`kj@CRtk0*N{k)!A;pTpcHXi( z$ZdCaJG;P_hqoL4Hs@2$Hm8jJ;&NyUw}ak7y9@kISQStTH7j6uqOlu|a@5;xh@Iw_ z$KPpn<2hx54}(vgJz&dl%As1GNLjw+h<}RCF6*Eik=@kY?d$`+!zqnl9^7Z9zK4E3 zq_5AMy`Xn*Yv-(=$FoZP;Xif?^*m^^n`m8`vF>S^8E(w5cvgl z-zEAEu`ivsc+0+xeTV3m&No*7i#RL)ZQ}2uuh@5VsZPJ4>N~;f!5dWCZ_3|V{CmrP zYd!6EzBS~xpoM>vPWEGU-hlZX`PYfP#rs>sO7qR26uJkT@10V?YuN9c*NA1y=wcm85wI9uc#`@Oz0qm=$ ztg5Ag?}?Oxt7qgfp8Ve)#FgeT0;&P&*r@m1jnx2P!=M^D+Gofm^*WM8&^eg;vT-+I^-e?`9- zo|InVTMW(-)A)&Bp&rEj+4+?kFJgZt`YU=xjq@w|MZtu6Qa)n!j({lw;wWe_UNoH| zK@qd!7DelrbDSOuQS~@Fzu*@IaTJYT?Hr|MQTjY$Hok6Q`Z+=VF!cMFL3qi!q*Av9dQc7Ip&<8zk?I|Bgbiy+FDn{~NJ&R1oeT7m10D67J;==aI`7Q9niU+|2knxLNH8os}Lg$DI&=8J)|Zvr^$X5Le+{bgmFl=0AI#cg7$KzcX8q0c=jR zGT^KKOxUZ=RpVsBzit(-JI{g3Vn?q`#BZQ-8RS*xI_DBzcB)EGD$-LQ8M!yeXEf!| zzlplKk)B?e;9bYRfmV9n*@E=^9d0^*!pney^l#wb#9rav!MlW2ovXYvfl&=1r1B^C z8t*^3>Cw97+;X0!Bk`^hy$d!ioQ%Y75xYTN?{r}Qi@_vGV_N{^s1Ls*io>qzID1P(5YtJ1J3%Klh2;M?HyM#f<~_9c zW8MjgC2(bv1^0|&AsWx%KQ^t0R_8IwNnkxe{W024 z(M^C(vLI3Lub&vTL{=*)HUYRKe3egvpOBM?mwHS@>|eNw{)zCURAis%~OpkA12Tc>+F>`vuiz#Y!jz zc!~5vQ#OIFcp#Hf^!avu>(>^`F`6_UaIhltdkfO>`Lvs8z{Rdd}B8?Qa}d?>*EWppo2l`Ava;&pHp_yYT;l?|}J>_*=2FgLQeU#(mf^wDn6O3IS5ckR)D%v zHa+!j@>18=@iT$-P`Yc`J7}c^kq*T)+>GvRQ0d%E?k#M3{99C!QaU()`Zw{Ue8U%3 z{XEN8`CE2xSv|c&ta_AQM$WVD4Vbsl5JwSJ%}A}V$6LN)*TIXQfoukH8SIg+ldFZdVz9B?vmbHKR(GCN)tyes6gx!K)|*z9gL>?JB(;V2?|$zIvqoS@Ws zE;twHCmZbSD2knxn}b|da+m$A*h}zokjo11l7G&$vVo9#7+38J^qa%Y4f{L@>0L0M z`pnJytbZQ-MYEw^PU`1CGbh>?$f3(KvgR-2ILU7)gpztHYZDMVJi7Icg7I_e+u3u6m% zPQWQdv=G_j=m~e6&I-FPkX5ZB_#s}3C&bY6gSocv*;%KS{d7t#L3xJ9X>sPu|+e>P32{Q~k= zG}TctzAuqG?3Zv$z$nVMxO*61m?PLCL`o9>39kgU7`|#AwmKnFTH+T&E9~PX`Z(+# zplJ1Y74)Z=}=tJndOiT(taSw8Svg{9dufkJbKl%s!m)%m}WM6R)kt-ROE5+ZS z1UV^&`agmHp8RXX4iI}4{13dOeURTKrPom@PUcPb2mf2@yzU-=^BS2~h#mm{8dmSu z(NRtH`#sp#h~?y8POI(|ya`Pwoxy-(mNIe-jPa|Lea_{!Mhgg(Z}} zQu#0TwQ;|;e)jvXqx&v8UsCTK`gp^A56v&ADF1a==x^-oC-#;9w)>9z4OV>Jx2g6G z7*%~2?pOZjWYy8Eh_uKR)?Xc!M?g#jLIqFvSYhQX_q9NYbD81!=i1r@NSAJ>h_I-Ds_4|eY z8CICR*4MlAQkwf7{q6HVg!dj=AGl?>`jw@LywB?c`@OqS{DvNPV)eUsqEepRJD|#f zdmr9D|5JXi>|U&1WlgiJTfva~;D1I=x_i(lgOx9wI#Fz|zni|x#GTT_%M$;Ls-MCu z$9osH0(K{neQ<>+OBdz%9lPKP^C>Ey!urfFi_&gvd8~5#$ZRK9iMKl3OKvBz@}^RO zsFY;Oy1Oi19=ppFWtH0vLlJ3~cPoNbv^?MP}#%J|!;z0=?9 zi@%+3Wy|g4y#-ulJHqQFt5;RN75MIeR|#8%*j8#(;k}huWw#o-n~Cfo79uLf;VY1< zVLH`_NUN&5iCQ(V6;av_t1?zueYg6XINLb?S?Q}zHLNh=N@FvpI`67Pl&Rs?iGL{TgogT90;Eb1j)VXs(67ksI&VLU%2^jocb;9qO&6b{+KA zqFWog9$V9`>(--Ub-wl8HU4U}>VZ;M^|@iawQ$z@YfxH8f3?ZiMSG237b|Za@70!F zWqj3L?XQ5d5sa!gM6Hgyil{jCIjj7YetowQ(HdxNz+2%ra2vR*{ZK;;X*UG3(qBe} z^>AyGUkk4;vDM&1oqC`e5?f)h2IN-wVWb|vX_c@1Du21vlND|ywxQeDe(f4GmvWlm z*QJLh=q?4L>~i?RuHY==wTkaDi!FuU1hnvt++|=I!(U2PIt{4V6szB;nv01y!(U=r zA$K`78^c!ZX4r+;kIXLfo5OG9Hiw}qO-*Z&zr=6hHlwRX{2iA23s7xNW{K%E=Jzl2 z7lKi&5v=B57yFCIs=hKyxjKtEdM~!S2rI1g#cc|63A}}dTI@G99VrR9m|mN?Ev&cZ zZcEvw(a{^3rL6j{Fv!5U2b{?nnGq>Cflgl6M#rtGVTrk?KOY&E3`<{e4=p zNxLO>K7Fe0eDW=bw1P8__d9qncCE0nz7H~fyyMV9o3+(j?-}(4LwIbRQtg6oQ z=lFAZEd)KsS5`6M+VK8_sABW6bGhnGvALW!AQWp$tR?UH#Ab8bvMIbZ{wH{C*d9KI z-Q(&?y@WltVrzIi!?eM+1KS499O{eH$~KOxdV4fxQd7IhwZA;9)gE>m`s=`c@R{r$ z*EaJRmeq#yS?0GzbvAEpF>gnHHvG2mI#Nfw&Xt>KN88WEX=fUpu~Xs9K}ood-1rmj zNpDZpj_gxcr5XNozT!-QF^3)B?brd{g&Nb)n8D8Qj(D=2u-dk+eeCL@GiNGs?K#&L zbNxDPNmr&DcOqU7>?Eud#ZgV|GM`4(>3loViFTE1pZipDU3n?n1-y2oPvLe!Lz~Y# zlatj3b!GJJ3QqO4OIcU0!@Y>O+4EZ9wk>t_z$gytOl3oL!&o2KV~O-O&ED)p4|lL@m%4VVYYTcWFxu{}n6{oPqCM-{y50|-_N0%uE$8}O zW2n`~cARU!y6{p_op9&+XgGbTGuAe%hp|vcTi!>rm3#o~5oE`+3w;>h34DiR2bivM z>QbA~wb^|%f1m#ReMVAufc2q`>0{8>esyht*KT)hMb}RA5o`({1$!iR1eif+4m0#{ zdL6`m_2J~Ct?UT?XJTn%`yhG?ce96k-G|#g_CeO`Xw-(-@6ir;k%O8TT&V(IGe5iEfvrAoj-?f9CP4c$GJ$}DB z8{^qWuHOa*#xQsvv*&yW8_n6=jz5y!?ApuDj&@~H>5E2)X9GPvw!*U$T|47P(xdjY ztI{Cb!LB{vW~*&Xtx(=X@~w8^8MJeKAJOz9`%;WMBCG@-leKvA%r%=Yma*$eC>7D zUijYhp&jylZ8LjccD;|GMrg-?S6n@4+q<^LYlFLNPs4=$Xcznhj`SyT<*EO0f4i94 z)~@~Zp`E}>JKe+G@Y)XF+xEHZ_fF<^vq%rNsrP0dx_FapPy0lyHpTZOGu}3`j|JPC zeeK#rFH8^c6OAw4BzGF#80-x8xpyKr6<-_R)yGt_FK?apvjK^xsWqpw}=>Q|a#cl6uy?o4(Xd);TjjNccp{B(3qV*c6Fo8?%_WA zR_t%r9{d*QcK|noOh?``LC%MvPFs@ICVN?Jl2<(`ePVjySBly%--d1MEv)P2;M=k< z{u8U#0@gy_&C%9=du6rxUHjv;YhL@{TY-^oYjPjqwF0HSTHr4ru08Sdu`Thn?_L^9 zh&I8K)rNU#hWq3{Vz>Q#tJi{E>(XgTjin&wp`#A8wO$NWn}^jlec2^!mzR!S!q2y@ z^NZNaE`GR?Ufb#y!*7NSH_dBrdsFtcYoook(<>_*?wi-{ctxbRn9~ewxO=`ab~!ue z8=5O#!9TTv{}9h{b<|1u!=3?F1H=^ zi`eC^jrrOo-;AB?>T?A<)R(dkUNyA;eknWTo1wdi%xYsdMN@n1wFh21@t32hP4p|# z)INDtTtTc6G3}6F1+%_&r(O7sZ2x<_)gE~5j&HzOY5U}tgH_kH!8O5Z554MXPyK4s zS08JsrOou~v9+-4;I81V;jAVW?zGp&{D$b%;w?qf_|@p^H`V5Ev5voI9X7CQM}GXid}(hWql(&vUx(fIQdv)b+Gzh@om%8- zv0Gg+Vb;T|MPxm%nub*`YvX#-F8%NM4c5s9!`DQiw(ZB?08bn3H({${wX=Rb zd)sTW-CaG`U}t+xYHCCMCfir9z4cPl27Fo7*Cu^cua2hn>8oN5e*IY%yPZ>$R(1XES@~rK1h@ven=T9q!5B%ue`iL^s-g{mSI3 zvZ;L=d)~Djew(`^Zh!t3c-n1WnS3>_HrrR@R`R!^Tg5U}j9s3Xe*Z@5?m)YeVTA~{ z`^K>YC0V~u6a@omT#O5$W_E>gU z7tp#8xy(Il@$9CV9j(jgXN{eUT#AI89N=?MKYQ#lk#jJvkjqNs5?1l-;4cx4ubC~D z1^uh^^qlGCBClHFXG2TMx>q9Ct-gMR`o6}=0_Q53%-9_8GGX=WFTl8lW@faraik^0 zbFmDuE0G&yF2lM4KP$1!#IBInI|~|_V>e)Dz^XTCUITv(-jz6;C6*D+^~lXQ+;tSy zONLnb*saK)aMQ=GgTKy+?<3x31f{;zeLVT4TW~U> zo(?~=aWmrUq$8TiI>=x=Rml)b%Wt{Oxe<95PpDgwJG@haeGdK=yr@;VL*F;J8Dr1F z%D{P+lRkEvn0`}wyjv&lShS=39}woHQ`gbJM`Si&`41=%EpXlLm!!d{f7w z_|lA-RrZeY|HQ_uLKLgMWmWMm_HHCK?CAfjUg8N8D#UoDj(OBpEPQ*^(@{;uJo5kf zK9NvYN`Es}`6sx)S)i;=(!^=qi~MDE{vt1p7=D^qD(c*$UaFXn_2C7^yh~OJQEG*C z|LZ$-EJZA3>^}LF*n8Mi|DR0>;(p`-{21B$hGSHdBcu~^`6lPZ;*d#4N;_CJh-oKp0_=)kK;6Jg*lZco}K_$RGjf*A#m6XV%NJ1}3?BA&BKaD<( zK0{ocB}3;)l)k*jk*86(p41Y0i9rc1D~$xQUU;6;PXaF?-V;f3Qih zrXPJ0eFQcM*nfE^1oxDDBJz*1(s>w_%41?l!HE47q@+?ZtM&|E2bHAM_$T^+ob*z8Dbf8K_5=7S z@YGK#YASo5o>Jnau-baxkNySv0oi-@4fsBY21FlNkEuKtY+zaSoQkE&vJN&NuBs{V zq!TmNJ!+(a^H-GNJJ<=puuc*{~VGDxc9a6R5K&&7%h8L` zY*f1lIy-Sy&H+;WW#`04vXePa&1>+^b5-jiR)~vM?Huo1yw78EU@urc2YMI434M;6 z%lgRfUE(c$p@hu=M}7`3CpR0l#5qTgxx75Y&w|NGPAbwl&sW@>V6%g`96b{~4JU7$ ze*r&-mz$Fd?pg3+geMm<9eJ`sg&6&Yob+~{zez5y0C8#OrK2-c%S}!?>hS{H-=lvJ zJx33@z~lp+6I+0r6IMR&H2E`}ym+#wIjVCCdybs)Qa_8$1^zsWC&3jYc9QJ#UViTs z==^A&CYK-oH~fP5C$Q(h=0Upv=Xdh?(8%vS@BI<|4V}~A@|lkOe8f-3*#g9$_X_dN z;}yjI7CjLy;1x#WIJm;#WR)q1UOsGLzWK2Q;`++V`vvbfJav4WUJ6@JC#hK&z2o#= z$j*uA(P$yBC`twJ3&KA|t^8gQ&e7m%iY;hXHH*SKVrb=G;1uB&;#<_bFd|N2uNdbA?-zPhpF%5g1isM1AE92n6;=r8 ztLo9{uTkNDiL*zE{~Y}#`jYpeRg=yU{37@-g8vmy_Gj!-kU#M)f#T29CiFHz$~uY~uKaesyRGZ>*>^nRjt3F1GYS;G9oSiOqzec3q0y;sN|jF!Y# zC(`~2jYE7(n(j-)evbagQU5=ZQMNevk|-Q9{2{PHm*5*7;nnYtXor}C(I4=C#{YrH zEAXYDK7PXgf%B?Y$~1n0RnmLa`!V``^kwgL5XE`_1V`vnWK^RRNA^{EI2b*^{Sl1= zT-BDgI4{F_&3gl03H(FR@1oyE-|*hVD@olS@xF_`W?HX#-@|?lz3ypG1V(fu&Li+*kPP2$Szw+_B0`YqZ0X5S+I4ZZD;eja_xdyn^**msQaw)Zx5 z-ry_$bx*Za`7Q1{7JC!T{n2kw`ZD@e^gZug?~CXc*blIK&8qUZAil6(zQTSLeIMNG zsC-9U>ic1TfzG>N-+}ujy}U;+>f?Rx+q}O9@ix4#z`l!phnR9-823x7EzajwL6~+&Aen@05b)>L2?(DO?5FgOfKKomg^FH);gNwI9mnOD{DrLN~-lx$|qh;xA zH}UfDcA;0E-?WR$<*aUbP^w>^db>I5YF~6`bVsy;R|(v9n4eo;<-zO%pd}~ufUL8*o<}0N-UOhOg;MNDTip&O!OMjK2)V##jSlO>{+cWwfE?)Z-fP^~kS|Ho&gHHo`8)s;2w~ zsMYrxa_ey#(B~@puWP?Ue}np7Q}|1w^}Qz8<=C*^a^8)+#&~tnT|>>fyqlO(L%t2T zjpDv~EsrjXHpVWcYE$C%z&5q2O}u9R^Ba&~iSkmgjlE^YX@XtKYelpPIOSDEzV!8b z7jsr{mT;EAR=%;Ruv}|8 z{DhuVt37H`l%CFP)1A%lo&$SMbf*0U=Az%$YiGAT{mqKDH)dOUoQq~_>wji+8u3n+ znT1k&7}A+VPqV;@Kbv?v;;PgZU8u}cP2bBJA-RaYzFVy)R>Iz z&hMEFw+r=z>S&x9)a-~xXKxy~PT1+#8RVz(on`%XCf~`I|l8fs1fJJEU>PgWHsU?=mp3D0C| zbTfunJ-vzKCy}2J9S?6(RNV*}9}}h*cN}?fWyMi+Jf3i4qhq4Iy*{9N5Sz%m2l$E6 zURcG)g6M-ChgDwjc-!0SYw_Obi8C%b8kD*j1FjEQ>Gt;eamSDyM|=$VzH!m<;75U; zz;`740rcL>8;I6OaO1)C_C_0T6n*vQ^!7&K55SJZ_O}}Sz>MLoIs=K1j1B}j0_}lB z`f^6m)c~*~v7@6Scn|P~gBuKfD8BkquhLN`!?=p+caMQFl4xJF^d1o%&K+g1Vc1dl z1JD^^sNrx&q1)e+hK?eGyg?v@3E6t9w!X>_#!5q4L%@uP4kbF=j<{kC05g*K$GnFc zd$2cz++c4g%mLmoPQ1n-LxICeZz#Ay;D$#BMF-Q<2<$+S8e5 zkFAfv78`;7An@u;?4cZ~4JR(_Q1m~x2ne*q9zt%2q16XmZ#ZX|H<0%b%MT$xBsu^+ zaff*$s4)=L!4?|{TAnx~y-{BOX#eOaFvEC{q{aZaBdI$8%ph|8v7_+&p*B|icw_kg z_KWr=JJu?X@PYYdIekG6ijD?1(i@9rAM;1y42jcbO4n$)l(Xqspm;M0wy|^K!51mS{FKT1FiC~8trYF9Tqlt{;jESo=*3`y< z=@spX=6K>`y$Reg-gt1m(NboDH_7W6?M8l*vB!~}@ITx{ys^Y5P;s2som#R&^n}|R z1$pxO;CJIrHm=krdOe~&h^R{VnnX@oQ^!t52DM7$ez z3S31dqdm!+OspHRDa5*%hHA~5lGF&%mPXgaP+KJQEP8VWf&5p!ocr)-OdDFdFUZ-gL=rn9+>~wD?njNh( z;W~4sd()^ejsCmR&m@?0z_yEau$t2?Hxr&-VoF(kbwqC#@hLFoawmi6ism$|`szSl zHQF0)mM4D(ear^imP~vgO^@g__L|qj#qoIsy>G^ zlY9qG8_xfu>a4@8s=hZ)_sqF->F(}SL`o5mZbT$RK*bL178E=1Yk-u3N;iU(fRuE1 zciemT3^nxc^R9hI{kflW*4}Hq@4MFF51(hw-DhoOdDMLePthk?_hN8Jz1A9Vv5kGYXn&q#Cz zx)I>hd;`D@1fgs{kaHAD{oNzR8R+_In6pBs%&v3@-B7-kRS>(A)x`na*d*r2a_*p0*XX6@@789Wll zj>0cwZ}RV)Fb1LKwxya4BCuqCL_31>S>X z?N5GbOZh?f5Xuu!>B&l&db?iKJs$K}ygy^d1!DCD*~<_Qx}SpyUjCd}`3i_!Sgloy+B6Z~2?0lzekYaGWeCHJ4f3UVwV-oz~@S3`2$ zYdTBd-vf6EnB`ncsiP?xe_|VxwK313v7F26H^jRFy++tS@vbD+fVpx@cZKPT*$D1( z!>urlm0+c^0{d5Rx4R4UJzRH~z1!7ye+8?Es=m7!QoGwVFx!CGN{g)u)&zICJMlKc zr%G0mL+l1_wPB>)0Cj2H#c1GGqT2vY1FEX;>bW(+T4M^a3XURcv3~`tZQMmo^-c2* zuz#ECTC;z_)Osa)cfnm1)W_b*s2{(tK|wx`QBA9YJBXS61E zS{JNmUKd;~)2!`kx(&gGppHdr!`TQ&(K?{&uwF-WGkP_^Z47GSs|RO&unE6B>w_8~ zHn~2vWF2pAC)x;~0a@7D?3tTPM)xd5GwxGL_yYTW>XKV?! zlB=4jioMyQTk&oTs>QjRjk7t}ZVFq1U2(gOdaA>z3SY6R%(vp(LN0kLTLo3APwQ%U zG(4jcvz;hb2DLrd0k;a=?O3T*cH4rTK^0fYtdzD9s|KbrQRUqk><%iq3apfK3+o-M ztDw0JP1Um%&n~WQ_$#|z%qzNz#CL(+#=Hunl1szvLT|g(Qwhv&;^p1$U=N-h)KP() zd#SA)x_eodXHV@ zJh(F0eXRF$DaU?BS@Zk*0oL-Dw@hWx+!IKcikV_@W~yy>aF}{a zpnV9vQrLscq<;iXF*xNduVVX&93)a2Z%Kw$LLXq1aiv{xbo4~Rl_suODSRdH9R?}u zS0%ufaz}`ZbA%cWF%Abuxje2Uxero9DUb*8AH!di9Hm?lMoDIRF2zf*mRd3DIT9S_ zDva+0_7FVj6yYktRha7}{)3=S#jW(TE=ja7I>+G@1*eQ+9wVm6so-Q#&=rDzlE~4Z z5dWSf@E;9M1VykXP%Px~6F&>%Aik2I3xF!>3L5{oaZbQJ5u8R--ojwSE(rf5zCsM$ z6)Qq5$AdHI9{(pM+-Y?WP3B5O z^I~v0$mw#pOV|rwFEPZ&3M;P72}$%v%BonkZPDzys3u2W{m9Mvsks6 zd4}uc&B9RbYo?uwFPqDZCp*5>KlbSbz=U71`4>bzlDuLYUGW#h_d z+^kM&*BMgJ#JG-zpJj$~lSpci2}Wj@-rWpt2N_Vi72FCkvcAsx7WHHxdJE(=@KR3C zIt#e#tZ$jd4f0AMy=4(DGdSr>OPU$EbeBiSTQOG3J1NV-t^P`Z%(>4;|tp%N3<@Ufe*^r4KQ+hjHr z*3Z+!0t+)8@l5b<1(`zptDu(wPlk}Hy&by|yB+smmzMGxBcriy#IDCw$+g(ESmscc z&f?;06yvXb{YcxhY(mknkHus6|_N*24W z5xWU8HFi0cEtDg4m01>IQn}7tRzC5rfyo@oiN;0ra*_WMo}01kR3wCOsymf&H9ot7 z&4%7pJXu3osUkb`E9hj0e>rx6crN@}=fq~AhFsh)peK77Epe3l0vfqcP}ZEFFOfed z_)F+rVV)gkPU6|PC&0;y%|-koc*S$XIevA~s#jdRD?HN$a0y^8FsHpKHidkN=wE=F z5DLIL(@J42|3%``zk0EXSn|jx)d&?u!D%gza^_{6i=B(f zo+lRJItMDsJvY9HS>Y8wX9#hH^}e%sWAH;@3gAD(JYPuOeAv8Twa(8t9Xk~(5GsT{ zi7kjd9V-YYH^Z+_Sq8C$Kf`lsewJL~6buz+6{g-OIh3scr~<@KG0qXs7diz}e(C1t zehOY;avsN?qqdVEl~=WBc9L-x|MA!fvnR0f7ltd&8Rn{`NT?`^(wD{w;}xQwLg1uP z7=$tw3l$F?jU9m{&0~gCtT53c#Eub@{t;p&@E$S539v_Fg+e9JKZGqww*2Hj!@K~j z5~isdrCEq*3Dl0TDjv5*@fGJPVign)9R{n|QDYp56~%uPZZSiY1X~zSDXbVJu*KjU zi79f3T8_mIQ^_%A2k{0jp^* zzVi4=Gb%84qoMU)c>9c7o_xDwJHb~nR7J}m{@&Owbi^+glA;*p$fM^KqkO0`&%A@N z5A^QXb}l_fIq=HmhxE#kcMod1?_}(YRi@@0U@K9}P9l}i+KH0t+r^OTUeHpi%#cSo zu{DIRL~N(&Zljhe)VQ7DxvFmqD?Nj3HR9W_RpD(j1z~qkN9B-wmAK1R23M79Yiyg< zpm`;(8hAIxwvuf}Y%{i6s2Vz3(W?e_YpgnUOWdzqTP;^r!$_+dd||3^RsUyJ3tg$# z#7eO`8e2ebja9*`3aU|2jZp2-=Gewq4Q88&*8*3SxvbV(Vw)ISVl~m(1g;j54Y3WT zBV28+>i9O}^El~9abv8uVgI%AtE!rY-^g>-4%Ib&J@{+MQP1?Gq#Vk(&g=$wwJmRL zY#qirB6YD^%Okve8{@Vv%IjIz3f)0HtI@8{tY+wM5bI-q8+LtsRu60)F7fLz`x}jV z)F|xV)Fu2HVjHlvsqs#f*5c7@9k#A{>f&2x$hF+>h-20;Ux&tOaCce__3XY9{|3A( zh;1bH7uQ`x>M~*I^=9v?za4m zxhqR!YH5gi<4{v(e^SMAFw0^~;59XlkK7$vioYq-zxM4MWUdqYdmmi{8{%ZaDi#&GXJVd+1yg=pM|w=tYQ&AZr?{~&*JaDT+^ z!HRRQ;hJKbnaU#aFCp&j!kFTVVhdx<;&!p+UBtRsXdx(7)0Ehsu?4aD&LbVy!{p6Vsa{;UcV3eyRqXqs2XtV&?G9-n?T(j^k0Xf?^^SRF_@9(iz==_fT zoz?xJHmvjnZOAv5b?eZ)*qm7FP+L=P!&<5fh|NK-H5pa=JXBi|)72WbVr{XriHOr0 z)mEW)sLD4#)($(%vWqzzOk3)l!)y+*Hldm5w};gVe_QTzEW<1`+rgg&O4!-9ZVRpr z{T04*0ZIygku&hMgLl zPA#46X*#1ljrA-eE z)D8S3#&qx4&xxCW))h^v9Feb-(qSqtTD>NbYGtW6O_7jL+#+hXK9|}Fh>Opdh zXZ;Ww6RY&=h!dIdtiUXJ2v)E=;6@#*chv;H~yc9_cp$idWZUQAA{~MTs_g~gHNLumvWB7 z|1%XRG9HyNXpYAt+ZXL|vC;q3*9Wz6tooXYzyD;M(WWvA)+1ngaXk#CA9vL^kX#S3 z8b|zLi+Ek3lxHmd(Ts<|Xy)yhSU+_7h8_v^2iKRF#v@!m#zw^k;8k>VoU2@#kBW_i zHvk>YevI`8_Xx2c$uc_j1F=VmJ{%g!YLvzM*?ctUk$8k2K*jyZ(;xd|Yy`Omns+qw z@8SGwm8*Z~F~bWb?MKiX6%*qJ>|>Vy(aY~i*gP}@o7BYnDPjC14G}D zXB2DI`gG`Vo^oL5888oX{TTZ$_9(vZi9gQzTkIfk|3m*t*8d~^1HQ+YKhAhGG$`~W z_km`8o+t1tI>@d;#u0Zo%%{K(N8_o`6NY&b`%Uayv>(TQhaJRt0?s$F|B>h0*w^HL znjF$r{0SRR;t@^}*{2v!Fcan}w1&g{2JUdv`6ecW)>8dC_7(poPlNdey(gJzJQ@0m z^)uKf`PXC=d0$|7jjv#T#`u!l&xJk*qw7oV zvd`gr0j`u4(drAsEB-m0=R==j2V*s9! z8F5{TiT|c`t;d!P9m*df@rj47_P-y!x6KCR#Kxxh)u^z|IXhJvGFY8FbKcVlm} zelPa6aTJ&LeNgX(v?59jbp}s{+7RsP_}-tq4ois*NA;U%-i=Ym$cs`<14Yjv0|fp81Yx*u{3O&tsSiv-H^16u|8=-()Og<(W*f)lXimKn5396)nMqp8NKa9wb}||JBUr(g{~aOY{6GO zS|eIHS}D3CX$O9(R)M>d9F?LK(Afoko5iZKs)W`~R@;)QfYT61>q?fnVpLdFT`5{I zx-)4P{)%9#f>GXT%qy5jyq(6YOl%i=6{F>dRwKTRwQAZ)u1Z!%h3M|2JxLWnR5IRn z{8ggmS?|GLp4nb(S-AV)?qpt(x#D}1_TeuZ-Ji6V%67w(N;&Qo(cDFJZ&DeMmGG4@ z{_do5rYFTcMEA0mj+FL+ErZqply)W^Ogex1Mk1?ON= z>1gTb0dV`c%9@T8529HrdJxT$)LA}SB3hh#1?--r!)TU3tsL=vAP#^&4115&ToPny zbV_ko{9w}2q*Bph%#Sdao+2etC>1?IUB#Jey`T9}5W-30Ft#}M2-?DwvKo|E++qyr z6sPvXNylIwLi|1|mKJBd|oxubavqxw!KooA@R zv-}$rfSreEf#`X-!bOP6laK41&2!_65=#Q(h=nX;-e{P((5m7bi1T3b81F3Wyv(H+ zWuAm}*Z`Y?O~fW+&%nwD>O49cdC*LPC#@LcEWQGGa)G}P=f|*7>cIW~Y7!%vOSL+z z?!M+I2f-?PEa@UwBKfp(NtcpB(VWaL!iy#)M1$x>kg7#>M8KvnLeWHiU`jEKTwrqZ z{5kP?o4_i>GdVOa@O+8PwGuCZXXKDr<_XL%kS77=1@a1WkxM!uo-POWl3`Ura+2~0 zn+w0HyOea<^sg|>jyHgj9fUAKT{LawNC7F-MdQdSo}FB`hVs1Y#BZ{e%}m_eOi?LGRk4gzBa}wQXa+{6=&kr%YSK#&He)m$ z{`BF0IX9Bhh0}#^N76^rhi@mPi>8m>rVeJ|^k8K(7)Kgub8qFjos@z2jR=*6Gls7x z-HK#F2Yv*lFp7~|5fI^9*z{PfeGCo8P1czdrzTmlnm;4nQkhx>lVFYvm2nUaNUG+Ig%0O9O%j8*{M8pR(#p; zW@Dz@*@+90O8y+IGULyQ%|cC5yAsh8NkRA=;auP^qJAxsrhS>!6)xc~5WCJSGYZ%7 zr5G|bqNma`q=1m>1^l^CyM(I3MMg5bOL3nf%86U8R!z)@-lz$AhR z!g;9Wydhj97E$vp=_wkE*aq=(Ze&B!xlBJ#}okRIYq+7;2np5 z%y=gvN12~w6h^B^xTtB0e=>4}m?FmvQ-sJ#ut!)I11Fxej$t(~4!=;i6qtjNBH@xC z3K0|gP~gnNkfQO02|DIEfHgqSLlT1oh_ zLdbh0av)M7Tn62usFWsJ+~S8#w7FJ%-wgJ;ZD;{<7h+rd*nMIk>X&30oGW zvS^pVmNTvWRI-;#yfR?4-h+1e@P7Pz808IH23`f?yYYyz$5^{ri?JiJi|n$yBb5xV z+!ev^L|1ky9<9M z!|brUmC;guakfROQh`)tw?*XH%6*4%s)cLdtsGY7?PzT#x|6u_*R)6tG&ZAAol%WZ zm8%x`ji9$js-e3Lj#fLkHgMGhvBi8F@okH&k8Fz6hP{dTCJ?pZZ(z0+-Ay*OL~0S2 zMlI^m*hEZo=}EN)oLW@0kxYu!Bvvb28=Q|xNxquly5V}*wczRzuW6_{=&X;_VZ9E# zuc3}bHsY@pt^=!fc)itDhaBr7e>1O#e;x6^x#|k*gU8e$u`uf{66*2a2btC_9msta1Udg1!m)y%|OWmY=%8LQ)K z`RlUwdF~9~9lkUC7f5ecWAEab?xg-E(P4F#?EC;tDvXo1#C1CEMuBF(fW|xt>37UTrT>-ig zdduKx{wJ3*HKdZJ_#2|R9Imj-uu@;fN>)*!my$!gd*Li3vXb>8*5YY2LFvzbP)ms| zCAI|qJ>h$aX)M8~d1HLduuZViy$9PAlvs<&a<4_2g%`8ZxR2N$*kxcBn6kW!;59>2 zb^H-oi1t#VO~WnF`2%|&vt}sWOI?c%E8JpG^CQ2*`ZJ>Fec}7Vi}2hVZb`lcjD@Br z_I>adv6_#!MYy>Q`Q>Q_?+$0EAuU2Elx`qEg8Qv7gp#$B6B0n!>vKy zXSrLWGZ$Yge7~bKpYglh=b6>~el%J!S}^`VOEoOSO1%v{pF`|<)X|!#YMU3CWqMMd z&o#^R?kCpTSh`EKP29E(w`DaOg&!kPKu02Ws2b+2>-^sN4Tfu>S?w+X!$2beqlVsstfDh z#5$v-=lcl->2(c1i0%aHcrg4cI=_M+&(#a;c+2t|(Fx{%0E`rWHpE1H^?O z`g5cYk+E1|$Dq*{1^Is_E~P#&dReZ%C}=H4Z@lvN3O|e;6B!$k_2@qE$1;9mjEVFH zA?3bUamSHIwjcOWAbyUF0@IJEMsKu!2K^)aagossX^#Oj#@3^3CH6RceZ!A{A7i;6 zVcw513hpD}fz0|a9~0@1e`I7Nv#~Hn5|yf-Np}R-K;!l|?tpNADtiR|(dhRJKZ=(4 z{qR4={QJlck;m}%1LJcIz&{}T9ZITOR_Z@+JqqUsd|HjbO8dvS9f5ZsdeWD|sL1z` zZ$UlITA2o!eH{O{k^g}miL$hnTi2uE$EoYP$Z*T|zsNTr2BGvlR+_4F5U6jkPhkgy zp9nvR{g$=(BgpqP+D}`i$Eovs^NTl}p>@Dtc47V&joM$O`WrI^Ux>evqx_AUo4>Ck z%=GthE>L-h$N}+W`wKknZ{-A7iE#Dza=>57dLNMT zpP`lhCJy-9Tkin$H@*IfcU-Cbr5ok%{L5C!6_Ck>(BI?wi(PLm^tXF1hW_@~I|jWA zNPB0YzxS_jNiV0N{QC#J1@LbnF5}N0)|&^R{9BDH__Cs>w=O9lukkJ-EAK5*O-tBR zkW!Y-P8C||eTm+&TpT@te>aj1R5sqU$V%&~`Gwb8nXGZEH!*qx%{aX=mvMa^HD{5Z>4uLw^-?&k}x-{cD=(A;s)7#lt zb(GhRwf;lb+rH>TO$kdy|&-?#{m-ylo14Q+G3xA(|P>TeGOJ!rc-tdOM=G ziPE{nGwYq4fA5$jnl5~ecY=C1s5g}9!x_Qe#!6Lh{jTxOF$-@kd4tG1&J6a>G$U-~ z%1AD~Bh}l>^u+Ko^bXSJ#e;HY-iPWvs(=4^Bd+81GTFP`OuU!9X>WA(hVlyUL$mWP z^a^ia^~UpB5>G|^2Dz@XmPc=NZ}C1k6YpgGTUynYiFdy@h-9)^He#u~x7GXL%$6rB z?|H8n{s!-2Gum5kRjzm8S9rs$H_3W~e1rKVdmns>965;TE%Oz0bHroUl5&`q-aPBw z_H}SstQNf=m&SECdef~p;(B*2{T$5o&Rp-?^$t3Lbv7=&h4*jJ^-lb%y}?f;s<->X z>K*!J=9es+-ux@;1@scYU*H+_tAlhBcoHe;eZSaZ$?845ytzAg}-3A?^2v6n;5KBn!v6fJ(977W8|FR^o?m%$Nzp6Myn8+Pf=`P}i;{lz(=T4ql253P*_PS6g|+DZ$WhvHo}7!~EV` zg5P`pwa4JH8XrU{Ao)FXPA2E(X37zxN&{ zcX56_FJt_}_DlI8ehb%c&06iZ-`-1s)hG>88v8B#9)86>Y`@X#mv8+xEnXQ@D{W}~ z-Yw5T+XHY2Y)SSR9E$%AUyk`+e)BKKeu8~i?GPwu?ERLvjQ!?chOF8Hpgjlr<$WhJ z?Rd}*16|rJup7GRk3zAXitUqD5ULske2o}?8cTitk>24 ziOTG$*vY<+3hcqy!yb(C?69bargEz0|L&)#h@!N#M`JrydonaCp`raD+U=qJ9oogA z9TQb7QU$E`gGjdm`$cx~T-ps%g}ox%@%vpO+Kp0$8a$^eob4!WxB9fRMEg^=QLl1T zV`y(m4fdw!xm1hxo+zTdCfYlq*k<;(NMo~cx3iZ;dskGA_RG|=Ts5P0qMMS|;oAjH zyKS^TMSSh6*}%@3?Y7Tm6aO~StU(Ux>DofHdbBp{4a~L6W)s+&(U;gK^f9}9()Iyq z-;eePX=jo40S#t1&?oFV8WQ@9oj~t{^LvOsWdG1B%(dU>W%djWLqj`}w0r1P_6ohm zU3-kQQ%Z5|e3DNwanp7pi6wQvx9C-iY5&wPFv4mF6FbAezlomg>#RRS_Z9Y6X%Cf0 zX-}7UL*sj)luaw~l}oi~|CRP+4YB=K@7q2t?Zwg_F75cz-Y)GVQ?2p{FHPb7o-FMS zdx!OVp|`+k*Ozv**?u%d*bny>x!z$<8@tJf3}LU^n`j8HePeI4*G(Mu%drn_2BoxIxPH^jJaP=ogPeZXGDSBYt_9sBQ?iSs7U zsNIOF<8|BB$iF1DYImUa5)QR}e%hxf#SihnhW`WhCi?x9LzsKsTeh!HJ1n*5@l{h5 z>UGA;wnOqQ?2Gudv+`Bu+86mc2yL$+Z2Q%BJ;8_&+870`_z4bMUltQ%Ju%^+WcSO3Uvb{g~aY zFR_31Mer}PXLT4T?da6LQ0;wvk;n^N+Vv_0?S<7IRjof_{UsRfe$`%7;htw`zv#2< zqSe33N8p9|nEkU~fmc55vDMC5DSu`;w5RuT;@Um?B{`qP{{`c7atZr9dykb_yL-RJ z{|WnrU&8k>KJ7yOl)b^KRJ)v|`ZWBnOhUEc>--`5f96tW4T5 z{XaCHV%PFl>}URlyo0RTr-?nozm(tatUc1&1^pFRzbE=xP~r@y7Db+5^(?u+L`w+W zpJEU6aNAS;E!wI?R!HR>&RkC;-{bhcV>Jkl_H>J%wv$`?xV3tm`?qN58MW8^d*gq{ z-9N8(nSaNA@5kXw>v5}UAjqfT4Ugwle!mA@`_VPD)*kmC;K~j{M|;Ts-NinDT-uBO zJ@EnHe#G|2j>JBS)&BQK$vJ|Y0~k`&?)yRPgC7tY0q%RWwFh2y1Y-a>e&or&V|V{! z?9SINeeK0h!~41a9^hd##-O1+{HjSi|MfkBGU?ldw66qyU_bq6YSZ@!s&9mSZ{TtI z&OqN6=(~Usd{Z%++>cP-C@L7qw+aL7TZczj>pKPiO@qFJ_>pfMlsm14k*ws`w-^4~ z34Jj!fVJo7dklRyp>HZQ{5KtA?As1~5zzHAT-)D@a9(^OC8uhhzr~tM6;{4UV2g z->Hb1_HE6BrqToL-}pD^PF!CL=?ffv-=ptq{C76v@%JPy6@4qDZ)nnVCxFoxKEI&R z!@lt8XtmwqKS4PQsA zQD1cF%O`!8HHq)G^gWfn152~|E=ylubs?_rs=5%Lf`YL69!uYJ={v4zc%?j(x;wC* z&T~zQfA`gu^<@0sP9q{-XEKYeFVvJznjSNix;rsC^PSmL#x(F+%d79=rju(Ln2tPu z+IMXFimd~2*^XfJMca)3;Pl0tu=)nC3*YNaL3bu=q4kYlXV~rRdpdoyHxsNF(vq}u&hrW*doy@IJ(sz*hf>Ga1 z%4$8AZw_05(f6AAzS4h7sV_j=!<$8{EwR~ruc@yf^$loSzR}c^{bBW~&fm$XZ$$Mq zrkMKDQ-0;v_ni8!RNrad4|^`(Z|d9A`|v2H?^#vD!vAOI@~!G3`$o1+yf%G%s_gpq zRNtWL+tm47@;A59f?11@{KClo!4O7yRiiY;()YD#-^eb;a}W5IeE)hccYV*QFJPP7 zcf0qoR%MIqyIJ9unxg+6SKsm~hrYYjSGM{tcQHPFS*-7t^}X>jJU*r`d>8Xf`lk3E z7|r;KSYHd@8~;Xm5p^^ppH%ggvbRl$>I-6h5$wNFUW$gkFxI!u`UZIkcnxLLSIPeS zYURbw$@F-Eg_4(E!UUgjqN*e<<&Rhy6a1CX|7}?guWA(w*Pv3Il1($ zx&OAj5gPT$y&Apx_MQ9MxD|U9*!n!<8mzv!*LUOk@?GD)uSWY$tiE_(0jD7vfAQV@ zT^3tIwmZPx4QmzH`q(wtJFxnKe zFn5C07x;Hz)gM3=tj4N0z$!+4FzPv=uliModJ(K5wjNX+nCqGAdw%sSP`?8yiT`ge zg8FnYs0D5VsI}bH1z;WMwbm=(U!66qRfYN-D6ULW^;R7f)DJ-lcc8bH?gX;xR-oPr z;>h|g4C=~Im);BOSl4B){2S?6P?Nq0>Km~E-3`{qVFR`%h&umZYQ;N2)S*AadW+SD zw;uEsG}I+R3bn8s=o|50-)8(Z(D9uoYSKGH-7z-M&!RRxE;i6tq83)&Cbn893SrgN zLVYJTnx=YGYz3$87`5@KuZ8!CQH{BJa;U$BY!$QW-Jy)?vf;hz`H_ZCv+Av}18-%J z+o`LHS@qngieGqj?AS?;N{niZ%J_HK6G*o*{Y)xTXEkg^%Toaz^&L^ij$Pfu1nC=>VgyFlFGX2aI~ss1Hn8hI-9tuKqEKl?5Ya z8R{=bFPlAdwozXk^_3}$mbmKuqV7DtM@<=e)Tq0SdgL6W2aeY2IitQg2f!VmCsAp% z)ETEFG4%l2Z$9Ku?BO^^+(V3##w|_{A>T_#-G8J~96fdIQ70dD8&Xdp zb=^^iA@%=J@1Y~)^ZkC*$*2@Pfuwm1&0?mfzDj90@zYktQB+5w5?E=8t$gacq&`4} zxK0x(QltS_SB%b&4zn z>8vHy(_l5vLoJ2DDwld;sf(9*r@`i9b>4c52BlIZCO^>oL{M__MQ$MvBUUgnmA2an_^BvYA;KGJfw={K8Q$IKL zSBuhfO;(&RKIw`bhN~WI(of_{j`w<#o-TOZyNj&Vmo7kG zz2?+=E`(Lbx?EWGwo^swDwlw!`qL?v7{{oCoqFS4Ag&?I1$@5mojT}w9a;6%OF=1( z>+J>W$(Id1<(GDXiehuf9mab0be4W|1ujY zC*Ane*H1kKeV;&e2+V=+GFbHiyiBh?Vbu3f{Q$*KMG5%SUr=myE6fqsRDRWQgIFeF zH^`@+iaGFKp;uuxdLUl4UWw{hcpaoNUdQ9D?}4api&w25qWU5#gX~Qho|_8(CUf6| z@jCoWJdrvvN>M!>)tgb>CH162XJeHC9d&2?7kh(KT~<4fTVR z-}k1J!cBTKW~A5RO}w{E!S|cI9o!CxICXB!;4;yjk}jN~bWYX!-juiKxk>lU*bQtJ zbm;^dzxz&@>b7|kv~sE6q-qdbJvDFBTT`7eGt$>m9WgV8ZU#345YD<)lFyh9W{}SL z?w!Vit=^yN_i3Fw(eeE|g}kngo%nCZJc4IXtxnxT$tBf*4xLWjHZ!wQ|56RQb27h9 zOg%`|Ei?<)HH+K`WaXER`in|KolP@=Qm@lg*4gpPig!IwZ&P(n%?$Q>a20-5;u&2w z*6N+A&a7F`_kC8?)ikTszoFUamrVmin`*w`&ga`Che|P`&})ca>E? zT6Js9j_(R}sH3d(bHGz~TXl=|NcEvjWu;E8*`0djDta~Wy>PR$PQ$5htg5&OHWzs> z^1QycuDaRgv>d)~t$O3CTdw-x3Y&}AC3G&LpzIeJ^7@{;(n;j`9RF@1>PzOi5?$bO zx|HC8)sYgU1nTqqUz^sq_W~HN=X(Mtz?5>p5Ar#&!X+~jT!PJg&P&uQ{Yya-m>e!Q z&lw4#WV;x|$fZugQt~#0RxeVfs)8sBdzS9;{7j0!wfA6!*)O}kW#eIKr^#d=&x&XC!P66yGVWp)m^6H(g zj`Ag436wR|X}+jCjOJ0ELjB+mF&CAV1qQp|PYKq(D4zSXHe4ZrIP)@UW@EyRt}udI*DL!u-owR2vZL49_)UetBlhL2BpDh zrSlLf5EaYcrLOZCgxARgIv+tNBJ4EJUhq0?pb9FbiR}mD&sflz2o=zhraXItovd}{ zgP4lxREhEy*Vz!2!06I>3pxivRwp~?ED4?OkanJfKl?#vJ!~abo!C~QI#WU_+wtjy zi;8YLtF-eVWGmy>*%rcxQ4RfVaH`hNozpp!qg;8V1w<atb%5ZnWT^vh9q78)8ix1hnQREw;@yJ3ru&;&Jz_eGWg|nUsOXH8TJ8?& zS{u}G^_76`k&)^I~*TjA~O2;(2YI>!O-! z6RT%KXS*oBPMcZJr4wj2aMdPyCu&0JG#dFL6~SMe9n{eM6)eZQHqe znm==BC7$JEXpB#10?F#+BAq#;(}(=|LsHWjNaE>aB*p#;baIl;0n*t_zD9q>Q3K*S z?`bLCrZDezI@zg#`xA~%YHCFE-}9ClJDtq5jL0%#IuS}IEiDJDY|__xReEMs;4w`= zHFZmZCBePUpBJTbpO%1Y%33E^`Lm*ybN*A>*;1-OXF4qhwJ4senbR3mI`^u%MVq9zCRmFarv4NTa5kpY%ZOor8B*BCYVmr(m7YZ2dY9RXf3q6I68k!r*-L+FP%5m z0{neknrZIO3iI{fN6icQH=ZBNHYJ^0)(Y-CxXPmw!^HA>Qr3BBEuE}|C=tGi@%6Hdb*f>X~OlXR5UYKO3vF)`V~A+M+f4A3Gb~AE2ANRzzC6xnNo` zSAEK-^V@V%+uT5>x9Oxdf5zKftWJH?>2cG7nL#I~^Xg_cpixU5dlOT+1WIAXIj->2$i+cRdEe+GFv*t2ye)(#c%rx`=f+s?EU z>)^V=NjraViXo;1Q-dy4pt?F?XRw~cHIv*OP?{D@A>Nf}N9vwtG5I=!6<+5VPBNuQ z0(0PbD7g4!%Mxstf)Fr&)I!|#LR_81VJ<-?`;diJ0NrBFTl%~#< z?BR3{q(2W*r#^Od50dj2)j> zL3ToWD)TOA_C!NxNlHPQI*YQ0(|M8;@G9f@;6c|5%+FvZf_cC&4`6iyrcTUMzMnz& zVlMj|T%Cid(EJ>l!D%<7uBDHIu5)}Kvg|DkyU57>O@n2D(YC% z(n_b7N>k^n>XcJ|&g$sk5!7^cs#N?ruKnSU1Uta>2dR@`2Vh5%V?dlc!1*&}`-Ay0 z_|bTMnGZziVXQwbRwvAkBK9Lzm5qcyz-k}E+MjXzD7remR%g@d3|Qst4}WCv9gN5E zeUH^Sw&JFpZu>oJ<eOIW_CGX)`#$jJ^?nED3ClDR|3LQ`=jeV*jzOG}tE}JQ(`mwwIh`@A^Lrm-uJJfS zR%iZx$B;+o3l9XX^M(J1jx^HF78d>oJj(GD2%U$lYJ?q*)%n6YoA?R%I(JyUv~!D} zCZ_Y3b;|J|=F--=#LA>IkRNx?Q12H!%kyx*;Ay{uKOFlFy23q8{A;-Wtmbd=f5}>T z1`*fk(qDrA)-XCR`pe)eVmhJuDYT#Fu5+IK8P6X348E`7e98C*p3ZfC7QA>*o96Q{ z#d{XqmuUI3s=q>6NS#{!9KJ7D>)dK(dGIo{IO zDd7HOZ=KmKjK_)NQ993CULXC0I=x>fhU;|l!KU$o(;4K#={AKu3)VbszgGxibLm>mYqx z_Eiucf*pd!8_b0lPZh}bA+@~EOy|14$539KI{y|pooPP|-z%)r?AxaC7CGNV?``)! z@u7_OQ1KkUdIOI1-ga-oc+-gUaUI+65*w-0v z#n+0y3r|^I4u-g4R@G3rubGzAKjPv^VGLm=#t?Kqu-W@IdyRUA!W;_!jo?-0!hFO^ z&oK0fKnM>t0s*sBOufmt!Yj9sN?1%VX4nA}rn|&4khv>Z$yhQXhupb&$ z?AO2zCjKc}L)<4k>q~|mM(h=0FQcgWCuj-(2|9z#`%>@`K3yN<9}MnQlwOR-hT;9x z;$jYSFX0#RB``06)ze9T7z&>;UJRZm{)KxP`vQnh$t1N;Pq?@Qm@Fg8!9M1y2P}qx?L6VV()Ta>L!zcvbT=#J+N0yJwhv30}Fp zZ+P5(g%#^5uIGZUiGKm=e{crDeF5(i*l$=X&)3+evBR;_9Ujm11pM#ZH$3xK?m6P( ziaFerzUKZ7x?fxDORQ>mk}(|rQ&=f^-LF_bi(fT-i}xG+gM!Dvf6q!v-*F8>`w4hY z1dj*8Jqczw_9;Byz)|d5!ws_dcf>Rv2lqV+kD)jSjB5VYeUJa~fBcW5@dMm}mf_K0 zAjlt#{kwa9L;XDFoB%Fb89tJ-Kp43L;lN}3xBxAH22ewb}BR*;MV?N6L#Oeq4FdAM< zdBqw>4Sn#9rKX1ip+=xEf%QW{U)E#EG77y%i1uM<=Cyx@+dJqTjB`K38U=D3V=Qyc z#=1T*#-TNqcwcaR;f@UW75WU{PgLtIclOcxgy@CmF9%LqD z4=}y)^#~py>Sx`F^~NJR5nV-mzMtH0ZnEnhbPXoCiLM)%-^kY!jqY3%(G&I;^GWeR z#sduDg!~1Tc-@1^*sj<~_`4JTm6)oPwsK62qc!UmDAR-7yI7tc%qHNU#?={*)@ij& zaZ{bNg#U%vG_*Pq6}D3xJCU4|Eb=QgJYcm*p^NEsp{B`}(?8<_R^wFglNjCX*%j{^ zbcWG|`xIhbf{s?*6!J`UGwcbvqBn(^xSfMef$UT_g?Sh1QDmB%$<+?-EH~Y?2P2)S zcsm8{!AvJQ9ef8?%GI7(mtY25VLVr!&S0fJ)38(F%%X;NpgS?z2W^9yZjS2^v3>d9E#1H3>W02{99lDrpU-E&e%pXQMC&tu}buf^SVNb79X0+XmgaW~C`k zE7NQnw7}~5^qjvl=Ats!&3CPW`-9(&t^D@~EiG4TtFIOOHbHZ^?SlE>Roxu&$UDb$ z7Lcn22xV#!+-EuOXVwz@e9I%N^&eO%sh$>$1?In>jNaSQtY0_By8w1ec=MdkA*<@< zQ|kh^*!_WRZd%RIUWiZn%CmsjLaqgNzYkqqs_tH_m|Fi~_P$_|TjcHyn&DsUnt@md zOYud-|8Pstya((Oo}nqDMX&^~bneB!)aqEs-OmyC-Ob z#xfKaxu$3+XA?Nfz%Io5Czt$7&1!ZJ_@#^`a5eWUMVbbU!7V2yt!C&nLg!ENETfJ_ z!Ch##3>xxpxq@f%c^kvI2V_I6G?syGh`k5T60}xuH3GXFjfPg)-Q@U-@h3ykWyGb@ z5bkoPE}@ETIn-NwBe+Ym%UFw0@dDvL%#!>@F! z(2-)A6{i80a{T4iy46&)9NQ?klOa862)~lJH1D=ZLn3!DR=YK>K~NvQW-Hwt;Maow zi|cMGyOWs4U5r)ugj&P>-?7FCbq8_r*Sf!5T~-b8Eoa_1sLQ{}-_%nts0C&N%vG%G zv({MS)-zVS+Ta_ot_^oRDs@@^jsI`A!RlJ?HnCa>uRfT%+=Z*alFwgX*Z> zLC(KfZN|F}&L(2(oYZRvHPGJ7T2*gyHOQqZHsGnntQPT_-2JGDf1|5|U(cYYQIe$M7E1S1!P$Agic3UOl3M&<1wXVq6<#wXBgR!02F7Df~yIrNAJhkj0 zPX%h(<*I;{-3_t=`tmC-oa&Z>bd|p%v0Y%bsz`hnxHO+UJBaPWr%Y8@mj%BUpOh+q z_m`OEHzVw;54fcl*anC{3Y=p!j{4wpyGXC%7ED)$Lz!EI*4CUZ}+2LIylHmzOrO3 z#VEu0uNC%yJ7i2%FU`^*4!XnSEsm#bP|R!@Vh4$pBzDLcCDAX%T73CSa2*D7$Q`w; zN8E8&JSYmLH1!{Jic3>*;Z#Ra)Q`C%^cig3L~mqcCgbRQxFZ;z0r9d0QknO-%8Vj6%jag)IR044z}A zbBeqtK^3G%KRa%^C!NO@z+X7Xhpyts;TK_^FF51Qy8O(%uJj91+i6&*h@5d^oWW`> ztIG0|TThmk`&qJzt<_l=d5N6^d)l1?n-8zh`N?^jwfE%1=4G4*p9hTW8Sv+@`TnUX zZ;;!#xv}!*3-Ztw>%5D>kv)&~8p5>j$7#@2D!M0x#tQlxQj59{i3^M_A>k^ z{1Cdy*Z`Y?Mq-fDcme+gDPS*fPvL$sJ`+F1PSFG=$t5C zCZ_oXt_0T7yTUw&RhJ`>^*BYYg2@_W!kk`g%O>ZPwsAy4T5=8N964H{8vCY$p7ff{a|M zN7bfFR$Vv9oFT{%+{Q{l_Bumo@x@8AH(B2#o)LU{{8C6~_7*k+>syvnoa@qMeLFD& ztMuf&ZM<73$djfcn;{uyq7>2xx@QP(C5or@t;Ac2>60@grw?u?-bTan1vfxv#B(z- zJ*b;tGA5@_CMu+jbXud54h4B-O$UEE)5?&Xh4~GaF*zIdDjHdYOU_6wQoNOzfptb3 z8Io_XzMXg@@j5osKR#u+hHjSROlaI>b)9t<)~X{@a@OR`*bHRIhVo_NIapmmKO4~u zM6+;ZV%)@cH8GVtPY&lcc`oD0LHr7NZ!o`R>esM7M^?+5H90%{jLA8u@iMt{@GO@T zvzooaI$QE}xXL8HDiY&bqK~Coj;zU-usMkcuaTYW3iT+S4R7}3oOm)Pr=pR~6td&X z!TKVa2}HBt&Bc&H0^AE!agF-LO#pWRULyV!e7X3yxQvx*uH=hoNFfDZfTna3ESA73 zJF7%4)f8guahBv{bT22y5-(Amsz~Ko6ji-q%P(d!x&hprj7#Lt3HwrFGMGg2r!X#Z zB@?-Xb=ZrEiDXs;H~bWQ7c3@hGC74+t-{8PbHV&lQLbcdtTt>UF_fGePcE<*5@~Rj zn8Z4SeqwSMUo`PN%shCaFk;M8@I{y_Pn0V+_z0fd;3JkzcQMamJzB`9G0ubZs~9tB z%9EGIYe90JWLas3uz6XZCz>0Z2W{DNtR1X?xblba=L2~z@f<3&fdnPpGpzID55tj8 zUdDNRXXCgtAcR*;QRT@4H-B=0I6erDHcdBiakc82=ju;#aZP|R%HcQ3nT3D#AC)3qA24y zp29?Z{1~g##xD$CH55rM2Ig2|QD#Ri?-6P&f!1NLrxK4Q9wFm#aulVmW2}xP7K5Xi zG){sjOsqJ*qlP|~Se&&mM_9`*&N1|)Sdu)_FOB~o8ppwieJt@1wiFSmmWFePsK#OP zl}IkhRh)4cyfh9{Ybop@luMBBaNL$mE{ks;n9^}hiR3cO_az>%8j9g9jn+YQOBq6I zk1d5Q#VE-*ME(N|af{=B-oOGQU5iMatZS1qr_=%u1M@Fh8L!o>urFF<)Z(Rrpb8_rxV zX>>wEwu7m+1>c^bJVMN%miFdrhrS|hSj|b8iC1FF&!uPYjD z$v+F-sjR1&{&X-MQ##|H%34;dF7PIs(v*Zr_*ILZK$tGXHJ8=UY#J3!j^~i=24W&u zRosDiH*iy#PqNID@pVnE+>2BC-U35LaG1uPr|9PL+^Ej_rV~jc1zK{Fc^c1@sTg&t` zU3J6%jOI%EsUn3M*xKl>aBCA+=dOXboIa|qLVpE#Y1Q=VfLrd?GG|1t|VRt+CbSSrlaETepU&{seY`=`=uRA#*h%r|dkpDgEbLpZP@dP3s5j zLhg@T)rC{f1!PofNw3*9;R60Pjl33KOZ$qZUURTNxXrLX7;*u>b6_tZ*M!`Bw*~Vw z_FBPcPCmH#6e>eU8JGtjLKFWuShEKontw*~!YqbK!N_Km`|#uGv+ z`kiHWmfM!fH2e-IPNPd(6lcFyN#x!g&_olt7!spC|4nj1uIiD$a);cK#v z)Z2I+;Z0+jX=t~{pKkb$u-l+1-V|!nQ0-vTb%N2BY$vMf+KKvP^p#cAp5Kn%WM+}l zWK)|;G=+XazB6_bd0{)k=m6{^o#d)Ai5{wU<&MYiO0KKd%{b~c7G!r~^_WCF zp13QBiCAe(<_aT4^%@6e5~wj&8;^E3dW^$%hch1Rc((`sI1p0oM&E8;FZ9RIM|tVW z??Jws*ON2G9Sv5qjE372R1Z&nPp`K(+8t@#N4cYnIU4qOYF*Ln4N~zq;xVQ=CQ74s z6u&1*0j@iC45;4dtE;|hINE)^KHi8Z8}uDZ-=3h=y)U+hHwt}q810Ur))(zj%-I8G ze`>>tq}v-`N@LtUaFrWL+{ZNZjblI#r(ZvKy*#n{!x@h1NOzd=hPy-De%?UpJ(+2= z%_ekjIQ_9gjYMMvN5B1|`29?8wCN26F(3*n?g;t}bq7%!ghp>~D7=B55Pdvp^}!#= zjQzdu>C%^ZhM_wEI|R=6c$#>i#Y4akcL!7do{Ui6qc<4jaQAz|4F>l;yunrN3z$;b|&J_!5}Iu0NjVg35T7>Zs$^oBA2K+_$FzRn;{;C+wAV0R!2>Z`hHgHEB^PK!T7@Id{0i%P>y;?y}#Sf9fo>< z5OO%&zUT}l&$m(&V}$tft?y90;baGU{n3;+ggczm550k4q%#~;KeUE>Bf<4CRZXZa zqfnHJbOwNzKO%~++z5-r9Paf-Q&!o&s01@B8W~mZ>y9Ss1#Xn#lpjHlQRKw#>q>7V zadbYIsW;y^ni+e#y-*#+M7^1Bw9PVxUcKRs^!hM+FOK5w*m2$%uLo9H^%zYo+lP7& zw8mH_8q)(#A9pM|J*oHP=vO+jV)wGFcw@ozFpaTjDwdU|vg3%l|9|WlZycO%=ue>5 z)s#kCt}Do1e9IX0yQ4i3ola;>p*n&)6~;)fD^pBhhOt)f>UKdZ=rxA=Bc$aWVFViF$LR^OklfUCz722 zYqHk~{uJyua?MqzG5cqab6dyoeU*(2Wr#k70f%q^fcQP zbUV83Kz0H%70hI6Qw%$Wx!RNM;!Y>mmJTzhv?JFEU-M7%rqgeVCzQN)*bdaEQ)!FW z8Rf~|46lRR#+}AoQ&H~-yIoYQiQ0po21eRbz;txmx~)OXCes>U+U?1-VNNMXM|?5b zfzu4~XGGby9(Rai&|^L%mybV z;dNTUn9VG$z_kE9$8wr!wl@!rncf_4K7D3krPhMJ&G=Pqj`g2weKpBk;vc!QxvfDp z0^i1M>NbwTtJ(~{6y*P(ZEBiL-6kMgfN$z9Fzp5Op5rw|ry1EMFz3T-LVZ4!A5BkM zKX?nhpS*^26n_qrv;^A_PBU2Zy#;*BJmbl01YgrN2GhuG;4Xqam;7RI4XyW&s4b+! ze6KMm9ZjOSegZciwq8YRkP9UQM^A^%g_@)wLG5mGHiE>$s~;Z3VTO?swGdW4|T83jJDWEW@sh z(y2pUnzg~yq_)ER@9;HA4dT@{-74(2#6NpKqrTKzh5ZiI+MHf^lQ7-IhsY9t3U^}Rm}Gt-?7@XSCbF=R0mbdU4!CEZ>=XQ_8Ov<%%QJS z$6u&bb*s5+v0|>_d`nF;t?_<^Q-%43(pUWK)nJCIDF1?A4Xb#KRfJj1{l)ZtfvtK~ z`0KoNs0H(W<9_4*N?gq<(THm3iTSHn#jR}LSp{A-j%HJC9kn$e)V;E0t1|N%deuNr z6R!7uBi797C)78Fs|@Z};;O`7yT60`+O0@bgSet~tAhQNd=={7(Cr(t>*1_Lu^Lfe zD>LIdo3D~v$#g1XE7^3i`ZArbqs}*Ae)H6?5*bY=|9AUc?^T4c0be}TDuUTST?qNo z`HdMicz=Q^2WBJw2K)->ZsZ#(xaHB%w}=(!{7U67ue|$}`-k@jN*fGU4s1m`<>~P! z`d`77LRoHLH-g^;zC1W}`UBiXbk*Yz;&L#`gBGWZ^({l+&2-!7eZ_q0A;uM#5z zRLX-_ZZj2Ws`3|p8Pog9kbhDULeXDfN`u*I_^sqhS>ICbmrPcU+5YslfGq zM~bD$D7%?@SyW2km$i7Cx1HWwP}zpvN>m!Oj{NOZN`l`;MS0~)xnH>3t!sb~>I-r^ zyq#c6fE7mbiL2hl@ON^yqats&SHdmo?#32%i=$qWsHD4x`Zjc>6`-XU#KqAqX+3t3 zk%H#k?d{>W7#*ayi?}#?yQs_8jH+xS+G|RCEL#jERdy) zb{8Ggt2i9ZvX3M6ePlm}r@4x_pSgRz17xG?Njm$CmQ z7hv{*`5eqX^a|6zIJjNpit!zLn6C(Z_jw1c<6hI=2Xmik?ehx5(Hxpbs3PvC^gihA zhr5rN_Jb{i#zE_LfO;Wg6vP%MufJds_@BWOUUhwoY(Ya7qEZOHCfMg4_6~XZ$s7ff z57rTKf0O+b^kFdh!G4av-*N@qL*NU5KMcNr;rGKh#N3~{2gn^XMX3kAGzyrO7zex~ z)b|^{fcrPmXKsFYhrNPP{SJFaVI1W525RA7mjn zAEyAb9U&+F5$`xR54oe@^MlXt=5_P%dmOxU{;_k|%MIpJYU=zc^<1Ein~E^Uy}V?k zE%s3``M~6Ha}(!tkAXPKJz@BNs0p3NJxQDsdkTAqTL52^DSs5rlW=mvKS8AIabjua zf-nDsA&+5CFkdb=C-;N%;O zMDa8jRkKl-hLm%F$mX6Q7WOQ-Z0KY|_pEo8oU+-Y>e{_Bq0hgZtW-0@$$`y)y-5DFRsQwd8I`XpV-OJR^<7aZyx@k-&4VqWsq=9qQCb{fgq5B2!`Yu()y280g zUdn-H8Z@p^O$|3A+8-0A=Zdc*+*M8*>S>wb8gVM@O>9bR1{jyTYxGIuN<&&{$Xy|K zJxVt%@m1oFvDdMwvC>lFevGIVs@W zqMpK(KXOx`aElqQdAFH21^z9#*K9Va-16?AbPfHRd`C*Y=N2}FS#?T9?gll@62yVM zjh^C^*6*gLPIpcF7TPJ8=NA7d&D&mLH@SNsd!4I#a`z)w-W_@-WyaKQVmApIsleR= zqxv1}9ZoVg8A>VmO-5B6KC=1m8ebFK<2#dbQczc?lyHL{$;gT&d)K=U^0t?R_&(eu zR{O{}VtqucnfOm?QcDCUh3P!>9@-?2$R|YqvBkIfeZ+SqVs7oJ;vuDFj)KLI+4Y*tP2*m@^GOF3z%_apL=a3k=2?0upnU|diiVpUCumw=4N43AJs z2s@HFBH^m;a|8W^d}E~d#9}YXMtWfoLi%_Su7i>$bI}ee5kwx!E;fvAh`tHI$!Zc8 z-}jzUd4%RO>hY}-q7nhhCo8o6Q4jggz<&Vl1+~ZA=dj~Nv3w>8bmD<@+^0nG&5Q5G zGnEhAxXk$6zU?I)J??WaE>-EqL-!e(r}TR2y@30^`^0;R=hIW&<8tD|e+oy+@mwj& z6GuJ6^mK`1!+ircj{Bbb%6sj-kB!H9PCxaG2k$w`alr*v-Up`mJ~b%|_tJZ13{9cx z3)nBn#YHa;nAiC7Uee<=$fv|_VLju%=1Nognnl0wyRpE&rS`&fKA@|-H=Nj}_#W{q zaPJevw5j8`G5Cgefz^)<@r|8N`3heTy&bdvId%9q*VVCUd{LD$~G4Z4n z%YTpf6*dmN-hh*041V7Op^ooU5tm>0H9R47VsYQ|Upp^Rdxyen=RGj5(0GrE;2SLnZlt3I-?oENCRv3cWCe_?rb zdr9S$qiNswIX zEh$RtIoP;KJgqAFkwghWN$(lF z_*k)@I3Ab?KiazJJ7_%N0oRb95X@uxCiH#QK*Jo56GrQ?=|%XD$$v;)-;~f#5;2-d9iNU$x!cHRU55bG~m}&yhkzf*lNlf<#D9hfbmIT%VY+^78IqG_!BddA& zPvP20WF3VH&O_q}krd8duu0KQ#BWmnu5-^x<|py*VWlm-hupgs-F5Dedq_?BMBs$@ z5Vktqqk7jm-nH5TILamVllv*qz8S^7?c9cS&oq-+-<0&bX>n3ClXIjb?j3%U!<9{j z73&uFK9$>8{VFHcJ$!Y#1wx&#VIP9Hjuj@E{}DPjt@}sJ{E?s9zwO+hddEp&yqnlm z61Oz)B4x8MxG7G-E0}VQzz#inMN^brXJSSjo6)j4e%NuRG!d-c2yl zPQ_8zG*mQw8cr(z3e(>~^NMqo-Nxub1sod2mUJg8-~8&NJ)Lt z_-Xk~2{NsJ9UW=iQmzZ6MjMM^5fV=2qBCr0^IB&cQ&VO(+TgQy1DULKXLnc3qRWh5E zW+q?wi_X7JMn5Z2I_v*0D$+a$Q(48C{mftkt8U^3HY0UuoTbMnoQ(cia9QY)6;1~3 zCF1nhi`X;t%7!0}IZu3=dy#IcWrg)G{yBX8D$Z(J*|3@51&l0yHgIP-LY<>uR^~b5 zoS?@A=M?ki0Fed!Ip-5t0lg2*HuT-RUif_z;)+sPKz@CJg+t0%sS+QrC@+9gxs0o|H&yH2!W8AY; zj&aU9dC~s|E8cM?%1wL>Twd_UK%H{_LFtU~#Xdsj9J#~P3ZSiC1-OS%D?s-n&T%To z!RPk#a{mFF*UyhVg3XKOan3(BMIJvFu`(y$Yx`T6K| zlqrrm2f=E-T;$YC7-0(#9|5D@s>tRcR{;Mo{xN2e6;3Cw)$;p?$g7qYq`vSF8U>A& z$23&`l!+P`itZjX zi^ARG>?B{Dy7FS}x5%1hXAo>2G!ZGVT`V4>-G=FHNJ2zlErb%~Zz! z3jSZQ8cIndeWU4aQQx3g~Ihik!0W|3pX33iv`*#M|JkcPfEf z4^JJ}gQ*y$t*E^JHS_%LR6t_`wTTW7W3oNwStU-%068_=nQ{RZty^#7f_&Tkye`8DWublKpn0bkv( zYVmsV-=Ho=(5nh@Mf_^y*20wi1)a*|rS&!F4bHF5&-gXSt-*?;PL-%tSPsb@|8BlD*iso{S2?VzY?9A#;yrN-D_d1kzeD~B3cReJMgQ(uXa|@vzA|* zcsXh{@oU1V?$_Z|_m_cDZ6!7FR)Sy6Sbf^PUTB|^<0=JA?$1uz2TNjO` zhF*b{)^coZSj+H)Q}31dHOUFP6qUMURbP&lcs2ccDAfdAm)-%t4t^c`hPrsQ{iSr4 zw~V^JLS5^TUyN-4u9jaP6?Lu;N|QApR@a76`Fj83s)z6^oJH7%oSOb3=3443Z~{H` zu1Alh^r%Y@bzkKCB~xaiL;Qi*nY*S zM{O~x4g5xEE~2u)dMtG26D=`qp&Ni}WVaFB8}c0s`5QOnZ?%xWNkhLeXA#``SZT~B z--x-I(76Gp8Qu@%m!K|wbDOAv%|8!x6Vw}%YeH=v+=b3O=ST8Q$t^JdC#N}xAMurI zY|2f*s+V$&@qfZLq9S$0s?9~`C#RWlh5Qj;(=_#4VAZoZR+`PoG>@vxbLPNQ=h@B= z@PEXrcQX(_Qfub70xgx6{JrP$cW>^u;m!orhU`o_x3+pK5Ms%yM=MTqe-0YW{nq?V zX2PD2-^9L6v;9EF7O2k!Gn=Y9$F1 z>Ze%(tuAzxP8W10Mq#=#$9Vd5ry_lEyBb%&vH>@!1=()o z#)9byrlUU|b~mQz?)L`YiP}Ww??$z&KNhVCXpaNm-S1(VvWmx3QI8&+pwNbXWG{3!>X%wijmK#NGtRueeDC%R; z9!YJSGlIWyUw;g?r`eHI#&AZF8SV5#XE?sBCXl+cdvW@3WR)8MrZ0YPa=K#o_WKz^ zIH`_whJ)!3st25L&M;?)bs9=u3c?E`>~N}m`~m0;!P8%2m{s~PV}EeNoS{yCe;~6B zAus%Jo3XDy2#rBhHFH0I1ofe&K8SdbKhzmarxEzl5r3#D3?$YZ!#IKd2&^U;% z#bB6&ogx1Bbon0bK^(C7fd`JRgQyPjg&M%`5PzW5ltXc#(;o)9AO;&R;HZ;uOp2aZ zOi!=j@c1im2KxQr4Z{wQ0#>sPMrDYU@CP`3ouU2+V&=12FjrrCj_`-V=NnCXD0RLF z-Y}Gh+8Kg3((mi^c1B`tepBqn3?rDO4|XK%q5KZ>dsF+Ketpm$!0pQ!0dA5u07q|=l77=JubFkcVrCd^ps-QbM(C)(d)41desPA8{}GYP#>&NfkJn1 z

    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 literal 0 HcmV?d00001 diff --git a/P3D/Content/Textures/Battle/Water/Clamp_Left.png b/P3D/Content/Textures/Battle/Water/Clamp_Left.png new file mode 100644 index 0000000000000000000000000000000000000000..4097d10c3513ac9cc74e1c0867f3942cfbad23f1 GIT binary patch literal 392 zcmV;30eAk1P)YAX9X8WNB|8RBvx=!KdMT0003K zNkliT5nPEcRw0npKVqKwU*w;V}bfyjKC#Riv#R7C`I07+@BnD}XA= zobpry?!1QsR5`Fpun4eXdW mMVS4D5P_uS5y*T8-1Py*YAX9X8WNB|8RBvx=!KdMT0003I zNkl z^|6#ft^j84Ip^!W)@lL`6&%Nr&S$Mv1))(6n7LaauYm8(&!vHg04b%^TJr&Tsi4_8 zc!Ee&(8@u(LnJCx0Er4!h$Jf1fK?UZDhdUxgvk`56&30#as^nb$qbmOFo(ztm~9>c z80EnQFjC=?12e#qXp%Huno@NGyd`=Mz`YTZY-1A3ZkpRa^hQ~&?~07*qoM6N<$g0VZH2mk;8 literal 0 HcmV?d00001 diff --git a/P3D/P3D.vbproj b/P3D/P3D.vbproj index 24c369ba0..ec8947d4c 100644 --- a/P3D/P3D.vbproj +++ b/P3D/P3D.vbproj @@ -14704,6 +14704,9 @@ PreserveNewest + + PreserveNewest + PreserveNewest @@ -15463,6 +15466,12 @@ PreserveNewest + + PreserveNewest + + + PreserveNewest + PreserveNewest diff --git a/P3D/Pokemon/Attacks/Water/Clamp.vb b/P3D/Pokemon/Attacks/Water/Clamp.vb index 91db66f75..25066b13d 100644 --- a/P3D/Pokemon/Attacks/Water/Clamp.vb +++ b/P3D/Pokemon/Attacks/Water/Clamp.vb @@ -87,6 +87,26 @@ Namespace BattleSystem.Moves.Water End If End Sub + Public Overrides Sub InternalOpponentPokemonMoveAnimation(ByVal BattleScreen As BattleScreen, ByVal BattleFlip As Boolean, ByVal CurrentPokemon As Pokemon, ByVal CurrentEntity As NPC, ByVal CurrentModel As ModelEntity) + Dim MoveAnimation As AnimationQueryObject = New AnimationQueryObject(CurrentEntity, BattleFlip) + Dim offsetLeft As Single = -0.35 + Dim offsetRight As Single = 0.35 + If BattleFlip = True Then + offsetLeft = 0.35 + offsetRight = -0.35 + End If + MoveAnimation.AnimationPlaySound("Battle\Attacks\Water\Clamp", 0, 0) + Dim ClampEntityLeft = MoveAnimation.SpawnEntity(New Vector3(offsetLeft, -0.1, offsetLeft), TextureManager.GetTexture("Textures\Battle\Water\Clamp_Left", New Rectangle(0, 0, 24, 64), ""), New Vector3(0.28F, 0.75F, 0.28F), 0.75F) + Dim ClampEntityRight = MoveAnimation.SpawnEntity(New Vector3(offsetRight, -0.1, offsetRight), TextureManager.GetTexture("Textures\Battle\Water\Clamp_Right", New Rectangle(0, 0, 24, 64), ""), New Vector3(0.28F, 0.75F, 0.28F), 0.75F) + MoveAnimation.AnimationMove(ClampEntityLeft, False, -0.1, -0.1, -0.1, 0.02, False, False, 0, 0) + MoveAnimation.AnimationMove(ClampEntityRight, False, 0.1, -0.1, 0.1, 0.02, False, False, 0, 0) + MoveAnimation.AnimationMove(ClampEntityLeft, True, -0.35, -0.1, -0.35, 0.02, False, False, 2, 0) + MoveAnimation.AnimationMove(ClampEntityRight, True, 0.35, -0.1, 0.35, 0.02, False, False, 2, 0) + Dim SpawnEntity = MoveAnimation.SpawnEntity(New Vector3(0, -0.2, 0), TextureManager.GetTexture("Textures\Battle\Normal\Tackle"), New Vector3(0.5F), 1.0F, 2.5, 2) + MoveAnimation.AnimationFade(SpawnEntity, True, 1.0F, False, 0.0F, 4.5F, 0) + + BattleScreen.BattleQuery.Add(MoveAnimation) + End Sub End Class End Namespace \ No newline at end of file From 5b7a6fc9ab8a8b57e626aea4e197846f0326d838 Mon Sep 17 00:00:00 2001 From: JappaWakka Date: Sat, 8 Jan 2022 18:00:05 +0100 Subject: [PATCH 50/57] =?UTF-8?q?Fixed=20Overworld=20Pok=C3=A9mon=20textur?= =?UTF-8?q?e=20animations?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Pokémon textures with 3 and 4 frames work better now When the player is running, the Pokémon animates faster When a (network) player is standing still, the Pokémon animates slower (unless the Pokémon texture has 4 frames, then it stops at the first frame) Cleaned up the code a little --- P3D/Entites/Other/NetworkPlayer.vb | 14 +++++----- P3D/Entites/Other/NetworkPokemon.vb | 37 +++++++++++++++++---------- P3D/Entites/Other/OverworldPokemon.vb | 33 +++++++++++------------- P3D/Entites/Other/OwnPlayer.vb | 14 +++++----- 4 files changed, 50 insertions(+), 48 deletions(-) diff --git a/P3D/Entites/Other/NetworkPlayer.vb b/P3D/Entites/Other/NetworkPlayer.vb index 2a86a7e1c..0828b2ffe 100644 --- a/P3D/Entites/Other/NetworkPlayer.vb +++ b/P3D/Entites/Other/NetworkPlayer.vb @@ -165,6 +165,10 @@ Return 0 Case 2 Return 1 + Case 3 + Return 0 + Case 4 + Return 1 End Select ElseIf Me.Texture.Width = Me.Texture.Height Then Select Case AnimationX @@ -198,14 +202,8 @@ If Me.AnimationDelay <= 0.0F Then Me.AnimationDelay = AnimationDelayLength AnimationX += 1 - If Me.Texture.Width = Me.Texture.Height / 2 Then - If AnimationX > 2 Then - AnimationX = 1 - End If - Else - If AnimationX > 4 Then - AnimationX = 1 - End If + If AnimationX > 4 Then + AnimationX = 1 End If End If End If diff --git a/P3D/Entites/Other/NetworkPokemon.vb b/P3D/Entites/Other/NetworkPokemon.vb index 97a7174f0..9682b7ec9 100644 --- a/P3D/Entites/Other/NetworkPokemon.vb +++ b/P3D/Entites/Other/NetworkPokemon.vb @@ -6,13 +6,14 @@ Public LevelFile As String = "" Public PokemonTexture As String = "" Public faceRotation As Integer = 0 + Dim Moving As Boolean = False Dim Texture As Texture2D Dim lastRectangle As New Rectangle(0, 0, 0, 0) Dim loadedTexture As String = "" Dim AnimationX As Integer = 1 - Dim AnimationDelayLength As Single = 2.2F + Dim AnimationDelayLength As Single = 1.1F Dim AnimationDelay As Single = AnimationDelayLength Public Sub New(ByVal pos As Vector3, ByVal PokemonTexture As String, ByVal visible As Boolean) @@ -51,22 +52,26 @@ If Me.PokemonTexture <> "" Then Me.ChangeTexture() - - Me.AnimationDelay -= 0.1F - If AnimationDelay <= 0.0F Then - AnimationX += 1 - AnimationDelay = AnimationDelayLength - If Me.Texture.Width = Me.Texture.Height / 2 Then - If AnimationX > 2 Then - AnimationX = 1 - End If - ElseIf Me.Texture.Width = Me.Texture.Height Then + If Moving = True Then + Me.AnimationDelay -= 0.1F + If AnimationDelay <= 0.0F Then + AnimationX += 1 + AnimationDelay = AnimationDelayLength If AnimationX > 4 Then AnimationX = 1 End If + End If + Else + If Me.Texture.Width = Me.Texture.Height Then + AnimationX = 1 Else - If AnimationX > 3 Then - AnimationX = 1 + Me.AnimationDelay -= 0.1F + If AnimationDelay <= 0.0F Then + AnimationX += 1 + AnimationDelay = 2.2F + If AnimationX > 4 Then + AnimationX = 1 + End If End If End If End If @@ -160,6 +165,10 @@ Return 0 Case 2 Return 1 + Case 3 + Return 0 + Case 4 + Return 1 End Select ElseIf Me.Texture.Width = Me.Texture.Height Then Select Case AnimationX @@ -197,7 +206,7 @@ Public Sub ApplyPlayerData(ByVal p As Servers.Player) Try Me.PlayerID = p.ServersID - + Me.Moving = p.Moving Me.PokemonTexture = p.PokemonSkin Me.Position = p.PokemonPosition Me.LevelFile = p.LevelFile diff --git a/P3D/Entites/Other/OverworldPokemon.vb b/P3D/Entites/Other/OverworldPokemon.vb index 7a8ba86b8..6cd0fe9e1 100644 --- a/P3D/Entites/Other/OverworldPokemon.vb +++ b/P3D/Entites/Other/OverworldPokemon.vb @@ -40,7 +40,6 @@ Public Class OverworldPokemon Me.Texture = PokemonReference.GetOverworldTexture() End If - Dim cameraRotation As Integer = Screen.Camera.GetFacingDirection() Dim spriteIndex As Integer = Me.faceRotation - cameraRotation @@ -96,18 +95,8 @@ Public Class OverworldPokemon If AnimationDelay <= 0.0F Then AnimationX += 1 AnimationDelay = AnimationDelayLength - If Me.Texture.Width = Me.Texture.Height / 2 Then - If AnimationX > 2 Then - AnimationX = 1 - End If - ElseIf Me.Texture.Width = Me.Texture.Height Then - If AnimationX > 4 Then - AnimationX = 1 - End If - Else - If AnimationX > 3 Then - AnimationX = 1 - End If + If AnimationX > 4 Then + AnimationX = 1 End If End If Else @@ -183,15 +172,19 @@ Public Class OverworldPokemon If Screen.Camera.IsMoving() = True And Core.CurrentScreen.Identification = Screen.Identifications.OverworldScreen Then If CInt(Me.Position.X) <> CInt(Screen.Camera.Position.X) Or CInt(Me.Position.Z) <> CInt(Screen.Camera.Position.Z) Then Me.Position += GetMove() - Me.AnimationDelayLength = 1.1F + If Core.Player.IsRunning = True Then + Me.AnimationDelayLength = 1.1F / 1.4F + Else + Me.AnimationDelayLength = 1.1F + End If Me.Moving = True End If Else - Me.AnimationDelayLength = 1.1F - If Me.Texture.Width = Me.Texture.Height / 2 Then - Me.Moving = True - Else + Me.AnimationDelayLength = 2.2F + If Me.Texture.Width = Me.Texture.Height Then Me.Moving = False + Else + Me.Moving = True End If End If End Sub @@ -310,6 +303,10 @@ Public Class OverworldPokemon Return 0 Case 2 Return 1 + Case 3 + Return 0 + Case 4 + Return 1 End Select ElseIf Me.Texture.Width = Me.Texture.Height Then Select Case AnimationX diff --git a/P3D/Entites/Other/OwnPlayer.vb b/P3D/Entites/Other/OwnPlayer.vb index ac4c506b0..94c74c9e3 100644 --- a/P3D/Entites/Other/OwnPlayer.vb +++ b/P3D/Entites/Other/OwnPlayer.vb @@ -90,14 +90,8 @@ If AnimationDelay <= 0.0F Then AnimationDelay = GetAnimationDelay() AnimationX += 1 - If Me.Texture.Width = Me.Texture.Height / 2 Then - If AnimationX > 2 Then - AnimationX = 1 - End If - Else - If AnimationX > 4 Then - AnimationX = 1 - End If + If AnimationX > 4 Then + AnimationX = 1 End If End If Else @@ -164,6 +158,10 @@ Return 0 Case 2 Return 1 + Case 3 + Return 0 + Case 4 + Return 1 End Select ElseIf Me.Texture.Width = Me.Texture.Height Then Select Case AnimationX From 667671e16fab22d54d645ec3552fa69e1959bb4a Mon Sep 17 00:00:00 2001 From: JappaWakka Date: Mon, 10 Jan 2022 20:45:28 +0100 Subject: [PATCH 51/57] Battle Bugfixes Fixed buggy throwing animation of the opponent trainer Fixed a bug related to the trainer sprite in the vs trainer intro that made the trainer texture buggy if it wasn't 32x32 --- P3D/Battle/BattleSystemV2/Battle.vb | 6 +++--- P3D/Battle/BattleSystemV2/BattleScreen.vb | 6 +++--- P3D/Screens/BattleIntroScreen.vb | 16 ++++++++++------ 3 files changed, 16 insertions(+), 12 deletions(-) diff --git a/P3D/Battle/BattleSystemV2/Battle.vb b/P3D/Battle/BattleSystemV2/Battle.vb index 0814097cd..9d4512057 100644 --- a/P3D/Battle/BattleSystemV2/Battle.vb +++ b/P3D/Battle/BattleSystemV2/Battle.vb @@ -7363,7 +7363,7 @@ BallThrow.AnimationPlaySound("Battle\Pokeball\Throw", 0, 0) Dim BallThrowEntity As Entity = BallThrow.SpawnEntity(New Vector3(-2, -0.15, 0), BattleScreen.OwnPokemon.CatchBall.Texture, New Vector3(0.3F), 1.0F) - BallThrow.AnimationMove(BallThrowEntity, True, 0, 0.35, 0, 0.1, False, True, 0F, 0.5F,, 0.3,, 0.025F) + BallThrow.AnimationMove(BallThrowEntity, True, 0, 0.35, 0, 0.1, False, True, 0F, 0.5F,, -0.3,, 0.025F) ' Ball Opens BallThrow.AnimationPlaySound("Battle\Pokeball\Open", 3, 0) @@ -7783,12 +7783,12 @@ BattleScreen.BattleQuery.Add(New ToggleEntityQueryObject(True, ToggleEntityQueryObject.BattleEntities.OppPokemon, 1, -1, -1, -1, -1)) BattleScreen.BattleQuery.Add(New TextQueryObject(BattleScreen.Trainer.Name & ": ""Go, " & BattleScreen.OppPokemon.GetDisplayName() & "!""")) - Dim BallThrow As AnimationQueryObject = New AnimationQueryObject(BattleScreen.OppPokemonNPC, True, BattleScreen.OppPokemonModel) + Dim BallThrow As AnimationQueryObject = New AnimationQueryObject(BattleScreen.OppPokemonNPC, False, BattleScreen.OppPokemonModel) If Core.Player.ShowBattleAnimations <> 0 Then ' Ball is thrown BallThrow.AnimationPlaySound("Battle\Pokeball\Throw", 0, 0) - Dim BallThrowEntity = BallThrow.SpawnEntity(New Vector3(-2, -0.15, 0), BattleScreen.OppPokemon.CatchBall.Texture, New Vector3(0.3F), 1.0F) + Dim BallThrowEntity = BallThrow.SpawnEntity(New Vector3(2, -0.15, 0), BattleScreen.OppPokemon.CatchBall.Texture, New Vector3(0.3F), 1.0F) BallThrow.AnimationMove(BallThrowEntity, True, 0, 0.35, 0, 0.1, False, True, 0F, 0.5F,, 0.3,, 0.025F) ' Ball opens diff --git a/P3D/Battle/BattleSystemV2/BattleScreen.vb b/P3D/Battle/BattleSystemV2/BattleScreen.vb index 7786494ce..444072a8e 100644 --- a/P3D/Battle/BattleSystemV2/BattleScreen.vb +++ b/P3D/Battle/BattleSystemV2/BattleScreen.vb @@ -376,7 +376,7 @@ Screen.Level.Entities.Add(OwnPokemonModel) Dim InitiallyVisibleOpp As Integer = 1 - If IsPVPBattle = True AndAlso Core.Player.ShowBattleAnimations <> 0 Then + If Core.Player.ShowBattleAnimations <> 0 Then InitiallyVisibleOpp = 0 End If @@ -414,12 +414,12 @@ Dim q1 As TextQueryObject = New TextQueryObject(Trainer.Name & " wants to battle!") ' Ball is thrown - Dim BallThrowOpp As AnimationQueryObject = New AnimationQueryObject(OppPokemonNPC, True, OppPokemonModel) + Dim BallThrowOpp As AnimationQueryObject = New AnimationQueryObject(OppPokemonNPC, False, OppPokemonModel) If Core.Player.ShowBattleAnimations <> 0 Then BallThrowOpp.AnimationPlaySound("Battle\Pokeball\Throw", 0, 0) BallThrowOpp.AnimationMove(Nothing, False, 0, 0.5, 0, 0.5, False, False, 2, 0,,, 3) - Dim BallThrowEntity As Entity = BallThrowOpp.SpawnEntity(New Vector3(-2, -0.15, 0), Me.OppPokemon.CatchBall.Texture, New Vector3(0.3F), 1.0F) + Dim BallThrowEntity As Entity = BallThrowOpp.SpawnEntity(New Vector3(2, -0.15, 0), Me.OppPokemon.CatchBall.Texture, New Vector3(0.3F), 1.0F) BallThrowOpp.AnimationMove(BallThrowEntity, True, 0, 0.35, 0, 0.1, False, True, 0F, 0.5F,, 0.3,, 0.025F) ' Ball Opens diff --git a/P3D/Screens/BattleIntroScreen.vb b/P3D/Screens/BattleIntroScreen.vb index bf53de80d..822bce57e 100644 --- a/P3D/Screens/BattleIntroScreen.vb +++ b/P3D/Screens/BattleIntroScreen.vb @@ -172,6 +172,7 @@ Private Sub DrawTrainerIntro() Dim barPosition As Vector2 = New Vector2(Trainer.BarImagePosition.X * 128, Trainer.BarImagePosition.Y * 128) Dim VSPosition As Vector2 = New Vector2(Trainer.VSImagePosition.X * 128, Trainer.VSImagePosition.Y * 128 + 64) + Dim TrainerFrameSize As Size = New Size(CInt(TextureManager.GetTexture("Textures\NPC\" & Trainer.SpriteName).Width / 3), CInt(TextureManager.GetTexture("Textures\NPC\" & Trainer.SpriteName).Height / 4)) If Trainer.VSImageOrigin <> "VSIntro" Then VSPosition.Y -= 64 @@ -179,17 +180,18 @@ Dim t1 As Texture2D = TextureManager.GetTexture("GUI\Intro\VSIntro", New Rectangle(CInt(barPosition.X), CInt(barPosition.Y), 128, 64), "") Dim t2 As Texture2D = TextureManager.GetTexture("GUI\Intro\" & Trainer.VSImageOrigin, New Rectangle(CInt(VSPosition.X), CInt(VSPosition.Y), Trainer.VSImageSize.Width, Trainer.VSImageSize.Height), "") - Dim t3 As Texture2D = TextureManager.GetTexture("NPC\" & Trainer.SpriteName, New Rectangle(0, 64, 32, 32)) + Dim t3 As Texture2D = TextureManager.GetTexture("NPC\" & Trainer.SpriteName, New Rectangle(0, TrainerFrameSize.Height * 2, TrainerFrameSize.Width, TrainerFrameSize.Height)) Dim t4 As Texture2D = Nothing If Trainer.DoubleTrainer = True Then - t4 = TextureManager.GetTexture("NPC\" & Trainer.SpriteName2, New Rectangle(0, 64, 32, 32)) + Dim Trainer2FrameSize As Size = New Size(CInt(TextureManager.GetTexture("Textures\NPC\" & Trainer.SpriteName2).Width / 3), CInt(TextureManager.GetTexture("Textures\NPC\" & Trainer.SpriteName2).Height / 4)) + t4 = TextureManager.GetTexture("NPC\" & Trainer.SpriteName2, New Rectangle(0, Trainer2FrameSize.Height * 2, Trainer2FrameSize.Width, Trainer2FrameSize.Height)) End If If Trainer.GameJoltID <> "" Then If GameJolt.Emblem.HasDownloadedSprite(Trainer.GameJoltID) = True Then Dim t As Texture2D = GameJolt.Emblem.GetOnlineSprite(Trainer.GameJoltID) If Not t Is Nothing Then - Dim spriteSize As New Vector2(t.Width / 3.0F, t.Height / 4.0F) + Dim spriteSize As New Vector2(CInt(t.Width / 3), CInt(t.Height / 4)) t3 = TextureManager.GetTexture(t, New Rectangle(0, CInt(spriteSize.Y * 2), CInt(spriteSize.X), CInt(spriteSize.Y))) End If End If @@ -238,20 +240,22 @@ Private Sub DrawFaceshotIntro() Dim barPosition As Vector2 = New Vector2(Trainer.BarImagePosition.X * 128, Trainer.BarImagePosition.Y * 128) Dim VSPosition As Vector2 = New Vector2(Trainer.VSImagePosition.X * 128, Trainer.VSImagePosition.Y * 128 + 64) + Dim TrainerFrameSize As Size = New Size(CInt(TextureManager.GetTexture("Textures\NPC\" & Trainer.SpriteName).Width / 3), CInt(TextureManager.GetTexture("Textures\NPC\" & Trainer.SpriteName).Height / 4)) Dim t1 As Texture2D = TextureManager.GetTexture("GUI\Intro\VSIntro", New Rectangle(CInt(barPosition.X), CInt(barPosition.Y), 128, 64), "") Dim t2 As Texture2D = TextureManager.GetTexture("GUI\Intro\VSIntro", New Rectangle(CInt(VSPosition.X), CInt(VSPosition.Y), 61, 54), "") - Dim t3 As Texture2D = TextureManager.GetTexture("NPC\" & Trainer.SpriteName, New Rectangle(0, 64, 32, 32)) + Dim t3 As Texture2D = TextureManager.GetTexture("NPC\" & Trainer.SpriteName, New Rectangle(0, TrainerFrameSize.Height * 2, TrainerFrameSize.Width, TrainerFrameSize.Height)) Dim t4 As Texture2D = Nothing If Trainer.DoubleTrainer = True Then - t4 = TextureManager.GetTexture("NPC\" & Trainer.SpriteName2, New Rectangle(0, 64, 32, 32)) + Dim Trainer2FrameSize As Size = New Size(CInt(TextureManager.GetTexture("Textures\NPC\" & Trainer.SpriteName2).Width / 3), CInt(TextureManager.GetTexture("Textures\NPC\" & Trainer.SpriteName2).Height / 4)) + t4 = TextureManager.GetTexture("NPC\" & Trainer.SpriteName2, New Rectangle(0, Trainer2FrameSize.Height * 2, Trainer2FrameSize.Width, Trainer2FrameSize.Height)) End If If Trainer.GameJoltID <> "" Then If GameJolt.Emblem.HasDownloadedSprite(Trainer.GameJoltID) = True Then Dim t As Texture2D = GameJolt.Emblem.GetOnlineSprite(Trainer.GameJoltID) If Not t Is Nothing Then - Dim spriteSize As New Vector2(t.Width / 3.0F, t.Height / 4.0F) + Dim spriteSize As New Vector2(CInt(t.Width / 3), CInt(t.Height / 4)) t3 = TextureManager.GetTexture(t, New Rectangle(0, CInt(spriteSize.Y * 2), CInt(spriteSize.X), CInt(spriteSize.Y))) End If End If From 7555a5e903e3272f165af0ca36453fc13eed5cce Mon Sep 17 00:00:00 2001 From: JappaWakka Date: Sun, 16 Jan 2022 17:22:36 +0100 Subject: [PATCH 52/57] Battle fixes and improvements MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Fixed camera angle not changing to the Pokémon when status effects are doing something * Fixed softlock when opponent trainer switches Pokémon * (Hopefully) fixed initial positioning errors with spawned BattleAnimation entities related to BattleFlip functionality * Removed the now unneccessary BattleFlip checks in the move animation of Growl * Improved Ember move animation (fireball speed & flame delay) * Improved Poison Sting move animation by making the stinger smaller, increasing the speed of the stinger and making it use a flipped version of the texture when the opponent uses the move * Improved Poisoned status effect animation by making it 1 bubble for regular poison and 3 bubbles for toxic * Repositioned the flame of the Burned status effect animation * Trainers now display a message when sending out their Pokémon (I removed that before) * Fixed Party Screen not appearing immediately after the player's Pokémon fainted and also made the player unable to exit the Party Screen when that happens. * Fixed the incorrectly scaled font sizes and text alignment in the selection menu that appears when selecting a Pokémon in the Party screen * Replaced minifont in the Pokémon level up stats box with InGameFont and fixed the offsets * Fixed the error I made in the ceiling map code of Violet City's gym * Removed the file MoveAnimationQueryObject.vb because AnimationQueryObject.vb also includes Move Animations * Fixed the textbox in battles where an empty rectangle would appear before the animation finished. * When a trainer spots the player and an exclamation mark bubble pops up above their head, a sound is played (Emote_Exclamation) * In trainer battles, the player's Pokémon now also plays their cry. --- P3D/Battle/BattleSystemV2/Battle.vb | 152 ++++++++++-------- P3D/Battle/BattleSystemV2/BattleMenu.vb | 13 +- P3D/Battle/BattleSystemV2/BattleScreen.vb | 18 +-- .../QueryObjects/AnimationQueryObject.vb | 16 +- .../QueryObjects/MoveAnimationQueryObject.vb | 3 - .../QueryObjects/TextQueryObject.vb | 8 +- .../Data/maps/battle/gyms/violet_gym.dat | Bin 20262 -> 20250 bytes P3D/Content/Data/maps/gyms/violet_gym.dat | Bin 25286 -> 25326 bytes P3D/Content/Localization/Tokens_en.dat | 3 + P3D/Content/Sounds/Emote_Exclamation.wav | Bin 0 -> 52646 bytes .../Textures/Battle/Poison/Stinger.png | Bin 202 -> 246 bytes .../Textures/Battle/StatusEffect/Burned.png | Bin 0 -> 1077 bytes P3D/Entites/Other/NPC.vb | 8 +- P3D/Input/UI/SelectMenu.vb | 14 +- P3D/P3D.vbproj | 7 +- P3D/Pokemon/Attacks/Fire/Ember.vb | 36 ++--- P3D/Pokemon/Attacks/Normal/Growl.vb | 12 +- P3D/Pokemon/Attacks/Poison/PoisonSting.vb | 35 ++-- P3D/Screens/Battle/BattleGrowStatsScreen.vb | 53 +++--- P3D/Screens/Pokemon/PartyScreen.vb | 27 ++-- 20 files changed, 235 insertions(+), 170 deletions(-) delete mode 100644 P3D/Battle/BattleSystemV2/QueryObjects/MoveAnimationQueryObject.vb create mode 100644 P3D/Content/Sounds/Emote_Exclamation.wav create mode 100644 P3D/Content/Textures/Battle/StatusEffect/Burned.png diff --git a/P3D/Battle/BattleSystemV2/Battle.vb b/P3D/Battle/BattleSystemV2/Battle.vb index 9d4512057..4320f3bbd 100644 --- a/P3D/Battle/BattleSystemV2/Battle.vb +++ b/P3D/Battle/BattleSystemV2/Battle.vb @@ -1237,6 +1237,7 @@ CureStatusProblem(own, own, BattleScreen, p.GetDisplayName() & " thawed out.", "own defrost") Else 'Frozen animation + ChangeCameraAngle(1, Not own, BattleScreen) If Core.Player.ShowBattleAnimations <> 0 Then Dim FrozenAnimation As AnimationQueryObject = New AnimationQueryObject(Nothing, Not own) @@ -1302,6 +1303,8 @@ End If Else If sleepTurns > 0 Then + ChangeCameraAngle(1, Not own, BattleScreen) + 'Sleep Animation If Core.Player.ShowBattleAnimations <> 0 Then Dim SleepAnimation As New AnimationQueryObject(pNPC, Not own) @@ -1437,6 +1440,8 @@ BattleScreen.BattleQuery.Add(New TextQueryObject(p.GetDisplayName() & " is no longer confused!")) p.RemoveVolatileStatus(Pokemon.VolatileStatus.Confusion) Else + Me.ChangeCameraAngle(1, Not own, BattleScreen) + 'Confused Animation If Core.Player.ShowBattleAnimations <> 0 Then Dim ConfusedAnimation As New AnimationQueryObject(pNPC, Not own) @@ -1523,9 +1528,9 @@ If op.HP > 0 And op.Status <> Pokemon.StatusProblems.Fainted Then If p.HasVolatileStatus(Pokemon.VolatileStatus.Infatuation) = True Then If Core.Random.Next(0, 2) = 0 Then + Me.ChangeCameraAngle(1, own, BattleScreen) 'Infatuated animation If Core.Player.ShowBattleAnimations <> 0 Then - Me.ChangeCameraAngle(1, own, BattleScreen) Dim HeartAnimation = New AnimationQueryObject(pNPC, Not own) For i = 0 To 6 Dim HeartEntity = HeartAnimation.SpawnEntity(New Vector3(0.0, 0.0, 0.0), TextureManager.GetTexture("Textures\Battle\Normal\Attract"), New Vector3(0.25F), 1.0F, CSng(i * 0.2)) @@ -1544,6 +1549,7 @@ If p.Status = Pokemon.StatusProblems.Paralyzed Then If Core.Random.Next(0, 4) = 0 Then + Me.ChangeCameraAngle(1, Not own, BattleScreen) If Core.Player.ShowBattleAnimations <> 0 Then Dim ParalyzedAnimation As AnimationQueryObject = New AnimationQueryObject(pNPC, Not own) @@ -2713,7 +2719,7 @@ Me.ChangeCameraAngle(1, own, BattleScreen) If message = "" Then - message = p.GetDisplayName() & " fainted!" + message = p.GetDisplayName() & " " & "fainted!" End If BattleScreen.BattleQuery.Add(New TextQueryObject(message)) @@ -2721,7 +2727,7 @@ If own = False Then Dim FaintAnimation As AnimationQueryObject = New AnimationQueryObject(BattleScreen.OppPokemonNPC, True, BattleScreen.OppPokemonModel) FaintAnimation.AnimationPlaySound(CStr(BattleScreen.OppPokemon.Number), 0, 2, False, True) - FaintAnimation.AnimationMove(Nothing, False, 0, -1, 0, 0.05, False, False, 2, 0,,, 3) + FaintAnimation.AnimationMove(Nothing, False, 0, -1, 0, 0.05, False, False, 2, 2) BattleScreen.BattleQuery.Add(FaintAnimation) End If End If @@ -2883,11 +2889,11 @@ 'Burn animation Dim BurnAnimation As AnimationQueryObject = New AnimationQueryObject(pNPC, own) BurnAnimation.AnimationPlaySound("Battle\Effects\Burned", 0, 0) - Dim FlameEntity As Entity = BurnAnimation.SpawnEntity(New Vector3(CSng(-0.25), CSng(-0.25), CSng(-0.25)), TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 0, 32, 32), ""), New Vector3(0.5, 0.5, 0.5), 1.0F) - BurnAnimation.AnimationChangeTexture(FlameEntity, False, TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 32, 32, 32), ""), 2, 1) - BurnAnimation.AnimationChangeTexture(FlameEntity, False, TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 64, 32, 32), ""), 3, 1) - BurnAnimation.AnimationChangeTexture(FlameEntity, False, TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 96, 32, 32), ""), 4, 1) - BurnAnimation.AnimationChangeTexture(FlameEntity, True, TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 128, 32, 32), ""), 5, 2) + Dim FlameEntity As Entity = BurnAnimation.SpawnEntity(New Vector3(0, -0.25F, 0), TextureManager.GetTexture("Textures\Battle\StatusEffect\Burned", New Rectangle(0, 0, 32, 32), ""), New Vector3(0.5, 0.5, 0.5), 1.0F) + BurnAnimation.AnimationChangeTexture(FlameEntity, False, TextureManager.GetTexture("Textures\Battle\StatusEffect\Burned", New Rectangle(0, 32, 32, 32), ""), 0.75, 0) + BurnAnimation.AnimationChangeTexture(FlameEntity, False, TextureManager.GetTexture("Textures\Battle\StatusEffect\Burned", New Rectangle(0, 64, 32, 32), ""), 1.5, 0) + BurnAnimation.AnimationChangeTexture(FlameEntity, False, TextureManager.GetTexture("Textures\Battle\StatusEffect\Burned", New Rectangle(0, 96, 32, 32), ""), 2.25, 0) + BurnAnimation.AnimationChangeTexture(FlameEntity, True, TextureManager.GetTexture("Textures\Battle\StatusEffect\Burned", New Rectangle(0, 128, 32, 32), ""), 3, 0) BattleScreen.BattleQuery.Add(BurnAnimation) Select Case message @@ -3302,6 +3308,8 @@ Return False Else 'Works! + ChangeCameraAngle(1, Not own, BattleScreen) + 'Sleep Animation If Core.Player.ShowBattleAnimations <> 0 Then Dim SleepAnimation As New AnimationQueryObject(pNPC, Not own) @@ -3373,9 +3381,11 @@ Public Function InflictPoison(ByVal own As Boolean, ByVal from As Boolean, ByVal BattleScreen As BattleScreen, ByVal bad As Boolean, ByVal message As String, ByVal cause As String) As Boolean Dim p As Pokemon = BattleScreen.OwnPokemon Dim op As Pokemon = BattleScreen.OppPokemon + Dim pNPC As NPC = BattleScreen.OwnPokemonNPC If own = False Then p = BattleScreen.OppPokemon op = BattleScreen.OwnPokemon + pNPC = BattleScreen.OppPokemonNPC End If If p.HP <= 0 OrElse p.Status = Pokemon.StatusProblems.Fainted Then @@ -3430,7 +3440,20 @@ Else 'Works! ChangeCameraAngle(1, own, BattleScreen) - BattleScreen.BattleQuery.Add(New PlaySoundQueryObject("Battle\Effects\Poisoned", False)) + 'Poison animation + If Core.Player.ShowBattleAnimations <> 0 Then + Dim PoisonAnimation As AnimationQueryObject = New AnimationQueryObject(pNPC, own) + + PoisonAnimation.AnimationPlaySound("Battle\Effects\Poisoned", 0, 0) + Dim BubbleEntity1 As Entity = PoisonAnimation.SpawnEntity(New Vector3(0, -0.25, 0), TextureManager.GetTexture("Textures\Battle\StatusEffect\Poisoned", New Rectangle(0, 0, 32, 32), ""), New Vector3(0.5F), 1, 0, 1) + + PoisonAnimation.AnimationChangeTexture(BubbleEntity1, False, TextureManager.GetTexture("Textures\Battle\StatusEffect\Poisoned", New Rectangle(0, 32, 32, 32), ""), 1, 1) + PoisonAnimation.AnimationChangeTexture(BubbleEntity1, True, TextureManager.GetTexture("Textures\Battle\StatusEffect\Poisoned", New Rectangle(0, 64, 32, 32), ""), 2, 1) + + BattleScreen.BattleQuery.Add(PoisonAnimation) + Else + BattleScreen.BattleQuery.Add(New PlaySoundQueryObject("Battle\Effects\Poisoned", False)) + End If If bad = True Then p.Status = Pokemon.StatusProblems.BadPoison Select Case message @@ -3531,6 +3554,8 @@ Return False Else 'Works! + Me.ChangeCameraAngle(1, Not own, BattleScreen) + 'Confused Animation If Core.Player.ShowBattleAnimations <> 0 Then Dim ConfusedAnimation As New AnimationQueryObject(pNPC, Not own) @@ -4266,12 +4291,6 @@ HPAmount = p.MaxHP - p.HP End If - If own = True Then - BattleScreen.BattleQuery.Add(New MathHPQueryObject(p.HP, p.MaxHP, -HPAmount, New Vector2(200, 256))) - Else - BattleScreen.BattleQuery.Add(New MathHPQueryObject(p.HP, p.MaxHP, -HPAmount, New Vector2(300, 256))) - End If - '***HP INCREASE ANIMATION*** If Core.Player.ShowBattleAnimations <> 0 Then Dim HealAnimation As AnimationQueryObject = New AnimationQueryObject(pNPC, Not own) @@ -4296,6 +4315,13 @@ Else BattleScreen.BattleQuery.Add(New PlaySoundQueryObject("Battle\Effects\Heal", False)) End If + + If own = True Then + BattleScreen.BattleQuery.Add(New MathHPQueryObject(p.HP, p.MaxHP, -HPAmount, New Vector2(200, 256))) + Else + BattleScreen.BattleQuery.Add(New MathHPQueryObject(p.HP, p.MaxHP, -HPAmount, New Vector2(300, 256))) + End If + If message <> "" Then BattleScreen.BattleQuery.Add(New TextQueryObject(message)) End If @@ -5689,24 +5715,16 @@ Else If .OwnPokemon.Ability.Name.ToLower() <> "magic guard" Then If .OwnPokemon.Status = Pokemon.StatusProblems.Poison Then 'Own Poison + ChangeCameraAngle(1, True, BattleScreen) 'Poison animation If Core.Player.ShowBattleAnimations <> 0 Then Dim PoisonAnimation As AnimationQueryObject = New AnimationQueryObject(BattleScreen.OwnPokemonNPC, True) PoisonAnimation.AnimationPlaySound("Battle\Effects\Poisoned", 0, 0) - Dim BubbleEntity1 As Entity = PoisonAnimation.SpawnEntity(New Vector3(-0.25, -0.25, -0.25), TextureManager.GetTexture("Textures\Battle\StatusEffect\Poisoned", New Rectangle(0, 0, 32, 32), ""), New Vector3(0.5F), 1, 0, 1) + Dim BubbleEntity1 As Entity = PoisonAnimation.SpawnEntity(New Vector3(0, -0.25, 0), TextureManager.GetTexture("Textures\Battle\StatusEffect\Poisoned", New Rectangle(0, 0, 32, 32), ""), New Vector3(0.5F), 1, 0, 1) PoisonAnimation.AnimationChangeTexture(BubbleEntity1, False, TextureManager.GetTexture("Textures\Battle\StatusEffect\Poisoned", New Rectangle(0, 32, 32, 32), ""), 1, 1) - Dim BubbleEntity2 As Entity = PoisonAnimation.SpawnEntity(New Vector3(0.25, -0.25, 0.25), TextureManager.GetTexture("Textures\Battle\StatusEffect\Poisoned", New Rectangle(0, 0, 32, 32), ""), New Vector3(0.5F), 1, 1, 1) - PoisonAnimation.AnimationChangeTexture(BubbleEntity1, True, TextureManager.GetTexture("Textures\Battle\StatusEffect\Poisoned", New Rectangle(0, 64, 32, 32), ""), 2, 1) - PoisonAnimation.AnimationChangeTexture(BubbleEntity2, False, TextureManager.GetTexture("Textures\Battle\StatusEffect\Poisoned", New Rectangle(0, 32, 32, 32), ""), 2, 1) - Dim BubbleEntity3 As Entity = PoisonAnimation.SpawnEntity(New Vector3(0.25, -0.25, -0.25), TextureManager.GetTexture("Textures\Battle\StatusEffect\Poisoned", New Rectangle(0, 0, 32, 32), ""), New Vector3(0.5F), 1, 2, 1) - - PoisonAnimation.AnimationChangeTexture(BubbleEntity2, True, TextureManager.GetTexture("Textures\Battle\StatusEffect\Poisoned", New Rectangle(0, 64, 32, 32), ""), 3, 1) - PoisonAnimation.AnimationChangeTexture(BubbleEntity3, False, TextureManager.GetTexture("Textures\Battle\StatusEffect\Poisoned", New Rectangle(0, 32, 32, 32), ""), 3, 1) - - PoisonAnimation.AnimationChangeTexture(BubbleEntity3, True, TextureManager.GetTexture("Textures\Battle\StatusEffect\Poisoned", New Rectangle(0, 64, 32, 32), ""), 4, 1) BattleScreen.BattleQuery.Add(PoisonAnimation) Else @@ -5719,6 +5737,8 @@ If .OwnPokemon.Status = Pokemon.StatusProblems.BadPoison Then 'Own Toxic .FieldEffects.OwnPoisonCounter += 1 Dim multiplier As Double = (.FieldEffects.OwnPoisonCounter / 16) + + ChangeCameraAngle(1, True, BattleScreen) 'Poison animation If Core.Player.ShowBattleAnimations <> 0 Then Dim PoisonAnimation As AnimationQueryObject = New AnimationQueryObject(BattleScreen.OwnPokemonNPC, True) @@ -5727,11 +5747,11 @@ Dim BubbleEntity1 As Entity = PoisonAnimation.SpawnEntity(New Vector3(-0.25, -0.25, -0.25), TextureManager.GetTexture("Textures\Battle\StatusEffect\Poisoned", New Rectangle(0, 0, 32, 32), ""), New Vector3(0.5F), 1, 0, 1) PoisonAnimation.AnimationChangeTexture(BubbleEntity1, False, TextureManager.GetTexture("Textures\Battle\StatusEffect\Poisoned", New Rectangle(0, 32, 32, 32), ""), 1, 1) - Dim BubbleEntity2 As Entity = PoisonAnimation.SpawnEntity(New Vector3(0.25, -0.25, 0.25), TextureManager.GetTexture("Textures\Battle\StatusEffect\Poisoned", New Rectangle(0, 0, 32, 32), ""), New Vector3(0.5F), 1, 1, 1) + Dim BubbleEntity2 As Entity = PoisonAnimation.SpawnEntity(New Vector3(0, -0.25, 0), TextureManager.GetTexture("Textures\Battle\StatusEffect\Poisoned", New Rectangle(0, 0, 32, 32), ""), New Vector3(0.5F), 1, 1, 1) PoisonAnimation.AnimationChangeTexture(BubbleEntity1, True, TextureManager.GetTexture("Textures\Battle\StatusEffect\Poisoned", New Rectangle(0, 64, 32, 32), ""), 2, 1) PoisonAnimation.AnimationChangeTexture(BubbleEntity2, False, TextureManager.GetTexture("Textures\Battle\StatusEffect\Poisoned", New Rectangle(0, 32, 32, 32), ""), 2, 1) - Dim BubbleEntity3 As Entity = PoisonAnimation.SpawnEntity(New Vector3(0.25, -0.25, -0.25), TextureManager.GetTexture("Textures\Battle\StatusEffect\Poisoned", New Rectangle(0, 0, 32, 32), ""), New Vector3(0.5F), 1, 2, 1) + Dim BubbleEntity3 As Entity = PoisonAnimation.SpawnEntity(New Vector3(0, -0.25, 0.25), TextureManager.GetTexture("Textures\Battle\StatusEffect\Poisoned", New Rectangle(0, 0, 32, 32), ""), New Vector3(0.5F), 1, 2, 1) PoisonAnimation.AnimationChangeTexture(BubbleEntity2, True, TextureManager.GetTexture("Textures\Battle\StatusEffect\Poisoned", New Rectangle(0, 64, 32, 32), ""), 3, 1) PoisonAnimation.AnimationChangeTexture(BubbleEntity3, False, TextureManager.GetTexture("Textures\Battle\StatusEffect\Poisoned", New Rectangle(0, 32, 32, 32), ""), 3, 1) @@ -5756,17 +5776,17 @@ If .OwnPokemon.Ability.Name.ToLower() = "heatproof" Then reduceAmount = CInt(.OwnPokemon.MaxHP / 32) End If - + ChangeCameraAngle(1, True, BattleScreen) 'Burn animation If Core.Player.ShowBattleAnimations <> 0 Then - Dim BurnAnimation As AnimationQueryObject = New AnimationQueryObject(BattleScreen.OwnPokemonNPC, False) + Dim BurnAnimation As AnimationQueryObject = New AnimationQueryObject(BattleScreen.OwnPokemonNPC, True) BurnAnimation.AnimationPlaySound("Battle\Effects\Burned", 0, 0) - Dim FlameEntity As Entity = BurnAnimation.SpawnEntity(New Vector3(0.25F, 0.25F, 0.25), TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 0, 32, 32), ""), New Vector3(0.5, 0.5, 0.5), 1.0F) - BurnAnimation.AnimationChangeTexture(FlameEntity, False, TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 32, 32, 32), ""), 2, 1) - BurnAnimation.AnimationChangeTexture(FlameEntity, False, TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 64, 32, 32), ""), 3, 1) - BurnAnimation.AnimationChangeTexture(FlameEntity, False, TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 96, 32, 32), ""), 4, 1) - BurnAnimation.AnimationChangeTexture(FlameEntity, True, TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 128, 32, 32), ""), 5, 2) + Dim FlameEntity As Entity = BurnAnimation.SpawnEntity(New Vector3(0, 0.25F, 0), TextureManager.GetTexture("Textures\Battle\StatusEffect\Burned", New Rectangle(0, 0, 32, 32), ""), New Vector3(0.5, 0.5, 0.5), 1.0F) + BurnAnimation.AnimationChangeTexture(FlameEntity, False, TextureManager.GetTexture("Textures\Battle\StatusEffect\Burned", New Rectangle(0, 32, 32, 32), ""), 0.75, 0) + BurnAnimation.AnimationChangeTexture(FlameEntity, False, TextureManager.GetTexture("Textures\Battle\StatusEffect\Burned", New Rectangle(0, 64, 32, 32), ""), 1.5, 0) + BurnAnimation.AnimationChangeTexture(FlameEntity, False, TextureManager.GetTexture("Textures\Battle\StatusEffect\Burned", New Rectangle(0, 96, 32, 32), ""), 2.25, 0) + BurnAnimation.AnimationChangeTexture(FlameEntity, True, TextureManager.GetTexture("Textures\Battle\StatusEffect\Burned", New Rectangle(0, 128, 32, 32), ""), 3, 0) BattleScreen.BattleQuery.Add(BurnAnimation) Else BattleScreen.BattleQuery.Add(New PlaySoundQueryObject("Battle\Effects\Burned", False)) @@ -5826,9 +5846,10 @@ multiHP = CInt(.OwnPokemon.MaxHP / 6) End If End If + ChangeCameraAngle(1, True, BattleScreen) 'Wrap Animation If Core.Player.ShowBattleAnimations <> 0 Then - ChangeCameraAngle(1, True, BattleScreen) + Dim WrapAnimation As AnimationQueryObject = New AnimationQueryObject(.OwnPokemonNPC, False) WrapAnimation.AnimationPlaySound("Battle\Attacks\Normal\Wrap", 5.0F, 0) Dim WrapEntity = WrapAnimation.SpawnEntity(New Vector3(0, -0.2, 0), TextureManager.GetTexture("Textures\Battle\Normal\Wrap", New Rectangle(0, 0, 80, 40), ""), New Vector3(1.0F, 0.5F, 1.0F), 1, 0, 0.75) @@ -5862,9 +5883,10 @@ multiHP = CInt(.OwnPokemon.MaxHP / 6) End If End If + ChangeCameraAngle(1, True, BattleScreen) 'Whirlpool Animation If Core.Player.ShowBattleAnimations <> 0 Then - ChangeCameraAngle(1, True, BattleScreen) + Dim WhirlpoolAnimation As AnimationQueryObject = New AnimationQueryObject(.OwnPokemonNPC, False,, True) WhirlpoolAnimation.AnimationPlaySound("Battle\Attacks\Water\Whirlpool", 0.0F, 0) Dim WhirlpoolEntity As Entity = WhirlpoolAnimation.SpawnEntity(New Vector3(0, -0.3, 0), TextureManager.GetTexture("Textures\Battle\Water\Whirlpool"), New Vector3(0.0F), 1.0F, 0.0F, 0.0F) @@ -5902,9 +5924,9 @@ multiHP = CInt(.OwnPokemon.MaxHP / 6) End If End If + ChangeCameraAngle(1, True, BattleScreen) 'Bind Animation If Core.Player.ShowBattleAnimations <> 0 Then - ChangeCameraAngle(1, True, BattleScreen) Dim BindAnimation As AnimationQueryObject = New AnimationQueryObject(.OwnPokemonNPC, False) BindAnimation.AnimationPlaySound("Battle\Attacks\Normal\Bind", 5.0F, 0) Dim BindEntity = BindAnimation.SpawnEntity(New Vector3(0, -0.2, 0), TextureManager.GetTexture("Textures\Battle\Normal\Bind", New Rectangle(0, 0, 80, 40), ""), New Vector3(1.0F, 0.5F, 1.0F), 1, 0, 0.75) @@ -5938,9 +5960,9 @@ multiHP = CInt(.OwnPokemon.MaxHP / 6) End If End If + ChangeCameraAngle(1, True, BattleScreen) 'Clamp Animation If Core.Player.ShowBattleAnimations <> 0 Then - ChangeCameraAngle(1, True, BattleScreen) Dim ClampAnimation As AnimationQueryObject = New AnimationQueryObject(.OwnPokemonNPC, True) Dim offsetLeft As Single = 0.35 Dim offsetRight As Single = -0.35 @@ -6571,24 +6593,16 @@ Else If .OppPokemon.Ability.Name.ToLower() <> "magic guard" Then If .OppPokemon.Status = Pokemon.StatusProblems.Poison Then 'Opp Poison + ChangeCameraAngle(1, False, BattleScreen) 'Poison animation If Core.Player.ShowBattleAnimations <> 0 Then Dim PoisonAnimation As AnimationQueryObject = New AnimationQueryObject(BattleScreen.OppPokemonNPC, False) PoisonAnimation.AnimationPlaySound("Battle\Effects\Poisoned", 0, 0) - Dim BubbleEntity1 As Entity = PoisonAnimation.SpawnEntity(New Vector3(-0.25, -0.25, -0.25), TextureManager.GetTexture("Textures\Battle\StatusEffect\Poisoned", New Rectangle(0, 0, 32, 32), ""), New Vector3(0.5F), 1, 0, 1) + Dim BubbleEntity1 As Entity = PoisonAnimation.SpawnEntity(New Vector3(0, -0.25, 0), TextureManager.GetTexture("Textures\Battle\StatusEffect\Poisoned", New Rectangle(0, 0, 32, 32), ""), New Vector3(0.5F), 1, 0, 1) PoisonAnimation.AnimationChangeTexture(BubbleEntity1, False, TextureManager.GetTexture("Textures\Battle\StatusEffect\Poisoned", New Rectangle(0, 32, 32, 32), ""), 1, 1) - Dim BubbleEntity2 As Entity = PoisonAnimation.SpawnEntity(New Vector3(0.25, -0.25, 0.25), TextureManager.GetTexture("Textures\Battle\StatusEffect\Poisoned", New Rectangle(0, 0, 32, 32), ""), New Vector3(0.5F), 1, 1, 1) - PoisonAnimation.AnimationChangeTexture(BubbleEntity1, True, TextureManager.GetTexture("Textures\Battle\StatusEffect\Poisoned", New Rectangle(0, 64, 32, 32), ""), 2, 1) - PoisonAnimation.AnimationChangeTexture(BubbleEntity2, False, TextureManager.GetTexture("Textures\Battle\StatusEffect\Poisoned", New Rectangle(0, 32, 32, 32), ""), 2, 1) - Dim BubbleEntity3 As Entity = PoisonAnimation.SpawnEntity(New Vector3(0.25, -0.25, -0.25), TextureManager.GetTexture("Textures\Battle\StatusEffect\Poisoned", New Rectangle(0, 0, 32, 32), ""), New Vector3(0.5F), 1, 2, 1) - - PoisonAnimation.AnimationChangeTexture(BubbleEntity2, True, TextureManager.GetTexture("Textures\Battle\StatusEffect\Poisoned", New Rectangle(0, 64, 32, 32), ""), 3, 1) - PoisonAnimation.AnimationChangeTexture(BubbleEntity3, False, TextureManager.GetTexture("Textures\Battle\StatusEffect\Poisoned", New Rectangle(0, 32, 32, 32), ""), 3, 1) - - PoisonAnimation.AnimationChangeTexture(BubbleEntity3, True, TextureManager.GetTexture("Textures\Battle\StatusEffect\Poisoned", New Rectangle(0, 64, 32, 32), ""), 4, 1) BattleScreen.BattleQuery.Add(PoisonAnimation) Else @@ -6601,6 +6615,7 @@ If .OppPokemon.Status = Pokemon.StatusProblems.BadPoison Then 'Opp Toxic .FieldEffects.OppPoisonCounter += 1 Dim multiplier As Double = (.FieldEffects.OppPoisonCounter / 16) + ChangeCameraAngle(1, False, BattleScreen) If Core.Player.ShowBattleAnimations <> 0 Then 'Poison animation Dim PoisonAnimation As AnimationQueryObject = New AnimationQueryObject(BattleScreen.OppPokemonNPC, False) @@ -6609,11 +6624,11 @@ Dim BubbleEntity1 As Entity = PoisonAnimation.SpawnEntity(New Vector3(-0.25, -0.25, -0.25), TextureManager.GetTexture("Textures\Battle\StatusEffect\Poisoned", New Rectangle(0, 0, 32, 32), ""), New Vector3(0.5F), 1, 0, 1) PoisonAnimation.AnimationChangeTexture(BubbleEntity1, False, TextureManager.GetTexture("Textures\Battle\StatusEffect\Poisoned", New Rectangle(0, 32, 32, 32), ""), 1, 1) - Dim BubbleEntity2 As Entity = PoisonAnimation.SpawnEntity(New Vector3(0.25, -0.25, 0.25), TextureManager.GetTexture("Textures\Battle\StatusEffect\Poisoned", New Rectangle(0, 0, 32, 32), ""), New Vector3(0.5F), 1, 1, 1) + Dim BubbleEntity2 As Entity = PoisonAnimation.SpawnEntity(New Vector3(0, -0.25, 0), TextureManager.GetTexture("Textures\Battle\StatusEffect\Poisoned", New Rectangle(0, 0, 32, 32), ""), New Vector3(0.5F), 1, 1, 1) PoisonAnimation.AnimationChangeTexture(BubbleEntity1, True, TextureManager.GetTexture("Textures\Battle\StatusEffect\Poisoned", New Rectangle(0, 64, 32, 32), ""), 2, 1) PoisonAnimation.AnimationChangeTexture(BubbleEntity2, False, TextureManager.GetTexture("Textures\Battle\StatusEffect\Poisoned", New Rectangle(0, 32, 32, 32), ""), 2, 1) - Dim BubbleEntity3 As Entity = PoisonAnimation.SpawnEntity(New Vector3(0.25, -0.25, -0.25), TextureManager.GetTexture("Textures\Battle\StatusEffect\Poisoned", New Rectangle(0, 0, 32, 32), ""), New Vector3(0.5F), 1, 2, 1) + Dim BubbleEntity3 As Entity = PoisonAnimation.SpawnEntity(New Vector3(0, -0.25, 0.25), TextureManager.GetTexture("Textures\Battle\StatusEffect\Poisoned", New Rectangle(0, 0, 32, 32), ""), New Vector3(0.5F), 1, 2, 1) PoisonAnimation.AnimationChangeTexture(BubbleEntity2, True, TextureManager.GetTexture("Textures\Battle\StatusEffect\Poisoned", New Rectangle(0, 64, 32, 32), ""), 3, 1) PoisonAnimation.AnimationChangeTexture(BubbleEntity3, False, TextureManager.GetTexture("Textures\Battle\StatusEffect\Poisoned", New Rectangle(0, 32, 32, 32), ""), 3, 1) @@ -6639,16 +6654,17 @@ If .OppPokemon.Ability.Name.ToLower() = "heatproof" Then reduceAmount = CInt(.OppPokemon.MaxHP / 16) End If + ChangeCameraAngle(1, False, BattleScreen) 'Burn animation If Core.Player.ShowBattleAnimations <> 0 Then - Dim BurnAnimation As AnimationQueryObject = New AnimationQueryObject(BattleScreen.OppPokemonNPC, True) + Dim BurnAnimation As AnimationQueryObject = New AnimationQueryObject(BattleScreen.OppPokemonNPC, False) BurnAnimation.AnimationPlaySound("Battle\Effects\Burned", 0, 0) - Dim FlameEntity As Entity = BurnAnimation.SpawnEntity(New Vector3(0.25, 0.25, 0.25), TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 0, 32, 32), ""), New Vector3(0.5, 0.5, 0.5), 1.0F) - BurnAnimation.AnimationChangeTexture(FlameEntity, False, TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 32, 32, 32), ""), 2, 1) - BurnAnimation.AnimationChangeTexture(FlameEntity, False, TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 64, 32, 32), ""), 3, 1) - BurnAnimation.AnimationChangeTexture(FlameEntity, False, TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 96, 32, 32), ""), 4, 1) - BurnAnimation.AnimationChangeTexture(FlameEntity, True, TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 128, 32, 32), ""), 5, 2) + Dim FlameEntity As Entity = BurnAnimation.SpawnEntity(New Vector3(0, 0.25, 0), TextureManager.GetTexture("Textures\Battle\StatusEffect\Burned", New Rectangle(0, 0, 32, 32), ""), New Vector3(0.5, 0.5, 0.5), 1.0F) + BurnAnimation.AnimationChangeTexture(FlameEntity, False, TextureManager.GetTexture("Textures\Battle\StatusEffect\Burned", New Rectangle(0, 32, 32, 32), ""), 0.75, 0) + BurnAnimation.AnimationChangeTexture(FlameEntity, False, TextureManager.GetTexture("Textures\Battle\StatusEffect\Burned", New Rectangle(0, 64, 32, 32), ""), 1.5, 0) + BurnAnimation.AnimationChangeTexture(FlameEntity, False, TextureManager.GetTexture("Textures\Battle\StatusEffect\Burned", New Rectangle(0, 96, 32, 32), ""), 2.25, 0) + BurnAnimation.AnimationChangeTexture(FlameEntity, True, TextureManager.GetTexture("Textures\Battle\StatusEffect\Burned", New Rectangle(0, 128, 32, 32), ""), 3, 0) BattleScreen.BattleQuery.Add(BurnAnimation) Else BattleScreen.BattleQuery.Add(New PlaySoundQueryObject("Battle\Effects\Burned", False)) @@ -6709,9 +6725,9 @@ multiHP = CInt(.OppPokemon.MaxHP / 6) End If End If + ChangeCameraAngle(1, False, BattleScreen) 'Wrap Animation If Core.Player.ShowBattleAnimations <> 0 Then - ChangeCameraAngle(1, False, BattleScreen) Dim WrapAnimation As AnimationQueryObject = New AnimationQueryObject(.OppPokemonNPC, True) WrapAnimation.AnimationPlaySound("Battle\Attacks\Normal\Wrap", 5.0F, 0) Dim WrapEntity = WrapAnimation.SpawnEntity(New Vector3(0, -0.2, 0), TextureManager.GetTexture("Textures\Battle\Normal\Wrap", New Rectangle(0, 0, 80, 40), ""), New Vector3(1.0F, 0.5F, 1.0F), 1, 0, 0.75) @@ -6745,9 +6761,9 @@ multiHP = CInt(.OppPokemon.MaxHP / 6) End If End If + ChangeCameraAngle(1, False, BattleScreen) 'Whirlpool Animation If Core.Player.ShowBattleAnimations <> 0 Then - ChangeCameraAngle(1, False, BattleScreen) Dim WhirlpoolAnimation As AnimationQueryObject = New AnimationQueryObject(.OppPokemonNPC, True,, True) WhirlpoolAnimation.AnimationPlaySound("Battle\Attacks\Water\Whirlpool", 0.0F, 0) Dim WhirlpoolEntity As Entity = WhirlpoolAnimation.SpawnEntity(New Vector3(0, -0.3, 0), TextureManager.GetTexture("Textures\Battle\Water\Whirlpool"), New Vector3(0.0F), 1.0F, 0.0F, 0.0F) @@ -6785,9 +6801,9 @@ multiHP = CInt(.OppPokemon.MaxHP / 6) End If End If + ChangeCameraAngle(1, False, BattleScreen) 'Bind Animation If Core.Player.ShowBattleAnimations <> 0 Then - ChangeCameraAngle(1, False, BattleScreen) Dim BindAnimation As AnimationQueryObject = New AnimationQueryObject(.OppPokemonNPC, True) BindAnimation.AnimationPlaySound("Battle\Attacks\Normal\Bind", 5.0F, 0) Dim BindEntity = BindAnimation.SpawnEntity(New Vector3(0, -0.2, 0), TextureManager.GetTexture("Textures\Battle\Normal\Bind", New Rectangle(0, 0, 80, 40), ""), New Vector3(1.0F, 0.5F, 1.0F), 1, 0, 0.75) @@ -6821,9 +6837,9 @@ multiHP = CInt(.OppPokemon.MaxHP / 6) End If End If + ChangeCameraAngle(1, False, BattleScreen) 'Clamp Animation If Core.Player.ShowBattleAnimations <> 0 Then - ChangeCameraAngle(1, False, BattleScreen) Dim ClampAnimation As AnimationQueryObject = New AnimationQueryObject(.OppPokemonNPC, False) Dim offsetLeft As Single = -0.35 Dim offsetRight As Single = 0.35 @@ -7109,10 +7125,9 @@ Dim HasSwitchedInOpp As Boolean = False Public Sub SwitchOutOwn(ByVal BattleScreen As BattleScreen, ByVal SwitchInIndex As Integer, ByVal InsertIndex As Integer, Optional ByVal message As String = "") With BattleScreen - ChangeCameraAngle(1, True, BattleScreen) - 'Natural cure cures status problems If .OwnPokemon.Ability.Name.ToLower() = "natural cure" Then + ChangeCameraAngle(1, True, BattleScreen) If .OwnPokemon.Status <> Pokemon.StatusProblems.Fainted And .OwnPokemon.Status <> Pokemon.StatusProblems.None Then .OwnPokemon.Status = Pokemon.StatusProblems.None .AddToQuery(InsertIndex, New TextQueryObject(.OwnPokemon.GetDisplayName() & "'s status problem got healed by Natural Cure")) @@ -7120,6 +7135,7 @@ End If 'Regenerator ability heals 1/3 of it's max HP If .OwnPokemon.Ability.Name.ToLower() = "regenerator" Then + ChangeCameraAngle(1, True, BattleScreen) If Not (.OwnPokemon.Status = Pokemon.StatusProblems.Fainted Or .OwnPokemon.HP = 0) Then Dim restoreHP = CInt(.OwnPokemon.MaxHP / 3) If restoreHP > 0 And .OwnPokemon.HP < .OwnPokemon.MaxHP And .OwnPokemon.HP > 0 Then @@ -7129,6 +7145,7 @@ End If 'save baton pass stuff: If .FieldEffects.OwnUsedBatonPass = True Then + ChangeCameraAngle(1, True, BattleScreen) .FieldEffects.OwnBatonPassStats = New List(Of Integer) With .OwnPokemon BattleScreen.FieldEffects.OwnBatonPassStats.AddRange({ .StatAttack, .StatDefense, .StatSpAttack, .StatSpDefense, .StatSpeed, .Evasion, .Accuracy}) @@ -7283,6 +7300,7 @@ Public Sub SwitchInOwn(ByVal BattleScreen As BattleScreen, ByVal NewPokemonIndex As Integer, ByVal FirstTime As Boolean, ByVal InsertIndex As Integer, Optional ByVal message As String = "") HasSwitchedInOwn = True If FirstTime = False Then + ChangeCameraAngle(1, True, BattleScreen) Dim insertMessage As String = message If insertMessage = "" Then @@ -7655,13 +7673,13 @@ Else GainEXP(BattleScreen) + ChangeCameraAngle(1, False, BattleScreen) If message = "" Then message = BattleScreen.Trainer.Name & ": ""Come back, " & BattleScreen.OppPokemon.GetDisplayName() & "!""" End If BattleScreen.BattleQuery.Add(New TextQueryObject(message)) - If Core.Player.ShowBattleAnimations <> 0 Then Dim BallReturn As AnimationQueryObject = New AnimationQueryObject(BattleScreen.OppPokemonNPC, True, BattleScreen.OppPokemonModel) ' Ball Closes @@ -7723,8 +7741,8 @@ End Sub Public Sub SwitchInOpp(ByVal BattleScreen As BattleScreen, ByVal FirstTime As Boolean, ByVal index As Integer) - If FirstTime = False Then + ChangeCameraAngle(1, False, BattleScreen) HasSwitchedInOpp = True BattleScreen.BattleQuery.Add(New TextQueryObject(BattleScreen.Trainer.Name & ": ""Come back, " & BattleScreen.OppPokemon.GetDisplayName() & "!""")) @@ -7813,8 +7831,7 @@ BallThrow.AnimationPlaySound(CStr(BattleScreen.OppPokemon.Number), 4, 0,, True) If Core.Player.ShowBattleAnimations <> 0 Then ' Pokémon falls down - BallThrow.AnimationMove(Nothing, False, 0, 0, 0, 0.05F, False, False, 5, 0,,, 4) - + BallThrow.AnimationMove(Nothing, False, 0, 0, 0, 0.05F, False, False, 5, 0) BattleScreen.BattleQuery.Add(BallThrow) End If End If @@ -7845,10 +7862,7 @@ 'Sticky Web If spikeAffected = True Then If .FieldEffects.OwnStickyWeb > 0 Then - LowerStat(False, False, BattleScreen, "Speed", 1, "The opposing pokemon was caught in a Sticky Web!", "stickyweb") - - End If End If If spikeAffected = True Then diff --git a/P3D/Battle/BattleSystemV2/BattleMenu.vb b/P3D/Battle/BattleSystemV2/BattleMenu.vb index 16b265fa8..c63e7f3cc 100644 --- a/P3D/Battle/BattleSystemV2/BattleMenu.vb +++ b/P3D/Battle/BattleSystemV2/BattleMenu.vb @@ -604,10 +604,21 @@ _mainMenuItemList.Clear() BattleScreen.ClearMainMenuTime = False End If - If _mainMenuItemList.Count = 0 Then CreateMainMenuItems(BattleScreen) End If + If BattleScreen.OwnFaint = True Then + If BattleScreen.BattleQuery(0).QueryType <> QueryObject.QueryTypes.ScreenFade Then + TempBattleScreen = BattleScreen + + Player.Temp.PokemonScreenIndex = BattleScreen.OwnPokemonIndex + Dim selScreen = New PartyScreen(Core.CurrentScreen, Item.GetItemByID(5), AddressOf ShowPokemonMenu, "Choose Pokémon", False) With {.Mode = Screens.UI.ISelectionScreen.ScreenMode.Selection, .CanExit = False} + AddHandler selScreen.SelectedObject, AddressOf ShowPokemonMenuHandler + + Core.SetScreen(selScreen) + + End If + End If If _retractMenu = False Then For Each m As MainMenuItem In _mainMenuItemList m.Update(BattleScreen, _allItemsExtended, (m.Index = _mainMenuIndex)) diff --git a/P3D/Battle/BattleSystemV2/BattleScreen.vb b/P3D/Battle/BattleSystemV2/BattleScreen.vb index 444072a8e..65ea22efd 100644 --- a/P3D/Battle/BattleSystemV2/BattleScreen.vb +++ b/P3D/Battle/BattleSystemV2/BattleScreen.vb @@ -411,7 +411,8 @@ Dim q As CameraQueryObject = New CameraQueryObject(New Vector3(13, 0, 15), New Vector3(21, 0, 15), 0.05F, 0.05F, -0.8F, 1.4F, 0.0F, 0.0F, 0.016F, 0.016F) q.PassThis = True - Dim q1 As TextQueryObject = New TextQueryObject(Trainer.Name & " wants to battle!") + Dim q1 As TextQueryObject = New TextQueryObject(Trainer.Name & " " & "wants to battle!") + Dim q11 As TextQueryObject = New TextQueryObject(Trainer.Name & ": """ & "Go," & " " & OppPokemon.GetDisplayName() & "!""") ' Ball is thrown Dim BallThrowOpp As AnimationQueryObject = New AnimationQueryObject(OppPokemonNPC, False, OppPokemonModel) @@ -438,9 +439,10 @@ Threading.Interlocked.Increment(SmokeSpawnedOpp) Loop While SmokeSpawnedOpp <= 38 + + ' Pokemon appears + BallThrowOpp.AnimationFade(Nothing, False, 1, True, 1, 3, 0) End If - ' Pokemon appears - BallThrowOpp.AnimationFade(Nothing, False, 1, True, 1, 3, 0) BallThrowOpp.AnimationPlaySound(CStr(Me.OppPokemon.Number), 4, 0,, True) ' Pokémon falls down @@ -453,15 +455,11 @@ Dim q3 As CameraQueryObject = New CameraQueryObject(New Vector3(14, 0, 11), New Vector3(14, 0, 15), 0.01F, 0.01F, MathHelper.PiOver2, MathHelper.PiOver2, 0.0F, 0.0F) q3.PassThis = True + Dim q31 As New PlaySoundQueryObject(OwnPokemon.Number.ToString(), True, 3.0F) + Dim q4 As TextQueryObject = New TextQueryObject("Go," & " " & Me.OwnPokemon.GetDisplayName() & "!") - Dim q4 As TextQueryObject = New TextQueryObject("Go, " & Me.OwnPokemon.GetDisplayName() & "!") - If IsPVPBattle = True AndAlso Core.Player.ShowBattleAnimations = 0 Then - Dim q31 As New PlaySoundQueryObject(OwnPokemon.Number.ToString(), True, 3.0F) - Me.BattleQuery.AddRange({cq, q, q1, BallThrowOpp, q2, q3, q31, q4}) - Else - Me.BattleQuery.AddRange({cq, q, q1, BallThrowOpp, q2, q3, q4}) - End If + Me.BattleQuery.AddRange({cq, q, q1, q11, BallThrowOpp, q2, q3, q31, q4}) If IsPVPBattle = True AndAlso Core.Player.ShowBattleAnimations <> 0 Then ' Ball is thrown diff --git a/P3D/Battle/BattleSystemV2/QueryObjects/AnimationQueryObject.vb b/P3D/Battle/BattleSystemV2/QueryObjects/AnimationQueryObject.vb index bd7e555cd..6ea89d65a 100644 --- a/P3D/Battle/BattleSystemV2/QueryObjects/AnimationQueryObject.vb +++ b/P3D/Battle/BattleSystemV2/QueryObjects/AnimationQueryObject.vb @@ -103,10 +103,20 @@ Public Function SpawnEntity(ByVal Position As Vector3, ByVal Texture As Texture2D, ByVal Scale As Vector3, ByVal Opacity As Single, Optional ByVal startDelay As Single = 0.0F, Optional ByVal endDelay As Single = 0.0F) As Entity Dim NewPosition As Vector3 If Not Position = Nothing Then - If CurrentEntity IsNot Nothing Then - NewPosition = CurrentEntity.Position + Position + If BattleFlipped = True Then + If CurrentEntity IsNot Nothing Then + NewPosition.X = CurrentEntity.Position.X - Position.X + NewPosition.Y = CurrentEntity.Position.Y + Position.Y + NewPosition.Z = CurrentEntity.Position.Z + Position.Z + Else + NewPosition = Position + End If Else - NewPosition = Position + If CurrentEntity IsNot Nothing Then + NewPosition = CurrentEntity.Position + Position + Else + NewPosition = Position + End If End If Else If CurrentEntity IsNot Nothing Then diff --git a/P3D/Battle/BattleSystemV2/QueryObjects/MoveAnimationQueryObject.vb b/P3D/Battle/BattleSystemV2/QueryObjects/MoveAnimationQueryObject.vb deleted file mode 100644 index 9cb854966..000000000 --- a/P3D/Battle/BattleSystemV2/QueryObjects/MoveAnimationQueryObject.vb +++ /dev/null @@ -1,3 +0,0 @@ -Public Class MoveAnimationQueryObject - -End Class \ No newline at end of file diff --git a/P3D/Battle/BattleSystemV2/QueryObjects/TextQueryObject.vb b/P3D/Battle/BattleSystemV2/QueryObjects/TextQueryObject.vb index 74013718b..02b6551be 100644 --- a/P3D/Battle/BattleSystemV2/QueryObjects/TextQueryObject.vb +++ b/P3D/Battle/BattleSystemV2/QueryObjects/TextQueryObject.vb @@ -67,11 +67,11 @@ Public Overrides Sub Draw(BV2Screen As BattleScreen) Dim rec As New Rectangle(100, Core.windowSize.Height - 250, Core.windowSize.Width - 200, 200) - - Canvas.DrawRectangle(rec, New Color(0, 0, 0, 150)) - Dim text As String = Me._text.Substring(0, _textIndex) - text = text.CropStringToWidth(FontManager.TextFont, 2.0F, Core.windowSize.Width - 300) + If text.Length > 0 Then + Canvas.DrawRectangle(rec, New Color(0, 0, 0, 150)) + End If + Text = text.CropStringToWidth(FontManager.TextFont, 2.0F, Core.windowSize.Width - 300) Core.SpriteBatch.DrawString(FontManager.TextFont, text, New Vector2(rec.X + 20, rec.Y + 20), Color.White, 0.0F, Vector2.Zero, 2.0F, SpriteEffects.None, 0.0F) diff --git a/P3D/Content/Data/maps/battle/gyms/violet_gym.dat b/P3D/Content/Data/maps/battle/gyms/violet_gym.dat index fc4fce5cd2385cd5503173f9b2219627d15b5a09..25becde102a69ff7c1cfaf53833756b086d1d718 100644 GIT binary patch delta 73 zcmZ2Bk8##K#tm|c(vA!{Kp4!B$&kX3%23SU&yd8B1!N^NluT9>(4EA|GC53f+hh*0 bfXRMbe3SVcwoDdalbUQG&ayd1`II&Q!(S7a delta 42 ycmbO=k8#;N#tm|c?9L3O3`q>BlNAMYCvmb&&QjdA`GJ}j<77Q?w#@;`r?deZPYqQ7 diff --git a/P3D/Content/Data/maps/gyms/violet_gym.dat b/P3D/Content/Data/maps/gyms/violet_gym.dat index 02a065626a4a7200a6f1f476a527cb55e6e2fe3d..a9c071122205a3e6a02dfc1450e145549213a9f7 100644 GIT binary patch delta 77 zcmX?hl=0nB#tmNLyv_`%44Di$K%B>rK3R~rTG|oF%V7uxilhMLiW&SFk{GgptYn6g b$%)#!lM@8kHvbUUV4N(+&$n4ma)u`WKMNGH delta 51 zcmV-30L=gH#R0~}0kBFJlMppTlh6+olW+|j2SWgL0Ac`TlaVzolVA`Avmh8K0h5ps JlC#t#E; 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 z zl=bWuJ$arn@))1-WTY$b(eKnj(4Yc($8I@7eA0tdYvp8lVBf>PW6<=V_Mv0EF8Fp$ zz4qGE@ufqQ<)CG{8Et6dxIUR$-$%4UJNrVs6#2>~o^P$VMsDsb|0WikK%Xe~@v0aF z*4fKd=+oonZS>=I@SSerk#54<|e~9zs-xp{|bHUb7^pPcehKpaY@pwF{t*DPp#|VL*VO3+uv+vDc&54=C zK79;y3AycmHfW{q;edyqf6i)&7JOE8M{gShmR%wLS@_(Fet4FOdI{S3WRPZ(NaMO` zVCr4a>^M5&1?=I<_Y?Sj0$&G%H*dv45hB~Mu0f)LqC(aZEG+^{hLj8b5Sr>f(EHo- z-7kHeA|3l%s#^lk^`pW1WrnXhEE>Xl-|*D)MOF119=uri@O(cM?G(}2kUQA8>vHh) znfM*OcsN*7Nfa^abbTh*@Kl|(Cziw3M6=El$EPu`w#YKUp_lDJHKRsc;d5uZ84#dhxfh-aM-Pxb$QTnxpwMbET`K7s)! zxG77EyZQ}PP0e}N|NRQz4FOyHwg#>Ys}Nc4>$tC{4U3V%-%mj=nF?Muq~2ahCQ@oP z{&aaeMzZ4GqKsON&s5}oZ{#z5j6T==&j|b6 zB&$QP7FN%{QqV2mpa8#&shO3~|ON`XNu#Vl6wQLG|QHpg?9!KFrnjNL_NbhGBdQ};ER z8a;F7=Nt+7Ej+-_H&FN$4|Gev`=PWkTisyKVWn{J%VGt4K8U>74?UtG_j6Qz*{z8@ zUqck5UGRyvVE7ub1)LFJT@mN6L%z9<{xz7IRD&oD(iNwfmXr%-55-*UmgCO3>QDZeY=5UrW#BJxgze9D;D96t?`tRU{5;n zaSUF0i5y*9-IjCVv^lD$TBVoO+nGy^`j#yFrB2Ho{gdV-Z}Ld@z8thLR13}w?JvUh zmsFZ*JXKY7iaqRwK5&74=38=okvei%IIEsmbt-;36pz^k7oNov4G{il0dDZmQs^ny z*wgMX&F!LuIE7~AEcWTWsmF$7#%1RElnq$uKP9MsNL*M#cFmmArq!Ip`rfFi?4cK0 zRt@-Jq8I@7|HQLdQM_vKtbg;QW$>2M)SpS{a%-{l8~O)DoU0P?5J_EGfy`T%p3phr zBqmd@?9P3VJ0Z*?qLkmTz*c@g1a|yT`{OJlLH$L)FOAx_E-deyYKfkoOdWWaJvk~$ zs44L24ft$#u6I_P#FIXg=jXuL%EKGa5Pe2<7eX{nt+3`6)$-pW>VWP!P`IM`;*E0Ytix66Dxhm zNGo86AH)R_%QK~mC1Nl=j$I;8Pg0#!wBA`yHijB;mW`GHj=wo1y{ePiDWF|&w}=N( z_rrQep412EL)0zwx?-{&dfo42+hHn%Z2pd3%Vl=-Pf$7ftbZDfl!}&q;5qj2gvi8Z?XYDGYpF*Z>?STsvbU3n%IeYsU;U13;l>`< zVVzHihniS>7x~Rg{*!+_e_!m?xR=3a!wN#~ga^LOeCLM39V52TGisp*;spz-eb>k= zYKWpvVFZ2kt}x@9U}P&Q>lm?$ud8F@v0!*r(0e2J_Dj)|V}*HO)-?S4G-y1DN@p`U zYkk7P#OScik#z#U3ptlGA$g5*P#^Sv^+v`Sbe`ipUp+G56M8&1xbJIxuN{Bu&Hkl{ zop?=OFlaY-P83Mz#77bwpdouPpT4XwSoKt2OfRpMk!ktMlI~E(!SZ@w+Q7j2A(bL- zMV$(n5bmY@qn#lRsu2%URYlbw-RY%V!r#YYqq-tMSNPwP+_GP{1WgW&4O<);9C|QfP-fLnU#*j^ z>-9aiH!*3%?>Uig5xN;5H#15XfKd83{ zj9mer-9?t3NB;KX_s(Dx2JZ=WrAudVgw)8pQoUdQM02!m-@%FPay4 z@NrQ)gVu$bTC(M5!$+lp*LLLome?$e9!qud#Y+0RHDTE;!JMyfiN<{9!!atTN2rQh zMIIH1H+wn;r8Aa2-N)YFq!)M;t!lVX=!&uGY@S=*kf08sGr~pG&5%Rk!$1C%@t>`j zZG!Ho#~4$MNb0@sjK5VQ{C>YGB<>%<^;eJ;Ziy5u+>HwEAL9Q<_{?_nqtQHfk-BjT zUp|Ok{IF<0R`-c~J`@}8x8GntEPlq5%%Jqpe?uomoKE?gx}Vy-0zSG2#d{ZjI~$yM z$epU=a~FxdH*mM2$$&He-zO(}mfg{W%fYk0NBjC-?!mLJg6F^ES?TymAL2#_n>Fdv^nUbw8QCKYEW3x#~MSCxUxov2tT=i{V~9)zXKo7?oIoEaSy;1hK|uU# zzMXZxSx0#58;$aYBPjSytxzN37;Df3CWHHF-0L0~J0IWt9v|{0C&j7dYLosOeLu~t zV|io$*eTmFChhT?Qx7M&W!#H-3~i_udy8#Rp|K;JMgu?j!$iJzB~Q|PHYp-=ryZBd^3QGJdX zU|g{*wzP8U;n@7WmVVx)uE+5ERb1*N$>eh8NFzhPrhhg@8_nSA-y8p_05rb+^w3_i zzG7y{@a^9 z!t&YCa7;+Q_Mwk!tjFH_6J2g6TuCgdm5!ku>^4keC-%!$dr$)YqPO*07DpqsW6kbl z@*I>kch=njPSplPJx*V8pZH058-tB^+TU6;>shnRld!~v2PCvd zx633?pT?Uf!jCI~Q})aV)EAlhZ)S+mRQqOmW@~C|@-#2$_j@BBb$+0`cKXor<16Qn zPUS5@_RVaYtWWgA`aHDGT(G9E;X(!TPRz$2Jh4C+_ZW>zkFrZ|c!=7Kp7WbBLAi(L>_E zl7{fegT%Ziy-{!UjNh5D+pG7}+gUH0DfS`uYn&H5m3_4><;9)k2f>e~xEH1;f5>(I z;?%=Z%u?F6-I}f+*L#@ZtobhZcbT0m4|a!xH~pCBSt6U^Yeg|Wllo>hdH5gpF$nJ6 z5Z&IXAS3@$$k6b_yWtOCgj@;lRWPXFvDwBfjgCH_K2r=&ThZ8uGI9WIR8u9?9GSx2 z&7d}$32uK;bJTXU#57}u(M&h>U~3m^3wvRYKvwL)>#J#v?pAy_;eJP#U9Uc;csivz z?y}6XBwPDh+la?{UDLxD4*paCi|-cYGI&55*VeIm3)b&LRM*8P_rdi>VYhkU@sGxN zb^OV+_uQd=tu9U3@XCYHF#HF z6)QVw&nyQX&xtSYw$F1-P@T|zx&P#P+48N$#2$T&>1HexIELsFH< zA?O(Y5u>l+0u9K3v(f#Fi(vh4Q<#IabjvzNFNd$6CV&3wV+44(+C06Ujd{Mwd|)&d zL3(?0uWq38K4m2I)M*7-)3=bGVHDjE50kdqY_R3E5 zHj1$BB3{!TKHt>{QKR6F{Y-x&OxvQlJEYo zCthwy!`O^xWyzEDPzPYomg+R?T`#MkmnKn9EhqMO(pN}l7Vi<*8D(@aPUu7Q`(_EV z;qzlJ*1Kt5JH1}`I%HhV*zL5%ak*AW8^b(5_fgC~cTa`p1C#)~JL^yYe9bx8Wrm!82| zUBL1pK71TbGLSXbgGHHSu7PM_?qu9Q$)_z~Gd~zN)i`>8L(D)UPTQjmwC%H6U(HNO za_j8X&|{wWi}xw%zc`O_dS-cGIciNY*NbYRhPlSrK&7l1lb9*#2IgIp6}WaBd2ki? zK1fF}6#RH4wuy1*NkYWvU94lxAM$JFyN1<|3~=q?d6qfRiFTdsPSL0S2rDm5FZXBa z5KnqX&G3nF)TNEszt`}DK4|uf;Fzz}Xkul7IAk<1F6-0u64uS;3QIrB7sm{T#&7Dr z?L!ZBnM;AYme%>r-eT*VHR9+Cb6QTqRc~XSHGU??<+De3uy;>l<1>4gga+4>xcMC} zHCvTet*I^U;ok?)Kr@Vy#@oV}!i!NUF%Mnad)5s9E7FqRApf*!XEu`oVyNK`)11ca zKqnOU!*JsWd}A4Ue*?^!>$?{KOeR zpbOaWMV3MH3WZyCr{3wpyh93k`!utkD~zw|y#A~Hr|DoOSdLjLIu3F;l%1RX-p3N~ z(PgoR{nN;#yJkJ}i9Sd#ZLTs#!6lrGT}&wqlk?#%X{@sXdBqFHodRz7P|cK5f1|cE zkw25OYQP{pK!w>thxaGQ)ybL9n}HhzzHbAjWon-;J0!vF(zJHwzw{>Q#E}DUf|(P* zwJbW1`|-10Y6E=W1hrdpwFRAdATuFFbKG;y7{gf$wVZK?x0U(w%NLt(y#R05PM#&> zDkVrJPd|tmq6s#5if5fbi>`+aT9ILG*f<_r`+$)lR1T-%jaIa-CRDVus44c*AE;nl zQLg$dX4NYhKfjEAwZ`p<=TPsxep%@;AI3TU?%=P@*H)Ry#!InCbZ7qVJXpO1uHa7& zaEJGQA!jv3zb~>;2)XAi@m)>C>vxUHhO_RWC0bisE9W)MD-6CJ7UeS2BPvFZo32&U z+_2*k>LCrSVkkMaEze$=svsMm&AUoP$?0qM;LXCzqJ|K zf7Wkii8tln&UJh3`Ps9D?~r%H-X}ZSIZo1QXyeQ`h6^0JHS+_r>5=y(28%e|De$Qf z&e4@P?Ln+$h(FNdm0F1oX`x>huCK-39!AGPSr{KtD>~O@m4|mkwdi7nmcnwzGBQ(H zxnAYK!zaqYc(MZDBC&fMdpVj}rD|Zb75(Y3s-i~FI~##++g^9lZ=#b;wluNCIpo`- z(|3Ki;9lH2(`Bj0s#g&y=bR5XEwD7Uq?50@ivoQjz1IaOIU}igy@=gQ|g?uQT=UDb+4t4if`Z<@V6$#PTi^1GSw>MG_yru} z05$S7Fh3TnzGt;>snCB#IjRizcrR8n8(UHJpno~Xc&nQ0cKUhnY^24>^4!62&^})K z*xzHfx7VW z=GD>H&Sjzd$ixmw9UKPQHfU9}JY$j(MsNBak+PTTmL!{oqHV2*D_)`A9SEPHXvtbz zhzLDGO;^)(O@D24H738_n%2qvoY!N|V!lCdUcPPO5k6HUZy=2t#4S1*h|RUO?|+hdk8e<|!xcsJ51rl0pzzvZ#F z;%3@6w|{{ZgTTui)K`BHB7;uvNmT0q*1VDR{z|`RKhIMO?X`d@z(e#LrlSRY(vRtF zj0@_Wwo|*#%y9JkBkBA7mIgZdmJHbb+AXcUV{3=iT2sv*t>6)JEqlquM?oHcIQnHU zxd)RODfoyV8qs&);7Rd4x?iMhERyv<=-s%Gw~iaSG0wi8z4lnf&-Xs&r$zUU?OITy z;I1m8y0iB`GF`V7oU2G(yqmqd#k%+7bq;b3J*Rf`X9kG2WSll&g*zJNM!g38psMI! z36`tYY_s{No1ZNH34wRLFZzvs^(ES;{P56{?hibzmI+AgAiF5F# zFVxK;)Zbt5x%)(SQSa&){_|4&&dk#mc}lOUZ%?Y8?CKNbKRMJr{8iTY>;N;%m@b~_ zmznWhNWLr04*m_FJA_sm#@=ONhcfV`nZh1Ts-$|SuhTmle(JsEqy1o>F^*g2T8`Kv ztv&J@AJocgsPDxmC!e;oZZzlXx?X}Bd;q$Xo!W{I4rUMS;YQuT&!hDC47_d? z_AY_lPl+|;uECB1BslHpT4;7;(ku-2d4KGnC*M&Ed#zfw)< zP6nf4qf4^ZZCodWPsyyYGo0oRG|A=agDlUyYPOoIM)Le95yk+mytdgIZ_X}QQgA(F zPRk7jN@mO1UYMzqS+&S+6)X|pNk2y2EfjC|@-1rfpi)rGBFz|=Dq6~Om zDE;)!%p*d=iUP6zjhWlp!pM9^GS&tukRrLES`a`VM{=Quy z*yux_voiV4g>_1p!D-f(O7{vCjC>SBufo9Ee+he-4i*!G!0MVJOqa$|^{bw*4Ke>Q z)@8KK+~L1EsJ-v(fT<~NsU;k`*v7Hu>gXDE$<1x4SyPDP19+MR%Nz7T3(#KwqmNV< z)^~&1n7JxL_9Q0HFl(6&=KVlFbEu{?_qa<5QXrRThY*YBmAELh40rz;ztio@^xubqx``dIhD`suTniSA8 zxRg%||EVuBUUqX>XB(qeWFBxkC}+yX>KNL^QhdXt=AH@Gt)kB{8&4ktr#Zk~mXTB3 ziHu>)qJ-mlwK-Q;idn*0`pl=rpCx&J@jDg%Qw)`1N_e&O z{rPFzXLlUJY;E#e9ya>87G)7Wy21I7nR;VAl>E5~9lMS7sOgt~CVx~=$)bu{TF?$QQLT}9o7z-g~mDix%SOMABRVKmhvt6xJ$gR>aXsJHlhZY zP>U;{BvyVQ|4)F=HKuR+6ZT9bw-?QX6!kWy@GNt%(-~$O8ZqB%hyR~|v$)XXng4eA zyQh9Zfp-En27i8+`F@CX1-$&D{s697)axt`>SdAtx8lP^{$|K|#K=C_d2?`-X&w01 zEqa?@^$X;!mFlSegZ{$kWQ^A`EuEs~#7y(L?K>v=Tx@6UwdEcwdjMkgMZY}+U!I2M zx{Pd660X>Up3g0MoRi^5TiM@#uxDqmR3}H=BzOIeA66D|`X=hc#_8IJH~z1KcKB@$ zyqjvIWuR{~6HoO3)q{?D(Y!Y&Mfk7fJabcQ{*iNLZJ1xW#yrG4a{E$d!){Z*HW9h{ zCuWih^vim8G@u2#q3?)_iRtOR*)K4nLv*8p$puAc=*GZb+*DnZTPMy}nN$#V(i!eQ zmmS|^?)!}vN7&N_mce--+|EL4km=qXp| zyY6IuV9%3@PfvQ^@_QKGCaO*TnEYVuFbz9yQN=-q_Ob^vlo#1c8&7f_OV0u|La=UK zyr3%n=gvJAffbGD`P$&%2lTPJ6Wrrcwqs5o&NW}=9Kfuk+Q~I-Q>>#!x_*=2O^0px z;}=2ICB0*n0l?kZ7<&kte;T;p#drKqpIh+bMLS>eUWmraAM zVS}R{#kBfz^~(4QX-_wu3?) zP&_`MRSGcso7hYrdJ8MNCBDEY>k!}WaFbc^j-r{{j{I(FYR|Oj;Gv!D?da~q$=B1U!>yczw}Gup z%EN^>U>h$H4JY}X8g37~BM@$189q{Uw*AK2EAPGwJrmwD+%?jY;h)jO+-_uxEn*dV zZ9I&toH|23xdcygmTibNlQj?E>!mj0|SY>&ZN>su}UEfw=Lz9Kkv<_mhbN?Ey;;gkX*XsdCaVJ zAi*y1W(KoXJ)Zl#7!X`K>{ev)n2|a6b3Pekjgrj&mVrlH0xiAB0eNtQZeV{=|0)pw zEjp(@j~uq0Yc`!?iaCftw82~O)1k&gb*f-f!MNxHvEG4aLe3;jO-?X|8yYwn zhw@kCr#p!6cgzj0fG0gr)tGjCM81os?s;#UVbOHdUZv91-j9QH@y8=Eo3}5i2cVn`*3E0?^xF1A4UWH7a$T<$j%;T90!oNly3mp|P_ucaM zMRS)vV8?baZkBpU&-el7B})_SQ#iBfNY(ZVU#O@$6B`eShn9Tpi54-Kx@#}}-rfJN zZx+dK^uE?7EJ`dL_&In$%$siO1q?&|;D3T6#!sIl;`tDdnT-7q!Yb}kJ?79sdbrokNPvz{ND7^59rR;1!i&G zTiZ!4UhB6g@XzF4FG8GL91mMYSaw+dgRf@jw>dX^h&r^da+96S14h^vyWB~h2Yp6n zI)7SeyJ&Txm-V~)Ud1!1@R|9j8_bJWhofdX*_>v-Tk^h@`vtF*0>6SG#7?p?%2)!w z9l|{17yYI_%6irOO{=Np*_zq>6aGx>6x9b0z4b9@r9mbh; z%}4O3QsmX+fh|K;Cag)^P9M&T8H_A*q8WkqT$-A$=$!Dsbecw+v4*XnL_rOoPX2w< zYkZh)4K>%%AL&F5XNN9Ok{Y`iXH2$G$2_-{x4q3+mFeiV$8*xR`QNUgL2TsgyE64KmN$3lOmSL&v^GzE`1~)w1%XG6WVHvKVOtNw?6)+lD!;iX&gr~kkxA8>u65yN{Zvb8#1{e6FZeIc#5 zb&B~DJhM3cz5e8j*7#)(o!8|sy*%c+K4ompEayJiYjEzt+*QQqV|s*7sMtCiSJhl_ zsFNED3ih>;5R))e#26UHp>t$v-7qn_`xx|#h%BK@wd z#$4+DIh=QYDvwAf&dsg|yYq7^e(mah#cNk~YIbMq3^RyYATLcbaz^@(|ycj`D6k8vJ~zpM($3@hSmcl3sO zb?YLtCvzb$=u!Mg?N!&h(wwdrhf8%;p5Yavu07rGtO44}EzTnjv7RyKi^^h}UGxt0v(Fiu z)4*7#Qs_Cwz$%K~qtJ|Mt)+R`ct>67XDu-8-o1ObE?|A|BW;#;f*QbP&M=DcJ88^D z7ik?md4Eb(UHFHBJ$dN^}R7=qq z(}Nd><-b_?>W=lLX@i?JB#t|PD^rP>|IjVN(70w1v-x?I^Vj+Oq$M0I{d8q^V#7qBM-qPAHm_$)h{Rkp3L}+RPUHhUBcPejlx0b4%KXLLUxDuPkQ-m zh;@xQg}I=T<}%|aa^mksCVacP9Aeyq7ycl(@V>BVeq91zd_0&@Xf`u_s0r?qYpmEUA^=Dy4kg{t784dG*G`r(u1ss4mOjV^Bc3Li_tTOJFKy7 zc#-weJ9KbFY2J0>sHQT56HDeSCLbGZjZ^fWOIpX7J(x$E?R4DnNmTpT#JCp;jqv~B z=!WrTcXK%X%|T|Wv5Oj_j~QjG5p~3F`j~P4-a%X5?tNF+VXm!`o~iw7);8Z#$L^&^ z`Ix*sR=to#zVJA!Y4#?c8~!)H*ylE|Ew(1|zJ}89${S$fEGoL4X1=i*U2U}UCZ|7M zy-3*-ur9c)9-!S~rfr&;$XVa&;t;=+s^8UjSu@N&=+)I7I@?af?MpZi>lrtaJoukB zRvX1TPjdBp`f0N{bMEQ-EwhGMhVzpN`gGkXAUWt_iuU^FVgsEISSDL$f{6>zX-^n6 zj8v4EBJQ)49C7Ju$k%4Pv*pOAo}YuQS!U6c>qHQ?8#c?OPLAZ=ICHdy+6TuJhl}sG zrf2w+2{>-I*sd)2Cd|#u^DY;S%_GKA<|zHl%H}z}t$y6hG&;mLda^evKBlkju+>`| zrd7ADGB?n>sKks|2zl|fF~u;*cP>2h_^{}RnaOr9bSG!W>GW?t!o_{y+dJVSf%MFX zT5+6f*DriuFq9m3;Nz5xWu~WLLF2Ci$0>$#NxU>in#)tJrv?Td2w4F?*I$-}*=uBOqu4M|_09J5 z(tOc=f92d&8SvsZb=GNk>|yG_V_*EfbnzbJm-e;vx4YIiW;t<_8H*OiGC2L;Wbrj1 zM^)6fht{&zl(hG6k^?V>47N127{+v}?NjuO7s*=G7w_mv{mDCoI%)-$`OXWSX2v&r zQa9?4m=*l&Ec5;w%_O4<+GH>0=_+$x_L^DEtVW-#C*0j7qPqAq7_`jNqxe_Q@d_ipa@=F{QN4IKMBe6K&JXSLEeKnzZ$hAjur zC@aqEC+SbOdS5oZW?<(XUXdtQM!?9JJ&qPd+I-d_=j@2-o8i+UEH|75UpN2ec|;~vDBbyxUvp1Mp{ zSRgA<*L`74P8MJLqk#)TYQ5?6_8dLdGR&d(XEyi*J6wz0a*cVlH2ti8kJ+zX^bNlA z9_Z)srBv<&{PZL~vXdO}h52r0`hrJ{5=IN*q8~AfnZB>8q-ueA!FAB(>eJslME|}N z&((#qy45)IF^R9YgJG|De^65Fr?~skS+OH*|5m(0@6dPwhipv#oI{`eZ?x)EHBXhzE1nm@dD@6?&%aeO z)}kO*=KV3nVFa$s1MQaAxN=FfwgJqfcYWLOo#8XWemRFqx5w88TXk7n9Lk!S^Tl7aZt6x#%cK(`Ez^+2CVp0{_}Qgh#8u2ijEqNUOEm9{vy5aYsPm*9s0yasFPM{Ew#_q_SPAXe~n-Ftj+T} z@MH^du%9!XlUrI))s$u<9!O} zRc$(kyRae}7&D?}J}>>;HZ(r`PTt+TCCtv+(c@rBUNi>-D+w?Cf!V>_Y3Xk1<2=ym z)awUnox;K*<_kNqPOqo8pl*%kJ*kf7G2m;MrlfuNQaWfNYJ9c&Gq@`NA z(C6$VKA^=OSF!Z|?!(izQHQ(gRrGg}En}{y2wnQ`b;#W7xFafr62EiJgQ2H z8*rKmX8Xdlf}Q@OgYLn*LsWHCAx^&1b)JsTRwY+`!WX-XG|mjHHri!`Wt0y2H>{TZ zTf0c~{SRs^c)gFaAahj^vvqCo39I-^ugC8`dA99&aAe<@Qnq2t!f()Xso{Flg&7J% z-bnoPre{!@F6$dO<&V*uV#_|i^Wsl4%s7I76rFXNixyp^sC%FcKb5_hg`%Tx*<>je zd^L1LhEwKk=0hUk@0;+FqH|a;B$E|%bL)}Ie`3$(WWLJ04Hg}>TWYrgOy7X7{6L-w zr;a?xWW;ae#XX#xxJ>@Ar2h1}cI2bz^5my5a+-<4av80+7d*2#aoLEopwozh!4AW1 zJ~2-p&r58W^oqJ6QQx93V5aE+b6M5t;}*Tsr8(TQEjsx~EyL0~^j&!W^jaTYG81~6 znWm*iusX;4DO{=i`_gTwL63VGdheo~@SO62FM}`T#pg}32ALW9dS-VHqEThh}$rHNA)$F@&? zczQ5lXW~3&n$I&sG~UcG?!y5SjYCGTzFMzA%`sVb&>IO~eOh>I*VYs|Uf4bSqE zuRe~5?+Okr(tgmq*q5!GO=`&+Z=xqHge$dW1~-v9=vIV^zV!0Dly%NyoK{=9Sx!^; zO=7Ky;P)L+VLG~R7P`WNyz_ZkLAOFrW%l`$Y_>E@{Ewrv0FUD8!tjo)%qGFz-J!+Z z-QC?O6b%G-cc-|!yE_Ee5J*Tu++}0y`oH@>d0J>QJ3Djl(eHfcTsjMLsEh1{AM%x% z8%bPalI}>pzD<21b6Xp&AAW!S%U$2yf!w?azSFy}bBT#+f*I5zUn?dblWLG7oQm^J zSo8C1$bKbJr2K>%u@^}S)ybpY=@8rfk!Ti>tn^%I2~oYpKkH%z{c^T@NZ~c5srZJUEzV!p=veMqZEJr-;ffI9X@uP&i1uU7eWe zG0e$Y=;IP~l-&A#0F6zkY{Y zn_9D){Cqp}eH_#mc2Py42Tkds1ZJ+wI{39(P@*TwGZL=iR&2^S?9>hRU<>ux3go5* z;F>+j^U5!8?Af@FQ<=&6g1V4I@6<|iv2gb%_pgt8zVyKsR`hG>dtX{11#urO zHoG!$i5D~PhW{&r{hgaD7~4_PsN?ME^d){7NN&^?pVo(%x-NQi89l59)?d(XvTrqP zp($wG&*}6T^pTy?d~8QBv*sF6Gkgmscz|BP9BHZa2>$em&~0HGqguyw@*Cpop|9<+ zQjH$OTkZ@xbcq#w;lpw}zE`ivY6Hj$Uwz(lHE6Lq0r zlhx&AKG*e0*4nnA9~yq{XZvJZj*QO1uQtN2RHnyh2ln2k8?775e4PIJy-Gxil(yx& z5wxt>~7D{{5U#1vcP((>7$5F)WhFVFB5~?K)QEr2M6{kOPrM5Si%5qkIiwO@y8MxhOQ1fiZ^cn2PTMmb0z#mnsy8FxtJpy|B4~>gnnYsvfGO&;NZJmi>3mFLDJh-uOw^ zM|YMwt6jSo%toLFc0$u0ettE}B8%{2^v@7iipz_CUZ+231N|!=tdKWXZ=`z$|EH)t z+4s7SHMLlJPDsVD7IHzkDmK0(T(Dd8I1YeI%>;3|C%ENlX_@p{FX`t*)r!dn7TQQT zh23}K56|he#8DUMgRemz{8-mn*I504DHtcEjlo&J>Km$M7Wb>*yF_YB&%-%z_{Qo# zb~M>A(^b?C0J{VDfTtNG3F%_qMmhOJ7C`WGCK=ftow zdb>uw2Y;FtqG1b4L1i-t9(pc^ocs&5uQ~=4Q~T`_mEzd@nBB>Rz6sBHa4jB3k8Kk#0hKB zfzw3AA3;qA;1>%J?_8tKJeJtHN7CWs%fHe?2PscNfGE$eJK2A-t3kYi??w=RdXKOe^4S9wj^$+5|X~7?V<;^x_ zmr*Y2cEQW9LVVc`S)E25@fDeZj&E5(ei=?Z;@bC7!G7+#?uXzmS@_9d^3k*CY&ou6 zgzXTigG%~t%G9)g^vDoZSWR&7s_-#elj&Updw&X2T$Xz5KKd&A$wtZTTf$d}dL4Z} za!qt^>Y)9=W{)5z@0s;IAI#|qe6;7twu;<24BHp@OZn}{Fd2G*bKI6k$#$@m?>t8% zc>kSy^{;bXRE+Tc#PNS3)g8QxcLLa z>P$=Uq>vopkITKH%duvk^04_h)wqSqN z4Alkvgg>0y@9M4esrJ+j=2^GW+n6rhmuB(KTa%xp{1Y}kA_hEf0=2f$)Um2FkI0w2 zv%cCYk5{sE_rMk#z@5>A$49JSk!1 z>91IIQ}Jt;iM73RnTx|ecuM@X1yJfpi8?I$R!q2VtKzlHHU60yWQRL_|b@JAttQ%WlO*jsVU zA~n%(;Xn++p2Wa`Fp{5NB_>aU!C001KEvi;(i@Z#zdD89NKH!n47R@vp3o`gL3i_V zKH&>ICf~fxXDacgW@k0mj3866k8QLqQ#XP6zTxmBZVhpDQ|1OBs` ze!l_u@6)Q0s%b$Xv7=-v=<;x}n{|B=VcZ;2f2eExNVX_M-T# zcF6ckrMu#yAL(!XP-VoQ%2AV(UM8pe3cll{(#%TOsZ=M2Do+jMK5@rU_GT&B;xFO2 z@FA$p&pBB`vK#xY^c^TymeZIIy`7w6COtz5_|LcKT4A3N`Y?-PZTvmu#|p<)$9A0r z%hZobMMuqY;`1-?bNA7ET}Zwu9bmS}Kz#9pUpGVRQBUhne?k{}xet>QR3VpKK+gXk z{V+S^PVzct;68{R6WcM`7US>x&c`Snl8&Q?ud#b4;1bLv`>%j)_VN~s%At}^Xw$F? z>BBOjeH#0WCkFJ|?Y>}qT3E8ZiKV?WTm$rJir$^$x``eRux_-Dz!wHkXET6$6d{J~ z3m*Oq`!WT-Zz=tF@$Ym_t zpIGwF9^`V5@Y_~u?sc&{abVKv`kH#5-%@x`!sMhg;BnVDGbR+9Hicfx;W{H#_3D}_ zyp>JV4qof_GB0Z?c4J4x%*a9ppUg&n z^?fT-!(2i=z&o3047?GEc%mQvC>sAU!rj{4{CD5*q1GU45qRQ{s8uZ@*C@lx$4>az zb@=B|qn_Oh#}Xj?-(nYDt>Yn(f4n-nztbMNtM= zu2~X7ONG}~X;s-Egx$dp-l8Mh;T?>^=U8;BsCf)lzgD^`Bhp7^Wc>LZwN{^`%%-OH z5M4b&-q#VomZ{mHsiAuW(|CfWIQ^Ve;ZO#Ub3xIRv4O|7p2Jg%PLihG&&a+{oL zDxY`@@9!Bk3fFHXA}(iV?r`#lx5U~F@c*OG*W*0%H)bEyKx=#Q9pjvbou1J0;Vs<_ z-1*=p%mcl+jvx9#?Y#|tbg(WAc4{%rMS4|dXUs7S4qFtVqZe=@-*ul^Pz%xRH1xVM zIy@XMKz}%JJM~WGdF-h8A@R8h9%`^lz!;WrhDA2kWC%JOrrD`^sjErd<(hgF?^lqS znEkWrWq*M4pmidnUSrdqcbdq4a^f5 zLi`hejP)VL$>iLj^Wa(s;mLXHGhJ2PRJ%eihwZj~v$gP@<}-vmuMWE6tKCT6zfqeH zd+!g9-@<2(zLYt@92l`D@~Lo5s0&A{64+=SqMJ0%|0qiRs)T;3(uQ7whkoh4bJC|} zoQ@2LK1(0LDYCHrob&KE_{(TG1eNjKTb2CES?0OM!E6{3T_Dz#(k$(pj~$z_QNF9R zP`Z()_`-_|*6iZkgdA-M{Ix&AL!m?1;E3wRC}W0C6Q6AIlS%Y0-sE@nSWzuF>KgJG z(YL$LQJdX1K5TZxVby-sN-8It=qLY(KZ?{XMYbzxRw>1lvCOf&t8c1rV`!IIh4`ri zSjYqX(MskAbVojh6U!E$cJKl|#vJM*Gx4ca;%>&@PN<%=D9<*(RdQoFSm~!6pdS7J zY^4=5&Lw2dtv#fD%nZQ!e+EXq&AOBwsc)|L&gyLlUS5!=Z3I5?nVM&9x_1V`d%NS_ z;jSIB{`U_@dFN>KGg-S@dl*~YiN7~P{xi7u1~`68I2)m?pqvqP(fk7u4lbufwN#Fpier&xUVJ@$PeHTOVj z82g!v{9nqK)YRzjv2BPcdefgZ8_x4Cs{ix3rY<_H$B)1)RnPamvp z7nCyC){(@AN$hRBZaJK^FB%OoWI^)DWbvu!6V@!k;HcwF(pS^x#U78uhgP79e;!QZ z9I^RZ?R@P#Y6LwkA1pgUuZ8)D8Nwf>tx^&UZy7RE3^vwzaJ&4Cv=Wv6l*9z%+5J*zuJ`-Hvv zqBK!dj=GLLVV5G_x-{;}`mM@haM}dzLG5{J&0p~0PGzZbj2h_PJU9K0XU@;s7Jlx} zV(@qG4B!_^M`aMt{TaD!O#JOVQ?3!U%=^?^|4qD?v^=4F(prVOJC-H;fw!xGTm9RentJN(Jy#{p8RIW{}61`RP3RXtYtG;*(uj4 z*Y&VR5iUn3=Rokfg5Xy>k&p!4DP0_V<8*_RRjIu2$Ci!M;KzuZIpgZ}QpdYE+C(h}vywTO5j;B%P zGdbO(N#nUYMwgA*OovHaxa%xaHnR}hPArO#Op{`8SrVIln#Ww|BAaxUy*L`$iF)RD|7Nw-Be0xU^X zuIP%vS?`H$UQI7TUj0F3X4>lX^-%+2j`+Csx2Y4@bu-C&CZa29o!3W=BSw3LSG-AH zb0oS>YNn+KAtt@Dk>O<`+s4r5ASM zrmiIu_2+5_@$Y)z%Zc>VS((+AWiRCD{(DxqAeiA;_aNIIsokQ>3%VGt^@BTikGP=; zG3`J4@5&0ph|EcUIz?S(kJ^H}*Vp~f);SSyAFVocEx5LHjXyk1J@b^mu4OLNIN1Dw{AbI z`UcwL)M`5M+`H&4?H01{_cG5Z&n%x?`YzN@`?CL=;C9YNu2!OxW_l;j`Em%Jee*{ZF7tf zvp!NIdrn-MmpN6hqbI z4rfMLok$@%!db}W(ht$=Krx5}b*)X@+m`g5;*)6^WGxxXk+r89lAiY0DHipHiFgS#*4Co0Fe<^s0k9#%g> z8Kn%SXQwy3v}^Ho5{qY+%xdSi+xKr~GKkbr;=v2caF%2!nNd4@XE9})uAW#->=#`v zcB3`g`Vrj3d)8QI&JVms{xcec@wrkD`}CiBxbHQeR?dFT+L48${h6?bd`pY`m?oU}M%!u;gRC5Vp~MYoI%H_bBpk<0BN zFP;e&Hi7+*MW#RL{?)Zd*G?&Al&bDV?pu*3qMLb|dj=9GuGf{PIz3MN8$Z8@oUbdj zoFw+wSASUPn46iK6LT}}5V3E5VlkI)51$yXeGO*umiYK9am-k1>r0u^KE13k@+*BQ_=wDt6c{_x`FM|5zFi#9*d)Y^&|XEe>n1G z;dfk%@1J-(YjbuppFR3a`ow&gqwr9(n`ib@s#9leMIO3=4ETi9S$Z6GEGEn9Z+q*T z-xr1?IbkzpHub5?^j(YsORerUg8dyu)!s;E45(QJRuKhLY^r3 z4AjS){LS{53vmOnVW060>xi$lphe@TbLNouT~|iKXRV}pL@aAgsh;*Bsb0!9_G1UV z?yr=g$`JC7VBKy|z{%Qm;6Me~-*4oXtKzFBUdx`H^F!ZB--rxv9Xy8m^cf@)Z+wKC zIt!fV9DBF{Tk+`6lc-6KCyr=(Aj~tNQQ!$vlFwD^6|O4AdWlmTCv&%+F|5r zajg4va#eqFjBQFDWqw@Vgn60MvW&_Mr7(SQKe^9E?z@Y)C=A}JSAV|Z(;v&z7Y=(REdIRXdUOTja0b(D`)oxKN(Qt=p^X zO8@CV-=jW;>{B^S;@-s<=S+`9+A3Nt^Gj-wN4Hk&x`*^-hbuFcBh(e!`CQYdrW8u+ zo3bah9$bQE%!fIr48jjBN4D}Rm%y3VP!ISIU)l`pyK_vnxDUpIrgy&8eTRV!epDta ziJCj$eh1KmAg2`P32m zU&?gqAit4?jl_=Ah(!Xy!dt_&`+_!m&lY|iyC`1F^3ARZ2jCy{U;uG$U-Fp-*siM7 z59)zgyuglxsnS&&qXS|WA=_2)C!gt@ISyWS25iWxxut1KjU!imR$T;6PjUNJ`@c~g zW4cH#u>@G+H*yjO*nnNPQ|GO74F-QLr->mB@1WE))X$U>PA4wchjWhQIxsh*E=6-j z69V2|8cg#lvYr=w&&d9%lh!7;%9voN;B!R31pH|eevYZI+OOzgTk^6VJnL`tSH;<` z?;`I<|FHO5+hTjXa}CSlWpl{R&QcffYGxUbmnzD2U5=xib3VAzM=kvY!~cR5cW1reOIj`E>luFrrDCGr+V?3`Q&A( zx}(I7b2YK#Tqoe`)I(m1)9sv2$3m63*YVqO`sLQdcV?+vHJJ=7``;^M)`^a$eXzu}q= z0E1YGKE{BFJf&W`E?%ElGOJa#zfYpRGI8M!rKd8Cj^$izfJO5F+}f%QCYC)bE*2jp z^h~PfIOTYvZ>=8==VBpI%K?1*RM@`Dv2W#JUL@;B>n}S}96b`PNm1ezaTmG#5OVz# z*ovpn?L&NjXC+=*H3a_lDSQ417%qe^3z& zcNq6jrwvShm3cQS#HY1S17i8Q)P9bW_x1)0Z$q5=2wQ9cF$k0HN_`SPCVjHZuuAkY zT?EHUL;~((W2+KN{{si60UVw{rH5j0R&|YqgSJm~S~U!v_QU!JU{$Tjxwe95*mvL`pBvQ~w-^dPv#2XNEL-0wEr;d$u8K)6^lnQs}N@yAdwqoLuG zzMbB#zDW;WA{B_=V62mP3ca=+F~B}WyvOIn1Kmt!(>FN&<(Z09mgm|9J{zjtjs@BPUOSkI<}S@4ahtd$ zzD;6v=Nji6?9RW$mCv#1(Zr$ysK~SiIgcVgYsoqvwN6gj0Q4T}Z!6>6TqHXKu>d)a_hz4a@M57=9h{|DE`JIC*p%)_D=Ufe}RE z73lqLm|ZdF3Y_AtVEbLkjZ1;u#$e&RoV0szBC~m(BdQCk(AX{Ug&nILYsfdxP_rmO z#6O)H+CuEN2&>=|@79qst9m&vIb-Af6UVBykR$ikjVEXAgmh2977g&~7{2_6{GU9R z+WD&77RDoq<&v*6t0Et^yeb|+0OPI6JATIxYzJq{mH)`ci94dxC<$g3%Bn@I>Xtvt zr|9Vl2gfQ69##^*V+`D-QS^V!qo1L7yfxvfrI}Udvs?d3z9iQtZ)m|pl<}-<5p3=> z^yV%5S``fZb^N--F7D~>((KbiSX%ptrS~8U;pz+UneyrOfd703+njB&TPh{IPJAw} zlOIsys|1>GlWJxGFuOI(dkTQl_DbFbw`ZVke#SP#wTx$mWj<+o8UE2mo^>v^>mEJl z>Fkr2i_(?ZP9nX4uM@i@uge`}ti(KOub&==M7?7U%trE+In3HT4R0v~Onsngx~gxi zCO+6%+%*jS2m+7kjg4uJWGnEIPJwl|C*BUk*Np^&j*MTL_((b-9pwzHv-p=p^(p3Y z^yhrEMe3K>O^JTY3CQ#9%u`usl07K_;0f=UDRm!?lu;d`u7xBvfzu+>H`EY()O(K5 z2IhBFM_$e#FSn5w4ZmB3tzXWwzGmf`V>3Du+dhWF`zdyJ`~cg1+j_JrAAQ^JvF{te zZl{4q?ugP8#-I)9xr`%_N-3$By`;yD!~A?uv1N z@ts|>TvmM5b9fpK&3ll`#8Fh%9Kpu4nxvW5(Yt*dMeDXwk8pdZQ^s+y+whP!_|=(eIQ)o_Sla?)X+~UbrqwnnOz@uCw`?cOgI3h6s%dVsR@_IE2n08pFA61 zTTYIYy#AzqwolIJ!atTHZ|cPS(H`JK8N|f*;OB>c9XW(dAt-Kk!U;G97vYkuLWa_imF8U6k7s?4 zUT$Tl3X@Uya~^f>jBOrYNYz-ipYxEsaawP>kTxJs`T70?V!9>pqK>e>=A3)E`Pl}wSC474={Q`xUSy+|&(n{u_ohMEXMX#o!0qv28-L99eGqJo$7PyTg<3D#WfM!bvQav3Z7pOb~_DL+&AM;Q_=YI3DL|0{+Bx088C^h^p~IE zeqG_5rmJtL56Ekg4W?Vd%Wj{xBYhsaoF<=>ixU^*h0mm--c|-4^HB1j#&D%;p^uXj zq7n}=8@oO}t({y%4uCHn$Sl%QoR#8zckjH8uHfmJZk4BHY+PI=XMod>+VVPivfK`P zTAp*GytV1`*y9jn(mT(4kGYtoeOy9(ZLyFz3cS8F=d138WBm!PqLJAQRHroy=syop z{!tdC-APv`_e$|2=8)-|d50w$C;ug1Mz3qp!;t}IvRxV}?WVVDX3~#jYu3l?Impxz zX|oip*`jGF*OjNhQQ8eZqyu%LPn>;JSI8$kh#3|q*%#TH!AI&W)s-%>@7sCiJIu2? z$((@2_?TF9BhfP5+B`lc;j-$k>J@u=7_N~`{w6EbnMW`??-w~lU8$(_f!r=S^J|tR zVNB9AxfT^NQ9cP*aWK!ii9c(?Q4IxG*&;2L%3$?!lUt|0Hw0$x0dpuIiIUd`)}(i1 zB+q&Pd!xl7R$~TfU$K^WHYF`J!8*xSAAeXx&X64H$8;TK$gPPdbLp`i#T*HLBDGbn zE3W;?u_+?w$=pLi_MnSj@wHmy?mu~iyn|fvu{2MLBvM;tsbuYudN8emtYIpEpFD{= z=otDkCel~ao@d^J&&`qENwbIzJ7;#xnwz;h>xizhZU_DDJLuU6gb(OFj|rY*f~M?Si_pE71{5Y?Z1s!bu^s4cyy%<{$wik&;iU598F(gJGDb@0*~lsikPY4xy~H&I@qmc_@=h_gXZYOSZv7(VX~l49-lJOaoQo#r*-T3Ohcd7X3*nai5nqeGDU(wFwy(19VeNX+r=1P&@0)yH-UOc{zdA~;OWhzveMkM- z;pcQEZcNT6lo#$Z@o+t7!9PUCCHRxod9UltU#yR8d?TJuF>W_CNn4Tbkb)$u{GIET zs4r2w|HFN{$@S#vbiRz1+Dkvk6~-H8WhP`j&E5bH?z6NZyE3GjIJF zj^{J+v^Y2Ub&AQ}*WtwwTS_I--;}?6V#${77=a)DG@(ZV%Ye zA^QGi(i<=dyKIPv?h;SoVh*g4cyv2(oAUseyJJ!_5yIWhRQv#Zx7Y0=$kz&&619##ipOL z{B2!M{(1^MsEAEED{sZGR%7QX(LFp-J^{xh!kz0jB(+T0>HOpD$u!_f>R4Hz7x1Ne zo4TLeR-VelNq=dwRFNw5T6?y=Q}XtdR$>!zKl@jJn#e@tqlD%;@?TsY1ZV9H+}E$j z%Zi*9xt+jC0*U<2OaDnd$z3N7mGQ+k{JE<MJRlAJnI{71YF^pK%a7#-^lfd&cUF8rX9`=Fy3O;QANpD^6GON_}xE5&ISsiUgq45BbNJwoUP?!$Kx|fFS2x#|BvW#l zN2jv0o?FqS^~iJ(T&RKg!>;7ucch(?gPbbVG~Fzv4M}&%?}&g;OU;SZTFUk1MEvql z=0BFhHW%j{v_s7I{4e9VpxQ+Uu<<&)JhLlG&%D#ahEtM zIWT3N)nQ#hO!||4npQ+uU9fS{@^Se&I@_Oq!|CLgr9ACD8qk@GCZPX3kwa!3kpF zUF_Q$^w3Pa>mp}ZOpMzhZCv`E+;K*KGE#+FhfDoVJ(qalE>Zaj`UkJ@J{Pf{tAy#o zSkBX$<+$vKC)-bv!qLO4$o~R-ax*5W{>1a$mRl1mEwTsORoIts)lXG-=I?Ej=aaMK zLnAfF;A&Z9rqgU`taO@s;*8v?#^xDQ4Bj)P3LxEo;Rox<6^P3c)CxTi-WYhXG+y$c zYvnS!8v5td&)r9Sdl5bEhp(u{JO{5osK@N+d}Q9;h|Rxaz@K+Y}6h6;WQ$L zqu8RO?Adhex5)lF%>fom)~{@D|I$Bl&;Rd}g|({BH)OD{qljHU!EOG^JGio=a+;by zo2$V;+=6Wkpzkc0=d6Xk+OSWR;PR&-3Ei0eRFvNJYmPk5m-wG!`0u$~>y$sqh0*V3 z_}4GwXJ6=}F6?|Ob|7bR?ndJzQ#R{S2mAjKJGD!mL~OEz zy$FzZBQMMF^5yBZzht@^DnMLMLJbNYc zQq~CD7uzN~ua~kT@xk zKTi{fU0?>uUHsBPNcOcfylwbWnpSmn>VC~MR$9Q^pVlr|KK7uH;!ACVm z@3myf%dzhXU~i|1<5m-EHP>XRYg+ePKN@l}7lHSz$H&ZPhE*KWJ(B&(<~jc5Gxz10 z`1{-HhQS7eqh8) z+0)}7K1}tJ2NCO4z{hl8Cwi-ks|%|Ns9t1zGYn95RYkJzv0!`C_>G92@$$mjkbOU) zSF9d$gLd1^_VSsPvkcN}X)Qf5D&D38YtWW{z#_~Tq8jx7*nB#3n<^ONj8Ae_=k6hQ z8pAnc!Q>@Jm?IRV-hv;SDd(s6Dlc~20Y-W^Yg2Y{>rU%@CcWmBt@wev*qM>U{ztH1 zhw%Gj@Y7G_0AY;KI%Be-oqMah61^)jF>D&q;4hwU8c)%Rb-u~-2ht(l-f`Vg#85f& zZ?T$qhJ2td&smae?>csS9WhROjT3*=NjgDq>aqcp zW;B>aWoCQUpr5xW@qq%iSkm&@;;n`KlAcI)!Jozw7ybe%#DgGX3t9bV@>Fr8xWTYH zvxak(^90=A{Bn%+i1&$QPE1|ael2yrf#62Dnx~p=t}iZAhAQ)|>W69rk>g<2JeWM; z9&5H1y(|V6{TocbCRLd|)(mT&tm4_z$>VwvYZb|6Ie8aMw z-nn&68go^8QnoRFVGvmP7OuUGuQDRD?Xd9y^c=qscZhEd$(hgWr5#=l(H?yIGJH)> z^fgz$f{q_oS0<*fN(Ia45mn364`x_AWmRp!)aHWB#o^N)B44}6)2zhZ&3LYLU}fv< zY4(ko%d-X(OY~qp!->tV%6p0TkI{*=0$q84zwJTK=xO!W+||Y}IahK|!hN!UYrH^@ z!mzE&z)#EJH!88W-k5G8c#V`*I6J`h+%_F-^cyyPGBVbRETsWHaSF1VBfli>TBS}> z{ZbvxxNnGZE1pxxKs~gO6U;!MyAnnHl5cR$O=c+MAx3}UsP3F)Sd`fpJSP{Q=Izxg ziS91r&NbQh8{|HL@)3EK#-ko<7A-AuY&im-Gw@yBS$K`H7bEbqRk2@d@U!pPXV?;& zK3R3LRn{Zc!PFnm;LoDe2f_Bf{y&el$x-q;o;Mra?Jaf|n;KeXM!E{ROOW#?6OY`- z?vx=z9)+xoLc_|k8{XLD3V!}b#(6^*sf*-Rf8`lMzs9-BI7^pibC=-X94*qZKU0i*L2!iT(!dtw{dd z&OO4NoDpkyu6nH6L>~MUeO`~Q&fp(48LFN>KHOrOB0I?JU|S4hphgg z>^(zzYsMkNS9>YPIO^fAq=V9IVu}dtx>rZqV*|ZNSS#Y?;;O$@PYe$;quqXzoeljmdr4KK_ry*4`M$lZaRE&r82ALa1u<+* zY#CFA)cLX7HH^QFi>MpCk*?yS%4+uEm$T5TZ|ucqdf5x{T?fepo0%V(osKcgVmqhV z0FV12J6{5O-4@xNjpcU9VdU0d)knmYVlm?f<5kZsk2eNw#vO=4$Vq!)J6;gCox#q{ zl)ap_-uR=6#?QvqQhiCw_uOagbCA8gKBXadbd`wy7s66+1WEx{0Y=3E=h22gBhuz8fSza9*Nkr|%&5C1h4zuO05IqNte$e$I`uwQ_B7MS;JF>Vxt*EOJq* zAe>4;v|Rvs@j-hgsVA#OsH)}`Hg=H;N?uIu4Ke;P-k~&pb1eGW56dB=W&M$xH_k-o zQu-xFaJKS#@`1^qNbT|7Gq~GNY{*abRqQu-3AK}*R?!w~Szvv}DjuK*&p_^eP2SBu z{RalJk6iu&6H2;~)tr&LnsZSNwl_WDe(eeS?B*HkYT)(aJK z({i_|j;S8P!C%k3oIo&}f@n)0Y`yoHZt(nj;1Aq!{c?>k)-W}Y@=M-2ra!fwOt6=; zto{ykt0|nxTYCiJ2g|fGv{*!oWDt4|1J9mkhU4x88O+m=Z66y&@$ql^rxI8PH zE8j$K5Aj_k<)Yd*ngnprEjdeacZ(}TANKDsw(kM4<11>um(VdI_Ob>T=OpYyx_ywN zpE<(32C3?bkFpUn9z;jHapq~{KMH?viFNJG_oSHzS?=4a+Bd+UDTY*7@LkV{ZKt4R z<#^hP;0}k;i5|>ey+7 z6`l)?d6Qwhk(P{b0XpK%d(MI@tOX+oMh|B?0v$C>@uo)PASZZ_ZP=Am{l@{gEEEgSmr^rG=_Of224s`9&%8{%@XG%li+< z(_I6np$kym#t981iq;;Q{ z-ym-#CvM2DJ(kDeZR4>aOL)KK#9Y78Fq83w$z<>C2%~3Z8F9;QeB~MTpgVC%n*4-6 zi}A$SazSc*`*Rl=hp8s0jQFUXV73eYzozG@F%&~v?a1GAeBNeteX#vg#u=t9%!{AH zGla|E+O=}Js3(M`2%t8L1Og7+;1E2z8brAo;X#JRFXeA-wSt^I}%oe zRmzZVQ*XVFjJLzSxaAn4{?*_%&(&6U8BcAa%~(M!B5uV7iAX>au|f}?_8`9Q7Vl#t zZw%z5j!v8z*wmyp?<3dr&Y`%39!y5>j$?0ogROsuyJM6reAf*11WSgcF6WkaB0u~r zasDj&Gz(k59ec1E9BLXh-MiR=9nwl^67rJktm{gL31O9TrPX+$XV~A$>}_={={9sd zKR)gl7*$N}0poGiCzU^X?2^CB3FN=t{XM}Py5&4i6Y4WMFt~!w3C^R&o~EbLd1*LN z>W<1PVETs<8f(Y^~^SFBOUh~em}{HB=qtgu~Kg$ z(3b9@?qRt_jnk$6QZ_j0JN}7g%9RV>`Vb$kAz#}CW_Ay`eQy8T@x+TU(}VD?y-+ty=OIuXY=Wet{qfz%^^I0NEaiyGtxbat)u zkMt+^sd1!drzco_3yi)bcDuVefOV>YMG6A5dBt;hBk?})QKj63+=ux20DRAG@P8FH z@hk6jpXU&fEiV>1h`cz~zTBZRC7Wb&d2c*e4ZpdXd$z}Bw8yrB1ge)xbEPDD<~CTW zS<@`*tp4a~juazpLB~7DCFCLGc3sIGW)YnfC0_OBo^6b7W2&p7`xR&GJOYP03=Y+W z`ENCdq0fRBhhUSvIet&odezz7(ZLZcC8m!`YK1T&g zI3uLw-ZXx2+uc|2+_T92e;@;yNI(EK)LS7AmmWwp$!V9le!6tI@wwx~_F^Bd(=-36 z1=wym>|s$bonh?LQ|Ys`gLTKXOcN#tTp!FycXnT$aGBmV-u2mm#z zB3HCuv@da8cReKr@Sc&J&aTfy#=XzEANd^t#+rlg87K{r+Snf3@~dj7Byy~Eyu(_q zJIIwIsC5Jq#}>j*SH=7E6{ZP^)`hks;t_Eo`TH$wX>017cfnJt@~t7rj8n3Mxv?*< zzucE?eeDi8gSFFwsUAXFyP;8=$&gzhJL~yuHJ)IGT*h(2(ZYGgSpj)dxP#ZGOo3Uk z2wk6pY;}^GAqfNJ)tvEt(b~z@*fYiRll5#&&3Y9+U;;V(I&|P)*0w!sHVvD5R5&2q zwRX03;woBS;PFnzN}4Y`)Ye**D=>O{OoFJwse`*kCt9= zZBO3rh138!FT>vWiXI`svdh{EPGmiNLXY0oH+ z({kC`Uz{nHVB%U$-X~s)kOuL6`>03mWLK+84W%~t(u%H?u3+0pdzNGcS)DJfmHm0P zMN&WZbrd!EHS9qjX}Hu0sp*Z)p5}~ob|lxXAXSwXu%lb0TYP^}CNKVwqNHG{6)Rm_ zEH1vWcCnrH#CwkN&Ue6Xbj)7MPrPuH`JsJ~+E&aH&cW)gQ0-Rrv&37L3;Ttyyo-Y? zcT)4LBRfECX7m14<-eqg(hBbL$|bpn*urerq$^T8ej2hzv#Ikpl-2TdFz3J7xt7uZ zDHRSyw0)Z6fJ5c<$cnlWv3yA|oaNGL=_lvyK9shh#fP}+r1VF8A?~x*vUPI@xa(uz z*JHa*OSh#*{H&6;^G@Ngml{izuwTc7N5Vc!FY5)>L)95RdltL7nti;BZw`=#Ns-9k z0O~w`JjcK8?e6(xU9~w^wlP01xN0MM^nz=LN+UoK?~swUmsIj6>9@V9qmF%(y)F9Q zmUn&4Dy^3$@Qf>@UF_)|&W#>U{pzl?SDJ23vvy|Ba-<@h=0%JQw^noWFpt4GvK&hvLkyT|+!klDu(?G?>Y?d8HphqF}I$w~p}a z@l>G}7Ar=G$Jyg@lFW+Dm#Xva-K4*zQ^uuxSm~m8TU?BmA93b7Emo#{iSNa{oLlrSE0Zc3MeiDg^0{xwz+SGs%bB6yZ9VLN zIkq`2fKlv&XLW_={~+EHpYW6+;#ct`XD@_NTk;hvin}bWtkuAFnqdhSi9N*A(hkYQ z@20R?rKu<6mF!%9MvC;fJnJp_t;1~IeW5hXdy7y7D-XJZIPK#T_)x7(7v6<+tUmUT!>=W!+_Hfpykyu;& zPx6<51nTZj|5Z!*`moh)Ry7s>^zNh4#sv_#Zcbn1RW!X#2-BKB5}1?QqoGtnEh=r@37o< zTit$Anz)nMVTahOdpz%IuKFcLa>76#u_E%&!QI>41>S02QOCN@6F;*DYv^0K!%qOY zb_92B%(bHA6ld5U+c#Uy*5*<#sgF274CIdf{A^{7W>AZ~$WK?+^f&T7$!fGdM{f&L z7w#|in$M(1VCEt=Ns94YAqKu8+$?hp)UcTcn zSwW)kM))WUx0oz8XERr(m?-`d-U}C*Q>zvWi0i~@R1@m(9nDzdN#an?d`~&cS4%b3 z5LFJk9V7e}rn6^t@cVVd=14^!J|8Spkvw9M)6ccZQp#FaXe2Zd8}Qp+qA1#gDXjlb zKKERFF7^CGBhN!Pc3!W#S0&fUs3KCGHb{2v3ERoCS6r>|hUaeO|aMC+41%#=g%MmI~)s*WW^zu!KFzL*7^$-5M=+7o$CSRjbYAEOXq~+-~$gNC*}B zu@gS{)O?~r7{}S`$ArT|3w+3C*B#eW^J2?K@*}HIf=_o5zp^g9c%Ez6|HG{FU}2(A zPzn}J_Wq8!)+FmNagaDq_=n$Z6_4_4YmkHc!fRm*{Vr>TEkZeLhS9RvddA+^5e(kk zOlT%trDy92E8d&gU~xi*P=Ngy#BA;@s@p0*%Nff`SBUEyzUi9~D^wHR{JtXZ_EQ+f z4y@o^B`IB;=Dy`_Y<8GOsm80)g||W{K7Ud8Ahcty|0m(TFbjEECoC5ZAsxdUj~v1H zgCXJ&ae}Z%7%WZ{1BED|80W#g6=DQGR_iVM<&87OxgNX1Ty@M-CGp;EpMzh{# zK@^h&{r{g=BbFD}|MA0O8gi1)xcj2?pQmihXQGHb@ z&K1r;)dN+QP*n`!+GHV(yBdWA-peIa5dR1_g&MqHgu9Aoob#kpLhgPG+5GsiOOj}( z)jW}_?firwH@;#y@ro?-K zGu%}@rI5i;;e}9M)bq~o1OeM%;xi)J@rSp(KujVzXE_(CE~zwP8Sx{}$4F>)B9E9R zMDnL7z7WEB)@oum&sI+x=Q8J6at}9e@t*re@#i<*EQI|v2v*^Na8wx0dV4vRWn9}` zpZMK3;Vw^R6TWjzanVnF$a54Ii;6eEp7eN`czV!!y7#*O7E6k^`FsXBV1yiOY;5mg#h8WcvT$jKIVSnEa3XeHTU?D#Zt)hJwahluQN-j zgjh*jF0A4+da)?|7FECsYKv`<_r2_7N%5p`Qpn5PhzG2TmGuhZjXMhsg+|VO&hwrR zp84WfakDU+`@{=3kdXwQBva6cdxaCiSbT@gqgG`&YB=wyo~aUelQ?YteRM00m3T^y zQ5JnzEX)^Xi<8CI?i}|;XF*pAD?XL)FNWN#5_TaqE>`m}a#&E@CL9xrqDKQb%lr|! z-)1c83}(oe6E*zqs9-^Az6-B-+s|myC+^%=Sm1o`R6Hd-^Tbx-O75G%>WA^WU&2@9 zAw#$>>=rs>eRrr1tA0BgI2WpVsgi{(cK53gh%C!||9$qs%$_}G9a^zwgFG`mBb-N^ z7lduXRo)|yXcqSIUIspQoFBC)v3940Dq^m1-}TWo!L`ga9ox4B`(k0W?g{6RJOkf- zL$I-CUs#!&!WH3#GoR}W{V(2ky}>hj*Yi6&>$U3f=)q;aO-6&73r&Q0M@45r)n6(j z?{EXDddOQx^Hy*9OfsMO$h$hY`k?2irw+W;T|CzVeiw|L_|Ekod4dQ0`HnjuVC{@T zDN*Ha;SOgHVg)Cw=v}2~{t4!9uZ5Rf`HWTZ%7hsypYMF`Z0Mfpwqn)xvoAl8##8Kj z6xZDFo+l?H2}iK?Mc_^Aoqe6L9zT@|Kedi`_{3YkMh-7v=brP)t2}iSpGfc&Ry}uA za(1Cd##hWl3+}N7pV-Yie0LyM1_>+qR55gRi~EK9fiu&2ifgX3L+{Y2uHj;KiC@a(zG|pkpasO-V z%wwB8?>PRxW^E@?twmz1x+2Y8r-^kPBH^gEZY>Z>mjWqDtiq;lT@D94lDJI*ql_UC z3`Suj9Jzpy`*NJaiE}y5;aqmEh7brTkPHe48ro7ss}AM0z0dD$rmp`@*6a5SgftP|u+4~~Y73h4R{#8xGlT&0^ zEuLwm9`CAKls_pK*kd18o>m@`6ZuqBKJ(X!?-Ag>%W9{4Vq? z`X1n&v&g&%<{j!jc7!`>3^l);)5m~+ZXnd3>R*J7J5&>S8o-ZMGU__NjM-1MkCF*F z>fhm5q~&N~fjxn3oP^$1Q$aYPW?{RBm7o#7*@)}s#9>I8QEtwx&?KPJ*)f%gKv+O#%}m2KqP81>)7tgJ1itnzN;XOXu{*z;cW|B-*S{IY+F zY%axmFC0D8V+&lFVE+)$okhcL-akF7C2Dhmi-K3M{XMWwAvcS;0X{`oBe8PAWl=23 z=*)MuG$mJ=%Wk=kzr6{DV)B1LueJ`NyIY-Rg_$3GI=D>B(zdGW&}-KjmUPZ?q^5?!9ul^28ovhpST1j9q@CbYN zZ&=4iK=2P%^lmInN4g7|I(%`8zXvwYJf=OVtWloh)cT4Vg-8DdMH+aU(UgH@`&qGm zV2B9r4nD*C%^BsM(o1eSkg%8ate+~6Qe&x#x)!TrG(4D+b#WVN1nRkL!PU@sX%=0<*BYeY^L|3B5}%tEbP8Bm<~y$T#h@U90W zJJr|m{cZN*73`1m4V(FYwhwAov@D_?t8O8e?~~y>@$N0EF&WSR?E{S@#DK{ z0&|zC)syfzshn&wJcoNVQOgCbo!$ZRy@*&I22}--v{NN#pvi%@7~W#El|b)cRx-2( zJ3Pe2fky|)+6=~d=L6qS5U1h83^;S)`6sp(GH$~&1&kd9Ln*VFXile>#&hH~^)!IOjS z6-cyUYd3Oj%=e??C=yDs+ehmVk{Ylf18n73T}+l0!BxgcHa4~DRyx5{3HM3XnG>`c zxEJtg0NZi;U0ilug1o(}B)(4WO=!tP$7#@I^O4iLpsL`W36c(Q9U=!k*kZ^24%VkE zVwwhT7T6oWQUQ)Cc*LdxdNzIRARM_MYtiFdL!OkOr3UHMc)o$}N@jO4mI0O$#?D|> zAy+Px`Lxc`s-!PjlFxiS_)6d@h9?_Mos8J%H*%fi>SU&xdzoJ4lGmNsQ-pOzpeP5u zoEPdrUILBeTNyUEh=~ham3*ItszV>CMdL9dA{eUl$Yz7cj!&DxejL7fBuFmFy3|HJ zOAQsGubl5@aLHNG2^u%wg0>jSQn*^sREnf@DD!FO@v-4mr|!!#WXj$%!nfGn4Oav0 zO8A{zQZw~hF zaR(Axp{<8k-mJL5C%*79>xOHLzL!}C^F`R;CKGti!Kl0w>4UQdy;7Y$oC>@|S1`*n zmnW}fmiqkp*;+Kc@C&$B`+qA9rUY_S)u!0^4SNLCNTE#EphE5 zOQc5XpcPCmWc$$TqCJ4ERaiTKPvi-p6ge*NN~Gm<(}Hdfs2cE_N7o`5Eq;=-Vk5LR zthSL+eIS&bpaIz~UA7k~<7gg*(+j;1EUjRcd~Ii>c~(Lv5$`X+mY9# z`{p!K?MRbT{W0ve;lDljpavx6__vUAbuHehCw6k)cHn0>eFsuX(BA?^sf3f@8s&t2 zl(q{xIoY`3a6(bRRg26fuHo6$r2z>U&~}2z!+0e)3&17oSR*p)@LMl@UHC&rYl(0x zBQ9oa`nOQX$xFD0(ATX?k}UB+Cr<`)auaUZ*If9k1fBg*xsdC{GY;-9?)~hIQs=@| zPlTF~Agfq2yaQ0Sg0u$P>hZ9wNe*;4kS?dwa;VQTHv-Z|FvuyhjQKotR?FuDgBhAVDC|4=ImuD##9&$6@4s9V4+sR!!wDPvn~;-%|7C}A=(c>l z3b^6QBvTsUvf;x{w8&Fb9X7SnI}OHObd?}iV(TN0b&Si&_%za5kl7A>HF5{ZgKla> zKC(0Q@Z2KLgS~iajGhBJA4rP8e+qgzcZmvKo&MOrml{~`T0rdb@ zRe{ilN6$lfkybCrB<4LxxB&HeecsM}0!emeCYis2zFN*OSJ7Ri`@I#cQYZ4%AenOw z{Blwqfualj9oRp@iPOW_O(Zm;Zya5%U>O6q4_)V|A@RlqESJc%k*DXF7hCRd3A#}o zw;K1$;04{%ZR*5@j)vQl{W?#nR6q#2b>uIuij-$^_s;O%8>iu0nZbkoQj z!y5T@)-dv};gM;4*T>jBkPRd8BHHCG*)8M`keAEkmiOpqX+yKiJ z+EZBd5hs6n6FH%Kc$_nGD>^25s_Ms%R$4CdtR0=BNUEVf4BiIXLul^>rDWGQa?T;) zBK;{O%9yOteOzwc0x$h3Bu%3G-(a2u$;Zg}6y70vx3H%f`SRBL68@aP&WCzlIFKjr zXyqL3-3wZcB9HTDE*q$l?&=!URi9N>W_BCBgiQpDE#{$hF^rCS>^%#S*u~xK4#{^^!RZ zDTY<1a8oFaxm@3vVOkv-#=s+7qT94-(+LnEW}{|8MuK z)bGKxDmp1niLfN4nv>$JrVX!#F!lu3w;f`N3|q_KtSzRnHzMc>@NYaaD^r}gAv!tL zXpJ{U8&k}wO6cs&JZ2K3|7=ZuJ0@9_#zm)W`5&f4OA=Gt&B-YenEx973{0`s#CM`o VEinn^uQ^i`ONw=Q;yX)2{sZC-+q(b& literal 0 HcmV?d00001 diff --git a/P3D/Content/Textures/Battle/Poison/Stinger.png b/P3D/Content/Textures/Battle/Poison/Stinger.png index 68fa6e649e4482024c2592c846625ff4b85984ed..b37b8b491d7a3b6cbd55fb162dc118582e8b1f3b 100644 GIT binary patch delta 172 zcmV;d08{_U0rmlq7YZN<1^@s68;SVLks&{Sfk{L`R7l6|l(7y3AqYg}568|=q?`Fe zx45iXa~jF5)kP{};1MP;R%=af!VX{)Am`js0DL7%YHyO(001h0R7weVy>m%g14If& z{~^F^9FjKFU=^JPXORxz4*}1cSb4(mnA|fqTNPJ=tnK^cZ1NaGGW)p?v!x#}&OF{uiCduLM?X9<05(>~6SoK?gw{s+6 hnZcK)49+9%11^OBMAI;%4Lbk;002ovPDHLkV1kfvGZO#+ diff --git a/P3D/Content/Textures/Battle/StatusEffect/Burned.png b/P3D/Content/Textures/Battle/StatusEffect/Burned.png new file mode 100644 index 0000000000000000000000000000000000000000..3ca6e2e663d780268f9a43a2fe58b4df623ff58a GIT binary patch literal 1077 zcmV-51j_q~P)YAX9X8WNB|8RBvx=!KdMT000BP zNklP0!3up66cOo#gvYveH^(%u5M?00@8p2!H?xfB*=900_XF2dI?N6Rp*F z0IRv4{P;T#K&6yMF+*AI@rCJyG=SAyV>tyje=r#upi)ZXPy!EMf#(CbVc-L-<{A&X z`ewZu9smHU?;kV(OzvNmEJOkz00JNY0w4hI10b~mzMc@|^h8=wTFj853G&p0&j+B~ z4_}ryUf3;=0+B@lwl`QI47xdWbl*2aNoFT?|wiFdOFa998E^qG~2e1LTU zV0(PJt-Wyj(*G=ILQu?(9suyP9d;U85CGeFmX{IAeLerjco#@bC;$Q=00I#62KChl zgL~jnDQ)g8Tu%t9)m-~t$z2+ORT25(>4K90jZCiE1@($~YPjyDD~hq!~S3EiagLB+COn<4(gQ z-7d&>766T))9_KIng4YqWiUXy3_nxHrdW;83UL6GSk#swgU^SPIHmg|MAzu!0e*c1 zZeMVcW_PDQJd};gDNkt1VYl#ZZpHzS+Z*F8aY~+`e!;P4(6zJb1#r#tCJdG`#tDMF zK%f_l$Ik*-K!61z75e+bO$!c5?;17>>$u#FqNq7tx9R=C2-Z%~-? z-W++~EgB~X!?5TA0T2KIcpm^E`$qZ1DRUn&3qZ;yW)^@)rF1bSKuR9;zImM;AST`+ z|IOMV@s;se0enda07Zu~&I(}l0bEzaR!)3X+-20L4?~Req?zm5Ei5@6YMc+?7%g4d z_6^N!ckY(AjQ6^2XDK2>fOHu*7oe^_V;lfwcYyKG#VQ=2HNC8mv^!xDVd2jL3JGO@ zD=Z PreserveNewest + + PreserveNewest + PreserveNewest @@ -14746,6 +14749,9 @@ PreserveNewest + + PreserveNewest + PreserveNewest @@ -29285,7 +29291,6 @@ - diff --git a/P3D/Pokemon/Attacks/Fire/Ember.vb b/P3D/Pokemon/Attacks/Fire/Ember.vb index d8e04c15a..d977fa38a 100644 --- a/P3D/Pokemon/Attacks/Fire/Ember.vb +++ b/P3D/Pokemon/Attacks/Fire/Ember.vb @@ -67,7 +67,7 @@ Dim MoveAnimation = New AnimationQueryObject(CurrentEntity, BattleFlip) Dim FireballEntity = MoveAnimation.SpawnEntity(Nothing, TextureManager.GetTexture("Textures\Battle\Fire\FireBall"), New Vector3(0.5F), 1.0F) - MoveAnimation.AnimationMove(FireballEntity, True, 2.0, 0.0, 0.0, 0.05, False, True, 0.0, 0.0,, -0.5, 0) + MoveAnimation.AnimationMove(FireballEntity, True, 2.0, 0.0, 0.0, 0.05, False, True, 0.0, 0.0,, -0.5) MoveAnimation.AnimationPlaySound("Battle\Attacks\Fire\Ember_Start", 0, 0) For i = 0 To 12 Dim SmokeEntity = MoveAnimation.SpawnEntity(New Vector3(CSng(i * 0.2), 0.0, 0.0), TextureManager.GetTexture("Textures\Battle\Fire\Smoke"), New Vector3(0.2), 1, CSng(i * 0.2)) @@ -82,7 +82,7 @@ Dim MoveAnimation = New AnimationQueryObject(CurrentEntity, BattleFlip) Dim FireballEntity = MoveAnimation.SpawnEntity(New Vector3(-2.0, 0.0, 0.0), TextureManager.GetTexture("Textures\Battle\Fire\FireBall"), New Vector3(0.5F), 1.0F) - MoveAnimation.AnimationMove(FireballEntity, True, 0.0, 0.0, 0.0, 0.05, False, True, 0.0, 0.0,, -0.5, 0) + MoveAnimation.AnimationMove(FireballEntity, True, -0.05, 0.0, 0.0, 0.05, False, True, 0.0, 1.0,, -0.5) For i = 0 To 12 Dim SmokeEntity = MoveAnimation.SpawnEntity(New Vector3(CSng(-3.0 + i * 0.2), 0.0, 0.0), TextureManager.GetTexture("Textures\Battle\Fire\Smoke"), New Vector3(0.2), 1, CSng(i * 0.2)) @@ -90,27 +90,27 @@ i += 1 Next - MoveAnimation.AnimationPlaySound("Battle\Attacks\Fire\Ember_Hit", 2, 0) + MoveAnimation.AnimationPlaySound("Battle\Attacks\Fire\Ember_Hit", 4, 0) - Dim FireEntity1 As Entity = MoveAnimation.SpawnEntity(New Vector3(-0.25, -0.25, -0.25), TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 0, 32, 32), ""), New Vector3(0.5F), 1, 1, 1) - Dim FireEntity2 As Entity = MoveAnimation.SpawnEntity(New Vector3(0.25, -0.25, 0.25), TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 0, 32, 32), ""), New Vector3(0.5F), 1, 1, 1) - Dim FireEntity3 As Entity = MoveAnimation.SpawnEntity(New Vector3(0.25, -0.25, -0.25), TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 0, 32, 32), ""), New Vector3(0.5F), 1, 1, 1) + Dim FireEntity1 As Entity = MoveAnimation.SpawnEntity(New Vector3(-0.25, -0.25, -0.25), TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 0, 32, 32), ""), New Vector3(0.5F), 1, 3, 0) + Dim FireEntity2 As Entity = MoveAnimation.SpawnEntity(New Vector3(0, -0.25, 0), TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 0, 32, 32), ""), New Vector3(0.5F), 1, 3, 0) + Dim FireEntity3 As Entity = MoveAnimation.SpawnEntity(New Vector3(0.25, -0.25, 0.25), TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 0, 32, 32), ""), New Vector3(0.5F), 1, 3, 0) - MoveAnimation.AnimationChangeTexture(FireEntity1, False, TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 32, 32, 32), ""), 2, 1) - MoveAnimation.AnimationChangeTexture(FireEntity2, False, TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 32, 32, 32), ""), 2, 1) - MoveAnimation.AnimationChangeTexture(FireEntity3, False, TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 32, 32, 32), ""), 2, 1) + MoveAnimation.AnimationChangeTexture(FireEntity1, False, TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 32, 32, 32), ""), 3.75, 0) + MoveAnimation.AnimationChangeTexture(FireEntity2, False, TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 32, 32, 32), ""), 3.75, 0) + MoveAnimation.AnimationChangeTexture(FireEntity3, False, TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 32, 32, 32), ""), 3.75, 0) - MoveAnimation.AnimationChangeTexture(FireEntity1, False, TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 64, 32, 32), ""), 3, 1) - MoveAnimation.AnimationChangeTexture(FireEntity2, False, TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 64, 32, 32), ""), 3, 1) - MoveAnimation.AnimationChangeTexture(FireEntity3, False, TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 64, 32, 32), ""), 3, 1) + MoveAnimation.AnimationChangeTexture(FireEntity1, False, TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 64, 32, 32), ""), 4.5, 0) + MoveAnimation.AnimationChangeTexture(FireEntity2, False, TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 64, 32, 32), ""), 4.5, 0) + MoveAnimation.AnimationChangeTexture(FireEntity3, False, TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 64, 32, 32), ""), 4.5, 0) - MoveAnimation.AnimationChangeTexture(FireEntity1, False, TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 96, 32, 32), ""), 4, 1) - MoveAnimation.AnimationChangeTexture(FireEntity2, False, TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 96, 32, 32), ""), 4, 1) - MoveAnimation.AnimationChangeTexture(FireEntity3, False, TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 96, 32, 32), ""), 4, 1) + MoveAnimation.AnimationChangeTexture(FireEntity1, False, TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 96, 32, 32), ""), 5.25, 0) + MoveAnimation.AnimationChangeTexture(FireEntity2, False, TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 96, 32, 32), ""), 5.25, 0) + MoveAnimation.AnimationChangeTexture(FireEntity3, False, TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 96, 32, 32), ""), 5.25, 0) - MoveAnimation.AnimationChangeTexture(FireEntity1, True, TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 128, 32, 32), ""), 5, 1) - MoveAnimation.AnimationChangeTexture(FireEntity2, True, TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 128, 32, 32), ""), 5, 1) - MoveAnimation.AnimationChangeTexture(FireEntity3, True, TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 128, 32, 32), ""), 5, 1) + MoveAnimation.AnimationChangeTexture(FireEntity1, True, TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 128, 32, 32), ""), 6, 0) + MoveAnimation.AnimationChangeTexture(FireEntity2, True, TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 128, 32, 32), ""), 6, 0) + MoveAnimation.AnimationChangeTexture(FireEntity3, True, TextureManager.GetTexture("Textures\Battle\Fire\Ember", New Rectangle(0, 128, 32, 32), ""), 6, 0) BattleScreen.BattleQuery.Add(MoveAnimation) End Sub diff --git a/P3D/Pokemon/Attacks/Normal/Growl.vb b/P3D/Pokemon/Attacks/Normal/Growl.vb index 7ab2ed77b..714437ec3 100644 --- a/P3D/Pokemon/Attacks/Normal/Growl.vb +++ b/P3D/Pokemon/Attacks/Normal/Growl.vb @@ -67,12 +67,12 @@ MoveAnimation.AnimationPlaySound(CStr(CurrentPokemon.Number), 0, 0,, True) Dim SoundwaveEntity As Entity - If BattleFlip = False Then - SoundwaveEntity = MoveAnimation.SpawnEntity(New Vector3(0.25, -0.25, 0), TextureManager.GetTexture("Textures\Battle\Normal\Growl", New Rectangle(0, 0, 32, 32), ""), New Vector3(0.5F), 1, 0, 1) - Else - SoundwaveEntity = MoveAnimation.SpawnEntity(New Vector3(-0.25, -0.25, 0), TextureManager.GetTexture("Textures\Battle\Normal\Growl", New Rectangle(0, 0, 32, 32), ""), New Vector3(0.5F), 1, 0, 1) - End If - MoveAnimation.AnimationChangeTexture(SoundwaveEntity, False, TextureManager.GetTexture("Textures\Battle\Normal\Growl", New Rectangle(0, 32, 32, 32), ""), 1, 1) + ' If BattleFlip = False Then + SoundwaveEntity = MoveAnimation.SpawnEntity(New Vector3(0.25, -0.25, 0), TextureManager.GetTexture("Textures\Battle\Normal\Growl", New Rectangle(0, 0, 32, 32), ""), New Vector3(0.5F), 1, 0, 1) + 'Else + ' SoundwaveEntity = MoveAnimation.SpawnEntity(New Vector3(-0.25, -0.25, 0), TextureManager.GetTexture("Textures\Battle\Normal\Growl", New Rectangle(0, 0, 32, 32), ""), New Vector3(0.5F), 1, 0, 1) + 'End If + MoveAnimation.AnimationChangeTexture(SoundwaveEntity, False, TextureManager.GetTexture("Textures\Battle\Normal\Growl", New Rectangle(0, 32, 32, 32), ""), 1, 1) MoveAnimation.AnimationChangeTexture(SoundwaveEntity, False, TextureManager.GetTexture("Textures\Battle\Normal\Growl", New Rectangle(0, 0, 32, 32), ""), 2, 1) MoveAnimation.AnimationChangeTexture(SoundwaveEntity, True, TextureManager.GetTexture("Textures\Battle\Normal\Growl", New Rectangle(0, 32, 32, 32), ""), 3, 1) diff --git a/P3D/Pokemon/Attacks/Poison/PoisonSting.vb b/P3D/Pokemon/Attacks/Poison/PoisonSting.vb index 9393f3042..50517801e 100644 --- a/P3D/Pokemon/Attacks/Poison/PoisonSting.vb +++ b/P3D/Pokemon/Attacks/Poison/PoisonSting.vb @@ -67,10 +67,15 @@ Public Overrides Sub InternalUserPokemonMoveAnimation(ByVal BattleScreen As BattleScreen, ByVal BattleFlip As Boolean, ByVal CurrentPokemon As Pokemon, ByVal CurrentEntity As NPC, ByVal CurrentModel As ModelEntity) Dim MoveAnimation As AnimationQueryObject = New AnimationQueryObject(CurrentEntity, BattleFlip) - Dim StingerEntity As Entity = MoveAnimation.SpawnEntity(Nothing, TextureManager.GetTexture("Textures\Battle\Poison\Stinger"), New Vector3(0.5F), 1.0F) + + Dim TextureYOffset As Integer = 0 + If BattleFlip = True Then + TextureYOffset = 16 + End If + Dim StingerEntity As Entity = MoveAnimation.SpawnEntity(Nothing, TextureManager.GetTexture("Textures\Battle\Poison\Stinger", New Rectangle(0, TextureYOffset, 16, 16), ""), New Vector3(0.2F), 1.0F) MoveAnimation.AnimationPlaySound("Battle\Attacks\Poison\PoisonSting_Start", 0, 0) - MoveAnimation.AnimationMove(StingerEntity, True, 2.0, 0.0, 0.0, 0.05, False, False, 0.0, 0.0,,, 0) + MoveAnimation.AnimationMove(StingerEntity, True, 2.0, 0.0, 0.0, 0.08, False, False, 0.0, 0.0) BattleScreen.BattleQuery.Add(MoveAnimation) End Sub @@ -78,27 +83,31 @@ Public Overrides Sub InternalOpponentPokemonMoveAnimation(ByVal BattleScreen As BattleScreen, ByVal BattleFlip As Boolean, ByVal CurrentPokemon As Pokemon, ByVal CurrentEntity As NPC, ByVal CurrentModel As ModelEntity) Dim MoveAnimation As AnimationQueryObject = New AnimationQueryObject(CurrentEntity, BattleFlip) - Dim StingerEntity As Entity = MoveAnimation.SpawnEntity(New Vector3(-2.0, 0, 0.0), TextureManager.GetTexture("Textures\Battle\Poison\Stinger"), New Vector3(0.5F), 1) + Dim TextureYOffset As Integer = 0 + If BattleFlip = True Then + TextureYOffset = 16 + End If + Dim StingerEntity As Entity = MoveAnimation.SpawnEntity(New Vector3(-2.0, 0, 0.0), TextureManager.GetTexture("Textures\Battle\Poison\Stinger", New Rectangle(0, TextureYOffset, 16, 16), ""), New Vector3(0.2F), 1) - MoveAnimation.AnimationMove(StingerEntity, True, 0.0, 0.0, 0.0, 0.05, False, False, 0.0, 0.0,,, 0) + MoveAnimation.AnimationMove(StingerEntity, True, 0.0, 0.0, 0.0, 0.08, False, False, 0.0, 0.0) MoveAnimation.AnimationPlaySound("Battle\Attacks\Poison\PoisonSting_Hit", 1, 0) - Dim BubbleEntity1 As Entity = MoveAnimation.SpawnEntity(New Vector3(-0.25, -0.25, -0.25), TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 0, 32, 32), ""), New Vector3(0.5F), 1, 1, 1) + Dim BubbleEntity1 As Entity = MoveAnimation.SpawnEntity(New Vector3(-0.25, -0.25, -0.25), TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 0, 32, 32), ""), New Vector3(0.5F), 1, 2, 1) - MoveAnimation.AnimationChangeTexture(BubbleEntity1, False, TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 32, 32, 32), ""), 2, 1) + MoveAnimation.AnimationChangeTexture(BubbleEntity1, False, TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 32, 32, 32), ""), 3, 1) - Dim BubbleEntity2 As Entity = MoveAnimation.SpawnEntity(New Vector3(0.25, -0.25, 0.25), TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 0, 32, 32), ""), New Vector3(0.5F), 1, 2, 1) + Dim BubbleEntity2 As Entity = MoveAnimation.SpawnEntity(New Vector3(0, -0.25, 0), TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 0, 32, 32), ""), New Vector3(0.5F), 1, 3, 1) - MoveAnimation.AnimationChangeTexture(BubbleEntity1, True, TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 64, 32, 32), ""), 3, 1) - MoveAnimation.AnimationChangeTexture(BubbleEntity2, False, TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 32, 32, 32), ""), 3, 1) + MoveAnimation.AnimationChangeTexture(BubbleEntity1, True, TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 64, 32, 32), ""), 4, 1) + MoveAnimation.AnimationChangeTexture(BubbleEntity2, False, TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 32, 32, 32), ""), 4, 1) - Dim BubbleEntity3 As Entity = MoveAnimation.SpawnEntity(New Vector3(0.25, -0.25, -0.25), TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 0, 32, 32), ""), New Vector3(0.5F), 1, 3, 1) + Dim BubbleEntity3 As Entity = MoveAnimation.SpawnEntity(New Vector3(0.25, -0.25, 0.25), TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 0, 32, 32), ""), New Vector3(0.5F), 1, 4, 1) - MoveAnimation.AnimationChangeTexture(BubbleEntity2, True, TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 64, 32, 32), ""), 4, 1) - MoveAnimation.AnimationChangeTexture(BubbleEntity3, False, TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 32, 32, 32), ""), 4, 1) + MoveAnimation.AnimationChangeTexture(BubbleEntity2, True, TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 64, 32, 32), ""), 5, 1) + MoveAnimation.AnimationChangeTexture(BubbleEntity3, False, TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 32, 32, 32), ""), 5, 1) - MoveAnimation.AnimationChangeTexture(BubbleEntity3, True, TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 64, 32, 32), ""), 5, 1) + MoveAnimation.AnimationChangeTexture(BubbleEntity3, True, TextureManager.GetTexture("Textures\Battle\Poison\Bubble", New Rectangle(0, 64, 32, 32), ""), 6, 1) BattleScreen.BattleQuery.Add(MoveAnimation) End Sub diff --git a/P3D/Screens/Battle/BattleGrowStatsScreen.vb b/P3D/Screens/Battle/BattleGrowStatsScreen.vb index 7532b2c81..9fe64c82a 100644 --- a/P3D/Screens/Battle/BattleGrowStatsScreen.vb +++ b/P3D/Screens/Battle/BattleGrowStatsScreen.vb @@ -41,47 +41,60 @@ Dim pokeTexture = Pokemon.GetMenuTexture() Core.SpriteBatch.Draw(pokeTexture, New Rectangle(CInt(p.X + 20), CInt(p.Y + 20), pokeTexture.Width * 2, 64), Color.White) Core.SpriteBatch.DrawString(FontManager.InGameFont, Pokemon.GetDisplayName(), New Vector2(p.X + 90, p.Y + 32), Color.Black) - Core.SpriteBatch.DrawString(FontManager.MiniFont, " reached level " & Pokemon.Level & "!", New Vector2(p.X + 90 + FontManager.InGameFont.MeasureString(Pokemon.GetDisplayName()).X, p.Y + 41), Color.Black) + Core.SpriteBatch.DrawString(FontManager.InGameFont, " reached level " & Pokemon.Level & "!", New Vector2(p.X + 90 + FontManager.InGameFont.MeasureString(Pokemon.GetDisplayName()).X, p.Y + 41), Color.Black) + + Dim OldOffset As Integer = 160 If Delay >= 3.0F Then - Core.SpriteBatch.DrawString(FontManager.MiniFont, "Max HP: " & OldStats(0).ToString(), New Vector2(p.X + 32, p.Y + 84), Color.Black) - Core.SpriteBatch.DrawString(FontManager.MiniFont, "Attack: " & OldStats(1).ToString(), New Vector2(p.X + 32, p.Y + 124), Color.Black) - Core.SpriteBatch.DrawString(FontManager.MiniFont, "Defense: " & OldStats(2).ToString(), New Vector2(p.X + 32, p.Y + 164), Color.Black) - Core.SpriteBatch.DrawString(FontManager.MiniFont, "Sp Attack: " & OldStats(3).ToString(), New Vector2(p.X + 32, p.Y + 204), Color.Black) - Core.SpriteBatch.DrawString(FontManager.MiniFont, "Sp Defense: " & OldStats(4).ToString(), New Vector2(p.X + 32, p.Y + 244), Color.Black) - Core.SpriteBatch.DrawString(FontManager.MiniFont, "Speed: " & OldStats(5).ToString(), New Vector2(p.X + 32, p.Y + 284), Color.Black) + Core.SpriteBatch.DrawString(FontManager.InGameFont, Localization.GetString("MaxHP") & ":", New Vector2(p.X + 32, p.Y + 84), Color.Black) + Core.SpriteBatch.DrawString(FontManager.InGameFont, OldStats(0).ToString(), New Vector2(p.X + 32 + OldOffset, p.Y + 84), Color.Black) + Core.SpriteBatch.DrawString(FontManager.InGameFont, Localization.GetString("Attack") & ":", New Vector2(p.X + 32, p.Y + 124), Color.Black) + Core.SpriteBatch.DrawString(FontManager.InGameFont, OldStats(1).ToString(), New Vector2(p.X + 32 + OldOffset, p.Y + 124), Color.Black) + Core.SpriteBatch.DrawString(FontManager.InGameFont, Localization.GetString("Defense") & ":", New Vector2(p.X + 32, p.Y + 164), Color.Black) + Core.SpriteBatch.DrawString(FontManager.InGameFont, OldStats(2).ToString(), New Vector2(p.X + 32 + OldOffset, p.Y + 164), Color.Black) + Core.SpriteBatch.DrawString(FontManager.InGameFont, Localization.GetString("Sp_Attack") & ":", New Vector2(p.X + 32, p.Y + 204), Color.Black) + Core.SpriteBatch.DrawString(FontManager.InGameFont, OldStats(3).ToString(), New Vector2(p.X + 32 + OldOffset, p.Y + 204), Color.Black) + Core.SpriteBatch.DrawString(FontManager.InGameFont, Localization.GetString("Sp_Defense") & ":", New Vector2(p.X + 32, p.Y + 244), Color.Black) + Core.SpriteBatch.DrawString(FontManager.InGameFont, OldStats(4).ToString(), New Vector2(p.X + 32 + OldOffset, p.Y + 244), Color.Black) + Core.SpriteBatch.DrawString(FontManager.InGameFont, Localization.GetString("Speed") & ":", New Vector2(p.X + 32, p.Y + 284), Color.Black) + Core.SpriteBatch.DrawString(FontManager.InGameFont, OldStats(5).ToString(), New Vector2(p.X + 32 + OldOffset, p.Y + 284), Color.Black) End If + + Dim NewOffset As Integer = 208 If Delay >= 5.0F Then - Core.SpriteBatch.DrawString(FontManager.MiniFont, "+ " & newMaxHP, New Vector2(p.X + 200, p.Y + 84), Color.Black) + Core.SpriteBatch.DrawString(FontManager.InGameFont, "+ " & newMaxHP, New Vector2(p.X + 32 + NewOffset, p.Y + 84), Color.Black) End If If Delay >= 5.5F Then - Core.SpriteBatch.DrawString(FontManager.MiniFont, "+ " & newAttack, New Vector2(p.X + 200, p.Y + 124), Color.Black) + Core.SpriteBatch.DrawString(FontManager.InGameFont, "+ " & newAttack, New Vector2(p.X + 32 + NewOffset, p.Y + 124), Color.Black) End If If Delay >= 6.0F Then - Core.SpriteBatch.DrawString(FontManager.MiniFont, "+ " & newDefense, New Vector2(p.X + 200, p.Y + 164), Color.Black) + Core.SpriteBatch.DrawString(FontManager.InGameFont, "+ " & newDefense, New Vector2(p.X + 32 + NewOffset, p.Y + 164), Color.Black) End If If Delay >= 6.5F Then - Core.SpriteBatch.DrawString(FontManager.MiniFont, "+ " & newSpAttack, New Vector2(p.X + 200, p.Y + 204), Color.Black) + Core.SpriteBatch.DrawString(FontManager.InGameFont, "+ " & newSpAttack, New Vector2(p.X + 32 + NewOffset, p.Y + 204), Color.Black) End If If Delay >= 7.0F Then - Core.SpriteBatch.DrawString(FontManager.MiniFont, "+ " & newSpDefense, New Vector2(p.X + 200, p.Y + 244), Color.Black) + Core.SpriteBatch.DrawString(FontManager.InGameFont, "+ " & newSpDefense, New Vector2(p.X + 32 + NewOffset, p.Y + 244), Color.Black) End If If Delay >= 7.5F Then - Core.SpriteBatch.DrawString(FontManager.MiniFont, "+ " & newSpeed, New Vector2(p.X + 200, p.Y + 284), Color.Black) + Core.SpriteBatch.DrawString(FontManager.InGameFont, "+ " & newSpeed, New Vector2(p.X + 32 + NewOffset, p.Y + 284), Color.Black) End If + + Dim ResultOffset As Integer = 272 + If Delay >= 9.0F Then - Core.SpriteBatch.DrawString(FontManager.MiniFont, "= " & Pokemon.MaxHP, New Vector2(p.X + 252, p.Y + 84), Color.Black) - Core.SpriteBatch.DrawString(FontManager.MiniFont, "= " & Pokemon.Attack, New Vector2(p.X + 252, p.Y + 124), Color.Black) - Core.SpriteBatch.DrawString(FontManager.MiniFont, "= " & Pokemon.Defense, New Vector2(p.X + 252, p.Y + 164), Color.Black) - Core.SpriteBatch.DrawString(FontManager.MiniFont, "= " & Pokemon.SpAttack, New Vector2(p.X + 252, p.Y + 204), Color.Black) - Core.SpriteBatch.DrawString(FontManager.MiniFont, "= " & Pokemon.SpDefense, New Vector2(p.X + 252, p.Y + 244), Color.Black) - Core.SpriteBatch.DrawString(FontManager.MiniFont, "= " & Pokemon.Speed, New Vector2(p.X + 252, p.Y + 284), Color.Black) + Core.SpriteBatch.DrawString(FontManager.InGameFont, "= " & Pokemon.MaxHP, New Vector2(p.X + 32 + ResultOffset, p.Y + 84), Color.Black) + Core.SpriteBatch.DrawString(FontManager.InGameFont, "= " & Pokemon.Attack, New Vector2(p.X + 32 + ResultOffset, p.Y + 124), Color.Black) + Core.SpriteBatch.DrawString(FontManager.InGameFont, "= " & Pokemon.Defense, New Vector2(p.X + 32 + ResultOffset, p.Y + 164), Color.Black) + Core.SpriteBatch.DrawString(FontManager.InGameFont, "= " & Pokemon.SpAttack, New Vector2(p.X + 32 + ResultOffset, p.Y + 204), Color.Black) + Core.SpriteBatch.DrawString(FontManager.InGameFont, "= " & Pokemon.SpDefense, New Vector2(p.X + 32 + ResultOffset, p.Y + 244), Color.Black) + Core.SpriteBatch.DrawString(FontManager.InGameFont, "= " & Pokemon.Speed, New Vector2(p.X + 32 + ResultOffset, p.Y + 284), Color.Black) End If If Delay >= 11.0F Then Dim newStat As Integer = 0 newStat = newAttack + newDefense + newSpAttack + newMaxHP + newSpDefense + newSpeed - Core.SpriteBatch.DrawString(FontManager.MiniFont, Pokemon.GetDisplayName() & " got a boost of " & newStat.ToString() & "!", New Vector2(p.X + 32, p.Y + 320), Color.DarkRed) + Core.SpriteBatch.DrawString(FontManager.InGameFont, Pokemon.GetDisplayName() & " got a boost of " & newStat.ToString() & "!", New Vector2(p.X + 32, p.Y + 320), Color.DarkRed) End If End Sub diff --git a/P3D/Screens/Pokemon/PartyScreen.vb b/P3D/Screens/Pokemon/PartyScreen.vb index f3d242116..a831acb44 100644 --- a/P3D/Screens/Pokemon/PartyScreen.vb +++ b/P3D/Screens/Pokemon/PartyScreen.vb @@ -183,10 +183,10 @@ Public Class PartyScreen Canvas.DrawRectangle(New Rectangle(CInt(Core.windowSize.Width / 2 - 150), CInt(Core.windowSize.Height - 200), 300, 100), New Color(0, 0, 0, CInt(150 * textFade * _interfaceFade))) - Dim text As String = _messageText.CropStringToWidth(FontManager.ChatFont, 250) '''??? - Dim size As Vector2 = FontManager.ChatFont.MeasureString(text) + Dim text As String = _messageText.CropStringToWidth(FontManager.MainFont, 250) '''??? + Dim size As Vector2 = FontManager.MainFont.MeasureString(text) - SpriteBatch.DrawString(FontManager.ChatFont, text, New Vector2(CSng(Core.windowSize.Width / 2 - size.X / 2), CSng(Core.windowSize.Height - 150 - size.Y / 2)), New Color(255, 255, 255, CInt(255 * textFade * _interfaceFade))) + SpriteBatch.DrawString(FontManager.MainFont, text, New Vector2(CSng(Core.windowSize.Width / 2 - size.X / 2), CSng(Core.windowSize.Height - 150 - size.Y / 2)), New Color(255, 255, 255, CInt(255 * textFade * _interfaceFade))) End If End Sub @@ -214,7 +214,10 @@ Public Class PartyScreen _preScreenTexture = target End If - SpriteBatch.Draw(_blur.Perform(_preScreenTexture), windowSize, Color.White) + If _interfaceFade < 1.0F Then + SpriteBatch.Draw(_preScreenTexture, windowSize, Color.White) + End If + SpriteBatch.Draw(_blur.Perform(_preScreenTexture), windowSize, New Color(255, 255, 255, CInt(255 * _interfaceFade * 2).Clamp(0, 255))) End Sub @@ -232,7 +235,7 @@ Public Class PartyScreen SpriteBatch.Draw(_texture, New Rectangle(halfWidth - 140, halfHeight - 232, 16, 16), New Rectangle(80, 0, 16, 16), mainBackgroundColor) SpriteBatch.Draw(_texture, New Rectangle(halfWidth - 124, halfHeight - 216, 16, 16), New Rectangle(80, 0, 16, 16), mainBackgroundColor) - SpriteBatch.DrawString(FontManager.ChatFont, POKEMON_TITLE, New Vector2(halfWidth - 390, halfHeight - 228), mainBackgroundColor) + SpriteBatch.DrawString(FontManager.MainFont, POKEMON_TITLE, New Vector2(halfWidth - 390, halfHeight - 228), mainBackgroundColor) For y = 0 To CInt(_enrollY) Step 16 For x = 0 To 800 Step 16 @@ -292,7 +295,7 @@ Public Class PartyScreen _pokemonAnimations(index)._shakeV * shakeMulti, New Vector2(16, 16), SpriteEffects.None, 0F) 'name: - GetFontRenderer().DrawString(FontManager.MiniFont, p.GetDisplayName(), New Vector2(position.X + 156, position.Y + 27), New Color(255, 255, 255, CInt(255 * _interfaceFade))) + GetFontRenderer().DrawString(FontManager.MainFont, p.GetDisplayName(), New Vector2(position.X + 156, position.Y + 27), New Color(255, 255, 255, CInt(255 * _interfaceFade))) Else Dim shakeMulti As Single = CSng((p.HP / p.MaxHP).Clamp(0.2F, 1.0F)) @@ -308,18 +311,18 @@ Public Class PartyScreen End If 'name: - GetFontRenderer().DrawString(FontManager.MiniFont, p.GetDisplayName(), New Vector2(position.X + 78, position.Y + 5), New Color(255, 255, 255, CInt(255 * _interfaceFade))) + GetFontRenderer().DrawString(FontManager.MainFont, p.GetDisplayName(), New Vector2(position.X + 78, position.Y + 5), New Color(255, 255, 255, CInt(255 * _interfaceFade))) 'Gender symbol: Select Case p.Gender Case Pokemon.Genders.Male - SpriteBatch.Draw(_menuTexture, New Rectangle(CInt(position.X + FontManager.MiniFont.MeasureString(p.GetDisplayName()).X + 86), CInt(position.Y + 9), 7, 13), New Rectangle(25, 0, 7, 13), New Color(255, 255, 255, CInt(255 * _interfaceFade))) + SpriteBatch.Draw(_menuTexture, New Rectangle(CInt(position.X + FontManager.MainFont.MeasureString(p.GetDisplayName()).X + 86), CInt(position.Y + 9), 7, 13), New Rectangle(25, 0, 7, 13), New Color(255, 255, 255, CInt(255 * _interfaceFade))) Case Pokemon.Genders.Female - SpriteBatch.Draw(_menuTexture, New Rectangle(CInt(position.X + FontManager.MiniFont.MeasureString(p.GetDisplayName()).X + 85), CInt(position.Y + 9), 9, 13), New Rectangle(32, 0, 9, 13), New Color(255, 255, 255, CInt(255 * _interfaceFade))) + SpriteBatch.Draw(_menuTexture, New Rectangle(CInt(position.X + FontManager.MainFont.MeasureString(p.GetDisplayName()).X + 85), CInt(position.Y + 9), 9, 13), New Rectangle(32, 0, 9, 13), New Color(255, 255, 255, CInt(255 * _interfaceFade))) End Select 'Level: - GetFontRenderer().DrawString(FontManager.MiniFont, "Lv. " & p.Level.ToString(), New Vector2(position.X + 4, position.Y + 56), New Color(255, 255, 255, CInt(255 * _interfaceFade))) + GetFontRenderer().DrawString(FontManager.MainFont, "Lv. " & p.Level.ToString(), New Vector2(position.X + 4, position.Y + 50), New Color(255, 255, 255, CInt(255 * _interfaceFade))) 'HP Bar: SpriteBatch.Draw(_menuTexture, New Rectangle(CInt(position.X) + 102, CInt(position.Y) + 32, 111, 15), New Rectangle(16, 32, 74, 10), New Color(255, 255, 255, CInt(255 * _interfaceFade))) @@ -354,7 +357,7 @@ Public Class PartyScreen End With 'HP display: - GetFontRenderer().DrawString(FontManager.MiniFont, p.HP & " / " & p.MaxHP, New Vector2(position.X + 100, position.Y + 50), New Color(255, 255, 255, CInt(255 * _interfaceFade))) + GetFontRenderer().DrawString(FontManager.MainFont, p.HP & " / " & p.MaxHP, New Vector2(position.X + 100, position.Y + 50), New Color(255, 255, 255, CInt(255 * _interfaceFade))) 'status condition Dim StatusTexture As Texture2D = BattleStats.GetStatImage(p.Status) @@ -379,7 +382,7 @@ Public Class PartyScreen End If End Select End If - GetFontRenderer().DrawString(FontManager.MiniFont, AttackLabel, New Vector2(position.X + 210, position.Y + 50), New Color(255, 255, 255, CInt(255 * _interfaceFade))) + GetFontRenderer().DrawString(FontManager.MainFont, AttackLabel, New Vector2(position.X + 210, position.Y + 50), New Color(255, 255, 255, CInt(255 * _interfaceFade))) End If From 54ea0e57bae1c7d36929d3870286beed8cb335d3 Mon Sep 17 00:00:00 2001 From: JappaWakka Date: Sat, 29 Jan 2022 00:06:58 +0100 Subject: [PATCH 53/57] Added WallModel (ModelID=20) which is a flat vertical surface on an offset (like a wall) --- P3D/P3D.vbproj | 1 + P3D/Resources/Models/2D/WallModel.vb | 20 ++++++++++++++++++++ P3D/Resources/Models/BaseModel.vb | 3 +++ 3 files changed, 24 insertions(+) create mode 100644 P3D/Resources/Models/2D/WallModel.vb diff --git a/P3D/P3D.vbproj b/P3D/P3D.vbproj index 3f0c657a7..0cc1162c9 100644 --- a/P3D/P3D.vbproj +++ b/P3D/P3D.vbproj @@ -30775,6 +30775,7 @@ + diff --git a/P3D/Resources/Models/2D/WallModel.vb b/P3D/Resources/Models/2D/WallModel.vb new file mode 100644 index 000000000..ea0c59c36 --- /dev/null +++ b/P3D/Resources/Models/2D/WallModel.vb @@ -0,0 +1,20 @@ +Public Class WallModel + + Inherits BaseModel + + Public Sub New() + Me.ID = 20 + + Dim vertexData = New VertexPositionNormalTexture() { + New VertexPositionNormalTexture(New Vector3(-0.5, -0.5, 0.5), Vector3.Backward, New Vector2(0, 1)), + New VertexPositionNormalTexture(New Vector3(-0.5, 0.5, 0.5), Vector3.Backward, New Vector2(0, 0)), + New VertexPositionNormalTexture(New Vector3(0.5, 0.5, 0.5), Vector3.Backward, New Vector2(1, 0)), + New VertexPositionNormalTexture(New Vector3(0.5, 0.5, 0.5), Vector3.Backward, New Vector2(1, 0)), + New VertexPositionNormalTexture(New Vector3(0.5, -0.5, 0.5), Vector3.Backward, New Vector2(1, 1)), + New VertexPositionNormalTexture(New Vector3(-0.5, -0.5, 0.5), Vector3.Backward, New Vector2(0, 1)) + } + + Setup(vertexData) + End Sub + +End Class diff --git a/P3D/Resources/Models/BaseModel.vb b/P3D/Resources/Models/BaseModel.vb index c10890d7d..782c08ba4 100644 --- a/P3D/Resources/Models/BaseModel.vb +++ b/P3D/Resources/Models/BaseModel.vb @@ -100,6 +100,7 @@ Public Shared DiagonalWallModel As DiagonalWallModel = New DiagonalWallModel() Public Shared HalfDiagonalWallModel As HalfDiagonalWallModel = New HalfDiagonalWallModel() Public Shared OutsideStepModel As OutsideStepModel = New OutsideStepModel() + Public Shared WallModel As WallModel = New WallModel() Public Shared Function getModelbyID(ByVal ID As Integer) As BaseModel Select Case ID @@ -143,6 +144,8 @@ Return HalfDiagonalWallModel Case 19 Return OutsideStepModel + Case 20 + Return WallModel Case Else Return BlockModel End Select From e1f20d7c63c4b48993e39528ff12dbfd6cc48697 Mon Sep 17 00:00:00 2001 From: JappaWakka Date: Sat, 29 Jan 2022 00:08:12 +0100 Subject: [PATCH 54/57] Improved and optimized Violet City gym maps (Regular & Battle) --- .../Data/maps/battle/gyms/violet_gym.dat | Bin 20250 -> 38682 bytes P3D/Content/Data/maps/gyms/violet_gym.dat | Bin 25326 -> 47788 bytes P3D/Content/Textures/Gym.png | Bin 7858 -> 7395 bytes 3 files changed, 0 insertions(+), 0 deletions(-) diff --git a/P3D/Content/Data/maps/battle/gyms/violet_gym.dat b/P3D/Content/Data/maps/battle/gyms/violet_gym.dat index 25becde102a69ff7c1cfaf53833756b086d1d718..5f3d1ff46178c49c0dcd05bbca0626d1da7ca521 100644 GIT binary patch literal 38682 zcmeHQ+iny`5UuA(`3J-^LEa6w7L78 z*y--+8JDcV%erU!cIMRS>gw+Q{{2MP>5xunN#}Gy?`gsR|3p90gr3usKV7E>^oqZK zMrSnR>jS5nb84jeoj+gjw^KTxm-Lx`T>2w^-s`QY9`fCPZ%8%aod4t}&5N?VUfJzeP@u zxW@0+-hq_3^Q7nrdH#s*6s5bfy35sg-`bA&dAGbWY_BUy(BHa__p0lN{QE-otoG=b zu>;)Y)4!tDyo>sN;H}t>=n*xIr#nLp8G53zvMJ^9R}4V>Ez!&BMK0B=Ibu}Q|dze`-nx``d9aZP1WA;oTzNqh>soUNxmw6Go@gk@vC#;g{ z#xG@f>Ry=-15Z#=h9*N(`&mATe>F7aprq>Dbi_*PFOKgC72%?G&yNA#G{<*XL<=E$ z8j(N?`h{bK{@_oDHFvXw+vBI)Y+wJpQ!)nt#%;b_JA{d@QWPL^unXUn=I<2OZyc#V z1O)aodT$->^!wrC57@(XpGTGF%sp@E+W)aF8eJM=%n2WZYu!ye+0L7Rcy4e@$jI#G zI6#RfMP3$J+8kLLYnCx3mf#sPEOkFR=sT9i#p*a?raZj%!$6a9Q?6)=5l@=Z>WQkk z>nXN4K6}$p7@2Nbol_q{;tpRw@3Y=Z)8@V;cHStgbha^H9x7e^kIok#f~&wCI-0CLPuF^fiPKUnh22r5 z*|&MGKrMFnu$A-cSI);nR9bc_$3fdjuba8TcxWo`$>on7!!wlmq;j=(arTT+#TM80 zxpAM(#dPmQh`D1-N<0}?<-t{TJYm%Lh$9rRD+6|9x<)Q;N_N1i^36V8P}wmsl^0Z2 zfW_ypazuheC%jzi$-jy_Ug>x(>_{*jnnr~E2MtfTc&+Mq0)K^IC|Ia8V?o1|zdOv3 zHCB2&rSLD9)dSybnn`X}Ss_>|o#jJxr`Wv|^M8h^ZJ5&0+7OhKAu7)q<^E}@tD(;I z-3LeHyuWcgzj_)a<eXpIk>&D4xPOF=|z-C^epvQ!c=GKKF!K&)mIVO6^nF5noq` zO0(~WTOVq(G47<4>e(g^QK5J$rS$`XO;2f`cF$94pB$>HmMV8W>}F^3^a&i>6~&!Il@6wY5X zp2|m0^`EDFL>W(Yucy>I;w<0S^3+Lj>ZP7}>7Ox*k>3H`T%AZRIlv|%inRIc@^oWG zna`2ZVNF;3h*0rA_@|)4?}0Po^~`MXOSJb+$ZALNeU(3>eSJj|#vkTCF%Mf?)$f}| znZv*@P~_gQIO7OI@Mls*8TRzwItvdU!Qxpl1`ct4wK1@s51vjzRPk#J+~x%K{1ALK zbnuwZ9VyqOJ&@s=M zOlzyW!p_&gXNA!;qN^MS#9>C?KOhJbT`}bqXefvKPW=S>7b&6o656aa#gogI`Vz1Y zjrt(LE5q;~s2@`LHXPQ@i?b#iVz!?uAw7(?PldE_sB!fSg9_~x;H(R;lIHJF5e^wM z))d(F-?iCp*pS|eZ`+K8a30M1C@H~YSRYUwZ&l^CpT%p#LaC5uEVSfVlqSTLQSk*L CTzBvQ delta 698 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 Y)9Q&khq2danOUr7=PYUK-ldcFe;*<5{Qv*} delta 1092 zcmZ4UmFeA4#tjb`8LcJ@ve-`cV#=Bv$Hz6fh)0Flgu!C+Ll*JLZCpkZC$LPu$Cfr( zj+0~Z9A-V-N=zpEv1H(uPMh4o!ZEpom4FFWlM~qRD4B!X0+Y%A*a`T+0-tU#CcDW2 z+<5E;g#p)OF)nOM%p}7Z5*c!Uu$aM$ftP`cAqB`UV#sE&ntV~ze=?uB)+8mb$(LMH zCI<)wOkS`?YVrkBw#ji80h0yRPMT~W=mk{5$L_|E2{L5zLO1Ej_oSjGKM>@boEMum zNx+8$Eo_s|xn_`P4I883qHnw1(QP>aHw9;)PkxS?xOB0 sWC1XWX8!8I$1WqT5w1b0GyeLIsgCw diff --git a/P3D/Content/Textures/Gym.png b/P3D/Content/Textures/Gym.png index ceb22ffe4747718adfde196305a794cc30cf5fee..030112f4d92a459dc1d54d84e3c57f8e29d3a7fa 100644 GIT binary patch literal 7395 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 Date: Sat, 29 Jan 2022 00:10:47 +0100 Subject: [PATCH 55/57] Bugfixes Fixed: - Regular toxic animation (initial move) only has 1 bubble instead of 3 - Issue with Zoom in screen when status effect occurs (from opposing pokemon) instead focuses on player pokemon --- P3D/Battle/BattleSystemV2/Battle.vb | 60 ++++++++++++++++++++--------- 1 file changed, 41 insertions(+), 19 deletions(-) diff --git a/P3D/Battle/BattleSystemV2/Battle.vb b/P3D/Battle/BattleSystemV2/Battle.vb index 4320f3bbd..3404d56cb 100644 --- a/P3D/Battle/BattleSystemV2/Battle.vb +++ b/P3D/Battle/BattleSystemV2/Battle.vb @@ -1237,7 +1237,7 @@ CureStatusProblem(own, own, BattleScreen, p.GetDisplayName() & " thawed out.", "own defrost") Else 'Frozen animation - ChangeCameraAngle(1, Not own, BattleScreen) + ChangeCameraAngle(1, own, BattleScreen) If Core.Player.ShowBattleAnimations <> 0 Then Dim FrozenAnimation As AnimationQueryObject = New AnimationQueryObject(Nothing, Not own) @@ -1303,7 +1303,7 @@ End If Else If sleepTurns > 0 Then - ChangeCameraAngle(1, Not own, BattleScreen) + ChangeCameraAngle(1, own, BattleScreen) 'Sleep Animation If Core.Player.ShowBattleAnimations <> 0 Then Dim SleepAnimation As New AnimationQueryObject(pNPC, Not own) @@ -1440,7 +1440,7 @@ BattleScreen.BattleQuery.Add(New TextQueryObject(p.GetDisplayName() & " is no longer confused!")) p.RemoveVolatileStatus(Pokemon.VolatileStatus.Confusion) Else - Me.ChangeCameraAngle(1, Not own, BattleScreen) + Me.ChangeCameraAngle(1, own, BattleScreen) 'Confused Animation If Core.Player.ShowBattleAnimations <> 0 Then Dim ConfusedAnimation As New AnimationQueryObject(pNPC, Not own) @@ -1549,7 +1549,7 @@ If p.Status = Pokemon.StatusProblems.Paralyzed Then If Core.Random.Next(0, 4) = 0 Then - Me.ChangeCameraAngle(1, Not own, BattleScreen) + Me.ChangeCameraAngle(1, own, BattleScreen) If Core.Player.ShowBattleAnimations <> 0 Then Dim ParalyzedAnimation As AnimationQueryObject = New AnimationQueryObject(pNPC, Not own) @@ -3308,7 +3308,7 @@ Return False Else 'Works! - ChangeCameraAngle(1, Not own, BattleScreen) + ChangeCameraAngle(1, own, BattleScreen) 'Sleep Animation If Core.Player.ShowBattleAnimations <> 0 Then Dim SleepAnimation As New AnimationQueryObject(pNPC, Not own) @@ -3440,20 +3440,7 @@ Else 'Works! ChangeCameraAngle(1, own, BattleScreen) - 'Poison animation - If Core.Player.ShowBattleAnimations <> 0 Then - Dim PoisonAnimation As AnimationQueryObject = New AnimationQueryObject(pNPC, own) - PoisonAnimation.AnimationPlaySound("Battle\Effects\Poisoned", 0, 0) - Dim BubbleEntity1 As Entity = PoisonAnimation.SpawnEntity(New Vector3(0, -0.25, 0), TextureManager.GetTexture("Textures\Battle\StatusEffect\Poisoned", New Rectangle(0, 0, 32, 32), ""), New Vector3(0.5F), 1, 0, 1) - - PoisonAnimation.AnimationChangeTexture(BubbleEntity1, False, TextureManager.GetTexture("Textures\Battle\StatusEffect\Poisoned", New Rectangle(0, 32, 32, 32), ""), 1, 1) - PoisonAnimation.AnimationChangeTexture(BubbleEntity1, True, TextureManager.GetTexture("Textures\Battle\StatusEffect\Poisoned", New Rectangle(0, 64, 32, 32), ""), 2, 1) - - BattleScreen.BattleQuery.Add(PoisonAnimation) - Else - BattleScreen.BattleQuery.Add(New PlaySoundQueryObject("Battle\Effects\Poisoned", False)) - End If If bad = True Then p.Status = Pokemon.StatusProblems.BadPoison Select Case message @@ -3465,7 +3452,42 @@ BattleScreen.BattleQuery.Add(New TextQueryObject(message)) BattleScreen.BattleQuery.Add(New TextQueryObject(p.GetDisplayName() & " is badly poisoned!")) End Select + If Core.Player.ShowBattleAnimations <> 0 Then + Dim PoisonAnimation As AnimationQueryObject = New AnimationQueryObject(pNPC, own) + PoisonAnimation.AnimationPlaySound("Battle\Effects\Poisoned", 0, 0) + Dim BubbleEntity1 As Entity = PoisonAnimation.SpawnEntity(New Vector3(-0.25, -0.25, -0.25), TextureManager.GetTexture("Textures\Battle\StatusEffect\Poisoned", New Rectangle(0, 0, 32, 32), ""), New Vector3(0.5F), 1, 0, 1) + + PoisonAnimation.AnimationChangeTexture(BubbleEntity1, False, TextureManager.GetTexture("Textures\Battle\StatusEffect\Poisoned", New Rectangle(0, 32, 32, 32), ""), 1, 1) + Dim BubbleEntity2 As Entity = PoisonAnimation.SpawnEntity(New Vector3(0, -0.25, 0), TextureManager.GetTexture("Textures\Battle\StatusEffect\Poisoned", New Rectangle(0, 0, 32, 32), ""), New Vector3(0.5F), 1, 1, 1) + + PoisonAnimation.AnimationChangeTexture(BubbleEntity1, True, TextureManager.GetTexture("Textures\Battle\StatusEffect\Poisoned", New Rectangle(0, 64, 32, 32), ""), 2, 1) + PoisonAnimation.AnimationChangeTexture(BubbleEntity2, False, TextureManager.GetTexture("Textures\Battle\StatusEffect\Poisoned", New Rectangle(0, 32, 32, 32), ""), 2, 1) + Dim BubbleEntity3 As Entity = PoisonAnimation.SpawnEntity(New Vector3(0, -0.25, 0.25), TextureManager.GetTexture("Textures\Battle\StatusEffect\Poisoned", New Rectangle(0, 0, 32, 32), ""), New Vector3(0.5F), 1, 2, 1) + + PoisonAnimation.AnimationChangeTexture(BubbleEntity2, True, TextureManager.GetTexture("Textures\Battle\StatusEffect\Poisoned", New Rectangle(0, 64, 32, 32), ""), 3, 1) + PoisonAnimation.AnimationChangeTexture(BubbleEntity3, False, TextureManager.GetTexture("Textures\Battle\StatusEffect\Poisoned", New Rectangle(0, 32, 32, 32), ""), 3, 1) + + PoisonAnimation.AnimationChangeTexture(BubbleEntity3, True, TextureManager.GetTexture("Textures\Battle\StatusEffect\Poisoned", New Rectangle(0, 64, 32, 32), ""), 4, 1) + + BattleScreen.BattleQuery.Add(PoisonAnimation) + Else + BattleScreen.BattleQuery.Add(New PlaySoundQueryObject("Battle\Effects\Poisoned", False)) + End If Else + 'Poison animation + If Core.Player.ShowBattleAnimations <> 0 Then + Dim PoisonAnimation As AnimationQueryObject = New AnimationQueryObject(pNPC, own) + + PoisonAnimation.AnimationPlaySound("Battle\Effects\Poisoned", 0, 0) + Dim BubbleEntity1 As Entity = PoisonAnimation.SpawnEntity(New Vector3(0, -0.25, 0), TextureManager.GetTexture("Textures\Battle\StatusEffect\Poisoned", New Rectangle(0, 0, 32, 32), ""), New Vector3(0.5F), 1, 0, 1) + + PoisonAnimation.AnimationChangeTexture(BubbleEntity1, False, TextureManager.GetTexture("Textures\Battle\StatusEffect\Poisoned", New Rectangle(0, 32, 32, 32), ""), 1, 1) + PoisonAnimation.AnimationChangeTexture(BubbleEntity1, True, TextureManager.GetTexture("Textures\Battle\StatusEffect\Poisoned", New Rectangle(0, 64, 32, 32), ""), 2, 1) + + BattleScreen.BattleQuery.Add(PoisonAnimation) + Else + BattleScreen.BattleQuery.Add(New PlaySoundQueryObject("Battle\Effects\Poisoned", False)) + End If p.Status = Pokemon.StatusProblems.Poison Select Case message Case "" 'Print default message only @@ -3554,7 +3576,7 @@ Return False Else 'Works! - Me.ChangeCameraAngle(1, Not own, BattleScreen) + Me.ChangeCameraAngle(1, own, BattleScreen) 'Confused Animation If Core.Player.ShowBattleAnimations <> 0 Then Dim ConfusedAnimation As New AnimationQueryObject(pNPC, Not own) From 5c9a5e664433653c68851c38274e2abdd19429d8 Mon Sep 17 00:00:00 2001 From: JappaWakka Date: Mon, 31 Jan 2022 20:09:25 +0100 Subject: [PATCH 56/57] Fix for the ceiling glitching --- P3D/Content/Data/maps/barktown0.dat | Bin 36818 -> 36938 bytes P3D/Content/Data/maps/elmlab.dat | Bin 28468 -> 28538 bytes P3D/Content/Data/maps/gyms/violet_gym.dat | Bin 47788 -> 47826 bytes P3D/Content/Data/maps/yourroom.dat | Bin 35502 -> 35622 bytes 4 files changed, 0 insertions(+), 0 deletions(-) diff --git a/P3D/Content/Data/maps/barktown0.dat b/P3D/Content/Data/maps/barktown0.dat index a671b67057d22c64a1d670c2f103ced242e301d5..7aa0768a74b179a4660292e90020344434168a1f 100644 GIT binary patch delta 92 zcmcaKpXt;BrVSI=CnrcdZN9@^$2j>)mek}0(rnzu40;TP3?@KqI{Bk!^2*4wP06dC~P@-0wc@h0DYFtx43^a0|1{49Yg>C delta 96 zcmX@Lfa%hFrVSI=r5zb^fH0ULlOcs6m7$oypCO4M3&=`lDA~M_eLdsk1AJ+dH;8HA ZQ#g4cyYA*Bt`^404uVRX{doQ~0{|S68y)}v diff --git a/P3D/Content/Data/maps/elmlab.dat b/P3D/Content/Data/maps/elmlab.dat index 11dcd43b7b15d0ac66f1c5fd52bd9e1590343a0e..c1066e7c5de9906bae1d52557cf4ec0f1206a6bb 100644 GIT binary patch delta 44 zcmdmTkMY+%#tko6Ckt?}Opb97V2xmiWQdv^s3Og6%%I0$$Y27*rkfwK24?~QPh1SQ delta 17 Zcmex$k8#UA#tko6C-L!Zwqdi&1OQJx2UGw6 diff --git a/P3D/Content/Data/maps/gyms/violet_gym.dat b/P3D/Content/Data/maps/gyms/violet_gym.dat index 7a2ebb2b421721c39539f9cf38981ee81c0a30f1..bc0080835a24fffe6d5445b1d68e26c278d95654 100644 GIT binary patch delta 60 zcmZ4UmFdz~rVVx$lNI6uCa<$7VU1vjWQdxqC?YIuz@Wnb!p01G42BFQKx{gBp_ck& Mg>JFUE|wXM06NkTwEzGB delta 29 lcmccgm1)garVVx$lN**uO}=2tHu;w6qe;vxo3ku48Ufcb4PF2M diff --git a/P3D/Content/Data/maps/yourroom.dat b/P3D/Content/Data/maps/yourroom.dat index 194a53f7134733a2618b188c0d0b8341a708fbd8..1b992b86141e11792666c62bf0ead181a64b5a46 100644 GIT binary patch delta 103 zcmZ2Cm1)^DrVR$HlMfg(3@Eb7bFc>rFF&HwK0I})h dK;hcSG3+{%B<&_&V1GqO^+i$J&1IYxjR4bE9~uAv delta 115 zcmZ2BjcMIfrVR$H(vA!{Kp4!B$&kX3%23SU&yd8B1!N^Nlx%in6=j?pAfYx{PL*%6 g0%zLf2Yh|_G)yk6)St}4@d8E91s%1`pEyk#0ivKECIA2c From dde6cb5c34fe2dc7e8baffe5066dbe899a262f94 Mon Sep 17 00:00:00 2001 From: "Jasper \"JappaWakka\" Speelman" <31563291+JappaWakka@users.noreply.github.com> Date: Sat, 5 Feb 2022 10:28:48 +0100 Subject: [PATCH 57/57] Removed unneccessary item use sounds --- P3D/Battle/BattleSystemV2/Battle.vb | 65 ++++++++++++----------------- 1 file changed, 26 insertions(+), 39 deletions(-) diff --git a/P3D/Battle/BattleSystemV2/Battle.vb b/P3D/Battle/BattleSystemV2/Battle.vb index 3404d56cb..07b311e05 100644 --- a/P3D/Battle/BattleSystemV2/Battle.vb +++ b/P3D/Battle/BattleSystemV2/Battle.vb @@ -978,48 +978,35 @@ 'Potion,Super Point,Hyper Potion,Full Heal,Full Restore,Burn Heal,Antidote,Paralyze heal,Awakening,Ice Heal,Revive,Max Revive,Max Potion Select Case ItemID - Case 18 'Potion - BattleScreen.BattleQuery.Add(New PlaySoundQueryObject("Use_Item", False)) - Me.GainHP(20, False, False, BattleScreen, BattleScreen.Trainer.Name & " used a Potion on " & p.GetDisplayName() & "!", "item:potion") - Case 17 'Super Potion - BattleScreen.BattleQuery.Add(New PlaySoundQueryObject("Use_Item", False)) - Me.GainHP(50, False, False, BattleScreen, BattleScreen.Trainer.Name & " used a Super Potion on " & p.GetDisplayName() & "!", "item:superpotion") - Case 16 'Hyper Potion - BattleScreen.BattleQuery.Add(New PlaySoundQueryObject("Use_Item", False)) - Me.GainHP(100, False, False, BattleScreen, BattleScreen.Trainer.Name & " used a Hyper Potion on " & p.GetDisplayName() & "!", "item:hyperpotion") - Case 15 'Max Potion - BattleScreen.BattleQuery.Add(New PlaySoundQueryObject("Use_Item", False)) - Me.GainHP(p.MaxHP, False, False, BattleScreen, BattleScreen.Trainer.Name & " used a Max Potion on " & p.GetDisplayName() & "!", "item:maxpotion") - Case 14 'Full Restore - BattleScreen.BattleQuery.Add(New PlaySoundQueryObject("Use_Item", False)) - Me.GainHP(p.MaxHP, False, False, BattleScreen, BattleScreen.Trainer.Name & " used a Full Restore on " & p.GetDisplayName() & "!", "item:fullrestore") + Case 18 'Potion + Me.GainHP(20, False, False, BattleScreen, BattleScreen.Trainer.Name & " used a Potion on " & p.GetDisplayName() & "!", "item:potion") + Case 17 'Super Potion + Me.GainHP(50, False, False, BattleScreen, BattleScreen.Trainer.Name & " used a Super Potion on " & p.GetDisplayName() & "!", "item:superpotion") + Case 16 'Hyper Potion + Me.GainHP(100, False, False, BattleScreen, BattleScreen.Trainer.Name & " used a Hyper Potion on " & p.GetDisplayName() & "!", "item:hyperpotion") + Case 15 'Max Potion + Me.GainHP(p.MaxHP, False, False, BattleScreen, BattleScreen.Trainer.Name & " used a Max Potion on " & p.GetDisplayName() & "!", "item:maxpotion") + Case 14 'Full Restore + Me.GainHP(p.MaxHP, False, False, BattleScreen, BattleScreen.Trainer.Name & " used a Full Restore on " & p.GetDisplayName() & "!", "item:fullrestore") Me.CureStatusProblem(False, False, BattleScreen, "", "item:fullrestore") - Case 38 'Full Heal - BattleScreen.BattleQuery.Add(New PlaySoundQueryObject("Use_Item", False)) - Me.CureStatusProblem(False, False, BattleScreen, BattleScreen.Trainer.Name & " used a Full Heal on " & p.GetDisplayName() & "!", "item:fullheal") - Case 9 'Antidote - BattleScreen.BattleQuery.Add(New PlaySoundQueryObject("Use_Item", False)) - Me.CureStatusProblem(False, False, BattleScreen, BattleScreen.Trainer.Name & " used an Antidote on " & p.GetDisplayName() & "!", "item:antidote") - Case 10 'Burn Heal - BattleScreen.BattleQuery.Add(New PlaySoundQueryObject("Use_Item", False)) - Me.CureStatusProblem(False, False, BattleScreen, BattleScreen.Trainer.Name & " used a Burn Heal on " & p.GetDisplayName() & "!", "item:burnheal") - Case 11 'Ice Heal - BattleScreen.BattleQuery.Add(New PlaySoundQueryObject("Use_Item", False)) - Me.CureStatusProblem(False, False, BattleScreen, BattleScreen.Trainer.Name & " used an Ice Heal on " & p.GetDisplayName() & "!", "item:iceheal") - Case 12 'Awakening - BattleScreen.BattleQuery.Add(New PlaySoundQueryObject("Use_Item", False)) - Me.CureStatusProblem(False, False, BattleScreen, BattleScreen.Trainer.Name & " used an Awakening on " & p.GetDisplayName() & "!", "item:awakening") - Case 13 'Paralyze Heal - BattleScreen.BattleQuery.Add(New PlaySoundQueryObject("Use_Item", False)) - Me.CureStatusProblem(False, False, BattleScreen, BattleScreen.Trainer.Name & " used a Paralyze Heal on " & p.GetDisplayName() & "!", "item:paralyzeheal") - Case 39 'Revive - BattleScreen.BattleQuery.Add(New PlaySoundQueryObject("Use_Item", False)) - BattleScreen.BattleQuery.Add(New TextQueryObject(BattleScreen.Trainer.Name & " used a Revive on " & p.GetDisplayName() & "!")) + Case 38 'Full Heal + Me.CureStatusProblem(False, False, BattleScreen, BattleScreen.Trainer.Name & " used a Full Heal on " & p.GetDisplayName() & "!", "item:fullheal") + Case 9 'Antidote + Me.CureStatusProblem(False, False, BattleScreen, BattleScreen.Trainer.Name & " used an Antidote on " & p.GetDisplayName() & "!", "item:antidote") + Case 10 'Burn Heal + Me.CureStatusProblem(False, False, BattleScreen, BattleScreen.Trainer.Name & " used a Burn Heal on " & p.GetDisplayName() & "!", "item:burnheal") + Case 11 'Ice Heal + Me.CureStatusProblem(False, False, BattleScreen, BattleScreen.Trainer.Name & " used an Ice Heal on " & p.GetDisplayName() & "!", "item:iceheal") + Case 12 'Awakening + Me.CureStatusProblem(False, False, BattleScreen, BattleScreen.Trainer.Name & " used an Awakening on " & p.GetDisplayName() & "!", "item:awakening") + Case 13 'Paralyze Heal + Me.CureStatusProblem(False, False, BattleScreen, BattleScreen.Trainer.Name & " used a Paralyze Heal on " & p.GetDisplayName() & "!", "item:paralyzeheal") + Case 39 'Revive + BattleScreen.BattleQuery.Add(New TextQueryObject(BattleScreen.Trainer.Name & " used a Revive on " & p.GetDisplayName() & "!")) p.Status = Pokemon.StatusProblems.None p.HP = CInt(Math.Ceiling(p.MaxHP / 2)) - Case 40 'Max Revive - BattleScreen.BattleQuery.Add(New PlaySoundQueryObject("Use_Item", False)) - BattleScreen.BattleQuery.Add(New TextQueryObject(BattleScreen.Trainer.Name & " used a Revive on " & p.GetDisplayName() & "!")) + Case 40 'Max Revive + BattleScreen.BattleQuery.Add(New TextQueryObject(BattleScreen.Trainer.Name & " used a Revive on " & p.GetDisplayName() & "!")) p.Status = Pokemon.StatusProblems.None p.HP = p.MaxHP End Select

    Hv&q>)b~U)0V}ANBId7wrG>cSKaI3+ix`keKbFaok!Flul z!M5S0S+?P`!CCLr@@p|kRrEFCYgf~+gRUZ{o#-mDSKdZe4Om*$SvAmYM!ylins7EU zub!H8YSNQi^%$obj$55|d`lg_Hs}U;>q(dET6UUG^KWFg0p14iS}^6J8Rff{wV5i< zdf+wuy71SMSJ&T!W;ML}_-n3>=CTftIx$W?(@0r|z7p!ei1wTa(|N$UBH;Vq}X2Jcni%WbN_dp+l+oY#Oh z@SET*eq(&=`>Q}3k+U4XRj|~TS3_7UL6)<`T}Ew6)m$sdX+*Bp3cMRrHItOuH^yTb zUQPUFoEq?M?k{l`InDeQ{$gr#suDEiGS*Ta?Hc<{nPUmM=KfM=G1v;;i+L{xYl>?V z`pd{}f_5oV|vY(5?VrK#R zRAE%j4JHI3Q znU*)(`G>lIXF7Nn+*;A?>d$bdIh{GT#l53tbn-j17keJlwDmiXDX&h#R2|TC#6$b(Jo+`-lh?`bW_j)L=nB6B=NZmaTxQ|* z56oaqXWtd3Ji4&trrOEQotam@)8VKWaKxVqK9d=PZ=K3+hH*O6>q4T^JNn)Io@gc+ zcd|1%rkTtfGsvCnOtD$Iz*WW+@aZ^B;pt&B^zeJ3|C^*ZBNV zD)BhOQ--opBRwtmIWZg;R^g!K*tciw9 zz^6CJL^!?uC+YNHk|)WY;PeFloBl-SFLY1g)zklz(^Ih2Q${bIzv2GHqq95$eqX;I zryiUq(;LSlTs*PIv-+5)e4fJhFQ*^evEYBR@5TOU9Qv@7thfBe(S4da78iBpJHZ)? z|9Iz5)?e)UqWlZ2AN3FC59b;GS?U;behO`0{~7DcaU7bb@qP;KIJk1?3qz9%9f!}; z@B^P`Q1s&@ML%Z#lZ<}M@`v-R|C~SC8SV6^%IiT><|GP8F)C1^` zV*fnYv#AdI%Q)&JWaA zP`$wOGWbt6&oA_Ug!_`AgZ%H={|a{?++XQ@$MYKd7s!6if7R5|{=oAxnpeQ2Rq`vg zdllYG_{jGMFrlyTJNy9u75@h(=;-|e?mtk!H|%@*uj4akZ`xGK7y(Bv-|`H$FBr^h-#D-OZ}@{@jWC9$`V#bK zID^37@xS5xJ(*uQU*i(wy+h|^9_haZ`;PZF=m(Sg221Y||6zlfVzB=e{kQ0R%>-{+ z<{RL_PT1RUhTC*sIj{R~k^2>%dVd99=dbzhH`u++6L8<*{08T5oZ)cZ0e^!WP5h;! z({Qw6e@z_>?>+KfhxaY~FTmbm|27)se&q}Ul~$_Z%sRvzhnw4QeBJ?(+qCy2Hr$fbV#h=VNw5=zT{1`{wx}{V!m>i`Qq)M~-wKk?}Fpd}w(eIN}VWGt_)P zMf(Bl4=npb|08xbiG9UKoOSvX)lmOavfd|u7+m>$?0gbqseXv(M^t;XcZS0G6wXjQ zhoP3!FkkpbXi>`6=EX z&>QN!N9Gso-*rCqKl9(`EEP-`pGz65Oa@!J_xUdA-iP@dVb{}j(Jcn>k{JD@|+ev0Q%oZfLhLnYoY9%Z}(`X1jU{BuybYED&gR6mcc zcg=$ zwf_>Yci_Lt`kM1wbcBf^$FE_$X^w9@uY-*6zxGwXr4Fa}ElU%>ZT_G6Z;&?v{TJYJ zecgG(`G)!A{WVLT->@G{eajh)zfRvU!(iuCo9i|5M=-}==KY4K#{y`ngOe6g7z+MIW-Z+EljezqS^?P=j{SDk+hx;uagE_r!^S!~WuR5>5eBJp0 z?$?(0Ix~Fd|Hys>Z+U-Debspx|DdY-I_D8g^&?#|U&r@5c0yjk^Ly~uaR1Jb@61E* zpLs_3Ke0ymFO&PSGsyWFRA2G4x&7$B1Ui^!Ao^eFeCz+}k2LRJVSLN;3mGpm^GJNY zhySYc6Z)Uv$@d52Yuca5c**$@^d-yrg`ILnS<)}~d=K&(J*h|GH<10yc)!5=B_?>0 z_lvAwENdjrKl=lW^8%a~nSB)4_vqyEoaqMfR`zKBH^0C0yz?8JfzALtej`!SkKy^j zSH?j4qv$`+ZZv4%FcAH(%skNiUxXv=3)JWF{*9jaN)DdiIIHu5Gt%6ZqfDVn?vG}4 zj5`{I80VzOtQ z3HFVD`Ol*5i}zpnJ%#>H>XYWv51yt|#-F5&L*EbGIKMa8gcwhm()OiF8+iOh?E^j$ zuikJc`hBS5{Ry1q-WTq8zT-)!7tbW{u`%sEU#N+Y^V$VDgbpJvl35nm>ci-#n_5@a{pz zRR15`CiCv$baFbwozAHXKHYGXej0hx;dKI;iAyJNA^+GMQ~jANIjAaoHva9Mj=1-5 zIymjo%t9lTp6f1r;eacu;$<+-&y`VxNYG53o^rhg1$OQoTU9+x^2{1u-15~*M?my@P+28q&7}Vv-^0a{2m`7`wF;@7?$!pAX&FC}&Ux{WB&noy0K%0ZgW4XTqbP4>Gcs6pRlz(G- zO^nkNY#HeCSbrtGhO8#eD)6P~nsQo36-SfEP5yOxR>$zh;PP4FuK`)c3_==!DYqfJ zM)<8@1&TG)dWJUO-H`cLf~-bY-w`gYs<4&jx)y$2XAS-VzLMP4n3XfGGiU523^&fpbe!4opf$lZg4HrcUCuR}P5x%ThEttRU6eJA zv&mGO{EcYW`8}O)!u9o@N;Jn%T@|0>L{f%&I;#C8VG}T$P>95B}zmxoGf+$ZK zy=(E_=x;%*xoSJrSX=O^MrSkFW`7%}^~_j{SvPW4S2;D%ZKAuyuZ*TPKI_@na;iF2 z@ZAcx8l0_gHp1E-t2OCv^tW=};#Waa&8ZAWr_G>S{i>F~+1Kow!D_^ER4Y3b=+=V2 z0c|a38_x2mY98CrR&grv1fDzSRdTlDT@kE0`wG-u{to*F`73j$zngw}JgV9p>X&ya z;-T|qJZhjUi_adonsgW6TY>ZcY9;t`-+@;pyecq{unO#V`+ITR>MOf4=k2&uVz(2g zop|n!Rpsu4yT^X3ef~c1GVr7hd@C?TIb1994ZBGfd#_*CDdX&+?nYUTzIN)DXRq&2 zUvuoDzn9J){{XyFX!aRj{k{Hva7`-CKHHZ=C8zzYGEQk{U#ynJs|agWmnWG3agxR5T677F*HS;Vjv}*;;>7yFX0@)?*JN2 zTLPpwcnRJ|(97?*f7CC8t_--cg=?lG;Kjg$TEsaFvxHNKdJ?=K_;Hwr!HO~C5z>#? zbaF4kI*Pt1ImOT%MRS-bj#CSBF3u9?7^=cfVduC_al~9sfE6JIRud{7%@u5S)VaPQfY294F`(a!yhU zQBPPcOea6sX?poVi@-Yuzc4y|Pkxq8d7XS#^HB>qr|}g3xPJz2UMCNXpcZk?q0h_d zH1)K9&d*Q30P8edWuNiS`vsibWS(P=JnRahImJ3_3{8>G$qE0W@q}wBMfHrG#6Qmr zx%rOs_{cBtJxx7p$>;psWM4#)gIOS>9agSTcs>tBd1&5)1pJL_Kp$qp|s{c~u=KZnC5R!%27{#RIM z{cJF<;G2#96?oa;=f+vuOYkqlS1-4d70p%rrM+nC>|mF{lywoNRt~UB{&li5;dkB7 z%2|_UMVG_LM(-;5S@?af8TSgB3+!+5&S=?LoeQ{MgO?Sa=DAAm3XH6HUc>WJEGILb zI$feC{RQ5+oQ&vozU*frH5<=0)Z%7CpP6?S-q$VRn$4FP{5pzEP6p?Oe~XUzS&eg@ zylbo*ELH6^$8~B(s`lx5XGePl?Jefk*JJ@#y^a1VT%9v8n;7!EMehbr2GGnb`HPW( z>Ev<4ziZkXyfc!J0sU=L+(so|oo@JdShuL@%|9OP9qXhgOK$P3jI4Al`KRScI^AQA zG@x1FT*W2PPr&KAe~&7EY16Z`S5A7)^3O<3!=nksNXt?$4H*f{tr~BMX`MTG-A8i^ z*ZVy3kw)48x$CF4snR(&>G`l+oIGlrlgg@?>A_OP{O{9C?W86v(N7C{m+Fz53ZFDA ztG;?3r#O-v^Go3*`VX1gq54#pPS|;X#$gY{E&@M} zzQ;GaP70eL1TW5b5kE?fLtapQ|A8NJQaX>QiD2?h&LiiP)Q4cI5Ac5AKQit^W=KId z3?~JT!}Gv=q)Ew1H3isX6w)P&2K6ys%8KHUJo=DXANeV$%1B{e>IqBkJPIX?CXWWb zDV=0Y^%%e8)MU}ecs}NvABUpi!qPmNFGZAY=y51HXB5OCS&oRlygpm8)A zycFVv9-8(s{fA%=V?4{I{|J5*j3J`@A2kfhjGD>(9#FLl@&7Uqa312K^8*_C^EVOx z9}8T%5zFvFAM*J09CTs4#88IAKM^XgII0|6>m|ZY1uw)S4gWl5lz-YY6c-K9h`D+A z#YKH^og>!gpNtJj9n7CPnmT%)^8>mGmg(V}3haI;bu^86>nw*vV?1E)5NA!Bz;~u* zp2W}{p0w~>@={Y%neTlPJ)9EoOoQegJ56(!b2?+E1-}bJUg2n3I67&TJE1huc)D_o z2ft&Q`}7lVQ2!phbWE5!njT*2XoC4`ZXsz=rj2Hx6Gv8hF!`mWrlsD+N2fGA2_)VQ z-Qo-G^S*=kUA`qfoZE2HvErk*!PA4KLlH1;(#!bY`CjN|=myHn^lvgpdNg`&;vv5@ zFf%cY&Kba!qnZxv9;r7tXEgk_6uIX z8!$4l&%nCHURA2hVAn{@LQRkMcIXebQNA!>NOI?&5Y)nrOG=Ky&G_n zsybP~uQ9{*&?T66c+R7|2PYleJE1G!*`nFdX5xI4^W{)h&ROx!!dpvK`9iPauX;IF z14cGxx*WPl%5~mZqB)~E&?_-J+^o^;rp>`S3!NOi)w>G!5^v$+1j?Uy+A7#k@pDF81d*UBmS>Rqkg{UI{5z ziVK`_TAudeUJB*mtVC&ZMDs>3hR(vtO}%K`yzJ$Y58hcY@pHpF2k!#spq>xqVwUsf zd4YW{7~-4(5htj5nEij}^Pp!#`O)QsTY#E7nxFouP;kl>&Byt)eZ#rXNoqlOxxmhI zI*spHYF^G~*_}prj-}ZOqC9EyoemwRQ^?%&@Gb;951vXn0YeU_a6ZlV6=3DFypx~> zammkF8sX~Z2a~rH`8l7#BOm=!HqS}+1*1hc=Y><0bu@G|R21YGQ=GEI6U-uyLbeLx zaf0l^@Q>qpGIRvy894c)h0!ay5c(o0j?yh=NMX)}S@I|XOK!zE=fmp^iHDf#l;vm! zF*QRW-qIf>;TSB{Vlk&;rVkj!Vw&QHX?AgsGFk9G#_q5=9Om0f;8_GuVd@_OD~Ymb z^e~7t@+%Hcj6<_Uo0jhJrDFRv=q=<1#L`$LHk5_4yzM>?E6mlww?jXv;ybp#- zf+S%=h3PF!jD0*uVzms|zR&?X7sFBK{jd*&_VPYrGnE0|OZE}aqHvC(-Gz%h_EI&` z0ebsb2f+4&mPWJRdS&R!K{zh?~bKb#I+2++8d%?>@x6`kR?-q1bqZQdz;9U{jPWu19x&yp2 zt31rg(MoW3;9QCQj?gx073y}XRu!IdocF-kY8)xI!3+E=N0nL8G}}T|s9VtP;;9I) zDo?Pqs}!xq+8o*vst&IrU3pdpt4dGos^D7N&{qLbP8HB?XtsiF4Q=KLPEzSnN6Kx~ zO*}Qx%X2Gx@i)WY8rle_CTL~w?d+>iw@_=as({yuYNqONYT&gIMJ?(Ev^CLGkJe%C zb)jn1S~316Jhzazo&>3Dpxp>olPVV>wOBQ9m!HyWbJiT&LK{M>(W$7T+vw@{^JxdU4HEOYHp=}U5uVp^z`#T7#?S`FNAKrddkAx#cwBw_g^jPp>IVc{c)IfqE%R8B0TpL(QTsqKiX|IIjpbfvaBgXfx6q zMO7QKmf_vZCJ6T8EyG*R&Dk$T(~SL6u%?`sP@8jJgnvsIjo2%-v2o-tR&zX*yd>0u z967aQmIa{&r0H84b8dy#LXagOi$n8aYv$%~Td;!KlAHygOJV*?UTg5C=z{NPfrn;j z!CQW<$odz*R$vQJw1D3ltVOhq@fMLWAHTMo=CN05OY6y5Uh-&Vd(A3+JJ2T4w$ToF zHj6&NQd(Pb=7ri&=f|q_t?_DO>eh7Bn+vBMbq@6j>&QWA?P0cn(}DdgzHK2st-#u` zTElpPj;4OXnDUy9n^-e>7IK=+ggVXP^e=T*sDo(&k2&<`fzPJXKH3qVHqkjaXsIXv zxoG6tfy`N;?Wwb=bN&x5UI*0ec+a*Bv4p9%GtXI}8J5w}unu4|LFR@!@qO*0UC5cv znj7juUw)mVouV^B|5!=~X6pn#!zP^(>TI)iigt%L8K3z)ZDDk^%uej2mP$2v%dv}{ zwqUN0%n#OxZs3VLn=sHEaQ9DNeA-^-O^3b$X;Pi3wo(KQ{^PKytI?5tD#*`c8&RTW3O%xzHt(3205KTdKxa5uI$8@b{ZK|LX$&M z^@yQ8;Huk$emC}0anW~amR>Pb?4GvoZdGUTd&C&3-HqSdTzf@TyYm}Q#!c_PSyMt{ z^@OXtSGq6t0{6*u7wRSIPu!atL>+1POWae^t+AiD@AM11k#YY)9db)?oUbgD^)k6bdO8-u}0&mn^VG`rHvwJwJ0HkEB~!y}3E0TUotqqFz+p zL<(+6DQ7(Qq55*yNjI$ij?MEVcc8}e&3*a4aooFln!cvfT_@eR(mkZfi(p@IqvCB_k?H*<7LNebPsn!#Iloo0Y_qNm$j>UG7X zGbi1n(hMEobmQp+rrShaSiya#8QdxA#N8s@u9|80k96xtGwL>0aM!7`-G|cMqZ!;| znhkRr?{4I^wUiFz=ysCsGR?5NRJv0orZoT13vMgv2G%_KZONX8zAblal&%|8ZMnmw zTS@x5x!ieb&;23Ys?yCR-SnD=mu?<)@VP8%ZbKL()B_C%EU+7T-49wb9)z-9KsvqWep7(5)sV%t5mtc30>L z^PFe*i*)0u4eEc5Js*Zt^X*=d?g}Xh5jS!E z^_$rprbXN}YED;olXOQ(F2P%OmW1oxkEU;KHQ?zsk!~faE@VliTTZ%5r5ioE$)mc| zUrLT{IO#4>Yu*jHx3h`~=F-ufp2qZA;Io8%6U$!6Y`Q_zjJq&R$Zf$Lmqqw3N1-p! z{hmg2bk<#^rnu^E(Nb_By4$pzx&)^3l+Y9pRo!!vlWqt#0c!%*kQ_~?o^o~HNgds3 zlBedJO_LBZXpb#Q8P zKWPIVx>ck*LbdEJP%U#j*&R)(CgNbdb)A6p0jphNu#?(x)oFxEVwCD zmwDu(+dLcXUe5-0+Uw4ZZU}8gTa8_CFQ|sy%c;rzm})jpWp1|A;VzDDDCx$I?(S4G zPH;~sxVxlm-P75^y%ycY+03mL-P6&%BHi23oh03b+QR)8-5ILN`TtRM*6~-A-4^G} z9J;%^yHmQQI}K1uK@jXt6k9<+loAvK>F)0C?(UX4Gl%|7*aSQfww2`v~z3^?s3iye?g(rxbN_#|=sBN}h<=KLfTLr_nT3>DFh^alD z3f#1Vq#dR0?E8qf9ep|C4t9OCtrPIH|0Di3@Cxk5Y-f{YCpvBJXfH?1U=L^)yt3>A z?I7w_j{7#-zR@m@5WTf4v;#EYY7=Rf?H-k5Ph|&tDyo;Hk79gJDcJ3iO9}RK_M;JV zAIczVBJKUiOB+CC@Y0@jB8{hb5!D$f3p_La0Jq#d4s5#KA)?vQqLRME~(5qwJFpq-(E;M&(I zLQNYsiossbVfcltPq43Zgq@ti?9Pa_pY4=GOcm@LX-7v}JE|QtuVQ$~Te~?2@zj=$ zj`n$iO&>YSPa8J{ZRY&Uc=GXaev1Qaf*fVeLg3oc5%+)NQCNX*5u4{2>?3xx#iKnV zb;^h4B>4gIV)V$%Q<&YJBkZ>nw4cB_v5y| zBW|#RbBYZZ?IdY0=%itJY@bHGkMkw^reHtkB>OWb*ay*$OkQTm%U+0FwL=r^@rZwh zOi>#-C)u^hlkf~TA^Ew-can0T4R(5tvq5r}`bpmM(pJtX)8%GQMS3~OS6evR)=}S_ zbkD`cNiL#xceJyUhqP{k zbDn(|?a<_~otO*Y+Pu+@jP`ECjqmMfvqeZy*DlQ^kTYP~dI|P%F4+ByZK-5qza$$@ zS(r|K=Rg%RlV9YnZ54THCngKHc5xKtDnxa~_&qDPOg!R=8Q*=m#Fj}G+mFe{?uMMN z*j|tJb%Gt6jP$$89!^H;+NH_Jeu{2a*hL92?YW4n?HujJXjew{tL%UX(e_MStDPC` zzG&M=+bdFPqD$N~M;h4L`O)Tz_F1IA!d<&8+TD@j3OgUcUXC_#vj!h~$Xb(mED8c@Yyn`K@bkx&;Yad7ZHQGf<4@;Xj+HO%z zyEfYMNy(0goV5valbsRm!f5YA8!FnA5q=w7yD!?LiSM2$rZMhaHb!o3HFF?uy=8vZra;P1)7q5lwkiwyD{38(H=@lwnem?@(+FGrP@7?-l<|UX#3d*&)%si*`jGv%iv%+_#+( zv9+TTeH@B7?3&0~T1D-Yu!W*+mdExEYx5-dgYB5GzJ)yx{1d^Agw<8s zCl1a&J2b&A&42qU3D~pw zd3lSkeU^uClG?0EtfmbWDcH7QPbBcsbiuBP(1h%}$V-@}5nmHMWS=Do$7MIeMcXktiER%>`zWeD;L)~75EBs}TdqBmhg9XJy%fd7sI}K3l{Q5l zu~VR(j-)iwCX3LdFyxgCPi>uO|3vqs?04LUuRWA|Fs0Srh_*ts_n}_$j_;uaJ1W|A zxd$f&yBShx>*Sv8izH#cL)$0Xa!JKWj#fSaH`wzKsvQw+r6gs;LR%%b;V9ScNeYg3 zLjv@^?agRABo&^w>2r@=2_5-sb0z-PMv3-XZsC;%t~A;}(SFJu+h<8h47N#9vx}ka z4(ZdwOTq0fo;PiSL!EE4n{k7khxDeGDmlDNc%@+TA)|HGc87LFZrUEnEuwZy6t(Rl zTy=HO28!6}$mEh9{dM}?VDlj@TMe1OFVQorMQx!-e}#<jZspXf8S{`(#Z5u*<$8kEx zUPLa~+A|3d?O3Rfc-rO2Z*%2k=Hukrw8+U`#aX5~1|!%dIf0YrI>E^cLsMxNL;D=s z9Z{$JVB*IyskN(dgs7bf&8FQ5#e(G85z(%OI_eRxFs_G*C)qy8XPXxJ;A%@k8b$G> z)Rx9!9`(rgKU!6^iE)f`BzBG(SDO~cLGt5!9L53AqByFb_C&OaQV4%(wdEm~LbhvB z$o4ms$9Fh_-HC$WM~xfbz1R;&I}qC6(9VOlB?@!XrpE#HBZ`6-@SF|4GM9B zosM1j2m2A)ZrBfAjGc@F7R&IL@v`LF>nIOj+YZ|IC`BLbgKTH!y*%5@aXT|%}$2)J+|Xtj{T0EOtKxH3gFv_jBP?@~~?P6?<@KnQHw{_gL`w;A5Xvadk z2WxCUL0(npp}m4NFtsJ|zxxo?$h6_Gmf8lm%C*0s{fdn|f#xYxatQV)RNG+wwa{ue zBG`J+p2I5eI`m%w9&9jZM?w1<>)8i*%6!*Q)82&Utcyn54BCy*CW16iu>la@gjmB) zfpG0PXd^)^Z9!-ULs5GV+Dcf(7p&wj^p#21GFlZMd*gw$Dg7yUJa=`V=Px}Q8 z;WY%&Mnn+n5w-WAiG!Vu2K?Q=vF$npn-5FSHe@pGGCa+#q5WMy*vVLk^CD)^wt+e{ zC)Q^_VktWSVhC3^Z3<{}LV06$8WypypiHQ0LDa6peA{f$KE(p=^ZzH#$5Y!0P3Y3h zw9+-_nGLTM$Sm}&@SBZFTMDXbuVLQ5XD)xem+M?ku+yL|g_+djdkg=&LlEp2w6eVi zZBWc-qd=a)enL}rFVyF0D%ucGKA*qwHzUsBZ}!0+f;JAcn=qHZ-fPD}wHC0YX>G9$ z^UmaG6CyZbN~0}y*3uw;ys<+iFW*5|8G;%1&($Cf~b9i$?&@nCz-!?1++0R6`r;TI^x*D zdjEw++XBJq5Yc|a-}bkDb(~DkPR#IEY?DCoFMK=VtIY!ClX?FY){ejw?j6_(c!v5P z+-F5*McRa0hG#@(M_LoxgxhhS#=RZ2X^~dpwqfD3B6A|bXGi9NH4V=swhlKBt3H!T z8}1?k(_b5`H?oAhICR44!;j)UKA0!5Y1v9 zDVI`{f0M9K^=wGC)aG0nc{*GNd?l&{#$HCxg=klR)J3=4{M4@@{gzT$5?M~HXFm1A z!s~P7TA%)!ORQzaT4w47%vdj6n|fpX7UA0{yb4Y&i%TPQ!ga$dm|;2IONp9hDOm$l zb$B$3>UGG}OEW32i)URr%DXo224uCkt%|IszC5C8eKgCBE4380!mA@|=v@=u8aV$& z^%Ac7N*q>mYNA*hSrw^4r7jMdPIdXziDnatcg@dCm%)et8-sxE*s!g1+PP;8fa}at5C0pwU$|)Vy2DstxC0Kcq9J$mW`Zh zVC$?_1urSI4r*%ql1t{C3LtqLslsz$AHxKelvSS6dY3iu{EY@k++N@a80M7|-iCGr$V z1$f(FR5X5NdToJQkyDjZ3BB^l%)gl#Duv53`%doVxL4z@udD)7imj2Y_*B4e8(lZ? zU7Aq%X7I}3TO#Gjx5L}aqwZTHK_*^Bo2NXy?eNQU#Fg7tbQO#tRLBm_7EUG5E##HJ z%fi`#wnDg^-G!Cr9`CcuoOVTa;#Uq`*>IWguE?%PSy*MsccU!@e-GY@6{&BF?1r%& zM7r&8%k%x)$o57`hfAT^4Zb5%28VL+#VgBQo^n->Qrz~!+fHpCPYKX+prwfFRg$b+ zxFp)W%oW6axRyXGpOTzX-1p&8oclgp)VCD(y^;OgG;dks?ThR|SIYXS?{4w~@Qa4! zRx(_ixF5|P&VKM>Ai|82({=3Wp1lABJ~?dO@-xHhIBt0lO6n=O-S=B_8Ed z44(t&PjHuy{0`z!1igF;5RVh{!#f5p>=-T@vQaA zZffbzMY7?0DRLo_nV1)cY~k#9g>!~Ay<+xoR_>QLry^NUU1E-` z#0$i8kt?W9-cokhnD%r!AVQ0qoGMIcW;x2X;+%j=AdwPpm!WoG2$ZVA? z+|}hO=b}xeFUf@N3b?da@X8cUN4$wjwXCMOgyOpOyF$E1?Q$d|{0toBnk5VKr6U(E z#x+xjf8BcBgriKXYxs+EJ#r(G-g4opq_vsThtqJ+$UQwL9Vh5>6aF=x8z@yv1^+Hy zink-TB5A^@!#9cYk#`1^>UE3zE$jIoc85GQymV-8L~e6#k;^H4_!j;*BX_`Va&B2w zHBFUFIrgTop}_l6P9(ifL@F)D~~!c!yb2hwtDiZYntcVYk6j!M}@F z3VQrwF*zLJchTPEDAWBO_2kw+Io$h^hs>1Jx+e?YBTpVq9=;Fjt}&G-1<`a#(BH== zKvEd*AG9gL5AaQfe=_4HBc=qq9Z8HXLhW|s5xOM!K8PfNBdz9m$hjYjNvJ=7_kh0Y zn3Oyz=K;tAc*(+v!~al^aQ_G7F)<3F}MVs95u zpH5+v9t@WlB|6~Ya02sGR4(rjC-{~}ktZAn%mGW_CGeiO35dc%cqZ^%bmBa5ov`Ei zL^(v=5Ux+?9wHORi*cjGC(J1Q6Idb3LY@=$-6((j3xz#U9E=}zJ=YC~J-&&)rlA)T z*onGNT-OUx4fIc>Clk|V^c?1W;zl{~xf9Sg#CKrKn;TO^T%YM-MI0{?_!Ip2TK*s1 zAEV?u-AD9MC8R$t+WQFx4v3G|*B>ru|5#$!iM%BG&l1Ar|Ga3EgWQ9k98A+Za_{p* z+{EAyxg~>>&`ZjZGAY!!O0o&j(eLU?j85K&701g)4)&3 zNySNRClwy4L2tP?-LzghYRSpd;d7mD&cH3Xbx9lJr>0LD?t07Pu64MA*Adr1P%P<0}5jGaE09RjwF%jVUg;>Amb;Ryw64X5*a>j~jStUa{3Jlj$>gSMZ8w za*Us>Fg1&MU2-pSuHb#qJxjdqo~M5f+%tN@gX%^196hem{{m6^ODHp2yhxrEZu|&W z@2mKoadUb(y|buu;;H_Z(4QyI#`M|2&cn)KoU>FeGH*6750x{pa@ZVMKyu@Mnm)N< zW}%u3&$F=4xmmbhqIR0>0{ybXI7jUq`k;R<5IL!fbf=jmH@EEGX%u;IKLz)^dkSrC zdglf|iS`1_6Bf^q=k)S&^qc2l<}_v7ZB*Zfc5cET-y-*LO0 za`Q2#JWjYr@hQm33zDB$z&i@2IrE`Cj*m{h*er*s74Zsr2i+q~b<#cP9yS-@g;3{5 zFSn!M1-&BN@_I+;QV3k^UGssF( z5h{If4&bwwvkz>)yN6q8uavjT-Ayb5cNe`&+1bs#v{%+sEQ9|p_@(K;2W?66Qgq&9 zZoBZ==avG~*=xSr$t%Js1m_6uTk$AQwK!eM;wA6W)b>zQw%aWWzQf&NbMA1ryXD|3 z-wS7lyVID`l<~?j({}WVJLyxFo;#Vl48N;7?QqLelSf&i+;@U)CzfZTGF~OHE#y*d zrH{C($-N?;+sva9_!e{(iDkVCOj8ElPCUzdJK=1zKIN@a9&9U)m5HT6?{I|Fpxo_heDtgtZ zZLn@zsckg>O5mHh>Bv{7idPknjjp1wDx6K|;(f)b#@PU;8k~ycHN2<1weC8%x>ud7 zGH8_;XM^<$vMN-n(Ql)>-VN~e=26Ali2r)@>bs7oI{I~Bo7^?-THHbm7BT?3+e zH{iC!YK@5txh-=Wfi*I&utlb8ghr}HUQ=(8JKrXfM^mqfHy>RS>mt_Ec3Xhc5_bVd zofo25SVtiZiISfg|^+?q59WA&orSq3cLpx*6_dzO9qj1zbG!6K4vs z1MzR7ChKIqI>z3e;ZCOVH{a9&&J;8{ozST=#qAu+JA(;VwF_smJIPhIF615PFaBTd zpXi_EK7pI&`~%ix^O@vMwE5M)E2==-8J|DlOyNDz?TS{hi}#G-oncO*($y6I|E>NL z&Hqo+cJ`k0o@b8Vt=|OmlHyss^nRB2Gra#mBm8+z7x>S4-N3te6LEQ-x_Unk`V8l} z*wOtD>fOFCN*6ZO-aK~`O80)?OXAJR0??rDcXm{#j zkEJfPzGE~;jxW$_3_d-~_XYF))%^|M9(-dDZ?yX>_uj-&`1Qi?H#~ZB>+b!AZj3tu zrwP=$Q5y^UH?Yz8>GZ-|x<2SfQqdHnsP!ZlM?O8gUs3d?+b_g1IQ+uX$11&IeS700 z{1VPi{Y=@&HwJ zDD@!IO=l>lKd!;;C$s~}UM3%bzArw*!1{aQ4Z!aweARoH`y*$V`zn1Ehgz=cPp%xk zH|HOzD|-e0&+d2bH|}fRo7BF6CG7z32Xq6yS1tbNeh>BAZr^ggw(oui z?rS_kzOtHneC^8lO{V|6Ie zo8?{a8}~~*-v%FI@m=m;nAaEXyYN+ekN5?=cRV3)^Soo8U&0gP9q&UpZ+f4@`M_>( zfqV$^Cca;}pSqv({*w1#`o4?T5bmGyR_#;wL+=Az-{r09`>}Tr2cuKh5AgfUxF34b zC>LAteU7y6c^{FzP5mqCZ-afz^S zi2t$o8OXb6KIg9Z8N3hOPu$OVKIZT?*H3tVpO3h##m1{vODuJnwV=3=hroA-TApFoUoUxa;Qls5BA=m*L&`pruo+UhU#D{-&yTVdcEVm!FikW7A!q)*c5WpG_Sd@TUGcQRK?Rb z>O0iyEj%=f9KOW$2YL*I`Mvk8C+)YyH;G??%Y6vlf1v*$oa6bA-uE{9JJerw2crEE z)eujeUnBo6#(#tCTki6G-5o?lx7VnDi{BgEU*){+{s?Cvb@liGZ`FVBhJw99J`8Su zG(XYhJMUFkKT#ck+aT26gAb%W2p{zwO5UGboxbB6e)5LfbOX$N0Q3CBJOf}1r0@6k zUH#mC@CVs*@9~b}xF3BJb_K$TQaJqw(rNuhDe+g=Y+px{T$!UIhP*DE^D?7&tx5s|SkS?r7tW zLopJ~c&fkfjP=CrWu9ZqqdS`M_;dpk`!{2awjSfStLJ#0?y(-@$hx`D!yS*?81CK8 z?|JtH9J+IQzF`yMk+u&S)ot zNb?7iN%cFozqogCHKls%ba6ZLo&v7Ax^@J47OWFB@h9?3<>?T^@i&PBxdWhIPcX6P3=q+tYih*NJI5kWGarJRUnz?+8AH zPOAS+Y)70$>!C;JUfH6aofQaJD9HnxwzBeP4Q;n*~*>f%_0l@ z+q$jEXL#*lwT0WBGu8W>KJA!cx;N9C#+mN5##ytsfIl03YoZi0s42>0rty@uM%|81 zt=yU3Y`86nv%EIo)8T0%`OJYoow|BR5s$M#XIPI`uv&x9MB9d5Gpw)BR(J-rSvbt_ zTA^>@HiOmHzP}x}W^QwO%=21uo9)ddwjiJFH8*Vws;%9*Xr-D@j~Q^)SXA4IdJuse=};$h|ObBxH$8?`Sfc7f1%gZRfiU+ zpN884Y%aBC_^UeKxbuk%Y?`_FHiy}mnHDkI)9xbhMtI3V?u$9{XiDD1TvcuEE&zSn z5cOT)Ey2AZ`4YV6lP#jYh}h6=0jDYX0s6nds`cFZ?s9LLc{c`$=RsWR)kVFM zdL1gNtFPRa5f^)_ypQJLcnFu*a`L)pYjWavpb>km7vRBr4P3G0x0Y|I=~l;c12b3S zw_A^Ib$5-o&U(~=r(W`^?$&VE!B;KN)o`BzTW{GqFUV?vRR!A!y4tJGJn{MlbUJ}X zE}Q7KioCYF0d7^iHZq62YtXN%TZx{vn5v5PQDq&z8&S!>It*1df^P6OgRKL5iWxUp zO;l)YU*L^C;WkZS|_T6}Ua+ZpK6SCT5g=6Zs}@i&ur}MtTMO zEyRkPs_qu5m8n(2a|?Ypd)vq>ST1xk$X2k5hE;;I&8y^=cei>wz{-nn&4ys%E7`FoTZQd>z zo4s;$5MB;!r?(sCX8Km9zM1-7bS1g(p?7J%VJFB=uN2(f=*zgJ++85s>ARa)np}N^ z??kg3hf-vkqclF^mW|bRq1pv!C!Df$-^Hyo+_EsG*^OHF9mIV+#XR8k*#=8WS;@paJFNW_S>P6gx-a&Ixufj0ZOKSNYrduJn zibaTr@DKVNKy`p~7>|O?c9gz_aFgaBtOMl5$mM^Ca{yg2d=Gj@EIWi>VUVI|gE^!w zg2y4eir}ffMTv({9OlU7D0fwk5RZc8=YE1)K6u6OI|wFU@sD`NIQqKdoPaCeKy!qN zjxl=ycOUxGJbCddOkMy^@Gi(r`~p-8(DS%=0@owF3%dD?r<(fbg?G~CDB!AF0aQov zKjoeD^0;}-Coh_l)bdf2(@E-i&=+v?;&H;<^Ha+UKQHJh>SE;u%jf2XbDHcpo~O{| z#p?vO)4Y%IJE-poyrs@V?G*Q1XwG_Pz>mW_2bKd&ZaIm0Ir2KqlMBsR^FIaujF+2w z4tnMX&jCBYavNVAP-Vb)7tPB#nMOSoR}uJHUXrk)qQ%lKw;Gvjmx-^_H)N_G)VRG8V;o)M2MIH*VPzKY_ach$RrHl6vWL!Ax% zMVtbSJjK5PFJsL6Dtz_0%2B_|+|?%oJ#>V}<27m-sig05~t>abrcfH%ZZ}7f_cWQcw zaTSjYroV$OrOlX<+8yJh!BHm_PkJ=hQA?$hie71{qyoQf{FLr3@1B?1P2t{wm6D2j zN}CEy{4{QIdfoHVlU>8(p?BX)<|f4Lzlvp_8xgMDi82ZMlN45?!&o7Ok?>! z@Pq0t_?jmXJsx@gm|H5G?!x`YRQD_GcC2KUEa zV%Byw*+WxAjG4&hNJ=H4bqO<#MGFdh-GMDAm_2|+yT=JAgZ zJ@$N_kohHMCe4r-kH?<8Tr@sf9ra2C;=olcf-+3zdrzp!H!)ered0yE1l-gwM2x~i zMo$mE6nclyKk*Xy5x5E61ipty)cm|y455jlN#KY4sPn{e`~*I4P`wkJWr~VM_9UdRgo8X>vk6aVogPXz^N8Qvp zxlNNAG_kKd3DrmN5`#QIpPbI(-sAkklbr9C+kM>BH?^PEzeAUM>$F4C35& zZs3{DT!VhMm_svNr*;qZO&%TbZ}6L?g`0+1Zjs$Ihik+P;Hl_*8(tdxRY?O95bmp+E12fOB^^D~+*=#|dD29^O#tn_$a z!!r}Pd@|D`E$0SKS9xwYSDefC9ard+!Ri^zJrmwnolDg9Emxe2WH<3i>t6=RY|dG5 zOUIMhl$p6_^t1U_ob%MP!MjY%NW5xY)H@^Gti%h{G{FUYHJ@U3DjBG0B0cHh-Xxyo zxk_Dr8T~B2rjkA@^-J6@#%h}5D)?EdIq^Cd^E?mdGBaiI)gcR-i*~>0oO7}nmJLkx z9AsJi^ES;zYFW9<{XER`j;iOVK2qd1|6J(KfSq+tS>+Udd8p;^)g?DK`Kyn-a{Kvs zy{ z4qgtTyz_z`hkFL*F`_spz;*J`KMyCrUx0TmU#z2?0(8)%$M7zQ&r#YWdM96ds{FnL~%`s7EGpZplSg50D%4o8^!9Cr?*FT%GTbPmBk?i_(vfK$XT z#8gMeU2*eMFP03Jno7xata zE8bCh6=Ej!l$YEOTCaF4N|!_E4}ojKVmRzWd(1S2{o>>YsK~hpM?DWX`%F<7Ou7Sh z4ml;L@8y03pS^I3`z1_YlzGI8$9>LzrzAD`mGDbaEo${5un$q&gI4^#9My|+_Jfr$ zKOrT2al|O*m-0*Fu#2oLydB`>U=-mgL%th)pR)_*{+M40zAx}9gL0R%n@o9e_+@Y| z<(K8X1AaMtccK?s67F6m+r`;~Q)zg+(FWO0X9w6mXD8n!mom(^%h}GeA5L+!`-rOT zhEv8bN8FA_dHU}lFH5B?Ss8yD^@`lKINNaCV|~i{72s`$SDtyc!w5Voppi#K;#Pd* zRTl3ZM4fG%ifGkOy7Ju1!L5Lz9H#QL3Mj4seu;=aY%2)`O}1OD5c&3IG+7h@~P=Gf7F zBliH=;#8(bW!$#FufR?7t%IRh9<7`zFq`UCh?RJ@abF8(E49joRQETds_X}GJ$QBd zo@#J6IBVe7AeZk`%(%f>&utTm4Te|tYoK3i`Wnnq1)q&npYosLUd^vXzKXmS`C7EX ztMgRjy#bwk)^XPJs8Z8(HT>Gd)u1)O)*5devuKL7d`nG#le3ywi(acaa#EM|mem5U zfo=_GO}J}NDhBt}<|AL#Yk|t4re6ouQ#^G+f?2D>sSB>D)*7c4bJc;r+*wJlpi&o( zTvVy$uf)BMWm4AmS2!zdrWGiJtR(*L5x$y7&h`BIylWC0_{*JTPCahRt(UZQxvv0I zT<+9|yVP0ASFh&17>6||7K1l{QIEdMn4^K;kZcM3Rphl}`BHquS_<9(Y>BhPX$(`} zzJ}TY@)cIA=PxF%AYVe4`fwW2cM)F8L8KM-G;u!lrm?t^n(!se)4*?Rnnth|I}07f zhB1|N3(+kBm&;P3a^cDwa+(qsIE!#v$g{+m&veTyDqqBrXA`^^aKu~m?@gVB1aT3* zO_*~Y$Wnafz+3Dz!+#E03%{8^ms)c=HsV>teLmhz&@|(j2fLX~)5LEM(ioj)n&Zp` zS4EHf1D@{9{FdnEnA5x%uQ}>?pJu+gHs#%d88pQ_XST%!{FYDSwb15k;kSk-?}g4R zX9m3aL^0<$E&Wz#XEJ|le>O4jZUNeiPHl-zaBo9w;Y-ufdd-D7!)Xn!d?s#f(KjV) z2eUb`HK!GEHX6B!In(s5;Iu~73cp$ABYdVa-Da9@aTeaK;m_dAa-?nTw`Uqn+YZm^ zc(!5g8O+lLAI;L%pW#g7Hq*3nmZ~GVR;F(6Pou8W&b-?C)1ALLvz!i0Glkz`mh+d> z3Pnde+xi{o)W)*O&Qzz1eOX7p6JAr9w;h^}ephsp(RYNc`P%!PdD_70L^cKYsn%nP zqq}Bl54RI+c}@fU%NTMI^DoX6c%A7n3E!^%U(O%kGsq^wnC^69j!7V0@DR5HZhxaz z=cz<#JA+NesWZLguj#t@&w%}b&lKkw>g_?Kn*j10_leG**1Ze0PX4p#CcxHw6X~h^ zPj2E&!nX@EOd^}a9G$5?XFZ?gHW5}3)$32EE8p;^MNRM=_X%j8^SgnMql3P0JXkl7 zVD8E0-_3vC{~i2QJN=#S{h|KP{*Rntet+i`=V#(~WFx>;8|Vn_&l%th1AoOC=nN%_ z_k;hFKb+Xl7_U+nGJ@I<#tZlZsP;oM4DQc34m0h~yk7<%NmTEVR8{K-CcapTePd65 z=Vhl4Q@qOiNB%8O)2knbyIC(#!x{u?M(9EHOuf3$hM z1gn?xqVuai##bCg?Bn!se(`@J_QLa5Vo&EcaP=PJkMm!2UT{VmzX#0T&KTUp?+w2v zh`dIF^rZG8x%4kk8w*Fdym~p^sl5c+oqVj{!S&zR zbu?aMIo)wqlwOYG@mBvHhL3|i8lC3<6-?cpht(7B(YTNEpNIE5`Y}9XL0+WZ4gVK- zkE0%-<1MO}@IWKQ1pjwa{_ekk^H}aLpncAH23`;+`V;+UK_gQakf#M5l?_atsz z;L4|~)5)2HZ)ftq;B-Vk6~*t=ro#IjUwQw*qtgYxeE*`RKJxqvZYT6zosQJhzdfvH zEf+iR{?pf-&%lwQD`*Gqe_8L&%sCmqPUKVIbzp|SiS1+BN#@^?{4b{I1aAub4#X~a zOhWUw={lm6b}HW?c6(;m~H-l6KB9{%`6?Ms_#sYzhTVav~yZJ zfBUoi_D)OGn!gpNE$p@+Z5*k^Y{R`RPb;4GJeqzsI;m!JYvr_XW)Xv2GtJ^mr*B&r zEuERvq;5$+#TiuN`Zi#iWwt-ZW>aj5Un_8NTA-Q>*4$}s>K4@I7%pW~(6+>8oYu}f z9K>n~I>(=jr)Fx7&pdpZS$};~@NF}R>M@h*e7_l9bBQhB>pst4K-ZwZW?Fz>6Kbl@ zMKKRdQFAp#F`v8Q0;2k<@6(*-bQM=Mahrf?>V}2F2Y;RX?B#Cpd2@3sR++SNnB|b;wpSK^${2P~(ujbUoWd(5^{Oa_phtCRs z4S02DjlbR|tA|dtwPY*7)-Y>LeCwdC?$mJBp?->+5anxOtiiK7Uh9b~{I&iD;!2_z z@~G`p<5myta=!*T@z=&q4SZ`jPw}p0EX}eSjXJB(dfe79Z%yl08D?$x)$m#$tFI;2 zfTzi%TkBUd&nmELIhv&^`9^U0t%Xq&m&#N(;Vp&E27eRvD)?^VTPky_L0yiU@RL{Y zuI^N|EO<*%8QvCO{&CGle>3?;`c|cH5XGyCM?6>DjQ2*gRhC1$HetjK!{xK1TB z+hA>gQw7Er>$AzgvjY}=W!BK)oNstB_T zyj`Hdj5~;1{hj`9Lw3L^M|}sGSUdeP7qjDd+5@zJppk20Ycu8mA<2AJr0Y z_o6KgDvzE19z3Po&5?eWUzT~|aR=xg(9-A?@{a)JGqy&xSQEaQ`>`INp7W4mvr`%ODm5({sB{pQ_8rz{r#Ncc$S7MhCDQ# zx@wMMxG0w3=zai?V%*eYKb+z*hWhOD4^iDiy(GN7eo-_+ia5Fjv+VZ|`v+sS1J->% z`N4nZDC!hOd)OwG&p}+JDd7}y3gU9qm~uS?s@f4|D8wvBOmzS+%~{wfK-WNDlo`cV zm&5*1qBTv1vp~L_b|N*gB@mu!XO3df6ROj z`Nui=Q62M-`30>~2)`rvikF`r$H7?6OW=Rh)(f@;V0;y&ry~a%}JPY&Bu{n9-biPbxzUaC@!Z>dD1UHH7{IsIK|0J zcG7(Eft|!R5BVt+C(xWEDm&%padJDSL2^--ha68+%}uX-)Q-bB$8!w+S*x7%&k%FN z&Ew=kdlqd@=M1R)gv zjj7c|+BlMtIWAMn;-qD+TmDTvuJF$2q_c@K^49I9f5T4$Co?AvM@;p|gg%Wi#Y^X0 z2N!Y;uk`SRUNgV6%yAR+I_C!GCg(by8JyerT=Q?kSBLbDs?w(Bxoxal{v9y++{QsH z&2u}3N~3x7q^93(YPYBgxy$=Hyt~{}IjN}KrK0*BKP~-II4M!2rRPomp0U*9AF9_a z%0=Isl9M_X?@>*Gm-w3Jj(;Dm=DBYUcTInje(9Y%OdUk!smbra{l}Dd;j5FT6DB`t zQ#r|DR`?QEYLjk zADZ?)-HWVIEkDG{v*7Tz@hJB+{gGPCO-5dew6A%{!zokjt?I1od~{zld6wlDOXKj<8V(%)LYmSo=41@ zn93vk0uKL7B6X>weu60fIXd1?`~+~Gfau#oQ9q`0ohKn4Fcy^P>BG<)K0&om)H8+V zd4f_^Q2Z0Hm;@h=>m=Yfpb6{|FNAX(i{GL+I8ix=qI6>n7oH!I)02=`PeLf8QSS26 z6pFHoN3BDJ@DL-)DweV+$|(OFq#I4B3g3zsJSjt9(a>XLtpyX(e3Cdm=5yOfVYiK0pP5Bfa-OKM#ob$D$4Pf$MMo)8x6 zT%m`YB+s6AAyPS2-kQn-^BPnf*UbyVmx&o@W|tVc|1g!gqa_LX^MYh)iBz} zA!SkehWMv9pAa3J>mj(jlkwaS-A9)!`oR2>7#7@tpri|VW-3z4#zeCjA_c(I7%N(gtB%vl%a=71^Ezk#{JI4PflnkC!im5qrdjR7$CskBaqy$NhPMRC|rQ?1RmwVJxnnv36 z(X`R))YB1@fu}{Ag6AHpn>^{b--tzZQl5gChUYH5uJfqt4V>?A(oom!7V0#(X}0)V zwKO=~q?V4GH1VizsbJoY>C$pf3nwl7G^Pr4H)6App-b>?hBDxvnWHQV%qwU!pvlZ#+G}`Zie|wf9q+7Qn&lGcb(ohz(q`nj zYM45!b`4x}W#MGxWU;#P%cjYKA~RVg`d*>0;#JdRi)MqLfp<>O^vrV|JcIErg)W9J z@My-&RI|dmNUn2nwegfEv)qNtSC09>PLb#4ej4lqCx0|QUdQpshsOzHtJi7#bKzS6 zJXbU?x!9-R<$=g_x%hxVj$Uw<(POAz~5cKEyW`;YfEBy?Tgs0KcO=hro)MLlJZb4L!&# z#r{Rb5nhbCR7Hu03_Aj*?j@p!L;LV47A5-Bc2SYT zzEBC9Z-1yXwGwdm8c(jJd6e&gQ!2U-MagIxe0RYuV}18=--*Yb&#iQVk{O6W@CyNkRGaVN1H^&RlaqEcNtb=yX*JiWJv zw(#tvS6S+n;cX(@1u8{l)96+O-6nj5l#gyjzXeTY<}A-s5k}xyAzBqiS&%A*R*H(b znP(fPJiMxSY$V?fx(Sa;@B?mDYH>!zs8p4yY%sJptBcrA;k6z{HS50#FL`eaRgG2ym-~j$I_lM_R|1o#IMt%najYC&i$@J| z`ELrX=WH_WS~LM(Jz9g#>!@g|Aa1}z{57Gqbf|%|_#4Qp!LEUORo*puuR&9jd@Xu) zl-oMf$!!fj)vfO;?&`h{N4eHSEx!7#39Yui%4ez@_2i*!7a+FrOx?qiXFG0VI+2pP6`kG}ROYAHS30sQylF&l*atXM))rI>s zx&|n9q>0DH%&QKI;WvV{82w@#77?2;o%$&@BrXJ97W+PZ$->ZrP-8TWIpQ~lxd?0# z97Q=PHi|aIcOLmtI1S(|1)WPR$eTu6MCXNOhnf@Tf-lDVX*xEEHj6Gm*9863Jd3zD z22-4Cebn>mXmhZ6VDrJ6p%StXhB%5%jL{VD`Jop0%mG`-nZpTs&Y==`wm?0b$y)MF zO`3e60)0ueXRv?gmt-j-^!=uA{X>XgWG6D9#GCHFi6js4edRoyPp_q8;&@0;>b@ zZ`5tA&osU%s42GRk#0Km;MNYL9r?7-RGyA7^lj=qCG?lg@Hg>qn_z0Fy*YGFx#VfhUxyWj(_6Og(FsHi=BwlO$z|*}U7}goTAfLoka+5|;M>?H9m~%2`B4;wre}pDjoIrdo`keVm_h*bT z8GHh{yoGndV=Af+(PyLGz@+{oG#>V((DO_%j;uSJ-*I@B_&jHv^%~DC-O+TWHkn>s z(M}{jOV{VXCZPO-K3(B-vtMT-c~I|$%QJAqe=a&P^t*NZJv5G9-J@fP`X1%u@Oc6D zbM|zPzQAo9Y-z`b#+Xjk7w9n-w7bnW-h6a_o{IE}6GCI@_X2&#asp0VH!k!Wn%-2q zGC`l{i}ri;i1q*(9U5&N^|exJzOi84qdl4BSEi8TDB=X3U#ZA_EWclOdX1y# z7wAZIno-|2)@q|eePI5AR$jkyMuNY@H;*KL$-H~v{cET621H-QL5=};fceNnQ%Kd9`f&6=ay02M;!nh% z>>czOgkL|Dn&}7dARj>fW2iqJ#2vsqL#b=hp-dv4-aqgjNG%=*L%@Oc_hV@nGwdmV)?;Cxc^9{)Ba0WzQBa`lXW)adq`n^s5b?8;{AHcs0earhN zT)*M|1H3_~^nM-gw_x9MzNOb2@W1Bv6TJpdQ~!ZP^^)TC=$piWG2LtMzctTqt+)J# zz&rC%JJAoQzYgnNV-A5Ok9VW* z@qQ!v6+Vj6z61LUdVbCMJoFjwZ$g8KUlQM?=R0V`k<(!KLtx40Z7|KE_$5)S!NhlA zzR&$F-XEIk-GA%ydY{>({v58pS6*Lm|2*_5eZQdd=R`e&@q7>V2j=)8cV(LGU7SBA z`v~4AIDQ0I`KRRK2j@eg6d%EUKl+Jzej56iJ|Ba`y_Acg^8t@)(tKpuC+I$;$7j(G zLhpw@kA7|wYr2o@OQ`?L{fs*^!BIbb&---y%<7-={*d|P_7U$-sC>xzlq2U)_^OYH zAJXHq==)%rRQgZ!#`9yakE8fVudZ-4m$9OQRRQ}Lj%MaYR4XV(0llQPW}O$&)^S^21=<0lYb7P**`-sj$Gd( z|I+5;cj5lF`Fu#%x2b>08Eii9(oILmJJi064zbFY^oY;+E)#q~K7{9s=vT&g8%!Qw zao$4r6?)aa0(+C%d-Rh+>><`qwIRlRhnh61d<`nzx5U>$73K2{*jJ$H`3>jw&>Pgg ziM|nf)6{R0zlq0Nq1W*FKKdPfzl{FCP2IjRzpr_}5t8d$%%?fug8P+y=NGWvLqCA} zJ3ND^y%8E{?t{p`XR_D8RQVS7@9-Q1<1O+b(I2Bf;WL2zCwdHEhM(yCD)CL8pzj;p zUWNT;=m)f_y}{A9q~KaZSW zrRR^#^*t^>GJ}wTU_Wpl2zLNJL-BcqIE-7s9B91$R0qKdYOmqh4}2It{bThXP4ffD zF#P&a`#IVV{xI_XL^%v)PVuE4`Y*2P0M0AS@)Ozt7KcZNM_&&04UNP{-!0WoXom9y z_{iu>p_izSi1qA?=LqUQ(RTpKmvMY0^fUUO(fmxUA6Q>{%X_%t!d^0_YQy13H#|Dh z`i!tR9PA~qQD8%(zYz87=!^7i{bGLN^uawIUnctnz54!29ER>U9C})}KFl=|L<~J6 zV&C!$vA6m33H2n(rMDr!!s|tkm%w||rFW=D=vN$-y$m)oIy%}r^kV3@=$Pn> z&ae3Q0(+4&#`^aFeGzp}=J^fPxabR^=R;$o6JU-Yn-J|D>So$8%-!9XFEGbg`gRYE zi~f#k6xr{ld(phRp&tkL1?p0bkM_W04A?lB-O*|K7r?p`158}0#&X8v)s6FFXgqr5 zea%#N)vC2t^*le~&OZ*mMdADNz}xXD?msI& z25+x>6&8~#oXwdN5?{HpVPIn_$Z$P z((@PW=jSWHEupd^dY7?VR@kwu_>%q7z|6}(%D?11Cwdn!+ZQmc42|XFSMaDg4Rb{1%gL@PX6G~U@fBJ#^Vx8$3KuKkn-iJ2u+IKxd71&^ zTyVNt8NOs)iQ-ClW>ZgbRwY*R&j_8bz=)LfL$Gs*GfSQgM>73UVYlt64O!yDU&gATUh+YLt;+qD}wU*3k z`e)|T@~P;~Ac~nmZ5rJ&RL3=;v^KP+RkCWz^-VB;OKmEg-{5ar{w??^M48r*o1Ra} zzb?L`_CBmL$gM8EXC=L9WT)icQU3Ksb>@8-%mRVCsBQ$w{c_Ce<(JB zn3TVhZy<`5X%p*vx;7Ihg5De)o8W(&(`3-Dx9QnT&w4mEMXzyVXm2jw$tSWV=UX^W z0KJ9U1Tve8Enwx|8aj>am2U5%Dk0+*?x>TAvg0D-9HuEh+{xmOG^!L zsWukO&s0*s*q^9urEgq58lGP{ZRYfIF(x02qj4a{6-vl3HX*3|P`bp1+w6g|HdBfyPjnYUln5io8qcH(n5-gXu{(EWwC82d)jvjYur zDQiA)YzH-x{3tNPVHy>D!{FaVet7i$2Ie>Vcaj^H4+Hro$Pr++gOTSKqW-p{x~mut zM(j?yJR4;)4hy%#>Df{I&Ki~vWjWPQX4qBiA*ZK3#qMC+OKu4D-Qb7fN3{IAz`5T| zR7)=R>g{8v{}I%8vLBYekz0R*zM=ULdUjLYQ|yh-ee6W-jqLAq56cI$hUNQ$br1SO z*o)dz9H^l8f!|AgSFxX*aW8%n_Ym}CH~^PA2ZCGtUeLPRP0p^}#UEr|1v`{yH?<-8 z>-k=K_60(PeZ?U##)CZO^|GJSp!_v_xsziM>VtCQ>pTOg4gMz%=9Dt8fjAgU2ZDD1 zn1gWIIe^Z?aKA#-mp%JI4WhCir-#DRAM6em1E{Iu^hc=l2Xi`Lh)D*~?C;0P?90L0C;EGX{R_^%csN%4&C`SZspvRb zoGgwPz34hl>>b_x=`Uy)`ET;}%5faE zUinL4dh_l@HJ#M5vnT6h1=Ew7TqlD6@8YGXoh*8iJw>iZ)a5*Z&pvsNygOQ_sLOF8 zW=OfyFrEZ&M=xr}gTvZs@ZHGUeT@CNILl!6C7y0@o(|6Lc~^ALvhPY~&x%$LPTe?l zr*?)V<0-U6bR9BPV`(T&PQFYbL7t#mqOi5^X#vXYY*mf1=A^Sm$yat3XJl#&D+4(h1fc8&(4hX_TaA2 zeK{UIw}->iRrU#^Mq4`mjhBjc;MxR3V!R&SuNT+pY)z#D>k@t5L2K4Ee7me&hr2bs z#w*2*q6)oBM3I-l+x!JPRUquFDsB-k4!f3d{}G zHDa5J-VLx-psyFViK^ZyTIEgh6q}=Ui)F`c^sW{y>1z&K8=huxw&tXU>n7b*;95~> znzssMlL}TI^HuP-pn8*YOKMfH-VW|6W@(Y%Cf^L)EpW~8ajUo+QH`5m?|^NFVpD1@ z&}fo3%e!s$J<8q;|Xq+NH5 zN5s3RdcI#YgxB?elb#-uYY-|8(KjdV0eQO~6fzt2q5h+&+~@s>zWV4tijK#Tf5_X6 z-D%&DzIu6G-c5)#iA|a3Uhx!W)t?uSi4Wo|t9d)?!~F!NI>e`7>dYgYQk5ruR-*rj`;d8 zm6krqA0TRMNww8^1OUjWS~oW`NOFAEeaXr;D1IS zClCDWOS*hA)XW!TYUCM_e*j;?39<|nXE0^tQzr9&K=>z@I12t$Yb_X`)5srm<z z3Qu0vrulhMv#cWtKJ6_0GqU_)*qZ!l*qko@aB77Q2ibG#31bwA9gya7dTRRzWuvzi zBRm7o^zghOT9IAu=Tz*i73kXZsaLzKOU&_8mv@b_K7EfsX8bAIjBLH~Y4#+m!_JOc zERpuwS(o!;G+*%4BJ(sf9%m1U4XD+mzh3m!fmtP^T=G7Iw_zpLCqCj_Kk#+R2JB>P zz*4zBu`ZqU$|u?5STeh-M@`PUa2e}GuT?AZ=(9nEzaFTD<-_cLR=;dSHg&7w&Wt>b zc&AhS@)17o`O{hw&PQP~vEJ9udV=5E%QD5Lv3JWV+_g5!SnAiJI2%$k+WBXb)} zb9&_zeVf&c^BuaH676dY_Fi@i56xI9E3SFjf?DbmCFfmmRp{MA<0c%Zm({qWQ4rNCw z7wA`4e0wsYRcsqQ?aA5GflM1_zY4A$sJ7*$>{@269kuqnUF`$cHe$-U?^IsN&Sw|U zxK3=txzj)Bj?vqZj2xYU*^Z8!oaItxyiAnaPI<+5Wak8(S@w1=yF{%My9?-C!`OL_i`aE?GUb7uJb**GN#ZH`+u4T9A?ZN5q>|Az*=TzvP%}&R> zXS1{9KCZ0K%g@Ts%P-2s<^Pt8vj1eBtt}?|S-FJDr{(LlF-Xt|O%?`t_Hxf5a@ z+=<-^yk81&kC5Ak=N}8W1=EUhCR}q_39X;RvJ%v69J%JOW`lFL z5`;4+9_L&Y8FRDI@JoEfJkGJAT+7~hRx{tM@VSQlhurq+U|CJ~GM=vkZ=e3kQUc;1cFTG}oa0A^pY~(II9gX#MyF zW^wjrW|Ccv*BRksHaW9$iLgg*r%8RQqq-7aZ+{xIeqDYOGp?m)8u&SItmH=4;(aC6 zwdHhtt|590iR&x$WKLe!kewb{Dfbn~wP;SKUhTno+&h~d5?_il;7=X$IMH-GuVuCm z*{Q9IugYok>p~{^ta{JWv#DgfZS|M%2}PMtZ%?grO*4a|2z6W2yV5fa86xDU42Vb+u5q|`uzYd@5wuM z3b|ANx8OZZVX11D*r|b)*UER{@|(Ep$sjhA>*DLm`8AktLwh~gck#Rq&$3U+z779! zPRYJ!@7zY`(&tqA-_PEQsD@nYsjVSSry@e^I-a$0ckjWO5Z{+SfM3gLefcgN>!`mU zN;0RV?z*^BJ*i}7YRuzZ`shbj#_v%QBi1>b=Y2eW4~LA_)Ui)@`qJHcGIp=$vF`^? zlVhrPxSt=&4bML_ww17(246k zTsfa=-ogf|GCAwySnu+ikzH;xD!v2H#>j3UR{Ie5HhoU~Ht+X%JBd#9HHkibO=jm^ zeL$R8$>>6EIdriRJ-as(Ck9LMx0%XB`ZkxFLf2cIjLr|_U&1DWb5&n8ylniMsskoRpE#95c~N20$4zqOv^buMRh z27UNc&$*%8TzcLJYE$ed#QjXp#<9G)3Ebr-c(=gnUF&*c;3u(nlFd}@S7}0c8pn(& zr|L%b6JgV-?DnVoOq!eNoIu@qRP~FGC(1D?c9SyMs$Fg_Z7W*Veq=eXcW%#?m_pVqVEsbX+B$wa^fptGZ(L+_Y^Rfr&wdI%zv1{y zofLI2K9;?2QyEKb5*=g7rhBaJnGjyhj;FdcTx{Xq#>YKO#HaV9&SqSg-@;i3vTZH5 zMP)oV@6h!Vxv|+85EJR$T>i|eo_Tb*)cJ(q*#>q@1v@res=Jjte2c7iFc#c4^v1&M z`z^9!^gof`-{$fcmcJ8kTUXw)_d6N}b+&@B%Uc-7`zQR2rMiviyxy+)R2>7x-ci}F z@K$>fr`N44Z*~juS8_kXF|MLC4n6PVXC7yf`7LTV-$D@TXw7#QBl zeg^+D+0mTDY~wr{t#R3#WX6;Gk-JLwTV4MpTx>;W9F9lhd0ROOE>AyEQ$y$5*^eZ* zgXq`vtg1cwdNUizdpzfnaBPn*xy3k9VltCX-t8E=)EZ0NM#VdI0w}8MsMXeqFxi4e%O_r=qI6Ra^>%i}2*ADK` zTO6GYL-+Uccjo&A^_}E(uFsM1JI4s-RsA>ar&`z!zgKviDfNpl!jcTT$#oe^NujAC|@vo;(pCzeBRzq9+dz9aI(@!+gFNVDw$ zslQQVhLY1+y1U)Mx~r^?ICSY!lP+tz^IPgm zgv`6jePn;b^P8D*7nA5I_3SQ(;9+R2AcpJ?1IntZr)Bhl*;Sja~FL>@t6F(L3S`K`@j!ozaPBQrEl_k z`3L76U=L8&mHt#61Xf3K+cOB314MQA^SlmbFsS{U)Y6kP?hl5&|HL8ic-z)x_f}*c zoDGCsj=|i?UhZxPY=e25(X)Gfyv9kELGbLur#kzIsvV#&<(*#4K;DPo8$iz=AUw;d zM)mxA;n25^WOVj{Xbs6;4Oa&OI~Zj<2GOhD-qJ6iZ?kqD42FYI6CtZ_`wj%Z><78K zf!vd5dlJsM4s!e6%^{Zea)9$e`qVqbZVx-%56lL{Ees~^t)Pv61oDsI9|%HDqwhg1 zr*Vo`D>=1aC8O%W@=x6ChUG9Z>8Uap^gfu?+DC10_6qCu>@Yp)PWRG#7^eNqsnP&C zyp>m?dqCDdw7m)E@^-}ypstql*`G3c?$6!)NoF7XgTNdl4#1;Wdy~Ses94)ieh^#( z$eZ)V#J)<#8*!!DD^v$kPfK)vFn@A>nYwUo;!;!Nk z2JcUgx;zZx2weSf)1MiSa6Vl2Lnl?!S+tt{Q1CVm2lvt7wy$qEQ@?*`^(8t((l}D8 zuP3?x#MNO=B90OdaUOt2d&J3clqk|A>k%-{V&Bp71l0o(oib^?lJ#MEKcd7R1K*e4 zezD{D`D4M_ zCv^Lw>lDYiyWZ@NQ&aXx zBX6&NaL38Y=Ua__^dE`%Qq~PzA2@r&%)PVjaGWYnhx$o&e{&~2L)|;lMb9|*V&)Uz z{tl1c&`H>h*1gN_;h{UH>a4y`gXvC88r{I0i8;@}bUd;>!iyZIg8K|T-SBy)JQMMB zc^0gbp5y+yh8wj{gZCEy26q}R^{t-*?>9LEzFXD>H@#8l8eY!Olf0aQOJAqKB@QcU zdT-ukS3EdLH+DUU-lq4_nX_M|OXPdvQy-_p&sqBAKgY@2I?K}yo$A;fHvQRSUgv6d zh3gz$YM-a>U7V@ls_~xn(j7O}&jn5m`(^He&UqM5lDk0kX3p^>AE&6D59V{+RToxw zG?Rm~bm&n`PbT!P&sS>tN*qRA{P#-Uy({mdJ5T3e?v{BY=gLc?KU;Q&(Yxvtu?tb>T|t=d%1K0WkaA|a(yPWL`rB7JI&(i~ z(Ww4yC63FW+JU%?uMV*LE!0)#0=eY!JRUDnZ=YQ%FH=3u4POS+0j)0JFR+|U?;Xha zEiTYuPMiwesL0;|@7?J+Mg0o=XG`%NS!#Im7wL80j$kjrsfUXdZhh&>DHHZmbUEu4 zdRt~~W3|azWo^)Ho3+lame*LJ6%%#9k}gfVoyy5nHlr zo7s6Cwd38qa&Ap@#@k?fFXL^nO~^V$GxTr4txBtKt*2Y~X&!8?d0YFJ z+j@)0wWQWEyNP4{w&0P$JJz2{@;ICLf9JO22G4E!n$dqN>SE;a1`?l{7EzZ)pDEug zoZaRwZAQ;W z<;>oh^Xj8{+*_K-taDfK{aa*>V0r*UL!!R}zt>$>Gu+5`6K?TMSVqsc!%IsLO|m;N z(+%+YY!<3c*@V4QRF!widz{s26+XOQdmDpq1->yHcR<{Z_buM?cz<^*8Ru40L{mDw z(drJ*;&i26BhJZ(xTfLHUR|hZ)|I^9t8^Ou4yk&Zy`0W)mwl5;-aAO0=ABWchJ2g* zEN}Nt`2Zd7yxOz6&C&IK{U$eI_I#WCJ$f1kqj!+b=I_Jf^!ItxY|Nuy-}=;lL$dy2 zoJ`F|fohV;;y1BZ&h$1WE~6On-iJutIeEkQHR$Dju-t>$`R_-RO;$VZ(bEKUBYrzh z?(d~Z)`0Uv&hqFsVeOGAao#B(mXGMTO?*h+T4Q{;Q>Rf()|9hzJt*tL<$cv9@BP(9 z#kq~uXTM2(&JV%sQKjl$e-U!%wpvSst8pdg4O`Pug9?vc5|1wR*eI*^=bVkf+3|>4 z{a~*bxA-7@KZ-f@M!B8uzxy6D_ucYw@Z5*byOZ-?Jv~hKY`nx zN8EpdxPQCr(f24OeZi;P|{2e_lUqr7rr%GLx_1Zko!I<*~oa-^zdbo2=^`CRDNnYlfbW|(Z zSBv~J5US{?Hp@GcH?ix_n|cmH<^rx7XcqXZfmTtLGADEwb?(1+h0x6cEV?Pvi>ZX zi^^>EI6t8?-G%q%+}@3oWFX4aQ zg^DU=ATp48enFp|u9{?P(4T$>{#L!|7vR-TbEK2^#6MII&wc~%LLR?>EJ=fZKwqhd zwTJ%^0LJv2=O4eLR2#HjYJ&CqlwkCy!;Etd=QG~oym?i;3;y{#6|ps9HY>HkKd0gh zPVd)9jLCEoN z5{}Nk1^bv6C_09+3#40C_DPf;2qxx9hi2l@VR uWrhj}KIMoKJKDU+NGg{fYT*J_1_q^_I}gqdn>h{WFa}RoKbLh*2~7aIOjlC? literal 0 HcmV?d00001 diff --git a/P3D/Content/Textures/Battle/MegaEvolution/Mega_Phase2.png b/P3D/Content/Textures/Battle/MegaEvolution/Mega_Phase2.png new file mode 100644 index 0000000000000000000000000000000000000000..68cd6e9aa23c3bf288780696e8e34377899fb1e9 GIT binary patch literal 4157 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 EAAG=UWB>pF literal 0 HcmV?d00001 diff --git a/P3D/P3D.vbproj b/P3D/P3D.vbproj index 32cc4e1b4..dac21a01e 100644 --- a/P3D/P3D.vbproj +++ b/P3D/P3D.vbproj @@ -14713,6 +14713,15 @@ PreserveNewest + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + PreserveNewest From f1ccba7e4569ea87a590817b349aa41480cc78db Mon Sep 17 00:00:00 2001 From: JappaWakkaP3D <31563291+JappaWakka@users.noreply.github.com> Date: Tue, 28 Dec 2021 13:55:30 +0100 Subject: [PATCH 32/57] Improved Mega Evolution animation and slightly tweaked the speed of some of the battle intros Battle intros need testing still --- P3D/Battle/BattleSystemV2/Battle.vb | 14 ++++---------- P3D/Screens/BattleIntroScreen.vb | 4 ++-- 2 files changed, 6 insertions(+), 12 deletions(-) diff --git a/P3D/Battle/BattleSystemV2/Battle.vb b/P3D/Battle/BattleSystemV2/Battle.vb index 3800a3759..64673f565 100644 --- a/P3D/Battle/BattleSystemV2/Battle.vb +++ b/P3D/Battle/BattleSystemV2/Battle.vb @@ -529,20 +529,14 @@ Threading.Interlocked.Increment(currentAmount) End While - Dim Phase2Entity As Entity = MegaAnimation.SpawnEntity(pNPC.Position, TextureManager.GetTexture("Textures\Battle\MegaEvolution\Mega_Phase2"), New Vector3(0.0F), 1.0F, 2.0F, 0.0F) - MegaAnimation.AnimationRotate(Phase2Entity, False, 0, 0, 0.25F, 0, 0, 10.0F, 2, 0F, False, False, True, False) - MegaAnimation.AnimationScale(Phase2Entity, False, True, 1.0F, 1.0F, 1.0F, 0.05F, 2.0F, 0.0F) + Dim Phase2Entity As Entity = MegaAnimation.SpawnEntity(pNPC.Position, TextureManager.GetTexture("Textures\Battle\MegaEvolution\Mega_Phase2"), New Vector3(0.0F), 1.0F, 4.0F, 0.0F) + MegaAnimation.AnimationRotate(Phase2Entity, False, 0, 0, 0.1F, 0, 0, 10.0F, 4, 0F, False, False, True, False) + MegaAnimation.AnimationScale(Phase2Entity, False, True, 1.25F, 1.25F, 1.25F, 0.02F, 4.0F, 0.0F) BattleScreen.BattleQuery.Add(MegaAnimation) - If pNPC Is BattleScreen.OwnPokemonNPC Then - BattleScreen.OwnPokemonNPC.SetupSprite(PokemonForms.GetOverworldSpriteName(p), "", False) - Else - BattleScreen.OppPokemonNPC.SetupSprite(PokemonForms.GetOverworldSpriteName(p), "", False) - End If Else BattleScreen.BattleQuery.Add(New PlaySoundQueryObject("Battle\Effects\MegaEvolution", False)) - BattleScreen.BattleQuery.Add(New ToggleEntityQueryObject(own, ToggleEntityQueryObject.BattleEntities.OwnPokemon, PokemonForms.GetOverworldSpriteName(p), 0, 1, -1, -1)) End If - + BattleScreen.BattleQuery.Add(New ToggleEntityQueryObject(own, ToggleEntityQueryObject.BattleEntities.OwnPokemon, PokemonForms.GetOverworldSpriteName(p), 0, 1, -1, -1)) BattleScreen.BattleQuery.Add(New TextQueryObject(_base & " has Mega Evolved!")) TriggerAbilityEffect(BattleScreen, own) End If diff --git a/P3D/Screens/BattleIntroScreen.vb b/P3D/Screens/BattleIntroScreen.vb index 121fdaeb2..bf53de80d 100644 --- a/P3D/Screens/BattleIntroScreen.vb +++ b/P3D/Screens/BattleIntroScreen.vb @@ -455,7 +455,7 @@ If Animations.Count = 0 Then Animations.Add(New Rectangle(CInt(Core.windowSize.Width / 2 - (Core.windowSize.Width / 100 / 2)), CInt(Core.windowSize.Height / 2 - (Core.windowSize.Height / 100 / 2)), CInt(Core.windowSize.Width / 100), CInt(Core.windowSize.Height / 100))) Else - Dim Speed As Integer = CInt(Me.duration.TotalMilliseconds / Core.windowSize.Height * 3) + Dim Speed As Integer = CInt(Me.duration.TotalMilliseconds / Core.windowSize.Height * 4) If Animations(0).Height >= Core.windowSize.Height + 128 Then ready = True End If @@ -479,7 +479,7 @@ If value >= Core.windowSize.Height / 2 + 4 Then ready = True Else - value += CInt(Math.Ceiling(Me.duration.TotalMilliseconds / Core.windowSize.Height)) + value += CInt(Math.Ceiling(Me.duration.TotalMilliseconds / Core.windowSize.Height * 3)) End If End If End Sub From 9468900f9b18cf355822661c74d429be5d2484fd Mon Sep 17 00:00:00 2001 From: JappaWakkaP3D <31563291+JappaWakka@users.noreply.github.com> Date: Tue, 28 Dec 2021 17:34:19 +0100 Subject: [PATCH 33/57] Removed Attack textures that will never be used --- .../Battle/Fighting/forcepalmhand.png | Bin 1876 -> 0 bytes .../Battle/Fighting/forcepalmhandfaded.png | Bin 1849 -> 0 bytes .../Battle/Fighting/forcepalmhandfading.png | Bin 1863 -> 0 bytes .../Battle/Fighting/forcepalmimpact.png | Bin 1477 -> 0 bytes .../Battle/Fighting/forcepalmparticle.png | Bin 260 -> 0 bytes P3D/Content/Textures/Battle/Fire/Hand.png | Bin 2805 -> 0 bytes .../Textures/Battle/Other/RedCircle.png | Bin 1740 -> 0 bytes .../Textures/Battle/Other/YellowCloud.png | Bin 385 -> 0 bytes P3D/Content/Textures/Battle/Status.png | Bin 3682 -> 0 bytes P3D/Content/Textures/Battle/Water/Water.png | Bin 279 -> 0 bytes P3D/Content/Textures/Battle/Water/bubble.png | Bin 571 -> 0 bytes P3D/P3D.vbproj | 37 ++---------------- 12 files changed, 3 insertions(+), 34 deletions(-) delete mode 100644 P3D/Content/Textures/Battle/Fighting/forcepalmhand.png delete mode 100644 P3D/Content/Textures/Battle/Fighting/forcepalmhandfaded.png delete mode 100644 P3D/Content/Textures/Battle/Fighting/forcepalmhandfading.png delete mode 100644 P3D/Content/Textures/Battle/Fighting/forcepalmimpact.png delete mode 100644 P3D/Content/Textures/Battle/Fighting/forcepalmparticle.png delete mode 100644 P3D/Content/Textures/Battle/Fire/Hand.png delete mode 100644 P3D/Content/Textures/Battle/Other/RedCircle.png delete mode 100644 P3D/Content/Textures/Battle/Other/YellowCloud.png delete mode 100644 P3D/Content/Textures/Battle/Status.png delete mode 100644 P3D/Content/Textures/Battle/Water/Water.png delete mode 100644 P3D/Content/Textures/Battle/Water/bubble.png diff --git a/P3D/Content/Textures/Battle/Fighting/forcepalmhand.png b/P3D/Content/Textures/Battle/Fighting/forcepalmhand.png deleted file mode 100644 index ca1fa76642b3873e48e4c0090f4a86566927dd97..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1876 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 diff --git a/P3D/Content/Textures/Battle/Fighting/forcepalmhandfading.png b/P3D/Content/Textures/Battle/Fighting/forcepalmhandfading.png deleted file mode 100644 index 5b3bd33add1cd9fd583aa1e02e40a72acfa796fb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1863 zcmV-N2e|l&P)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D2HZ(RK~#8N?OR=F z6jv198k1-%RxG86^oO=W4W%lDg4kkzq)ltnLN&e!r3ig$eNdmeJ_NPC6oqPhXzJ3I zE_rZ?c`!R0>;AEIXH>E?5u6#>klmo5lc$YO?&J1;*E{QE_Reg6c4r2f4?euvId|rq z@1A?^y|Zg*1uIxV;2@UEMWa%oM4Ns5|A45Ki;o{au9J#DK4X^~P^;CRVNL%roX_to z8wPc{?))N0(Clj$fnA=5e{SD?jy3%Uf|p6K6`S+;8`qdwQ&{_2xtM$S0yt<7-efZo z3WY)^YdQ*mO!`|C-)3gPgPQ;#rUod0b5 za2idgO$|_~R!4b#d=bDNyp_zP0ZCndA*QNbXp{cj(FC1#hjZ0xa5BJcO$V8oBYqZy zQ*fNumzM=s3WaB#o*761a2<9@Rehg!utA!h-sMybc>!J1v@JYaFmO}ABt%GSTG6_d zHKCHJfSSSU2iogNT2(*h*@4&}Fthf;ezere#stqHDdRJ(h-Z*Iug;T^~qsv&tN3Eb3~NsNb?*sDUv|5+3ad|i#iIW(ko7@ zfjzC0nzn;y2QE|q-VSrgfC#MF@REYZw5**-Oij((;bm2Io!c}}A3Uhn4^m4G@@zog zrhpX-5rNp`6BBpdU|s0_BuxuDWe~}N3^NUpT9V<}fSwh>X0Ml;iGV;OX(@_n#JYs8 zs_I6=sBkwpAgMDnxXZHq3-3DEOaM<`i!~Dg*CR>kATy`V8OEanJX_EV&h7l*CV;2G zn;1-rU%C}W6uyh;{1>oAaf}zV18(*R5aeA0aVbne*kPS^JB zTS7fOU4-k{6-T%U&`Lr;h>)F}*}xu6kuR4&CBZu$yzIn%xErR8y}j#?Ubv9A2BeX> zL`FHkcH6f1h)H9y>F@72a`x;;Iko+Nsa94B7zV_z_D12p8J8n#>O^#B|w?@fVu)-c-Nh11}`Xjj(2zq^&URg z{rlM1XC$2k-VLmzsi^4Z{~RBG?YHsqO+=LNLW@uLl+WK_!AGBR^`spj{U3@4vLxh=_YD<%hR;4+|O%QjF80SWMrz z@f8bU`9L{obS$t@VQfr0w#CcL5HJv<0Zi!vE~`5WeH z9c?)_2Tcf?{*si*+`RcNbI}_t_oUY<()7ha!=f|CV~_%9Z7RZ{P;MM4+QD%O`w!KWK*^^?;0izFE4* zlF8>;v%L`XQqJphL0VBp+2ex&h`@8ST|@?uDd4#C^KL~TbFgP1*7fGObKPEwfTOQo zE=QRcK7uSg2;QWZBIwi84ZA;YVHtftL@3_7=l_o=c>;j#E{d1}rBcb8D({M+p-!Fv z?al&hf>Mgo!@QvId@D>bFtFM$0j#Tle;XoO5j5G(DL_YGmh+2#@7ET1EC3E*DP2GR zucExjJn$I~0<`O-s2fI<_dTCKQveSoHGpu{JTmYCSPmg7etp7jUxz=%4{!+F1Wt;r zIw&FdjHZ3fZXFOj$pBXofTf6luifx_M7d0ky_$xi_anPqfZ!6e9cDI|Gy|AjUBk`(O!H?$N$5J6FL?9Uafz%ztG{{i0DWPD~{)>{Ao002ovPDHLkV1iv` BY^MMK diff --git a/P3D/Content/Textures/Battle/Fighting/forcepalmimpact.png b/P3D/Content/Textures/Battle/Fighting/forcepalmimpact.png deleted file mode 100644 index dcb19dac53c32f89fa010ad60d863c3068f977f1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1477 zcmV;$1v>hPP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D1zJf&K~!i%?OI!i z<5U1wj@?K@?vU1Rn$yMSKvv;KPEhAgr(mzNo9nf{M~6>FBuV zgW$f1tooqB4(N-+4x6OYX-?9amGvIKFa1-~)6+I>)2593!AIMi|NNJnKj;6Gbm9Mi zIF65zuhWHZtD5hGJLKoqMBNG=M38YpTfG(Ui;tI~tpoo(|5OCm>;&2l_FLZxt`U)u z;8ixx^PJ!=`8hxEY_+p1NTKJbzdbwLd#KjBQbY&Bw}PvEJN#Vcd2)C@aA+~Sj*giE zO(~9lv|4FiBGbCy*P{DzvcA#hHQ#TZAtL31yPV0v0Xzcv?Yw@Oo=EQ(dQ!fN!QEo2 zTp-P!Gdnn#SltcZQNNqUx~X=Fsq#=?46e=R?D#~=|03qf1DyE6Y<5&nnXF zbsXE7lE)GnobsITFw*&hx)VO?S<#K|(#E;8&1;h1d5mL}Nn{N=dT6Vsk^u68!I5jV z=yC=fSL5TjnZz%~$I_8_cYFc@dB#s;q zCv|JKa8jqx4i2l0JnPd4GDWg!X)BB05w6v@eJi|8#3qO9gx6<{=qxf_`++u0w#jzT zNk9DLYGw6gnKB-rtkuWJ#2Zgu(3Z)EEZZGc_y#M9Ol#LsriIkg(~^?H62tPMkqvl{ zQlyipni*(Q_oFY7+A=LaJWD;KD`L%);h7<6E;K((WCo6PNv(gpezB(L@F>kdQJ_uQ z&ic|z)o9qQD`d*(fP$Yo%FwdO;hBTBy94`=Y*$@N-72Ev0R~=96_$~r zuDyO$s&E!1r62m08usNPG8yW2bbG3FnhnA*NVn7-q@%uMbr6y9!OaL~Y$a7(#zvHa zwzENk%PWiFnKGOoom({$b(Ko6)BTuLJ~x5lh66SJ89qimP>oMyXVh>S7x~WS`F!NM zvS;NanKm2<^22P9WSObU2Lq`e^;&RqAt{S9_DD9slx1#4T)or}1}%rj2NZ3?MQ(gP zTV{FTGvCw?&xszF!{Y%f`7jh6Nfq|6#D)Qv(q`%h7UEqwJUU!Eybp!<=dQpsmem5T zS-~xuFUvACK76Zn6YGjpnX}}9io=HOYSKmS{zurp!~Dc(6mdP>dD&xRb4?yl2f3Bu@6UUlPN>*CxX>iBmz>UZ0qNaGj2>*4WJJg|w4Mp9F?npMfJ}X$} zO+*50N^hDRD~h}m5mV&?&b*{MS0wrHTuhYfEx~ieFdxA0Btr1EL$>s f6i3m6g@u0s%eGN*r=wNe00000NkvXXu0mjfk>SrA diff --git a/P3D/Content/Textures/Battle/Fighting/forcepalmparticle.png b/P3D/Content/Textures/Battle/Fighting/forcepalmparticle.png deleted file mode 100644 index 3ece9177f0d7f2f6cbf6a3620ef8a87629c40dcd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 260 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 Hu0mjf*NGP~ diff --git a/P3D/Content/Textures/Battle/Other/RedCircle.png b/P3D/Content/Textures/Battle/Other/RedCircle.png deleted file mode 100644 index 277e030d0da320bde6e1e1dea4a4d467dc8d63a7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1740 zcmV;-1~d7IP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D24P7=K~z{rtyfEI zR8<(h5}#3#7!?u|OFMJt-ns94XDp2n2@6-Q3>q;c7~QZjK%#7AVL*dnVPFN(1xDSv zAX+Fe7N$T!K%k;+g+8G4G4wGl?X;bld;Gr38A1hx*7=i@JCAez|3Clt{g10Wj0ktd z^3V(3FWA8kB`4Jpx~W36yi_}$`|;esJ#u?>M66!@D3q@(JN}_b+biC*JaIK?ixE7_ zZYo;iwtwfl@X{i5(zBtP-WU3QQYgwIscQZrQmN-cFTGi~X@OgdOPVP%aZNO1{h^y; z*!0AJ;ffYj7sv5ipW#INLI;lE3>Tc~6i#ZDRQd4I5syDHZhN~5mOm0YL8Q1{x5S|7 ziX0Y=oq*96tkY@|4(O317c@iUEq{&^kt1IEKJ- zH~<(#K|UGk975ijNQ%y+B`zZ}18|CaE58*SUkq7p1Wg|67QUCAV6^O}KL@N&N>lfj z-iC&!ZWwkS!+ixxZvkT(CcY8IUh3+U?Y(zKGuIr8$6q|GsxN22m6p1?mrf>V)O=Jr@DX5jfL@%aq{21TJ(Uu8#w{T^Yl8MjpK_Bwoo4 zw&YAlWMTX~@TKP^+aCjtyB`?7yJQhB{MIv!v_>UxAQgbYcjc`2`o`bJk41ri6CT zzyo9|F#d+QeG0elLnMj_8-Dv*7{=p~)&+{JDIXEaDO`$CU}k}1Sp|O-xQSr{-qXA_ zv5JgG4#3MQ33X8?v#OF=3PSu{=+xIDZFY7Uw#dUc(=Bv^JT`2XXR9KipI(PbnX6WL@|d}cyv5CfPlW3(k!PzSxYQar@K=S9T!di%u<16p0{4DIUGquJyyA!p@}qBm*pX#1bU`=>A~U~4bo zy$*tt=-q~$k4Q)|uJXaN|kS~Y%;V5mui3!siCHdK^6;`G*Xr;s+ zwY$Abx1-8fEx};o!_YxiST;EjPfXjvw{U7h*$a*;tVkDt%Q>)eFzF0r5{VZMI?mJg zZI|;D5_!~e`%19E*@8n&G-IIfafXZv5%Rvswo4AMKL4f}$H3CfY$Q_8f`k`1tLp2H z#I-4suNRXPhn8{EDz#mD zGwgJti0+3>nCVVBXVB!9NmKtVBqwhC8DCKNLK3~4z(@wwjGy^Z(gI?!e6zywWrg!( z#eouxj=(WGP3M|pS{}T(_;V~~N)rz!Bq+kZhXsqFqyxmY6Hd@EOt+#3tMVd4=(yP6 znEMwIIh6YGrkL7sD6YM;;M5K=@6WjY2SW%Y;b7^e0k&2~;Ur)pPbv=ZGkSg*bs*bR zr*3MhORTC&i@#Z4zqnU--|8`(eKU^VG;Fy!;+r@9Q53Z-$hU*dXTq|U9<0-?1Iv>& iKWf^ubMpR!lvI6;>1s;*b3=DjSL74G){)!Z!1~E?;$B+p3w^JOs4jG8J{7>E69$uioVy(JB z)b~8CD|$8#;X&fDI|LjrhW+_G`9538O%5-%HXSD`{mUvMK=8$Qm5`LGuvBu$ZO#8q zH`2VcOQ!~@lqJO6PCa~*_r1ckkWJZT*KUfll&wDaa}M9}DeDZ{&B|;xd!MOfZurbP zS4C&3^`V<<54}m+#o%!3BU3`wy4;G>kAq`fz9clvW_qyU*3!csS*Z*wr5XHo?1~8L z7Tacgi~k<@Ob=`vj5Z^&GDOfT>!JI9|{liYXCE4x{6$URV>ZxO?R z80+>&HZuw&7T7T;@SPA@v|I3*?u+}(^BDxRrZr!)cd6a6_P%z5SF=jU-?bkW0D-;G aMQ&yOfH^|E(wl(6#^CAd=d#Wzp$Pz42a`1b diff --git a/P3D/Content/Textures/Battle/Status.png b/P3D/Content/Textures/Battle/Status.png deleted file mode 100644 index 731861d6cab922265c0be668ac8acf89420206bd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3682 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 diff --git a/P3D/Content/Textures/Battle/Water/Water.png b/P3D/Content/Textures/Battle/Water/Water.png deleted file mode 100644 index 4722e8b3dfb1099670f48729ff434e6b007c170b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 279 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sBugD~Uq{1quc!8M*Pjv*HQr4x7aHaPG&M^0Nfqy5>k1u4DF zE_+TG21NW2mR6aTDjmGBZ}X43Ilj#wl)T?6s`Bk)TP5>>p{390!fdluj2D>MPJG}N z&^2aAcd)Ip{1D1kAD4M*{ez3Mv`-ygaAtDSfp%$y!Y8R`A3S-QXe4mKNOI0cvxb!) zntn|Q{;e4QF+6NZ_>;PzFN|B7bn2Ct?T@Y9QT1|nu4^P)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D0nkZAK~y+TeUmXy z!cY{2F&ZZa;|~zy1cQ^m1R{f7Oz7A_X&0kzu<52h0T$E7g(eO(HZiYZ5F!hS3o$W~ zr9c=ccJX=7>w7{I@gyg&eZA-Fz2%WvCB5>vV^|Ikx_xe4I$Uo5ugPS>;rV;+xk za07mG=ZSj&VOhS=5xorsn&Ao~G#ZVLXS3O16h+xE{K^C35)kfo2WbexI+1C;j^p@% zbG{)T{fhQBtxNkGqTUaYcEH@yx*s|*;utOE!# z$jbRWo^yxqn$h$V+kXO-0niNjG4Z=AK)yNjVO0p2S^-toO^05V95T^Cu@>;0J^Ua) z=WT+J6=c~oreCbFXYz-2VZT;U8u4iYLO|G?$;Lp(~Ai( zAhT6~LM>p08XJ@??@P?DBs&n0vgr+S&SzVVBLLJk1>1P0!gQdrGM)$@GYI;ev3^XT zkiu`|7inCF^uLG^K0CMfWh^ZKU=*o!*(aw@dvuJ}WH~95`2p})2YX#!M0EfF002ov JPDHLkV1jst??M0o diff --git a/P3D/P3D.vbproj b/P3D/P3D.vbproj index dac21a01e..6edd1715b 100644 --- a/P3D/P3D.vbproj +++ b/P3D/P3D.vbproj @@ -26308,30 +26308,6 @@ PreserveNewest - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - PreserveNewest @@ -26341,15 +26317,6 @@ PreserveNewest - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - PreserveNewest @@ -30943,7 +30910,9 @@ false - + + + From 92fafb2d63cd106c53b3d878fdfbb96f99f1e06c Mon Sep 17 00:00:00 2001 From: JappaWakkaP3D <31563291+JappaWakka@users.noreply.github.com> Date: Tue, 28 Dec 2021 17:35:02 +0100 Subject: [PATCH 34/57] Fix Pound sound effect pointing towards the wrong location --- P3D/Pokemon/Attacks/Normal/Pound.vb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/P3D/Pokemon/Attacks/Normal/Pound.vb b/P3D/Pokemon/Attacks/Normal/Pound.vb index 8b4525c2b..5acd68c02 100644 --- a/P3D/Pokemon/Attacks/Normal/Pound.vb +++ b/P3D/Pokemon/Attacks/Normal/Pound.vb @@ -57,7 +57,7 @@ Public Overrides Sub InternalOpponentPokemonMoveAnimation(ByVal BattleScreen As BattleScreen, ByVal BattleFlip As Boolean, ByVal CurrentPokemon As Pokemon, ByVal CurrentEntity As NPC, ByVal CurrentModel As ModelEntity) Dim MoveAnimation As AnimationQueryObject = New AnimationQueryObject(CurrentEntity, BattleFlip) - MoveAnimation.AnimationPlaySound("Battle\Attacks\Pound", 0.5, 2.5) + MoveAnimation.AnimationPlaySound("Battle\Attacks\Normal\Pound", 0.5, 2.5) Dim PoundEntity = MoveAnimation.SpawnEntity(New Vector3(0, -0.2, 0), TextureManager.GetTexture("Textures\Battle\Normal\Pound"), New Vector3(0.5F), 1, 0, 3) MoveAnimation.AnimationFade(PoundEntity, True, 1.0F, False, 0.0F, 3, 0) BattleScreen.BattleQuery.Add(MoveAnimation) From 312e3ed934f821a6ef960c7fa42542e714453c17 Mon Sep 17 00:00:00 2001 From: JappaWakkaP3D <31563291+JappaWakka@users.noreply.github.com> Date: Tue, 28 Dec 2021 17:35:28 +0100 Subject: [PATCH 35/57] Added Wrap & Whirlpool Animations --- P3D/Battle/BattleSystemV2/Battle.vb | 50 ++++++++++++++++++ .../Sounds/Battle/Attacks/Normal/Wrap.wav | Bin 0 -> 243240 bytes .../Sounds/Battle/Attacks/Water/Whirlpool.wav | Bin 0 -> 560952 bytes P3D/Content/Textures/Battle/Normal/Wrap.png | Bin 0 -> 1192 bytes .../Textures/Battle/Water/Whirlpool.png | Bin 0 -> 1525 bytes P3D/P3D.vbproj | 12 +++++ P3D/Pokemon/Attacks/Normal/Wrap.vb | 13 +++++ P3D/Pokemon/Attacks/Water/Whirlpool.vb | 10 +++- 8 files changed, 84 insertions(+), 1 deletion(-) create mode 100644 P3D/Content/Sounds/Battle/Attacks/Normal/Wrap.wav create mode 100644 P3D/Content/Sounds/Battle/Attacks/Water/Whirlpool.wav create mode 100644 P3D/Content/Textures/Battle/Normal/Wrap.png create mode 100644 P3D/Content/Textures/Battle/Water/Whirlpool.png diff --git a/P3D/Battle/BattleSystemV2/Battle.vb b/P3D/Battle/BattleSystemV2/Battle.vb index 64673f565..a5b5d117b 100644 --- a/P3D/Battle/BattleSystemV2/Battle.vb +++ b/P3D/Battle/BattleSystemV2/Battle.vb @@ -5813,6 +5813,20 @@ multiHP = CInt(.OwnPokemon.MaxHP / 6) End If End If + 'Wrap Animation + If Core.Player.ShowBattleAnimations <> 0 Then + ChangeCameraAngle(1, True, BattleScreen) + Dim WrapAnimation As AnimationQueryObject = New AnimationQueryObject(.OwnPokemonNPC, False) + WrapAnimation.AnimationPlaySound("Battle\Attacks\Normal\Wrap", 5.0F, 0) + Dim WrapEntity = WrapAnimation.SpawnEntity(New Vector3(0, -0.2, 0), TextureManager.GetTexture("Textures\Battle\Normal\Wrap", New Rectangle(0, 0, 64, 32), ""), New Vector3(1.0F, 0.5F, 1.0F), 1, 0, 1) + WrapAnimation.AnimationChangeTexture(WrapEntity, False, TextureManager.GetTexture("Textures\Battle\Normal\Wrap", New Rectangle(0, 32, 64, 32), ""), 1, 1) + WrapAnimation.AnimationChangeTexture(WrapEntity, False, TextureManager.GetTexture("Textures\Battle\Normal\Wrap", New Rectangle(0, 64, 64, 32), ""), 2, 1) + WrapAnimation.AnimationChangeTexture(WrapEntity, False, TextureManager.GetTexture("Textures\Battle\Normal\Wrap", New Rectangle(0, 96, 64, 32), ""), 3, 2) + WrapAnimation.AnimationScale(WrapEntity, False, False, 0.75F, 0.5F, 0.75F, 0.02F, 5, 0) + WrapAnimation.AnimationScale(WrapEntity, False, True, 1.0F, 0.5F, 1.0F, 0.04F, 7, 0) + WrapAnimation.AnimationScale(WrapEntity, True, False, 0.75F, 0.5F, 0.75F, 0.02F, 9, 1) + BattleScreen.BattleQuery.Add(WrapAnimation) + End If ReduceHP(multiHP, True, False, BattleScreen, .OwnPokemon.GetDisplayName() & " is hurt by Wrap!", "wrap") End If End If @@ -5827,6 +5841,17 @@ multiHP = CInt(.OwnPokemon.MaxHP / 6) End If End If + 'Whirlpool Animation + If Core.Player.ShowBattleAnimations <> 0 Then + ChangeCameraAngle(1, True, BattleScreen) + Dim WhirlpoolAnimation As AnimationQueryObject = New AnimationQueryObject(.OwnPokemonNPC, False) + WhirlpoolAnimation.AnimationPlaySound("Battle\Attacks\Water\Whirlpool", 0.0F, 0) + Dim WhirlpoolEntity As Entity = WhirlpoolAnimation.SpawnEntity(New Vector3(0), TextureManager.GetTexture("Textures\Battle\Water\Whirlpool"), New Vector3(0.0F), 1.0F, 0.0F, 0.0F) + WhirlpoolAnimation.AnimationRotate(WhirlpoolEntity, False, 0, 0, 0.2F, 0, 0, 10.0F, 0.0F, 0.0F, False, False, True, True) + WhirlpoolAnimation.AnimationScale(WhirlpoolEntity, False, True, 1.0F, 1.0F, 1.0F, 0.025F, 0.0F, 0.0F) + WhirlpoolAnimation.AnimationScale(WhirlpoolEntity, True, False, 0.0F, 0.0F, 0.0F, 0.025F, 5.0F, 0.0F) + BattleScreen.BattleQuery.Add(WhirlpoolAnimation) + End If ReduceHP(multiHP, True, False, BattleScreen, .OwnPokemon.GetDisplayName() & " is hurt by Whirlpool!", "whirlpool") End If End If @@ -6623,6 +6648,20 @@ multiHP = CInt(.OppPokemon.MaxHP / 6) End If End If + 'Wrap Animation + If Core.Player.ShowBattleAnimations <> 0 Then + ChangeCameraAngle(1, False, BattleScreen) + Dim WrapAnimation As AnimationQueryObject = New AnimationQueryObject(.OppPokemonNPC, True) + WrapAnimation.AnimationPlaySound("Battle\Attacks\Normal\Wrap", 5.0F, 0) + Dim WrapEntity = WrapAnimation.SpawnEntity(New Vector3(0, -0.2, 0), TextureManager.GetTexture("Textures\Battle\Normal\Wrap", New Rectangle(0, 0, 64, 32), ""), New Vector3(1.0F, 0.5F, 1.0F), 1, 0, 1) + WrapAnimation.AnimationChangeTexture(WrapEntity, False, TextureManager.GetTexture("Textures\Battle\Normal\Wrap", New Rectangle(0, 32, 64, 32), ""), 1, 1) + WrapAnimation.AnimationChangeTexture(WrapEntity, False, TextureManager.GetTexture("Textures\Battle\Normal\Wrap", New Rectangle(0, 64, 64, 32), ""), 2, 1) + WrapAnimation.AnimationChangeTexture(WrapEntity, False, TextureManager.GetTexture("Textures\Battle\Normal\Wrap", New Rectangle(0, 96, 64, 32), ""), 3, 2) + WrapAnimation.AnimationScale(WrapEntity, False, False, 0.75F, 0.5F, 0.75F, 0.02F, 5, 0) + WrapAnimation.AnimationScale(WrapEntity, False, True, 1.0F, 0.5F, 1.0F, 0.04F, 7, 0) + WrapAnimation.AnimationScale(WrapEntity, True, False, 0.75F, 0.5F, 0.75F, 0.02F, 9, 1) + BattleScreen.BattleQuery.Add(WrapAnimation) + End If ReduceHP(multiHP, False, True, BattleScreen, .OppPokemon.GetDisplayName() & " is hurt by Wrap!", "wrap") End If End If @@ -6637,6 +6676,17 @@ multiHP = CInt(.OppPokemon.MaxHP / 6) End If End If + 'Whirlpool Animation + If Core.Player.ShowBattleAnimations <> 0 Then + ChangeCameraAngle(1, False, BattleScreen) + Dim WhirlpoolAnimation As AnimationQueryObject = New AnimationQueryObject(.OppPokemonNPC, True) + WhirlpoolAnimation.AnimationPlaySound("Battle\Attacks\Water\Whirlpool", 0.0F, 0) + Dim WhirlpoolEntity As Entity = WhirlpoolAnimation.SpawnEntity(New Vector3(0), TextureManager.GetTexture("Textures\Battle\Water\Whirlpool"), New Vector3(0.0F), 1.0F, 0.0F, 0.0F) + WhirlpoolAnimation.AnimationRotate(WhirlpoolEntity, False, 0, 0, 0.2F, 0, 0, 10.0F, 0.0F, 0.0F, False, False, True, True) + WhirlpoolAnimation.AnimationScale(WhirlpoolEntity, False, True, 1.0F, 1.0F, 1.0F, 0.025F, 0.0F, 0.0F) + WhirlpoolAnimation.AnimationScale(WhirlpoolEntity, True, False, 0.0F, 0.0F, 0.0F, 0.025F, 5.0F, 0.0F) + BattleScreen.BattleQuery.Add(WhirlpoolAnimation) + End If ReduceHP(multiHP, False, True, BattleScreen, .OppPokemon.GetDisplayName() & " is hurt by Whirlpool!", "whirlpool") End If End If diff --git a/P3D/Content/Sounds/Battle/Attacks/Normal/Wrap.wav b/P3D/Content/Sounds/Battle/Attacks/Normal/Wrap.wav new file mode 100644 index 0000000000000000000000000000000000000000..aac7fa92affa59206d3c61594a9c359fef92662b GIT binary patch literal 243240 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 BM6v(? literal 0 HcmV?d00001 diff --git a/P3D/Content/Sounds/Battle/Attacks/Water/Whirlpool.wav b/P3D/Content/Sounds/Battle/Attacks/Water/Whirlpool.wav new file mode 100644 index 0000000000000000000000000000000000000000..de5b37b3be7231814a5e6877b4931c4a8b302930 GIT binary patch literal 560952 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 z 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 b<4*Vo^IjO63>%v*00000NkvXXu0mjf-|5Ht literal 0 HcmV?d00001 diff --git a/P3D/P3D.vbproj b/P3D/P3D.vbproj index 6edd1715b..35f36949b 100644 --- a/P3D/P3D.vbproj +++ b/P3D/P3D.vbproj @@ -14689,12 +14689,18 @@ PreserveNewest + + PreserveNewest + PreserveNewest PreserveNewest + + PreserveNewest + PreserveNewest @@ -14722,6 +14728,9 @@ PreserveNewest + + PreserveNewest + PreserveNewest @@ -15442,6 +15451,9 @@ PreserveNewest + + PreserveNewest + PreserveNewest diff --git a/P3D/Pokemon/Attacks/Normal/Wrap.vb b/P3D/Pokemon/Attacks/Normal/Wrap.vb index 199cc4c64..bea93d4e8 100644 --- a/P3D/Pokemon/Attacks/Normal/Wrap.vb +++ b/P3D/Pokemon/Attacks/Normal/Wrap.vb @@ -87,6 +87,19 @@ End If End Sub + Public Overrides Sub InternalOpponentPokemonMoveAnimation(ByVal BattleScreen As BattleScreen, ByVal BattleFlip As Boolean, ByVal CurrentPokemon As Pokemon, ByVal CurrentEntity As NPC, ByVal CurrentModel As ModelEntity) + Dim MoveAnimation As AnimationQueryObject = New AnimationQueryObject(CurrentEntity, BattleFlip) + MoveAnimation.AnimationPlaySound("Battle\Attacks\Normal\Wrap", 5.0F, 0) + Dim WrapEntity = MoveAnimation.SpawnEntity(New Vector3(0, -0.2, 0), TextureManager.GetTexture("Textures\Battle\Normal\Wrap", New Rectangle(0, 0, 64, 32), ""), New Vector3(1.0F, 0.5F, 1.0F), 1, 0, 1) + MoveAnimation.AnimationChangeTexture(WrapEntity, False, TextureManager.GetTexture("Textures\Battle\Normal\Wrap", New Rectangle(0, 32, 64, 32), ""), 1, 1) + MoveAnimation.AnimationChangeTexture(WrapEntity, False, TextureManager.GetTexture("Textures\Battle\Normal\Wrap", New Rectangle(0, 64, 64, 32), ""), 2, 1) + MoveAnimation.AnimationChangeTexture(WrapEntity, False, TextureManager.GetTexture("Textures\Battle\Normal\Wrap", New Rectangle(0, 96, 64, 32), ""), 3, 2) + MoveAnimation.AnimationScale(WrapEntity, False, False, 0.75F, 0.5F, 0.75F, 0.02F, 5, 0) + MoveAnimation.AnimationScale(WrapEntity, False, True, 1.0F, 0.5F, 1.0F, 0.04F, 7, 0) + MoveAnimation.AnimationScale(WrapEntity, True, False, 0.75F, 0.5F, 0.75F, 0.02F, 9, 1) + BattleScreen.BattleQuery.Add(MoveAnimation) + End Sub + End Class End Namespace \ No newline at end of file diff --git a/P3D/Pokemon/Attacks/Water/Whirlpool.vb b/P3D/Pokemon/Attacks/Water/Whirlpool.vb index d40914b55..e603e4011 100644 --- a/P3D/Pokemon/Attacks/Water/Whirlpool.vb +++ b/P3D/Pokemon/Attacks/Water/Whirlpool.vb @@ -99,7 +99,15 @@ Namespace BattleSystem.Moves.Water End If End If End Sub - + Public Overrides Sub InternalOpponentPokemonMoveAnimation(ByVal BattleScreen As BattleScreen, ByVal BattleFlip As Boolean, ByVal CurrentPokemon As Pokemon, ByVal CurrentEntity As NPC, ByVal CurrentModel As ModelEntity) + Dim MoveAnimation As AnimationQueryObject = New AnimationQueryObject(CurrentEntity, BattleFlip) + MoveAnimation.AnimationPlaySound("Battle\Attacks\Water\Whirlpool", 0.0F, 0) + Dim WhirlpoolEntity As Entity = MoveAnimation.SpawnEntity(New Vector3(0), TextureManager.GetTexture("Textures\Battle\Water\Whirlpool"), New Vector3(0.0F), 1.0F, 0.0F, 0.0F) + MoveAnimation.AnimationRotate(WhirlpoolEntity, False, 0, 0, 0.2F, 0, 0, 10.0F, 0.0F, 0.0F, False, False, True, True) + MoveAnimation.AnimationScale(WhirlpoolEntity, False, True, 1.0F, 1.0F, 1.0F, 0.025F, 0.0F, 0.0F) + MoveAnimation.AnimationScale(WhirlpoolEntity, True, False, 0.0F, 0.0F, 0.0F, 0.025F, 5.0F, 0.0F) + BattleScreen.BattleQuery.Add(MoveAnimation) + End Sub End Class End Namespace \ No newline at end of file From 31e00f72d6e066db8b3e13e9d152bd478285fdab Mon Sep 17 00:00:00 2001 From: JappaWakka Date: Thu, 30 Dec 2021 21:53:17 +0100 Subject: [PATCH 36/57] Directional light color at night is now neutral and more subtle --- P3D/World/Lighting.vb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/P3D/World/Lighting.vb b/P3D/World/Lighting.vb index 951024204..afbf03a6e 100644 --- a/P3D/World/Lighting.vb +++ b/P3D/World/Lighting.vb @@ -48,7 +48,7 @@ Public Class Lighting Case 0 ' Night refEffect.AmbientLightColor = New Vector3(0.8F) - refEffect.DirectionalLight0.DiffuseColor = New Vector3(-0.4F, -0.4F, -0.6F) + refEffect.DirectionalLight0.DiffuseColor = New Vector3(-0.2F) refEffect.DirectionalLight0.Direction = Vector3.Normalize(New Vector3(-1.0F, 0.0F, 1.0F)) refEffect.DirectionalLight0.SpecularColor = New Vector3(0.0F) refEffect.DirectionalLight0.Enabled = True From 35aa80b072850ed1ddb89122c565b02eea35ca76 Mon Sep 17 00:00:00 2001 From: JappaWakka Date: Thu, 30 Dec 2021 21:53:57 +0100 Subject: [PATCH 37/57] =?UTF-8?q?Improved=20Whirlpool=20Animation=20+=20Fi?= =?UTF-8?q?xed=20BattleAnimations=20drawn=20behind=20Pok=C3=A9mon?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- P3D/Battle/BattleSystemV2/Battle.vb | 10 ++++--- P3D/Battle/BattleSystemV2/BattleScreen.vb | 33 +++++++++++++++++++---- P3D/Pokemon/Attacks/Water/Whirlpool.vb | 5 ++-- 3 files changed, 37 insertions(+), 11 deletions(-) diff --git a/P3D/Battle/BattleSystemV2/Battle.vb b/P3D/Battle/BattleSystemV2/Battle.vb index a5b5d117b..85b8faab5 100644 --- a/P3D/Battle/BattleSystemV2/Battle.vb +++ b/P3D/Battle/BattleSystemV2/Battle.vb @@ -5844,9 +5844,10 @@ 'Whirlpool Animation If Core.Player.ShowBattleAnimations <> 0 Then ChangeCameraAngle(1, True, BattleScreen) - Dim WhirlpoolAnimation As AnimationQueryObject = New AnimationQueryObject(.OwnPokemonNPC, False) + Dim WhirlpoolAnimation As AnimationQueryObject = New AnimationQueryObject(.OwnPokemonNPC, False,, True) WhirlpoolAnimation.AnimationPlaySound("Battle\Attacks\Water\Whirlpool", 0.0F, 0) - Dim WhirlpoolEntity As Entity = WhirlpoolAnimation.SpawnEntity(New Vector3(0), TextureManager.GetTexture("Textures\Battle\Water\Whirlpool"), New Vector3(0.0F), 1.0F, 0.0F, 0.0F) + Dim WhirlpoolEntity As Entity = WhirlpoolAnimation.SpawnEntity(New Vector3(0, -0.3, 0), TextureManager.GetTexture("Textures\Battle\Water\Whirlpool"), New Vector3(0.0F), 1.0F, 0.0F, 0.0F) + WhirlpoolAnimation.AnimationRotate(WhirlpoolEntity, False, 4.71F, 0, 0, 4.71F, 0, 0, 0, 0, True, False, False, False) WhirlpoolAnimation.AnimationRotate(WhirlpoolEntity, False, 0, 0, 0.2F, 0, 0, 10.0F, 0.0F, 0.0F, False, False, True, True) WhirlpoolAnimation.AnimationScale(WhirlpoolEntity, False, True, 1.0F, 1.0F, 1.0F, 0.025F, 0.0F, 0.0F) WhirlpoolAnimation.AnimationScale(WhirlpoolEntity, True, False, 0.0F, 0.0F, 0.0F, 0.025F, 5.0F, 0.0F) @@ -6679,9 +6680,10 @@ 'Whirlpool Animation If Core.Player.ShowBattleAnimations <> 0 Then ChangeCameraAngle(1, False, BattleScreen) - Dim WhirlpoolAnimation As AnimationQueryObject = New AnimationQueryObject(.OppPokemonNPC, True) + Dim WhirlpoolAnimation As AnimationQueryObject = New AnimationQueryObject(.OppPokemonNPC, True,, True) WhirlpoolAnimation.AnimationPlaySound("Battle\Attacks\Water\Whirlpool", 0.0F, 0) - Dim WhirlpoolEntity As Entity = WhirlpoolAnimation.SpawnEntity(New Vector3(0), TextureManager.GetTexture("Textures\Battle\Water\Whirlpool"), New Vector3(0.0F), 1.0F, 0.0F, 0.0F) + Dim WhirlpoolEntity As Entity = WhirlpoolAnimation.SpawnEntity(New Vector3(0, -0.3, 0), TextureManager.GetTexture("Textures\Battle\Water\Whirlpool"), New Vector3(0.0F), 1.0F, 0.0F, 0.0F) + WhirlpoolAnimation.AnimationRotate(WhirlpoolEntity, False, 4.71F, 0, 0, 4.71F, 0, 0, 0, 0, True, False, False, False) WhirlpoolAnimation.AnimationRotate(WhirlpoolEntity, False, 0, 0, 0.2F, 0, 0, 10.0F, 0.0F, 0.0F, False, False, True, True) WhirlpoolAnimation.AnimationScale(WhirlpoolEntity, False, True, 1.0F, 1.0F, 1.0F, 0.025F, 0.0F, 0.0F) WhirlpoolAnimation.AnimationScale(WhirlpoolEntity, True, False, 0.0F, 0.0F, 0.0F, 0.025F, 5.0F, 0.0F) diff --git a/P3D/Battle/BattleSystemV2/BattleScreen.vb b/P3D/Battle/BattleSystemV2/BattleScreen.vb index 2dbd82486..7786494ce 100644 --- a/P3D/Battle/BattleSystemV2/BattleScreen.vb +++ b/P3D/Battle/BattleSystemV2/BattleScreen.vb @@ -875,7 +875,7 @@ If ForegroundEntities.Count > 0 Then ForegroundEntities = (From f In ForegroundEntities Order By f.CameraDistance Descending).ToList() End If - Level.Draw() + Level.Draw() World.DrawWeather(Screen.Level.World.CurrentMapWeather) @@ -890,6 +890,7 @@ End If Dim ForegroundAnimationList As New List(Of AnimationQueryObject) + Dim BackgroundAnimationList As New List(Of AnimationQueryObject) If BattleQuery.Count > 0 Then Dim cIndex As Integer = 0 Dim cQuery As New List(Of QueryObject) @@ -898,7 +899,9 @@ nextIndex: Dim cQueryObject As QueryObject = BattleQuery(cIndex) If cQueryObject.QueryType = QueryObject.QueryTypes.MoveAnimation Then If CType(cQueryObject, AnimationQueryObject).DrawBeforeEntities = True Then - cQuery.Add(cQueryObject) + BackgroundAnimationList.Add(CType(cQueryObject, AnimationQueryObject)) + cIndex += 1 + GoTo nextIndex Else ForegroundAnimationList.Add(CType(cQueryObject, AnimationQueryObject)) cIndex += 1 @@ -915,19 +918,39 @@ nextIndex: End If End If + cQuery.Reverse() + If cQuery.Count > 0 Then + For Each cQueryObject As QueryObject In cQuery + cQueryObject.Draw(Me) + Next + End If + End If + If BackgroundAnimationList.Count > 0 Then + Dim cIndex As Integer = 0 + Dim cQuery As New List(Of QueryObject) +nextIndexBackground: + If BackgroundAnimationList.Count > cIndex Then + Dim cQueryObject As QueryObject = BackgroundAnimationList(cIndex) + cQuery.Add(cQueryObject) + + If cQueryObject.PassThis = True Then + cIndex += 1 + GoTo nextIndexBackground + End If + End If + cQuery.Reverse() For Each cQueryObject As QueryObject In cQuery cQueryObject.Draw(Me) Next - End If - If ForegroundAnimationList.Count > 0 Then For i = 0 To ForegroundEntities.Count - 1 ForegroundEntities(i).Render() DebugDisplay.MaxVertices += ForegroundEntities(i).VertexCount Next - + End If + If ForegroundAnimationList.Count > 0 Then Dim cIndex As Integer = 0 Dim cQuery As New List(Of QueryObject) nextIndexForeground: diff --git a/P3D/Pokemon/Attacks/Water/Whirlpool.vb b/P3D/Pokemon/Attacks/Water/Whirlpool.vb index e603e4011..f6f10666b 100644 --- a/P3D/Pokemon/Attacks/Water/Whirlpool.vb +++ b/P3D/Pokemon/Attacks/Water/Whirlpool.vb @@ -100,9 +100,10 @@ Namespace BattleSystem.Moves.Water End If End Sub Public Overrides Sub InternalOpponentPokemonMoveAnimation(ByVal BattleScreen As BattleScreen, ByVal BattleFlip As Boolean, ByVal CurrentPokemon As Pokemon, ByVal CurrentEntity As NPC, ByVal CurrentModel As ModelEntity) - Dim MoveAnimation As AnimationQueryObject = New AnimationQueryObject(CurrentEntity, BattleFlip) + Dim MoveAnimation As AnimationQueryObject = New AnimationQueryObject(CurrentEntity, BattleFlip,, True) MoveAnimation.AnimationPlaySound("Battle\Attacks\Water\Whirlpool", 0.0F, 0) - Dim WhirlpoolEntity As Entity = MoveAnimation.SpawnEntity(New Vector3(0), TextureManager.GetTexture("Textures\Battle\Water\Whirlpool"), New Vector3(0.0F), 1.0F, 0.0F, 0.0F) + Dim WhirlpoolEntity As Entity = MoveAnimation.SpawnEntity(New Vector3(0, -0.3F, 0), TextureManager.GetTexture("Textures\Battle\Water\Whirlpool"), New Vector3(0.0F), 1.0F, 0.0F, 0.0F) + MoveAnimation.AnimationRotate(WhirlpoolEntity, False, 4.71F, 0, 0, 4.71F, 0, 0, 0, 0, True, False, False, False) MoveAnimation.AnimationRotate(WhirlpoolEntity, False, 0, 0, 0.2F, 0, 0, 10.0F, 0.0F, 0.0F, False, False, True, True) MoveAnimation.AnimationScale(WhirlpoolEntity, False, True, 1.0F, 1.0F, 1.0F, 0.025F, 0.0F, 0.0F) MoveAnimation.AnimationScale(WhirlpoolEntity, True, False, 0.0F, 0.0F, 0.0F, 0.025F, 5.0F, 0.0F) From 38f2f0c0f4ea708cb0d35c6aac87ff378ca13aa7 Mon Sep 17 00:00:00 2001 From: JappaWakka Date: Sun, 2 Jan 2022 22:25:26 +0100 Subject: [PATCH 38/57] Made the light color more neutral --- P3D/World/SkyDome.vb | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/P3D/World/SkyDome.vb b/P3D/World/SkyDome.vb index 50f5a879d..9a9a7ecf5 100644 --- a/P3D/World/SkyDome.vb +++ b/P3D/World/SkyDome.vb @@ -148,13 +148,13 @@ End If Select Case Screen.Level.DayTime Case 1 - Return New Color(48, 200, 248) + Return New Color(128, 128, 128) Case 2 - Return New Color(40, 88, 136) + Return New Color(128, 128, 128) Case 3 - Return New Color(168, 224, 248) + Return New Color(128, 128, 128) Case 4 - Return New Color(192, 152, 184) + Return New Color(128, 128, 128) End Select End If End Function From ffaf50178c4e26e299bcd265a93f0ef7e3a31463 Mon Sep 17 00:00:00 2001 From: JappaWakka Date: Tue, 4 Jan 2022 22:04:14 +0100 Subject: [PATCH 39/57] Revert "Made the light color more neutral" This reverts commit 38f2f0c0f4ea708cb0d35c6aac87ff378ca13aa7. --- P3D/World/SkyDome.vb | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/P3D/World/SkyDome.vb b/P3D/World/SkyDome.vb index 9a9a7ecf5..50f5a879d 100644 --- a/P3D/World/SkyDome.vb +++ b/P3D/World/SkyDome.vb @@ -148,13 +148,13 @@ End If Select Case Screen.Level.DayTime Case 1 - Return New Color(128, 128, 128) + Return New Color(48, 200, 248) Case 2 - Return New Color(128, 128, 128) + Return New Color(40, 88, 136) Case 3 - Return New Color(128, 128, 128) + Return New Color(168, 224, 248) Case 4 - Return New Color(128, 128, 128) + Return New Color(192, 152, 184) End Select End If End Function From 35fb69b5fd38174cbfa70a56356adc0316048765 Mon Sep 17 00:00:00 2001 From: JappaWakka Date: Tue, 4 Jan 2022 22:37:26 +0100 Subject: [PATCH 40/57] Made the fog colors for outside more neutral --- P3D/World/World.vb | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/P3D/World/World.vb b/P3D/World/World.vb index 39a864436..a4e984d02 100644 --- a/P3D/World/World.vb +++ b/P3D/World/World.vb @@ -584,8 +584,19 @@ endsub: Private Sub ChangeEnvironment() Select Case Me.EnvironmentType Case EnvironmentTypes.Outside + Dim _fogColor As Color + Select Case Screen.Level.DayTime + Case 1 + _fogColor = New Color(192, 192, 192) + Case 2 + _fogColor = New Color(64, 64, 64) + Case 3 + _fogColor = New Color(192, 192, 192) + Case 4 + _fogColor = New Color(64, 64, 64) + End Select Core.BackgroundColor = GetWeatherBackgroundColor(SkyDome.GetDaytimeColor(False)) - Screen.Effect.FogColor = Core.BackgroundColor.ToVector3() + Screen.Effect.FogColor = _fogColor.ToVector3() Screen.SkyDome.TextureDown = TextureManager.GetTexture("SkyDomeResource\Stars") Case EnvironmentTypes.Inside Core.BackgroundColor = New Color(57, 57, 57) From ae6141b1396ff84904014ec31669706a807e8e79 Mon Sep 17 00:00:00 2001 From: JappaWakka Date: Tue, 4 Jan 2022 22:43:22 +0100 Subject: [PATCH 41/57] Made day and morning fog color slightly darker --- P3D/World/World.vb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/P3D/World/World.vb b/P3D/World/World.vb index a4e984d02..4c181068f 100644 --- a/P3D/World/World.vb +++ b/P3D/World/World.vb @@ -587,11 +587,11 @@ endsub: Dim _fogColor As Color Select Case Screen.Level.DayTime Case 1 - _fogColor = New Color(192, 192, 192) + _fogColor = New Color(168, 168, 168) Case 2 _fogColor = New Color(64, 64, 64) Case 3 - _fogColor = New Color(192, 192, 192) + _fogColor = New Color(168, 168, 168) Case 4 _fogColor = New Color(64, 64, 64) End Select From 6681a75601c87b1c8c36355a6c42314bd7e70961 Mon Sep 17 00:00:00 2001 From: JappaWakka Date: Thu, 6 Jan 2022 12:31:46 +0100 Subject: [PATCH 42/57] Whirlpool animation now uses 1.5 * MathHelper.PI instead of 4.71F --- P3D/Battle/BattleSystemV2/Battle.vb | 4 ++-- P3D/Pokemon/Attacks/Water/Whirlpool.vb | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/P3D/Battle/BattleSystemV2/Battle.vb b/P3D/Battle/BattleSystemV2/Battle.vb index 85b8faab5..25163d4ef 100644 --- a/P3D/Battle/BattleSystemV2/Battle.vb +++ b/P3D/Battle/BattleSystemV2/Battle.vb @@ -5847,7 +5847,7 @@ Dim WhirlpoolAnimation As AnimationQueryObject = New AnimationQueryObject(.OwnPokemonNPC, False,, True) WhirlpoolAnimation.AnimationPlaySound("Battle\Attacks\Water\Whirlpool", 0.0F, 0) Dim WhirlpoolEntity As Entity = WhirlpoolAnimation.SpawnEntity(New Vector3(0, -0.3, 0), TextureManager.GetTexture("Textures\Battle\Water\Whirlpool"), New Vector3(0.0F), 1.0F, 0.0F, 0.0F) - WhirlpoolAnimation.AnimationRotate(WhirlpoolEntity, False, 4.71F, 0, 0, 4.71F, 0, 0, 0, 0, True, False, False, False) + WhirlpoolAnimation.AnimationRotate(WhirlpoolEntity, False, CSng(MathHelper.Pi * 1.5), 0, 0, CSng(MathHelper.Pi * 1.5), 0, 0, 0, 0, True, False, False, False) WhirlpoolAnimation.AnimationRotate(WhirlpoolEntity, False, 0, 0, 0.2F, 0, 0, 10.0F, 0.0F, 0.0F, False, False, True, True) WhirlpoolAnimation.AnimationScale(WhirlpoolEntity, False, True, 1.0F, 1.0F, 1.0F, 0.025F, 0.0F, 0.0F) WhirlpoolAnimation.AnimationScale(WhirlpoolEntity, True, False, 0.0F, 0.0F, 0.0F, 0.025F, 5.0F, 0.0F) @@ -6683,7 +6683,7 @@ Dim WhirlpoolAnimation As AnimationQueryObject = New AnimationQueryObject(.OppPokemonNPC, True,, True) WhirlpoolAnimation.AnimationPlaySound("Battle\Attacks\Water\Whirlpool", 0.0F, 0) Dim WhirlpoolEntity As Entity = WhirlpoolAnimation.SpawnEntity(New Vector3(0, -0.3, 0), TextureManager.GetTexture("Textures\Battle\Water\Whirlpool"), New Vector3(0.0F), 1.0F, 0.0F, 0.0F) - WhirlpoolAnimation.AnimationRotate(WhirlpoolEntity, False, 4.71F, 0, 0, 4.71F, 0, 0, 0, 0, True, False, False, False) + WhirlpoolAnimation.AnimationRotate(WhirlpoolEntity, False, CSng(MathHelper.Pi * 1.5), 0, 0, CSng(MathHelper.Pi * 1.5), 0, 0, 0, 0, True, False, False, False) WhirlpoolAnimation.AnimationRotate(WhirlpoolEntity, False, 0, 0, 0.2F, 0, 0, 10.0F, 0.0F, 0.0F, False, False, True, True) WhirlpoolAnimation.AnimationScale(WhirlpoolEntity, False, True, 1.0F, 1.0F, 1.0F, 0.025F, 0.0F, 0.0F) WhirlpoolAnimation.AnimationScale(WhirlpoolEntity, True, False, 0.0F, 0.0F, 0.0F, 0.025F, 5.0F, 0.0F) diff --git a/P3D/Pokemon/Attacks/Water/Whirlpool.vb b/P3D/Pokemon/Attacks/Water/Whirlpool.vb index f6f10666b..88fed6eee 100644 --- a/P3D/Pokemon/Attacks/Water/Whirlpool.vb +++ b/P3D/Pokemon/Attacks/Water/Whirlpool.vb @@ -103,7 +103,7 @@ Namespace BattleSystem.Moves.Water Dim MoveAnimation As AnimationQueryObject = New AnimationQueryObject(CurrentEntity, BattleFlip,, True) MoveAnimation.AnimationPlaySound("Battle\Attacks\Water\Whirlpool", 0.0F, 0) Dim WhirlpoolEntity As Entity = MoveAnimation.SpawnEntity(New Vector3(0, -0.3F, 0), TextureManager.GetTexture("Textures\Battle\Water\Whirlpool"), New Vector3(0.0F), 1.0F, 0.0F, 0.0F) - MoveAnimation.AnimationRotate(WhirlpoolEntity, False, 4.71F, 0, 0, 4.71F, 0, 0, 0, 0, True, False, False, False) + MoveAnimation.AnimationRotate(WhirlpoolEntity, False, CSng(MathHelper.Pi * 1.5), 0, 0, CSng(MathHelper.Pi * 1.5), 0, 0, 0, 0, True, False, False, False) MoveAnimation.AnimationRotate(WhirlpoolEntity, False, 0, 0, 0.2F, 0, 0, 10.0F, 0.0F, 0.0F, False, False, True, True) MoveAnimation.AnimationScale(WhirlpoolEntity, False, True, 1.0F, 1.0F, 1.0F, 0.025F, 0.0F, 0.0F) MoveAnimation.AnimationScale(WhirlpoolEntity, True, False, 0.0F, 0.0F, 0.0F, 0.025F, 5.0F, 0.0F) From 1a1c8f209f5839d071dd0f8c8c0ee0800eb1d60f Mon Sep 17 00:00:00 2001 From: JappaWakka Date: Thu, 6 Jan 2022 12:32:52 +0100 Subject: [PATCH 43/57] =?UTF-8?q?Improved=20wild=20Pok=C3=A9mon=20encounte?= =?UTF-8?q?r=20rate?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Caves and water get a minimum value of 15 - Grass gets a minimum value of 25 - There's an encounter multiplier of 1 by default that gets modified by various abilities If you run, the encounter multiplier is multiplied by 1.5 Then, a random number is generated from 0-255 If the random number is below the minimum value multiplied by the encounter multiplier, a wild pokémon appears --- P3D/World/PokemonEncounter.vb | 30 ++++++++++++++++++++---------- 1 file changed, 20 insertions(+), 10 deletions(-) diff --git a/P3D/World/PokemonEncounter.vb b/P3D/World/PokemonEncounter.vb index 28f6b9664..26e8eb4e8 100644 --- a/P3D/World/PokemonEncounter.vb +++ b/P3D/World/PokemonEncounter.vb @@ -40,22 +40,32 @@ Public Class PokemonEncounter End If If System.IO.File.Exists(GameModeManager.GetPokeFilePath(pokeFile)) = True Then ' Only try to register a wild battle if the .poke file exists: - Dim startRandomValue As Integer = 12 - Dim minRandomValue As Integer = 5 - + Dim encounterRate As Single = 1.0F + Dim minTileValue As Integer + Select Case Method + Case Spawner.EncounterMethods.Land + If Screen.Level.WildPokemonFloor = True And Screen.Level.Surfing = False Then + minTileValue = 15 + Else + minTileValue = 25 + End If + Case Spawner.EncounterMethods.Surfing + minTileValue = 15 + End Select + If Core.Player.IsRunning = True Then + encounterRate *= 1.5F + End If If Core.Player.Pokemons.Count > 0 Then Dim p As Pokemon = Core.Player.Pokemons(0) ' Arena Trap/Illuminate/No Guard/Swarm Ability: If p.Ability.Name.ToLower() = "arena trap" Or p.Ability.Name.ToLower() = "illuminate" Or p.Ability.Name.ToLower() = "no guard" Or p.Ability.Name.ToLower() = "swarm" Then - startRandomValue = 6 - minRandomValue = 3 + encounterRate *= 2.0F End If ' Intimidate/Keen Eye/Quick Feet/Stench/White Smoke Ability: If p.Ability.Name.ToLower() = "intimidate" Or p.Ability.Name.ToLower() = "keen eye" Or p.Ability.Name.ToLower() = "quick feet" Or p.Ability.Name.ToLower() = "stench" Or p.Ability.Name.ToLower() = "white smoke" Then - startRandomValue = 24 - minRandomValue = 10 + encounterRate *= 0.5F End If 'Sand Veil Ability: @@ -76,10 +86,10 @@ Public Class PokemonEncounter End If ' Determine if the wild Pokémon will be met or not: - Dim randomValue As Integer = startRandomValue - .WalkedSteps - randomValue = CInt(MathHelper.Clamp(randomValue, minRandomValue, startRandomValue)) + Dim minEncounterValue As Integer = CInt(encounterRate * minTileValue) + Dim randomValue As Integer = Core.Random.Next(0, 255) - If Core.Random.Next(0, randomValue * 2) = 0 Then + If randomValue <= minEncounterValue Then ' Don't encounter a Pokémon if the left control key is held down, for Debug or Sandbox Mode: If GameController.IS_DEBUG_ACTIVE = True Or Core.Player.SandBoxMode = True Then If KeyBoardHandler.KeyDown(Keys.LeftControl) = True Then From fccb4ef5b5ea197e567ee8a6747f3f7ac4cac0fe Mon Sep 17 00:00:00 2001 From: JappaWakka Date: Fri, 7 Jan 2022 12:29:11 +0100 Subject: [PATCH 44/57] Improved fog colors --- P3D/World/World.vb | 35 +++++++++++++++++++++-------------- 1 file changed, 21 insertions(+), 14 deletions(-) diff --git a/P3D/World/World.vb b/P3D/World/World.vb index 4c181068f..f44a554fe 100644 --- a/P3D/World/World.vb +++ b/P3D/World/World.vb @@ -562,19 +562,19 @@ endsub: Case World.Weathers.Clear, Weathers.Sunny v = New Vector3(1) Case World.Weathers.Rain, Weathers.Thunderstorm - v = New Vector3(0.4, 0.4, 0.7) + v = New Vector3(0.7) Case World.Weathers.Snow v = New Vector3(0.8) Case World.Weathers.Underwater v = New Vector3(0.1, 0.3, 0.9) Case World.Weathers.Fog - v = New Vector3(0.7, 0.7, 0.8) + v = New Vector3(0.7) Case World.Weathers.Sandstorm v = New Vector3(0.8, 0.5, 0.2) - Case Weathers.Ash - v = New Vector3(0.5, 0.5, 0.5) - Case Weathers.Blizzard - v = New Vector3(0.6, 0.6, 0.6) + Case World.Weathers.Ash + v = New Vector3(0.5) + Case World.Weathers.Blizzard + v = New Vector3(0.6) End Select Dim colorV As Vector3 = defaultColor.ToVector3 * Screen.SkyDome.GetWeatherColorMultiplier(v) @@ -585,15 +585,22 @@ endsub: Select Case Me.EnvironmentType Case EnvironmentTypes.Outside Dim _fogColor As Color + Dim v As Single = 1.0F + Dim nightFog As Integer = 64 + Dim dayFog As Integer = 168 + Select Case CurrentMapWeather + Case World.Weathers.Clear, Weathers.Sunny + v = 1.0F + Case World.Weathers.Rain, Weathers.Thunderstorm, World.Weathers.Fog + v = 0.7F + Case World.Weathers.Snow + v = 0.8F + End Select Select Case Screen.Level.DayTime - Case 1 - _fogColor = New Color(168, 168, 168) - Case 2 - _fogColor = New Color(64, 64, 64) - Case 3 - _fogColor = New Color(168, 168, 168) - Case 4 - _fogColor = New Color(64, 64, 64) + Case 1, 3 + _fogColor = New Color(CInt(v * dayFog), CInt(v * dayFog), CInt(v * dayFog)) + Case 2, 4 + _fogColor = New Color(CInt(v * nightFog), CInt(v * nightFog), CInt(v * nightFog)) End Select Core.BackgroundColor = GetWeatherBackgroundColor(SkyDome.GetDaytimeColor(False)) Screen.Effect.FogColor = _fogColor.ToVector3() From e892977d7075809cf394bddc34ab3f34fd52e508 Mon Sep 17 00:00:00 2001 From: JappaWakka Date: Fri, 7 Jan 2022 14:25:57 +0100 Subject: [PATCH 45/57] Added Bind animation & Fixed scaling animation anchor functionality --- P3D/Battle/BattleAnimations/BAEntityScale.vb | 8 ++++---- .../QueryObjects/AnimationQueryObject.vb | 2 +- .../Sounds/Battle/Attacks/Normal/Bind.wav | Bin 0 -> 243334 bytes P3D/P3D.vbproj | 3 +++ P3D/Pokemon/Attacks/Normal/Bind.vb | 9 +++++++++ 5 files changed, 17 insertions(+), 5 deletions(-) create mode 100644 P3D/Content/Sounds/Battle/Attacks/Normal/Bind.wav diff --git a/P3D/Battle/BattleAnimations/BAEntityScale.vb b/P3D/Battle/BattleAnimations/BAEntityScale.vb index a99c261dd..d48dc96a0 100644 --- a/P3D/Battle/BattleAnimations/BAEntityScale.vb +++ b/P3D/Battle/BattleAnimations/BAEntityScale.vb @@ -79,22 +79,22 @@ 'Bottom If Anchors.Contains("1") = True Then Dim diffY As Single = saveScale.Y - TargetEntity.Scale.Y - Me.Position.Y -= diffY / 2 + TargetEntity.Position.Y -= diffY / 2 End If 'Top If Anchors.Contains("2") = True Then Dim diffY As Single = saveScale.Y - TargetEntity.Scale.Y - Me.Position.Y += diffY / 2 + TargetEntity.Position.Y += diffY / 2 End If 'Left If Anchors.Contains("3") = True Then Dim diffX As Single = saveScale.X - TargetEntity.Scale.X - Me.Position.X -= diffX / 2 + TargetEntity.Position.X -= diffX / 2 End If 'Right If Anchors.Contains("4") = True Then Dim diffX As Single = saveScale.X - TargetEntity.Scale.X - Me.Position.X += diffX / 2 + TargetEntity.Position.X += diffX / 2 End If If Me.EndSize = TargetEntity.Scale Then diff --git a/P3D/Battle/BattleSystemV2/QueryObjects/AnimationQueryObject.vb b/P3D/Battle/BattleSystemV2/QueryObjects/AnimationQueryObject.vb index b40f6f933..bd7e555cd 100644 --- a/P3D/Battle/BattleSystemV2/QueryObjects/AnimationQueryObject.vb +++ b/P3D/Battle/BattleSystemV2/QueryObjects/AnimationQueryObject.vb @@ -220,7 +220,7 @@ End If End Sub - Public Sub AnimationScale(ByVal Entity As Entity, ByVal RemoveEntityAfter As Boolean, ByVal Grow As Boolean, ByVal EndSizeX As Single, ByVal EndSizeY As Single, ByVal EndSizeZ As Single, ByVal SizeSpeed As Single, ByVal startDelay As Single, ByVal endDelay As Single, Optional ByVal Anchors As String = "1") + Public Sub AnimationScale(ByVal Entity As Entity, ByVal RemoveEntityAfter As Boolean, ByVal Grow As Boolean, ByVal EndSizeX As Single, ByVal EndSizeY As Single, ByVal EndSizeZ As Single, ByVal SizeSpeed As Single, ByVal startDelay As Single, ByVal endDelay As Single, Optional ByVal Anchors As String = "") Dim ScaleEntity As Entity Dim ScaleModel As Entity = Nothing If Entity Is Nothing Then diff --git a/P3D/Content/Sounds/Battle/Attacks/Normal/Bind.wav b/P3D/Content/Sounds/Battle/Attacks/Normal/Bind.wav new file mode 100644 index 0000000000000000000000000000000000000000..9749a0da63f4f007be2da484d66e467028928840 GIT binary patch literal 243334 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%0D0G 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 TQq=T^Z(3Q|ef PreserveNewest + + PreserveNewest + PreserveNewest diff --git a/P3D/Pokemon/Attacks/Normal/Bind.vb b/P3D/Pokemon/Attacks/Normal/Bind.vb index 4a4e36a82..4116145e3 100644 --- a/P3D/Pokemon/Attacks/Normal/Bind.vb +++ b/P3D/Pokemon/Attacks/Normal/Bind.vb @@ -87,6 +87,15 @@ Namespace BattleSystem.Moves.Normal End If End Sub + Public Overrides Sub InternalOpponentPokemonMoveAnimation(ByVal BattleScreen As BattleScreen, ByVal BattleFlip As Boolean, ByVal CurrentPokemon As Pokemon, ByVal CurrentEntity As NPC, ByVal CurrentModel As ModelEntity) + Dim MoveAnimation As AnimationQueryObject = New AnimationQueryObject(CurrentEntity, BattleFlip) + MoveAnimation.AnimationPlaySound("Battle\Attacks\Normal\Bind", 0.0F, 0) + MoveAnimation.AnimationScale(Nothing, False, False, 0.75F, 1.0F, 0.75F, 0.02F, 0, 0) + MoveAnimation.AnimationScale(Nothing, False, True, 1.0F, 1.0F, 1.0F, 0.04F, 2, 0) + MoveAnimation.AnimationScale(Nothing, False, False, 1.0F, 0.75F, 1.0F, 0.02F, 4, 0, "1") + MoveAnimation.AnimationScale(Nothing, False, True, 1.0F, 1.0F, 1.0F, 0.04F, 6, 1, "1") + BattleScreen.BattleQuery.Add(MoveAnimation) + End Sub End Class End Namespace \ No newline at end of file From 047d52832d25f88cf5a2f7b60a6c8d5593a4afec Mon Sep 17 00:00:00 2001 From: JappaWakka Date: Fri, 7 Jan 2022 14:29:17 +0100 Subject: [PATCH 46/57] Fixed errors in drawing the chat screen, made categorie tabs dynamically scaleable --- P3D/Network/ChatScreen.vb | 25 +++++++++++++++---------- 1 file changed, 15 insertions(+), 10 deletions(-) diff --git a/P3D/Network/ChatScreen.vb b/P3D/Network/ChatScreen.vb index 4863086d3..6bc99999f 100644 --- a/P3D/Network/ChatScreen.vb +++ b/P3D/Network/ChatScreen.vb @@ -591,7 +591,7 @@ Public Class ChatScreen For Each l As String In lineArr Canvas.DrawRectangle(New Rectangle(100, (Core.windowSize.Height - 82) - offset - 64, Core.windowSize.Width - 200, 32), backC) - Core.SpriteBatch.DrawString(FontManager.ChatFont, l, New Vector2(100, (Core.windowSize.Height - 50 - 32) - offset - 64), c, 0.0F, Vector2.Zero, 1.0F, SpriteEffects.None, 0.0F) + Core.SpriteBatch.DrawString(FontManager.ChatFont, l, New Vector2(100 + 8, (Core.windowSize.Height - 50 - 32) - offset - 64), c, 0.0F, Vector2.Zero, 1.0F, SpriteEffects.None, 0.0F) offset += 32 items += 1 Next @@ -675,21 +675,26 @@ Public Class ChatScreen Private Sub DrawChatTabs() Dim p = MouseHandler.MousePosition + Dim globalText As String = "Global" + Dim globalTextWidth As Integer = CInt(FontManager.MainFont.MeasureString(globalText).X) + Dim commandsText As String = "Commands" + Dim commandsTextWidth As Integer = CInt(FontManager.MainFont.MeasureString(commandsText).X) + 'First, draw global: - DrawChatTab(100, "global", HasNewGlobalMessages, "Global", ChatState = ChatStates.Global) - If p.X >= 100 And p.X < 220 Then + DrawChatTab(100, "global", HasNewGlobalMessages, globalText, ChatState = ChatStates.Global) + If p.X >= 100 And p.X < 100 + 48 + globalTextWidth Then canClickOnTab = True canClickOnTabType = ChatStates.Global canClickOnTabText = "Global" End If 'Then, if active, draw the Commands tab: - Dim x As Integer = 120 + Dim x As Integer = CInt(48 + globalTextWidth) If HasCommandChat = True Then - DrawChatTab(x + 100, "command", False, "Commands", ChatState = ChatStates.Command) - x += 120 - If p.X >= 220 And p.X < 340 Then + DrawChatTab(x + 100, "command", False, commandsText, ChatState = ChatStates.Command) + x += CInt(48 + commandsTextWidth) + If p.X >= CInt(100 + 48 + globalTextWidth) And p.X < CInt(100 + 48 + globalTextWidth + 48 + commandsTextWidth) Then canClickOnTab = True canClickOnTabType = ChatStates.Command canClickOnTabText = "Commands" @@ -752,7 +757,7 @@ Public Class ChatScreen ''' Private Shared Function DrawChatTab(ByVal xPosition As Integer, ByVal textureType As String, ByVal HasNewMessages As Boolean, ByVal Text As String, ByVal IsActive As Boolean) As Integer Dim drawHeight As Integer = 32 - Dim drawWidth As Integer = 120 + Dim drawWidth As Integer = CInt(48 + FontManager.MainFont.MeasureString(Text).X) If IsActive = False Then drawHeight = 24 @@ -780,7 +785,7 @@ Public Class ChatScreen Core.SpriteBatch.Draw(texture, New Rectangle(xPosition, Core.windowSize.Height - 50 - drawHeight - 12, 24, 24), New Rectangle(48, 0, 24, 24), Color.White) End If - Core.SpriteBatch.DrawString(FontManager.MainFont, Text, New Vector2(xPosition + 32, CInt(Core.windowSize.Height - 50 + 4)), Color.White, 0F, Vector2.Zero, 1.0F, SpriteEffects.None, 0F) + Core.SpriteBatch.DrawString(FontManager.MainFont, Text, New Vector2(xPosition + 24 + 12, CInt(Core.windowSize.Height - 50 + drawHeight / 2 - FontManager.MainFont.MeasureString(Text).Y / 2)), Color.White, 0F, Vector2.Zero, 1.0F, SpriteEffects.None, 0F) Return drawWidth End Function @@ -881,7 +886,7 @@ Public Class ChatScreen For Each l As String In lineArr Canvas.DrawRectangle(New Rectangle(100, (Core.windowSize.Height - 82) - offset - 64, Core.windowSize.Width - 200, 32), New Color(0, 0, 0, opacity)) - Core.SpriteBatch.DrawString(FontManager.ChatFont, l, New Vector2(100, (Core.windowSize.Height - 50 - 32) - offset - 64), New Color(c.R, c.G, c.B, CInt(opacity * 1.7)), 0.0F, Vector2.Zero, 1.0F, SpriteEffects.None, 0.0F) + Core.SpriteBatch.DrawString(FontManager.ChatFont, l, New Vector2(100 + 8, (Core.windowSize.Height - 50 - 32) - offset - 64), New Color(c.R, c.G, c.B, CInt(opacity * 1.7)), 0.0F, Vector2.Zero, 1.0F, SpriteEffects.None, 0.0F) offset += 32 Next End If From 65887946d55a0c9a3f627be0bcedd652c9f82bf8 Mon Sep 17 00:00:00 2001 From: JappaWakka Date: Fri, 7 Jan 2022 16:30:03 +0100 Subject: [PATCH 47/57] Attract, Bind, Wrap, Infatuated Animations Added animation for attacks Attract & Bind, updated animation of attacks Wrap, added animation for status Infatuated --- P3D/Battle/BattleSystemV2/Battle.vb | 41 +++++++++++++++++- .../Sounds/Battle/Attacks/Normal/Attract.wav | Bin 0 -> 277062 bytes .../Textures/Battle/Normal/Attract.png | Bin 0 -> 306 bytes P3D/Content/Textures/Battle/Normal/Bind.png | Bin 0 -> 1022 bytes P3D/P3D.vbproj | 9 ++++ P3D/Pokemon/Attacks/Normal/Attract.vb | 28 ++++++++++++ P3D/Pokemon/Attacks/Normal/Bind.vb | 18 ++++++-- P3D/Pokemon/Attacks/Normal/Wrap.vb | 9 +++- 8 files changed, 99 insertions(+), 6 deletions(-) create mode 100644 P3D/Content/Sounds/Battle/Attacks/Normal/Attract.wav create mode 100644 P3D/Content/Textures/Battle/Normal/Attract.png create mode 100644 P3D/Content/Textures/Battle/Normal/Bind.png diff --git a/P3D/Battle/BattleSystemV2/Battle.vb b/P3D/Battle/BattleSystemV2/Battle.vb index 25163d4ef..ec7dbb70c 100644 --- a/P3D/Battle/BattleSystemV2/Battle.vb +++ b/P3D/Battle/BattleSystemV2/Battle.vb @@ -1523,6 +1523,19 @@ If op.HP > 0 And op.Status <> Pokemon.StatusProblems.Fainted Then If p.HasVolatileStatus(Pokemon.VolatileStatus.Infatuation) = True Then If Core.Random.Next(0, 2) = 0 Then + 'Infatuated animation + If Core.Player.ShowBattleAnimations <> 0 Then + Me.ChangeCameraAngle(1, own, BattleScreen) + Dim HeartAnimation = New AnimationQueryObject(pNPC, Not own) + For i = 0 To 6 + Dim HeartEntity = HeartAnimation.SpawnEntity(New Vector3(0.0, 0.0, 0.0), TextureManager.GetTexture("Textures\Battle\Normal\Attract"), New Vector3(0.25F), 1.0F, CSng(i * 0.2)) + Dim zPos As Single = CSng(Random.Next(-2, 2) * 0.2) + HeartAnimation.AnimationMove(HeartEntity, False, 0.0, 0.25, zPos, 0.01, False, False, CSng(i * 0.2), 0.0) + HeartAnimation.AnimationFade(HeartEntity, True, 0.02, False, 0.0, CSng(1 + i * 0.2), 0.0) + i += 1 + Next + BattleScreen.BattleQuery.Add(HeartAnimation) + End If BattleScreen.BattleQuery.Add(New TextQueryObject(p.GetDisplayName() & " is in love with " & op.GetDisplayName() & "!")) Exit Sub End If @@ -5822,9 +5835,15 @@ WrapAnimation.AnimationChangeTexture(WrapEntity, False, TextureManager.GetTexture("Textures\Battle\Normal\Wrap", New Rectangle(0, 32, 64, 32), ""), 1, 1) WrapAnimation.AnimationChangeTexture(WrapEntity, False, TextureManager.GetTexture("Textures\Battle\Normal\Wrap", New Rectangle(0, 64, 64, 32), ""), 2, 1) WrapAnimation.AnimationChangeTexture(WrapEntity, False, TextureManager.GetTexture("Textures\Battle\Normal\Wrap", New Rectangle(0, 96, 64, 32), ""), 3, 2) + WrapAnimation.AnimationScale(Nothing, False, False, 0.75F, 1.0F, 0.75F, 0.02F, 5, 0) WrapAnimation.AnimationScale(WrapEntity, False, False, 0.75F, 0.5F, 0.75F, 0.02F, 5, 0) + WrapAnimation.AnimationScale(Nothing, False, True, 1.0F, 1.0F, 1.0F, 0.04F, 7, 0) WrapAnimation.AnimationScale(WrapEntity, False, True, 1.0F, 0.5F, 1.0F, 0.04F, 7, 0) - WrapAnimation.AnimationScale(WrapEntity, True, False, 0.75F, 0.5F, 0.75F, 0.02F, 9, 1) + WrapAnimation.AnimationScale(Nothing, False, False, 0.75F, 1.0F, 0.75F, 0.02F, 9, 0) + WrapAnimation.AnimationScale(WrapEntity, False, False, 0.75F, 0.5F, 0.75F, 0.02F, 9, 0) + WrapAnimation.AnimationScale(Nothing, False, True, 1.0F, 1.0F, 1.0F, 0.04F, 11, 0) + WrapAnimation.AnimationScale(WrapEntity, False, True, 1.0F, 0.5F, 1.0F, 0.04F, 11, 0) + WrapAnimation.AnimationFade(WrapEntity, True, 0.03, False, 0.0, 11, 0) BattleScreen.BattleQuery.Add(WrapAnimation) End If ReduceHP(multiHP, True, False, BattleScreen, .OwnPokemon.GetDisplayName() & " is hurt by Wrap!", "wrap") @@ -5881,6 +5900,26 @@ multiHP = CInt(.OwnPokemon.MaxHP / 6) End If End If + 'Bind Animation + If Core.Player.ShowBattleAnimations <> 0 Then + ChangeCameraAngle(1, True, BattleScreen) + Dim BindAnimation As AnimationQueryObject = New AnimationQueryObject(.OwnPokemonNPC, False) + BindAnimation.AnimationPlaySound("Battle\Attacks\Normal\Bind", 5.0F, 0) + Dim WrapEntity = BindAnimation.SpawnEntity(New Vector3(0, -0.2, 0), TextureManager.GetTexture("Textures\Battle\Normal\Bind", New Rectangle(0, 0, 64, 32), ""), New Vector3(1.0F, 0.5F, 1.0F), 1, 0, 1) + BindAnimation.AnimationChangeTexture(WrapEntity, False, TextureManager.GetTexture("Textures\Battle\Normal\Bind", New Rectangle(0, 32, 64, 32), ""), 1, 1) + BindAnimation.AnimationChangeTexture(WrapEntity, False, TextureManager.GetTexture("Textures\Battle\Normal\Bind", New Rectangle(0, 64, 64, 32), ""), 2, 1) + BindAnimation.AnimationChangeTexture(WrapEntity, False, TextureManager.GetTexture("Textures\Battle\Normal\Bind", New Rectangle(0, 96, 64, 32), ""), 3, 2) + BindAnimation.AnimationScale(Nothing, False, False, 0.75F, 1.0F, 0.75F, 0.02F, 5, 0) + BindAnimation.AnimationScale(WrapEntity, False, False, 0.75F, 0.5F, 0.75F, 0.02F, 5, 0) + BindAnimation.AnimationScale(Nothing, False, True, 1.0F, 1.0F, 1.0F, 0.04F, 7, 0) + BindAnimation.AnimationScale(WrapEntity, False, True, 1.0F, 0.5F, 1.0F, 0.04F, 7, 0) + BindAnimation.AnimationScale(Nothing, False, False, 0.75F, 1.0F, 0.75F, 0.02F, 9, 0) + BindAnimation.AnimationScale(WrapEntity, False, False, 0.75F, 0.5F, 0.75F, 0.02F, 9, 0) + BindAnimation.AnimationScale(Nothing, False, True, 1.0F, 1.0F, 1.0F, 0.04F, 11, 0) + BindAnimation.AnimationScale(WrapEntity, False, True, 1.0F, 0.5F, 1.0F, 0.04F, 11, 0) + BindAnimation.AnimationFade(WrapEntity, True, 0.03, False, 0.0, 11, 0) + BattleScreen.BattleQuery.Add(BindAnimation) + End If ReduceHP(multiHP, True, False, BattleScreen, .OwnPokemon.GetDisplayName() & " is hurt by Bind!", "bind") End If End If diff --git a/P3D/Content/Sounds/Battle/Attacks/Normal/Attract.wav b/P3D/Content/Sounds/Battle/Attacks/Normal/Attract.wav new file mode 100644 index 0000000000000000000000000000000000000000..6ab97427031e5c502f77e473d2e22c8c08b289e2 GIT binary patch literal 277062 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 YA$@X7cX5z!B4r{ab?!IAKg)ps1tJj!M*si- literal 0 HcmV?d00001 diff --git a/P3D/Content/Textures/Battle/Normal/Attract.png b/P3D/Content/Textures/Battle/Normal/Attract.png new file mode 100644 index 0000000000000000000000000000000000000000..f1f1fc3ebf49bc90579329972b24d8d81a8ae606 GIT binary patch literal 306 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`oCO|{#S9GGLLkg|>2BR0prCY# zYeY$Kep*R+Vo@rCb81d;WwAnVNoh)EzCuWTe$K(=4{LzR_IkQFhFF|FI(e^Xvw}$L z``br^Rz`PdK8lDtIA# zvqEf}->0AR^i(cpJBNxntW>*NSz*4+b+1{-SJ{HcZsN<=g-o4$(RX&6-IvzNrTz^w z=5?+-m1GoNw)lL*WcC~XL?0+C+&$F!<@SZn2}gpZZwbHb=V16Cs?Cvl zpTa8lzun%yp^c$|_n6_At(D>vn!ok5Gq}HEwU28IzBRLc2hbx7p00i_>zopr0QxX| AkN^Mx literal 0 HcmV?d00001 diff --git a/P3D/Content/Textures/Battle/Normal/Bind.png b/P3D/Content/Textures/Battle/Normal/Bind.png new file mode 100644 index 0000000000000000000000000000000000000000..16eeb2cd04e159762e182d1c395b6d18fdd349dc GIT binary patch literal 1022 zcmeAS@N?(olHy`uVBq!ia0vp^4nW+%!3HFEH|A#nDb50q$YKTtZXpn6ymYtj4^U9L z#5JNMI6tkVJh3R1!8tXjxUyIwxTG{CGhZPjKR@T-@`p7H49uOLE{-7;x8B})TX@@m zhb^I^IWHjpK~6$;Q%SR$@Q*!?W-lt6u1K2*o7{7_*KqTI^agvWR}wM~wGopvA3a_F zL~kQszfPl)!`eOHQ!3X0?L`3#jucwfS12ty`|bBBl>@gwKDy3-f7X4=7ET5wCEkNP z4Q&B72R{D16T|e3QH4dAq42>o1{0R>_?LzIBWKR!_*mVzdi}PvruJ7)%I)Re__g{n z%dDClzy5lBUV|EAg;>GYtu+j~6~+vOTqR$(Iu?AL`fdH~qRS5!TK(n!^ZC~EgTjF` zfo6W}DBfS(SNHdCR=EkAFLqE!{X_ z)en`_p3Uc)&+|2$zw+Zn_aSTN;DhNC*|vWAIzjR3e;}LjfV9LfC69V-)^~H1l}@d< zn5C8eoimF2-(P=Swt06qJFHr|HP@rO;_b)s!v4dFhn-~-wALoNa-cgD$gi@F`}4Ri zdAq%WUazM>+C2qFm$PM&#nTz|dyjLd-B+%kE&|2go0EU{H-4*d_Q!diGS+iNQNIXn3v>U|B({uP+fRYMxpS+t&fj4+eb=0 zv9;WOi!VR- zc6IcHpaUxxY_65MlCY~!k8yT1zXXrKx|=d-MVpyE%$};ruyU;kgBYVzmZoh5!xqLF z`&ic0a33+r;B=hJ9^ojE-ZV|Xh2h`7vy+UQf9WXfZ834kSief2%fXpLz}s=hPJ0LE z2rd_m{_N@b%fB{=IK4a1v-m4}iQ@@Dr(1T)j1^)s&UHHbUllXyqkiCJQ;#VvNH+j}g&TG-A1`!3U#w}I{8)%Tr(c@IAJlx_O- zBcMamFpV|iut#G{?z-e;U;?bKx>?Ivx9MNQm0k}fkE^Wtteol!EcNCM>m;JsUN#-I z4}Qx#W3hdLhR6LjF3k^D{-3!gZ}4>c;`0}p&hsVs2;56p=zBygRMyWl(qp>&^qcCZ d9$#bp$Jlji%FC>jmPw#!_H^}gS?83{1OUPXubBV< literal 0 HcmV?d00001 diff --git a/P3D/P3D.vbproj b/P3D/P3D.vbproj index d9e55dfc1..24c369ba0 100644 --- a/P3D/P3D.vbproj +++ b/P3D/P3D.vbproj @@ -14683,6 +14683,9 @@ PreserveNewest + + PreserveNewest + PreserveNewest @@ -14731,6 +14734,12 @@ PreserveNewest + + PreserveNewest + + + PreserveNewest + PreserveNewest diff --git a/P3D/Pokemon/Attacks/Normal/Attract.vb b/P3D/Pokemon/Attacks/Normal/Attract.vb index 5f34f5a4f..496f977b2 100644 --- a/P3D/Pokemon/Attacks/Normal/Attract.vb +++ b/P3D/Pokemon/Attacks/Normal/Attract.vb @@ -76,6 +76,34 @@ End If End Sub + Public Overrides Sub InternalUserPokemonMoveAnimation(ByVal BattleScreen As BattleScreen, ByVal BattleFlip As Boolean, ByVal CurrentPokemon As Pokemon, ByVal CurrentEntity As NPC, ByVal CurrentModel As ModelEntity) + Dim MoveAnimation = New AnimationQueryObject(CurrentEntity, BattleFlip) + For i = 0 To 6 + Dim HeartEntity = MoveAnimation.SpawnEntity(Nothing, TextureManager.GetTexture("Textures\Battle\Normal\Attract"), New Vector3(0.25F), 1.0F, CSng(i * 0.2)) + + MoveAnimation.AnimationMove(HeartEntity, True, 2.0, 0.0, 0.0, 0.075, False, False, CSng(i * 0.2), 0.0) + i += 1 + Next + MoveAnimation.AnimationPlaySound("Battle\Attacks\Normal\Attract", 0, 0) + + BattleScreen.BattleQuery.Add(MoveAnimation) + End Sub + + Public Overrides Sub InternalOpponentPokemonMoveAnimation(ByVal BattleScreen As BattleScreen, ByVal BattleFlip As Boolean, ByVal CurrentPokemon As Pokemon, ByVal CurrentEntity As NPC, ByVal CurrentModel As ModelEntity) + Dim MoveAnimation = New AnimationQueryObject(CurrentEntity, BattleFlip) + + For i = 0 To 6 + Dim HeartEntity = MoveAnimation.SpawnEntity(New Vector3(-2.0, 0.0, 0.0), TextureManager.GetTexture("Textures\Battle\Normal\Attract"), New Vector3(0.25F), 1.0F, CSng(i * 0.2)) + + MoveAnimation.AnimationMove(HeartEntity, False, 0.0, 0.0, 0.0, 0.06, False, False, CSng(i * 0.2), 0.0) + Dim zPos As Single = CSng(Random.Next(-2, 2) * 0.2) + MoveAnimation.AnimationMove(HeartEntity, False, 0.0, 0.25, zPos, 0.01, False, False, CSng(1 + i * 0.2), 0.0) + MoveAnimation.AnimationFade(HeartEntity, True, 0.02, False, 0.0, CSng(2 + i * 0.2), 0.0) + i += 1 + Next + + BattleScreen.BattleQuery.Add(MoveAnimation) + End Sub End Class End Namespace \ No newline at end of file diff --git a/P3D/Pokemon/Attacks/Normal/Bind.vb b/P3D/Pokemon/Attacks/Normal/Bind.vb index 4116145e3..f4e169155 100644 --- a/P3D/Pokemon/Attacks/Normal/Bind.vb +++ b/P3D/Pokemon/Attacks/Normal/Bind.vb @@ -90,10 +90,20 @@ Namespace BattleSystem.Moves.Normal Public Overrides Sub InternalOpponentPokemonMoveAnimation(ByVal BattleScreen As BattleScreen, ByVal BattleFlip As Boolean, ByVal CurrentPokemon As Pokemon, ByVal CurrentEntity As NPC, ByVal CurrentModel As ModelEntity) Dim MoveAnimation As AnimationQueryObject = New AnimationQueryObject(CurrentEntity, BattleFlip) MoveAnimation.AnimationPlaySound("Battle\Attacks\Normal\Bind", 0.0F, 0) - MoveAnimation.AnimationScale(Nothing, False, False, 0.75F, 1.0F, 0.75F, 0.02F, 0, 0) - MoveAnimation.AnimationScale(Nothing, False, True, 1.0F, 1.0F, 1.0F, 0.04F, 2, 0) - MoveAnimation.AnimationScale(Nothing, False, False, 1.0F, 0.75F, 1.0F, 0.02F, 4, 0, "1") - MoveAnimation.AnimationScale(Nothing, False, True, 1.0F, 1.0F, 1.0F, 0.04F, 6, 1, "1") + Dim BindEntity = MoveAnimation.SpawnEntity(New Vector3(0, -0.2, 0), TextureManager.GetTexture("Textures\Battle\Normal\Bind", New Rectangle(0, 0, 64, 32), ""), New Vector3(1.0F, 0.5F, 1.0F), 1, 0, 1) + MoveAnimation.AnimationChangeTexture(BindEntity, False, TextureManager.GetTexture("Textures\Battle\Normal\Bind", New Rectangle(0, 32, 64, 32), ""), 1, 1) + MoveAnimation.AnimationChangeTexture(BindEntity, False, TextureManager.GetTexture("Textures\Battle\Normal\Bind", New Rectangle(0, 64, 64, 32), ""), 2, 1) + MoveAnimation.AnimationChangeTexture(BindEntity, False, TextureManager.GetTexture("Textures\Battle\Normal\Bind", New Rectangle(0, 96, 64, 32), ""), 3, 2) + MoveAnimation.AnimationScale(Nothing, False, False, 0.75F, 1.0F, 0.75F, 0.02F, 5, 0) + MoveAnimation.AnimationScale(BindEntity, False, False, 0.75F, 0.5F, 0.75F, 0.02F, 5, 0) + MoveAnimation.AnimationScale(Nothing, False, True, 1.0F, 1.0F, 1.0F, 0.04F, 7, 0) + MoveAnimation.AnimationScale(BindEntity, False, True, 1.0F, 0.5F, 1.0F, 0.04F, 7, 0) + MoveAnimation.AnimationScale(Nothing, False, False, 0.75F, 1.0F, 0.75F, 0.02F, 9, 0) + MoveAnimation.AnimationScale(BindEntity, False, False, 0.75F, 0.5F, 0.75F, 0.02F, 9, 0) + MoveAnimation.AnimationScale(Nothing, False, True, 1.0F, 1.0F, 1.0F, 0.04F, 11, 0) + MoveAnimation.AnimationScale(BindEntity, False, True, 1.0F, 0.5F, 1.0F, 0.04F, 11, 0) + MoveAnimation.AnimationFade(BindEntity, True, 0.03, False, 0.0, 11, 0) + BattleScreen.BattleQuery.Add(MoveAnimation) End Sub End Class diff --git a/P3D/Pokemon/Attacks/Normal/Wrap.vb b/P3D/Pokemon/Attacks/Normal/Wrap.vb index bea93d4e8..116b891e2 100644 --- a/P3D/Pokemon/Attacks/Normal/Wrap.vb +++ b/P3D/Pokemon/Attacks/Normal/Wrap.vb @@ -94,9 +94,16 @@ MoveAnimation.AnimationChangeTexture(WrapEntity, False, TextureManager.GetTexture("Textures\Battle\Normal\Wrap", New Rectangle(0, 32, 64, 32), ""), 1, 1) MoveAnimation.AnimationChangeTexture(WrapEntity, False, TextureManager.GetTexture("Textures\Battle\Normal\Wrap", New Rectangle(0, 64, 64, 32), ""), 2, 1) MoveAnimation.AnimationChangeTexture(WrapEntity, False, TextureManager.GetTexture("Textures\Battle\Normal\Wrap", New Rectangle(0, 96, 64, 32), ""), 3, 2) + MoveAnimation.AnimationScale(Nothing, False, False, 0.75F, 1.0F, 0.75F, 0.02F, 5, 0) MoveAnimation.AnimationScale(WrapEntity, False, False, 0.75F, 0.5F, 0.75F, 0.02F, 5, 0) + MoveAnimation.AnimationScale(Nothing, False, True, 1.0F, 1.0F, 1.0F, 0.04F, 7, 0) MoveAnimation.AnimationScale(WrapEntity, False, True, 1.0F, 0.5F, 1.0F, 0.04F, 7, 0) - MoveAnimation.AnimationScale(WrapEntity, True, False, 0.75F, 0.5F, 0.75F, 0.02F, 9, 1) + MoveAnimation.AnimationScale(Nothing, False, False, 0.75F, 1.0F, 0.75F, 0.02F, 9, 0) + MoveAnimation.AnimationScale(WrapEntity, False, False, 0.75F, 0.5F, 0.75F, 0.02F, 9, 0) + MoveAnimation.AnimationScale(Nothing, False, True, 1.0F, 1.0F, 1.0F, 0.04F, 11, 0) + MoveAnimation.AnimationScale(WrapEntity, False, True, 1.0F, 0.5F, 1.0F, 0.04F, 11, 0) + MoveAnimation.AnimationFade(WrapEntity, True, 0.03, False, 0.0, 11, 0) + BattleScreen.BattleQuery.Add(MoveAnimation) End Sub From 639185159778c5c5f8202d97d175e833b452c7e6 Mon Sep 17 00:00:00 2001 From: JappaWakka Date: Fri, 7 Jan 2022 19:27:05 +0100 Subject: [PATCH 48/57] Improved Wrap & Bind animations, fixed some errors in the Bind animation --- P3D/Battle/BattleSystemV2/Battle.vb | 70 +++++++++++++++----- P3D/Content/Textures/Battle/Normal/Bind.png | Bin 1022 -> 2325 bytes P3D/Content/Textures/Battle/Normal/Wrap.png | Bin 1192 -> 2202 bytes P3D/Pokemon/Attacks/Normal/Bind.vb | 13 ++-- P3D/Pokemon/Attacks/Normal/Wrap.vb | 10 +-- 5 files changed, 66 insertions(+), 27 deletions(-) diff --git a/P3D/Battle/BattleSystemV2/Battle.vb b/P3D/Battle/BattleSystemV2/Battle.vb index ec7dbb70c..05b1e1165 100644 --- a/P3D/Battle/BattleSystemV2/Battle.vb +++ b/P3D/Battle/BattleSystemV2/Battle.vb @@ -5831,10 +5831,12 @@ ChangeCameraAngle(1, True, BattleScreen) Dim WrapAnimation As AnimationQueryObject = New AnimationQueryObject(.OwnPokemonNPC, False) WrapAnimation.AnimationPlaySound("Battle\Attacks\Normal\Wrap", 5.0F, 0) - Dim WrapEntity = WrapAnimation.SpawnEntity(New Vector3(0, -0.2, 0), TextureManager.GetTexture("Textures\Battle\Normal\Wrap", New Rectangle(0, 0, 64, 32), ""), New Vector3(1.0F, 0.5F, 1.0F), 1, 0, 1) - WrapAnimation.AnimationChangeTexture(WrapEntity, False, TextureManager.GetTexture("Textures\Battle\Normal\Wrap", New Rectangle(0, 32, 64, 32), ""), 1, 1) - WrapAnimation.AnimationChangeTexture(WrapEntity, False, TextureManager.GetTexture("Textures\Battle\Normal\Wrap", New Rectangle(0, 64, 64, 32), ""), 2, 1) - WrapAnimation.AnimationChangeTexture(WrapEntity, False, TextureManager.GetTexture("Textures\Battle\Normal\Wrap", New Rectangle(0, 96, 64, 32), ""), 3, 2) + Dim WrapEntity = WrapAnimation.SpawnEntity(New Vector3(0, -0.2, 0), TextureManager.GetTexture("Textures\Battle\Normal\Wrap", New Rectangle(0, 0, 80, 40), ""), New Vector3(1.0F, 0.5F, 1.0F), 1, 0, 0.75) + WrapAnimation.AnimationChangeTexture(WrapEntity, False, TextureManager.GetTexture("Textures\Battle\Normal\Wrap", New Rectangle(0, 40, 80, 40), ""), 0.75, 0.75) + WrapAnimation.AnimationChangeTexture(WrapEntity, False, TextureManager.GetTexture("Textures\Battle\Normal\Wrap", New Rectangle(0, 80, 80, 40), ""), 1.5, 0.75) + WrapAnimation.AnimationChangeTexture(WrapEntity, False, TextureManager.GetTexture("Textures\Battle\Normal\Wrap", New Rectangle(0, 120, 80, 40), ""), 2.25, 0.75) + WrapAnimation.AnimationChangeTexture(WrapEntity, False, TextureManager.GetTexture("Textures\Battle\Normal\Wrap", New Rectangle(0, 160, 80, 40), ""), 3, 0.75) + WrapAnimation.AnimationChangeTexture(WrapEntity, False, TextureManager.GetTexture("Textures\Battle\Normal\Wrap", New Rectangle(0, 200, 80, 40), ""), 3.75, 0.75) WrapAnimation.AnimationScale(Nothing, False, False, 0.75F, 1.0F, 0.75F, 0.02F, 5, 0) WrapAnimation.AnimationScale(WrapEntity, False, False, 0.75F, 0.5F, 0.75F, 0.02F, 5, 0) WrapAnimation.AnimationScale(Nothing, False, True, 1.0F, 1.0F, 1.0F, 0.04F, 7, 0) @@ -5905,19 +5907,21 @@ ChangeCameraAngle(1, True, BattleScreen) Dim BindAnimation As AnimationQueryObject = New AnimationQueryObject(.OwnPokemonNPC, False) BindAnimation.AnimationPlaySound("Battle\Attacks\Normal\Bind", 5.0F, 0) - Dim WrapEntity = BindAnimation.SpawnEntity(New Vector3(0, -0.2, 0), TextureManager.GetTexture("Textures\Battle\Normal\Bind", New Rectangle(0, 0, 64, 32), ""), New Vector3(1.0F, 0.5F, 1.0F), 1, 0, 1) - BindAnimation.AnimationChangeTexture(WrapEntity, False, TextureManager.GetTexture("Textures\Battle\Normal\Bind", New Rectangle(0, 32, 64, 32), ""), 1, 1) - BindAnimation.AnimationChangeTexture(WrapEntity, False, TextureManager.GetTexture("Textures\Battle\Normal\Bind", New Rectangle(0, 64, 64, 32), ""), 2, 1) - BindAnimation.AnimationChangeTexture(WrapEntity, False, TextureManager.GetTexture("Textures\Battle\Normal\Bind", New Rectangle(0, 96, 64, 32), ""), 3, 2) + Dim BindEntity = BindAnimation.SpawnEntity(New Vector3(0, -0.2, 0), TextureManager.GetTexture("Textures\Battle\Normal\Bind", New Rectangle(0, 0, 80, 40), ""), New Vector3(1.0F, 0.5F, 1.0F), 1, 0, 0.75) + BindAnimation.AnimationChangeTexture(BindEntity, False, TextureManager.GetTexture("Textures\Battle\Normal\Bind", New Rectangle(0, 40, 80, 40), ""), 0.75, 0.75) + BindAnimation.AnimationChangeTexture(BindEntity, False, TextureManager.GetTexture("Textures\Battle\Normal\Bind", New Rectangle(0, 80, 80, 40), ""), 1.5, 0.75) + BindAnimation.AnimationChangeTexture(BindEntity, False, TextureManager.GetTexture("Textures\Battle\Normal\Bind", New Rectangle(0, 120, 80, 40), ""), 2.25, 0.75) + BindAnimation.AnimationChangeTexture(BindEntity, False, TextureManager.GetTexture("Textures\Battle\Normal\Bind", New Rectangle(0, 160, 80, 40), ""), 3, 0.75) + BindAnimation.AnimationChangeTexture(BindEntity, False, TextureManager.GetTexture("Textures\Battle\Normal\Bind", New Rectangle(0, 200, 80, 40), ""), 3.75, 0.75) BindAnimation.AnimationScale(Nothing, False, False, 0.75F, 1.0F, 0.75F, 0.02F, 5, 0) - BindAnimation.AnimationScale(WrapEntity, False, False, 0.75F, 0.5F, 0.75F, 0.02F, 5, 0) + BindAnimation.AnimationScale(BindEntity, False, False, 0.75F, 0.5F, 0.75F, 0.02F, 5, 0) BindAnimation.AnimationScale(Nothing, False, True, 1.0F, 1.0F, 1.0F, 0.04F, 7, 0) - BindAnimation.AnimationScale(WrapEntity, False, True, 1.0F, 0.5F, 1.0F, 0.04F, 7, 0) + BindAnimation.AnimationScale(BindEntity, False, True, 1.0F, 0.5F, 1.0F, 0.04F, 7, 0) BindAnimation.AnimationScale(Nothing, False, False, 0.75F, 1.0F, 0.75F, 0.02F, 9, 0) - BindAnimation.AnimationScale(WrapEntity, False, False, 0.75F, 0.5F, 0.75F, 0.02F, 9, 0) + BindAnimation.AnimationScale(BindEntity, False, False, 0.75F, 0.5F, 0.75F, 0.02F, 9, 0) BindAnimation.AnimationScale(Nothing, False, True, 1.0F, 1.0F, 1.0F, 0.04F, 11, 0) - BindAnimation.AnimationScale(WrapEntity, False, True, 1.0F, 0.5F, 1.0F, 0.04F, 11, 0) - BindAnimation.AnimationFade(WrapEntity, True, 0.03, False, 0.0, 11, 0) + BindAnimation.AnimationScale(BindEntity, False, True, 1.0F, 0.5F, 1.0F, 0.04F, 11, 0) + BindAnimation.AnimationFade(BindEntity, True, 0.03, False, 0.0, 11, 0) BattleScreen.BattleQuery.Add(BindAnimation) End If ReduceHP(multiHP, True, False, BattleScreen, .OwnPokemon.GetDisplayName() & " is hurt by Bind!", "bind") @@ -6693,13 +6697,21 @@ ChangeCameraAngle(1, False, BattleScreen) Dim WrapAnimation As AnimationQueryObject = New AnimationQueryObject(.OppPokemonNPC, True) WrapAnimation.AnimationPlaySound("Battle\Attacks\Normal\Wrap", 5.0F, 0) - Dim WrapEntity = WrapAnimation.SpawnEntity(New Vector3(0, -0.2, 0), TextureManager.GetTexture("Textures\Battle\Normal\Wrap", New Rectangle(0, 0, 64, 32), ""), New Vector3(1.0F, 0.5F, 1.0F), 1, 0, 1) - WrapAnimation.AnimationChangeTexture(WrapEntity, False, TextureManager.GetTexture("Textures\Battle\Normal\Wrap", New Rectangle(0, 32, 64, 32), ""), 1, 1) - WrapAnimation.AnimationChangeTexture(WrapEntity, False, TextureManager.GetTexture("Textures\Battle\Normal\Wrap", New Rectangle(0, 64, 64, 32), ""), 2, 1) - WrapAnimation.AnimationChangeTexture(WrapEntity, False, TextureManager.GetTexture("Textures\Battle\Normal\Wrap", New Rectangle(0, 96, 64, 32), ""), 3, 2) + Dim WrapEntity = WrapAnimation.SpawnEntity(New Vector3(0, -0.2, 0), TextureManager.GetTexture("Textures\Battle\Normal\Wrap", New Rectangle(0, 0, 80, 40), ""), New Vector3(1.0F, 0.5F, 1.0F), 1, 0, 0.75) + WrapAnimation.AnimationChangeTexture(WrapEntity, False, TextureManager.GetTexture("Textures\Battle\Normal\Wrap", New Rectangle(0, 40, 80, 40), ""), 0.75, 0.75) + WrapAnimation.AnimationChangeTexture(WrapEntity, False, TextureManager.GetTexture("Textures\Battle\Normal\Wrap", New Rectangle(0, 80, 80, 40), ""), 1.5, 0.75) + WrapAnimation.AnimationChangeTexture(WrapEntity, False, TextureManager.GetTexture("Textures\Battle\Normal\Wrap", New Rectangle(0, 120, 80, 40), ""), 2.25, 0.75) + WrapAnimation.AnimationChangeTexture(WrapEntity, False, TextureManager.GetTexture("Textures\Battle\Normal\Wrap", New Rectangle(0, 160, 80, 40), ""), 3, 0.75) + WrapAnimation.AnimationChangeTexture(WrapEntity, False, TextureManager.GetTexture("Textures\Battle\Normal\Wrap", New Rectangle(0, 200, 80, 40), ""), 3.75, 0.75) + WrapAnimation.AnimationScale(Nothing, False, False, 0.75F, 1.0F, 0.75F, 0.02F, 5, 0) WrapAnimation.AnimationScale(WrapEntity, False, False, 0.75F, 0.5F, 0.75F, 0.02F, 5, 0) + WrapAnimation.AnimationScale(Nothing, False, True, 1.0F, 1.0F, 1.0F, 0.04F, 7, 0) WrapAnimation.AnimationScale(WrapEntity, False, True, 1.0F, 0.5F, 1.0F, 0.04F, 7, 0) - WrapAnimation.AnimationScale(WrapEntity, True, False, 0.75F, 0.5F, 0.75F, 0.02F, 9, 1) + WrapAnimation.AnimationScale(Nothing, False, False, 0.75F, 1.0F, 0.75F, 0.02F, 9, 0) + WrapAnimation.AnimationScale(WrapEntity, False, False, 0.75F, 0.5F, 0.75F, 0.02F, 9, 0) + WrapAnimation.AnimationScale(Nothing, False, True, 1.0F, 1.0F, 1.0F, 0.04F, 11, 0) + WrapAnimation.AnimationScale(WrapEntity, False, True, 1.0F, 0.5F, 1.0F, 0.04F, 11, 0) + WrapAnimation.AnimationFade(WrapEntity, True, 0.03, False, 0.0, 11, 0) BattleScreen.BattleQuery.Add(WrapAnimation) End If ReduceHP(multiHP, False, True, BattleScreen, .OppPokemon.GetDisplayName() & " is hurt by Wrap!", "wrap") @@ -6756,6 +6768,28 @@ multiHP = CInt(.OppPokemon.MaxHP / 6) End If End If + 'Bind Animation + If Core.Player.ShowBattleAnimations <> 0 Then + ChangeCameraAngle(1, False, BattleScreen) + Dim BindAnimation As AnimationQueryObject = New AnimationQueryObject(.OppPokemonNPC, True) + BindAnimation.AnimationPlaySound("Battle\Attacks\Normal\Bind", 5.0F, 0) + Dim BindEntity = BindAnimation.SpawnEntity(New Vector3(0, -0.2, 0), TextureManager.GetTexture("Textures\Battle\Normal\Bind", New Rectangle(0, 0, 80, 40), ""), New Vector3(1.0F, 0.5F, 1.0F), 1, 0, 0.75) + BindAnimation.AnimationChangeTexture(BindEntity, False, TextureManager.GetTexture("Textures\Battle\Normal\Bind", New Rectangle(0, 40, 80, 40), ""), 0.75, 0.75) + BindAnimation.AnimationChangeTexture(BindEntity, False, TextureManager.GetTexture("Textures\Battle\Normal\Bind", New Rectangle(0, 80, 80, 40), ""), 1.5, 0.75) + BindAnimation.AnimationChangeTexture(BindEntity, False, TextureManager.GetTexture("Textures\Battle\Normal\Bind", New Rectangle(0, 120, 80, 40), ""), 2.25, 0.75) + BindAnimation.AnimationChangeTexture(BindEntity, False, TextureManager.GetTexture("Textures\Battle\Normal\Bind", New Rectangle(0, 160, 80, 40), ""), 3, 0.75) + BindAnimation.AnimationChangeTexture(BindEntity, False, TextureManager.GetTexture("Textures\Battle\Normal\Bind", New Rectangle(0, 200, 80, 40), ""), 3.75, 0.75) + BindAnimation.AnimationScale(Nothing, False, False, 0.75F, 1.0F, 0.75F, 0.02F, 5, 0) + BindAnimation.AnimationScale(BindEntity, False, False, 0.75F, 0.5F, 0.75F, 0.02F, 5, 0) + BindAnimation.AnimationScale(Nothing, False, True, 1.0F, 1.0F, 1.0F, 0.04F, 7, 0) + BindAnimation.AnimationScale(BindEntity, False, True, 1.0F, 0.5F, 1.0F, 0.04F, 7, 0) + BindAnimation.AnimationScale(Nothing, False, False, 0.75F, 1.0F, 0.75F, 0.02F, 9, 0) + BindAnimation.AnimationScale(BindEntity, False, False, 0.75F, 0.5F, 0.75F, 0.02F, 9, 0) + BindAnimation.AnimationScale(Nothing, False, True, 1.0F, 1.0F, 1.0F, 0.04F, 11, 0) + BindAnimation.AnimationScale(BindEntity, False, True, 1.0F, 0.5F, 1.0F, 0.04F, 11, 0) + BindAnimation.AnimationFade(BindEntity, True, 0.03, False, 0.0, 11, 0) + BattleScreen.BattleQuery.Add(BindAnimation) + End If ReduceHP(multiHP, False, True, BattleScreen, .OppPokemon.GetDisplayName() & " is hurt by Bind!", "bind") End If End If diff --git a/P3D/Content/Textures/Battle/Normal/Bind.png b/P3D/Content/Textures/Battle/Normal/Bind.png index 16eeb2cd04e159762e182d1c395b6d18fdd349dc..a45062aeda2d9fa8fb29968d2bcf62e10ddcb25b 100644 GIT binary patch delta 2289 zcmYk8dpy%^AIE>2$+^rhR8H-oBrQbbFsw{vNja5rNHQvN$Z_o_sY%5=WjVG;DW$SS|>ao&FcWI((uVv+v2n9xGEyIx#oo8-{ zb01GE&VK*J8XBxxul@qI4iQZ%^deWPix4(Rpxh+{45bPY!(rqFLc%}`MR6FYOyaRk z0ktW; zUcSCbAOk#}K(#QSV5u@*B+VS&5hB(# zvm`>!&!#iL@4c2#AaG7^ajoj&>(0I-nCPQnoCVH2Uvzfm*5de(-?hpg8GW@nVdYVO zDVaiB#iK`2NoV1S;AZzOTL_xeRZ0JV_=iIP^X<@ioTnMZ&xG@9)*gD7q;aa|Hzdb( z&`8t=Q2y zsn2Ys;NuP@X(VZraJCxFZ|XW{$*+Z|LV$Gl%q%T(dx{tqFgx~f_FAtI7XTW>(OxRV zt2KfKu_9bg>733AEh?A;q-NViJS9?f#|u5W`??5WW-+yjcK&RC_3Ef4Nz5%eL#iWB z7t=Z(!fVpfen*%|r82jH%p0M^ALYwN6T({Uq}`yLPOztBgt?u$Vo{VdQT1X=ugU?R zh*zzC4)CSN!OUU4#>*XVR87O#&A*28Ty16_WXU{_d+9NK#w$Lm{?6*J+Wk_Kx_>OK zwurQDlaF^KVBDPhw0u9cCma@d>|bN$6$0M|ikoeZS%Blm%ppQY5u&)7P6!D)d*VOt zazMDKH4rF!T>COv0pc_B`ZDtq@5Eg)Wpm1PL%EUw#>zmhbLT?suM=EukDh3jSpRz# z6-k@xm^LAn?tq7lxY!}<-8(C>RZR??LUh@3gLVLM(jIN?+GzH?HXulm_3$jbxOHHQ1Ad~dg4C%xmllVEMpj5@9n*2NW9hv{`G#cvp+f zAj#e=5mvWRr5H8bqruq=G#=8F8K`BZ<6OYeT|sE`#XatIllymdtUwwR>5HI2<=pai z$6on(k-VR3=^~fV?nBluj1>5p_hN6q(cexk-|xV&T&#r5DBom7@eL?lr${(49k-G%o)nWq`a)Pys~Tb3j70IgZ5%4kcW3s{YQt z6oIe9J}Hl!$Sij1@1@Mk_;(EP!n0E71e6g)ANz=KVf{Ylo^sYx7~f)-W8kD8)5EWv zQTd$AR>yr6JM^JiA#bO3nxNuAH=hoVD@PMn^&ck?@u>Mwhi8apc-KlWB}B^u4`arS lZTH=7ZLs8X8}q76iW-z~&epn{VlU=WnB9HDLe% delta 976 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 N002ovPDHLkV1i|<>)ikV diff --git a/P3D/Pokemon/Attacks/Normal/Bind.vb b/P3D/Pokemon/Attacks/Normal/Bind.vb index f4e169155..e50542ea6 100644 --- a/P3D/Pokemon/Attacks/Normal/Bind.vb +++ b/P3D/Pokemon/Attacks/Normal/Bind.vb @@ -89,11 +89,14 @@ Namespace BattleSystem.Moves.Normal Public Overrides Sub InternalOpponentPokemonMoveAnimation(ByVal BattleScreen As BattleScreen, ByVal BattleFlip As Boolean, ByVal CurrentPokemon As Pokemon, ByVal CurrentEntity As NPC, ByVal CurrentModel As ModelEntity) Dim MoveAnimation As AnimationQueryObject = New AnimationQueryObject(CurrentEntity, BattleFlip) - MoveAnimation.AnimationPlaySound("Battle\Attacks\Normal\Bind", 0.0F, 0) - Dim BindEntity = MoveAnimation.SpawnEntity(New Vector3(0, -0.2, 0), TextureManager.GetTexture("Textures\Battle\Normal\Bind", New Rectangle(0, 0, 64, 32), ""), New Vector3(1.0F, 0.5F, 1.0F), 1, 0, 1) - MoveAnimation.AnimationChangeTexture(BindEntity, False, TextureManager.GetTexture("Textures\Battle\Normal\Bind", New Rectangle(0, 32, 64, 32), ""), 1, 1) - MoveAnimation.AnimationChangeTexture(BindEntity, False, TextureManager.GetTexture("Textures\Battle\Normal\Bind", New Rectangle(0, 64, 64, 32), ""), 2, 1) - MoveAnimation.AnimationChangeTexture(BindEntity, False, TextureManager.GetTexture("Textures\Battle\Normal\Bind", New Rectangle(0, 96, 64, 32), ""), 3, 2) + MoveAnimation.AnimationPlaySound("Battle\Attacks\Normal\Bind", 5.0F, 0) + Dim BindEntity = MoveAnimation.SpawnEntity(New Vector3(0, -0.2, 0), TextureManager.GetTexture("Textures\Battle\Normal\Bind", New Rectangle(0, 0, 80, 40), ""), New Vector3(1.0F, 0.5F, 1.0F), 1, 0, 0.75) + MoveAnimation.AnimationChangeTexture(BindEntity, False, TextureManager.GetTexture("Textures\Battle\Normal\Bind", New Rectangle(0, 40, 80, 40), ""), 0.75, 0.75) + MoveAnimation.AnimationChangeTexture(BindEntity, False, TextureManager.GetTexture("Textures\Battle\Normal\Bind", New Rectangle(0, 80, 80, 40), ""), 1.5, 0.75) + MoveAnimation.AnimationChangeTexture(BindEntity, False, TextureManager.GetTexture("Textures\Battle\Normal\Bind", New Rectangle(0, 120, 80, 40), ""), 2.25, 0.75) + MoveAnimation.AnimationChangeTexture(BindEntity, False, TextureManager.GetTexture("Textures\Battle\Normal\Bind", New Rectangle(0, 160, 80, 40), ""), 3, 0.75) + MoveAnimation.AnimationChangeTexture(BindEntity, False, TextureManager.GetTexture("Textures\Battle\Normal\Bind", New Rectangle(0, 200, 80, 40), ""), 3.75, 0.75) + MoveAnimation.AnimationScale(Nothing, False, False, 0.75F, 1.0F, 0.75F, 0.02F, 5, 0) MoveAnimation.AnimationScale(BindEntity, False, False, 0.75F, 0.5F, 0.75F, 0.02F, 5, 0) MoveAnimation.AnimationScale(Nothing, False, True, 1.0F, 1.0F, 1.0F, 0.04F, 7, 0) diff --git a/P3D/Pokemon/Attacks/Normal/Wrap.vb b/P3D/Pokemon/Attacks/Normal/Wrap.vb index 116b891e2..534165c7e 100644 --- a/P3D/Pokemon/Attacks/Normal/Wrap.vb +++ b/P3D/Pokemon/Attacks/Normal/Wrap.vb @@ -90,10 +90,12 @@ Public Overrides Sub InternalOpponentPokemonMoveAnimation(ByVal BattleScreen As BattleScreen, ByVal BattleFlip As Boolean, ByVal CurrentPokemon As Pokemon, ByVal CurrentEntity As NPC, ByVal CurrentModel As ModelEntity) Dim MoveAnimation As AnimationQueryObject = New AnimationQueryObject(CurrentEntity, BattleFlip) MoveAnimation.AnimationPlaySound("Battle\Attacks\Normal\Wrap", 5.0F, 0) - Dim WrapEntity = MoveAnimation.SpawnEntity(New Vector3(0, -0.2, 0), TextureManager.GetTexture("Textures\Battle\Normal\Wrap", New Rectangle(0, 0, 64, 32), ""), New Vector3(1.0F, 0.5F, 1.0F), 1, 0, 1) - MoveAnimation.AnimationChangeTexture(WrapEntity, False, TextureManager.GetTexture("Textures\Battle\Normal\Wrap", New Rectangle(0, 32, 64, 32), ""), 1, 1) - MoveAnimation.AnimationChangeTexture(WrapEntity, False, TextureManager.GetTexture("Textures\Battle\Normal\Wrap", New Rectangle(0, 64, 64, 32), ""), 2, 1) - MoveAnimation.AnimationChangeTexture(WrapEntity, False, TextureManager.GetTexture("Textures\Battle\Normal\Wrap", New Rectangle(0, 96, 64, 32), ""), 3, 2) + Dim WrapEntity = MoveAnimation.SpawnEntity(New Vector3(0, -0.2, 0), TextureManager.GetTexture("Textures\Battle\Normal\Wrap", New Rectangle(0, 0, 80, 40), ""), New Vector3(1.0F, 0.5F, 1.0F), 1, 0, 0.75) + MoveAnimation.AnimationChangeTexture(WrapEntity, False, TextureManager.GetTexture("Textures\Battle\Normal\Wrap", New Rectangle(0, 40, 80, 40), ""), 0.75, 0.75) + MoveAnimation.AnimationChangeTexture(WrapEntity, False, TextureManager.GetTexture("Textures\Battle\Normal\Wrap", New Rectangle(0, 80, 80, 40), ""), 1.5, 0.75) + MoveAnimation.AnimationChangeTexture(WrapEntity, False, TextureManager.GetTexture("Textures\Battle\Normal\Wrap", New Rectangle(0, 120, 80, 40), ""), 2.25, 0.75) + MoveAnimation.AnimationChangeTexture(WrapEntity, False, TextureManager.GetTexture("Textures\Battle\Normal\Wrap", New Rectangle(0, 160, 80, 40), ""), 3, 0.75) + MoveAnimation.AnimationChangeTexture(WrapEntity, False, TextureManager.GetTexture("Textures\Battle\Normal\Wrap", New Rectangle(0, 200, 80, 40), ""), 3.75, 0.75) MoveAnimation.AnimationScale(Nothing, False, False, 0.75F, 1.0F, 0.75F, 0.02F, 5, 0) MoveAnimation.AnimationScale(WrapEntity, False, False, 0.75F, 0.5F, 0.75F, 0.02F, 5, 0) MoveAnimation.AnimationScale(Nothing, False, True, 1.0F, 1.0F, 1.0F, 0.04F, 7, 0) From c116f30c6b448ec51aa5079bb100d408eb20ff4e Mon Sep 17 00:00:00 2001 From: JappaWakka Date: Sat, 8 Jan 2022 17:36:57 +0100 Subject: [PATCH 49/57] Added Battle Animation for attack Clamp --- P3D/Battle/BattleSystemV2/Battle.vb | 34 ++++++++++++++++++ .../Sounds/Battle/Attacks/Water/Clamp.wav | Bin 0 -> 100024 bytes .../Textures/Battle/Water/Clamp_Left.png | Bin 0 -> 392 bytes .../Textures/Battle/Water/Clamp_Right.png | Bin 0 -> 390 bytes P3D/P3D.vbproj | 9 +++++ P3D/Pokemon/Attacks/Water/Clamp.vb | 20 +++++++++++ 6 files changed, 63 insertions(+) create mode 100644 P3D/Content/Sounds/Battle/Attacks/Water/Clamp.wav create mode 100644 P3D/Content/Textures/Battle/Water/Clamp_Left.png create mode 100644 P3D/Content/Textures/Battle/Water/Clamp_Right.png diff --git a/P3D/Battle/BattleSystemV2/Battle.vb b/P3D/Battle/BattleSystemV2/Battle.vb index 05b1e1165..0814097cd 100644 --- a/P3D/Battle/BattleSystemV2/Battle.vb +++ b/P3D/Battle/BattleSystemV2/Battle.vb @@ -5938,6 +5938,23 @@ multiHP = CInt(.OwnPokemon.MaxHP / 6) End If End If + 'Clamp Animation + If Core.Player.ShowBattleAnimations <> 0 Then + ChangeCameraAngle(1, True, BattleScreen) + Dim ClampAnimation As AnimationQueryObject = New AnimationQueryObject(.OwnPokemonNPC, True) + Dim offsetLeft As Single = 0.35 + Dim offsetRight As Single = -0.35 + ClampAnimation.AnimationPlaySound("Battle\Attacks\Water\Clamp", 0, 0) + Dim ClampEntityLeft = ClampAnimation.SpawnEntity(New Vector3(offsetLeft, -0.1, offsetLeft), TextureManager.GetTexture("Textures\Battle\Water\Clamp_Left", New Rectangle(0, 0, 24, 64), ""), New Vector3(0.28F, 0.75F, 0.28F), 0.75F) + Dim ClampEntityRight = ClampAnimation.SpawnEntity(New Vector3(offsetRight, -0.1, offsetRight), TextureManager.GetTexture("Textures\Battle\Water\Clamp_Right", New Rectangle(0, 0, 24, 64), ""), New Vector3(0.28F, 0.75F, 0.28F), 0.75F) + ClampAnimation.AnimationMove(ClampEntityLeft, False, -0.1, -0.1, -0.1, 0.02, False, False, 0, 0) + ClampAnimation.AnimationMove(ClampEntityRight, False, 0.1, -0.1, 0.1, 0.02, False, False, 0, 0) + ClampAnimation.AnimationMove(ClampEntityLeft, True, -0.35, -0.1, -0.35, 0.02, False, False, 2, 0) + ClampAnimation.AnimationMove(ClampEntityRight, True, 0.35, -0.1, 0.35, 0.02, False, False, 2, 0) + Dim SpawnEntity = ClampAnimation.SpawnEntity(New Vector3(0, -0.2, 0), TextureManager.GetTexture("Textures\Battle\Normal\Tackle"), New Vector3(0.5F), 1.0F, 2.5, 2) + ClampAnimation.AnimationFade(SpawnEntity, True, 1.0F, False, 0.0F, 4.5F, 0) + BattleScreen.BattleQuery.Add(ClampAnimation) + End If ReduceHP(multiHP, True, False, BattleScreen, .OwnPokemon.GetDisplayName() & " is hurt by Clamp!", "clamp") End If End If @@ -6804,6 +6821,23 @@ multiHP = CInt(.OppPokemon.MaxHP / 6) End If End If + 'Clamp Animation + If Core.Player.ShowBattleAnimations <> 0 Then + ChangeCameraAngle(1, False, BattleScreen) + Dim ClampAnimation As AnimationQueryObject = New AnimationQueryObject(.OppPokemonNPC, False) + Dim offsetLeft As Single = -0.35 + Dim offsetRight As Single = 0.35 + ClampAnimation.AnimationPlaySound("Battle\Attacks\Water\Clamp", 0, 0) + Dim ClampEntityLeft = ClampAnimation.SpawnEntity(New Vector3(offsetLeft, -0.1, offsetLeft), TextureManager.GetTexture("Textures\Battle\Water\Clamp_Left", New Rectangle(0, 0, 24, 64), ""), New Vector3(0.28F, 0.75F, 0.28F), 0.75F) + Dim ClampEntityRight = ClampAnimation.SpawnEntity(New Vector3(offsetRight, -0.1, offsetRight), TextureManager.GetTexture("Textures\Battle\Water\Clamp_Right", New Rectangle(0, 0, 24, 64), ""), New Vector3(0.28F, 0.75F, 0.28F), 0.75F) + ClampAnimation.AnimationMove(ClampEntityLeft, False, -0.1, -0.1, -0.1, 0.02, False, False, 0, 0) + ClampAnimation.AnimationMove(ClampEntityRight, False, 0.1, -0.1, 0.1, 0.02, False, False, 0, 0) + ClampAnimation.AnimationMove(ClampEntityLeft, True, -0.35, -0.1, -0.35, 0.02, False, False, 2, 0) + ClampAnimation.AnimationMove(ClampEntityRight, True, 0.35, -0.1, 0.35, 0.02, False, False, 2, 0) + Dim SpawnEntity = ClampAnimation.SpawnEntity(New Vector3(0, -0.2, 0), TextureManager.GetTexture("Textures\Battle\Normal\Tackle"), New Vector3(0.5F), 1.0F, 2.5, 2) + ClampAnimation.AnimationFade(SpawnEntity, True, 1.0F, False, 0.0F, 4.5F, 0) + BattleScreen.BattleQuery.Add(ClampAnimation) + End If ReduceHP(multiHP, False, True, BattleScreen, .OppPokemon.GetDisplayName() & " is hurt by Clamp!", "clamp") End If End If diff --git a/P3D/Content/Sounds/Battle/Attacks/Water/Clamp.wav b/P3D/Content/Sounds/Battle/Attacks/Water/Clamp.wav new file mode 100644 index 0000000000000000000000000000000000000000..dc33ea5fb75fb0a6f41e6eee055159b39957807b GIT binary patch literal 100024 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 z z#bl6K9S3rG!{Hvock2+iM=$T08z%>gtbZfRO%5j6DSlcIyGOTIycu$jAe24ich5Tr zo;sYhbGzoi&iduC$X5|)9>88^1(8x~#9Bl<4uV)P#@NLE|E_JC+l?8L1NYyh7V1C2Qh?&)e>%O_&KW_Jp?Y_0$*S7oW zc9(2-@pg{sHOp}>!92rJojI(Z51f}d`};z8e<6}6%|$7{u!K1#v@T5F&qcy7FF8NQ zmzR7o?-zD5+m7D~{QbdSB`#cYQIFb1-Pzye9o@bd`WNKQ}#oT;BTx@cE7|GF;TrhR5IK>VjM$1M>CTyyU_Q z-qjYgf+I5|`TCjAS);$(pa-8kz7gwxZM$#A{$Jk?U7^H*1>p6Cj;r*!IzP2v&Wn;- zS}89!IX`t@4(0PBFFldx!X@>a1{U~YuC?HWOZe=A556A$-;5NrLvBB3h?R{k4n<^x z{&}JG|K#kvj^CGa1%G^jz2pNnN=kZS6?_68^u9QHg932iedn)eML)5HT`pRpZ;|fY zb?9xI!T~k37Ykqow0)^7FG%^N=&gmZ37-9Ccz+`Y`t#ZGLUaj&{2X21O!&)>*g9t& z^tXR%+ozbL@$W9gD!Zw(gZlPQZU5BUpV}_(+duV=?(qEWIUk?;x95F)`o8_C9df+= zsXg-_6#m24Uc;Z<_V?Q|&hURRWb9vOw!&z^e&S^J?fd#~m)`G4f9l=uzRHK!QvZ(d zr=Ibe-So#lwPR|x4R5G$S6SrEzjE-u9D5Jv9!F6_r}4SoHZSBy8}GZr|MpM4Ep