diff --git a/Data/Actors.rxdata b/Data/Actors.rxdata index 41edc8e26..7967a5432 100644 Binary files a/Data/Actors.rxdata and b/Data/Actors.rxdata differ diff --git a/Data/Animations.rxdata b/Data/Animations.rxdata index 826e1e8a6..8e67182ba 100644 Binary files a/Data/Animations.rxdata and b/Data/Animations.rxdata differ diff --git a/Data/Armors.rxdata b/Data/Armors.rxdata index 901f2bb2b..2249bec14 100644 Binary files a/Data/Armors.rxdata and b/Data/Armors.rxdata differ diff --git a/Data/CommonEvents.rxdata b/Data/CommonEvents.rxdata index 6f0a5a836..ae45168bf 100644 Binary files a/Data/CommonEvents.rxdata and b/Data/CommonEvents.rxdata differ diff --git a/Data/Enemies.rxdata b/Data/Enemies.rxdata index be622f513..004ee903d 100644 Binary files a/Data/Enemies.rxdata and b/Data/Enemies.rxdata differ diff --git a/Data/Items.rxdata b/Data/Items.rxdata index fe767fa0b..3e62ba6d2 100644 Binary files a/Data/Items.rxdata and b/Data/Items.rxdata differ diff --git a/Data/Map102.rxdata b/Data/Map102.rxdata index 4339b64dc..855ba9713 100644 Binary files a/Data/Map102.rxdata and b/Data/Map102.rxdata differ diff --git a/Data/Map409.rxdata b/Data/Map409.rxdata index 540baa48c..f2cadc1f4 100644 Binary files a/Data/Map409.rxdata and b/Data/Map409.rxdata differ diff --git a/Data/Map490.rxdata b/Data/Map490.rxdata index 8c79ef75b..d0d0b3b0e 100644 Binary files a/Data/Map490.rxdata and b/Data/Map490.rxdata differ diff --git a/Data/Map526.rxdata b/Data/Map526.rxdata index e34c3c774..ef2c17ea7 100644 Binary files a/Data/Map526.rxdata and b/Data/Map526.rxdata differ diff --git a/Data/Map562.rxdata b/Data/Map562.rxdata index 85fc7b19b..3ed7e57c8 100644 Binary files a/Data/Map562.rxdata and b/Data/Map562.rxdata differ diff --git a/Data/Map568.rxdata b/Data/Map568.rxdata index c931d1acf..dad5f4498 100644 Binary files a/Data/Map568.rxdata and b/Data/Map568.rxdata differ diff --git a/Data/Map765.rxdata b/Data/Map765.rxdata new file mode 100644 index 000000000..add9ad989 Binary files /dev/null and b/Data/Map765.rxdata differ diff --git a/Data/Map766.rxdata b/Data/Map766.rxdata new file mode 100644 index 000000000..699569cd5 Binary files /dev/null and b/Data/Map766.rxdata differ diff --git a/Data/MapInfos.rxdata b/Data/MapInfos.rxdata index ece5e682d..fb5caab1e 100644 Binary files a/Data/MapInfos.rxdata and b/Data/MapInfos.rxdata differ diff --git a/Data/Scripts/016_UI/021_UI_MoveRelearner.rb b/Data/Scripts/016_UI/021_UI_MoveRelearner.rb index 818d3c3b0..f22aea118 100644 --- a/Data/Scripts/016_UI/021_UI_MoveRelearner.rb +++ b/Data/Scripts/016_UI/021_UI_MoveRelearner.rb @@ -56,18 +56,22 @@ class MoveRelearner_Scene def pbDrawMoveList overlay=@sprites["overlay"].bitmap overlay.clear - type1_number = GameData::Type.get(@pokemon.type1).id_number - type2_number = GameData::Type.get(@pokemon.type2).id_number - type1rect=Rect.new(0, type1_number * 28, 64, 28) - type2rect=Rect.new(0, type2_number * 28, 64, 28) - if @pokemon.type1==@pokemon.type2 - overlay.blt(400,70,@typebitmap.bitmap,type1rect) - else - overlay.blt(366,70,@typebitmap.bitmap,type1rect) - overlay.blt(436,70,@typebitmap.bitmap,type2rect) + if @pokemon + type1_number = GameData::Type.get(@pokemon.type1).id_number + type2_number = GameData::Type.get(@pokemon.type2).id_number + type1rect=Rect.new(0, type1_number * 28, 64, 28) + type2rect=Rect.new(0, type2_number * 28, 64, 28) + if @pokemon.type1==@pokemon.type2 + overlay.blt(400,70,@typebitmap.bitmap,type1rect) + else + overlay.blt(366,70,@typebitmap.bitmap,type1rect) + overlay.blt(436,70,@typebitmap.bitmap,type2rect) + end end + + text = @pokemon ? "Teach which move?" : "Moves list" textpos=[ - [_INTL("Teach which move?"),16,2,0,Color.new(88,88,80),Color.new(168,184,184)] + [_INTL(text),16,2,0,Color.new(88,88,80),Color.new(168,184,184)] ] imagepos=[] yPos=76 @@ -132,7 +136,7 @@ class MoveRelearner_Scene end if Input.trigger?(Input::BACK) return nil - elsif Input.trigger?(Input::USE) + elsif Input.trigger?(Input::USE) && @pokemon return @moves[@sprites["commands"].index] end end @@ -180,6 +184,10 @@ class MoveRelearnerScreen @scene.pbStartScene(pkmn, moves) loop do move = @scene.pbChooseMove + if !pkmn + @scene.pbEndScene + return false + end if move if @scene.pbConfirm(_INTL("Teach {1}?", GameData::Move.get(move).name)) if pbLearnMove(pkmn, move) diff --git a/Data/Scripts/050_AddOns/FusionMoveTutor.rb b/Data/Scripts/050_AddOns/FusionMoveTutor.rb index 4c2fcb5e0..101ecbfd5 100644 --- a/Data/Scripts/050_AddOns/FusionMoveTutor.rb +++ b/Data/Scripts/050_AddOns/FusionMoveTutor.rb @@ -6,7 +6,7 @@ def pbSpecialTutor(pokemon) screen = MoveRelearnerScreen.new(scene) moves = tutorUtil.getCompatibleMoves if !moves.empty? - retval = screen.pbStartScreen(pokemon,moves) + retval = screen.pbStartScreen(pokemon, moves) else return false end @@ -14,13 +14,75 @@ def pbSpecialTutor(pokemon) return retval end + +def pbShowRareTutorFullList(includeLegendaries=false) + tutorUtil = FusionTutorService.new(nil) + tutorUtil.setShowList(true) + pbFadeOutIn { + scene = MoveRelearner_Scene.new + screen = MoveRelearnerScreen.new(scene) + moves = tutorUtil.getCompatibleMoves(includeLegendaries) + screen.pbStartScreen(nil, moves) + } + return false +end + +def pbCheckRareTutorCompatibleMoves(pokemon,includeLeshgendaries) + tutorUtil = FusionTutorService.new(pokemon) + return tutorUtil.has_compatible_move(includeLeshgendaries) +end + + +def showRandomRareMoveConditionExample(legendary=false) + example = legendary ? getlegendaryConditionExample : getRegularConditionExample + text = "For example, " + example + pbMessage(text) +end + +def getRegularConditionExample() + list = [ + "a Sandslash fusion which has the electric type will be able to learn the move Zing Zap.", + "any Pokémon that is both Flying and Fighting type will be able to learn the move Flying Press.", + "the move Shadow Bone can only be learned by ghost-type Marowak fusions.", + "any Pokémon that is both Ghost and Grass type will be able to learn the move Trick or Treat.", + "the move Forest's Curse can only be learned by Ghost/Grass typed Pokémon.", + "a grass-type fusion of a spiky Pokémon such as Jolteon will be able to learn the move Spiky Shield.", + "any ice-type fusion that can already learn the move Crabhammer will also be able to learn the move Ice Hammer.", + "only water-type fusions of a ninja-like Pokémon such as Ninjask or Zoroark will be able to learn the move Water Shuriken.", + ] + return list.sample +end + +def getlegendaryConditionExample() + list = [ + "any Rotom fusion that can already learn the move Thunder Punch can also be taught the move Plasma Fists.", + "only an Electric-type fusion of a legendary Ice-type Pokémon will be able to learn the move Freeze Shock.", + "only a Fire-type fusion of a legendary Ice-type Pokémon will be able to learn the move Ice Burn.", + "any Pokémon that is both Flying and Dark type will be able to learn the move Oblivion Wing.", + "a ground-type fusion of a spiky Pokémon such as Ferrothorn will be able to learn the move Thousand Arrows.", + "any steel-type Pokémon that can already learn the move Double Slap will be able to learn Double Iron Bash.", + "any Pokémon that is both Fairy and Rock type will be able to learn the move Diamond Storm.", + "any water-type Pokémon that can already learn the move Eruption can also be taught the move Steam Eruption", + ] + return list.sample +end + class FusionTutorService + def has_compatible_move(include_legendaries=false) + return !getCompatibleMoves(include_legendaries).empty? + end + def initialize(pokemon) @pokemon = pokemon + @show_full_list=false end - def getCompatibleMoves + def setShowList(value) + @show_full_list = value + end + + def getCompatibleMoves(includeLegendaries = false) compatibleMoves = [] #normal moves compatibleMoves << :ATTACKORDER if is_fusion_of([:BEEDRILL]) @@ -68,60 +130,63 @@ class FusionTutorService compatibleMoves << :MISTYTERRAIN if hasType(:FAIRY) compatibleMoves << :SPEEDSWAP if is_fusion_of([:PIKACHU, :RAICHU, :ABRA, :KADABRA, :ALAKAZAM, :PORYGON, :PORYGON2, :PORYGONZ, :MEWTWO, :MEW, :JOLTIK, :GALVANTULA]) compatibleMoves << :ACCELEROCK if is_fusion_of([:AERODACTYL, :KABUTOPS, :ANORITH, :ARMALDO]) - compatibleMoves << :ANCHORSHOT if (is_fusion_of([:EMPOLEON, :STEELIX, :BELDUM, :METANG, :METAGROSS,:KLINK,:KLINKLANG,:KLANG,:ARON,:LAIRON,:AGGRON]) && hasType(:WATER)) || (is_fusion_of([:LAPRAS,:WAILORD,:KYOGRE]) && hasType(:STEEL)) + compatibleMoves << :ANCHORSHOT if (is_fusion_of([:EMPOLEON, :STEELIX, :BELDUM, :METANG, :METAGROSS, :KLINK, :KLINKLANG, :KLANG, :ARON, :LAIRON, :AGGRON]) && hasType(:WATER)) || (is_fusion_of([:LAPRAS, :WAILORD, :KYOGRE]) && hasType(:STEEL)) compatibleMoves << :SPARKLINGARIA if (is_fusion_of([:JYNX, :JIGGLYPUFF, :WIGGLYTUFF]) && hasType(:WATER)) || is_fusion_of([:LAPRAS]) compatibleMoves << :WATERSHURIKEN if is_fusion_of([:NINJASK, :LUCARIO, :ZOROARK, :BISHARP]) && hasType(:WATER) - #legendary moves (only available after a certain trigger, maybe a different npc) - compatibleMoves << :HYPERSPACEFURY if is_fusion_of([:GIRATINA, :PALKIA, :DIALGA, :ARCEUS]) - compatibleMoves << :COREENFORCER if is_fusion_of([:GIRATINA, :PALKIA, :DIALGA, :RAYQUAZA]) - - compatibleMoves << :PLASMAFISTS if is_fusion_of([:ELECTABUZZ, :ELECTIVIRE, :ZEKROM]) || (is_fusion_of([:ROTOM]) && canLearnMove(:THUNDERPUNCH)) - - compatibleMoves << :LIGHTOFRUIN if is_fusion_of([:ARCEUS, :MEW, :CELEBI, :JIRACHI]) - compatibleMoves << :FLEURCANNON if is_fusion_of([:GARDEVOIR, :GALLADE, :SYLVEON, :WIGGLYTUFF]) - compatibleMoves << :NATURESMADNESS if is_fusion_of([:CELEBI, :KYOGRE, :GROUDON, :ABSOL]) - compatibleMoves << :GEOMANCY if is_fusion_of([:CELEBI]) - compatibleMoves << :VCREATE if is_fusion_of([:ENTEI, :HOOH, :TYPHLOSION]) - compatibleMoves << :MAGMASTORM if is_fusion_of([:MAGCARGO, :TYPHLOSION, :MAGMORTAR, :MAGMAR, :ENTEI, :GROUDON]) || canLearnMove(:ERUPTION) - compatibleMoves << :SEARINGSHOT if is_fusion_of([:MAGMORTAR]) - compatibleMoves << :OBLIVIONWING if is_fusion_of([:MURKROW, :HONCHKROW]) || (hasType(:DARK) && hasType(:FLYING)) - compatibleMoves << :MOONGEISTBEAM if (is_fusion_of([:CLEFFA, :CLEFAIRY, :CLEFABLE]) && hasType(:DARK)) || is_fusion_of([:DARKRAI, :MISDREAVUS, :MISMAGIUS]) - compatibleMoves << :SPECTRALTHIEF if is_fusion_of([:HAUNTER, :GENGAR, :BANETTE, :GIRATINA, :HONEDGE, :DOUBLADE, :AEGISLASH]) - compatibleMoves << :SEEDFLARE if is_fusion_of([:JUMPLUFF, :SUNFLORA]) - compatibleMoves << :LANDSWRATH if is_fusion_of([:GROUDON]) - compatibleMoves << :THOUSANDARROWS if is_fusion_of([:SANDSLASH, :JOLTEON, :FERROTHORN]) && hasType(:GROUND) - compatibleMoves << :THOUSANDWAVES if is_fusion_of([:STUNFISK, :QUAGSIRE, :SWAMPERT]) - compatibleMoves << :FREEZESHOCK if is_fusion_of([:KYUREM, :ARTICUNO]) && hasType(:ELECTRIC) - compatibleMoves << :ICEBURN if is_fusion_of([:KYUREM, :ARTICUNO]) && hasType(:FIRE) - compatibleMoves << :RELICSONG if is_fusion_of([:JYNX, :LAPRAS, :JIGGLYPUFF, :WIGGLYTUFF, :MISDREAVUS, :MISMAGIUS]) - compatibleMoves << :HAPPYHOUR if is_fusion_of([:MEOWTH, :JIRACHI, :DELIBIRD, :MUNCHLAX, :SNORLAX, :PIKACHU, :RAICHU]) - compatibleMoves << :HOLDHANDS if is_fusion_of([:CHARMANDER, :BULBASAUR, :SQUIRTLE, :PIKACHU, :TOGEPI]) - compatibleMoves << :PRISMATICLASER if is_fusion_of([:LANTURN, :AMPHAROS, :HOOH, :DEOXYS, :MEWTWO, :MEW]) && hasType(:PSYCHIC) - compatibleMoves << :PHOTONGEYSER if is_fusion_of([:LANTURN, :AMPHAROS, :HOOH, :MEW, :MEWTWO, :DEOXYS]) && hasType(:PSYCHIC) - compatibleMoves << :LUNARDANCE if is_fusion_of([:CLEFAIRY, :CLEFABLE, :STARYU, :STARMIE]) - compatibleMoves << :DIAMONDSTORM if ((hasType(:FAIRY) && hasType(:ROCK)) || (hasType(:ROCK) && hasType(:STEEL))) || is_fusion_of([:DIALGA, :STEELIX]) - compatibleMoves << :SUNSTEELSTRIKE if is_fusion_of([:CHARIZARD, :VOLCARONA, :FLAREON, :NINETALES, :ENTEI, :HOOH, :RAPIDASH]) && hasType(:STEEL) - compatibleMoves << :DOUBLEIRONBASH if canLearnMove(:DOUBLESLAP) && hasType(:STEEL) - compatibleMoves << :STEAMERUPTION if canLearnMove(:ERUPTION) && hasType(:WATER) + if includeLegendaries + #legendary moves (only available after a certain trigger, maybe a different npc) + compatibleMoves << :HYPERSPACEFURY if is_fusion_of([:GIRATINA, :PALKIA, :DIALGA, :ARCEUS]) + compatibleMoves << :COREENFORCER if is_fusion_of([:GIRATINA, :PALKIA, :DIALGA, :RAYQUAZA]) + compatibleMoves << :PLASMAFISTS if is_fusion_of([:ELECTABUZZ, :ELECTIVIRE, :ZEKROM]) || (is_fusion_of([:ROTOM]) && canLearnMove(:THUNDERPUNCH)) + compatibleMoves << :LIGHTOFRUIN if is_fusion_of([:ARCEUS, :MEW, :CELEBI, :JIRACHI]) + compatibleMoves << :FLEURCANNON if is_fusion_of([:GARDEVOIR, :GALLADE, :SYLVEON, :WIGGLYTUFF]) + compatibleMoves << :NATURESMADNESS if is_fusion_of([:CELEBI, :KYOGRE, :GROUDON, :ABSOL]) + compatibleMoves << :GEOMANCY if is_fusion_of([:CELEBI]) + compatibleMoves << :VCREATE if is_fusion_of([:ENTEI, :HOOH, :TYPHLOSION]) + compatibleMoves << :MAGMASTORM if is_fusion_of([:MAGCARGO, :TYPHLOSION, :MAGMORTAR, :MAGMAR, :ENTEI, :GROUDON]) || canLearnMove(:ERUPTION) + compatibleMoves << :SEARINGSHOT if is_fusion_of([:MAGMORTAR]) + compatibleMoves << :OBLIVIONWING if is_fusion_of([:MURKROW, :HONCHKROW]) || (hasType(:DARK) && hasType(:FLYING)) + compatibleMoves << :MOONGEISTBEAM if (is_fusion_of([:CLEFFA, :CLEFAIRY, :CLEFABLE]) && hasType(:DARK)) || is_fusion_of([:DARKRAI, :MISDREAVUS, :MISMAGIUS]) + compatibleMoves << :SPECTRALTHIEF if is_fusion_of([:HAUNTER, :GENGAR, :BANETTE, :GIRATINA, :HONEDGE, :DOUBLADE, :AEGISLASH]) + compatibleMoves << :SEEDFLARE if is_fusion_of([:JUMPLUFF, :SUNFLORA]) + compatibleMoves << :LANDSWRATH if is_fusion_of([:GROUDON]) + compatibleMoves << :THOUSANDARROWS if is_fusion_of([:SANDSLASH, :JOLTEON, :FERROTHORN]) && hasType(:GROUND) + compatibleMoves << :THOUSANDWAVES if is_fusion_of([:STUNFISK, :QUAGSIRE, :SWAMPERT]) + compatibleMoves << :FREEZESHOCK if is_fusion_of([:KYUREM, :ARTICUNO]) && hasType(:ELECTRIC) + compatibleMoves << :ICEBURN if is_fusion_of([:KYUREM, :ARTICUNO]) && hasType(:FIRE) + compatibleMoves << :RELICSONG if is_fusion_of([:JYNX, :LAPRAS, :JIGGLYPUFF, :WIGGLYTUFF, :MISDREAVUS, :MISMAGIUS]) + compatibleMoves << :HAPPYHOUR if is_fusion_of([:MEOWTH, :JIRACHI, :DELIBIRD, :MUNCHLAX, :SNORLAX, :PIKACHU, :RAICHU]) + compatibleMoves << :HOLDHANDS if is_fusion_of([:CHARMANDER, :BULBASAUR, :SQUIRTLE, :PIKACHU, :TOGEPI]) + compatibleMoves << :PRISMATICLASER if is_fusion_of([:LANTURN, :AMPHAROS, :HOOH, :DEOXYS, :MEWTWO, :MEW]) && hasType(:PSYCHIC) + compatibleMoves << :PHOTONGEYSER if is_fusion_of([:LANTURN, :AMPHAROS, :HOOH, :MEW, :MEWTWO, :DEOXYS]) && hasType(:PSYCHIC) + compatibleMoves << :LUNARDANCE if is_fusion_of([:CLEFAIRY, :CLEFABLE, :STARYU, :STARMIE]) + compatibleMoves << :DIAMONDSTORM if ((hasType(:FAIRY) && hasType(:ROCK)) || (hasType(:ROCK) && hasType(:STEEL))) || is_fusion_of([:DIALGA, :STEELIX]) + compatibleMoves << :SUNSTEELSTRIKE if is_fusion_of([:CHARIZARD, :VOLCARONA, :FLAREON, :NINETALES, :ENTEI, :HOOH, :RAPIDASH]) && hasType(:STEEL) + compatibleMoves << :DOUBLEIRONBASH if canLearnMove(:DOUBLESLAP) && hasType(:STEEL) + compatibleMoves << :STEAMERUPTION if canLearnMove(:ERUPTION) && hasType(:WATER) + end return compatibleMoves end def is_fusion_of(pokemonList) + return true if @show_full_list is_species = false for fusionPokemon in pokemonList if @pokemon.isFusionOf(fusionPokemon) - is_species=true + is_species = true end end return is_species end def hasType(type) + return true if @show_full_list return @pokemon.hasType?(type) end def canLearnMove(move) + return true if @show_full_list return @pokemon.compatible_with_move?(move) end diff --git a/Data/Skills.rxdata b/Data/Skills.rxdata index a45219f5e..61cba7ea2 100644 Binary files a/Data/Skills.rxdata and b/Data/Skills.rxdata differ diff --git a/Data/States.rxdata b/Data/States.rxdata index 868d49e59..0f9b4ae5d 100644 Binary files a/Data/States.rxdata and b/Data/States.rxdata differ diff --git a/Data/System.rxdata b/Data/System.rxdata index 5fb21e73e..856aa9c79 100644 Binary files a/Data/System.rxdata and b/Data/System.rxdata differ diff --git a/Data/Tilesets.rxdata b/Data/Tilesets.rxdata index ba9820343..a005fc327 100644 Binary files a/Data/Tilesets.rxdata and b/Data/Tilesets.rxdata differ diff --git a/Data/Weapons.rxdata b/Data/Weapons.rxdata index c7ea19a7a..d9bd35260 100644 Binary files a/Data/Weapons.rxdata and b/Data/Weapons.rxdata differ