diff --git a/Data/Map042.rxdata b/Data/Map042.rxdata index e72d47d0c..abce9d0ae 100644 Binary files a/Data/Map042.rxdata and b/Data/Map042.rxdata differ diff --git a/Data/Map154.rxdata b/Data/Map154.rxdata index ae6e07955..888726656 100644 Binary files a/Data/Map154.rxdata and b/Data/Map154.rxdata differ diff --git a/Data/Map495.rxdata b/Data/Map495.rxdata index b6f4f189b..0c3ba82a3 100644 Binary files a/Data/Map495.rxdata and b/Data/Map495.rxdata differ diff --git a/Data/Map765.rxdata b/Data/Map765.rxdata index 40f5c73c6..07d470391 100644 Binary files a/Data/Map765.rxdata and b/Data/Map765.rxdata differ diff --git a/Data/Scripts/013_Items/001_Item_Utilities.rb b/Data/Scripts/013_Items/001_Item_Utilities.rb index f311ec675..874b8fc6a 100644 --- a/Data/Scripts/013_Items/001_Item_Utilities.rb +++ b/Data/Scripts/013_Items/001_Item_Utilities.rb @@ -445,6 +445,7 @@ def pbLearnMove(pkmn, move, ignoreifknown = false, bymachine = false, fast = fal end pkmnname = pkmn.name movename = GameData::Move.get(move).name + pkmn.add_learned_move(move) if !bymachine if pkmn.hasMove?(move) pbMessage(_INTL("{1} already knows {2}.", pkmnname, movename), &block) if !ignoreifknown return false @@ -462,7 +463,12 @@ def pbLearnMove(pkmn, move, ignoreifknown = false, bymachine = false, fast = fal if forgetmove >= 0 oldmovename = pkmn.moves[forgetmove].name oldmovepp = pkmn.moves[forgetmove].pp + forgotten_move = pkmn.moves[forgetmove] + pkmn.add_learned_move(forgotten_move) + pkmn.moves[forgetmove] = Pokemon::Move.new(move) # Replaces current/total PP + pkmn.add_learned_move(move) + if bymachine && Settings::TAUGHT_MACHINES_KEEP_OLD_PP pkmn.moves[forgetmove].pp = [oldmovepp, pkmn.moves[forgetmove].total_pp].min end diff --git a/Data/Scripts/014_Pokemon/001_Pokemon.rb b/Data/Scripts/014_Pokemon/001_Pokemon.rb index 1cb1d6d41..29a48d452 100644 --- a/Data/Scripts/014_Pokemon/001_Pokemon.rb +++ b/Data/Scripts/014_Pokemon/001_Pokemon.rb @@ -55,7 +55,7 @@ class Pokemon # @return [Array] the moves known by this Pokémon attr_accessor :moves - # @return [Array] All the moves ever learned by this Pokémon + # @return [Array] All the move (ids) ever learned by this Pokémon attr_accessor :learned_moves # @return [Array] the IDs of moves known by this Pokémon when it was obtained @@ -874,14 +874,20 @@ class Pokemon for i in first_move_index...knowable_moves.length move = Pokemon::Move.new(knowable_moves[i]) @moves.push(move) - @learned_moves = [] if !@learned_moves - @learned_moves << move if !@learned_moves.include?(move) + add_learned_move(move) end end def add_learned_move(move) @learned_moves = [] if !@learned_moves - @learned_moves << move unless @learned_moves.include?(move) + if move.is_a?(Symbol) + @learned_moves << move unless @learned_moves.include?(move) + else + move_id = move.id + if move_id + @learned_moves << move_id unless @learned_moves.include?(move_id) + end + end end @@ -902,9 +908,7 @@ class Pokemon @moves.push(move) # Delete the first known move if self now knows more moves than it should @moves.shift if numMoves > MAX_MOVES - @learned_moves = [] if !@learned_moves - @learned_moves << move if !@learned_moves.include?(move) - echoln @learned_moves + add_learned_move(move) end # Deletes the given move from the Pokémon. @@ -912,17 +916,23 @@ class Pokemon def forget_move(move_id) move_data = GameData::Move.try_get(move_id) return if !move_data + add_learned_move(move_id) @moves.delete_if { |m| m.id == move_data.id } end # Deletes the move at the given index from the Pokémon. # @param index [Integer] index of the move to be deleted def forget_move_at_index(index) + move_id = @moves[index].id + add_learned_move(move_id) @moves.delete_at(index) end # Deletes all moves from the Pokémon. def forget_all_moves + for move in @moves + add_learned_move(move) + end @moves.clear end diff --git a/Data/Scripts/016_UI/005_UI_Party.rb b/Data/Scripts/016_UI/005_UI_Party.rb index a779384af..75a1c333a 100644 --- a/Data/Scripts/016_UI/005_UI_Party.rb +++ b/Data/Scripts/016_UI/005_UI_Party.rb @@ -1190,6 +1190,43 @@ class PokemonPartyScreen end end + def pbRememberMoves(pokemon) + learnable_moves = pokemon.learned_moves + learnable_moves = [] if !learnable_moves + #exclude current moves + echoln "learned moves: #{learnable_moves}" + for current_move in pokemon.moves + echoln current_move.id + if learnable_moves.include?(current_move.id) + learnable_moves.delete(current_move.id) + end + end + move_ids = [] + for move in learnable_moves + if move.is_a?(Symbol) + move_ids << move + end + end + + if move_ids.empty? + pbMessage(_INTL("{1} has no moves to remember!",pokemon.name)) + return false + end + + echoln move_ids + + retval = true + pbFadeOutIn { + scene = MoveRelearner_Scene.new + screen = MoveRelearnerScreen.new(scene) + if !learnable_moves.empty? + retval = screen.pbStartScreen(pokemon, move_ids) + else + return false + end + } + return retval + end def pbPokemonRename(pkmn, pkmnid) cmd = 0 loop do @@ -1240,6 +1277,7 @@ class PokemonPartyScreen cmdMail = -1 cmdItem = -1 cmdHat = -1 + cmdLearnMove = -1 # Build the commands commands[cmdSummary = commands.length] = _INTL("Summary") @@ -1263,6 +1301,8 @@ class PokemonPartyScreen end end commands[cmdNickname = commands.length] = _INTL("Nickname") if !pkmn.egg? + commands[cmdLearnMove = commands.length] = _INTL("Remember moves") + commands[commands.length] = _INTL("Cancel") command = @scene.pbShowCommands(_INTL("Do what with {1}?", pkmn.name), commands) havecommand = false @@ -1324,6 +1364,8 @@ class PokemonPartyScreen } elsif cmdHat >= 0 && command == cmdHat pbPokemonHat(pkmn) + elsif cmdLearnMove > 0 && command == cmdLearnMove + pbRememberMoves(pkmn) elsif cmdNickname >= 0 && command == cmdNickname pbPokemonRename(pkmn, pkmnid) elsif cmdDebug >= 0 && command == cmdDebug diff --git a/Data/Scripts/016_UI/021_UI_MoveRelearner.rb b/Data/Scripts/016_UI/021_UI_MoveRelearner.rb index f22aea118..4dadc9b30 100644 --- a/Data/Scripts/016_UI/021_UI_MoveRelearner.rb +++ b/Data/Scripts/016_UI/021_UI_MoveRelearner.rb @@ -190,7 +190,7 @@ class MoveRelearnerScreen end if move if @scene.pbConfirm(_INTL("Teach {1}?", GameData::Move.get(move).name)) - if pbLearnMove(pkmn, move) + if pbLearnMove(pkmn, move, false, true) @scene.pbEndScene return true end