From e2d0996ffd9f4f36908e0d276a08c525dc01f325 Mon Sep 17 00:00:00 2001 From: JappaWakka Date: Sun, 10 Dec 2023 13:11:48 +0100 Subject: [PATCH 01/36] =?UTF-8?q?Make=20it=20possible=20to=20reset=20the?= =?UTF-8?q?=20Pok=C3=A9mon=20status?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- P3D/World/ActionScript/V2/ScriptCommands/DoPokemon.vb | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/P3D/World/ActionScript/V2/ScriptCommands/DoPokemon.vb b/P3D/World/ActionScript/V2/ScriptCommands/DoPokemon.vb index 931a1ba37..3380c5d31 100644 --- a/P3D/World/ActionScript/V2/ScriptCommands/DoPokemon.vb +++ b/P3D/World/ActionScript/V2/ScriptCommands/DoPokemon.vb @@ -1043,6 +1043,10 @@ Status = Pokemon.StatusProblems.Sleep Case "fnt" Status = Pokemon.StatusProblems.Fainted + Case "none" + Status = Pokemon.StatusProblems.None + Case Else + Status = Pokemon.StatusProblems.None End Select If Status <> Nothing AndAlso Core.Player.Pokemons.Count - 1 >= Index Then Core.Player.Pokemons(Index).Status = Status From 58d438f179985f0c90503f9b236433854c7c37e5 Mon Sep 17 00:00:00 2001 From: JappaWakka Date: Sun, 10 Dec 2023 13:13:06 +0100 Subject: [PATCH 02/36] Fix Rare Candy healing before checking evolution --- P3D/Pokemon/Items/Medicine/RareCandy.vb | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/P3D/Pokemon/Items/Medicine/RareCandy.vb b/P3D/Pokemon/Items/Medicine/RareCandy.vb index efca7a8a5..0ab3dacea 100644 --- a/P3D/Pokemon/Items/Medicine/RareCandy.vb +++ b/P3D/Pokemon/Items/Medicine/RareCandy.vb @@ -29,10 +29,6 @@ Namespace Items.Medicine Dim beforeHP As Integer = Pokemon.MaxHP Pokemon.LevelUp(False) Pokemon.Experience = Pokemon.NeedExperience(Pokemon.Level) - If Pokemon.Status = P3D.Pokemon.StatusProblems.Fainted Then - Pokemon.Status = P3D.Pokemon.StatusProblems.None - Pokemon.HP = (Pokemon.MaxHP - beforeHP).Clamp(1, 999) - End If Dim s As String = "version=2" & Environment.NewLine & @@ -66,6 +62,11 @@ Namespace Items.Medicine s &= "@pokemon.evolve(" & PokeIndex & ")" & Environment.NewLine End If + If Pokemon.Status = P3D.Pokemon.StatusProblems.Fainted Then + s &= "@pokemon.setstatus(" & PokeIndex & ",none)" & Environment.NewLine & + "@pokemon.setstat(" & PokeIndex & ",chp," & (Pokemon.MaxHP - beforeHP).Clamp(1, 999) & ")" & Environment.NewLine + End If + If removedItem = False Then Dim t As String = Me.RemoveItem() If t <> "" Then From 250bc9899f68d834736a8d9cc91d02530ff65956 Mon Sep 17 00:00:00 2001 From: JappaWakka Date: Sun, 10 Dec 2023 14:27:47 +0100 Subject: [PATCH 03/36] Implement BasePower calc mods for GameModeMoves --- P3D/Pokemon/Attacks/Attack.vb | 7 +- P3D/Pokemon/Attacks/AttackSpecialBasePower.vb | 303 ++++++++++++++++++ P3D/Pokemon/Attacks/GameModeAttackLoader.vb | 7 + 3 files changed, 316 insertions(+), 1 deletion(-) create mode 100644 P3D/Pokemon/Attacks/AttackSpecialBasePower.vb diff --git a/P3D/Pokemon/Attacks/Attack.vb b/P3D/Pokemon/Attacks/Attack.vb index 8aae6332c..6192da781 100644 --- a/P3D/Pokemon/Attacks/Attack.vb +++ b/P3D/Pokemon/Attacks/Attack.vb @@ -181,6 +181,7 @@ Public IsDefaultMove As Boolean = False 'if Pound gets loaded instead of the correct move, this is true. Public GameModeFunction As String = "" 'A GameMode can specify a pre defined function for a move. + Public GameModeBasePower As String = "" 'A GameMode can specify a base power calculation for a move. Public IsGameModeMove As Boolean = False Public gmDeductPP As Boolean = True @@ -1954,7 +1955,11 @@ ''' If the own Pokémon used the move. ''' Reference to the BattleScreen. Public Overridable Function GetBasePower(ByVal own As Boolean, ByVal BattleScreen As BattleScreen) As Integer - Return Me.Power + If Me.IsGameModeMove = False Then + Return Me.Power + Else + Return AttackSpecialBasePower.GetGameModeBasePower(Me, own, BattleScreen) + End If End Function ''' diff --git a/P3D/Pokemon/Attacks/AttackSpecialBasePower.vb b/P3D/Pokemon/Attacks/AttackSpecialBasePower.vb new file mode 100644 index 000000000..4e9938060 --- /dev/null +++ b/P3D/Pokemon/Attacks/AttackSpecialBasePower.vb @@ -0,0 +1,303 @@ +Namespace BattleSystem + + ''' + ''' A class to execute GameMode attack functions. + ''' + Public Class AttackSpecialBasePower + + ''' + ''' Executes the attack function(s). + ''' + ''' The move containing the attack function. + ''' Own toggle. + ''' Reference to the BattleScreen. + Public Shared Function GetGameModeBasePower(ByVal Move As Attack, ByVal own As Boolean, ByVal BattleScreen As BattleScreen) As Integer + If Move.GameModeBasePower <> "" Then + Dim basePowerCalcs() As String = Move.GameModeBasePower.Split("|") + Dim applyMultiplier As Single = 1 + For i = 0 To basePowerCalcs.Count - 1 + Dim b As String = basePowerCalcs(i) + Dim bMain As String = b.Remove(b.IndexOf(",")) + Dim bSub As String = b.Remove(0, b.IndexOf(",") + 1) + + Select Case bMain.ToLower + Case "status" + Dim Target As Boolean = own + Dim Status As String = bSub.GetSplit(0, ",") + Dim Multiplier As Single = 1 + If bSub.Split(",").Count > 1 Then + Multiplier = CSng(bSub.GetSplit(1, ",").InsertDecSeparator) + If bSub.Split(",").Count > 2 Then + If own = True Then + Target = Not CBool(bSub.GetSplit(2, ",")) + Else + Target = CBool(bSub.GetSplit(2, ",")) + End If + + End If + End If + + Dim Success As Boolean = False + + Select Case Status.ToLower() + Case "confuse" + If Target = True Then + If BattleScreen.OppPokemon.HasVolatileStatus(Pokemon.VolatileStatus.Confusion) = True Then + Success = True + End If + Else + If BattleScreen.OwnPokemon.HasVolatileStatus(Pokemon.VolatileStatus.Confusion) = True Then + Success = True + End If + End If + Case "burn" + If Target = True Then + If BattleScreen.OppPokemon.Status = Pokemon.StatusProblems.Burn Then + Success = True + End If + Else + If BattleScreen.OwnPokemon.Status = Pokemon.StatusProblems.Burn Then + Success = True + End If + End If + Case "freeze" + If Target = True Then + If BattleScreen.OppPokemon.Status = Pokemon.StatusProblems.Freeze Then + Success = True + End If + Else + If BattleScreen.OwnPokemon.Status = Pokemon.StatusProblems.Freeze Then + Success = True + End If + End If + Case "paralyze" + If Target = True Then + If BattleScreen.OppPokemon.Status = Pokemon.StatusProblems.Paralyzed Then + Success = True + End If + Else + If BattleScreen.OwnPokemon.Status = Pokemon.StatusProblems.Paralyzed Then + Success = True + End If + End If + Case "poison" + If Target = True Then + If BattleScreen.OppPokemon.Status = Pokemon.StatusProblems.Poison Then + Success = True + End If + Else + If BattleScreen.OwnPokemon.Status = Pokemon.StatusProblems.Poison Then + Success = True + End If + End If + Case "toxic", "badpoison" + If Target = True Then + If BattleScreen.OppPokemon.Status = Pokemon.StatusProblems.BadPoison Then + Success = True + End If + Else + If BattleScreen.OwnPokemon.Status = Pokemon.StatusProblems.BadPoison Then + Success = True + End If + End If + Case "anypoison" + If Target = True Then + If BattleScreen.OppPokemon.Status = Pokemon.StatusProblems.Poison OrElse BattleScreen.OppPokemon.Status = Pokemon.StatusProblems.BadPoison Then + Success = True + End If + Else + If BattleScreen.OwnPokemon.Status = Pokemon.StatusProblems.Poison OrElse BattleScreen.OwnPokemon.Status = Pokemon.StatusProblems.BadPoison Then + Success = True + End If + End If + Case "sleep" + If Target = True Then + If BattleScreen.OppPokemon.Status = Pokemon.StatusProblems.Sleep Then + Success = True + End If + Else + If BattleScreen.OwnPokemon.Status = Pokemon.StatusProblems.Sleep Then + Success = True + End If + End If + Case "noconfuse" + If Target = True Then + If BattleScreen.OppPokemon.HasVolatileStatus(Pokemon.VolatileStatus.Confusion) = False Then + Success = True + End If + Else + If BattleScreen.OwnPokemon.HasVolatileStatus(Pokemon.VolatileStatus.Confusion) = False Then + Success = True + End If + End If + Case "noburn" + If Target = True Then + If BattleScreen.OppPokemon.Status <> Pokemon.StatusProblems.Burn Then + Success = True + End If + Else + If BattleScreen.OwnPokemon.Status <> Pokemon.StatusProblems.Burn Then + Success = True + End If + End If + Case "nofreeze" + If Target = True Then + If BattleScreen.OppPokemon.Status <> Pokemon.StatusProblems.Freeze Then + Success = True + End If + Else + If BattleScreen.OwnPokemon.Status <> Pokemon.StatusProblems.Freeze Then + Success = True + End If + End If + Case "noparalyze" + If Target = True Then + If BattleScreen.OppPokemon.Status <> Pokemon.StatusProblems.Paralyzed Then + Success = True + End If + Else + If BattleScreen.OwnPokemon.Status <> Pokemon.StatusProblems.Paralyzed Then + Success = True + End If + End If + Case "nopoison" + If Target = True Then + If BattleScreen.OppPokemon.Status <> Pokemon.StatusProblems.Poison Then + Success = True + End If + Else + If BattleScreen.OwnPokemon.Status <> Pokemon.StatusProblems.Poison Then + Success = True + End If + End If + Case "notoxic", "nobadpoison" + If Target = True Then + If BattleScreen.OppPokemon.Status <> Pokemon.StatusProblems.BadPoison Then + Success = True + End If + Else + If BattleScreen.OwnPokemon.Status <> Pokemon.StatusProblems.BadPoison Then + Success = True + End If + End If + Case "nopoison" + If Target = True Then + If BattleScreen.OppPokemon.Status <> Pokemon.StatusProblems.Poison AndAlso BattleScreen.OppPokemon.Status <> Pokemon.StatusProblems.BadPoison Then + Success = True + End If + Else + If BattleScreen.OwnPokemon.Status <> Pokemon.StatusProblems.Poison AndAlso BattleScreen.OwnPokemon.Status <> Pokemon.StatusProblems.BadPoison Then + Success = True + End If + End If + Case "nosleep" + If Target = True Then + If BattleScreen.OppPokemon.Status <> Pokemon.StatusProblems.Sleep Then + Success = True + End If + Else + If BattleScreen.OwnPokemon.Status <> Pokemon.StatusProblems.Sleep Then + Success = True + End If + End If + End Select + If Success = True Then + applyMultiplier *= Multiplier + End If + Case "underground" + Dim Target As Boolean = own + Dim Multiplier As Single = 1 + Dim Success As Boolean = False + If bSub.Split(",").Count > 0 Then + Multiplier = CSng(bSub.GetSplit(0, ",").InsertDecSeparator) + If bSub.Split(",").Count > 1 Then + If own = True Then + Target = Not CBool(bSub.GetSplit(1, ",")) + Else + Target = CBool(bSub.GetSplit(1, ",")) + End If + End If + End If + If Target = True Then + If BattleScreen.FieldEffects.OppDigCounter > 0 Then + Success = True + End If + Else + If BattleScreen.FieldEffects.OwnDigCounter > 0 Then + Success = True + End If + End If + If Success = True Then + applyMultiplier *= Multiplier + End If + Case "inmidair" + Dim Target As Boolean = own + Dim Multiplier As Single = 1 + Dim Success As Boolean = False + If bSub.Split(",").Count > 0 Then + Multiplier = CSng(bSub.GetSplit(0, ",").InsertDecSeparator) + If own = True Then + Target = Not CBool(bSub.GetSplit(1, ",")) + Else + Target = CBool(bSub.GetSplit(1, ",")) + End If + End If + If Target = True Then + If BattleScreen.FieldEffects.OppFlyCounter > 0 Then + Success = True + End If + If BattleScreen.FieldEffects.OppBounceCounter > 0 Then + Success = True + End If + If BattleScreen.FieldEffects.OppSkyDropCounter > 0 Then + Success = True + End If + Else + If BattleScreen.FieldEffects.OwnFlyCounter > 0 Then + Success = True + End If + If BattleScreen.FieldEffects.OwnBounceCounter > 0 Then + Success = True + End If + If BattleScreen.FieldEffects.OwnSkyDropCounter > 0 Then + Success = True + End If + End If + If Success = True Then + applyMultiplier *= Multiplier + End If + Case "underwater" + Dim Target As Boolean = own + Dim Multiplier As Single = 1 + Dim Success As Boolean = False + If bSub.Split(",").Count > 0 Then + Multiplier = CSng(bSub.GetSplit(0, ",").InsertDecSeparator) + If own = True Then + Target = Not CBool(bSub.GetSplit(1, ",")) + Else + Target = CBool(bSub.GetSplit(1, ",")) + End If + End If + If Target = True Then + If BattleScreen.FieldEffects.OppDiveCounter > 0 Then + Success = True + End If + Else + If BattleScreen.FieldEffects.OwnDiveCounter > 0 Then + Success = True + End If + End If + If Success = True Then + applyMultiplier *= Multiplier + End If + End Select + Next + Return CInt(Move.Power * applyMultiplier) + Else + Return Move.Power + End If + End Function + + End Class + +End Namespace \ No newline at end of file diff --git a/P3D/Pokemon/Attacks/GameModeAttackLoader.vb b/P3D/Pokemon/Attacks/GameModeAttackLoader.vb index e1cd93063..c8a82b86a 100644 --- a/P3D/Pokemon/Attacks/GameModeAttackLoader.vb +++ b/P3D/Pokemon/Attacks/GameModeAttackLoader.vb @@ -72,6 +72,13 @@ Dim OldFunctionList = move.GameModeFunction move.GameModeFunction = OldFunctionList & "|" & value End If + Case "basepower", "getbasepower" + If move.GameModeBasePower = "" Then + move.GameModeBasePower = value + Else + Dim OldBasePowerCalculationList = move.GameModeBasePower + move.GameModeBasePower = OldBasePowerCalculationList & "|" & value + End If Case "power", "basepower" move.Power = CInt(value) Case "accuracy", "acc" From 68a64fde7d7abc77a4109c82ca1eae113c85235f Mon Sep 17 00:00:00 2001 From: JappaWakka Date: Sun, 10 Dec 2023 14:36:12 +0100 Subject: [PATCH 04/36] Fix conflict in properties --- P3D/Pokemon/Attacks/GameModeAttackLoader.vb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/P3D/Pokemon/Attacks/GameModeAttackLoader.vb b/P3D/Pokemon/Attacks/GameModeAttackLoader.vb index c8a82b86a..4bdfdca28 100644 --- a/P3D/Pokemon/Attacks/GameModeAttackLoader.vb +++ b/P3D/Pokemon/Attacks/GameModeAttackLoader.vb @@ -72,7 +72,7 @@ Dim OldFunctionList = move.GameModeFunction move.GameModeFunction = OldFunctionList & "|" & value End If - Case "basepower", "getbasepower" + Case "multiplier", "getbasepower" If move.GameModeBasePower = "" Then move.GameModeBasePower = value Else From 2c3ca27c2d0a2b78177f3c7ef1d293ab1fa717ea Mon Sep 17 00:00:00 2001 From: JappaWakka Date: Sun, 10 Dec 2023 14:53:59 +0100 Subject: [PATCH 05/36] Implemented RandomStatus GM move function --- P3D/Pokemon/Attacks/AttackSpecialFunctions.vb | 32 +++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/P3D/Pokemon/Attacks/AttackSpecialFunctions.vb b/P3D/Pokemon/Attacks/AttackSpecialFunctions.vb index 39c3cd566..5334c83c4 100644 --- a/P3D/Pokemon/Attacks/AttackSpecialFunctions.vb +++ b/P3D/Pokemon/Attacks/AttackSpecialFunctions.vb @@ -358,6 +358,11 @@ End If BattleScreen.Battle.SwitchOutOwn(BattleScreen, SwitchTo, -1, Message) End If + Case "randomstatus" + fSub = CInt(f.GetSplit(1, ",")).Clamp(0, 100).ToString + If f.Split(CChar(",")).Count > 2 Then + fSub &= "," & f.GetSplit(2, ",") + End If Case Else fSub = CInt(f.GetSplit(1, ",")).Clamp(0, 100).ToString End Select @@ -381,6 +386,33 @@ End If Select Case fMain.ToLower() + 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)) + Case 1 + Poison(Move, own, BattleScreen, CInt(fSub)) + Case 2 + Burn(Move, own, BattleScreen, CInt(fSub)) + Case 3 + Freeze(Move, own, BattleScreen, CInt(fSub)) + Case 4 + Sleep(Move, own, BattleScreen, CInt(fSub)) + Case 5 + Confuse(Move, own, BattleScreen, CInt(fSub)) + Case 6 + BadPoison(Move, own, BattleScreen, CInt(fSub)) + End Select Case "paralyze" Paralyze(Move, own, BattleScreen, CInt(fSub)) Case "poison" From 0e5c260f429c9055464abb9408cdb0fdff63270f Mon Sep 17 00:00:00 2001 From: JappaWakka Date: Sun, 10 Dec 2023 15:21:02 +0100 Subject: [PATCH 06/36] Update Example Move --- P3D/Content/Data/Moves/example.dat | Bin 6350 -> 8008 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/P3D/Content/Data/Moves/example.dat b/P3D/Content/Data/Moves/example.dat index c8f8792ce300da01c8e29597a94bb5fa45f4526d..8ab58780cc0f18314182f86f1e091dc808fe52e1 100644 GIT binary patch delta 1439 zcmaJ>yKWOv5S@e|FsvQPk(~0-QVJx8Dn-B$_y9lFWEI^=( z6!ec1gg3N63*qd?g|R>n=RQ86)DcQctR!6D2A-47M@d6z0TpV=P|Nh;aa1CB%6Qgb zDS>DS|9!E!#r%zP^pOp@Be(Hg25|lD<0bofJ|Fn9b9y-1K`K#*_8Z_DfGz7A^bzBm ztxwx2AN^Y+WEIFGSYrEWzL3;q0N?B?unHF=LKOpLh-qk^hU~-MMQ;Wp;y8%HUf@h7 zJ*|JB=SY>}2w8JqexVLCmLw}z`Ea2UD3|J&7Hg|=OmfzGyPcXO$Lm@{atd=(l_u4(zT8gEW11|j zT}immT$<+O7;sPAlFX_)nZ(^oCU&~;ss!=^{ZnJ=aaIF$cv^@c0{YfRg=WQ~^sak% zmu8jVP1;tW(;L9VT!RNnr=>d>aMbp9wqUDX(Qe{tdaD;J=zCyquw8Vt6x@C+;glO7I)6(9g603ZM&07C$80B!(g0CfO! S0A-WA4;z#64yLoR6_yD$^%7(N From 705e0b97253e09cd9c5d71b8e01f8434fcca11af Mon Sep 17 00:00:00 2001 From: JappaWakka Date: Sun, 10 Dec 2023 15:32:54 +0100 Subject: [PATCH 07/36] Implemented random TimesToAttack move property --- P3D/Pokemon/Attacks/Attack.vb | 11 ++++++++++- P3D/Pokemon/Attacks/GameModeAttackLoader.vb | 2 +- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/P3D/Pokemon/Attacks/Attack.vb b/P3D/Pokemon/Attacks/Attack.vb index 6192da781..d5e5f0ee8 100644 --- a/P3D/Pokemon/Attacks/Attack.vb +++ b/P3D/Pokemon/Attacks/Attack.vb @@ -198,6 +198,7 @@ Public Target As Targets = Targets.OneAdjacentTarget Public Priority As Integer = 0 Public TimesToAttack As Integer = 1 + Public gmTimesToAttack As String = "1" Public EffectChances As New List(Of Integer) '#End @@ -1977,7 +1978,15 @@ ''' If the own Pokémon used the move. ''' Reference to the BattleScreen. Public Overridable Function GetTimesToAttack(ByVal own As Boolean, ByVal BattleScreen As BattleScreen) As Integer - Return Me.TimesToAttack + If Me.IsGameModeMove = False Then + Return Me.TimesToAttack + Else + If gmTimesToAttack.Contains("-") Then + Return Core.Random.Next(CInt(gmTimesToAttack.GetSplit(0, "-")), CInt(gmTimesToAttack.GetSplit(1, "-")) + 1) + Else + Return CInt(gmTimesToAttack) + End If + End If End Function ''' diff --git a/P3D/Pokemon/Attacks/GameModeAttackLoader.vb b/P3D/Pokemon/Attacks/GameModeAttackLoader.vb index 4bdfdca28..8f24e8889 100644 --- a/P3D/Pokemon/Attacks/GameModeAttackLoader.vb +++ b/P3D/Pokemon/Attacks/GameModeAttackLoader.vb @@ -118,7 +118,7 @@ Case "priority" move.Priority = CInt(value) Case "timestoattack", "tta" - move.TimesToAttack = CInt(value) + move.gmTimesToAttack = value Case "makescontact", "contact" move.MakesContact = CBool(value) Case "protectaffected" From a5e68a153ac7351df519539d325b741bd3e0b9d9 Mon Sep 17 00:00:00 2001 From: JappaWakka Date: Sun, 10 Dec 2023 20:19:14 +0100 Subject: [PATCH 08/36] Implement Custom Types --- P3D/P3D.vbproj | 2 + P3D/Player/Player.vb | 1 + P3D/Pokemon/Attacks/GameModeAttackLoader.vb | 6 +- P3D/Pokemon/Attacks/Normal/NaturalGift.vb | 2 +- P3D/Pokemon/Items/Berry.vb | 2 +- P3D/Pokemon/Items/GameModeItem.vb | 80 +- P3D/Pokemon/Items/GameModeItemLoader.vb | 7 +- P3D/Pokemon/Monster/Element.vb | 1597 +++++++++--------- P3D/Pokemon/Monster/EvolutionCondition.vb | 2 +- P3D/Pokemon/Monster/GameModeElementLoader.vb | 291 ++++ P3D/Pokemon/Monster/Pokemon.vb | 2 +- P3D/Pokemon/Monster/PokemonInteractions.vb | 6 +- P3D/Pokemon/Monster/Resource/PokemonForms.vb | 95 +- P3D/Screens/MainMenu/NewNewGameScreen.vb | 1 + P3D/Screens/NewGameScreen.vb | 1 + 15 files changed, 1227 insertions(+), 868 deletions(-) create mode 100644 P3D/Pokemon/Monster/GameModeElementLoader.vb diff --git a/P3D/P3D.vbproj b/P3D/P3D.vbproj index 9c92adc9b..468ebf3b2 100644 --- a/P3D/P3D.vbproj +++ b/P3D/P3D.vbproj @@ -28766,6 +28766,7 @@ + @@ -28920,6 +28921,7 @@ + PreserveNewest diff --git a/P3D/Player/Player.vb b/P3D/Player/Player.vb index 81ff480a8..6020ad642 100644 --- a/P3D/Player/Player.vb +++ b/P3D/Player/Player.vb @@ -543,6 +543,7 @@ End If GameModeManager.SetGameModePointer(GameMode) + BattleSystem.GameModeElementLoader.Load() BattleSystem.GameModeAttackLoader.Load() GameModeItemLoader.Load() diff --git a/P3D/Pokemon/Attacks/GameModeAttackLoader.vb b/P3D/Pokemon/Attacks/GameModeAttackLoader.vb index 8f24e8889..34920e5c1 100644 --- a/P3D/Pokemon/Attacks/GameModeAttackLoader.vb +++ b/P3D/Pokemon/Attacks/GameModeAttackLoader.vb @@ -84,7 +84,11 @@ Case "accuracy", "acc" move.Accuracy = CInt(value) Case "type" - move.Type = New Element(value) + If StringHelper.IsNumeric(value) = False Then + move.Type = GameModeElementLoader.GetElementByName(value) + Else + move.Type = GameModeElementLoader.GetElementByID(CInt(value)) + End If Case "category" Select Case value.ToLower() Case "physical" diff --git a/P3D/Pokemon/Attacks/Normal/NaturalGift.vb b/P3D/Pokemon/Attacks/Normal/NaturalGift.vb index 043eb6d2a..12ab2f825 100644 --- a/P3D/Pokemon/Attacks/Normal/NaturalGift.vb +++ b/P3D/Pokemon/Attacks/Normal/NaturalGift.vb @@ -90,7 +90,7 @@ Namespace BattleSystem.Moves.Normal If Not p.Item Is Nothing Then If p.Item.isBerry = True Then - Return New Element(CType(p.Item, Items.Berry).Type) + Return BattleSystem.GameModeElementLoader.GetElementByID(CType(p.Item, Items.Berry).Type) End If End If diff --git a/P3D/Pokemon/Items/Berry.vb b/P3D/Pokemon/Items/Berry.vb index 86d8d118a..8a64dfcd3 100644 --- a/P3D/Pokemon/Items/Berry.vb +++ b/P3D/Pokemon/Items/Berry.vb @@ -31,7 +31,7 @@ Public SummerGrow As Integer = 2 Public FallGrow As Integer = 1 - Public Type As Element.Types + Public Type As Integer Public Power As Integer = 80 Public JuiceColor As String = "red" diff --git a/P3D/Pokemon/Items/GameModeItem.vb b/P3D/Pokemon/Items/GameModeItem.vb index e6f7fd31d..225eeb7c5 100644 --- a/P3D/Pokemon/Items/GameModeItem.vb +++ b/P3D/Pokemon/Items/GameModeItem.vb @@ -197,45 +197,49 @@ Public Class GameModeItem Public Sub SetTeachMoveTextureRectangle() Dim r As New Rectangle(144, 168, 24, 24) + If gmTeachMove.Type.IsGameModeElement = False Then - Select Case gmTeachMove.Type.Type - Case Element.Types.Blank, Element.Types.Normal - r = New Rectangle(144, 168, 24, 24) - Case Element.Types.Bug - r = New Rectangle(24, 192, 24, 24) - Case Element.Types.Dark - r = New Rectangle(384, 168, 24, 24) - Case Element.Types.Dragon - r = New Rectangle(408, 168, 24, 24) - Case Element.Types.Electric - r = New Rectangle(288, 168, 24, 24) - Case Element.Types.Fairy - r = New Rectangle(72, 264, 24, 24) - Case Element.Types.Fighting - r = New Rectangle(168, 168, 24, 24) - Case Element.Types.Fire - r = New Rectangle(360, 168, 24, 24) - Case Element.Types.Flying - r = New Rectangle(0, 192, 24, 24) - Case Element.Types.Ghost - r = New Rectangle(480, 168, 24, 24) - Case Element.Types.Grass - r = New Rectangle(336, 168, 24, 24) - Case Element.Types.Ground - r = New Rectangle(456, 168, 24, 24) - Case Element.Types.Ice - r = New Rectangle(312, 168, 24, 24) - Case Element.Types.Poison - r = New Rectangle(264, 168, 24, 24) - Case Element.Types.Psychic - r = New Rectangle(216, 168, 24, 24) - Case Element.Types.Rock - r = New Rectangle(240, 168, 24, 24) - Case Element.Types.Steel - r = New Rectangle(432, 168, 24, 24) - Case Element.Types.Water - r = New Rectangle(192, 168, 24, 24) - End Select + Select Case gmTeachMove.Type.Type + Case Element.Types.Blank, Element.Types.Normal + r = New Rectangle(144, 168, 24, 24) + Case Element.Types.Bug + r = New Rectangle(24, 192, 24, 24) + Case Element.Types.Dark + r = New Rectangle(384, 168, 24, 24) + Case Element.Types.Dragon + r = New Rectangle(408, 168, 24, 24) + Case Element.Types.Electric + r = New Rectangle(288, 168, 24, 24) + Case Element.Types.Fairy + r = New Rectangle(72, 264, 24, 24) + Case Element.Types.Fighting + r = New Rectangle(168, 168, 24, 24) + Case Element.Types.Fire + r = New Rectangle(360, 168, 24, 24) + Case Element.Types.Flying + r = New Rectangle(0, 192, 24, 24) + Case Element.Types.Ghost + r = New Rectangle(480, 168, 24, 24) + Case Element.Types.Grass + r = New Rectangle(336, 168, 24, 24) + Case Element.Types.Ground + r = New Rectangle(456, 168, 24, 24) + Case Element.Types.Ice + r = New Rectangle(312, 168, 24, 24) + Case Element.Types.Poison + r = New Rectangle(264, 168, 24, 24) + Case Element.Types.Psychic + r = New Rectangle(216, 168, 24, 24) + Case Element.Types.Rock + r = New Rectangle(240, 168, 24, 24) + Case Element.Types.Steel + r = New Rectangle(432, 168, 24, 24) + Case Element.Types.Water + r = New Rectangle(192, 168, 24, 24) + End Select + Else + r = gmTeachMove.Type.gmMachineTextureRectangle + End If gmTextureRectangle = r End Sub diff --git a/P3D/Pokemon/Items/GameModeItemLoader.vb b/P3D/Pokemon/Items/GameModeItemLoader.vb index 80acd138f..d86a402ba 100644 --- a/P3D/Pokemon/Items/GameModeItemLoader.vb +++ b/P3D/Pokemon/Items/GameModeItemLoader.vb @@ -200,7 +200,12 @@ Public Class GameModeItemLoader ElseIf item.gmName.StartsWith("HM") Then item.gmSortValue = -100000 + CInt(item.gmName.Remove(0, 2)) End If - item.gmTextureSource = "Items\ItemSheet" + If item.gmTeachMove.Type.IsGameModeElement = False Then + item.gmTextureSource = "Items\ItemSheet" + Else + item.gmTextureSource = item.gmTeachMove.Type.gmMachineTextureSource + End If + item.SetTeachMoveTextureRectangle() End If diff --git a/P3D/Pokemon/Monster/Element.vb b/P3D/Pokemon/Monster/Element.vb index 265fb1c46..a3320042a 100644 --- a/P3D/Pokemon/Monster/Element.vb +++ b/P3D/Pokemon/Monster/Element.vb @@ -3,6 +3,8 @@ ''' Public Class Element + Public IsGameModeElement As Boolean = False + ''' ''' The Type an Element can be. ''' @@ -30,18 +32,41 @@ Public Class Element End Enum Private _type As Types = Types.Blank + 'GameMode Element Properties + Private gmType As Integer = 0 + Public gmName As String = "Normal" + Public gmOriginalName As String = "Normal" + Public gmTypeRectangle As Rectangle = New Rectangle(0, 0, 48, 16) + Public gmMachineTextureSource As String = "Items\ItemSheet" + Public gmMachineTextureRectangle As Rectangle = New Rectangle(144, 168, 24, 24) + Public gmEffectivenessAttack As New Dictionary(Of Integer, Single) + Public gmEffectivenessDefense As New Dictionary(Of Integer, Single) ''' ''' The Type of this Element. ''' - Public Property Type As Types + Public Property Type As Integer Get - Return Me._type + If Me.IsGameModeElement = True Then + Return Me.gmType + Else + Return Me._type + End If End Get - Set(value As Types) - Me._type = value + Set(value As Integer) + If Me.IsGameModeElement = True Then + Me.gmType = value + Else + Me._type = CType(value, Types) + End If End Set End Property + ''' + ''' Creates a new instance of the Element class for GameMode Elements. + ''' + ''' + Public Sub New() + End Sub ''' ''' Creates a new instance of the Element class. @@ -162,711 +187,723 @@ Public Class Element Return 1 End If - If d._type = Types.Blank Or a._type = Types.Blank Then + If d.Type = Types.Blank Or a.Type = Types.Blank Then Return 1 End If - Select Case a._type - Case Types.Normal - Select Case d._type + If a.IsGameModeElement = False Then + If d.IsGameModeElement = False Then + Select Case a.Type Case Types.Normal - Return 1 + Select Case d.Type + Case Types.Normal + Return 1 + Case Types.Fighting + Return 1 + Case Types.Flying + Return 1 + Case Types.Poison + Return 1 + Case Types.Ground + Return 1 + Case Types.Rock + Return 0.5F + Case Types.Bug + Return 1 + Case Types.Ghost + Return 0 + Case Types.Steel + Return 0.5F + Case Types.Fire + Return 1 + Case Types.Water + Return 1 + Case Types.Grass + Return 1 + Case Types.Electric + Return 1 + Case Types.Psychic + Return 1 + Case Types.Ice + Return 1 + Case Types.Dragon + Return 1 + Case Types.Dark + Return 1 + Case Else + Return 1 + End Select Case Types.Fighting - Return 1 + Select Case d.Type + Case Types.Normal + Return 2 + Case Types.Fighting + Return 1 + Case Types.Flying + Return 0.5F + Case Types.Poison + Return 0.5F + Case Types.Ground + Return 1 + Case Types.Rock + Return 2 + Case Types.Bug + Return 0.5F + Case Types.Ghost + Return 0 + Case Types.Steel + Return 2 + Case Types.Fire + Return 1 + Case Types.Water + Return 1 + Case Types.Grass + Return 1 + Case Types.Electric + Return 1 + Case Types.Psychic + Return 0.5F + Case Types.Ice + Return 2 + Case Types.Dragon + Return 1 + Case Types.Dark + Return 2 + Case Types.Fairy + Return 0.5F + Case Else + Return 1 + End Select Case Types.Flying - Return 1 + Select Case d.Type + Case Types.Normal + Return 1 + Case Types.Fighting + Return 2 + Case Types.Flying + Return 1 + Case Types.Poison + Return 1 + Case Types.Ground + Return 1 + Case Types.Rock + Return 0.5F + Case Types.Bug + Return 2 + Case Types.Ghost + Return 1 + Case Types.Steel + Return 0.5F + Case Types.Fire + Return 1 + Case Types.Water + Return 1 + Case Types.Grass + Return 2 + Case Types.Electric + Return 0.5F + Case Types.Psychic + Return 1 + Case Types.Ice + Return 1 + Case Types.Dragon + Return 1 + Case Types.Dark + Return 1 + Case Else + Return 1 + End Select Case Types.Poison - Return 1 + Select Case d.Type + Case Types.Normal + Return 1 + Case Types.Fighting + Return 1 + Case Types.Flying + Return 1 + Case Types.Poison + Return 0.5F + Case Types.Ground + Return 0.5F + Case Types.Rock + Return 0.5F + Case Types.Bug + Return 1 + Case Types.Ghost + Return 0.5F + Case Types.Steel + Return 0 + Case Types.Fire + Return 1 + Case Types.Water + Return 1 + Case Types.Grass + Return 2 + Case Types.Electric + Return 1 + Case Types.Psychic + Return 1 + Case Types.Ice + Return 1 + Case Types.Dragon + Return 1 + Case Types.Dark + Return 1 + Case Types.Fairy + Return 2 + Case Else + Return 1 + End Select Case Types.Ground - Return 1 + Select Case d.Type + Case Types.Normal + Return 1 + Case Types.Fighting + Return 1 + Case Types.Flying + Return 0 + Case Types.Poison + Return 2 + Case Types.Ground + Return 1 + Case Types.Rock + Return 2 + Case Types.Bug + Return 0.5F + Case Types.Ghost + Return 1 + Case Types.Steel + Return 2 + Case Types.Fire + Return 2 + Case Types.Water + Return 1 + Case Types.Grass + Return 0.5F + Case Types.Electric + Return 2 + Case Types.Psychic + Return 1 + Case Types.Ice + Return 1 + Case Types.Dragon + Return 1 + Case Types.Dark + Return 1 + Case Else + Return 1 + End Select Case Types.Rock - Return 0.5F + Select Case d.Type + Case Types.Normal + Return 1 + Case Types.Fighting + Return 0.5F + Case Types.Flying + Return 2 + Case Types.Poison + Return 1 + Case Types.Ground + Return 0.5F + Case Types.Rock + Return 1 + Case Types.Bug + Return 2 + Case Types.Ghost + Return 1 + Case Types.Steel + Return 0.5F + Case Types.Fire + Return 2 + Case Types.Water + Return 1 + Case Types.Grass + Return 1 + Case Types.Electric + Return 1 + Case Types.Psychic + Return 1 + Case Types.Ice + Return 2 + Case Types.Dragon + Return 1 + Case Types.Dark + Return 1 + Case Else + Return 1 + End Select Case Types.Bug - Return 1 + Select Case d.Type + Case Types.Normal + Return 1 + Case Types.Fighting + Return 0.5F + Case Types.Flying + Return 0.5F + Case Types.Poison + Return 0.5F + Case Types.Ground + Return 1 + Case Types.Rock + Return 1 + Case Types.Bug + Return 1 + Case Types.Ghost + Return 0.5F + Case Types.Steel + Return 0.5F + Case Types.Fire + Return 0.5F + Case Types.Water + Return 1 + Case Types.Grass + Return 2 + Case Types.Electric + Return 1 + Case Types.Psychic + Return 2 + Case Types.Ice + Return 1 + Case Types.Dragon + Return 1 + Case Types.Dark + Return 2 + Case Types.Fairy + Return 0.5F + Case Else + Return 1 + End Select Case Types.Ghost - Return 0 + Select Case d.Type + Case Types.Normal + Return 0 + Case Types.Fighting + Return 1 + Case Types.Flying + Return 1 + Case Types.Poison + Return 1 + Case Types.Ground + Return 1 + Case Types.Rock + Return 1 + Case Types.Bug + Return 1 + Case Types.Ghost + Return 2 + Case Types.Steel + Return 1 + Case Types.Fire + Return 1 + Case Types.Water + Return 1 + Case Types.Grass + Return 1 + Case Types.Electric + Return 1 + Case Types.Psychic + Return 2 + Case Types.Ice + Return 1 + Case Types.Dragon + Return 1 + Case Types.Dark + Return 0.5F + Case Else + Return 1 + End Select Case Types.Steel - Return 0.5F + Select Case d.Type + Case Types.Normal + Return 1 + Case Types.Fighting + Return 1 + Case Types.Flying + Return 1 + Case Types.Poison + Return 1 + Case Types.Ground + Return 1 + Case Types.Rock + Return 2 + Case Types.Bug + Return 1 + Case Types.Ghost + Return 1 + Case Types.Steel + Return 0.5F + Case Types.Fire + Return 0.5F + Case Types.Water + Return 0.5F + Case Types.Grass + Return 1 + Case Types.Electric + Return 0.5F + Case Types.Psychic + Return 1 + Case Types.Ice + Return 2 + Case Types.Dragon + Return 1 + Case Types.Dark + Return 1 + Case Types.Fairy + Return 2 + Case Else + Return 1 + End Select Case Types.Fire - Return 1 + Select Case d.Type + Case Types.Normal + Return 1 + Case Types.Fighting + Return 1 + Case Types.Flying + Return 1 + Case Types.Poison + Return 1 + Case Types.Ground + Return 1 + Case Types.Rock + Return 0.5F + Case Types.Bug + Return 2 + Case Types.Ghost + Return 1 + Case Types.Steel + Return 2 + Case Types.Fire + Return 0.5F + Case Types.Water + Return 0.5F + Case Types.Grass + Return 2 + Case Types.Electric + Return 1 + Case Types.Psychic + Return 1 + Case Types.Ice + Return 2 + Case Types.Dragon + Return 0.5F + Case Types.Dark + Return 1 + Case Else + Return 1 + End Select Case Types.Water - Return 1 + Select Case d.Type + Case Types.Normal + Return 1 + Case Types.Fighting + Return 1 + Case Types.Flying + Return 1 + Case Types.Poison + Return 1 + Case Types.Ground + Return 2 + Case Types.Rock + Return 2 + Case Types.Bug + Return 1 + Case Types.Ghost + Return 1 + Case Types.Steel + Return 1 + Case Types.Fire + Return 2 + Case Types.Water + Return 0.5F + Case Types.Grass + Return 0.5F + Case Types.Electric + Return 1 + Case Types.Psychic + Return 1 + Case Types.Ice + Return 1 + Case Types.Dragon + Return 0.5F + Case Types.Dark + Return 1 + Case Else + Return 1 + End Select Case Types.Grass - Return 1 + Select Case d.Type + Case Types.Normal + Return 1 + Case Types.Fighting + Return 1 + Case Types.Flying + Return 0.5F + Case Types.Poison + Return 0.5F + Case Types.Ground + Return 2 + Case Types.Rock + Return 2 + Case Types.Bug + Return 0.5F + Case Types.Ghost + Return 1 + Case Types.Steel + Return 0.5F + Case Types.Fire + Return 0.5F + Case Types.Water + Return 2 + Case Types.Grass + Return 0.5F + Case Types.Electric + Return 1 + Case Types.Psychic + Return 1 + Case Types.Ice + Return 1 + Case Types.Dragon + Return 0.5F + Case Types.Dark + Return 1 + Case Else + Return 1 + End Select Case Types.Electric - Return 1 + Select Case d.Type + Case Types.Normal + Return 1 + Case Types.Fighting + Return 1 + Case Types.Flying + Return 2 + Case Types.Poison + Return 1 + Case Types.Ground + Return 0 + Case Types.Rock + Return 1 + Case Types.Bug + Return 1 + Case Types.Ghost + Return 1 + Case Types.Steel + Return 1 + Case Types.Fire + Return 1 + Case Types.Water + Return 2 + Case Types.Grass + Return 0.5F + Case Types.Electric + Return 0.5F + Case Types.Psychic + Return 1 + Case Types.Ice + Return 1 + Case Types.Dragon + Return 0.5F + Case Types.Dark + Return 1 + Case Else + Return 1 + End Select Case Types.Psychic - Return 1 + Select Case d.Type + Case Types.Normal + Return 1 + Case Types.Fighting + Return 2 + Case Types.Flying + Return 1 + Case Types.Poison + Return 2 + Case Types.Ground + Return 1 + Case Types.Rock + Return 1 + Case Types.Bug + Return 1 + Case Types.Ghost + Return 1 + Case Types.Steel + Return 0.5F + Case Types.Fire + Return 1 + Case Types.Water + Return 1 + Case Types.Grass + Return 1 + Case Types.Electric + Return 1 + Case Types.Psychic + Return 0.5F + Case Types.Ice + Return 1 + Case Types.Dragon + Return 1 + Case Types.Dark + Return 0 + Case Else + Return 1 + End Select Case Types.Ice - Return 1 + Select Case d.Type + Case Types.Normal + Return 1 + Case Types.Fighting + Return 1 + Case Types.Flying + Return 2 + Case Types.Poison + Return 1 + Case Types.Ground + Return 2 + Case Types.Rock + Return 1 + Case Types.Bug + Return 1 + Case Types.Ghost + Return 1 + Case Types.Steel + Return 0.5F + Case Types.Fire + Return 0.5F + Case Types.Water + Return 0.5F + Case Types.Grass + Return 2 + Case Types.Electric + Return 1 + Case Types.Psychic + Return 1 + Case Types.Ice + Return 0.5F + Case Types.Dragon + Return 2 + Case Types.Dark + Return 1 + Case Else + Return 1 + End Select Case Types.Dragon - Return 1 + Select Case d.Type + Case Types.Normal + Return 1 + Case Types.Fighting + Return 1 + Case Types.Flying + Return 1 + Case Types.Poison + Return 1 + Case Types.Ground + Return 1 + Case Types.Rock + Return 1 + Case Types.Bug + Return 1 + Case Types.Ghost + Return 1 + Case Types.Steel + Return 0.5F + Case Types.Fire + Return 1 + Case Types.Water + Return 1 + Case Types.Grass + Return 1 + Case Types.Electric + Return 1 + Case Types.Psychic + Return 1 + Case Types.Ice + Return 1 + Case Types.Dragon + Return 2 + Case Types.Dark + Return 1 + Case Types.Fairy + Return 0 + Case Else + Return 1 + End Select Case Types.Dark - Return 1 - Case Else - Return 1 - End Select - Case Types.Fighting - Select Case d._type - Case Types.Normal - Return 2 - Case Types.Fighting - Return 1 - Case Types.Flying - Return 0.5F - Case Types.Poison - Return 0.5F - Case Types.Ground - Return 1 - Case Types.Rock - Return 2 - Case Types.Bug - Return 0.5F - Case Types.Ghost - Return 0 - Case Types.Steel - Return 2 - Case Types.Fire - Return 1 - Case Types.Water - Return 1 - Case Types.Grass - Return 1 - Case Types.Electric - Return 1 - Case Types.Psychic - Return 0.5F - Case Types.Ice - Return 2 - Case Types.Dragon - Return 1 - Case Types.Dark - Return 2 + Select Case d.Type + Case Types.Normal + Return 1 + Case Types.Fighting + Return 0.5F + Case Types.Flying + Return 1 + Case Types.Poison + Return 1 + Case Types.Ground + Return 1 + Case Types.Rock + Return 1 + Case Types.Bug + Return 1 + Case Types.Ghost + Return 2 + Case Types.Steel + Return 1 + Case Types.Fire + Return 1 + Case Types.Water + Return 1 + Case Types.Grass + Return 1 + Case Types.Electric + Return 1 + Case Types.Psychic + Return 2 + Case Types.Ice + Return 1 + Case Types.Dragon + Return 1 + Case Types.Dark + Return 0.5F + Case Types.Fairy + Return 0.5F + Case Else + Return 1 + End Select Case Types.Fairy - Return 0.5F - Case Else - Return 1 - End Select - Case Types.Flying - Select Case d._type - Case Types.Normal - Return 1 - Case Types.Fighting - Return 2 - Case Types.Flying - Return 1 - Case Types.Poison - Return 1 - Case Types.Ground - Return 1 - Case Types.Rock - Return 0.5F - Case Types.Bug - Return 2 - Case Types.Ghost - Return 1 - Case Types.Steel - Return 0.5F - Case Types.Fire - Return 1 - Case Types.Water - Return 1 - Case Types.Grass - Return 2 - Case Types.Electric - Return 0.5F - Case Types.Psychic - Return 1 - Case Types.Ice - Return 1 - Case Types.Dragon - Return 1 - Case Types.Dark - Return 1 - Case Else - Return 1 - End Select - Case Types.Poison - Select Case d._type - Case Types.Normal - Return 1 - Case Types.Fighting - Return 1 - Case Types.Flying - Return 1 - Case Types.Poison - Return 0.5F - Case Types.Ground - Return 0.5F - Case Types.Rock - Return 0.5F - Case Types.Bug - Return 1 - Case Types.Ghost - Return 0.5F - Case Types.Steel - Return 0 - Case Types.Fire - Return 1 - Case Types.Water - Return 1 - Case Types.Grass - Return 2 - Case Types.Electric - Return 1 - Case Types.Psychic - Return 1 - Case Types.Ice - Return 1 - Case Types.Dragon - Return 1 - Case Types.Dark - Return 1 - Case Types.Fairy - Return 2 - Case Else - Return 1 - End Select - Case Types.Ground - Select Case d._type - Case Types.Normal - Return 1 - Case Types.Fighting - Return 1 - Case Types.Flying - Return 0 - Case Types.Poison - Return 2 - Case Types.Ground - Return 1 - Case Types.Rock - Return 2 - Case Types.Bug - Return 0.5F - Case Types.Ghost - Return 1 - Case Types.Steel - Return 2 - Case Types.Fire - Return 2 - Case Types.Water - Return 1 - Case Types.Grass - Return 0.5F - Case Types.Electric - Return 2 - Case Types.Psychic - Return 1 - Case Types.Ice - Return 1 - Case Types.Dragon - Return 1 - Case Types.Dark - Return 1 - Case Else - Return 1 - End Select - Case Types.Rock - Select Case d._type - Case Types.Normal - Return 1 - Case Types.Fighting - Return 0.5F - Case Types.Flying - Return 2 - Case Types.Poison - Return 1 - Case Types.Ground - Return 0.5F - Case Types.Rock - Return 1 - Case Types.Bug - Return 2 - Case Types.Ghost - Return 1 - Case Types.Steel - Return 0.5F - Case Types.Fire - Return 2 - Case Types.Water - Return 1 - Case Types.Grass - Return 1 - Case Types.Electric - Return 1 - Case Types.Psychic - Return 1 - Case Types.Ice - Return 2 - Case Types.Dragon - Return 1 - Case Types.Dark - Return 1 - Case Else - Return 1 - End Select - Case Types.Bug - Select Case d._type - Case Types.Normal - Return 1 - Case Types.Fighting - Return 0.5F - Case Types.Flying - Return 0.5F - Case Types.Poison - Return 0.5F - Case Types.Ground - Return 1 - Case Types.Rock - Return 1 - Case Types.Bug - Return 1 - Case Types.Ghost - Return 0.5F - Case Types.Steel - Return 0.5F - Case Types.Fire - Return 0.5F - Case Types.Water - Return 1 - Case Types.Grass - Return 2 - Case Types.Electric - Return 1 - Case Types.Psychic - Return 2 - Case Types.Ice - Return 1 - Case Types.Dragon - Return 1 - Case Types.Dark - Return 2 - Case Types.Fairy - Return 0.5F - Case Else - Return 1 - End Select - Case Types.Ghost - Select Case d._type - Case Types.Normal - Return 0 - Case Types.Fighting - Return 1 - Case Types.Flying - Return 1 - Case Types.Poison - Return 1 - Case Types.Ground - Return 1 - Case Types.Rock - Return 1 - Case Types.Bug - Return 1 - Case Types.Ghost - Return 2 - Case Types.Steel - Return 1 - Case Types.Fire - Return 1 - Case Types.Water - Return 1 - Case Types.Grass - Return 1 - Case Types.Electric - Return 1 - Case Types.Psychic - Return 2 - Case Types.Ice - Return 1 - Case Types.Dragon - Return 1 - Case Types.Dark - Return 0.5F - Case Else - Return 1 - End Select - Case Types.Steel - Select Case d._type - Case Types.Normal - Return 1 - Case Types.Fighting - Return 1 - Case Types.Flying - Return 1 - Case Types.Poison - Return 1 - Case Types.Ground - Return 1 - Case Types.Rock - Return 2 - Case Types.Bug - Return 1 - Case Types.Ghost - Return 1 - Case Types.Steel - Return 0.5F - Case Types.Fire - Return 0.5F - Case Types.Water - Return 0.5F - Case Types.Grass - Return 1 - Case Types.Electric - Return 0.5F - Case Types.Psychic - Return 1 - Case Types.Ice - Return 2 - Case Types.Dragon - Return 1 - Case Types.Dark - Return 1 - Case Types.Fairy - Return 2 - Case Else - Return 1 - End Select - Case Types.Fire - Select Case d._type - Case Types.Normal - Return 1 - Case Types.Fighting - Return 1 - Case Types.Flying - Return 1 - Case Types.Poison - Return 1 - Case Types.Ground - Return 1 - Case Types.Rock - Return 0.5F - Case Types.Bug - Return 2 - Case Types.Ghost - Return 1 - Case Types.Steel - Return 2 - Case Types.Fire - Return 0.5F - Case Types.Water - Return 0.5F - Case Types.Grass - Return 2 - Case Types.Electric - Return 1 - Case Types.Psychic - Return 1 - Case Types.Ice - Return 2 - Case Types.Dragon - Return 0.5F - Case Types.Dark - Return 1 - Case Else - Return 1 - End Select - Case Types.Water - Select Case d._type - Case Types.Normal - Return 1 - Case Types.Fighting - Return 1 - Case Types.Flying - Return 1 - Case Types.Poison - Return 1 - Case Types.Ground - Return 2 - Case Types.Rock - Return 2 - Case Types.Bug - Return 1 - Case Types.Ghost - Return 1 - Case Types.Steel - Return 1 - Case Types.Fire - Return 2 - Case Types.Water - Return 0.5F - Case Types.Grass - Return 0.5F - Case Types.Electric - Return 1 - Case Types.Psychic - Return 1 - Case Types.Ice - Return 1 - Case Types.Dragon - Return 0.5F - Case Types.Dark - Return 1 - Case Else - Return 1 - End Select - Case Types.Grass - Select Case d._type - Case Types.Normal - Return 1 - Case Types.Fighting - Return 1 - Case Types.Flying - Return 0.5F - Case Types.Poison - Return 0.5F - Case Types.Ground - Return 2 - Case Types.Rock - Return 2 - Case Types.Bug - Return 0.5F - Case Types.Ghost - Return 1 - Case Types.Steel - Return 0.5F - Case Types.Fire - Return 0.5F - Case Types.Water - Return 2 - Case Types.Grass - Return 0.5F - Case Types.Electric - Return 1 - Case Types.Psychic - Return 1 - Case Types.Ice - Return 1 - Case Types.Dragon - Return 0.5F - Case Types.Dark - Return 1 - Case Else - Return 1 - End Select - Case Types.Electric - Select Case d._type - Case Types.Normal - Return 1 - Case Types.Fighting - Return 1 - Case Types.Flying - Return 2 - Case Types.Poison - Return 1 - Case Types.Ground - Return 0 - Case Types.Rock - Return 1 - Case Types.Bug - Return 1 - Case Types.Ghost - Return 1 - Case Types.Steel - Return 1 - Case Types.Fire - Return 1 - Case Types.Water - Return 2 - Case Types.Grass - Return 0.5F - Case Types.Electric - Return 0.5F - Case Types.Psychic - Return 1 - Case Types.Ice - Return 1 - Case Types.Dragon - Return 0.5F - Case Types.Dark - Return 1 - Case Else - Return 1 - End Select - Case Types.Psychic - Select Case d._type - Case Types.Normal - Return 1 - Case Types.Fighting - Return 2 - Case Types.Flying - Return 1 - Case Types.Poison - Return 2 - Case Types.Ground - Return 1 - Case Types.Rock - Return 1 - Case Types.Bug - Return 1 - Case Types.Ghost - Return 1 - Case Types.Steel - Return 0.5F - Case Types.Fire - Return 1 - Case Types.Water - Return 1 - Case Types.Grass - Return 1 - Case Types.Electric - Return 1 - Case Types.Psychic - Return 0.5F - Case Types.Ice - Return 1 - Case Types.Dragon - Return 1 - Case Types.Dark - Return 0 - Case Else - Return 1 - End Select - Case Types.Ice - Select Case d._type - Case Types.Normal - Return 1 - Case Types.Fighting - Return 1 - Case Types.Flying - Return 2 - Case Types.Poison - Return 1 - Case Types.Ground - Return 2 - Case Types.Rock - Return 1 - Case Types.Bug - Return 1 - Case Types.Ghost - Return 1 - Case Types.Steel - Return 0.5F - Case Types.Fire - Return 0.5F - Case Types.Water - Return 0.5F - Case Types.Grass - Return 2 - Case Types.Electric - Return 1 - Case Types.Psychic - Return 1 - Case Types.Ice - Return 0.5F - Case Types.Dragon - Return 2 - Case Types.Dark - Return 1 - Case Else - Return 1 - End Select - Case Types.Dragon - Select Case d._type - Case Types.Normal - Return 1 - Case Types.Fighting - Return 1 - Case Types.Flying - Return 1 - Case Types.Poison - Return 1 - Case Types.Ground - Return 1 - Case Types.Rock - Return 1 - Case Types.Bug - Return 1 - Case Types.Ghost - Return 1 - Case Types.Steel - Return 0.5F - Case Types.Fire - Return 1 - Case Types.Water - Return 1 - Case Types.Grass - Return 1 - Case Types.Electric - Return 1 - Case Types.Psychic - Return 1 - Case Types.Ice - Return 1 - Case Types.Dragon - Return 2 - Case Types.Dark - Return 1 - Case Types.Fairy - Return 0 - Case Else - Return 1 - End Select - Case Types.Dark - Select Case d._type - Case Types.Normal - Return 1 - Case Types.Fighting - Return 0.5F - Case Types.Flying - Return 1 - Case Types.Poison - Return 1 - Case Types.Ground - Return 1 - Case Types.Rock - Return 1 - Case Types.Bug - Return 1 - Case Types.Ghost - Return 2 - Case Types.Steel - Return 1 - Case Types.Fire - Return 1 - Case Types.Water - Return 1 - Case Types.Grass - Return 1 - Case Types.Electric - Return 1 - Case Types.Psychic - Return 2 - Case Types.Ice - Return 1 - Case Types.Dragon - Return 1 - Case Types.Dark - Return 0.5F - Case Types.Fairy - Return 0.5F - Case Else - Return 1 - End Select - Case Types.Fairy - Select Case d._type - Case Types.Fire - Return 0.5F - Case Types.Fighting - Return 2.0F - Case Types.Poison - Return 0.5F - Case Types.Dragon - Return 2.0F - Case Types.Dark - Return 2.0F - Case Types.Steel - Return 0.5F - End Select - Case Types.Shadow - Select Case d._type + Select Case d.Type + Case Types.Fire + Return 0.5F + Case Types.Fighting + Return 2.0F + Case Types.Poison + Return 0.5F + Case Types.Dragon + Return 2.0F + Case Types.Dark + Return 2.0F + Case Types.Steel + Return 0.5F + End Select Case Types.Shadow - Return 0.5F + Select Case d.Type + Case Types.Shadow + Return 0.5F + Case Else + Return 2 + End Select Case Else - Return 2 + Return 1 End Select - Case Else - Return 1 - End Select + Else + If d.gmEffectivenessDefense.ContainsKey(a.Type) Then + Return d.gmEffectivenessDefense(a.Type) + End If + End If + Else + If a.gmEffectivenessDefense.ContainsKey(d.Type) Then + Return a.gmEffectivenessDefense(d.Type) + End If + End If Return 1 End Function @@ -876,108 +913,116 @@ Public Class Element ''' Public Function GetElementImage() As Rectangle Dim r As New Rectangle(0, 0, 0, 0) - - Select Case Me._type - Case Types.Normal - r = New Rectangle(0, 0, 48, 16) - Case Types.Grass - r = New Rectangle(0, 16, 48, 16) - Case Types.Fire - r = New Rectangle(0, 32, 48, 16) - Case Types.Water - r = New Rectangle(0, 48, 48, 16) - Case Types.Electric - r = New Rectangle(0, 64, 48, 16) - Case Types.Ground - r = New Rectangle(0, 80, 48, 16) - Case Types.Rock - r = New Rectangle(0, 96, 48, 16) - Case Types.Ice - r = New Rectangle(0, 112, 48, 16) - Case Types.Steel - r = New Rectangle(0, 128, 48, 16) - Case Types.Bug - r = New Rectangle(48, 0, 48, 16) - Case Types.Fighting - r = New Rectangle(48, 16, 48, 16) - Case Types.Flying - r = New Rectangle(48, 32, 48, 16) - Case Types.Poison - r = New Rectangle(48, 48, 48, 16) - Case Types.Ghost - r = New Rectangle(48, 64, 48, 16) - Case Types.Dark - r = New Rectangle(48, 80, 48, 16) - Case Types.Psychic - r = New Rectangle(48, 96, 48, 16) - Case Types.Dragon - r = New Rectangle(48, 128, 48, 16) - Case Types.Fairy - r = New Rectangle(96, 48, 48, 16) - Case Types.Shadow - r = New Rectangle(96, 64, 48, 16) - Case Types.Blank - r = New Rectangle(48, 112, 48, 16) - Case Else - r = New Rectangle(48, 112, 48, 16) - End Select + If Me.IsGameModeElement = False Then + Select Case Me._type + Case Types.Normal + r = New Rectangle(0, 0, 48, 16) + Case Types.Grass + r = New Rectangle(0, 16, 48, 16) + Case Types.Fire + r = New Rectangle(0, 32, 48, 16) + Case Types.Water + r = New Rectangle(0, 48, 48, 16) + Case Types.Electric + r = New Rectangle(0, 64, 48, 16) + Case Types.Ground + r = New Rectangle(0, 80, 48, 16) + Case Types.Rock + r = New Rectangle(0, 96, 48, 16) + Case Types.Ice + r = New Rectangle(0, 112, 48, 16) + Case Types.Steel + r = New Rectangle(0, 128, 48, 16) + Case Types.Bug + r = New Rectangle(48, 0, 48, 16) + Case Types.Fighting + r = New Rectangle(48, 16, 48, 16) + Case Types.Flying + r = New Rectangle(48, 32, 48, 16) + Case Types.Poison + r = New Rectangle(48, 48, 48, 16) + Case Types.Ghost + r = New Rectangle(48, 64, 48, 16) + Case Types.Dark + r = New Rectangle(48, 80, 48, 16) + Case Types.Psychic + r = New Rectangle(48, 96, 48, 16) + Case Types.Dragon + r = New Rectangle(48, 128, 48, 16) + Case Types.Fairy + r = New Rectangle(96, 48, 48, 16) + Case Types.Shadow + r = New Rectangle(96, 64, 48, 16) + Case Types.Blank + r = New Rectangle(48, 112, 48, 16) + Case Else + r = New Rectangle(48, 112, 48, 16) + End Select + Else + r = gmTypeRectangle + End If Return r End Function Public Overrides Function ToString() As String - Select Case Me._type - Case Types.Blank - Return "Blank" - Case Types.Bug - Return "Bug" - Case Types.Dark - Return "Dark" - Case Types.Dragon - Return "Dragon" - Case Types.Electric - Return "Electric" - Case Types.Fairy - Return "Fairy" - Case Types.Fighting - Return "Fighting" - Case Types.Fire - Return "Fire" - Case Types.Flying - Return "Flying" - Case Types.Ghost - Return "Ghost" - Case Types.Grass - Return "Grass" - Case Types.Ground - Return "Ground" - Case Types.Ice - Return "Ice" - Case Types.Normal - Return "Normal" - Case Types.Poison - Return "Poison" - Case Types.Psychic - Return "Psychic" - Case Types.Rock - Return "Rock" - Case Types.Shadow - Return "Shadow" - Case Types.Steel - Return "Steel" - Case Types.Water - Return "Water" - Case Else - Return "Blank" - End Select + If IsGameModeElement = False Then + Select Case Me._type + Case Types.Blank + Return "Blank" + Case Types.Bug + Return "Bug" + Case Types.Dark + Return "Dark" + Case Types.Dragon + Return "Dragon" + Case Types.Electric + Return "Electric" + Case Types.Fairy + Return "Fairy" + Case Types.Fighting + Return "Fighting" + Case Types.Fire + Return "Fire" + Case Types.Flying + Return "Flying" + Case Types.Ghost + Return "Ghost" + Case Types.Grass + Return "Grass" + Case Types.Ground + Return "Ground" + Case Types.Ice + Return "Ice" + Case Types.Normal + Return "Normal" + Case Types.Poison + Return "Poison" + Case Types.Psychic + Return "Psychic" + Case Types.Rock + Return "Rock" + Case Types.Shadow + Return "Shadow" + Case Types.Steel + Return "Steel" + Case Types.Water + Return "Water" + Case Else + Return "Blank" + End Select + Else + Return gmName + End If + End Function Public Shared Operator =(ByVal Element1 As Element, ByVal Element2 As Element) As Boolean - Return Element1._type = Element2._type + Return Element1.Type = Element2.Type End Operator Public Shared Operator <>(ByVal Element1 As Element, ByVal Element2 As Element) As Boolean - Return Element1._type <> Element2._type + Return Element1.Type <> Element2.Type End Operator End Class diff --git a/P3D/Pokemon/Monster/EvolutionCondition.vb b/P3D/Pokemon/Monster/EvolutionCondition.vb index 1dd71ca8e..30ae59829 100644 --- a/P3D/Pokemon/Monster/EvolutionCondition.vb +++ b/P3D/Pokemon/Monster/EvolutionCondition.vb @@ -207,7 +207,7 @@ Public Class EvolutionCondition Case ConditionTypes.InPartyType Dim isInParty As Boolean = False For Each pokemon As Pokemon In Core.Player.Pokemons - If pokemon.IsType(New Element(c.Argument).Type) = True Then + If pokemon.IsType(BattleSystem.GameModeElementLoader.GetElementByName(c.Argument).Type) = True Then isInParty = True Exit For End If diff --git a/P3D/Pokemon/Monster/GameModeElementLoader.vb b/P3D/Pokemon/Monster/GameModeElementLoader.vb new file mode 100644 index 000000000..98e321501 --- /dev/null +++ b/P3D/Pokemon/Monster/GameModeElementLoader.vb @@ -0,0 +1,291 @@ +Namespace BattleSystem + + ''' + ''' Provides an interface to load additional GameMode moves. + ''' + Public Class GameModeElementLoader + + 'The default relative path to load moves from (Content folder). + Const PATH As String = "Data\Types\" + + 'List of loaded moves. + Shared LoadedElements As New List(Of Element) + + ''' + ''' Load the attack list for the loaded GameMode. + ''' + ''' The game won't try to load the list if the default GameMode is selected. + Public Shared Sub Load() + LoadedElements.Clear() + + If GameModeManager.ActiveGameMode.IsDefaultGamemode = False Then + If System.IO.Directory.Exists(GameController.GamePath & "\" & GameModeManager.ActiveGameMode.ContentPath & "\" & PATH) = True Then + For Each file As String In System.IO.Directory.GetFiles(GameController.GamePath & "\" & GameModeManager.ActiveGameMode.ContentPath & PATH, "*.dat") + LoadElement(file) + Next + End If + End If + If LoadedElements.Count > 0 Then + For Each e As Element In LoadedElements + For Each id As Element In LoadedElements + If e.gmEffectivenessAttack.ContainsKey(id.Type) = False Then + e.gmEffectivenessAttack.Add(id.Type, 1.0F) + End If + If e.gmEffectivenessDefense.ContainsKey(id.Type) = False Then + e.gmEffectivenessDefense.Add(id.Type, 1.0F) + End If + Next + Next + + Logger.Debug("Loaded " & LoadedElements.Count.ToString() & " GameMode type(s).") + End If + End Sub + + ''' + ''' Loads a move from a file. + ''' + ''' The file to load the move from. + Private Shared Sub LoadElement(ByVal file As String) + Dim element As New Element() 'Load a blank Element. + element.IsGameModeElement = True + + Dim content() As String = System.IO.File.ReadAllLines(file) + + Dim key As String = "" + Dim value As String = "" + + Dim setID As Boolean = False 'Controls if the move sets its ID. + Dim nonCommentLines As Integer = 0 + + Try + 'Go through lines of the file and set the properties depending on the content. + 'Lines starting with # are comments. + For Each l As String In content + If l.Contains("|") = True And l.StartsWith("#") = False Then + nonCommentLines += 1 + key = l.Remove(l.IndexOf("|")) + value = l.Remove(0, l.IndexOf("|") + 1) + + Select Case key.ToLower() + Case "id" + element.Type = CInt(value) + setID = True + Case "name" + element.gmOriginalName = value + Case "typeimageoffset" + element.gmTypeRectangle = New Rectangle(CInt(value.GetSplit(0, ",")), CInt(value.GetSplit(1, ",")), 48, 16) + Case "itemtexturesource" + element.gmMachineTextureSource = value + Case "itemtextureoffset" + element.gmMachineTextureRectangle = New Rectangle(CInt(value.GetSplit(0, ",")), CInt(value.GetSplit(1, ",")), 24, 24) + Case "effectivenessattack" + Dim data() As String = value.Split(";") + For i = 0 To data.Count - 1 + Dim typeID As Integer = -1 + If StringHelper.IsNumeric(data(i).GetSplit(0, ",")) = True Then + typeID = CInt(data(i).GetSplit(0, ",")) + Else + Select Case data(i).GetSplit(0, ",") + Case "normal" + typeID = element.Types.Normal + Case "fighting" + typeID = element.Types.Fighting + Case "flying" + typeID = element.Types.Flying + Case "poison" + typeID = element.Types.Poison + Case "ground" + typeID = element.Types.Ground + Case "rock" + typeID = element.Types.Rock + Case "bug" + typeID = element.Types.Bug + Case "ghost" + typeID = element.Types.Ghost + Case "steel" + typeID = element.Types.Steel + Case "fire" + typeID = element.Types.Fire + Case "water" + typeID = element.Types.Water + Case "grass" + typeID = element.Types.Grass + Case "electric" + typeID = element.Types.Electric + Case "psychic" + typeID = element.Types.Psychic + Case "ice" + typeID = element.Types.Ice + Case "dragon" + typeID = element.Types.Dragon + Case "dark" + typeID = element.Types.Dark + Case "fairy" + typeID = element.Types.Fairy + Case "shadow" + typeID = element.Types.Shadow + End Select + End If + element.gmEffectivenessAttack.Add(typeID, CSng(data(i).GetSplit(1, ",").InsertDecSeparator)) + Next + Case "effectivenessdefense" + Dim data() As String = value.Split(";") + For i = 0 To data.Count - 1 + Dim typeID As Integer = -1 + If StringHelper.IsNumeric(data(i).GetSplit(0, ",")) = True Then + typeID = CInt(data(i).GetSplit(0, ",")) + Else + Select Case data(i).GetSplit(0, ",") + Case "normal" + typeID = element.Types.Normal + Case "fighting" + typeID = element.Types.Fighting + Case "flying" + typeID = element.Types.Flying + Case "poison" + typeID = element.Types.Poison + Case "ground" + typeID = element.Types.Ground + Case "rock" + typeID = element.Types.Rock + Case "bug" + typeID = element.Types.Bug + Case "ghost" + typeID = element.Types.Ghost + Case "steel" + typeID = element.Types.Steel + Case "fire" + typeID = element.Types.Fire + Case "water" + typeID = element.Types.Water + Case "grass" + typeID = element.Types.Grass + Case "electric" + typeID = element.Types.Electric + Case "psychic" + typeID = element.Types.Psychic + Case "ice" + typeID = element.Types.Ice + Case "dragon" + typeID = element.Types.Dragon + Case "dark" + typeID = element.Types.Dark + Case "fairy" + typeID = element.Types.Fairy + Case "shadow" + typeID = element.Types.Shadow + End Select + End If + element.gmEffectivenessDefense.Add(typeID, CSng(data(i).GetSplit(1, ",").InsertDecSeparator)) + Next + End Select + End If + Next + Catch ex As Exception + 'If an error occurs loading a move, log the error. + Logger.Log(Logger.LogTypes.ErrorMessage, "GameModeElementLoader.vb: Error loading GameMode element from file """ & file & """: " & ex.Message & "; Last Key/Value pair successfully loaded: " & key & "|" & value) + End Try + + If nonCommentLines > 0 Then + If setID = True Then + If element.Type >= 20 Then + If Localization.TokenExists("element_name_" & element.gmOriginalName.ToString) = True Then + element.gmName = Localization.GetString("move_name_" & element.gmOriginalName.ToString) + End If + For i = 0 To 18 + If element.gmEffectivenessAttack.ContainsKey(i) = False Then + element.gmEffectivenessAttack.Add(i, 1.0F) + End If + If element.gmEffectivenessDefense.ContainsKey(i) = False Then + element.gmEffectivenessDefense.Add(i, 1.0F) + End If + Next + LoadedElements.Add(element) 'Add the element. + Else + Logger.Log(Logger.LogTypes.ErrorMessage, "GameModeElementLoader.vb: User defined types are not allowed to have an ID of an already existing type or an ID below 20. The ID for the type loaded from """ & file & """ has the ID " & element.Type.ToString() & ", which is smaller than 20.") + End If + Else + Logger.Log(Logger.LogTypes.ErrorMessage, "GameModeElementLoader.vb: User defined types must set their ID through the ""ID"" property, however the type loaded from """ & file & """ has no ID set so it will be ignored.") + End If + Else + Debug.Print("GameModeElementLoader.vb: The type loaded from """ & file & """ has no valid lines so it will be ignored.") + End If + End Sub + + ''' + ''' Returns an element based on its ID. + ''' + ''' The ID of the element. + ''' Returns an element or nothing. + Public Shared Function GetElementByID(ByVal ID As Integer) As Element + If ID <= 19 Then + Return New Element(ID) + Else + For Each e As Element In LoadedElements + If e.Type = ID Then + Return e + End If + Next + End If + Return Nothing + End Function + ''' + ''' Returns an element based on its name. + ''' + ''' The name of the element. + ''' Returns an element or nothing. + Public Shared Function GetElementByName(ByVal Name As String) As Element + Select Case Name.ToLower + Case "normal" + Return New Element(Element.Types.Normal) + Case "fighting" + Return New Element(Element.Types.Fighting) + Case "flying" + Return New Element(Element.Types.Flying) + Case "poison" + Return New Element(Element.Types.Poison) + Case "ground" + Return New Element(Element.Types.Ground) + Case "rock" + Return New Element(Element.Types.Rock) + Case "bug" + Return New Element(Element.Types.Bug) + Case "ghost" + Return New Element(Element.Types.Ghost) + Case "steel" + Return New Element(Element.Types.Steel) + Case "fire" + Return New Element(Element.Types.Fire) + Case "water" + Return New Element(Element.Types.Water) + Case "grass" + Return New Element(Element.Types.Grass) + Case "electric" + Return New Element(Element.Types.Electric) + Case "psychic" + Return New Element(Element.Types.Psychic) + Case "ice" + Return New Element(Element.Types.Ice) + Case "dragon" + Return New Element(Element.Types.Dragon) + Case "dark" + Return New Element(Element.Types.Dark) + Case "fairy" + Return New Element(Element.Types.Fairy) + Case "shadow" + Return New Element(Element.Types.Shadow) + Case "blank" + Return New Element(Element.Types.Blank) + Case Else + For Each e As Element In LoadedElements + If e.ToString.ToLower = Name.ToLower Then + Return e + End If + Next + End Select + Return Nothing + End Function + + End Class + +End Namespace \ No newline at end of file diff --git a/P3D/Pokemon/Monster/Pokemon.vb b/P3D/Pokemon/Monster/Pokemon.vb index eeedd064f..48b82399f 100644 --- a/P3D/Pokemon/Monster/Pokemon.vb +++ b/P3D/Pokemon/Monster/Pokemon.vb @@ -2951,7 +2951,7 @@ Public Class Pokemon ''' Checks if the Pokémon is of a certain type. ''' ''' The type to check. - Public Function IsType(ByVal CheckType As Element.Types) As Boolean + Public Function IsType(ByVal CheckType As Integer) As Boolean If Type1.Type = CheckType Or Type2.Type = CheckType Then Return True End If diff --git a/P3D/Pokemon/Monster/PokemonInteractions.vb b/P3D/Pokemon/Monster/PokemonInteractions.vb index d245a750c..b5659d75e 100644 --- a/P3D/Pokemon/Monster/PokemonInteractions.vb +++ b/P3D/Pokemon/Monster/PokemonInteractions.vb @@ -721,7 +721,7 @@ Public Daytime As Integer = -1 Public Weather As Integer = -1 Public Season As Integer = -1 - Public Types As New List(Of Element.Types) + Public Types As New List(Of Integer) Public Probability As Integer = 100 Public Sub New(ByVal dataLine As String) @@ -758,7 +758,7 @@ If dataParts(5) <> "-1" Then For Each typePart As String In dataParts(5).Split(CChar(",")) - Me.Types.Add(New Element(typePart).Type) + Me.Types.Add(BattleSystem.GameModeElementLoader.GetElementByName(typePart).Type) Next End If @@ -856,7 +856,7 @@ End If If Me.Types.Count > 0 Then - For Each t As Element.Types In Me.Types + For Each t As Integer In Me.Types If p.IsType(t) = False Then Return False End If diff --git a/P3D/Pokemon/Monster/Resource/PokemonForms.vb b/P3D/Pokemon/Monster/Resource/PokemonForms.vb index 3d501b8b6..5c72d77f5 100644 --- a/P3D/Pokemon/Monster/Resource/PokemonForms.vb +++ b/P3D/Pokemon/Monster/Resource/PokemonForms.vb @@ -80,48 +80,53 @@ Public Class PokemonForms form.WildFormTriggers.Add(arguments(10)) End If If arguments.Count >= 12 Then - Select Case arguments(11).ToLower - Case "normal" - form.TypeChange = Element.Types.Normal - Case "fighting" - form.TypeChange = Element.Types.Fighting - Case "flying" - form.TypeChange = Element.Types.Flying - Case "poison" - form.TypeChange = Element.Types.Poison - Case "ground" - form.TypeChange = Element.Types.Ground - Case "rock" - form.TypeChange = Element.Types.Rock - Case "bug" - form.TypeChange = Element.Types.Bug - Case "ghost" - form.TypeChange = Element.Types.Ghost - Case "steel" - form.TypeChange = Element.Types.Steel - Case "fire" - form.TypeChange = Element.Types.Fire - Case "water" - form.TypeChange = Element.Types.Water - Case "grass" - form.TypeChange = Element.Types.Grass - Case "electric" - form.TypeChange = Element.Types.Electric - Case "psychic" - form.TypeChange = Element.Types.Psychic - Case "ice" - form.TypeChange = Element.Types.Ice - Case "dragon" - form.TypeChange = Element.Types.Dragon - Case "dark" - form.TypeChange = Element.Types.Dark - Case "fairy" - form.TypeChange = Element.Types.Fairy - Case "shadow" - form.TypeChange = Element.Types.Shadow - Case Else - form.TypeChange = Element.Types.Blank - End Select + If StringHelper.IsNumeric(arguments(11)) = False Then + + Select Case arguments(11).ToLower + Case "normal" + form.TypeChange = Element.Types.Normal + Case "fighting" + form.TypeChange = Element.Types.Fighting + Case "flying" + form.TypeChange = Element.Types.Flying + Case "poison" + form.TypeChange = Element.Types.Poison + Case "ground" + form.TypeChange = Element.Types.Ground + Case "rock" + form.TypeChange = Element.Types.Rock + Case "bug" + form.TypeChange = Element.Types.Bug + Case "ghost" + form.TypeChange = Element.Types.Ghost + Case "steel" + form.TypeChange = Element.Types.Steel + Case "fire" + form.TypeChange = Element.Types.Fire + Case "water" + form.TypeChange = Element.Types.Water + Case "grass" + form.TypeChange = Element.Types.Grass + Case "electric" + form.TypeChange = Element.Types.Electric + Case "psychic" + form.TypeChange = Element.Types.Psychic + Case "ice" + form.TypeChange = Element.Types.Ice + Case "dragon" + form.TypeChange = Element.Types.Dragon + Case "dark" + form.TypeChange = Element.Types.Dark + Case "fairy" + form.TypeChange = Element.Types.Fairy + Case "shadow" + form.TypeChange = Element.Types.Shadow + Case Else + form.TypeChange = Element.Types.Blank + End Select + Else + form.TypeChange = BattleSystem.GameModeElementLoader.GetElementByID(CInt(arguments(11))).Type + End If If arguments.Count >= 13 Then If arguments(12) <> "" Then form.IncludeBaseFormInDexCount = CBool(arguments(12)) @@ -562,7 +567,7 @@ Public Class PokemonForms Public OverworldSpriteFileSuffix As String = "" Public CryFileSuffix As String = "" Public WildFormTriggers As New List(Of String) - Public TypeChange As Element.Types = Element.Types.Blank + Public TypeChange As Integer = Element.Types.Blank Public IncludeBaseFormInDexCount As Boolean = False Public Overridable Function GetInitialAdditionalData(ByVal P As Pokemon) As String @@ -587,13 +592,13 @@ Public Class PokemonForms ElseIf trigger(0).ToLower = "gender" Then If GetGenderFormMatch(P, True) = "match" Then If TypeChange <> Element.Types.Blank Then - Return TypeChange.ToString + Return BattleSystem.GameModeElementLoader.GetElementByName(TypeChange).ToString Else Return AdditionalValue End If End If ElseIf trigger(0).ToLower = "season" Then - If GetSeasonFormMatch(true) = "match" Then + If GetSeasonFormMatch(True) = "match" Then If TypeChange <> Element.Types.Blank Then Return TypeChange.ToString Else diff --git a/P3D/Screens/MainMenu/NewNewGameScreen.vb b/P3D/Screens/MainMenu/NewNewGameScreen.vb index cc0ba5f39..bf1553fd1 100644 --- a/P3D/Screens/MainMenu/NewNewGameScreen.vb +++ b/P3D/Screens/MainMenu/NewNewGameScreen.vb @@ -21,6 +21,7 @@ ContentPackManager.Load(GameController.GamePath & "\ContentPacks\" & s & "\exceptions.dat") Next + BattleSystem.GameModeElementLoader.Load() BattleSystem.GameModeAttackLoader.Load() GameModeItemLoader.Load() diff --git a/P3D/Screens/NewGameScreen.vb b/P3D/Screens/NewGameScreen.vb index bef061c30..71ec6c926 100644 --- a/P3D/Screens/NewGameScreen.vb +++ b/P3D/Screens/NewGameScreen.vb @@ -49,6 +49,7 @@ ContentPackManager.Load(GameController.GamePath & "\ContentPacks\" & s & "\exceptions.dat") Next + BattleSystem.GameModeElementLoader.Load() BattleSystem.GameModeAttackLoader.Load() SmashRock.Load() From 84df4d7cccff5d293b3756e714628f65d769b4a5 Mon Sep 17 00:00:00 2001 From: JappaWakka Date: Sun, 10 Dec 2023 20:20:23 +0100 Subject: [PATCH 09/36] Forgot a thing --- P3D/Pokemon/Monster/Resource/PokemonForms.vb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/P3D/Pokemon/Monster/Resource/PokemonForms.vb b/P3D/Pokemon/Monster/Resource/PokemonForms.vb index 5c72d77f5..3013dcc0f 100644 --- a/P3D/Pokemon/Monster/Resource/PokemonForms.vb +++ b/P3D/Pokemon/Monster/Resource/PokemonForms.vb @@ -592,7 +592,7 @@ Public Class PokemonForms ElseIf trigger(0).ToLower = "gender" Then If GetGenderFormMatch(P, True) = "match" Then If TypeChange <> Element.Types.Blank Then - Return BattleSystem.GameModeElementLoader.GetElementByName(TypeChange).ToString + Return BattleSystem.GameModeElementLoader.GetElementByID(TypeChange).ToString Else Return AdditionalValue End If From 3c01312fd6f07b3583642ae4d4a6291f18232090 Mon Sep 17 00:00:00 2001 From: JappaWakka Date: Mon, 11 Dec 2023 13:39:26 +0100 Subject: [PATCH 10/36] Add AIField property for GM Moves --- P3D/Pokemon/Attacks/GameModeAttackLoader.vb | 132 ++++++++++++++++++++ 1 file changed, 132 insertions(+) diff --git a/P3D/Pokemon/Attacks/GameModeAttackLoader.vb b/P3D/Pokemon/Attacks/GameModeAttackLoader.vb index 34920e5c1..251573e9d 100644 --- a/P3D/Pokemon/Attacks/GameModeAttackLoader.vb +++ b/P3D/Pokemon/Attacks/GameModeAttackLoader.vb @@ -193,6 +193,138 @@ move.UseOppEvasion = CBool(value) Case "deductpp" move.gmDeductPP = CBool(value) + Case "aifield1", "aifield2", "aifield3" + Dim AIFieldType As Attack.AIField = Attack.AIField.Nothing + Select Case value + Case "damage" + AIFieldType = Attack.AIField.Damage + Case "poison" + AIFieldType = Attack.AIField.Poison + Case "burn" + AIFieldType = Attack.AIField.Burn + Case "paralysis" + AIFieldType = Attack.AIField.Paralysis + Case "sleep" + AIFieldType = Attack.AIField.Sleep + Case "freeze" + AIFieldType = Attack.AIField.Freeze + Case "confusion" + AIFieldType = Attack.AIField.Confusion + Case "confuseown" + AIFieldType = Attack.AIField.ConfuseOwn + Case "canpoison" + AIFieldType = Attack.AIField.CanPoison + Case "canburn" + AIFieldType = Attack.AIField.CanBurn + Case "canparalyse" + AIFieldType = Attack.AIField.CanParalyse + Case "cansleep" + AIFieldType = Attack.AIField.CanSleep + Case "canfreeze" + AIFieldType = Attack.AIField.CanFreeze + Case "canconfuse" + AIFieldType = Attack.AIField.CanConfuse + Case "raiseattack" + AIFieldType = Attack.AIField.RaiseAttack + Case "raisedefense" + AIFieldType = Attack.AIField.RaiseDefense + Case "raisespattack" + AIFieldType = Attack.AIField.RaiseSpAttack + Case "raisespdefense" + AIFieldType = Attack.AIField.RaiseSpDefense + Case "raisespeed" + AIFieldType = Attack.AIField.RaiseSpeed + Case "raiseaccuracy" + AIFieldType = Attack.AIField.RaiseAccuracy + Case "raiseevasion" + AIFieldType = Attack.AIField.RaiseEvasion + Case "lowerattack" + AIFieldType = Attack.AIField.LowerAttack + Case "lowerdefense" + AIFieldType = Attack.AIField.LowerDefense + Case "lowerspattack" + AIFieldType = Attack.AIField.LowerSpAttack + Case "lowerspdefense" + AIFieldType = Attack.AIField.LowerSpDefense + Case "lowerspeed" + AIFieldType = Attack.AIField.LowerSpeed + Case "loweraccuracy" + AIFieldType = Attack.AIField.LowerAccuracy + Case "lowerevasion" + AIFieldType = Attack.AIField.LowerEvasion + Case "canraiseattack" + AIFieldType = Attack.AIField.CanRaiseAttack + Case "canraisedefense" + AIFieldType = Attack.AIField.CanRaiseDefense + Case "canraisespattack" + AIFieldType = Attack.AIField.CanRaiseSpAttack + Case "canraisespdefense" + AIFieldType = Attack.AIField.CanRaiseSpDefense + Case "canraisespeed" + AIFieldType = Attack.AIField.CanRaiseSpeed + Case "canraiseaccuracy" + AIFieldType = Attack.AIField.CanRaiseAccuracy + Case "canrauseevasion" + AIFieldType = Attack.AIField.CanRauseEvasion + Case "canlowerattack" + AIFieldType = Attack.AIField.CanLowerAttack + Case "canlowerdefense" + AIFieldType = Attack.AIField.CanLowerDefense + Case "canlowerspattack" + AIFieldType = Attack.AIField.CanLowerSpAttack + Case "canlowerspdefense" + AIFieldType = Attack.AIField.CanLowerSpDefense + Case "canlowerspeed" + AIFieldType = Attack.AIField.CanLowerSpeed + Case "canloweraccuracy" + AIFieldType = Attack.AIField.CanLowerAccuracy + Case "canlowerevasion" + AIFieldType = Attack.AIField.CanLowerEvasion + Case "flinch" + AIFieldType = Attack.AIField.Flinch + Case "canflinch" + AIFieldType = Attack.AIField.CanFlinch + Case "infatuation" + AIFieldType = Attack.AIField.Infatuation + Case "trap" + AIFieldType = Attack.AIField.Trap + Case "ohko" + AIFieldType = Attack.AIField.OHKO + Case "multiturn" + AIFieldType = Attack.AIField.MultiTurn + Case "recoil" + AIFieldType = Attack.AIField.Recoil + Case "healing" + AIFieldType = Attack.AIField.Healing + Case "curestatus" + AIFieldType = Attack.AIField.CureStatus + Case "support" + AIFieldType = Attack.AIField.Support + Case "recharge" + AIFieldType = Attack.AIField.Recharge + Case "highpriority" + AIFieldType = Attack.AIField.HighPriority + Case "absorbing" + AIFieldType = Attack.AIField.Absorbing + Case "selfdestruct" + AIFieldType = Attack.AIField.Selfdestruct + Case "thrawout" + AIFieldType = Attack.AIField.ThrawOut + Case "cannotmiss" + AIFieldType = Attack.AIField.CannotMiss + Case "removereflectlightscreen" + AIFieldType = Attack.AIField.RemoveReflectLightscreen + End Select + If AIFieldType <> Attack.AIField.Nothing Then + If key.EndsWith("1") Then + move.AIField1 = AIFieldType + ElseIf key.EndsWith("2") Then + move.AIField2 = AIFieldType + ElseIf key.EndsWith("3") Then + move.AIField3 = AIFieldType + End If + End If + End Select End If Next From 58eba766acd4f8d67fb5e75a127e55e13af3746c Mon Sep 17 00:00:00 2001 From: JappaWakka Date: Mon, 11 Dec 2023 13:48:20 +0100 Subject: [PATCH 11/36] Added GM Move property to copy anims of other move --- P3D/Pokemon/Attacks/Attack.vb | 17 +++++++++++++++-- P3D/Pokemon/Attacks/GameModeAttackLoader.vb | 3 ++- 2 files changed, 17 insertions(+), 3 deletions(-) diff --git a/P3D/Pokemon/Attacks/Attack.vb b/P3D/Pokemon/Attacks/Attack.vb index d5e5f0ee8..2cb1aa0e3 100644 --- a/P3D/Pokemon/Attacks/Attack.vb +++ b/P3D/Pokemon/Attacks/Attack.vb @@ -199,6 +199,7 @@ Public Priority As Integer = 0 Public TimesToAttack As Integer = 1 Public gmTimesToAttack As String = "1" + Public gmUseMoveAnims As Attack = Nothing Public EffectChances As New List(Of Integer) '#End @@ -2227,7 +2228,13 @@ End Sub Public Overridable Sub InternalUserPokemonMoveAnimation(ByVal BattleScreen As BattleScreen, ByVal BattleFlip As Boolean, ByVal CurrentPokemon As Pokemon, ByVal CurrentEntity As NPC) - 'Override this method in the attack class to insert the move animation query objects into the queue. + If Me.IsGameModeMove = True Then + If gmUseMoveAnims IsNot Nothing Then + gmUseMoveAnims.InternalUserPokemonMoveAnimation(BattleScreen, BattleFlip, CurrentPokemon, CurrentEntity) + End If + Else + 'Override this method in the attack class to insert the move animation query objects into the queue. + End If End Sub Public Sub OpponentPokemonMoveAnimation(ByVal BattleScreen As BattleScreen, ByVal own As Boolean) @@ -2245,7 +2252,13 @@ End Sub Public Overridable Sub InternalOpponentPokemonMoveAnimation(ByVal BattleScreen As BattleScreen, ByVal BattleFlip As Boolean, ByVal CurrentPokemon As Pokemon, ByVal CurrentEntity As NPC) - 'Override this method in the attack class to insert the move animation query objects into the queue. + If Me.IsGameModeMove = True Then + If gmUseMoveAnims IsNot Nothing Then + gmUseMoveAnims.InternalOpponentPokemonMoveAnimation(BattleScreen, BattleFlip, CurrentPokemon, CurrentEntity) + End If + Else + 'Override this method in the attack class to insert the move animation query objects into the queue. + End If End Sub #End Region diff --git a/P3D/Pokemon/Attacks/GameModeAttackLoader.vb b/P3D/Pokemon/Attacks/GameModeAttackLoader.vb index 251573e9d..65ba69f27 100644 --- a/P3D/Pokemon/Attacks/GameModeAttackLoader.vb +++ b/P3D/Pokemon/Attacks/GameModeAttackLoader.vb @@ -324,7 +324,8 @@ move.AIField3 = AIFieldType End If End If - + Case "usemoveanims" + move.gmUseMoveAnims = Attack.GetAttackByID(CInt(value)) End Select End If Next From bd2d2f2c3d44d85d70d2fa81fa2df049904ede30 Mon Sep 17 00:00:00 2001 From: JappaWakka Date: Mon, 11 Dec 2023 14:04:53 +0100 Subject: [PATCH 12/36] RaiseStat and LowerStat functions show msg if fail --- P3D/Pokemon/Attacks/AttackSpecialFunctions.vb | 42 ++++++++++++++++--- 1 file changed, 36 insertions(+), 6 deletions(-) diff --git a/P3D/Pokemon/Attacks/AttackSpecialFunctions.vb b/P3D/Pokemon/Attacks/AttackSpecialFunctions.vb index 5334c83c4..4c08c39ae 100644 --- a/P3D/Pokemon/Attacks/AttackSpecialFunctions.vb +++ b/P3D/Pokemon/Attacks/AttackSpecialFunctions.vb @@ -228,6 +228,7 @@ Dim Message As String = "" Dim RaiseAmount As Integer = 1 Dim Chance As Integer = 100 + Dim FailMessage As String = "" If f.Split(CChar(",")).Count > 2 Then Target = CBool(f.GetSplit(2, ",")) @@ -241,19 +242,21 @@ If CInt(f.GetSplit(5, ",")) > 0 Then Chance = CInt(f.GetSplit(5, ",")) End If + If f.Split(CChar(",")).Count > 6 Then + FailMessage = f.GetSplit(6, ",") + End If End If End If End If End If - If GetEffectChanceResult(Move, Chance) = True Then - BattleScreen.Battle.RaiseStat(Target, own, BattleScreen, Stat, RaiseAmount, Message, "move:" & Move.Name, True) - End If + RaiseStat(Move, own, Stat, Target, Message, RaiseAmount, Chance, FailMessage, BattleScreen) Case "lowerstat", "decreasestat" Dim Stat As String = f.GetSplit(1, ",") Dim Message As String = "" Dim Target As Boolean = own Dim LowerAmount As Integer = 1 Dim Chance As Integer = 100 + Dim FailMessage As String = "" If f.Split(CChar(",")).Count > 2 Then Target = CBool(f.GetSplit(2, ",")) @@ -267,13 +270,14 @@ If CInt(f.GetSplit(5, ",")) > 0 Then Chance = CInt(f.GetSplit(5, ",")) End If + If f.Split(CChar(",")).Count > 6 Then + FailMessage = f.GetSplit(6, ",") + End If End If End If End If End If - If GetEffectChanceResult(Move, Chance) = True Then - BattleScreen.Battle.LowerStat(Target, own, BattleScreen, Stat, LowerAmount, Message, "move:" & Move.Name, True) - End If + LowerStat(Move, own, Stat, Target, Message, LowerAmount, Chance, FailMessage, BattleScreen) Case "reducehp", "drainhp", "damage" Dim Target As Boolean = CBool(f.GetSplit(1, ",")) Dim HPAmount As Integer = 0 @@ -435,6 +439,32 @@ Private Shared Function GetEffectChanceResult(ByVal move As Attack, ByVal chance As Integer) As Boolean Return Core.Random.Next(0, 101) <= chance 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 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))) + End If + End If + End If + End If + 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 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))) + End If + End If + End If + End If + End Sub Private Shared Sub Paralyze(ByVal Move As Attack, ByVal own As Boolean, ByVal BattleScreen As BattleScreen, Chance As Integer) If GetEffectChanceResult(Move, Chance) = True Then From 63c7f96cb89e0c47ffbcc70dc04f0e398666252e Mon Sep 17 00:00:00 2001 From: JappaWakka Date: Mon, 11 Dec 2023 14:38:28 +0100 Subject: [PATCH 13/36] Added example.dat for GM Types --- P3D/Content/Data/Types/example.dat | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 P3D/Content/Data/Types/example.dat diff --git a/P3D/Content/Data/Types/example.dat b/P3D/Content/Data/Types/example.dat new file mode 100644 index 000000000..0d85482fa --- /dev/null +++ b/P3D/Content/Data/Types/example.dat @@ -0,0 +1,15 @@ +# This is an example type for a GameMode. +# The default GameMode cannot load additional types, however all other GameModes can. +# The type ID must be set and must lay above 20. +# Here's a list of all properties that can be set: "ID", "Name", "TypeImageOffset", "ItemTextureSource", "ItemTextureOffset", "EffectivenessAttack", "EffectivenessDefense" + +# To build your own type for your GameMode, create a new file with the .dat file extension in the Content\Data\Types folder and edit/retype the lines below (be sure to remove the # at the start of each line). +# Lines that are removed will default to the values below: + +#ID|0 +#Name|Normal +#TypeImageOffset|0,0 +#ItemTextureSource|Items\ItemSheet +#ItemTextureOffset|144,168 +#EffectivenessAttack|Rock,0.5;Ghost,0;Steel,0.5 +#EffectivenessDefense|Fighting,2;Ghost,0 \ No newline at end of file From 5857a05eb999f978b3346d323ccf368b67f4c3b0 Mon Sep 17 00:00:00 2001 From: JappaWakka Date: Mon, 11 Dec 2023 17:55:15 +0100 Subject: [PATCH 14/36] Add Type example.dat to project --- P3D/P3D.vbproj | 3 +++ 1 file changed, 3 insertions(+) diff --git a/P3D/P3D.vbproj b/P3D/P3D.vbproj index 468ebf3b2..4d6e25e9a 100644 --- a/P3D/P3D.vbproj +++ b/P3D/P3D.vbproj @@ -31083,6 +31083,9 @@ PreserveNewest + + PreserveNewest + Always From 09051e0cba7a343fd7b8cb9df1a32cf88db9ade0 Mon Sep 17 00:00:00 2001 From: JappaWakka Date: Mon, 11 Dec 2023 18:28:44 +0100 Subject: [PATCH 15/36] Make spelling of Paralyze consistent for AIField --- P3D/Pokemon/Attacks/Attack.vb | 2 +- P3D/Pokemon/Attacks/Dragon/DragonBreath.vb | 2 +- P3D/Pokemon/Attacks/Electric/BoltStrike.vb | 2 +- P3D/Pokemon/Attacks/Electric/Discharge.vb | 2 +- P3D/Pokemon/Attacks/Electric/Thunder.vb | 2 +- P3D/Pokemon/Attacks/Electric/ThunderFang.vb | 2 +- P3D/Pokemon/Attacks/Electric/ThunderPunch.vb | 2 +- P3D/Pokemon/Attacks/Electric/ThunderShock.vb | 2 +- P3D/Pokemon/Attacks/Electric/Thunderbolt.vb | 2 +- P3D/Pokemon/Attacks/Electric/VoltTackle.vb | 2 +- P3D/Pokemon/Attacks/Fighting/ForcePalm.vb | 2 +- P3D/Pokemon/Attacks/GameModeAttackLoader.vb | 4 ++-- P3D/Pokemon/Attacks/Ghost/Lick.vb | 2 +- P3D/Pokemon/Attacks/Ice/FreezeShock.vb | 2 +- P3D/Pokemon/Attacks/Normal/BodySlam.vb | 2 +- 15 files changed, 16 insertions(+), 16 deletions(-) diff --git a/P3D/Pokemon/Attacks/Attack.vb b/P3D/Pokemon/Attacks/Attack.vb index 2cb1aa0e3..34738b2fe 100644 --- a/P3D/Pokemon/Attacks/Attack.vb +++ b/P3D/Pokemon/Attacks/Attack.vb @@ -66,7 +66,7 @@ CanPoison CanBurn - CanParalyse + CanParalyze CanSleep CanFreeze CanConfuse diff --git a/P3D/Pokemon/Attacks/Dragon/DragonBreath.vb b/P3D/Pokemon/Attacks/Dragon/DragonBreath.vb index fbe29f833..e304a2d3b 100644 --- a/P3D/Pokemon/Attacks/Dragon/DragonBreath.vb +++ b/P3D/Pokemon/Attacks/Dragon/DragonBreath.vb @@ -52,7 +52,7 @@ '#End Me.AIField1 = AIField.Damage - Me.AIField2 = AIField.CanParalyse + Me.AIField2 = AIField.CanParalyze Me.EffectChances.Add(30) End Sub diff --git a/P3D/Pokemon/Attacks/Electric/BoltStrike.vb b/P3D/Pokemon/Attacks/Electric/BoltStrike.vb index 69924a385..7e4273dd9 100644 --- a/P3D/Pokemon/Attacks/Electric/BoltStrike.vb +++ b/P3D/Pokemon/Attacks/Electric/BoltStrike.vb @@ -52,7 +52,7 @@ Namespace BattleSystem.Moves.Electric '#End Me.AIField1 = AIField.Damage - Me.AIField2 = AIField.CanParalyse + Me.AIField2 = AIField.CanParalyze EffectChances.Add(20) End Sub diff --git a/P3D/Pokemon/Attacks/Electric/Discharge.vb b/P3D/Pokemon/Attacks/Electric/Discharge.vb index 65e741fd9..981257b30 100644 --- a/P3D/Pokemon/Attacks/Electric/Discharge.vb +++ b/P3D/Pokemon/Attacks/Electric/Discharge.vb @@ -52,7 +52,7 @@ '#End Me.AIField1 = AIField.Damage - Me.AIField2 = AIField.CanParalyse + Me.AIField2 = AIField.CanParalyze EffectChances.Add(30) End Sub diff --git a/P3D/Pokemon/Attacks/Electric/Thunder.vb b/P3D/Pokemon/Attacks/Electric/Thunder.vb index be95f3734..ac75f7afa 100644 --- a/P3D/Pokemon/Attacks/Electric/Thunder.vb +++ b/P3D/Pokemon/Attacks/Electric/Thunder.vb @@ -53,7 +53,7 @@ '#End Me.AIField1 = AIField.Damage - Me.AIField2 = AIField.CanParalyse + Me.AIField2 = AIField.CanParalyze EffectChances.Add(30) End Sub diff --git a/P3D/Pokemon/Attacks/Electric/ThunderFang.vb b/P3D/Pokemon/Attacks/Electric/ThunderFang.vb index 7bdbd9eb7..e4699e55f 100644 --- a/P3D/Pokemon/Attacks/Electric/ThunderFang.vb +++ b/P3D/Pokemon/Attacks/Electric/ThunderFang.vb @@ -53,7 +53,7 @@ '#End Me.AIField1 = AIField.Damage - Me.AIField2 = AIField.CanParalyse + Me.AIField2 = AIField.CanParalyze Me.AIField3 = AIField.CanFlinch EffectChances.Add(10) diff --git a/P3D/Pokemon/Attacks/Electric/ThunderPunch.vb b/P3D/Pokemon/Attacks/Electric/ThunderPunch.vb index f72ceb737..44f2ae40a 100644 --- a/P3D/Pokemon/Attacks/Electric/ThunderPunch.vb +++ b/P3D/Pokemon/Attacks/Electric/ThunderPunch.vb @@ -52,7 +52,7 @@ '#End Me.AIField1 = AIField.Damage - Me.AIField2 = AIField.CanParalyse + Me.AIField2 = AIField.CanParalyze EffectChances.Add(10) End Sub diff --git a/P3D/Pokemon/Attacks/Electric/ThunderShock.vb b/P3D/Pokemon/Attacks/Electric/ThunderShock.vb index 4bedb3819..4f2441541 100644 --- a/P3D/Pokemon/Attacks/Electric/ThunderShock.vb +++ b/P3D/Pokemon/Attacks/Electric/ThunderShock.vb @@ -52,7 +52,7 @@ '#End Me.AIField1 = AIField.Damage - Me.AIField2 = AIField.CanParalyse + Me.AIField2 = AIField.CanParalyze EffectChances.Add(10) End Sub diff --git a/P3D/Pokemon/Attacks/Electric/Thunderbolt.vb b/P3D/Pokemon/Attacks/Electric/Thunderbolt.vb index b69f0207b..cfd86fe84 100644 --- a/P3D/Pokemon/Attacks/Electric/Thunderbolt.vb +++ b/P3D/Pokemon/Attacks/Electric/Thunderbolt.vb @@ -52,7 +52,7 @@ '#End Me.AIField1 = AIField.Damage - Me.AIField2 = AIField.CanParalyse + Me.AIField2 = AIField.CanParalyze EffectChances.Add(10) End Sub diff --git a/P3D/Pokemon/Attacks/Electric/VoltTackle.vb b/P3D/Pokemon/Attacks/Electric/VoltTackle.vb index bbf9b25cb..767ac2ee7 100644 --- a/P3D/Pokemon/Attacks/Electric/VoltTackle.vb +++ b/P3D/Pokemon/Attacks/Electric/VoltTackle.vb @@ -53,7 +53,7 @@ Namespace BattleSystem.Moves.Electric Me.AIField1 = AIField.Damage Me.AIField2 = AIField.Recoil - Me.AIField3 = AIField.CanParalyse + Me.AIField3 = AIField.CanParalyze Me.EffectChances.Add(10) End Sub diff --git a/P3D/Pokemon/Attacks/Fighting/ForcePalm.vb b/P3D/Pokemon/Attacks/Fighting/ForcePalm.vb index 26c4ec220..194c5316a 100644 --- a/P3D/Pokemon/Attacks/Fighting/ForcePalm.vb +++ b/P3D/Pokemon/Attacks/Fighting/ForcePalm.vb @@ -51,7 +51,7 @@ '#End Me.AIField1 = AIField.Damage - Me.AIField2 = AIField.CanParalyse + Me.AIField2 = AIField.CanParalyze EffectChances.Add(30) End Sub diff --git a/P3D/Pokemon/Attacks/GameModeAttackLoader.vb b/P3D/Pokemon/Attacks/GameModeAttackLoader.vb index 65ba69f27..c58c24011 100644 --- a/P3D/Pokemon/Attacks/GameModeAttackLoader.vb +++ b/P3D/Pokemon/Attacks/GameModeAttackLoader.vb @@ -216,8 +216,8 @@ AIFieldType = Attack.AIField.CanPoison Case "canburn" AIFieldType = Attack.AIField.CanBurn - Case "canparalyse" - AIFieldType = Attack.AIField.CanParalyse + Case "canparalyze" + AIFieldType = Attack.AIField.CanParalyze Case "cansleep" AIFieldType = Attack.AIField.CanSleep Case "canfreeze" diff --git a/P3D/Pokemon/Attacks/Ghost/Lick.vb b/P3D/Pokemon/Attacks/Ghost/Lick.vb index 8f414ad61..e3247e8f4 100644 --- a/P3D/Pokemon/Attacks/Ghost/Lick.vb +++ b/P3D/Pokemon/Attacks/Ghost/Lick.vb @@ -52,7 +52,7 @@ '#End Me.AIField1 = AIField.Damage - Me.AIField2 = AIField.CanParalyse + Me.AIField2 = AIField.CanParalyze Me.EffectChances.Add(30) End Sub diff --git a/P3D/Pokemon/Attacks/Ice/FreezeShock.vb b/P3D/Pokemon/Attacks/Ice/FreezeShock.vb index c838f7fc0..634ddaacf 100644 --- a/P3D/Pokemon/Attacks/Ice/FreezeShock.vb +++ b/P3D/Pokemon/Attacks/Ice/FreezeShock.vb @@ -53,7 +53,7 @@ Me.AIField1 = AIField.Damage Me.AIField2 = AIField.MultiTurn - Me.AIField3 = AIField.CanParalyse + Me.AIField3 = AIField.CanParalyze EffectChances.Add(30) End Sub diff --git a/P3D/Pokemon/Attacks/Normal/BodySlam.vb b/P3D/Pokemon/Attacks/Normal/BodySlam.vb index 7417a1f9f..a1e2a6f86 100644 --- a/P3D/Pokemon/Attacks/Normal/BodySlam.vb +++ b/P3D/Pokemon/Attacks/Normal/BodySlam.vb @@ -52,7 +52,7 @@ '#End Me.AIField1 = AIField.Damage - Me.AIField2 = AIField.CanParalyse + Me.AIField2 = AIField.CanParalyze Me.EffectChances.Add(30) End Sub From 459ce005d00ee7b1404cf9809f4ac9e221fe5fe5 Mon Sep 17 00:00:00 2001 From: JappaWakka Date: Tue, 12 Dec 2023 09:57:53 +0100 Subject: [PATCH 16/36] Fix crashes and errors related to custom types --- P3D/Pokemon/Monster/Element.vb | 8 +- P3D/Pokemon/Monster/GameModeElementLoader.vb | 84 ++++++++++---------- P3D/Pokemon/Monster/Pokemon.vb | 4 +- 3 files changed, 50 insertions(+), 46 deletions(-) diff --git a/P3D/Pokemon/Monster/Element.vb b/P3D/Pokemon/Monster/Element.vb index a3320042a..ddbeb11ee 100644 --- a/P3D/Pokemon/Monster/Element.vb +++ b/P3D/Pokemon/Monster/Element.vb @@ -34,7 +34,6 @@ Public Class Element Private _type As Types = Types.Blank 'GameMode Element Properties Private gmType As Integer = 0 - Public gmName As String = "Normal" Public gmOriginalName As String = "Normal" Public gmTypeRectangle As Rectangle = New Rectangle(0, 0, 48, 16) Public gmMachineTextureSource As String = "Items\ItemSheet" @@ -1012,7 +1011,12 @@ Public Class Element Return "Blank" End Select Else - Return gmName + If Localization.TokenExists("type_" & gmOriginalName) = True Then + Return Localization.GetString("type_" & gmOriginalName, gmOriginalName) + Else + Return gmOriginalName + End If + End If End Function diff --git a/P3D/Pokemon/Monster/GameModeElementLoader.vb b/P3D/Pokemon/Monster/GameModeElementLoader.vb index 98e321501..851a40c86 100644 --- a/P3D/Pokemon/Monster/GameModeElementLoader.vb +++ b/P3D/Pokemon/Monster/GameModeElementLoader.vb @@ -85,45 +85,45 @@ If StringHelper.IsNumeric(data(i).GetSplit(0, ",")) = True Then typeID = CInt(data(i).GetSplit(0, ",")) Else - Select Case data(i).GetSplit(0, ",") + Select Case data(i).GetSplit(0, ",").ToLower Case "normal" - typeID = element.Types.Normal + typeID = Element.Types.Normal Case "fighting" - typeID = element.Types.Fighting + typeID = Element.Types.Fighting Case "flying" - typeID = element.Types.Flying + typeID = Element.Types.Flying Case "poison" - typeID = element.Types.Poison + typeID = Element.Types.Poison Case "ground" - typeID = element.Types.Ground + typeID = Element.Types.Ground Case "rock" - typeID = element.Types.Rock + typeID = Element.Types.Rock Case "bug" - typeID = element.Types.Bug + typeID = Element.Types.Bug Case "ghost" - typeID = element.Types.Ghost + typeID = Element.Types.Ghost Case "steel" - typeID = element.Types.Steel + typeID = Element.Types.Steel Case "fire" - typeID = element.Types.Fire + typeID = Element.Types.Fire Case "water" - typeID = element.Types.Water + typeID = Element.Types.Water Case "grass" - typeID = element.Types.Grass + typeID = Element.Types.Grass Case "electric" - typeID = element.Types.Electric + typeID = Element.Types.Electric Case "psychic" - typeID = element.Types.Psychic + typeID = Element.Types.Psychic Case "ice" - typeID = element.Types.Ice + typeID = Element.Types.Ice Case "dragon" - typeID = element.Types.Dragon + typeID = Element.Types.Dragon Case "dark" - typeID = element.Types.Dark + typeID = Element.Types.Dark Case "fairy" - typeID = element.Types.Fairy + typeID = Element.Types.Fairy Case "shadow" - typeID = element.Types.Shadow + typeID = Element.Types.Shadow End Select End If element.gmEffectivenessAttack.Add(typeID, CSng(data(i).GetSplit(1, ",").InsertDecSeparator)) @@ -135,45 +135,45 @@ If StringHelper.IsNumeric(data(i).GetSplit(0, ",")) = True Then typeID = CInt(data(i).GetSplit(0, ",")) Else - Select Case data(i).GetSplit(0, ",") + Select Case data(i).GetSplit(0, ",").ToLower Case "normal" - typeID = element.Types.Normal + typeID = Element.Types.Normal Case "fighting" - typeID = element.Types.Fighting + typeID = Element.Types.Fighting Case "flying" - typeID = element.Types.Flying + typeID = Element.Types.Flying Case "poison" - typeID = element.Types.Poison + typeID = Element.Types.Poison Case "ground" - typeID = element.Types.Ground + typeID = Element.Types.Ground Case "rock" - typeID = element.Types.Rock + typeID = Element.Types.Rock Case "bug" - typeID = element.Types.Bug + typeID = Element.Types.Bug Case "ghost" - typeID = element.Types.Ghost + typeID = Element.Types.Ghost Case "steel" - typeID = element.Types.Steel + typeID = Element.Types.Steel Case "fire" - typeID = element.Types.Fire + typeID = Element.Types.Fire Case "water" - typeID = element.Types.Water + typeID = Element.Types.Water Case "grass" - typeID = element.Types.Grass + typeID = Element.Types.Grass Case "electric" - typeID = element.Types.Electric + typeID = Element.Types.Electric Case "psychic" - typeID = element.Types.Psychic + typeID = Element.Types.Psychic Case "ice" - typeID = element.Types.Ice + typeID = Element.Types.Ice Case "dragon" - typeID = element.Types.Dragon + typeID = Element.Types.Dragon Case "dark" - typeID = element.Types.Dark + typeID = Element.Types.Dark Case "fairy" - typeID = element.Types.Fairy + typeID = Element.Types.Fairy Case "shadow" - typeID = element.Types.Shadow + typeID = Element.Types.Shadow End Select End If element.gmEffectivenessDefense.Add(typeID, CSng(data(i).GetSplit(1, ",").InsertDecSeparator)) @@ -274,11 +274,11 @@ Return New Element(Element.Types.Fairy) Case "shadow" Return New Element(Element.Types.Shadow) - Case "blank" + Case "blank", "" Return New Element(Element.Types.Blank) Case Else For Each e As Element In LoadedElements - If e.ToString.ToLower = Name.ToLower Then + If e.gmOriginalName.ToLower = Name.ToLower Then Return e End If Next diff --git a/P3D/Pokemon/Monster/Pokemon.vb b/P3D/Pokemon/Monster/Pokemon.vb index 48b82399f..994565daf 100644 --- a/P3D/Pokemon/Monster/Pokemon.vb +++ b/P3D/Pokemon/Monster/Pokemon.vb @@ -1424,9 +1424,9 @@ Public Class Pokemon Me.ExperienceType = ExperienceTypes.Slow End Select Case "type1" - Me.Type1 = New Element(Value) + Me.Type1 = BattleSystem.GameModeElementLoader.GetElementByName(Value) Case "type2" - Me.Type2 = New Element(Value) + Me.Type2 = BattleSystem.GameModeElementLoader.GetElementByName(Value) Case "catchrate" Me.CatchRate = CInt(Value) Case "basefriendship" From 0dad856a14ffa90099a4331f53bdd92b88007f26 Mon Sep 17 00:00:00 2001 From: JappaWakka Date: Tue, 12 Dec 2023 10:00:54 +0100 Subject: [PATCH 17/36] forgot to fix an error --- P3D/Pokemon/Monster/GameModeElementLoader.vb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/P3D/Pokemon/Monster/GameModeElementLoader.vb b/P3D/Pokemon/Monster/GameModeElementLoader.vb index 851a40c86..1ce5d198f 100644 --- a/P3D/Pokemon/Monster/GameModeElementLoader.vb +++ b/P3D/Pokemon/Monster/GameModeElementLoader.vb @@ -190,7 +190,7 @@ If setID = True Then If element.Type >= 20 Then If Localization.TokenExists("element_name_" & element.gmOriginalName.ToString) = True Then - element.gmName = Localization.GetString("move_name_" & element.gmOriginalName.ToString) + element.gmOriginalName = Localization.GetString("move_name_" & element.gmOriginalName.ToString) End If For i = 0 To 18 If element.gmEffectivenessAttack.ContainsKey(i) = False Then From b40dde89046ccd246120e03ec649e563c7ce117f Mon Sep 17 00:00:00 2001 From: JappaWakka Date: Fri, 15 Dec 2023 18:21:24 +0100 Subject: [PATCH 18/36] Added CopyMove property for GM Moves --- P3D/Content/Data/Moves/example.dat | Bin 8008 -> 8500 bytes P3D/Pokemon/Attacks/Attack.vb | 118 ++++++++++++++++++-- P3D/Pokemon/Attacks/GameModeAttackLoader.vb | 69 ++++++++++++ 3 files changed, 178 insertions(+), 9 deletions(-) diff --git a/P3D/Content/Data/Moves/example.dat b/P3D/Content/Data/Moves/example.dat index 8ab58780cc0f18314182f86f1e091dc808fe52e1..6c486f674230bc4c083fd712c261425ef9c877bc 100644 GIT binary patch delta 405 zcmZXQu}Z^W6orol9O_tFU8EsX#ZnP;R6$)j_yCS+lG4<5aPb97UPP(0vy1o; zzDU3O*GNJB;hz88bMAlc|9SF$_WI%-Tq)DNd_@X1p^m9HNHh!;P&?>IME}H ze8m@n3sOep_0>kvB}W(hKfzRo+d87L>jXWwj0I+-g*&y;J|AJ>Vs*gFSUDQ|pplE- zr&}%H%Wea@cS>g8TjfWsSx&uCJ%Y0B$5gkyI`bcIZ)3-%2ET7qP5YD-X+Gbq9XA$O Chff3m delta 21 dcmdnubi!^!3-e?P)|Aa#Sk>4z|Khe11pr}n2nPTF diff --git a/P3D/Pokemon/Attacks/Attack.vb b/P3D/Pokemon/Attacks/Attack.vb index 34738b2fe..326055d6e 100644 --- a/P3D/Pokemon/Attacks/Attack.vb +++ b/P3D/Pokemon/Attacks/Attack.vb @@ -184,6 +184,7 @@ Public GameModeBasePower As String = "" 'A GameMode can specify a base power calculation for a move. Public IsGameModeMove As Boolean = False Public gmDeductPP As Boolean = True + Public gmCopyMove As Integer = -1 Private _power As Integer = 40 Private _accuracy As Integer = 100 @@ -1906,9 +1907,14 @@ End Function Public Function GetEffectChance(ByVal i As Integer, ByVal own As Boolean, ByVal BattleScreen As BattleScreen) As Integer - Dim chance As Integer = Me.EffectChances(i) + Dim _attack As Attack = Me + If gmCopyMove <> -1 Then + _attack = GameModeAttackLoader.GetAttackByID(gmCopyMove) + End If - If Me.HasSecondaryEffect = True Then + Dim chance As Integer = _attack.EffectChances(i) + + If _attack.HasSecondaryEffect = True Then Dim p As Pokemon = BattleScreen.OwnPokemon If own = False Then p = BattleScreen.OppPokemon @@ -1938,6 +1944,9 @@ ''' If the own Pokémon used the move. ''' Reference to the BattleScreen. Public Overridable Sub PreAttack(ByVal Own As Boolean, ByVal BattleScreen As BattleScreen) + If gmCopyMove <> -1 Then + GameModeAttackLoader.GetAttackByID(gmCopyMove).PreAttack(Own, BattleScreen) + End If 'DO NOTHING HERE End Sub @@ -1947,6 +1956,9 @@ ''' If the own Pokémon used the move. ''' Reference to the BattleScreen. Public Overridable Function MoveFailBeforeAttack(ByVal Own As Boolean, ByVal BattleScreen As BattleScreen) As Boolean + If gmCopyMove <> -1 Then + Return GameModeAttackLoader.GetAttackByID(gmCopyMove).MoveFailBeforeAttack(Own, BattleScreen) + End If 'DO NOTHING HERE Return False End Function @@ -1960,7 +1972,16 @@ If Me.IsGameModeMove = False Then Return Me.Power Else - Return AttackSpecialBasePower.GetGameModeBasePower(Me, own, BattleScreen) + If gmCopyMove <> -1 Then + Dim _attack As Attack = GameModeAttackLoader.GetAttackByID(gmCopyMove) + If _attack.IsGameModeMove = False Then + Return _attack.GetBasePower(own, BattleScreen) + Else + Return AttackSpecialBasePower.GetGameModeBasePower(_attack, own, BattleScreen) + End If + Else + Return AttackSpecialBasePower.GetGameModeBasePower(Me, own, BattleScreen) + End If End If End Function @@ -1970,7 +1991,12 @@ ''' If the own Pokémon used the move. ''' Reference to the BattleScreen. Public Overridable Function GetDamage(ByVal Critical As Boolean, ByVal Own As Boolean, ByVal targetPokemon As Boolean, ByVal BattleScreen As BattleScreen, Optional ByVal ExtraParameter As String = "") As Integer - Return BattleCalculation.CalculateDamage(Me, Critical, Own, targetPokemon, BattleScreen, ExtraParameter) + If gmCopyMove <> -1 Then + Dim _attack As Attack = GameModeAttackLoader.GetAttackByID(gmCopyMove) + Return BattleCalculation.CalculateDamage(_attack, Critical, Own, targetPokemon, BattleScreen, ExtraParameter) + Else + Return BattleCalculation.CalculateDamage(Me, Critical, Own, targetPokemon, BattleScreen, ExtraParameter) + End If End Function ''' @@ -1982,10 +2008,23 @@ If Me.IsGameModeMove = False Then Return Me.TimesToAttack Else - If gmTimesToAttack.Contains("-") Then - Return Core.Random.Next(CInt(gmTimesToAttack.GetSplit(0, "-")), CInt(gmTimesToAttack.GetSplit(1, "-")) + 1) + If gmCopyMove <> -1 Then + Dim _attack As Attack = GameModeAttackLoader.GetAttackByID(gmCopyMove) + If _attack.IsGameModeMove = False Then + Return _attack.GetTimesToAttack(own, BattleScreen) + Else + If _attack.gmTimesToAttack.Contains("-") Then + Return Core.Random.Next(CInt(_attack.gmTimesToAttack.GetSplit(0, "-")), CInt(_attack.gmTimesToAttack.GetSplit(1, "-")) + 1) + Else + Return CInt(_attack.gmTimesToAttack) + End If + End If Else - Return CInt(gmTimesToAttack) + If gmTimesToAttack.Contains("-") Then + Return Core.Random.Next(CInt(gmTimesToAttack.GetSplit(0, "-")), CInt(gmTimesToAttack.GetSplit(1, "-")) + 1) + Else + Return CInt(gmTimesToAttack) + End If End If End If End Function @@ -1997,21 +2036,39 @@ ''' Reference to the BattleScreen. Public Overridable Sub MoveHits(ByVal own As Boolean, ByVal BattleScreen As BattleScreen) If Me.IsGameModeMove = True Then - AttackSpecialFunctions.ExecuteMoveHitsFunction(Me, own, BattleScreen) + If gmCopyMove <> -1 Then + Dim _attack As Attack = GameModeAttackLoader.GetAttackByID(gmCopyMove) + If _attack.IsGameModeMove = False Then + _attack.MoveHits(own, BattleScreen) + Else + AttackSpecialFunctions.ExecuteMoveHitsFunction(_attack, own, BattleScreen) + End If + Else + AttackSpecialFunctions.ExecuteMoveHitsFunction(Me, own, BattleScreen) + End If Else 'DO NOTHING HERE (will do secondary effect if moves overrides it) End If End Sub Public Overridable Sub MoveRecoil(ByVal own As Boolean, ByVal BattleScreen As BattleScreen) + If gmCopyMove <> -1 Then + GameModeAttackLoader.GetAttackByID(gmCopyMove).MoveRecoil(own, BattleScreen) + End If 'DO NOTHING HERE (will do recoil if moves overrides it) End Sub Public Overridable Sub MoveRecharge(ByVal own As Boolean, ByVal BattleScreen As BattleScreen) + If gmCopyMove <> -1 Then + GameModeAttackLoader.GetAttackByID(gmCopyMove).MoveRecharge(own, BattleScreen) + End If 'DO NOTHING HERE (will do a one turn recharge if moves overrides it) End Sub Public Overridable Sub MoveMultiTurn(ByVal own As Boolean, ByVal BattleScreen As BattleScreen) + If gmCopyMove <> -1 Then + GameModeAttackLoader.GetAttackByID(gmCopyMove).MoveMultiTurn(own, BattleScreen) + End If 'DO NOTHING HERE (will do the multi turn countdown if moves overrides it) End Sub @@ -2025,6 +2082,9 @@ ''' If the own Pokémon used the move. ''' Reference to the BattleScreen. Public Overridable Sub MoveMisses(ByVal own As Boolean, ByVal BattleScreen As BattleScreen) + If gmCopyMove <> -1 Then + GameModeAttackLoader.GetAttackByID(gmCopyMove).MoveMisses(own, BattleScreen) + End If 'DO NOTHING HERE End Sub @@ -2034,6 +2094,9 @@ ''' If the own Pokémon used the move. ''' Reference to the BattleScreen. Public Overridable Sub MoveProtectedDetected(ByVal own As Boolean, ByVal BattleScreen As BattleScreen) + If gmCopyMove <> -1 Then + GameModeAttackLoader.GetAttackByID(gmCopyMove).MoveProtectedDetected(own, BattleScreen) + End If 'DO NOTHING HERE End Sub @@ -2043,6 +2106,9 @@ ''' If the own Pokémon used the move. ''' Reference to the BattleScreen. Public Overridable Sub MoveHasNoEffect(ByVal own As Boolean, ByVal BattleScreen As BattleScreen) + If gmCopyMove <> -1 Then + GameModeAttackLoader.GetAttackByID(gmCopyMove).MoveHasNoEffect(own, BattleScreen) + End If 'DO NOTHING HERE End Sub @@ -2092,7 +2158,16 @@ ''' Reference to the BattleScreen. Public Overridable Function DeductPP(ByVal own As Boolean, ByVal BattleScreen As BattleScreen) As Boolean If Me.IsGameModeMove = True Then - Return gmDeductPP + If gmCopyMove <> -1 Then + Dim _attack As Attack = GameModeAttackLoader.GetAttackByID(gmCopyMove) + If _attack.IsGameModeMove = False Then + Return _attack.DeductPP(own, BattleScreen) + Else + Return _attack.gmDeductPP + End If + Else + Return gmDeductPP + End If Else Return True End If @@ -2113,6 +2188,10 @@ ''' If the own Pokémon used the move. ''' Reference to the BattleScreen. Public Overridable Sub MoveSelected(ByVal own As Boolean, ByVal BattleScreen As BattleScreen) + If gmCopyMove <> -1 Then + GameModeAttackLoader.GetAttackByID(gmCopyMove).MoveSelected(own, BattleScreen) + End If + 'DO NOTHING End Sub @@ -2122,6 +2201,9 @@ ''' If the own Pokémon used the move. ''' Reference to the BattleScreen. Public Overridable Sub BeforeDealingDamage(ByVal own As Boolean, ByVal BattleScreen As BattleScreen) + If gmCopyMove <> -1 Then + GameModeAttackLoader.GetAttackByID(gmCopyMove).BeforeDealingDamage(own, BattleScreen) + End If 'DO NOTHING End Sub @@ -2131,6 +2213,9 @@ ''' If the own Pokémon used the move. ''' Reference to the BattleScreen. Public Overridable Sub AbsorbedBySubstitute(ByVal own As Boolean, ByVal BattleScreen As BattleScreen) + If gmCopyMove <> -1 Then + GameModeAttackLoader.GetAttackByID(gmCopyMove).AbsorbedBySubstitute(own, BattleScreen) + End If 'DO NOTHING End Sub @@ -2140,6 +2225,9 @@ ''' If the own Pokémon used the move. ''' Reference to the BattleScreen. Public Overridable Sub MoveFailsSoundproof(ByVal own As Boolean, ByVal BattleScreen As BattleScreen) + If gmCopyMove <> -1 Then + GameModeAttackLoader.GetAttackByID(gmCopyMove).MoveFailsSoundproof(own, BattleScreen) + End If 'DO NOTHING End Sub @@ -2149,6 +2237,9 @@ ''' If the own Pokémon used the move. ''' Reference to the BattleScreen. Public Overridable Sub InflictedFlinch(ByVal own As Boolean, ByVal BattleScreen As BattleScreen) + If gmCopyMove <> -1 Then + GameModeAttackLoader.GetAttackByID(gmCopyMove).InflictedFlinch(own, BattleScreen) + End If 'DO NOTHING End Sub @@ -2158,6 +2249,9 @@ ''' If the own Pokémon is confused. ''' Reference to the BattleScreen. Public Overridable Sub HurtItselfInConfusion(ByVal own As Boolean, ByVal BattleScreen As BattleScreen) + If gmCopyMove <> -1 Then + GameModeAttackLoader.GetAttackByID(gmCopyMove).HurtItselfInConfusion(own, BattleScreen) + End If 'DO NOTHING End Sub @@ -2167,6 +2261,9 @@ ''' If the own Pokémon is in love. ''' Reference to the BattleScreen. Public Overridable Sub IsAttracted(ByVal own As Boolean, ByVal BattleScreen As BattleScreen) + If gmCopyMove <> -1 Then + GameModeAttackLoader.GetAttackByID(gmCopyMove).IsAttracted(own, BattleScreen) + End If 'DO NOTHING End Sub @@ -2176,6 +2273,9 @@ ''' If the own Pokémon used the move. ''' Reference to the BattleScreen. Public Overridable Sub IsSleeping(ByVal own As Boolean, ByVal BattleScreen As BattleScreen) + If gmCopyMove <> -1 Then + GameModeAttackLoader.GetAttackByID(gmCopyMove).IsSleeping(own, BattleScreen) + End If 'DO NOTHING End Sub diff --git a/P3D/Pokemon/Attacks/GameModeAttackLoader.vb b/P3D/Pokemon/Attacks/GameModeAttackLoader.vb index c58c24011..caaa21882 100644 --- a/P3D/Pokemon/Attacks/GameModeAttackLoader.vb +++ b/P3D/Pokemon/Attacks/GameModeAttackLoader.vb @@ -57,6 +57,75 @@ value = l.Remove(0, l.IndexOf("|") + 1) Select Case key.ToLower() + Case "copymove" + If nonCommentLines = 1 Then + move.gmCopyMove = CInt(value) + + Dim _attack As Attack = GameModeAttackLoader.GetAttackByID(move.gmCopyMove) + move.Power = _attack.Power + move.Accuracy = _attack.Accuracy + move.Name = _attack.Name + move.OriginalPP = _attack.OriginalPP + move.CurrentPP = _attack.CurrentPP + move.MaxPP = _attack.MaxPP + move.Category = _attack.Category + move.ContestCategory = _attack.ContestCategory + move.Description = _attack.Description + move.CriticalChance = _attack.CriticalChance + move.IsHMMove = _attack.IsHMMove + move.Target = _attack.Target + move.Priority = _attack.Priority + move.TimesToAttack = _attack.TimesToAttack + move.EffectChances = _attack.EffectChances + move.MakesContact = _attack.MakesContact + move.HasSecondaryEffect = _attack.HasSecondaryEffect + move.IsHealingMove = _attack.IsHealingMove + move.IsDamagingMove = _attack.IsDamagingMove + move.IsProtectMove = _attack.IsProtectMove + move.IsOneHitKOMove = _attack.IsOneHitKOMove + move.IsRecoilMove = _attack.IsRecoilMove + move.IsTrappingMove = _attack.IsTrappingMove + move.RemovesOwnFrozen = _attack.RemovesOwnFrozen + move.RemovesOppFrozen = _attack.RemovesOppFrozen + move.SwapsOutOwnPokemon = _attack.SwapsOutOwnPokemon + move.SwapsOutOppPokemon = _attack.SwapsOutOppPokemon + move.ProtectAffected = _attack.ProtectAffected + move.MagicCoatAffected = _attack.MagicCoatAffected + move.SnatchAffected = _attack.SnatchAffected + move.MirrorMoveAffected = _attack.MirrorMoveAffected + move.KingsrockAffected = _attack.KingsrockAffected + move.CounterAffected = _attack.CounterAffected + move.IsAffectedBySubstitute = _attack.IsAffectedBySubstitute + move.ImmunityAffected = _attack.ImmunityAffected + move.IsWonderGuardAffected = _attack.IsWonderGuardAffected + move.DisabledWhileGravity = _attack.DisabledWhileGravity + move.UseEffectiveness = _attack.UseEffectiveness + move.UseAccEvasion = _attack.UseAccEvasion + move.CanHitInMidAir = _attack.CanHitInMidAir + move.CanHitUnderground = _attack.CanHitUnderground + move.CanHitUnderwater = _attack.CanHitUnderwater + move.CanHitSleeping = _attack.CanHitSleeping + move.CanGainSTAB = _attack.CanGainSTAB + move.UseOppDefense = _attack.UseOppDefense + move.UseOppEvasion = _attack.UseOppEvasion + move.IsPulseMove = _attack.IsPulseMove + move.IsBulletMove = _attack.IsBulletMove + move.IsJawMove = _attack.IsJawMove + move.IsDanceMove = _attack.IsDanceMove + move.IsExplosiveMove = _attack.IsExplosiveMove + move.IsPowderMove = _attack.IsPowderMove + move.IsPunchingMove = _attack.IsPunchingMove + move.IsSlicingMove = _attack.IsSlicingMove + move.IsSoundMove = _attack.IsSoundMove + move.IsWindMove = _attack.IsWindMove + move.FocusOppPokemon = _attack.FocusOppPokemon + move.Disabled = _attack.Disabled + move.AIField1 = _attack.AIField1 + move.AIField2 = _attack.AIField2 + move.AIField3 = _attack.AIField3 + Else + Logger.Log(Logger.LogTypes.ErrorMessage, "GameModeAttackLoader.vb: The CopyMove property should be the first property set in the move definition file. It is currently property number " & nonCommentLines.ToString & ".") + End If Case "id" move.ID = CInt(value) move.OriginalID = CInt(value) From a1c3c6f9dae30d4fb6f5c346fe0df30a5ddb6e6c Mon Sep 17 00:00:00 2001 From: JappaWakka Date: Sat, 16 Dec 2023 15:59:32 +0100 Subject: [PATCH 19/36] =?UTF-8?q?Added=20=20construct?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Returns a string of every move the Pokémon can learn at or below a certain level * Index (int) = Index of a Pokémon in the player's party * MaxLevel (int) [optional] = Every move the Pokémon can learn at or below the level specified by this argument is added to the string. When this argument is left out or set to "-1", it will default to the Pokémon's current level. --- .../V2/ScriptConstructs/DoPokemon.vb | 22 +++++++++++++++++++ P3D/World/ActionScript/V2/ScriptLibrary.vb | 2 ++ 2 files changed, 24 insertions(+) diff --git a/P3D/World/ActionScript/V2/ScriptConstructs/DoPokemon.vb b/P3D/World/ActionScript/V2/ScriptConstructs/DoPokemon.vb index 401719ec8..32b0b4c8f 100644 --- a/P3D/World/ActionScript/V2/ScriptConstructs/DoPokemon.vb +++ b/P3D/World/ActionScript/V2/ScriptConstructs/DoPokemon.vb @@ -149,6 +149,28 @@ Dim moveIndex As Integer = int(argument.GetSplit(1)) Return Core.Player.Pokemons(pokeIndex).Attacks(moveIndex).Name + Case "levelattacks" + Dim pokeIndex As Integer = int(argument.GetSplit(0)) + Dim MaxLevel As Integer = Core.Player.Pokemons(pokeIndex).Level + Dim levelMoves As String = "" + If argument.Split(",").Count > 1 Then + If argument.GetSplit(1).ToLower = "-1" Then + MaxLevel = Core.Player.Pokemons(pokeIndex).Level + Else + MaxLevel = CInt(argument.GetSplit(1)) + End If + End If + + For Each level As Integer In Core.Player.Pokemons(pokeIndex).AttackLearns.Keys + If level <= MaxLevel Then + If levelMoves = "" Then + levelMoves = Core.Player.Pokemons(pokeIndex).AttackLearns(level).ID.ToString + Else + levelMoves &= "," & Core.Player.Pokemons(pokeIndex).AttackLearns(level).ID.ToString + End If + End If + Next + Return levelMoves Case "isshiny" Dim index As Integer = int(argument.GetSplit(0)) diff --git a/P3D/World/ActionScript/V2/ScriptLibrary.vb b/P3D/World/ActionScript/V2/ScriptLibrary.vb index 2aab56477..e8cfc4dfa 100644 --- a/P3D/World/ActionScript/V2/ScriptLibrary.vb +++ b/P3D/World/ActionScript/V2/ScriptLibrary.vb @@ -862,6 +862,8 @@ Namespace ScriptVersion2 r(New ScriptCommand("pokemon", "countattacks", "int", {New ScriptArgument("pokemonIndex", ScriptArgument.ArgumentTypes.Int)}.ToList(), "Counts the moves the Pokémon knows.", ",", True)) r(New ScriptCommand("pokemon", "attackname", "str", {New ScriptArgument("pokemonIndex", ScriptArgument.ArgumentTypes.Int), New ScriptArgument("moveIndex", ScriptArgument.ArgumentTypes.Int)}.ToList(), "Returns the name of the move of a Pokémon in the player's party.", ",", True)) + r(New ScriptCommand("pokemon", "levelattacks", "str", {New ScriptArgument("pokemonIndex", ScriptArgument.ArgumentTypes.Int), + New ScriptArgument("maxLevel", ScriptArgument.ArgumentTypes.Int, True, "-1")}.ToList(), "Returns a list of move IDs separated by commas that a Pokémon in the player's party can learn at or below its current level/the level specified by the maxLevel argument.", ",", True)) r(New ScriptCommand("pokemon", "isShiny", "bool", {New ScriptArgument("pokemonIndex", ScriptArgument.ArgumentTypes.Int)}.ToList(), "Returns if the Pokémon is Shiny.", ",", True)) r(New ScriptCommand("pokemon", "nature", "str", {New ScriptArgument("pokemonIndex", ScriptArgument.ArgumentTypes.Int)}.ToList(), "Returns the nature of a Pokémon in the player's party.", ",", True)) r(New ScriptCommand("pokemon", "ownpokemon", "bool", {New ScriptArgument("pokemonIndex", ScriptArgument.ArgumentTypes.Int)}.ToList(), "Returns if a Pokémon in the player's party was caught by the player.", ",", True)) From c1cadd3078e2be10adb2942aff3a2b197cd9a3a1 Mon Sep 17 00:00:00 2001 From: JappaWakka Date: Fri, 22 Dec 2023 14:48:14 +0100 Subject: [PATCH 20/36] Fix CopyMove using wrong GetAttackByID function --- P3D/Pokemon/Attacks/GameModeAttackLoader.vb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/P3D/Pokemon/Attacks/GameModeAttackLoader.vb b/P3D/Pokemon/Attacks/GameModeAttackLoader.vb index caaa21882..9e048259d 100644 --- a/P3D/Pokemon/Attacks/GameModeAttackLoader.vb +++ b/P3D/Pokemon/Attacks/GameModeAttackLoader.vb @@ -61,7 +61,7 @@ If nonCommentLines = 1 Then move.gmCopyMove = CInt(value) - Dim _attack As Attack = GameModeAttackLoader.GetAttackByID(move.gmCopyMove) + Dim _attack As Attack = Attack.GetAttackByID(move.gmCopyMove) move.Power = _attack.Power move.Accuracy = _attack.Accuracy move.Name = _attack.Name From 168255e1a02eac92f5d44dea0a4c66ab02cadd54 Mon Sep 17 00:00:00 2001 From: JappaWakka Date: Wed, 27 Dec 2023 17:09:25 +0100 Subject: [PATCH 21/36] If level RideType = 3, no stop once riding/biking --- P3D/Content/Localization/Tokens_en.dat | 4 ++++ P3D/Pokemon/Items/KeyItems/Bicycle.vb | 23 +++++++++++++---------- P3D/Screens/Pokemon/PartyScreen.vb | 26 +++++++++++++++----------- P3D/World/Level.vb | 4 +++- 4 files changed, 35 insertions(+), 22 deletions(-) diff --git a/P3D/Content/Localization/Tokens_en.dat b/P3D/Content/Localization/Tokens_en.dat index 7f6fd173c..20e0485ab 100644 --- a/P3D/Content/Localization/Tokens_en.dat +++ b/P3D/Content/Localization/Tokens_en.dat @@ -118,6 +118,9 @@ fieldmove_headbutt_used,used~Headbutt! fieldmove_waterfall_used,used~Waterfall. +fieldmove_ride_cannot_walk,You cannot walk here! +fieldmove_ride_cannot_ride,You cannot Ride here! +fieldmove_ride_used,used~Ride! --- GameInteractions: game_interaction_interact,Interact @@ -2326,6 +2329,7 @@ item_name_676,Water Memory Item Use Text: item_cannot_use,Now is not the time~to use that. +item_6_cannot_walk,You cannot walk here! item_6_missingskin,You can't use this item~without a bicycle skin.*Its name should be the~same as your current one,~but with "_bike" at the end. item_6_only_custom_gamemodes,This item can't be used~on this GameMode. diff --git a/P3D/Pokemon/Items/KeyItems/Bicycle.vb b/P3D/Pokemon/Items/KeyItems/Bicycle.vb index 93681d595..d7c5c4cf3 100644 --- a/P3D/Pokemon/Items/KeyItems/Bicycle.vb +++ b/P3D/Pokemon/Items/KeyItems/Bicycle.vb @@ -14,19 +14,22 @@ Namespace Items.KeyItems Public Overrides Sub Use() If GameModeManager.ActiveGameMode.IsDefaultGamemode = False AndAlso Core.Player.IsGameJoltSave = False Then If Screen.Level.Riding = True Then - Screen.Level.Riding = False - Screen.Level.OwnPlayer.SetTexture(Core.Player.TempRideSkin, True) - Core.Player.Skin = Core.Player.TempRideSkin + If Screen.Level.RideType = 3 Then + Screen.TextBox.Show(Localization.GetString("item_6_cannot_walk", "You cannot walk here!"), {}, True, False) + Else + Screen.Level.Riding = False + Screen.Level.OwnPlayer.SetTexture(Core.Player.TempRideSkin, True) + Core.Player.Skin = Core.Player.TempRideSkin - Screen.TextBox.Show(Localization.GetString("item_use_6", " stepped~off the Bicycle.")) - While Core.CurrentScreen.Identification <> Screen.Identifications.OverworldScreen - Core.CurrentScreen = Core.CurrentScreen.PreScreen - End While + Screen.TextBox.Show(Localization.GetString("item_use_6", " stepped~off the Bicycle.")) + While Core.CurrentScreen.Identification <> Screen.Identifications.OverworldScreen + Core.CurrentScreen = Core.CurrentScreen.PreScreen + End While - If Screen.Level.IsRadioOn = False OrElse GameJolt.PokegearScreen.StationCanPlay(Screen.Level.SelectedRadioStation) = False Then - MusicManager.Play(Screen.Level.MusicLoop) + If Screen.Level.IsRadioOn = False OrElse GameJolt.PokegearScreen.StationCanPlay(Screen.Level.SelectedRadioStation) = False Then + MusicManager.Play(Screen.Level.MusicLoop) + End If End If - Else If Screen.Level.Surfing = False AndAlso Screen.Level.Riding = False AndAlso Screen.Camera.IsMoving() = False AndAlso Screen.Camera.Turning = False And Screen.Level.CanRide() = True Then Dim BikeSkin As String = Core.Player.Skin & "_Bike" diff --git a/P3D/Screens/Pokemon/PartyScreen.vb b/P3D/Screens/Pokemon/PartyScreen.vb index f8f9f56b5..fcbe7cdf8 100644 --- a/P3D/Screens/Pokemon/PartyScreen.vb +++ b/P3D/Screens/Pokemon/PartyScreen.vb @@ -1014,18 +1014,22 @@ Public Class PartyScreen Private Sub UseRide() If Screen.Level.Riding = True Then - Screen.Level.Riding = False - Screen.Level.OwnPlayer.SetTexture(Core.Player.TempRideSkin, True) - Core.Player.Skin = Core.Player.TempRideSkin + If Screen.Level.RideType = 3 Then + TextBox.Show(Localization.GetString("fieldmove_ride_cannot_walk", "You cannot walk here!"), {}, True, False) + Else + Screen.Level.Riding = False + Screen.Level.OwnPlayer.SetTexture(Core.Player.TempRideSkin, True) + Core.Player.Skin = Core.Player.TempRideSkin - ChooseBox.Showing = False - Core.SetScreen(Me.PreScreen) - If Core.CurrentScreen.Identification = Identifications.MenuScreen Then - Core.SetScreen(Core.CurrentScreen.PreScreen) - End If + ChooseBox.Showing = False + Core.SetScreen(Me.PreScreen) + If Core.CurrentScreen.Identification = Identifications.MenuScreen Then + Core.SetScreen(Core.CurrentScreen.PreScreen) + End If - If Screen.Level.IsRadioOn = False OrElse GameJolt.PokegearScreen.StationCanPlay(Screen.Level.SelectedRadioStation) = False Then - MusicManager.Play(Level.MusicLoop, True, 0.01F) + If Screen.Level.IsRadioOn = False OrElse GameJolt.PokegearScreen.StationCanPlay(Screen.Level.SelectedRadioStation) = False Then + MusicManager.Play(Level.MusicLoop, True, 0.01F) + End If End If Else If Screen.Level.Surfing = False And Screen.Camera.IsMoving() = False And Screen.Camera.Turning = False And Level.CanRide() = True Then @@ -1057,7 +1061,7 @@ Public Class PartyScreen MusicManager.Play("ride", True) End If Else - TextBox.Show("You cannot Ride here!", {}, True, False) + TextBox.Show(Localization.GetString("fieldmove_ride_cannot_ride", "You cannot Ride here!"), {}, True, False) End If End If End Sub diff --git a/P3D/World/Level.vb b/P3D/World/Level.vb index 585b33214..5594adc21 100644 --- a/P3D/World/Level.vb +++ b/P3D/World/Level.vb @@ -324,7 +324,7 @@ Public Class Level ''' ''' The type of Ride the player can use on this map. ''' - ''' 0 = Depends on CanDig and CanFly, 1 = True, 2 = False + ''' 0 = Depends on CanDig and CanFly, 1 = True, 2 = False, 3 = Can't stop riding Public Property RideType As Integer Get Return Me._rideType @@ -1214,6 +1214,8 @@ Public Class Level Return True Case 2 Return False + Case 3 + Return True End Select End If If Screen.Level.CanDig = False And Screen.Level.CanFly = False Then From 845464f03cea4c21c8f47f60e70c56cea678a0d0 Mon Sep 17 00:00:00 2001 From: JappaWakka Date: Wed, 27 Dec 2023 17:10:54 +0100 Subject: [PATCH 22/36] Added @Item.Use(ItemID) command @Item.Use(ItemID) Uses the specified item if the player has it. --- P3D/World/ActionScript/V2/ScriptCommands/DoItem.vb | 5 +++++ P3D/World/ActionScript/V2/ScriptLibrary.vb | 1 + 2 files changed, 6 insertions(+) diff --git a/P3D/World/ActionScript/V2/ScriptCommands/DoItem.vb b/P3D/World/ActionScript/V2/ScriptCommands/DoItem.vb index 068974bb1..84e9cfaeb 100644 --- a/P3D/World/ActionScript/V2/ScriptCommands/DoItem.vb +++ b/P3D/World/ActionScript/V2/ScriptCommands/DoItem.vb @@ -135,6 +135,11 @@ steps = 250 End Select Core.Player.RepelSteps += steps + Case "use" + Dim itemID As String = argument + If Core.Player.Inventory.GetItemAmount(itemID) > 0 Then + Item.GetItemByID(itemID).Use() + End If Case "select" Dim allowedPages As Integer() Dim allowedItems As New List(Of String) diff --git a/P3D/World/ActionScript/V2/ScriptLibrary.vb b/P3D/World/ActionScript/V2/ScriptLibrary.vb index e8cfc4dfa..69859bf55 100644 --- a/P3D/World/ActionScript/V2/ScriptLibrary.vb +++ b/P3D/World/ActionScript/V2/ScriptLibrary.vb @@ -290,6 +290,7 @@ Namespace ScriptVersion2 r(New ScriptCommand("item", "messagegive", {New ScriptArgument("ItemID", ScriptArgument.ArgumentTypes.Int), New ScriptArgument("Amount", ScriptArgument.ArgumentTypes.Int, True, "1")}.ToList(), "Displays a message for getting the specified amount of items.")) r(New ScriptCommand("item", "repel", {New ScriptArgument("RepelItemID", ScriptArgument.ArgumentTypes.Int, {"20", "42", "43"})}.ToList(), "Adds the steps of the Repel to the Repel steps of the player.")) + r(New ScriptCommand("item", "use", {New ScriptArgument("ItemID", ScriptArgument.ArgumentTypes.Str)}.ToList(), "Uses the specified item if the player has it.")) r(New ScriptCommand("item", "select", {New ScriptArgument("AllowedPages", ScriptArgument.ArgumentTypes.Str, True, "-1"), New ScriptArgument("AllowedItems", ScriptArgument.ArgumentTypes.Str, True, "-1")}.ToList(), "Opens an item select screen with only the specified item type pages (separated with "";"", e.g. ""0;1;2"" or ""standard;medicine;plants"") and possible item IDs (single items separated with "";"", or with a ""-"" if you want a range, e.g. ""2000-2066"").")) From 3f1b7ffc0cb28f45aed65edc551ed5c177bf6769 Mon Sep 17 00:00:00 2001 From: JappaWakka Date: Wed, 27 Dec 2023 17:13:00 +0100 Subject: [PATCH 23/36] Added @Pokemon.Ride([pokeIndex[) command MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit @Pokemon.Ride([pokeIndex]) Makes a Pokémon in the player's party use the field move Ride. If the argument is left empty, the first Pokémon who knows Ride gets selected. pokeIndex (int) [optional, defaults to -1] = the party index of a Pokémon --- .../V2/ScriptCommands/DoPokemon.vb | 65 +++++++++++++++++++ P3D/World/ActionScript/V2/ScriptLibrary.vb | 1 + 2 files changed, 66 insertions(+) diff --git a/P3D/World/ActionScript/V2/ScriptCommands/DoPokemon.vb b/P3D/World/ActionScript/V2/ScriptCommands/DoPokemon.vb index 3380c5d31..633075e99 100644 --- a/P3D/World/ActionScript/V2/ScriptCommands/DoPokemon.vb +++ b/P3D/World/ActionScript/V2/ScriptCommands/DoPokemon.vb @@ -1054,6 +1054,71 @@ Core.Player.Pokemons(Index).HP = 0 End If End If + Case "ride" + Dim Index As Integer = -1 + If argument <> "" Then + If Core.Player.Pokemons(Index).KnowsMove(BattleSystem.Attack.GetAttackByID(560)) = False Then + Logger.Log(Logger.LogTypes.ErrorMessage, "The specified Pokémon does not know the move Ride. The specified index is: " & Index.ToString & ".") + Else + Index = CInt(argument) + End If + End If + + If Index = -1 Then + For p = 0 To Core.Player.Pokemons.Count - 1 + If Core.Player.Pokemons(p).KnowsMove(BattleSystem.Attack.GetAttackByID(560)) Then + Index = p + Exit For + End If + Next + End If + + If Index <> -1 Then + If Screen.Level.Riding = True Then + If Screen.Level.RideType = 3 Then + Screen.TextBox.Show(Localization.GetString("fieldmove_ride_cannot_walk", "You cannot walk here!"), {}, True, False) + Else + Screen.Level.Riding = False + Screen.Level.OwnPlayer.SetTexture(Core.Player.TempRideSkin, True) + Core.Player.Skin = Core.Player.TempRideSkin + Screen.ChooseBox.Showing = False + + + If Screen.Level.IsRadioOn = False OrElse GameJolt.PokegearScreen.StationCanPlay(Screen.Level.SelectedRadioStation) = False Then + MusicManager.Play(Screen.Level.MusicLoop, True, 0.01F) + End If + End If + Else + If Screen.Level.Surfing = False And Screen.Camera.IsMoving() = False And Screen.Camera.Turning = False And Screen.Level.CanRide() = True Then + Screen.ChooseBox.Showing = False + + Screen.Level.Riding = True + Core.Player.TempRideSkin = Core.Player.Skin + + Dim skin As String = "[POKEMON|" + If Core.Player.Pokemons(Index).IsShiny = True Then + skin &= "S]" + Else + skin &= "N]" + End If + skin &= Core.Player.Pokemons(Index).Number & PokemonForms.GetOverworldAddition(Core.Player.Pokemons(Index)) + + Screen.Level.OwnPlayer.SetTexture(skin, False) + + SoundManager.PlayPokemonCry(Core.Player.Pokemons(Index).Number) + + Screen.TextBox.Show(Core.Player.Pokemons(Index).GetDisplayName() & " " & Localization.GetString("fieldmove_ride_used", "used~Ride!"), {}, True, False) + PlayerStatistics.Track("Ride used", 1) + + If Screen.Level.IsRadioOn = False OrElse GameJolt.PokegearScreen.StationCanPlay(Screen.Level.SelectedRadioStation) = False Then + MusicManager.Play("ride", True) + End If + Else + Screen.TextBox.Show(Localization.GetString("fieldmove_ride_cannot_ride", "You cannot Ride here!"), {}, True, False) + End If + End If + End If + End Select IsReady = True diff --git a/P3D/World/ActionScript/V2/ScriptLibrary.vb b/P3D/World/ActionScript/V2/ScriptLibrary.vb index 69859bf55..ee23c0cc6 100644 --- a/P3D/World/ActionScript/V2/ScriptLibrary.vb +++ b/P3D/World/ActionScript/V2/ScriptLibrary.vb @@ -826,6 +826,7 @@ Namespace ScriptVersion2 New ScriptArgument("trainerName", ScriptArgument.ArgumentTypes.Str, True, "Current TrainerName"), New ScriptArgument("heldItemID", ScriptArgument.ArgumentTypes.Int, True, "0"), New ScriptArgument("isShiny", ScriptArgument.ArgumentTypes.Bool, True, "false")}.ToList(), "Adds a Pokémon with the given Pokémon properties to the storage system.")) + r(New ScriptCommand("pokemon", "ride", {New ScriptArgument("pokemonID", ScriptArgument.ArgumentTypes.Int, True, "-1")}.ToList(), "Makes a Pokémon in the player's party use the field move Ride. If the argument is left empty, the first Pokémon who knows Ride gets selected.")) ' Constructs: From 85bcb5278062bd14266aa77a985c1659e0fb06d9 Mon Sep 17 00:00:00 2001 From: JappaWakka Date: Wed, 27 Dec 2023 18:55:48 +0100 Subject: [PATCH 24/36] Added @Level.SetRideType(int) command Sets the Ride Type of the current map. Possible values for "int": 0 = Depends on CanDig and CanFly tags, 1 = Can ride, 2 = Can not ride, 3 = Can't stop riding once started --- P3D/World/ActionScript/V2/ScriptCommands/DoLevel.vb | 3 +++ P3D/World/ActionScript/V2/ScriptLibrary.vb | 1 + 2 files changed, 4 insertions(+) diff --git a/P3D/World/ActionScript/V2/ScriptCommands/DoLevel.vb b/P3D/World/ActionScript/V2/ScriptCommands/DoLevel.vb index f50189335..c70e267ca 100644 --- a/P3D/World/ActionScript/V2/ScriptCommands/DoLevel.vb +++ b/P3D/World/ActionScript/V2/ScriptCommands/DoLevel.vb @@ -69,6 +69,9 @@ Case "setsafari" Screen.Level.IsSafariZone = CBool(argument) IsReady = True + Case "setridetype" + Screen.Level.RideType = CInt(argument).Clamp(0, 3) + IsReady = True End Select End Sub diff --git a/P3D/World/ActionScript/V2/ScriptLibrary.vb b/P3D/World/ActionScript/V2/ScriptLibrary.vb index ee23c0cc6..c53a41d8d 100644 --- a/P3D/World/ActionScript/V2/ScriptLibrary.vb +++ b/P3D/World/ActionScript/V2/ScriptLibrary.vb @@ -211,6 +211,7 @@ Namespace ScriptVersion2 r(New ScriptCommand("level", "waitforsave", "Makes the level idle until the current saving of an GameJolt save is done.")) r(New ScriptCommand("level", "reload", "Reloads the current map.")) r(New ScriptCommand("level", "setsafari", {New ScriptArgument("safari", ScriptArgument.ArgumentTypes.Bool)}.ToList(), "Sets if the current map is a Safari Zone (influences battle style).")) + r(New ScriptCommand("level", "setridetype", {New ScriptArgument("rideType", ScriptArgument.ArgumentTypes.Int, {"0-3"})}.ToList(), "Sets the Ride Type of the current map. (0 = Depends on CanDig and CanFly tags, 1 = Can ride, 2 = Can not ride, 3 = Can't stop riding once started)")) ' Constructs: r(New ScriptCommand("level", "mapfile", "str", "Returns the mapfile of the currently loaded map.", ",", True)) r(New ScriptCommand("level", "levelfile", "str", "Returns the mapfile of the currently loaded map.", ",", True)) From e8da25f6bd7e65bcb6cdab841879742469c00b20 Mon Sep 17 00:00:00 2001 From: JappaWakka Date: Wed, 27 Dec 2023 20:49:08 +0100 Subject: [PATCH 25/36] Make fishing rods usable while riding/surfing --- P3D/Pokemon/Items/KeyItems/GoodRod.vb | 2 +- P3D/Pokemon/Items/KeyItems/OldRod.vb | 2 +- P3D/Pokemon/Items/KeyItems/SuperRod.vb | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/P3D/Pokemon/Items/KeyItems/GoodRod.vb b/P3D/Pokemon/Items/KeyItems/GoodRod.vb index 41874c6e5..fdf21f3d3 100644 --- a/P3D/Pokemon/Items/KeyItems/GoodRod.vb +++ b/P3D/Pokemon/Items/KeyItems/GoodRod.vb @@ -13,7 +13,7 @@ Namespace Items.KeyItems End Sub Public Overrides Sub Use() - If OldRod.IsInfrontOfWater() = True And Screen.Level.Surfing = False And Screen.Level.Riding = False Then + If OldRod.IsInfrontOfWater() = True Then Dim s As String = "version=2" While Core.CurrentScreen.Identification <> Screen.Identifications.OverworldScreen diff --git a/P3D/Pokemon/Items/KeyItems/OldRod.vb b/P3D/Pokemon/Items/KeyItems/OldRod.vb index 339042962..44602a938 100644 --- a/P3D/Pokemon/Items/KeyItems/OldRod.vb +++ b/P3D/Pokemon/Items/KeyItems/OldRod.vb @@ -13,7 +13,7 @@ Namespace Items.KeyItems End Sub Public Overrides Sub Use() - If IsInfrontOfWater() = True And Screen.Level.Surfing = False And Screen.Level.Riding = False Then + If IsInfrontOfWater() = True Then Dim s As String = "version=2" While Core.CurrentScreen.Identification <> Screen.Identifications.OverworldScreen diff --git a/P3D/Pokemon/Items/KeyItems/SuperRod.vb b/P3D/Pokemon/Items/KeyItems/SuperRod.vb index 4c59fd4dd..d2d2066ae 100644 --- a/P3D/Pokemon/Items/KeyItems/SuperRod.vb +++ b/P3D/Pokemon/Items/KeyItems/SuperRod.vb @@ -13,7 +13,7 @@ Namespace Items.KeyItems End Sub Public Overrides Sub Use() - If OldRod.IsInfrontOfWater() = True And Screen.Level.Surfing = False And Screen.Level.Riding = False Then + If OldRod.IsInfrontOfWater() = True Then Dim s As String = "version=2" While Core.CurrentScreen.Identification <> Screen.Identifications.OverworldScreen From 8ab0da3f38b23f22dc21540feca77c5eaa0675d1 Mon Sep 17 00:00:00 2001 From: JappaWakka Date: Wed, 24 Jan 2024 12:58:54 +0100 Subject: [PATCH 26/36] GameModes in Saves use directory name for check --- P3D/Debug/Logger.vb | 2 +- P3D/Network/Servers/PlayerManager.vb | 2 +- P3D/Resources/FontManager.vb | 2 +- P3D/Resources/ModelManager.vb | 2 +- P3D/Screens/MainMenu/NewNewGameScreen.vb | 2 +- P3D/Screens/MainMenu/PressStartScreen.vb | 4 ++-- 6 files changed, 7 insertions(+), 7 deletions(-) diff --git a/P3D/Debug/Logger.vb b/P3D/Debug/Logger.vb index e04e5f942..f722e63c3 100644 --- a/P3D/Debug/Logger.vb +++ b/P3D/Debug/Logger.vb @@ -113,7 +113,7 @@ Public Class Logger Dim GameMode As String = "[No GameMode loaded]" If Not GameModeManager.ActiveGameMode Is Nothing Then - GameMode = GameModeManager.ActiveGameMode.Name + GameMode = GameModeManager.ActiveGameMode.DirectoryName End If Dim OnlineInformation As String = "GameJolt Account: FALSE" diff --git a/P3D/Network/Servers/PlayerManager.vb b/P3D/Network/Servers/PlayerManager.vb index 3535255c3..312d1a327 100644 --- a/P3D/Network/Servers/PlayerManager.vb +++ b/P3D/Network/Servers/PlayerManager.vb @@ -275,7 +275,7 @@ Namespace Servers GameJoltID = Core.GameJoltSave.GameJoltID End If - AddToDataItems(dataItems, GameModeManager.ActiveGameMode.Name.ToLower(), 0) + AddToDataItems(dataItems, GameModeManager.ActiveGameMode.DirectoryName.ToLower(), 0) AddToDataItems(dataItems, Core.Player.IsGamejoltSave.ToNumberString(), 1) AddToDataItems(dataItems, GameJoltID, 2) AddToDataItems(dataItems, GameController.DecSeparator, 3) diff --git a/P3D/Resources/FontManager.vb b/P3D/Resources/FontManager.vb index 45ecfa4f5..763a5cfc1 100644 --- a/P3D/Resources/FontManager.vb +++ b/P3D/Resources/FontManager.vb @@ -34,7 +34,7 @@ Public Class FontManager End If Next 'if there's a game mode loaded, look in that too for additional fonts - If Not GameModeManager.ActiveGameMode.Name = "Kolben" Then + If Not GameModeManager.ActiveGameMode.DirectoryName = "Kolben" Then If Not GameModeManager.ActiveGameMode.ContentPath = "\Content\" Then If System.IO.Directory.Exists(GameController.GamePath & GameModeManager.ActiveGameMode.ContentPath & "\Fonts\BMP") = True Then For Each s As String In System.IO.Directory.GetFiles(GameController.GamePath & GameModeManager.ActiveGameMode.ContentPath & "\Fonts\BMP") diff --git a/P3D/Resources/ModelManager.vb b/P3D/Resources/ModelManager.vb index 73359729c..14623dc7f 100644 --- a/P3D/Resources/ModelManager.vb +++ b/P3D/Resources/ModelManager.vb @@ -32,7 +32,7 @@ Public Class ModelManager Public Shared Function ModelExist(ByVal Path As String) As Boolean Dim cContent As ContentManager = ContentPackManager.GetContentManager(Path, ".xnb") If cContent.RootDirectory = "Content" Then - If GameModeManager.ActiveGameMode.Name <> "Kolben" Then + If GameModeManager.ActiveGameMode.DirectoryName <> "Kolben" Then Return False End If End If diff --git a/P3D/Screens/MainMenu/NewNewGameScreen.vb b/P3D/Screens/MainMenu/NewNewGameScreen.vb index bf1553fd1..de20dfb7c 100644 --- a/P3D/Screens/MainMenu/NewNewGameScreen.vb +++ b/P3D/Screens/MainMenu/NewNewGameScreen.vb @@ -160,7 +160,7 @@ Core.Player.filePrefix = folderPath Core.Player.GameStart = Date.Now - Core.Player.GameMode = GameModeManager.ActiveGameMode.Name + Core.Player.GameMode = GameModeManager.ActiveGameMode.DirectoryName Core.Player.startFOV = 60 Core.Player.startFreeCameraMode = True Core.Player.startPosition = New Vector3(x, y, z) diff --git a/P3D/Screens/MainMenu/PressStartScreen.vb b/P3D/Screens/MainMenu/PressStartScreen.vb index d1aeeb07b..fff6afced 100644 --- a/P3D/Screens/MainMenu/PressStartScreen.vb +++ b/P3D/Screens/MainMenu/PressStartScreen.vb @@ -1631,7 +1631,7 @@ Public Class GameModeSelectionScreen Dim displayText = _gameModes(i).Name.CropStringToWidth(FontManager.InGameFont, WIDTH - 32) If displayText = "Kolben" Then - displayText = "Pokemon 3D" + displayText = "Pokémon 3D" End If For x = 0 To CInt(WIDTH / 16) For y = 0 To CInt(HEIGHT / 16) @@ -1652,7 +1652,7 @@ Public Class GameModeSelectionScreen Dim dispName As String = GameMode.Name If dispName = "Kolben" Then - dispName = "Pokemon 3D" + dispName = "Pokémon 3D" End If Dim dispDescription As String = GameMode.Description.Replace("~", Environment.NewLine).Replace("*", Environment.NewLine) Dim dispVersion As String = GameMode.Version From c50c64565404560f73736f6ff8e37ee8ffe09bef Mon Sep 17 00:00:00 2001 From: JappaWakka Date: Wed, 24 Jan 2024 15:20:57 +0100 Subject: [PATCH 27/36] Display correct GameMode name in main menu --- P3D/Screens/MainMenu/PressStartScreen.vb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/P3D/Screens/MainMenu/PressStartScreen.vb b/P3D/Screens/MainMenu/PressStartScreen.vb index fff6afced..403526e15 100644 --- a/P3D/Screens/MainMenu/PressStartScreen.vb +++ b/P3D/Screens/MainMenu/PressStartScreen.vb @@ -954,7 +954,7 @@ Public Class NewMainMenuScreen SpriteBatch.Draw(tmpProfile.PokemonTextures(i), New Rectangle(displayRect.X + 30 + i * 70, displayRect.Y + 70, 64, 64), Color.White) Next GetFontRenderer().DrawString(FontManager.InGameFont, Localization.GetString("main_menu_savefile_name", "Player Name") & ": " & tmpProfile.Name & Environment.NewLine & - Localization.GetString("main_menu_savefile_gamemode", "GameMode") & ": " & tmpProfile.GameMode, New Vector2(displayRect.X + 30, displayRect.Y + 20), Color.White, 0F, Vector2.Zero, 1.0F, SpriteEffects.None, 0F) + Localization.GetString("main_menu_savefile_gamemode", "GameMode") & ": " & GameModeManager.GetGameMode(tmpProfile.GameMode).Name, New Vector2(displayRect.X + 30, displayRect.Y + 20), Color.White, 0F, Vector2.Zero, 1.0F, SpriteEffects.None, 0F) GetFontRenderer().DrawString(FontManager.InGameFont, Localization.GetString("main_menu_savefile_badges", "Badges") & ": " & tmpProfile.Badges.ToString() & Environment.NewLine & Localization.GetString("main_menu_savefile_playtime", "Play time") & ": " & tmpProfile.TimePlayed & Environment.NewLine & Localization.GetString("main_menu_savefile_location", "Location") & ": " & tmpProfile.Location, New Vector2(displayRect.X + 30, displayRect.Y + 150), Color.White, 0F, Vector2.Zero, 1.0F, SpriteEffects.None, 0F) From 50c7125f714b1370dbbc4911de9bd87ec5d33a65 Mon Sep 17 00:00:00 2001 From: JappaWakka Date: Wed, 24 Jan 2024 17:27:59 +0100 Subject: [PATCH 28/36] Added Exp calc changing GM Item property MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ExpMultiplier|sng,[bool] optional second argument overrides the exp boost pokémon get when traded if set to true/1 --- .../BattleSystemV2/BattleCalculation.vb | 23 ++++++++++++++++--- P3D/Pokemon/Items/GameModeItem.vb | 2 ++ P3D/Pokemon/Items/GameModeItemLoader.vb | 5 ++++ 3 files changed, 27 insertions(+), 3 deletions(-) diff --git a/P3D/Battle/BattleSystemV2/BattleCalculation.vb b/P3D/Battle/BattleSystemV2/BattleCalculation.vb index 68c4434d0..493850bc0 100644 --- a/P3D/Battle/BattleSystemV2/BattleCalculation.vb +++ b/P3D/Battle/BattleSystemV2/BattleCalculation.vb @@ -1002,8 +1002,25 @@ Dim b As Double = op.BaseExperience Dim t As Double = 1D - If p.OT <> Core.Player.OT Then - t = 1.5D + If p.Item.IsGameModeItem = True Then + If CType(p.Item, GameModeItem).gmExpMultiplier <> -1D AndAlso CType(p.Item, GameModeItem).gmOverrideTradeExp = True Then + t = CType(p.Item, GameModeItem).gmExpMultiplier + Else + If p.OT <> Core.Player.OT Then + t = 1.5D + End If + End If + Else + If p.OT <> Core.Player.OT Then + t = 1.5D + End If + End If + + Dim gm As Double = 1D + If p.Item.IsGameModeItem = True Then + If CType(p.Item, GameModeItem).gmExpMultiplier <> -1D AndAlso CType(p.Item, GameModeItem).gmOverrideTradeExp = False Then + gm = CType(p.Item, GameModeItem).gmExpMultiplier + End If End If Dim e As Double = 1D @@ -1037,7 +1054,7 @@ End If End If - Dim EXP As Integer = CInt((((a * b * L) / (5 * s)) * (((2 * L + 10) ^ 2.5D) / ((L + Lp + 10) ^ 2.5D)) + 1) * t * e * 1) + Dim EXP As Integer = CInt((((a * b * L) / (5 * s)) * (((2 * L + 10) ^ 2.5D) / ((L + Lp + 10) ^ 2.5D)) + 1) * t * e * gm * 1) If EXP < 2 Then EXP = 2 diff --git a/P3D/Pokemon/Items/GameModeItem.vb b/P3D/Pokemon/Items/GameModeItem.vb index 225eeb7c5..345a90842 100644 --- a/P3D/Pokemon/Items/GameModeItem.vb +++ b/P3D/Pokemon/Items/GameModeItem.vb @@ -21,6 +21,8 @@ Public Class GameModeItem Public gmCanBeUsedInBattle As Boolean = True Public gmCanBeTossed As Boolean = True Public gmBattleSelectPokemon As Boolean = True + Public gmExpMultiplier As Double = -1D + Public gmOverrideTradeExp As Boolean = False Public gmSortValue As Integer = 0 diff --git a/P3D/Pokemon/Items/GameModeItemLoader.vb b/P3D/Pokemon/Items/GameModeItemLoader.vb index d86a402ba..66968ae64 100644 --- a/P3D/Pokemon/Items/GameModeItemLoader.vb +++ b/P3D/Pokemon/Items/GameModeItemLoader.vb @@ -114,6 +114,11 @@ Public Class GameModeItemLoader item.gmBattlePointsPrice = CInt(value) Case "catchmultiplier" item.gmCatchMultiplier = CSng(value.ReplaceDecSeparator) + Case "expmultiplier" + If value.Split(",").Count > 1 Then + item.gmOverrideTradeExp = CBool(value.GetSplit(1, ",")) + End If + item.gmExpMultiplier = CDbl(value.GetSplit(0, ",").ReplaceDecSeparator) Case "maxstack" item.gmMaxStack = CInt(value) Case "flingdamage" From 1d26954eab251e2c209f3d04aa901da12c16537e Mon Sep 17 00:00:00 2001 From: JappaWakka Date: Sat, 17 Feb 2024 18:50:08 +0100 Subject: [PATCH 29/36] Added construct... ...that returns the current language suffix --- P3D/World/ActionScript/V2/ScriptConstructs/DoSystem.vb | 2 ++ 1 file changed, 2 insertions(+) diff --git a/P3D/World/ActionScript/V2/ScriptConstructs/DoSystem.vb b/P3D/World/ActionScript/V2/ScriptConstructs/DoSystem.vb index f756189bb..36b50d61c 100644 --- a/P3D/World/ActionScript/V2/ScriptConstructs/DoSystem.vb +++ b/P3D/World/ActionScript/V2/ScriptConstructs/DoSystem.vb @@ -152,6 +152,8 @@ Return output Case "scriptlevel" Return ActionScript.ScriptLevelIndex.ToString() + case "language" + Return Localization.LanguageSuffix End Select Return DefaultNull From f56dba35ccb6bfa26f2eec3adb1e93652e5cb599 Mon Sep 17 00:00:00 2001 From: JappaWakka Date: Mon, 19 Feb 2024 18:09:48 +0100 Subject: [PATCH 30/36] Implement Visible Tag for World Map "0", "always" Name is always visible "1", "temporary" Name is visible when player is currently on one of the maps "2", "unlock" Name is always visible if the player has visited one of the maps before --- P3D/Screens/MapScreen.vb | 98 ++++++++++++++++++++++++++++++++++------ 1 file changed, 83 insertions(+), 15 deletions(-) diff --git a/P3D/Screens/MapScreen.vb b/P3D/Screens/MapScreen.vb index ee95f3021..1a704f3b3 100644 --- a/P3D/Screens/MapScreen.vb +++ b/P3D/Screens/MapScreen.vb @@ -2,6 +2,11 @@ Inherits Screen + Public Enum VisibleMode As Integer + Always + Temporary + Unlock + End Enum Public Const RasterSize As Integer = 32 Public Shared mapOffsetX As Integer = 100 Public Shared mapOffsetY As Integer = 75 @@ -148,12 +153,23 @@ If Tags.ContainsKey("playerposition") = True Then PlayerPositionList = Tags("playerposition").Split(CChar(",")).ToList() End If + Dim Visible As Integer = VisibleMode.Always + If Tags.ContainsKey("visible") = True Then + Select Case Tags("visible") + Case "0", "always" + Visible = VisibleMode.Always + Case "1", "temporary" + Visible = VisibleMode.Temporary + Case "2", "unlock" + Visible = VisibleMode.Unlock + End Select + End If If Tags.ContainsKey("flyto") = True Then Dim FlyTo As New List(Of String) FlyTo = Tags("flyto").Split(CChar(",")).ToList() - cities.Add(New City(Name, MapFiles, CInt(PositionList(0)), CInt(PositionList(1)), CitySize, FlyTo(0), New Vector3(CSng(FlyTo(1)), CSng(FlyTo(2)), CSng(FlyTo(3))), CInt(PlayerPositionList(0)), CInt(PlayerPositionList(1)))) + cities.Add(New City(Name, MapFiles, CInt(PositionList(0)), CInt(PositionList(1)), CitySize, FlyTo(0), New Vector3(CSng(FlyTo(1)), CSng(FlyTo(2)), CSng(FlyTo(3))), CInt(PlayerPositionList(0)), CInt(PlayerPositionList(1)), Visible)) Else - cities.Add(New City(Name, MapFiles, CInt(PositionList(0)), CInt(PositionList(1)), CitySize, "", Nothing, CInt(PlayerPositionList(0)), CInt(PlayerPositionList(1)))) + cities.Add(New City(Name, MapFiles, CInt(PositionList(0)), CInt(PositionList(1)), CitySize, "", Nothing, CInt(PlayerPositionList(0)), CInt(PlayerPositionList(1)), Visible)) End If Case "route" Dim Name As String = Tags("name") @@ -209,12 +225,23 @@ If Tags.ContainsKey("playerposition") = True Then PlayerPositionList = Tags("playerposition").Split(CChar(",")).ToList() End If + Dim Visible As Integer = VisibleMode.Always + If Tags.ContainsKey("visible") = True Then + Select Case Tags("visible") + Case "0", "always" + Visible = VisibleMode.Always + Case "1", "temporary" + Visible = VisibleMode.Temporary + Case "2", "unlock" + Visible = VisibleMode.Unlock + End Select + End If If Tags.ContainsKey("flyto") = True Then Dim FlyTo As New List(Of String) FlyTo = Tags("flyto").Split(CChar(",")).ToList() - routes.Add(New Route(Name, MapFiles, CInt(PositionList(0)), CInt(PositionList(1)), RouteDirection, RouteType, FlyTo(0), New Vector3(CSng(FlyTo(1)), CSng(FlyTo(2)), CSng(FlyTo(3))), CInt(PlayerPositionList(0)), CInt(PlayerPositionList(1)))) + routes.Add(New Route(Name, MapFiles, CInt(PositionList(0)), CInt(PositionList(1)), RouteDirection, RouteType, FlyTo(0), New Vector3(CSng(FlyTo(1)), CSng(FlyTo(2)), CSng(FlyTo(3))), CInt(PlayerPositionList(0)), CInt(PlayerPositionList(1)), Visible)) Else - routes.Add(New Route(Name, MapFiles, CInt(PositionList(0)), CInt(PositionList(1)), RouteDirection, RouteType, "", Nothing, CInt(PlayerPositionList(0)), CInt(PlayerPositionList(1)))) + routes.Add(New Route(Name, MapFiles, CInt(PositionList(0)), CInt(PositionList(1)), RouteDirection, RouteType, "", Nothing, CInt(PlayerPositionList(0)), CInt(PlayerPositionList(1)), Visible)) End If Case "place" Dim Name As String = Tags("name") @@ -242,12 +269,23 @@ If Tags.ContainsKey("playerposition") = True Then PlayerPositionList = Tags("playerposition").Split(CChar(",")).ToList() End If + Dim Visible As Integer = VisibleMode.Always + If Tags.ContainsKey("visible") = True Then + Select Case Tags("visible") + Case "0", "always" + Visible = VisibleMode.Always + Case "1", "temporary" + Visible = VisibleMode.Temporary + Case "2", "unlock" + Visible = VisibleMode.Unlock + End Select + End If If Tags.ContainsKey("flyto") = True Then Dim FlyTo As New List(Of String) FlyTo = Tags("flyto").Split(CChar(",")).ToList() - places.Add(New Place(Name, MapFiles, CInt(PositionList(0)), CInt(PositionList(1)), PlaceSize, FlyTo(0), New Vector3(CSng(FlyTo(1)), CSng(FlyTo(2)), CSng(FlyTo(3))), CInt(PlayerPositionList(0)), CInt(PlayerPositionList(1)))) + places.Add(New Place(Name, MapFiles, CInt(PositionList(0)), CInt(PositionList(1)), PlaceSize, FlyTo(0), New Vector3(CSng(FlyTo(1)), CSng(FlyTo(2)), CSng(FlyTo(3))), CInt(PlayerPositionList(0)), CInt(PlayerPositionList(1)), Visible)) Else - places.Add(New Place(Name, MapFiles, CInt(PositionList(0)), CInt(PositionList(1)), PlaceSize, "", Nothing, CInt(PlayerPositionList(0)), CInt(PlayerPositionList(1)))) + places.Add(New Place(Name, MapFiles, CInt(PositionList(0)), CInt(PositionList(1)), PlaceSize, "", Nothing, CInt(PlayerPositionList(0)), CInt(PlayerPositionList(1)), Visible)) End If End Select @@ -347,7 +385,15 @@ If Controls.Accept(True, True, True) = True Then Place.Click(flag) End If - hoverText = Place.Name + If Place.Visible = VisibleMode.Always OrElse Place.Visible = VisibleMode.Temporary AndAlso Place.ContainFiles.Contains(Level.LevelFile.ToLower()) = True Then + hoverText = Place.Name + ElseIf Place.Visible = VisibleMode.Unlock Then + For Each p As String In Place.ContainFiles + If Core.Player.VisitedMaps.ToLower().Split(CChar(",")).Contains(p.ToLower()) = True Then + hoverText = Place.Name + End If + Next + End If Exit For End If Next @@ -358,7 +404,15 @@ If Controls.Accept(True, True, True) = True Then City.Click(flag) End If - hoverText = City.Name + If City.Visible = VisibleMode.Always OrElse City.Visible = VisibleMode.Temporary AndAlso City.ContainFiles.Contains(Level.LevelFile.ToLower()) = True Then + hoverText = City.Name + ElseIf City.Visible = VisibleMode.Unlock Then + For Each c As String In City.ContainFiles + If Core.Player.VisitedMaps.ToLower().Split(CChar(",")).Contains(c.ToLower()) = True Then + hoverText = City.Name + End If + Next + End If Exit For End If Next @@ -369,7 +423,15 @@ If Controls.Accept(True, True, True) = True Then Route.Click(flag) End If - hoverText = Route.Name + If Route.Visible = VisibleMode.Always OrElse Route.Visible = VisibleMode.Temporary AndAlso Route.ContainFiles.Contains(Level.LevelFile.ToLower()) = True Then + hoverText = Route.Name + ElseIf Route.Visible = VisibleMode.Unlock Then + For Each r As String In Route.ContainFiles + If Core.Player.VisitedMaps.ToLower().Split(CChar(",")).Contains(r.ToLower()) = True Then + hoverText = Route.Name + End If + Next + End If End If Next End If @@ -739,10 +801,11 @@ Public FlyToFile As String = "" Public FlyToPosition As Vector3 = New Vector3(0) Public Size As CitySize = CitySize.Small + Public Visible As Integer = VisibleMode.Always Dim T As Texture2D = Nothing - Public Sub New(ByVal Name As String, ByVal ContainFiles() As String, ByVal PositionX As Integer, ByVal PositionY As Integer, ByVal Size As CitySize, Optional ByVal FlyToFile As String = "", Optional ByVal FlyToPosition As Vector3 = Nothing, Optional PlayerPositionX As Integer = -1, Optional PlayerPositionY As Integer = -1) + Public Sub New(ByVal Name As String, ByVal ContainFiles() As String, ByVal PositionX As Integer, ByVal PositionY As Integer, ByVal Size As CitySize, Optional ByVal FlyToFile As String = "", Optional ByVal FlyToPosition As Vector3 = Nothing, Optional PlayerPositionX As Integer = -1, Optional PlayerPositionY As Integer = -1, Optional Visible As Integer = VisibleMode.Always) Me.Name = Name For Each file As String In ContainFiles @@ -765,6 +828,7 @@ Me.FlyToFile = FlyToFile Me.FlyToPosition = FlyToPosition + Me.Visible = Visible End Sub Public Function getPosition() As Vector2 @@ -842,7 +906,7 @@ Public Function CanFlyTo(ByVal flag() As Object) As Boolean If flag(0).ToString().ToLower() = "fly" Then If FlyToPosition <> Nothing And FlyToFile <> "" Then - If Core.Player.VisitedMaps.Split(CChar(",")).Contains(FlyToFile) = True Or GameController.IS_DEBUG_ACTIVE = True Or Core.Player.SandBoxMode = True Then + If Core.Player.VisitedMaps.ToLower().Split(CChar(",")).Contains(FlyToFile.ToLower()) = True Or GameController.IS_DEBUG_ACTIVE = True Or Core.Player.SandBoxMode = True Then Return True End If End If @@ -894,10 +958,11 @@ Public RouteDirection As RouteDirections = RouteDirections.Horizontal Public RouteType As RouteTypes = RouteTypes.Land + Public Visible As Integer = VisibleMode.Always Dim T As Texture2D = Nothing - Public Sub New(ByVal Name As String, ByVal ContainFiles() As String, ByVal PositionX As Integer, ByVal PositionY As Integer, ByVal RouteDirection As RouteDirections, ByVal RouteType As RouteTypes, Optional ByVal FlyToFile As String = "", Optional ByVal FlyToPosition As Vector3 = Nothing, Optional PlayerPositionX As Integer = -1, Optional PlayerPositionY As Integer = -1) + Public Sub New(ByVal Name As String, ByVal ContainFiles() As String, ByVal PositionX As Integer, ByVal PositionY As Integer, ByVal RouteDirection As RouteDirections, ByVal RouteType As RouteTypes, Optional ByVal FlyToFile As String = "", Optional ByVal FlyToPosition As Vector3 = Nothing, Optional PlayerPositionX As Integer = -1, Optional PlayerPositionY As Integer = -1, Optional Visible As Integer = VisibleMode.Always) Me.Name = Name Me.PositionX = PositionX Me.PositionY = PositionY @@ -919,6 +984,7 @@ End If Me.FlyToFile = FlyToFile Me.FlyToPosition = FlyToPosition + Me.Visible = Visible End Sub Public Function getPosition() As Vector2 @@ -1030,7 +1096,7 @@ Public Function CanFlyTo(ByVal flag() As Object) As Boolean If flag(0).ToString().ToLower() = "fly" Then If FlyToPosition <> Nothing And FlyToFile <> "" Then - If Core.Player.VisitedMaps.Split(CChar(",")).Contains(FlyToFile) = True Or GameController.IS_DEBUG_ACTIVE = True Or Core.Player.SandBoxMode = True Then + If Core.Player.VisitedMaps.ToLower().Split(CChar(",")).Contains(FlyToFile.ToLower()) = True Or GameController.IS_DEBUG_ACTIVE = True Or Core.Player.SandBoxMode = True Then Return True End If End If @@ -1058,13 +1124,14 @@ Public PlayerPositionX As Integer = -1 Public PlayerPositionY As Integer = -1 Public PlaceSize As PlaceSizes + Public Visible As Integer = VisibleMode.Always Public FlyToFile As String = "" Public FlyToPosition As Vector3 = New Vector3(0) Dim T As Texture2D = Nothing - Public Sub New(ByVal Name As String, ByVal ContainFiles() As String, ByVal PositionX As Integer, ByVal PositionY As Integer, ByVal PlaceSize As PlaceSizes, Optional ByVal FlyToFile As String = "", Optional ByVal FlyToPosition As Vector3 = Nothing, Optional PlayerPositionX As Integer = -1, Optional PlayerPositionY As Integer = -1) + Public Sub New(ByVal Name As String, ByVal ContainFiles() As String, ByVal PositionX As Integer, ByVal PositionY As Integer, ByVal PlaceSize As PlaceSizes, Optional ByVal FlyToFile As String = "", Optional ByVal FlyToPosition As Vector3 = Nothing, Optional PlayerPositionX As Integer = -1, Optional PlayerPositionY As Integer = -1, Optional Visible As Integer = VisibleMode.Always) Me.Name = Name Me.PositionX = PositionX Me.PositionY = PositionY @@ -1086,6 +1153,7 @@ Me.FlyToFile = FlyToFile Me.FlyToPosition = FlyToPosition + Me.Visible = Visible End Sub Public Function getPosition() As Vector2 @@ -1175,7 +1243,7 @@ If FlyToPosition <> Nothing And FlyToFile <> "" Then Dim flytomap As Boolean = False For Each map In ContainFiles - If Core.Player.VisitedMaps.Split(CChar(",")).Contains(map) = True Then + If Core.Player.VisitedMaps.ToLower().Split(CChar(",")).Contains(map.ToLower()) = True Then flytomap = True Exit For End If From 6f62a77d0f2e5fb0647685d6698afca36611497a Mon Sep 17 00:00:00 2001 From: JappaWakka Date: Mon, 19 Feb 2024 20:11:52 +0100 Subject: [PATCH 31/36] Updated World Map Visible Tag & added Register Tag "3", "register" Name and icon are always visible as long as the string in the Register Tag has been registered with the player e.g.: {"Visible"[Register]}{"Register"[ShowThisMap]} --- P3D/Screens/MapScreen.vb | 80 ++++++++++++++++++++++++++++++++++++---- 1 file changed, 73 insertions(+), 7 deletions(-) diff --git a/P3D/Screens/MapScreen.vb b/P3D/Screens/MapScreen.vb index 1a704f3b3..966954a86 100644 --- a/P3D/Screens/MapScreen.vb +++ b/P3D/Screens/MapScreen.vb @@ -6,6 +6,7 @@ Always Temporary Unlock + Register End Enum Public Const RasterSize As Integer = 32 Public Shared mapOffsetX As Integer = 100 @@ -58,7 +59,7 @@ PlayerSkinTexture = TextureManager.GetTexture("Textures\NPC\" & Core.Player.Skin) End If End If - Me.MouseVisible = False + Me.MouseVisibVisible = False Me.objectsTexture = TextureManager.GetTexture("GUI\Map\map_objects") LoadMapTexture() @@ -162,6 +163,8 @@ Visible = VisibleMode.Temporary Case "2", "unlock" Visible = VisibleMode.Unlock + Case "3", "register" + Visible = VisibleMode.Register End Select End If If Tags.ContainsKey("flyto") = True Then @@ -234,6 +237,8 @@ Visible = VisibleMode.Temporary Case "2", "unlock" Visible = VisibleMode.Unlock + Case "3", "register" + Visible = VisibleMode.Register End Select End If If Tags.ContainsKey("flyto") = True Then @@ -278,6 +283,8 @@ Visible = VisibleMode.Temporary Case "2", "unlock" Visible = VisibleMode.Unlock + Case "3", "register" + Visible = VisibleMode.Register End Select End If If Tags.ContainsKey("flyto") = True Then @@ -393,6 +400,7 @@ hoverText = Place.Name End If Next + Exit For End If Exit For End If @@ -512,7 +520,24 @@ c = Color.Gray End If - Core.SpriteBatch.Draw(Route.getTexture(objectsTexture, isSelected), Route.getRectangle(mapOffset), c) + Dim DoDraw As Boolean = False + If Route.Visible = VisibleMode.Always OrElse Route.Visible = VisibleMode.Temporary AndAlso Route.ContainFiles.Contains(Level.LevelFile.ToLower()) = True Then + DoDraw = True + ElseIf Route.Visible = VisibleMode.Unlock Then + For Each p As String In Route.ContainFiles + If Core.Player.VisitedMaps.ToLower().Split(CChar(",")).Contains(p.ToLower()) = True Then + DoDraw = True + End If + Next + Exit For + ElseIf Route.Visible = VisibleMode.Register Then + If ActionScript.IsRegistered(Route.RegisterName) = True Then + DoDraw = True + End If + End If + If DoDraw = True Then + Core.SpriteBatch.Draw(Route.getTexture(objectsTexture, isSelected), Route.getRectangle(mapOffset), c) + End If Next End If @@ -528,7 +553,24 @@ c = Color.Gray End If - Core.SpriteBatch.Draw(City.getTexture(objectsTexture, isSelected), City.getRectangle(mapOffset), c) + Dim DoDraw As Boolean = False + If City.Visible = VisibleMode.Always OrElse City.Visible = VisibleMode.Temporary AndAlso City.ContainFiles.Contains(Level.LevelFile.ToLower()) = True Then + DoDraw = True + ElseIf City.Visible = VisibleMode.Unlock Then + For Each p As String In City.ContainFiles + If Core.Player.VisitedMaps.ToLower().Split(CChar(",")).Contains(p.ToLower()) = True Then + DoDraw = True + End If + Next + Exit For + ElseIf City.Visible = VisibleMode.Register Then + If ActionScript.IsRegistered(City.RegisterName) = True Then + DoDraw = True + End If + End If + If DoDraw = True Then + Core.SpriteBatch.Draw(City.getTexture(objectsTexture, isSelected), City.getRectangle(mapOffset), c) + End If Next End If @@ -544,7 +586,24 @@ c = Color.Gray End If - Core.SpriteBatch.Draw(Place.getTexture(objectsTexture, isSelected), Place.getRectangle(mapOffset), c) + Dim DoDraw As Boolean = False + If Place.Visible = VisibleMode.Always OrElse Place.Visible = VisibleMode.Temporary AndAlso Place.ContainFiles.Contains(Level.LevelFile.ToLower()) = True Then + DoDraw = True + ElseIf Place.Visible = VisibleMode.Unlock Then + For Each p As String In Place.ContainFiles + If Core.Player.VisitedMaps.ToLower().Split(CChar(",")).Contains(p.ToLower()) = True Then + DoDraw = True + End If + Next + Exit For + ElseIf Place.Visible = VisibleMode.Register Then + If ActionScript.IsRegistered(Place.RegisterName) = True Then + DoDraw = True + End If + End If + If DoDraw = True Then + Core.SpriteBatch.Draw(Place.getTexture(objectsTexture, isSelected), Place.getRectangle(mapOffset), c) + End If Next End If @@ -802,10 +861,11 @@ Public FlyToPosition As Vector3 = New Vector3(0) Public Size As CitySize = CitySize.Small Public Visible As Integer = VisibleMode.Always + Public RegisterName As String = "" Dim T As Texture2D = Nothing - Public Sub New(ByVal Name As String, ByVal ContainFiles() As String, ByVal PositionX As Integer, ByVal PositionY As Integer, ByVal Size As CitySize, Optional ByVal FlyToFile As String = "", Optional ByVal FlyToPosition As Vector3 = Nothing, Optional PlayerPositionX As Integer = -1, Optional PlayerPositionY As Integer = -1, Optional Visible As Integer = VisibleMode.Always) + Public Sub New(ByVal Name As String, ByVal ContainFiles() As String, ByVal PositionX As Integer, ByVal PositionY As Integer, ByVal Size As CitySize, Optional ByVal FlyToFile As String = "", Optional ByVal FlyToPosition As Vector3 = Nothing, Optional PlayerPositionX As Integer = -1, Optional PlayerPositionY As Integer = -1, Optional Visible As Integer = VisibleMode.Always, Optional RegisterName As String = "") Me.Name = Name For Each file As String In ContainFiles @@ -829,6 +889,7 @@ Me.FlyToFile = FlyToFile Me.FlyToPosition = FlyToPosition Me.Visible = Visible + Me.RegisterName = RegisterName End Sub Public Function getPosition() As Vector2 @@ -959,10 +1020,11 @@ Public RouteDirection As RouteDirections = RouteDirections.Horizontal Public RouteType As RouteTypes = RouteTypes.Land Public Visible As Integer = VisibleMode.Always + Public RegisterName As String = "" Dim T As Texture2D = Nothing - Public Sub New(ByVal Name As String, ByVal ContainFiles() As String, ByVal PositionX As Integer, ByVal PositionY As Integer, ByVal RouteDirection As RouteDirections, ByVal RouteType As RouteTypes, Optional ByVal FlyToFile As String = "", Optional ByVal FlyToPosition As Vector3 = Nothing, Optional PlayerPositionX As Integer = -1, Optional PlayerPositionY As Integer = -1, Optional Visible As Integer = VisibleMode.Always) + Public Sub New(ByVal Name As String, ByVal ContainFiles() As String, ByVal PositionX As Integer, ByVal PositionY As Integer, ByVal RouteDirection As RouteDirections, ByVal RouteType As RouteTypes, Optional ByVal FlyToFile As String = "", Optional ByVal FlyToPosition As Vector3 = Nothing, Optional PlayerPositionX As Integer = -1, Optional PlayerPositionY As Integer = -1, Optional Visible As Integer = VisibleMode.Always, Optional RegisterName As String = "") Me.Name = Name Me.PositionX = PositionX Me.PositionY = PositionY @@ -984,7 +1046,9 @@ End If Me.FlyToFile = FlyToFile Me.FlyToPosition = FlyToPosition + Me.Visible = Visible + Me.RegisterName = RegisterName End Sub Public Function getPosition() As Vector2 @@ -1125,13 +1189,14 @@ Public PlayerPositionY As Integer = -1 Public PlaceSize As PlaceSizes Public Visible As Integer = VisibleMode.Always + Public RegisterName As String = "" Public FlyToFile As String = "" Public FlyToPosition As Vector3 = New Vector3(0) Dim T As Texture2D = Nothing - Public Sub New(ByVal Name As String, ByVal ContainFiles() As String, ByVal PositionX As Integer, ByVal PositionY As Integer, ByVal PlaceSize As PlaceSizes, Optional ByVal FlyToFile As String = "", Optional ByVal FlyToPosition As Vector3 = Nothing, Optional PlayerPositionX As Integer = -1, Optional PlayerPositionY As Integer = -1, Optional Visible As Integer = VisibleMode.Always) + Public Sub New(ByVal Name As String, ByVal ContainFiles() As String, ByVal PositionX As Integer, ByVal PositionY As Integer, ByVal PlaceSize As PlaceSizes, Optional ByVal FlyToFile As String = "", Optional ByVal FlyToPosition As Vector3 = Nothing, Optional PlayerPositionX As Integer = -1, Optional PlayerPositionY As Integer = -1, Optional Visible As Integer = VisibleMode.Always, Optional RegisterName As String = "") Me.Name = Name Me.PositionX = PositionX Me.PositionY = PositionY @@ -1154,6 +1219,7 @@ Me.FlyToFile = FlyToFile Me.FlyToPosition = FlyToPosition Me.Visible = Visible + Me.RegisterName = RegisterName End Sub Public Function getPosition() As Vector2 From af0b31b56735e98d2141bf6cd3fe562416d613bc Mon Sep 17 00:00:00 2001 From: JappaWakka Date: Mon, 19 Feb 2024 20:18:31 +0100 Subject: [PATCH 32/36] Fix some errors --- P3D/Screens/MapScreen.vb | 67 ++++++++++++++++++++++++++++------------ 1 file changed, 47 insertions(+), 20 deletions(-) diff --git a/P3D/Screens/MapScreen.vb b/P3D/Screens/MapScreen.vb index 966954a86..0b7bced31 100644 --- a/P3D/Screens/MapScreen.vb +++ b/P3D/Screens/MapScreen.vb @@ -59,7 +59,7 @@ PlayerSkinTexture = TextureManager.GetTexture("Textures\NPC\" & Core.Player.Skin) End If End If - Me.MouseVisibVisible = False + Me.MouseVisible = False Me.objectsTexture = TextureManager.GetTexture("GUI\Map\map_objects") LoadMapTexture() @@ -389,18 +389,26 @@ If hoverText = "" And pokehoverText = "" And drawObjects(2) = True Then For Each Place As Place In places If Place.getRectangle(mapOffset).Contains(cursorPoint) = True Then - If Controls.Accept(True, True, True) = True Then - Place.Click(flag) - End If + Dim DoUpdate As Boolean = False If Place.Visible = VisibleMode.Always OrElse Place.Visible = VisibleMode.Temporary AndAlso Place.ContainFiles.Contains(Level.LevelFile.ToLower()) = True Then - hoverText = Place.Name + DoUpdate = True ElseIf Place.Visible = VisibleMode.Unlock Then For Each p As String In Place.ContainFiles If Core.Player.VisitedMaps.ToLower().Split(CChar(",")).Contains(p.ToLower()) = True Then - hoverText = Place.Name + DoUpdate = True End If Next Exit For + ElseIf Place.Visible = VisibleMode.Register Then + If ActionScript.IsRegistered(Place.RegisterName) = True Then + DoUpdate = True + End If + End If + If DoUpdate = True Then + If Controls.Accept(True, True, True) = True Then + Place.Click(flag) + End If + hoverText = Place.Name End If Exit For End If @@ -409,17 +417,26 @@ If hoverText = "" And pokehoverText = "" And drawObjects(0) = True Then For Each City As City In cities If City.getRectangle(mapOffset).Contains(cursorPoint) = True Then - If Controls.Accept(True, True, True) = True Then - City.Click(flag) - End If + Dim DoUpdate As Boolean = False If City.Visible = VisibleMode.Always OrElse City.Visible = VisibleMode.Temporary AndAlso City.ContainFiles.Contains(Level.LevelFile.ToLower()) = True Then - hoverText = City.Name + DoUpdate = True ElseIf City.Visible = VisibleMode.Unlock Then - For Each c As String In City.ContainFiles - If Core.Player.VisitedMaps.ToLower().Split(CChar(",")).Contains(c.ToLower()) = True Then - hoverText = City.Name + For Each p As String In City.ContainFiles + If Core.Player.VisitedMaps.ToLower().Split(CChar(",")).Contains(p.ToLower()) = True Then + DoUpdate = True End If Next + Exit For + ElseIf City.Visible = VisibleMode.Register Then + If ActionScript.IsRegistered(City.RegisterName) = True Then + DoUpdate = True + End If + End If + If DoUpdate = True Then + If Controls.Accept(True, True, True) = True Then + City.Click(flag) + End If + hoverText = City.Name End If Exit For End If @@ -428,18 +445,28 @@ If hoverText = "" And pokehoverText = "" And drawObjects(1) = True Then For Each Route As Route In routes If Route.getRectangle(mapOffset).Contains(cursorPoint) = True Then - If Controls.Accept(True, True, True) = True Then - Route.Click(flag) - End If + Dim DoUpdate As Boolean = False If Route.Visible = VisibleMode.Always OrElse Route.Visible = VisibleMode.Temporary AndAlso Route.ContainFiles.Contains(Level.LevelFile.ToLower()) = True Then - hoverText = Route.Name + DoUpdate = True ElseIf Route.Visible = VisibleMode.Unlock Then - For Each r As String In Route.ContainFiles - If Core.Player.VisitedMaps.ToLower().Split(CChar(",")).Contains(r.ToLower()) = True Then - hoverText = Route.Name + For Each p As String In Route.ContainFiles + If Core.Player.VisitedMaps.ToLower().Split(CChar(",")).Contains(p.ToLower()) = True Then + DoUpdate = True End If Next + Exit For + ElseIf Route.Visible = VisibleMode.Register Then + If ActionScript.IsRegistered(Route.RegisterName) = True Then + DoUpdate = True + End If End If + If DoUpdate = True Then + If Controls.Accept(True, True, True) = True Then + Route.Click(flag) + End If + hoverText = Route.Name + End If + Exit For End If Next End If From 67b2d55e85eba8d4c822dd7579cf2de6eef8b47c Mon Sep 17 00:00:00 2001 From: JappaWakka Date: Mon, 19 Feb 2024 20:42:39 +0100 Subject: [PATCH 33/36] Make it all actually work --- P3D/Screens/MapScreen.vb | 77 ++++++++++++++++++++++++---------------- 1 file changed, 47 insertions(+), 30 deletions(-) diff --git a/P3D/Screens/MapScreen.vb b/P3D/Screens/MapScreen.vb index 0b7bced31..31aded150 100644 --- a/P3D/Screens/MapScreen.vb +++ b/P3D/Screens/MapScreen.vb @@ -156,7 +156,7 @@ End If Dim Visible As Integer = VisibleMode.Always If Tags.ContainsKey("visible") = True Then - Select Case Tags("visible") + Select Case Tags("visible").ToLower() Case "0", "always" Visible = VisibleMode.Always Case "1", "temporary" @@ -167,12 +167,16 @@ Visible = VisibleMode.Register End Select End If + Dim Register As String = "" + If Tags.ContainsKey("register") = True Then + Register = Tags("register") + End If If Tags.ContainsKey("flyto") = True Then Dim FlyTo As New List(Of String) FlyTo = Tags("flyto").Split(CChar(",")).ToList() - cities.Add(New City(Name, MapFiles, CInt(PositionList(0)), CInt(PositionList(1)), CitySize, FlyTo(0), New Vector3(CSng(FlyTo(1)), CSng(FlyTo(2)), CSng(FlyTo(3))), CInt(PlayerPositionList(0)), CInt(PlayerPositionList(1)), Visible)) + cities.Add(New City(Name, MapFiles, CInt(PositionList(0)), CInt(PositionList(1)), CitySize, FlyTo(0), New Vector3(CSng(FlyTo(1)), CSng(FlyTo(2)), CSng(FlyTo(3))), CInt(PlayerPositionList(0)), CInt(PlayerPositionList(1)), Visible, Register)) Else - cities.Add(New City(Name, MapFiles, CInt(PositionList(0)), CInt(PositionList(1)), CitySize, "", Nothing, CInt(PlayerPositionList(0)), CInt(PlayerPositionList(1)), Visible)) + cities.Add(New City(Name, MapFiles, CInt(PositionList(0)), CInt(PositionList(1)), CitySize, "", Nothing, CInt(PlayerPositionList(0)), CInt(PlayerPositionList(1)), Visible, Register)) End If Case "route" Dim Name As String = Tags("name") @@ -228,9 +232,10 @@ If Tags.ContainsKey("playerposition") = True Then PlayerPositionList = Tags("playerposition").Split(CChar(",")).ToList() End If + Dim Visible As Integer = VisibleMode.Always If Tags.ContainsKey("visible") = True Then - Select Case Tags("visible") + Select Case Tags("visible").ToLower() Case "0", "always" Visible = VisibleMode.Always Case "1", "temporary" @@ -241,12 +246,17 @@ Visible = VisibleMode.Register End Select End If + + Dim Register As String = "" + If Tags.ContainsKey("register") = True Then + Register = Tags("register") + End If If Tags.ContainsKey("flyto") = True Then Dim FlyTo As New List(Of String) FlyTo = Tags("flyto").Split(CChar(",")).ToList() - routes.Add(New Route(Name, MapFiles, CInt(PositionList(0)), CInt(PositionList(1)), RouteDirection, RouteType, FlyTo(0), New Vector3(CSng(FlyTo(1)), CSng(FlyTo(2)), CSng(FlyTo(3))), CInt(PlayerPositionList(0)), CInt(PlayerPositionList(1)), Visible)) + routes.Add(New Route(Name, MapFiles, CInt(PositionList(0)), CInt(PositionList(1)), RouteDirection, RouteType, FlyTo(0), New Vector3(CSng(FlyTo(1)), CSng(FlyTo(2)), CSng(FlyTo(3))), CInt(PlayerPositionList(0)), CInt(PlayerPositionList(1)), Visible, Register)) Else - routes.Add(New Route(Name, MapFiles, CInt(PositionList(0)), CInt(PositionList(1)), RouteDirection, RouteType, "", Nothing, CInt(PlayerPositionList(0)), CInt(PlayerPositionList(1)), Visible)) + routes.Add(New Route(Name, MapFiles, CInt(PositionList(0)), CInt(PositionList(1)), RouteDirection, RouteType, "", Nothing, CInt(PlayerPositionList(0)), CInt(PlayerPositionList(1)), Visible, Register)) End If Case "place" Dim Name As String = Tags("name") @@ -274,9 +284,10 @@ If Tags.ContainsKey("playerposition") = True Then PlayerPositionList = Tags("playerposition").Split(CChar(",")).ToList() End If + Dim Visible As Integer = VisibleMode.Always If Tags.ContainsKey("visible") = True Then - Select Case Tags("visible") + Select Case Tags("visible").ToLower() Case "0", "always" Visible = VisibleMode.Always Case "1", "temporary" @@ -287,12 +298,18 @@ Visible = VisibleMode.Register End Select End If + + Dim Register As String = "" + If Tags.ContainsKey("register") = True Then + Register = Tags("register") + End If + If Tags.ContainsKey("flyto") = True Then Dim FlyTo As New List(Of String) FlyTo = Tags("flyto").Split(CChar(",")).ToList() - places.Add(New Place(Name, MapFiles, CInt(PositionList(0)), CInt(PositionList(1)), PlaceSize, FlyTo(0), New Vector3(CSng(FlyTo(1)), CSng(FlyTo(2)), CSng(FlyTo(3))), CInt(PlayerPositionList(0)), CInt(PlayerPositionList(1)), Visible)) + places.Add(New Place(Name, MapFiles, CInt(PositionList(0)), CInt(PositionList(1)), PlaceSize, FlyTo(0), New Vector3(CSng(FlyTo(1)), CSng(FlyTo(2)), CSng(FlyTo(3))), CInt(PlayerPositionList(0)), CInt(PlayerPositionList(1)), Visible, Register)) Else - places.Add(New Place(Name, MapFiles, CInt(PositionList(0)), CInt(PositionList(1)), PlaceSize, "", Nothing, CInt(PlayerPositionList(0)), CInt(PlayerPositionList(1)), Visible)) + places.Add(New Place(Name, MapFiles, CInt(PositionList(0)), CInt(PositionList(1)), PlaceSize, "", Nothing, CInt(PlayerPositionList(0)), CInt(PlayerPositionList(1)), Visible, Register)) End If End Select @@ -397,10 +414,10 @@ If Core.Player.VisitedMaps.ToLower().Split(CChar(",")).Contains(p.ToLower()) = True Then DoUpdate = True End If + Exit For Next - Exit For ElseIf Place.Visible = VisibleMode.Register Then - If ActionScript.IsRegistered(Place.RegisterName) = True Then + If ActionScript.IsRegistered(Place.Register) = True Then DoUpdate = True End If End If @@ -425,10 +442,10 @@ If Core.Player.VisitedMaps.ToLower().Split(CChar(",")).Contains(p.ToLower()) = True Then DoUpdate = True End If + Exit For Next - Exit For ElseIf City.Visible = VisibleMode.Register Then - If ActionScript.IsRegistered(City.RegisterName) = True Then + If ActionScript.IsRegistered(City.Register) = True Then DoUpdate = True End If End If @@ -453,10 +470,10 @@ If Core.Player.VisitedMaps.ToLower().Split(CChar(",")).Contains(p.ToLower()) = True Then DoUpdate = True End If + Exit For Next - Exit For ElseIf Route.Visible = VisibleMode.Register Then - If ActionScript.IsRegistered(Route.RegisterName) = True Then + If ActionScript.IsRegistered(Route.Register) = True Then DoUpdate = True End If End If @@ -555,10 +572,10 @@ If Core.Player.VisitedMaps.ToLower().Split(CChar(",")).Contains(p.ToLower()) = True Then DoDraw = True End If + Exit For Next - Exit For ElseIf Route.Visible = VisibleMode.Register Then - If ActionScript.IsRegistered(Route.RegisterName) = True Then + If ActionScript.IsRegistered(Route.Register) = True Then DoDraw = True End If End If @@ -588,10 +605,10 @@ If Core.Player.VisitedMaps.ToLower().Split(CChar(",")).Contains(p.ToLower()) = True Then DoDraw = True End If + Exit For Next - Exit For ElseIf City.Visible = VisibleMode.Register Then - If ActionScript.IsRegistered(City.RegisterName) = True Then + If ActionScript.IsRegistered(City.Register) = True Then DoDraw = True End If End If @@ -621,10 +638,10 @@ If Core.Player.VisitedMaps.ToLower().Split(CChar(",")).Contains(p.ToLower()) = True Then DoDraw = True End If + Exit For Next - Exit For ElseIf Place.Visible = VisibleMode.Register Then - If ActionScript.IsRegistered(Place.RegisterName) = True Then + If ActionScript.IsRegistered(Place.Register) = True Then DoDraw = True End If End If @@ -888,11 +905,11 @@ Public FlyToPosition As Vector3 = New Vector3(0) Public Size As CitySize = CitySize.Small Public Visible As Integer = VisibleMode.Always - Public RegisterName As String = "" + Public Register As String = "" Dim T As Texture2D = Nothing - Public Sub New(ByVal Name As String, ByVal ContainFiles() As String, ByVal PositionX As Integer, ByVal PositionY As Integer, ByVal Size As CitySize, Optional ByVal FlyToFile As String = "", Optional ByVal FlyToPosition As Vector3 = Nothing, Optional PlayerPositionX As Integer = -1, Optional PlayerPositionY As Integer = -1, Optional Visible As Integer = VisibleMode.Always, Optional RegisterName As String = "") + Public Sub New(ByVal Name As String, ByVal ContainFiles() As String, ByVal PositionX As Integer, ByVal PositionY As Integer, ByVal Size As CitySize, Optional ByVal FlyToFile As String = "", Optional ByVal FlyToPosition As Vector3 = Nothing, Optional PlayerPositionX As Integer = -1, Optional PlayerPositionY As Integer = -1, Optional Visible As Integer = VisibleMode.Always, Optional Register As String = "") Me.Name = Name For Each file As String In ContainFiles @@ -916,7 +933,7 @@ Me.FlyToFile = FlyToFile Me.FlyToPosition = FlyToPosition Me.Visible = Visible - Me.RegisterName = RegisterName + Me.Register = Register End Sub Public Function getPosition() As Vector2 @@ -1047,11 +1064,11 @@ Public RouteDirection As RouteDirections = RouteDirections.Horizontal Public RouteType As RouteTypes = RouteTypes.Land Public Visible As Integer = VisibleMode.Always - Public RegisterName As String = "" + Public Register As String = "" Dim T As Texture2D = Nothing - Public Sub New(ByVal Name As String, ByVal ContainFiles() As String, ByVal PositionX As Integer, ByVal PositionY As Integer, ByVal RouteDirection As RouteDirections, ByVal RouteType As RouteTypes, Optional ByVal FlyToFile As String = "", Optional ByVal FlyToPosition As Vector3 = Nothing, Optional PlayerPositionX As Integer = -1, Optional PlayerPositionY As Integer = -1, Optional Visible As Integer = VisibleMode.Always, Optional RegisterName As String = "") + Public Sub New(ByVal Name As String, ByVal ContainFiles() As String, ByVal PositionX As Integer, ByVal PositionY As Integer, ByVal RouteDirection As RouteDirections, ByVal RouteType As RouteTypes, Optional ByVal FlyToFile As String = "", Optional ByVal FlyToPosition As Vector3 = Nothing, Optional PlayerPositionX As Integer = -1, Optional PlayerPositionY As Integer = -1, Optional Visible As Integer = VisibleMode.Always, Optional Register As String = "") Me.Name = Name Me.PositionX = PositionX Me.PositionY = PositionY @@ -1075,7 +1092,7 @@ Me.FlyToPosition = FlyToPosition Me.Visible = Visible - Me.RegisterName = RegisterName + Me.Register = Register End Sub Public Function getPosition() As Vector2 @@ -1216,14 +1233,14 @@ Public PlayerPositionY As Integer = -1 Public PlaceSize As PlaceSizes Public Visible As Integer = VisibleMode.Always - Public RegisterName As String = "" + Public Register As String = "" Public FlyToFile As String = "" Public FlyToPosition As Vector3 = New Vector3(0) Dim T As Texture2D = Nothing - Public Sub New(ByVal Name As String, ByVal ContainFiles() As String, ByVal PositionX As Integer, ByVal PositionY As Integer, ByVal PlaceSize As PlaceSizes, Optional ByVal FlyToFile As String = "", Optional ByVal FlyToPosition As Vector3 = Nothing, Optional PlayerPositionX As Integer = -1, Optional PlayerPositionY As Integer = -1, Optional Visible As Integer = VisibleMode.Always, Optional RegisterName As String = "") + Public Sub New(ByVal Name As String, ByVal ContainFiles() As String, ByVal PositionX As Integer, ByVal PositionY As Integer, ByVal PlaceSize As PlaceSizes, Optional ByVal FlyToFile As String = "", Optional ByVal FlyToPosition As Vector3 = Nothing, Optional PlayerPositionX As Integer = -1, Optional PlayerPositionY As Integer = -1, Optional Visible As Integer = VisibleMode.Always, Optional Register As String = "") Me.Name = Name Me.PositionX = PositionX Me.PositionY = PositionY @@ -1246,7 +1263,7 @@ Me.FlyToFile = FlyToFile Me.FlyToPosition = FlyToPosition Me.Visible = Visible - Me.RegisterName = RegisterName + Me.Register = Register End Sub Public Function getPosition() As Vector2 From de102f4aa704963466a75be438a408925f119eea Mon Sep 17 00:00:00 2001 From: JappaWakka Date: Tue, 5 Mar 2024 11:31:33 +0100 Subject: [PATCH 34/36] Fixed Encore & make disabled moves gray in menu --- P3D/Battle/BattleSystemV2/Battle.vb | 22 ++++++++++++++++++---- P3D/Battle/BattleSystemV2/BattleMenu.vb | 14 +++++++++----- P3D/Pokemon/Attacks/Normal/Encore.vb | 17 ++++++++++++++--- 3 files changed, 41 insertions(+), 12 deletions(-) diff --git a/P3D/Battle/BattleSystemV2/Battle.vb b/P3D/Battle/BattleSystemV2/Battle.vb index ff8ffa798..2c2a4249f 100644 --- a/P3D/Battle/BattleSystemV2/Battle.vb +++ b/P3D/Battle/BattleSystemV2/Battle.vb @@ -24,8 +24,8 @@ Dim Argument As Object End Structure - Public OwnStep As RoundConst - Public OppStep As RoundConst + Public Shared OwnStep As RoundConst + Public Shared OppStep As RoundConst ''' ''' Returns the move of a Pokémon with a specified ID. @@ -631,8 +631,8 @@ Exit Sub End If Dim OppStep = GetOppStep(BattleScreen, OwnStep) - Me.OwnStep = OwnStep - Me.OppStep = OppStep + Battle.OwnStep = OwnStep + Battle.OppStep = OppStep BattleScreen.OwnFaint = False ''' BattleScreen.OppFaint = False ''' If OwnStep.StepType = RoundConst.StepTypes.Move Then @@ -2815,6 +2815,20 @@ End If moveUsed.MoveMisses(own, BattleScreen) End If + ''Own Pokémon Encore + Dim attackIndex As Integer = -1 + If own = True AndAlso BattleScreen.FieldEffects.OwnEncore > 0 Then + For a = 0 To BattleScreen.OwnPokemon.Attacks.Count - 1 + If BattleScreen.OwnPokemon.Attacks(a).ID = BattleScreen.FieldEffects.OwnEncoreMove.ID Then + attackIndex = a + End If + Next + If attackIndex <> -1 AndAlso BattleScreen.OwnPokemon.Attacks(attackIndex).CurrentPP = 0 Then + BattleScreen.FieldEffects.OwnEncoreMove = Nothing + BattleScreen.FieldEffects.OwnEncore = 0 + BattleScreen.BattleQuery.Add(New TextQueryObject(BattleScreen.OwnPokemon.GetDisplayName() & "'s encore stopped.")) + End If + End If End Sub ''' diff --git a/P3D/Battle/BattleSystemV2/BattleMenu.vb b/P3D/Battle/BattleSystemV2/BattleMenu.vb index 9dc530988..aeb90aad7 100644 --- a/P3D/Battle/BattleSystemV2/BattleMenu.vb +++ b/P3D/Battle/BattleSystemV2/BattleMenu.vb @@ -479,13 +479,17 @@ extraExtended = SelExtended End If - Core.SpriteBatch.Draw(Me.Texture, New Rectangle(Core.ScreenSize.Width - (AllExtended + extraExtended), 116 + Index * 96, 80, 80), New Rectangle(16, 16, 16, 16), New Color(255, 255, 255, 255 - deductAlpha)) - Core.SpriteBatch.Draw(Me.Texture, New Rectangle(Core.ScreenSize.Width - (AllExtended + extraExtended) + 80, 116 + Index * 96, AllExtended + extraExtended - 80, 80), New Rectangle(32, 16, 16, 16), New Color(255, 255, 255, 255 - deductAlpha)) + Dim BackgroundDrawColor As Color = Color.White + If Move.Disabled > 0 OrElse BattleScreen.FieldEffects.OwnEncore > 0 AndAlso BattleScreen.FieldEffects.OwnEncoreMove.ID <> Move.ID Then + BackgroundDrawColor = New Color(210, 210, 210) + End If + Core.SpriteBatch.Draw(Me.Texture, New Rectangle(Core.ScreenSize.Width - (AllExtended + extraExtended), 116 + Index * 96, 80, 80), New Rectangle(16, 16, 16, 16), New Color(BackgroundDrawColor.R, BackgroundDrawColor.G, BackgroundDrawColor.B, 255 - deductAlpha)) + Core.SpriteBatch.Draw(Me.Texture, New Rectangle(Core.ScreenSize.Width - (AllExtended + extraExtended) + 80, 116 + Index * 96, AllExtended + extraExtended - 80, 80), New Rectangle(32, 16, 16, 16), New Color(BackgroundDrawColor.R, BackgroundDrawColor.G, BackgroundDrawColor.B, 255 - deductAlpha)) Core.SpriteBatch.Draw(TextureManager.GetTexture("GUI\Menus\Types", Me.Move.Type.GetElementImage(), ""), New Rectangle(Core.ScreenSize.Width - (AllExtended + extraExtended) + 28, 132 + Index * 96, 48, 16), New Color(255, 255, 255, 255 - deductAlpha)) If isSelected = True Then - If Move.Disabled > 0 Then + If Move.Disabled > 0 OrElse BattleScreen.FieldEffects.OwnEncore > 0 AndAlso BattleScreen.FieldEffects.OwnEncoreMove.ID <> Move.ID Then Core.SpriteBatch.DrawString(FontManager.MainFont, "Disabled!", New Vector2(CInt(Core.ScreenSize.Width - (AllExtended + extraExtended) + 28), CInt(152 + Index * 96)), Color.Black) Else Dim ppColor As Color = GetPPColor() @@ -522,7 +526,7 @@ If Controls.Accept(False, True, True) = True And isSelected = True Then SoundManager.PlaySound("select") - If Me.Move.Disabled = 0 Then + If Me.Move.Disabled = 0 AndAlso BattleScreen.FieldEffects.OwnEncore = 0 OrElse BattleScreen.FieldEffects.OwnEncoreMove.ID = Move.ID Then Me.ClickAction(BattleScreen) End If End If @@ -530,7 +534,7 @@ If MouseHandler.IsInRectangle(New Rectangle(Core.ScreenSize.Width - 255, 116 + Index * 96, 255, 80)) = True Then If isSelected = True Then SoundManager.PlaySound("select") - If Me.Move.Disabled = 0 Then + If Me.Move.Disabled = 0 AndAlso BattleScreen.FieldEffects.OwnEncore = 0 OrElse BattleScreen.FieldEffects.OwnEncoreMove.ID = Move.ID Then Me.ClickAction(BattleScreen) End If Else diff --git a/P3D/Pokemon/Attacks/Normal/Encore.vb b/P3D/Pokemon/Attacks/Normal/Encore.vb index 40ca1a67a..337b5c906 100644 --- a/P3D/Pokemon/Attacks/Normal/Encore.vb +++ b/P3D/Pokemon/Attacks/Normal/Encore.vb @@ -61,9 +61,20 @@ op = BattleScreen.OwnPokemon End If - Dim lastMove As Attack = BattleScreen.FieldEffects.OppLastMove - If own = False Then - lastMove = BattleScreen.FieldEffects.OwnLastMove + Dim lastMove As Attack + + If own = True Then + If (BattleScreen.FieldEffects.OppLastMove Is Nothing AndAlso Battle.OppStep.StepType = Battle.RoundConst.StepTypes.Move) OrElse Battle.OppStep.StepType = Battle.RoundConst.StepTypes.Move AndAlso CType(Battle.OppStep.Argument, Attack).ID <> BattleScreen.FieldEffects.OppLastMove.ID Then + lastMove = CType(Battle.OppStep.Argument, Attack) + Else + lastMove = BattleScreen.FieldEffects.OppLastMove + End If + Else + If (BattleScreen.FieldEffects.OwnLastMove Is Nothing AndAlso Battle.OwnStep.StepType = Battle.RoundConst.StepTypes.Move) OrElse Battle.OwnStep.StepType = Battle.RoundConst.StepTypes.Move AndAlso CType(Battle.OwnStep.Argument, Attack).ID <> BattleScreen.FieldEffects.OwnLastMove.ID Then + lastMove = CType(Battle.OwnStep.Argument, Attack) + Else + lastMove = BattleScreen.FieldEffects.OwnLastMove + End If End If If Not lastMove Is Nothing Then From 61de91a1413e6c669739761c0c5eb5159b2996eb Mon Sep 17 00:00:00 2001 From: JappaWakka Date: Thu, 7 Mar 2024 19:51:32 +0100 Subject: [PATCH 35/36] Added extra argument to @text.notification... That clears the current list of notifications, dismisses the current one if it's visible and then shows the new one --- .../ActionScript/V2/ScriptCommands/DoText.vb | 20 ++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/P3D/World/ActionScript/V2/ScriptCommands/DoText.vb b/P3D/World/ActionScript/V2/ScriptCommands/DoText.vb index 1dd8d3a66..ef3b7e733 100644 --- a/P3D/World/ActionScript/V2/ScriptCommands/DoText.vb +++ b/P3D/World/ActionScript/V2/ScriptCommands/DoText.vb @@ -12,7 +12,7 @@ Select Case command.ToLower() Case "notification" - '@text.notification(message,[int_delay=500],[int_backgroundID=0],[int_IconID=0],[str_sfx],[str_script],[bool_force=0]) + '@text.notification(message,[int_delay=500],[int_backgroundID=0],[int_IconID=0],[str_sfx],[str_script],[bool_force=0],[clear_list=0]) Dim _NotificationPopup As New NotificationPopup Dim args As String() = argument.Split(CChar(",")) Select Case args.Length @@ -30,11 +30,21 @@ _NotificationPopup.Setup(args(0), int(args(1)), int(args(2)), int(args(3)), args(4), args(5)) Case 7 _NotificationPopup.Setup(args(0), int(args(1)), int(args(2)), int(args(3)), args(4), args(5), CBool(args(6))) + Case 8 + _NotificationPopup.Setup(args(0), int(args(1)), int(args(2)), int(args(3)), args(4), args(5), CBool(args(6))) End Select - If args.Length = 7 AndAlso CBool(args(6)) = True Then - CType(CurrentScreen, OverworldScreen).NotificationPopupList.Insert(0, _NotificationPopup) - Else - CType(CurrentScreen, OverworldScreen).NotificationPopupList.Add(_NotificationPopup) + If args.Length = 8 Then + If CType(CurrentScreen, OverworldScreen).NotificationPopupList.Count > 0 AndAlso CBool(args(7)) = True Then + CType(CurrentScreen, OverworldScreen).NotificationPopupList(0)._delayDate = Date.Now + If CType(CurrentScreen, OverworldScreen).NotificationPopupList.Count > 1 Then + CType(CurrentScreen, OverworldScreen).NotificationPopupList.RemoveRange(1, CType(CurrentScreen, OverworldScreen).NotificationPopupList.Count - 2) + End If + End If + End If + If args.Length >= 7 AndAlso CBool(args(6)) = True Then + CType(CurrentScreen, OverworldScreen).NotificationPopupList.Insert(0, _NotificationPopup) + Else + CType(CurrentScreen, OverworldScreen).NotificationPopupList.Add(_NotificationPopup) End If Case "show" Screen.TextBox.reDelay = 0.0F From 2398cccd202ecb16ed3728aa7fa0a728cd4bd277 Mon Sep 17 00:00:00 2001 From: JappaWakka Date: Thu, 7 Mar 2024 19:56:14 +0100 Subject: [PATCH 36/36] Tweak the speed of the NotificationPopup --- P3D/Overworld/NotificationPopup.vb | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/P3D/Overworld/NotificationPopup.vb b/P3D/Overworld/NotificationPopup.vb index 00e3631dd..f4dca1eb1 100644 --- a/P3D/Overworld/NotificationPopup.vb +++ b/P3D/Overworld/NotificationPopup.vb @@ -59,7 +59,7 @@ Public Class NotificationPopup FrameSizeBack = CInt(BackTexture.Width / 3) _background = TextureManager.GetTexture(BackTexture, New Rectangle(CInt(_backgroundIndex.X * FrameSizeBack), CInt(_backgroundIndex.Y * FrameSizeBack), FrameSizeBack, FrameSizeBack)) - _positionY = CInt(0 - _size.Height * (FrameSizeBack / 3) * _scale - 12) + _positionY = CInt(0 - _size.Height * (FrameSizeBack / 3) * _scale - (FrameSizeBack / 3 * _scale) - 5) If IconIndex <> -1 Then _iconIndex = New Vector2(IconIndex, 0) @@ -127,7 +127,7 @@ Public Class NotificationPopup Dim BackY As Integer = CInt(0 - _size.Height * (FrameSizeBack / 3) * _scale - (FrameSizeBack / 3 * _scale) - 5) If Me._interacted = True OrElse _forceAccept = True Then If Me._positionY > BackY Then - Me._positionY -= CInt(1.5 * (FrameSizeBack / 3 * _scale) / _size.Height) + Me._positionY -= CInt(1.6 * (FrameSizeBack / 3 * _scale) / _size.Height) If Me._positionY <= BackY Then Me._positionY = BackY If Me._scriptFile <> "" Then @@ -138,7 +138,7 @@ Public Class NotificationPopup End If Else If Me._positionY > BackY Then - Me._positionY -= CInt(0.7 * (FrameSizeBack / 3 * _scale) / _size.Height) + Me._positionY -= CInt(1.0 * (FrameSizeBack / 3 * _scale) / _size.Height) If Me._positionY <= BackY Then Me._positionY = BackY Me.IsReady = True