From 9a6a6d7999e2448c2265bc03a7633a901cf3c22e Mon Sep 17 00:00:00 2001 From: JappaWakka Date: Fri, 18 Apr 2025 13:07:25 +0200 Subject: [PATCH] Fix GM move functions not taking opp in account... MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit When a move with an effect used by an opponent pokémon, the effect target didn't get swapped. --- P3D/Pokemon/Attacks/AttackSpecialFunctions.vb | 155 +++++++++++++----- 1 file changed, 116 insertions(+), 39 deletions(-) diff --git a/P3D/Pokemon/Attacks/AttackSpecialFunctions.vb b/P3D/Pokemon/Attacks/AttackSpecialFunctions.vb index 69d7251c3..8b73cb19a 100644 --- a/P3D/Pokemon/Attacks/AttackSpecialFunctions.vb +++ b/P3D/Pokemon/Attacks/AttackSpecialFunctions.vb @@ -19,6 +19,8 @@ Dim fMain As String = f Dim fSub As String = "" + Dim EffectTarget As Boolean = Not own + Select Case f.GetSplit(0, ",").ToLower Case "settrigger" Trigger = f.GetSplit(1, ",") & "," & f.GetSplit(2, ",") @@ -28,6 +30,9 @@ If Trigger <> "" Then Dim Target As Boolean = CBool(Trigger.GetSplit(0, ",")) + If own = False Then + Target = Not Target + End If Dim Triggers() As String = Trigger.GetSplit(1, ",").Split(";") Dim Success As Boolean = False For t = 0 To Triggers.Count - 1 @@ -220,9 +225,15 @@ OppPokemon = BattleScreen.OwnPokemon End If - fSub = Localization.GetString(fSub, fSub).Replace("[OPPNAME]", OppPokemon.GetDisplayName).Replace("[OWNNAME]", OwnPokemon.GetDisplayName) + If own = True Then + fSub = Localization.GetString(fSub, fSub).Replace("[OPPNAME]", OppPokemon.GetDisplayName).Replace("[OWNNAME]", OwnPokemon.GetDisplayName) + Else + fSub = Localization.GetString(fSub, fSub).Replace("[OWNNAME]", OppPokemon.GetDisplayName).Replace("[OPPNAME]", OwnPokemon.GetDisplayName) + End If BattleScreen.BattleQuery.Add(New TextQueryObject(fSub)) Case "raisestat", "increasestat" + Dim OppPokemon As Pokemon = BattleScreen.OppPokemon + Dim OwnPokemon As Pokemon = BattleScreen.OwnPokemon Dim Stat As String = f.GetSplit(1, ",") Dim Target As Boolean = own Dim Message As String = "" @@ -234,8 +245,17 @@ If f.GetSplit(2, ",") <> "" Then Target = CBool(f.GetSplit(2, ",")) End If + If own = False Then + Target = Not Target + End If If f.Split(CChar(",")).Count > 3 Then Message = f.GetSplit(3, ",") + If own = True Then + Message = Message.Replace("[OPPNAME]", OppPokemon.GetDisplayName).Replace("[OWNNAME]", OwnPokemon.GetDisplayName) + Else + Message = Message.Replace("[OWNNAME]", OppPokemon.GetDisplayName).Replace("[OPPNAME]", OwnPokemon.GetDisplayName) + End If + If f.Split(CChar(",")).Count > 4 Then If f.GetSplit(4, ",") <> "" Then If CInt(f.GetSplit(4, ",")) > 0 Then @@ -257,9 +277,11 @@ End If RaiseStat(Move, own, Stat, Target, Message, RaiseAmount, Chance, FailMessage, BattleScreen) Case "lowerstat", "decreasestat" + Dim OppPokemon As Pokemon = BattleScreen.OppPokemon + Dim OwnPokemon As Pokemon = BattleScreen.OwnPokemon Dim Stat As String = f.GetSplit(1, ",") Dim Message As String = "" - Dim Target As Boolean = own + Dim Target As Boolean = not own Dim LowerAmount As Integer = 1 Dim Chance As Integer = 100 Dim FailMessage As String = "" @@ -268,8 +290,17 @@ If f.GetSplit(2, ",") <> "" Then Target = CBool(f.GetSplit(2, ",")) End If + If own = False Then + Target = Not Target + End If If f.Split(CChar(",")).Count > 3 Then Message = f.GetSplit(3, ",") + If own = True Then + Message = Message.Replace("[OPPNAME]", OppPokemon.GetDisplayName).Replace("[OWNNAME]", OwnPokemon.GetDisplayName) + Else + Message = Message.Replace("[OWNNAME]", OppPokemon.GetDisplayName).Replace("[OPPNAME]", OwnPokemon.GetDisplayName) + End If + If f.Split(CChar(",")).Count > 4 Then If f.GetSplit(4, ",") <> "" Then If CInt(f.GetSplit(4, ",")) > 0 Then @@ -293,7 +324,13 @@ End If LowerStat(Move, own, Stat, Target, Message, LowerAmount, Chance, FailMessage, BattleScreen) Case "reducehp", "drainhp", "damage" + Dim OppPokemon As Pokemon = BattleScreen.OppPokemon + Dim OwnPokemon As Pokemon = BattleScreen.OwnPokemon Dim Target As Boolean = CBool(f.GetSplit(1, ",")) + If own = False Then + Target = Not Target + End If + Dim HPAmount As Integer = 0 Dim Message As String = "" @@ -301,11 +338,22 @@ HPAmount = CInt(f.GetSplit(2, ",")) If f.Split(CChar(",")).Count > 3 Then Message = f.GetSplit(3, ",") + If own = True Then + Message = Message.Replace("[OPPNAME]", OppPokemon.GetDisplayName).Replace("[OWNNAME]", OwnPokemon.GetDisplayName) + Else + Message = Message.Replace("[OWNNAME]", OppPokemon.GetDisplayName).Replace("[OPPNAME]", OwnPokemon.GetDisplayName) + End If End If End If BattleScreen.Battle.ReduceHP(HPAmount, Target, own, BattleScreen, Message, "move:" & Move.Name.ToLower) Case "gainhp", "increasehp", "heal" + Dim OppPokemon As Pokemon = BattleScreen.OppPokemon + Dim OwnPokemon As Pokemon = BattleScreen.OwnPokemon Dim Target As Boolean = CBool(f.GetSplit(1, ",")) + If own = False Then + Target = Not Target + End If + Dim HPAmount As Integer = 0 Dim Message As String = "" @@ -313,6 +361,11 @@ HPAmount = CInt(f.GetSplit(2, ",")) If f.Split(CChar(",")).Count > 3 Then Message = f.GetSplit(3, ",") + If own = True Then + Message = Message.Replace("[OPPNAME]", OppPokemon.GetDisplayName).Replace("[OWNNAME]", OwnPokemon.GetDisplayName) + Else + Message = Message.Replace("[OWNNAME]", OppPokemon.GetDisplayName).Replace("[OPPNAME]", OwnPokemon.GetDisplayName) + End If End If End If BattleScreen.Battle.GainHP(HPAmount, Target, own, BattleScreen, Message, "move:" & Move.Name.ToLower) @@ -325,11 +378,16 @@ BattleScreen.BattleQuery.Add(New EndBattleQueryObject(Blackout)) Case "faint" Dim Target As Boolean = CBool(f.GetSplit(1, ",")) + If own = False Then + Target = Not Target + End If + Dim Message As String = "" Dim NextPokemonIndex As Integer = -1 Dim OppPokemon As Pokemon = BattleScreen.OppPokemon Dim OwnPokemon As Pokemon = BattleScreen.OwnPokemon + If Target = False Then OwnPokemon = BattleScreen.OppPokemon OppPokemon = BattleScreen.OwnPokemon @@ -348,16 +406,27 @@ BattleScreen.NextPokemonIndex = NextPokemonIndex If f.Split(CChar(",")).Count > 2 Then - Message = f.GetSplit(2, ",").Replace("[OPPNAME]", OppPokemon.GetDisplayName).Replace("[OWNNAME]", OwnPokemon.GetDisplayName) + If own = True Then + Message = f.GetSplit(2, ",").Replace("[OPPNAME]", OppPokemon.GetDisplayName).Replace("[OWNNAME]", OwnPokemon.GetDisplayName) + Else + Message = f.GetSplit(2, ",").Replace("[OWNNAME]", OppPokemon.GetDisplayName).Replace("[OPPNAME]", OwnPokemon.GetDisplayName) + End If End If BattleScreen.Battle.FaintPokemon(Not Target, BattleScreen, Message) Case "switch" + Dim OppPokemon As Pokemon = BattleScreen.OppPokemon + Dim OwnPokemon As Pokemon = BattleScreen.OwnPokemon Dim Target As Boolean = CBool(f.GetSplit(1, ",")) Dim SwitchTo As Integer = 0 Dim Message As String = "" If f.Split(CChar(",")).Count > 3 Then Message = f.GetSplit(3, ",") + If own = True Then + Message = Message.Replace("[OPPNAME]", OppPokemon.GetDisplayName).Replace("[OWNNAME]", OwnPokemon.GetDisplayName) + Else + Message = Message.Replace("[OWNNAME]", OppPokemon.GetDisplayName).Replace("[OPPNAME]", OwnPokemon.GetDisplayName) + End If End If If Target = True Then If f.GetSplit(2, ",").StartsWith("~+") Then @@ -381,8 +450,14 @@ If f.Split(CChar(",")).Count > 2 Then fSub &= "," & f.GetSplit(2, ",") End If + If f.Split(CChar(",")).Count > 3 Then + EffectTarget = CBool(f.GetSplit(3, ",")) + End If Case Else fSub = CInt(f.GetSplit(1, ",")).Clamp(0, 100).ToString + If f.Split(CChar(",")).Count > 2 Then + EffectTarget = CBool(f.GetSplit(2, ",")) + End If End Select Else Select Case f.ToLower() @@ -403,50 +478,52 @@ End Select End If + If own = False Then + EffectTarget = Not EffectTarget + End If Select Case fMain.ToLower() Case "flinch" - Flinch(Move, own, BattleScreen, CInt(fSub)) + Flinch(Move, own, EffectTarget, BattleScreen, CInt(fSub)) Case "randomstatus" Dim chance As Integer = CInt(fSub.GetSplit(0, ",")) Dim withoutBadPoison As Boolean = False If fSub.Contains(",") Then withoutBadPoison = CBool(fSub.GetSplit(1, ",")) End If - Dim randomNumber As Integer = Core.Random.Next(0, 7) If withoutBadPoison = True Then randomNumber = Core.Random.Next(0, 6) End If Select Case randomNumber Case 0 - Paralyze(Move, own, BattleScreen, CInt(fSub)) + Paralyze(Move, own, EffectTarget, BattleScreen, CInt(fSub)) Case 1 - Poison(Move, own, BattleScreen, CInt(fSub)) + Poison(Move, own, EffectTarget, BattleScreen, CInt(fSub)) Case 2 - Burn(Move, own, BattleScreen, CInt(fSub)) + Burn(Move, own, EffectTarget, BattleScreen, CInt(fSub)) Case 3 - Freeze(Move, own, BattleScreen, CInt(fSub)) + Freeze(Move, own, EffectTarget, BattleScreen, CInt(fSub)) Case 4 - Sleep(Move, own, BattleScreen, CInt(fSub)) + Sleep(Move, own, EffectTarget, BattleScreen, CInt(fSub)) Case 5 - Confuse(Move, own, BattleScreen, CInt(fSub)) + Confuse(Move, own, EffectTarget, BattleScreen, CInt(fSub)) Case 6 - BadPoison(Move, own, BattleScreen, CInt(fSub)) + BadPoison(Move, own, EffectTarget, BattleScreen, CInt(fSub)) End Select Case "paralyze" - Paralyze(Move, own, BattleScreen, CInt(fSub)) + Paralyze(Move, own, EffectTarget, BattleScreen, CInt(fSub)) Case "poison" - Poison(Move, own, BattleScreen, CInt(fSub)) + Poison(Move, own, EffectTarget, BattleScreen, CInt(fSub)) Case "toxic", "badpoison" - BadPoison(Move, own, BattleScreen, CInt(fSub)) + BadPoison(Move, own, EffectTarget, BattleScreen, CInt(fSub)) Case "burn" - Burn(Move, own, BattleScreen, CInt(fSub)) + Burn(Move, own, EffectTarget, BattleScreen, CInt(fSub)) Case "freeze" - Freeze(Move, own, BattleScreen, CInt(fSub)) + Freeze(Move, own, EffectTarget, BattleScreen, CInt(fSub)) Case "sleep" - Sleep(Move, own, BattleScreen, CInt(fSub)) + Sleep(Move, own, EffectTarget, BattleScreen, CInt(fSub)) Case "confuse" - Confuse(Move, own, BattleScreen, CInt(fSub)) + Confuse(Move, own, EffectTarget, BattleScreen, CInt(fSub)) End Select End If Next @@ -457,12 +534,12 @@ End Function Private Shared Sub LowerStat(ByVal Move As Attack, own As Boolean, Stat As String, Target As Boolean, Message As String, LowerAmount As Integer, Chance As Integer, FailMessage As String, ByVal BattleScreen As BattleScreen) If GetEffectChanceResult(Move, Chance) = True Then - If BattleScreen.Battle.LowerStat(Target, own, BattleScreen, Stat, LowerAmount, Message, "move:" & Move.Name, True) = False Then + If BattleScreen.Battle.LowerStat(Not Target, own, BattleScreen, Stat, LowerAmount, Message, "move:" & Move.Name.ToLower, True) = False Then If Move.Category = Attack.Categories.Status Then If FailMessage = "" Then BattleScreen.BattleQuery.Add(New TextQueryObject(Move.Name & " failed!")) Else - BattleScreen.BattleQuery.Add(New TextQueryObject(FailMessage.Replace("", Move.Name))) + BattleScreen.BattleQuery.Add(New TextQueryObject(FailMessage.Replace("[MOVENAME]", Move.Name))) End If End If End If @@ -470,74 +547,74 @@ End Sub Private Shared Sub RaiseStat(ByVal Move As Attack, own As Boolean, Stat As String, Target As Boolean, Message As String, RaiseAmount As Integer, Chance As Integer, FailMessage As String, ByVal BattleScreen As BattleScreen) If GetEffectChanceResult(Move, Chance) = True Then - If BattleScreen.Battle.RaiseStat(Target, own, BattleScreen, Stat, RaiseAmount, Message, "move:" & Move.Name, True) = False Then + If BattleScreen.Battle.RaiseStat(Not Target, own, BattleScreen, Stat, RaiseAmount, Message, "move:" & Move.Name.ToLower, True) = False Then If Move.Category = Attack.Categories.Status Then If FailMessage = "" Then BattleScreen.BattleQuery.Add(New TextQueryObject(Move.Name & " failed!")) Else - BattleScreen.BattleQuery.Add(New TextQueryObject(FailMessage.Replace("", Move.Name))) + BattleScreen.BattleQuery.Add(New TextQueryObject(FailMessage.Replace("[MOVENAME]", Move.Name))) End If End If End If End If End Sub - Private Shared Sub Flinch(ByVal Move As Attack, ByVal own As Boolean, ByVal BattleScreen As BattleScreen, Chance As Integer) + Private Shared Sub Flinch(ByVal Move As Attack, ByVal own As Boolean, Target As Boolean, ByVal BattleScreen As BattleScreen, Chance As Integer) If GetEffectChanceResult(Move, Chance) = True Then - BattleScreen.Battle.InflictFlinch(Not own, own, BattleScreen, "", "move:" & Move.Name.ToLower()) + BattleScreen.Battle.InflictFlinch(Not Target, own, BattleScreen, "", "move:" & Move.Name.ToLower()) End If End Sub - Private Shared Sub Paralyze(ByVal Move As Attack, ByVal own As Boolean, ByVal BattleScreen As BattleScreen, Chance As Integer) + Private Shared Sub Paralyze(ByVal Move As Attack, ByVal own As Boolean, Target As Boolean, ByVal BattleScreen As BattleScreen, Chance As Integer) If GetEffectChanceResult(Move, Chance) = True Then - If BattleScreen.Battle.InflictParalysis(Not own, own, BattleScreen, "", "move:" & Move.Name.ToLower()) = False Then + If BattleScreen.Battle.InflictParalysis(Not Target, own, BattleScreen, "", "move:" & Move.Name.ToLower()) = False Then If Move.Category = Attack.Categories.Status Then BattleScreen.BattleQuery.Add(New TextQueryObject(Move.Name & " failed!")) End If End If End Sub - Private Shared Sub Confuse(ByVal Move As Attack, ByVal own As Boolean, ByVal BattleScreen As BattleScreen, Chance As Integer) + Private Shared Sub Confuse(ByVal Move As Attack, ByVal own As Boolean, Target As Boolean, ByVal BattleScreen As BattleScreen, Chance As Integer) If GetEffectChanceResult(Move, Chance) = True Then - If BattleScreen.Battle.InflictConfusion(Not own, own, BattleScreen, "", "move:" & Move.Name.ToLower()) = False Then + If BattleScreen.Battle.InflictConfusion(Not Target, own, BattleScreen, "", "move:" & Move.Name.ToLower()) = False Then If Move.Category = Attack.Categories.Status Then BattleScreen.BattleQuery.Add(New TextQueryObject(Move.Name & " failed!")) End If End If End Sub - Private Shared Sub Burn(ByVal Move As Attack, ByVal own As Boolean, ByVal BattleScreen As BattleScreen, Chance As Integer) + Private Shared Sub Burn(ByVal Move As Attack, ByVal own As Boolean, Target As Boolean, ByVal BattleScreen As BattleScreen, Chance As Integer) If GetEffectChanceResult(Move, Chance) = True Then - If BattleScreen.Battle.InflictBurn(Not own, own, BattleScreen, "", "move:" & Move.Name.ToLower()) = False Then + If BattleScreen.Battle.InflictBurn(Not Target, own, BattleScreen, "", "move:" & Move.Name.ToLower()) = False Then If Move.Category = Attack.Categories.Status Then BattleScreen.BattleQuery.Add(New TextQueryObject(Move.Name & " failed!")) End If End If End Sub - Private Shared Sub Sleep(ByVal Move As Attack, ByVal own As Boolean, ByVal BattleScreen As BattleScreen, Chance As Integer) + Private Shared Sub Sleep(ByVal Move As Attack, ByVal own As Boolean, Target As Boolean, ByVal BattleScreen As BattleScreen, Chance As Integer) If GetEffectChanceResult(Move, Chance) = True Then - If BattleScreen.Battle.InflictSleep(Not own, own, BattleScreen, -1, "", "move:" & Move.Name.ToLower()) = False Then + If BattleScreen.Battle.InflictSleep(Not Target, own, BattleScreen, -1, "", "move:" & Move.Name.ToLower()) = False Then If Move.Category = Attack.Categories.Status Then BattleScreen.BattleQuery.Add(New TextQueryObject(Move.Name & " failed!")) End If End If End Sub - Private Shared Sub Freeze(ByVal Move As Attack, ByVal own As Boolean, ByVal BattleScreen As BattleScreen, Chance As Integer) + Private Shared Sub Freeze(ByVal Move As Attack, ByVal own As Boolean, Target As Boolean, ByVal BattleScreen As BattleScreen, Chance As Integer) If GetEffectChanceResult(Move, Chance) = True Then - If BattleScreen.Battle.InflictFreeze(Not own, own, BattleScreen, "", "move:" & Move.Name.ToLower()) = False Then + If BattleScreen.Battle.InflictFreeze(Not Target, own, BattleScreen, "", "move:" & Move.Name.ToLower()) = False Then If Move.Category = Attack.Categories.Status Then BattleScreen.BattleQuery.Add(New TextQueryObject(Move.Name & " failed!")) End If End If End Sub - Private Shared Sub Poison(ByVal Move As Attack, ByVal own As Boolean, ByVal BattleScreen As BattleScreen, Chance As Integer) + Private Shared Sub Poison(ByVal Move As Attack, ByVal own As Boolean, Target As Boolean, ByVal BattleScreen As BattleScreen, Chance As Integer) If GetEffectChanceResult(Move, Chance) = True Then - If BattleScreen.Battle.InflictPoison(Not own, own, BattleScreen, False, "", "move:" & Move.Name.ToLower()) = False Then + If BattleScreen.Battle.InflictPoison(Not Target, own, BattleScreen, False, "", "move:" & Move.Name.ToLower()) = False Then If Move.Category = Attack.Categories.Status Then BattleScreen.BattleQuery.Add(New TextQueryObject(Move.Name & " failed!")) End If End If End Sub - Private Shared Sub BadPoison(ByVal Move As Attack, ByVal own As Boolean, ByVal BattleScreen As BattleScreen, Chance As Integer) + Private Shared Sub BadPoison(ByVal Move As Attack, ByVal own As Boolean, Target As Boolean, ByVal BattleScreen As BattleScreen, Chance As Integer) If GetEffectChanceResult(Move, Chance) = True Then - If BattleScreen.Battle.InflictPoison(Not own, own, BattleScreen, True, "", "move:" & Move.Name.ToLower()) = False Then + If BattleScreen.Battle.InflictPoison(Not Target, own, BattleScreen, True, "", "move:" & Move.Name.ToLower()) = False Then If Move.Category = Attack.Categories.Status Then BattleScreen.BattleQuery.Add(New TextQueryObject(Move.Name & " failed!")) End If End If