From 7555a5e903e3272f165af0ca36453fc13eed5cce Mon Sep 17 00:00:00 2001 From: JappaWakka <jjlspeelman@outlook.com> Date: Sun, 16 Jan 2022 17:22:36 +0100 Subject: [PATCH] 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#<w6iL}n5fT6Z diff --git a/P3D/Content/Localization/Tokens_en.dat b/P3D/Content/Localization/Tokens_en.dat index bd7bd479e..6721cf780 100644 --- a/P3D/Content/Localization/Tokens_en.dat +++ b/P3D/Content/Localization/Tokens_en.dat @@ -84,10 +84,13 @@ HP,HP PP,PP Lv.,Lv. Level,Level +MaxHP,Max HP Attack,Attack Defense,Defense Special_Attack,Special Attack +Sp_Attack,Sp. Attack Special_Defense,Special Defense +Sp_Defense,Sp. Defense Speed,Speed --- GameInteractions: diff --git a/P3D/Content/Sounds/Emote_Exclamation.wav b/P3D/Content/Sounds/Emote_Exclamation.wav new file mode 100644 index 0000000000000000000000000000000000000000..06ccd271c76e8c8c1947956a11bdcf8b501ff3ce GIT binary patch literal 52646 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%0D0iUu zY@*zTyyGuT5mi}La)!<D+8ydXfb8cX5_-WsR$%An@T}Qj+ey-6=^J&9)zmDG87^gZ zz=lj^ZSG;CX3Fj5!$h2;kpD0E#Ul8^-}Ji$=WZ}o%*oE_NT2#$da%NYj+ZlwX%ahj zA06z7oPFV&Cd0!Wlhr+YljSe#T6k$|WvrlD;oCEaU~kIvv0=+N<5q)RI?6d~1u{As zp1Pm8n~~|{=S)DlG31v2mz4kH@qEe~mxf?NuF?zM%`h-CUW^u>az@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<iQ8l2JFa8o)W?ZWpxM7AfQvyt4V6nASuzrcC)W)yvh-K=k|=d%uE zpOx3h8sdg3NM11heKEe^3cl_lHaS-MC>?|Ob|7bR?ndJzQ#R{S2mAjKJGD!mL~OEz zy$FzZBQMMF^5yBZzht<RxyKRiSi&BZl|!Up?z4;a8TJ3H=rpz?NnQokbJl&%J;N|H zGgIYMbpnlFz@AQLZ6#L7F29$TW9KTMW0k2PO|iYU<z&j)+oj%;7a#HVJDf!quB+Fp zXAmdL#C(V8w|fVA^)7dpabIpX<2QICInp=Dgl%ugGk@pVhsqVP^>@^DnMLMLJbNYc zQq~CD7uzN<p<~h{sVI5*WMbm=e76aE!Ku5*zz+2b&uvdLL#NDp?gaN5?9wu%ttoM# zH;=f&yE*Xr`=yOi2L7<U<Dg@nVP&S4eLEtLmEW^gqmb=H_Pi1KUS;IZo8#_-`S#2- z**qYpNv?{SAmP$+shTELJ%||k583}D`bCoXY!C9!Px4{;QP!61QI;G_2e?*8@$(fm zcaepW#Mw=dlvlEWKJy^r?d!rO;fmo^=2@r3*$H1922M~2+cpe5<q7zPcU?*{EAlnS zRz24Y*S3tqhU3C*;SJXvBHlX8-oGU-T*v-;z!ht8=Hvv8O?{fY^J><G>~ua~kT@xk zKTi{fU0?>uUHsBP<nIiAsVxy(d1gM0HW^Kg!3i5+Id?Os%O$@?wsk~rRfy0IV(%xY z4-kuwH7w0M=*V%XnVA+$&fA>NcOcfylwbWnpSmn>VC~MR$9Q^pVlr|KK7uH;!ACVm z@3myf%dzhXU~i|1<5m-EHP>XRYg+ePKN@l}7lHSz$H&ZPhE*KWJ(B&(<~jc5Gxz10 z`1{-HhQ<fR(#Aw%1@gmN<O{RN44v{*xgY+?E{DkTShuhEzJd7sw}va39c>S7eqh8) 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><qKrtYqhAa}t8OH2tNOH6M89>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<x%;N8P!NmvQNB%}H6>|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`lM<!!u^7v1X0bL{60cM;ncga<O$ zQrNmFduGmO*4?Y4m%v-XnDcj!xby-3y}l-1Z9tA+QhR8YW6GIeE@?SN-Ljypm-~PV zEG0I`kM1AAerBs*s!z%@<o;3v=>zs9-BI7^pibC=-X94*qZKU0i*L2!iT(!dtw{dd z&OO4NoDpkyu6nH6L>~MUeO`~Q&fp(48LFN><C?_F1;MnFtmAF{vubBg#P_|UCdH{D z?9YCDW*WLR0c^3hCW?65q&cri$USI$Xk1|0!CZbHbk;k2>KHOrOB0I?JU|S4hphgg z>^(zzYsMkNS9>YPIO^fAq=V9IVu}dtx>rZqV*|ZNSS#Y?;;O$@PYe$;quqX<CDfM` zcDyZC?lez(gZ=D|%?OqPr3h-~r5&>zoeljmdr4KK_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_uOagbCA8g<Y^iB(r4)I32d{AddFG2ucMDO#Ok01w1K$t zK7Klz8q_>KBXadbd`wy7s66+1WEx{0Y=3E=h22gBhuz8fSza9*Nkr|%&5C1h4<eT} zr3A58ZUN&fx6yr*_&FceXAJAwnZJ2)%dLFQCVwGT3s5U6wW@&ef-y||D30a3TJfa4 zxu^F$lq$&7LY_I8XI9ZK7vXR^3WBTL0#7W4EDggam7xwdlC>zuO05IqNte$e$I<E# z&djTB+iLqxjATQmwh?8R(ZijrmxwJ`gAV(WE#wlnk1>`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&Ln<R5L=XU2vYTK*-Z%a>sZSNwl_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|nxT<NXU65ii_TN(QzY)m?NB^~v070qk)27GWFSn)pez^&%gc;fAF_MsiU z!^w^+&cV!?{fZv>YCiJ2g|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<?ncdg-#eYQaay;yr4ihokXFDXiH=?Crnga($?|G!QBZjo>+7 z6`l)?d6Qwhk(P{b0XpK%d(MI@tOX+oMh|B?0v$C>@uo)PASZZ_ZP<aw@*U)*6Z?9B z&$a}QS;v}HQ}?3xriS%~bvHQ4Nn+vIyq}_e%5(UlK^}0G47m~3_BFn4g|VM0!CBq) zTfGSlJ}wW%x|9G*@#D!`bFD>=Am{l@{gEEEgSmr^rG=_Of224s`9&%8{%@XG%li+< z(_I6np$kym#<kZKo4d@|6}`*Ho0LSKD&Pa!p<#8n?=bAaC33g?_{)V>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<f3G9)zI`PvX_O}!iHdhU#V5+u`jjnWM=(u-t!r;%}R9YKC#gZbZS4jM;Llp z*c%sWg4FxW6)ffL>+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><adE4SROz|2Sa{boU={SUvl_T%BWCW(~DWwpM}*`bK&#JtTe_PaZpkXmC60S_%IV zhfT<mbn<XhVRN*jowGYL!1kaA#qlu)Z2T?k{d8<#7jV6N#3a6=AnwUontMU@PNgCu z_i_P((W(5%`9ADX2kPD}z|NjiPblaf<gR7>W<1PVETs<8f(Y^~^SFBOUh~<rSwx+E zsr&3^T~)T_HqrdX?Cp=N%XfKMCQr!6s`4D4z+nXD8QjKxr^$ixP16wbEPJ^9Gcm|= zu*5<<X)5t<98a6ZpP#v|FuLDBDj@~rjx^q*Z?GGBd6s=CiKmI>em}{HB=qtgu~Kg$ z(3b9@?qRt_jnk$6QZ_j0JN}7g%9RV>`Vb$kAz#}CW_Ay`eQy8T@x+TU(<A-~JCe-5 zgYYM6wD25}NGmkC8vbYuYnf>}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(Z<u{6T#@w0%BsD{89G$#Cgc?Bx0RM%nlZ`r!;Mx ztDSMV=Z)U_$PmtGY=$oxMy+oeIzh#cI_^K<Kl7yG^!kKa2iRI!vMmdVJuZRquOx4% zNlm{$a#Kq#{C~gP9y}<&93iR97tQOOS<bKUUM@)cq?y?NadI1E>LZcC8m!`YK1T&g zI3uLw-ZXx2+uc|2+_T92e;@;yNI(EK)LS7AmmWwp$!V9le!6tI@wwx~_F^Bd(=-36 z1=wym>|s$bonh?LQ|Ys`gLT<vQ|!IXCi80c>KXOcN#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;w<a=y!lY-9E0WFRFhi}(f2`S1|f-gS(Ov=E9xr)Y_YaRUKxScHJtDMhwqz; z&91<`m-Bg9PLxXE#j+feoyQ$<jsUK#%v`2ntYbZXHxXMW$pZHckiSUxq$cda5}VFm z(B0pCkM&6b%U;8?YMJpcfj5%)u0H5?Cv1LSp^gw?Sz~=Jyc44Fk<X=P*ttnuk(Z}w z$kUYL`_rY*#Hh7By*%x0fwmHoFIae2o{u@d;B$R=uO#WabP#_&Mj9pEz}8Q6-gNG= zTkX}6<9FEk_2iGgq?^)Q{L2;Tf^>oBS;PFnzN}4Y`)Ye**D=>O{OoFJwse`*kCt9= zZBO3rh138!FT>vWiXI`svdh{EPGmiN<uPUoE@4%z)ba|!G3gE`=7{vKRF>LXY0oH+ 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-<YKUy5hAgy-qZX((H{Vl`4R zlU@5)iWVY-pO&T8@~Wn)=e$pQ)@vE{(P><@h=0%JQw^noWFpt4G<QkQ0*jy3B$~yI zymLGDW*75sN8(EdNTXr4t|8MGq{3j#-JF}9*KGCdeR&J-9xO&`MslXl8tz$)e&)Sk z=CPtd4B|e?)^WBZM?L2!=6$7zA>vK&hvLkyT|+!klDu(?G?>Y?d8HphqF}I$w~p}a z@l>G}7Ar=G$Jyg@lFW+Dm#Xva-K4*zQ^<wCXNM=yGQzr0*dT=93(R7Q*iY&qHI)jp z9>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<zMCR0miollVt0MeU^ryKz-~B(CH8D~nad8`M?D zxsJP9Ssz*>;1~IeW5hXdy7y7D-XJZIPK#T_)x7(7v6<+tUmUT!>=W!+_Hfpykyu;& zPx6<JiyOtsQXlE0cvS2zwUn;mD@Jplx%BKNJM+3a5KnaDS=+LXuZcU%qEpne2M@$2 z;%vU_y(&<(+)~s!$aB^+5*fb7I|qqBMLlnGLcG8|yGcFpl|k%bIXGpfEF-NY#lqqy zahX_C`b%0N?h!k(3$w(f><51nTZj|5Z<M{RV}q@%eKPjUSIoz|_m=|1siKa(-9+AM z7FE)DYOM>!*`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#|i<I20@zx?dsiI?*YC&Ue);G@NKK_}YHftCzcS$6_5(nM^;WQjAZ(j0bdv$y~( zYp^&}Jk0YKq7Qkmxx1y4&{OcrUQ4kpS8N9z?ZNsi=1CT?+l_cui)e9lbe6R~wl?ED zmEPhMP;7s$?$0;x;fjXhV}2r-7q}OhuTQ>n$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^<H2#2v>CGBhN!Pc3!W#S0&fUs3KCGHb{2v3ERoCS6r>|hUaeO|aM<Ou1) zYs)C>C+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@<Ck>M-CGp;EpMzh{# zK@^h&{r{g=BbFD}<Fo5ImpCVr^VH@&eh9fj9#O>|MA0O8gi1)xcj2?pQmihXQGHb@ z&K1r;)dN+QP*n`!+GHV(yBdWA-peIa5dR1_g&MqHgu9Aoob#kpLhgPG+5GsiOOj}( z)jW}_?firwH@;#y@ro<ewafL$RR-yd;s45_gWb&$sv`lv1rt|FVwmtnXf2i&M>?-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^`FsX<f6d*0^V<)? zC)Q39pR!*np{S7JXzJ|CSwiFBtc?_Q@|2~;M?6O)x}MIJ_j%%a?7=$EK~FX3CTAg` zChL+T#0$}^%nyE>BV1yiOY;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+{Y<GpxcR^lJsX zk<NEa75oM7c}r$zQ#x@=yWOn$SYac-$%37GmTNMwth>2uHj;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`@*6a5<e#iHB zJ<s#Lu^^ZhTxfX3V21w&)TPXMke|s~d5Yc?E6n$m70MSg%d{A!TrpBV2gy;{FWg`) z$FrZ~Uo*dnUrOFR<XuLj)}w9W@BenJx<rHu@cJccY8QAOBi_GMBgn0l1`EFdyyKr2 z2;u*;_ycE%1?=wep#6;c-VN`gte%_I1B`5A-A>SgftP|u+4~~Y73h4R{#8xGlT&0^ zEuLwm9`CAKls_pK*kd18o>m@`6ZuqBKJ(X!?-A<f3ByCQCsT(phHcn>g>%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&?<xN!7o^u#P==G z4C2}Mkv0LIcUiN(WX0bf%n06_d0G2Rxvu13@i4W0geZ-Xv!}5AD!H?Rj8XCLvw`qH zvlh^n8h&iBB4LvJEFwdNNA~++<mVH^0W$xG{`LL`{`r9g*qDq~4|P?6&zj)yK+#CM z2OQhM@j35ne;?cl)-j@ThUnW^CA&b=OYU|<S<HP*4OM=t+{Uk!N{`~hqHZeQgS_+L zETRg|gS8A>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&}-K<XRrd~KzAHG z6V#&_-MctThWK~*FKa*XcQGHKCSk<~$T>jmUPZ?q^5?!9ul^28ovhpST1j9q@CbYN zZ&=4iK=2P%^lmInN4g7|I(%`8zXvwYJf=OVtWloh)cT4Vg-8DdMH+aU(UgH@`&qGm zV2B9r4nD*C%^BsM(o1eSkg%8ate+~6Qe&x<AZzPJ^)2ej5O_XtN&BgP6pLS0--7x& z(cViYOoAqzdhoKEM=^F<{hQ{}<^?teo;Uo+5Jnx2<Js-l<6_m?N1e)fpca4M<u~3} zW>#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&W<tsNtY(ket)z_zV2! z{7Hsb!%}r28WqD%szlbTBkC?t*3+(Km;bf;5;0JM&jp{Ne)i)1Hsb5$lT9^TC$f83 zJypY3Y7GD1(D9iMXErGN6dTnc``a$g{X^7kGBtjY72!?R(p&5@9)7>SR?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<hTg;IN~ewl z*GV*;;7-=TQ-q&R@yP^j6I8NW<v^Q>><Z}jKwSlz0v(|f`aEPFhq@Z-GQNw6OC~hO z&{xc-mU%Zaa=@ESPwaZ1%f@&YI4h8BM@~AQV&popGZ(4NtREFv(uh5RzMNha^KD2d zLs}lvnvr~rT&+YxHFG6M$YLy)Pazp2oJDZB81Dd&3;hl*!O;eF6}>#&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{zQZ<cemfg-ptBl!hA|+Ydq$4S1tQjr!XsCr!JaP~ehu|;OIR=s30wOQHa&oI1 z+Dfog(CfrIRq%A;2ODiKvJ3FS5c64#ji6a_SrA{PFYE4k{8^4{@qZKj2IP&x>w~hF zaR(Axp{<8k-mJL5C%*79>xOHLzL!}C^F`R;CKGti!Kl0w>4UQdy;7Y$oC>@|S1`*n zm<?~p^I{F3e$Fe^v>nW}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$<M8^hw-X_->`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?<Gnn8d0G z>FuDgBhAVDC|4=ImuD##9&$6@4s9V4+sR!!wDP<rk(YB*JqT>vn~;-%|7C}A=(c>l z3b^6QBvTsUvf;x{w8&Fb9X7SnI}OHObd?}iV(TN0b&Si&_%za5kl7A>HF5{ZgKla> zKC(0Q@Z2KLgS~iajGhBJA4rP8e+qgzcZm<ZSmDN2iGd3&b>vKo&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;K<ghfAIi+&XT-FaEAW#s_d*BKDJb$A$h*sLsJRiq>1$;04<?aJQ4Oo#1KVJ_c<+ zw)P>{%ZR*5@j)vQl{W?#nR6q#2b><F+rh`J(+#4>uIuij-$^_s;O%8>iu0nZbkoQj z!y5T@)-dv};gM;4*T>jBkPRd8BHHCG*)8M`<EI<=vl|YH^e1>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<M~dWt0k_z=<^Y?ab!$j(=<;*E%5sAOFw^q;IC`wyU)x=P|91^JMiA5eT@<E z;a#-drgx8L_OC!W4fmJW_X+Z@g6J+0c|hw^bzOLrsZmjs@Q5{Ugh#Ag|2XYeH*YqE zB}d0@O<{aP<mwj~+hE;lPP8T&qt<Ntm2qWiDznD**6rpL<7?(5W2iCAnvh_QO|@8) z;8_`IdJ>-3w<TF(w^)qpqf@rUMKc~2x%yGYLl=iGruSMzq-cw>ZcB<w6?Ke7tuZZN zY+dyB_+>9HTDE*q$l?&=!URi9N>W_BCBgiQpDE#{$hF^rCS>^%#S*u~xK4#{^^!RZ zDTY<1a8oFaxm@3vVOkv-#=s+7qT94-(<YivaYb3<Q~wg3Z2q=J)5>+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|<w+1-<*&pFQuS3pU<rTyXyQw^fNa29D7 a1K<ML(vgYAoWBeJ0000<MNUMnLSTYRDn|SO delta 127 zcmV-_0D%AY0m=c87YYyv1^@s6AM^iVks&{7RY^oaR5;7+lEDhVFbG4NKa4m3GX9}E zO(^S_&>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)<h;3K|Lk000e1NJLTq001BW005u}1^@s6ZOU#e00009a7bBm000XT z000XT0n*)m`~Uy|8+1ijbW?9;ba!ELWdK8EY;$>YAX9X8WNB|8RBvx=!KdMT000BP zNkl<Zc-rloA$!{}5QaaY1STwF8ygHP?9V84(83xx7&w@*7R_)!V`GK=31uByV2m{2 zoFh4sBb{V>P0!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@<Vz)RGC!u+gM;R@rK)GjmAx)Spr@;Cfu--J!W0R6S4FLef?DTLs zWl1z1z-q1=qvZZ#RwrYmP>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(>4K<!f2yCQ<Ul)aG0ORpLJ9(iRl=kjLc$RS z5V199i55prw8O+sLRVNGmC^;>90jZCiE1@($~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*<NUYJr_JYwZA>-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<xG)<hE4JorT5}A}~0MsXFwP)I+?+?J^f!^i$nKbt-zaekVwEjTC3Mj%v00ck) z1V8|;4}g2#Tte`+0Afy3gyu!E2dGytdP&xGY-6w-=sL<X3_$B!gOHrb_L)ypraL}% z$O7OSjk!e+;OyW^Zz1UFlno=z9Q}g9-UXw6=;X@<^LfmQ$&%+?3OIIU%<`er<o;E0 v)pD9V-z}_fj6xgKc|AZgfnof=s0aQ5bmPhW{j4~w00000NkvXXu0mjffo{{^ literal 0 HcmV?d00001 diff --git a/P3D/Entites/Other/NPC.vb b/P3D/Entites/Other/NPC.vb index 29d3ebcdb..a26840f1e 100644 --- a/P3D/Entites/Other/NPC.vb +++ b/P3D/Entites/Other/NPC.vb @@ -418,14 +418,16 @@ If CType(Screen.Camera, OverworldCamera).ThirdPerson = True And IsOnScreen() = False Then s &= "@camera.setfocus(npc," & Me.NPCID & ")" & Environment.NewLine Dim cPosition = .ThirdPersonOffset.X.ToString() & "," & .ThirdPersonOffset.Y.ToString() & "," & .ThirdPersonOffset.Z.ToString() - s &= "@entity.showmessagebulb(1|" & Me.Position.X + offset.X & "|" & Me.Position.Y + 0.7F & "|" & Me.Position.Z + offset.Y & ")" & Environment.NewLine & + s &= "@sound.play(Emote_Exclamation)" & Environment.NewLine & + "@entity.showmessagebulb(1|" & Me.Position.X + offset.X & "|" & Me.Position.Y + 0.7F & "|" & Me.Position.Z + offset.Y & ")" & Environment.NewLine & "@npc.move(" & Me.NPCID & "," & distance - 1 & ")" & Environment.NewLine & + "@script.start(" & Me.AdditionalValue & ")" & Environment.NewLine & "@camera.resetfocus" & Environment.NewLine & "@camera.setposition(" & cPosition & ")" & Environment.NewLine & - "@script.start(" & Me.AdditionalValue & ")" & Environment.NewLine & ":end" Else - s &= "@entity.showmessagebulb(1|" & Me.Position.X + offset.X & "|" & Me.Position.Y + 0.7F & "|" & Me.Position.Z + offset.Y & ")" & Environment.NewLine & + s &= "@sound.play(Emote_Exclamation)" & Environment.NewLine & + "@entity.showmessagebulb(1|" & Me.Position.X + offset.X & "|" & Me.Position.Y + 0.7F & "|" & Me.Position.Z + offset.Y & ")" & Environment.NewLine & "@npc.move(" & Me.NPCID & "," & distance - 1 & ")" & Environment.NewLine & "@script.start(" & Me.AdditionalValue & ")" & Environment.NewLine & ":end" diff --git a/P3D/Input/UI/SelectMenu.vb b/P3D/Input/UI/SelectMenu.vb index 19998d8bf..c2829e53c 100644 --- a/P3D/Input/UI/SelectMenu.vb +++ b/P3D/Input/UI/SelectMenu.vb @@ -47,7 +47,7 @@ Public Sub Update() If Visible = True Then - cursorPos.Y = MathHelper.Lerp(cursorDest.Y, cursorPos.Y, 0.6F) + cursorPos.Y = CInt(MathHelper.Lerp(cursorDest.Y, cursorPos.Y, 0.6F)) If Controls.Up(True, True, True, True, True, True) = True Then Me.Index -= 1 @@ -64,7 +64,7 @@ For i = Scroll To Me.Scroll + 8 If i <= Me.Items.Count - 1 Then - If Controls.Accept(True, False, False) = True And i = Me.Index And New Rectangle(Core.windowSize.Width - 270, 66 * ((i + 1) - Scroll), 256, 64).Contains(MouseHandler.MousePosition) = True Or + If Controls.Accept(True, False, False) = True And i = Me.Index And New Rectangle(Core.windowSize.Width - 270, 72 * ((i + 1) - Scroll), 256, 64).Contains(MouseHandler.MousePosition) = True Or Controls.Accept(False, True, True) = True And i = Me.Index Or Controls.Dismiss(True, True, True) = True And Me.BackIndex = Me.Index Then If Not ClickHandler Is Nothing Then @@ -79,7 +79,7 @@ End If Me.Visible = False End If - If New Rectangle(Core.windowSize.Width - 270, 66 * ((i + 1) - Scroll), 256, 64).Contains(MouseHandler.MousePosition) = True And Controls.Accept(True, False, False) = True Then + If New Rectangle(Core.windowSize.Width - 270, 72 * ((i + 1) - Scroll), 256, 64).Contains(MouseHandler.MousePosition) = True And Controls.Accept(True, False, False) = True Then Me.Index = i End If End If @@ -104,25 +104,25 @@ If i <= Me.Items.Count - 1 Then Dim Text As String = Items(i) - Dim startPos As New Vector2(Core.windowSize.Width - 270, 66 * ((i + 1) - Scroll)) + Dim startPos As New Vector2(Core.windowSize.Width - 270, 72 * ((i + 1) - Scroll)) Core.SpriteBatch.Draw(t1, New Rectangle(CInt(startPos.X), CInt(startPos.Y), 64, 64), Color.White) Core.SpriteBatch.Draw(t2, New Rectangle(CInt(startPos.X + 64), CInt(startPos.Y), 64, 64), Color.White) Core.SpriteBatch.Draw(t2, New Rectangle(CInt(startPos.X + 128), CInt(startPos.Y), 64, 64), Color.White) Core.SpriteBatch.Draw(t1, New Rectangle(CInt(startPos.X + 192), CInt(startPos.Y), 64, 64), Nothing, Color.White, 0.0F, New Vector2(0), SpriteEffects.FlipHorizontally, 0.0F) - Core.SpriteBatch.DrawString(FontManager.MainFont, Text, New Vector2(startPos.X + 128 - (FontManager.MainFont.MeasureString(Text).X * 1.4F) / 2, startPos.Y + 15), Color.Black, 0.0F, Vector2.Zero, 1.4F, SpriteEffects.None, 0.0F) + Core.SpriteBatch.DrawString(FontManager.MainFont, Text, New Vector2(CInt(startPos.X + 20), CInt(startPos.Y + 32 - FontManager.MainFont.MeasureString(Text).Y / 2)), Color.Black, 0.0F, Vector2.Zero, 1.0F, SpriteEffects.None, 0.0F) End If Next End If - Dim cPosition As Vector2 = New Vector2(cursorPos.X + 128, cursorPos.Y - 40) + Dim cPosition As Vector2 = New Vector2(CInt(cursorPos.X + 128), CInt(cursorPos.Y - 40)) Dim t As Texture2D = TextureManager.GetTexture("GUI\Menus\General", New Rectangle(0, 0, 16, 16), "") Core.SpriteBatch.Draw(t, New Rectangle(CInt(cPosition.X), CInt(cPosition.Y), 64, 64), Color.White) End Sub Private Sub SetCursorDest() - cursorDest = New Vector2(Core.windowSize.Width - 270, 66 * ((Index + 1) - Scroll)) + cursorDest = New Vector2(CInt(Core.windowSize.Width - 270), CInt(72 * (Index + 1 - Scroll))) End Sub Public ReadOnly Property SelectedItem() As String diff --git a/P3D/P3D.vbproj b/P3D/P3D.vbproj index ec8947d4c..3f0c657a7 100644 --- a/P3D/P3D.vbproj +++ b/P3D/P3D.vbproj @@ -14731,6 +14731,9 @@ <Content Include="Content\Sounds\Battle\Effects\MegaEvolution.wav"> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> </Content> + <Content Include="Content\Sounds\Emote_Exclamation.wav"> + <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> + </Content> <Content Include="Content\Textures\Battle\MegaEvolution\Mega_Phase1.png"> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> </Content> @@ -14746,6 +14749,9 @@ <Content Include="Content\Textures\Battle\Normal\Wrap.png"> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> </Content> + <Content Include="Content\Textures\Battle\StatusEffect\Burned.png"> + <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> + </Content> <Content Include="Content\Textures\Battle\StatusEffect\Frozen.png"> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> </Content> @@ -29285,7 +29291,6 @@ <Compile Include="Battle\BattleSystemV2\QueryObjects\EndBattleQueryObject.vb" /> <Compile Include="Battle\BattleSystemV2\QueryObjects\LearnMovesQueryObject.vb" /> <Compile Include="Battle\BattleSystemV2\QueryObjects\MathHPQueryObject.vb" /> - <Compile Include="Battle\BattleSystemV2\QueryObjects\MoveAnimationQueryObject.vb" /> <Compile Include="Battle\BattleSystemV2\QueryObjects\PlayMusicQueryObject.vb" /> <Compile Include="Battle\BattleSystemV2\QueryObjects\PlaySoundQueryObject.vb" /> <Compile Include="Battle\BattleSystemV2\QueryObjects\QueryObject.vb" /> 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