diff --git a/P3D/Content/Data/Items/example.dat b/P3D/Content/Data/Items/example.dat
index e6ea99e8e..268c6788e 100644
Binary files a/P3D/Content/Data/Items/example.dat and b/P3D/Content/Data/Items/example.dat differ
diff --git a/P3D/Pokemon/Items/GameModeItem.vb b/P3D/Pokemon/Items/GameModeItem.vb
index afd2e3f0d..08f4744cf 100644
--- a/P3D/Pokemon/Items/GameModeItem.vb
+++ b/P3D/Pokemon/Items/GameModeItem.vb
@@ -22,14 +22,25 @@ Public Class GameModeItem
Public gmCanBeUsedInBattle As Boolean = True
Public gmCanBeTossed As Boolean = True
Public gmBattleSelectPokemon As Boolean = True
+
+ Public gmSortValue As Integer = 0
+
'Medicine Item
Public gmIsHealingItem As Boolean = False
Public gmHealHPAmount As Integer = 0
Public gmCureStatusEffects As List(Of String)
+
'Evolution Item
Public gmIsEvolutionItem As Boolean = False
Public gmEvolutionPokemon As List(Of Integer)
+ 'TechMachine Item
+ Public gmIsTM As Boolean = False
+ Public gmTeachMove As BattleSystem.Attack
+ Public gmCanTeachAlways As Boolean = False
+ Public gmCanTeachWhenFullyEvolved As Boolean = False
+ Public gmCanTeachWhenGender As Boolean = False
+
'Mega Stone Item
Public gmMegaPokemonNumber As Integer
@@ -97,7 +108,11 @@ Public Class GameModeItem
'''
''' A value that can be used to sort items in the bag after. Lower values make items appear closer to the top.
'''
- Public Overrides ReadOnly Property SortValue As Integer = 0
+ Public Overrides ReadOnly Property SortValue As Integer
+ Get
+ Return gmSortValue
+ End Get
+ End Property
'''
@@ -182,12 +197,64 @@ Public Class GameModeItem
End Get
End Property
+ Public Sub SetTeachMoveTextureRectangle()
+ Dim r As New Rectangle(144, 168, 24, 24)
+
+ 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
+
+ gmTextureRectangle = r
+ End Sub
'''
''' The item gets used from the bag.
'''
Public Overrides Sub Use()
If gmScriptPath = "" Then
+ If gmIsTM = True And gmTeachMove IsNot Nothing Then
+ SoundManager.PlaySound("PC\LogOn", False)
+ Dim selScreen = New PartyScreen(Core.CurrentScreen, Me, AddressOf Me.UseOnPokemon, "Use " & Me.Name, True) With {.Mode = Screens.UI.ISelectionScreen.ScreenMode.Selection, .CanExit = True}
+ AddHandler selScreen.SelectedObject, AddressOf UseItemhandler
+
+ Core.SetScreen(selScreen)
+ CType(CurrentScreen, PartyScreen).SetupLearnAttack(gmTeachMove, 1, Me)
+ End If
If gmIsHealingItem = True Then
If CBool(GameModeManager.GetGameRuleValue("CanUseHealItems", "1")) = False Then
Screen.TextBox.Show("Cannot use heal items.", {}, False, False)
@@ -233,11 +300,40 @@ Public Class GameModeItem
Throw New ArgumentOutOfRangeException("PokeIndex", PokeIndex, "The index for a Pokémon in a player's party can only be between 0 and 5.")
End If
- Dim Pokemon As Pokemon = Core.Player.Pokemons(PokeIndex)
+ Dim p As Pokemon = Core.Player.Pokemons(PokeIndex)
- If Pokemon.Status = P3D.Pokemon.StatusProblems.Fainted AndAlso (gmCureStatusEffects Is Nothing OrElse gmCureStatusEffects.Count = 0 OrElse gmCureStatusEffects.Contains("fnt") = False) Then
+ If gmIsTM = True AndAlso gmTeachMove IsNot Nothing Then
+
+ Dim a As BattleSystem.Attack = gmTeachMove
+ Dim t As String = CanTeach(p)
+
+ If t = "" Then
+ If p.Attacks.Count = 4 Then
+ SetScreen(New LearnAttackScreen(CurrentScreen, p, a, gmID))
+
+ Return True
+ Else
+ If CBool(GameModeManager.GetGameRuleValue("SingleUseTM", "0")) = True Then
+ Core.Player.Inventory.RemoveItem(gmID.ToString, 1)
+ End If
+ p.Attacks.Add(BattleSystem.Attack.GetAttackByID(a.ID))
+
+ SoundManager.PlaySound("success_small", False)
+ Screen.TextBox.Show(p.GetDisplayName() & " learned~" & a.Name & "!", {}, False, False)
+ PlayerStatistics.Track("TMs/HMs used", 1)
+
+ Return True
+ End If
+ Else
+ Screen.TextBox.Show(t, {}, False, False)
+
+ Return False
+ End If
+ End If
+
+ If p.Status = P3D.Pokemon.StatusProblems.Fainted AndAlso (gmCureStatusEffects Is Nothing OrElse gmCureStatusEffects.Count = 0 OrElse gmCureStatusEffects.Contains("fnt") = False) Then
Screen.TextBox.reDelay = 0.0F
- Screen.TextBox.Show(Pokemon.GetDisplayName() & "~is fainted!", {})
+ Screen.TextBox.Show(p.GetDisplayName() & "~is fainted!", {})
Return False
Else
Dim healsuccess As Boolean = False
@@ -262,23 +358,23 @@ Public Class GameModeItem
success1 = True
End If
End If
- If Pokemon.Status <> Pokemon.StatusProblems.Fainted AndAlso Pokemon.Status <> Pokemon.StatusProblems.None Or Pokemon.HasVolatileStatus(Pokemon.VolatileStatus.Confusion) = True Then
- If Pokemon.HasVolatileStatus(Pokemon.VolatileStatus.Confusion) = True Then
- Pokemon.RemoveVolatileStatus(Pokemon.VolatileStatus.Confusion)
+ If p.Status <> Pokemon.StatusProblems.Fainted AndAlso p.Status <> Pokemon.StatusProblems.None Or p.HasVolatileStatus(Pokemon.VolatileStatus.Confusion) = True Then
+ If p.HasVolatileStatus(Pokemon.VolatileStatus.Confusion) = True Then
+ p.RemoveVolatileStatus(Pokemon.VolatileStatus.Confusion)
End If
- Pokemon.Status = Pokemon.StatusProblems.None
+ p.Status = Pokemon.StatusProblems.None
success2 = True
End If
Dim t As String = ""
If success1 = True AndAlso success2 = False Then
- t &= "Healed " & Pokemon.GetDisplayName() & "!"
+ t &= "Healed " & p.GetDisplayName() & "!"
End If
If success1 = False AndAlso success2 = True Then
- t &= "Cured " & Pokemon.GetDisplayName() & "!"
+ t &= "Cured " & p.GetDisplayName() & "!"
End If
If success1 = True AndAlso success2 = True Then
- t &= "Healed and cured~" & Pokemon.GetDisplayName() & "!"
+ t &= "Healed and cured~" & p.GetDisplayName() & "!"
End If
If success1 = True Or success2 = True Then
@@ -292,7 +388,7 @@ Public Class GameModeItem
Return True
Else
- Screen.TextBox.Show("Cannot use" & Me.gmName & "~on " & Pokemon.GetDisplayName() & ".", {}, False, False)
+ Screen.TextBox.Show("Cannot use" & Me.gmName & "~on " & p.GetDisplayName() & ".", {}, False, False)
Return False
End If
ElseIf gmCureStatusEffects.Contains("all") Then
@@ -303,23 +399,23 @@ Public Class GameModeItem
success1 = True
End If
End If
- If Pokemon.Status <> Pokemon.StatusProblems.None Or Pokemon.HasVolatileStatus(Pokemon.VolatileStatus.Confusion) = True Then
- If Pokemon.HasVolatileStatus(Pokemon.VolatileStatus.Confusion) = True Then
- Pokemon.RemoveVolatileStatus(Pokemon.VolatileStatus.Confusion)
+ If p.Status <> Pokemon.StatusProblems.None Or p.HasVolatileStatus(Pokemon.VolatileStatus.Confusion) = True Then
+ If p.HasVolatileStatus(Pokemon.VolatileStatus.Confusion) = True Then
+ p.RemoveVolatileStatus(Pokemon.VolatileStatus.Confusion)
End If
- Pokemon.Status = Pokemon.StatusProblems.None
+ p.Status = Pokemon.StatusProblems.None
success2 = True
End If
Dim t As String = ""
If success1 = True AndAlso success2 = False Then
- t &= "Healed " & Pokemon.GetDisplayName() & "!"
+ t &= "Healed " & p.GetDisplayName() & "!"
End If
If success1 = False AndAlso success2 = True Then
- t &= "Cured " & Pokemon.GetDisplayName() & "!"
+ t &= "Cured " & p.GetDisplayName() & "!"
End If
If success1 = True AndAlso success2 = True Then
- t &= "Healed and cured~" & Pokemon.GetDisplayName() & "!"
+ t &= "Healed and cured~" & p.GetDisplayName() & "!"
End If
If success1 = True Or success2 = True Then
@@ -333,7 +429,7 @@ Public Class GameModeItem
Return True
Else
- Screen.TextBox.Show("Cannot use" & Me.gmName & "~on " & Pokemon.GetDisplayName() & ".", {}, False, False)
+ Screen.TextBox.Show("Cannot use" & Me.gmName & "~on " & p.GetDisplayName() & ".", {}, False, False)
Return False
End If
Else
@@ -398,13 +494,13 @@ Public Class GameModeItem
End If
Dim t As String = ""
If healsuccess = True AndAlso success = False Then
- t &= "Healed " & Pokemon.GetDisplayName() & "!"
+ t &= "Healed " & p.GetDisplayName() & "!"
End If
If healsuccess = False AndAlso success = True Then
- t &= "Cured " & Pokemon.GetDisplayName() & "!"
+ t &= "Cured " & p.GetDisplayName() & "!"
End If
If healsuccess = True AndAlso success = True Then
- t &= "Healed and cured~" & Pokemon.GetDisplayName() & "!"
+ t &= "Healed and cured~" & p.GetDisplayName() & "!"
End If
If healsuccess = True Or success = True Then
@@ -418,7 +514,7 @@ Public Class GameModeItem
Return True
Else
- Screen.TextBox.Show("Cannot use" & Me.gmName & "~on " & Pokemon.GetDisplayName() & ".", {}, False, False)
+ Screen.TextBox.Show("Cannot use" & Me.gmName & "~on " & p.GetDisplayName() & ".", {}, False, False)
Return False
End If
End If
@@ -432,6 +528,52 @@ Public Class GameModeItem
Return False
End Function
+ Public Function CanTeach(ByVal p As Pokemon) As String
+ If p.IsEgg() = True Then
+ Return "Egg cannot learn~" & gmTeachMove.Name & "!"
+ End If
+
+ For Each knowAttack As BattleSystem.Attack In p.Attacks
+ If knowAttack.ID = gmTeachMove.ID Then
+ Return p.GetDisplayName() & " already~knows " & gmTeachMove.Name & "."
+ End If
+ Next
+
+ If p.Machines.Contains(gmTeachMove.ID) = True Then
+ Return ""
+ End If
+
+ For Each learnAttack As BattleSystem.Attack In p.AttackLearns.Values
+ If learnAttack.ID = gmTeachMove.ID Then
+ Return ""
+ End If
+ Next
+
+ If gmCanTeachAlways = True Then
+ If p.Machines.Count > 0 Then
+ Return ""
+ End If
+ End If
+
+ If gmCanTeachWhenFullyEvolved = True Then
+ If p.IsFullyEvolved() = True And p.Machines.Count > 0 Then
+ Return ""
+ End If
+ End If
+
+ If gmCanTeachWhenGender = True Then
+ If p.Gender <> Pokemon.Genders.Genderless And p.Machines.Count > 0 Then
+ Return ""
+ End If
+ End If
+
+ If p.CanLearnAllMachines = True Then
+ Return ""
+ End If
+
+ Return p.GetDisplayName() & " cannot learn~" & gmTeachMove.Name & "!"
+ End Function
+
Public Function UseEvolutionItem(ByVal PokeIndex As Integer) As Boolean
If PokeIndex < 0 Or PokeIndex > 5 Then
Throw New ArgumentOutOfRangeException("PokeIndex", PokeIndex, "The index for a Pokémon in a player's party can only be between 0 and 5.")
diff --git a/P3D/Pokemon/Items/GameModeItemLoader.vb b/P3D/Pokemon/Items/GameModeItemLoader.vb
index 61483ca21..428a78981 100644
--- a/P3D/Pokemon/Items/GameModeItemLoader.vb
+++ b/P3D/Pokemon/Items/GameModeItemLoader.vb
@@ -149,6 +149,10 @@ Public Class GameModeItemLoader
End If
Case "script"
item.gmScriptPath = value
+ Case "istm"
+ item.gmIsTM = CBool(value)
+ Case "teachmove"
+ item.gmTeachMove = BattleSystem.Attack.GetAttackByID(CInt(value))
End Select
End If
Next
@@ -166,6 +170,24 @@ Public Class GameModeItemLoader
item.gmCanBeUsed = False
item.gmCanBeUsedInBattle = False
End If
+ If item.gmIsTM = True AndAlso item.gmTeachMove IsNot Nothing AndAlso item.gmDescription = "" Then
+ Dim AttackName As String = item.gmTeachMove.Name
+ item.gmDescription = "Teaches """ & AttackName & """ to a Pokémon."
+ item.gmItemType = ItemTypes.Machines
+ item.gmCanBeHeld = False
+ item.gmCanBeTossed = True
+ item.gmCanBeTraded = True
+ item.gmCanBeUsed = True
+ item.gmCanBeUsedInBattle = False
+ If item.gmName.StartsWith("TM ") Then
+ item.gmSortValue = CInt(item.gmName.Remove(0, 3)) + 190
+ ElseIf item.gmName.StartsWith("TM") Then
+ item.gmSortValue = CInt(item.gmName.Remove(0, 2)) + 190
+ End If
+ item.gmTextureSource = "Items\ItemSheet"
+ item.SetTeachMoveTextureRectangle()
+
+ End If
LoadedItems.Add(item) 'Add the item.
Else
Logger.Log(Logger.LogTypes.ErrorMessage, "GameModeItemLoader.vb: User defined Items must set their ID through the ""ID"" property and their Name through the ""Name"" property, however the item loaded from """ & file & """ has no ID or Name set so it will be ignored.")