Advertisement
TechSkylander1518

Champions DexNav v19

Jun 27th, 2021 (edited)
292
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Ruby 16.27 KB | None | 0 0
  1. PluginManager.register({
  2.   :name => "Better DexNav",
  3.   :version => "1.0",
  4.   :credits => ["Phantombass, with portions of code taken from:","Suzerain","Nuri Yuri","Developers of SimpleEncounterUI"],
  5.   :link => "https://reliccastle.com/resources/520/"
  6. })
  7.  
  8.  
  9. class Trainer
  10.   attr_accessor :searchlvl
  11.  
  12.   @searchlvl = []
  13. end
  14.  
  15.  
  16. class PokeBattle_Battle
  17.   def pbSetSeen(battler)
  18.     return if !battler || !@internalBattle
  19.     pbPlayer.pokedex.register(battler.displaySpecies,battler.displayGender,battler.displayForm)
  20.     if pbPlayer.searchlvl
  21.       pbPlayer.searchlvl[GameData::Species.get(battler.displaySpecies).id_number] += 1
  22.     else
  23.       pbPlayer.searchlvl = []
  24.       GameData::Species.each do |sp|
  25.         pbPlayer.searchlvl[sp.id_number]         = 0
  26.       end
  27.       pbPlayer.searchlvl[GameData::Species.get(battler.displaySpecies).id_number] += 1
  28.     end
  29.   end
  30. end
  31.  
  32.  
  33. class NewDexNav
  34.   def initialize
  35.     @viewport1 = Viewport.new(0, 0, Graphics.width, Graphics.height)
  36.     @viewport1.z = 99999
  37.     @viewport2 = Viewport.new(30, 60, Graphics.width, Graphics.height)
  38.     @viewport2.z = 999999
  39.     @viewport3 = Viewport.new(0, 60, Graphics.width, Graphics.height)
  40.     @viewport3.z = 999999
  41.     searchmon = 0
  42.     @sprites = {}
  43.     @encarray = []
  44.     @pkmnsprite = []
  45.     @navChoice = 0
  46.     @form = 0
  47.     navAbil = []
  48.     @ab = []
  49.     encstringarray = [] # Savordez simplified this on discord but I kept it for me to understand better
  50.     @encarray = getEncData
  51.     # Following variable is unused, but can be a good sub in if you need it
  52.     #textColor=["0070F8,78B8E8","E82010,F8A8B8","0070F8,78B8E8"][$Trainer.gender]
  53.     loctext = _INTL("<ac><c2=43F022E8>{1}</c2></ac>", $game_map.name)
  54.     temparray = @encarray.dup  # doing `if @encarray.pop==7` actually pops the last species off before the loop!
  55.     if temparray.pop==7  # i picked 7 cause funny
  56.       loctext += sprintf("<al><c2=7FF05EE8>This area has no encounters</c2></al>")
  57.       loctext += sprintf("<c2=63184210>-----------------------------------------</c2>")
  58.     else
  59.       i = 0
  60.       @encarray.each do |specie|
  61.          encstringarray.push(GameData::Species.get(specie).name)#+", ")
  62.          if !$Trainer.seen?(specie)
  63.            @pkmnsprite[i]=PokemonSpeciesIconSprite.new(000,@viewport2)
  64.          else
  65.            @pkmnsprite[i]=PokemonSpeciesIconSprite.new(specie,@viewport2)
  66.         end
  67.          if i > 6 && i < 14
  68.            @pkmnsprite[i].y += 64
  69.            @pkmnsprite[i].x = (64 * (i-7))
  70.          elsif i > 13
  71.            @pkmnsprite[i].y += 128
  72.            @pkmnsprite[i].x = (64 * (i-14))
  73.          else
  74.            @pkmnsprite[i].x += 64 * i
  75.          end
  76.          i +=1
  77.        end
  78.       #loctext += sprintf("<al><c2=7FF05EE8>Total encounters for area: %s</c2></al>",@encarray.length)
  79.      # loctext += sprintf("<c2=63184210>-----------------------------------------</c2>")
  80.       #loctext += sprintf("<al>%s</al>",encstringarray.join(", "))#.map{|a| a.to_s})
  81.     end
  82.     @sprites["locwindow"]=Window_AdvancedTextPokemon.new(loctext)
  83.     @sprites["locwindow"].viewport=@viewport1
  84.     @sprites["locwindow"].x=0
  85.     @sprites["locwindow"].y=0
  86.     @sprites["locwindow"].width=512 #if @sprites["locwindow"].width<420
  87.     @sprites["locwindow"].height=344
  88.     @sprites["locwindow"].visible=true
  89.     @sprites["nav"] = AnimatedSprite.new("Graphics/Pictures/rightarrow",8,40,28,2,@viewport3)
  90.     @sprites["nav"].x = 5
  91.     @sprites["nav"].y = 18
  92.     @sprites["nav"].visible
  93.     @sprites["nav"].play
  94.     pbFadeInAndShow(@sprites)
  95.     main
  96.   end
  97.  
  98.   def pbUpdate
  99.     pbUpdateSpriteHash(@sprites)
  100.   end
  101.  
  102.   def dispose
  103.     pbFadeOutAndHide(@sprites) {pbUpdate}
  104.     pbDisposeSpriteHash(@sprites)
  105.     @viewport1.dispose
  106.     @viewport2.dispose
  107.     @viewport3.dispose
  108.   end
  109.  
  110.  
  111.   #From Welsh_One
  112.   def getEncData
  113.     mapid = $game_map.map_id
  114.     encounter_data = GameData::Encounter.get(mapid, $PokemonGlobal.encounter_version)
  115.     encounter_tables = Marshal.load(Marshal.dump(encounter_data.types)) if encounter_data
  116.     currKey = encounter_tables.keys[0] #@index
  117.     keys = encounter_tables.keys
  118.     arr = []
  119.     enc_array = []
  120.     for key in keys
  121.       encounter_tables[key].each { |s| arr.push( s[1] ) }
  122.       GameData::Species.each { |s| enc_array.push(s.id) if arr.include?(s.id) } # From Maruno
  123.     end
  124.     enc_array.uniq!
  125.     return enc_array
  126.   end
  127.  
  128.  
  129.   def main
  130.     navMon = 0
  131.     @navChoice = 0
  132.     lastMon = @encarray.length - 1
  133.     if !$Trainer.seen?(@encarray[navMon])
  134.       @sprites["navMon"]=Window_AdvancedTextPokemon.new(_INTL("<ac>\n???</ac>"))
  135.     else
  136.       @sprites["navMon"]=Window_AdvancedTextPokemon.new(_INTL("<ac>\n{1}</ac>",GameData::Species.get(@encarray[navMon]).name))
  137.     end
  138.     @sprites["navMon"].viewport = @viewport1
  139.     @sprites["navMon"].windowskin = nil
  140.     @sprites["navMon"].x=0
  141.     @sprites["navMon"].y=0
  142.     @sprites["navMon"].width=512
  143.     @sprites["navMon"].height=344
  144.     loop do
  145.       Graphics.update
  146.       Input.update
  147.       pbUpdateSpriteHash(@sprites)
  148.       if Input.trigger?(Input::DOWN)
  149.         next if lastMon < 7 && @navChoice < 7
  150.         next if lastMon > 6 && lastMon <14 && @navChoice > 6 && @navChoice < 14
  151.         next if (@navChoice + 7) > lastMon
  152.         @navChoice +=7
  153.         navMon += 7
  154.         @sprites["nav"].y += 64
  155.           if !$Trainer.seen?(@encarray[navMon])
  156.             @sprites["navMon"].text=(_INTL("<ac>\n???</ac>"))
  157.           else
  158.             @sprites["navMon"].text=(_INTL("<ac>\n{1}</ac>",GameData::Species.get(@encarray[navMon]).name))
  159.           end
  160.       elsif Input.trigger?(Input::UP) && @navChoice > 6
  161.         @navChoice -=7
  162.         navMon -=7
  163.         @sprites["nav"].y -= 64
  164.           if !$Trainer.seen?(@encarray[navMon])
  165.             @sprites["navMon"].text=(_INTL("<ac>\n???</ac>"))
  166.           else
  167.             @sprites["navMon"].text=(_INTL("<ac>\n{1}</ac>",GameData::Species.get(@encarray[navMon]).name))
  168.           end    
  169.       elsif Input.trigger?(Input::LEFT) && (@navChoice != 0 && @navChoice != 7 && @navChoice != 14)
  170.         @navChoice -=1
  171.         navMon -=1
  172.         @sprites["nav"].x -= 64
  173.           if !$Trainer.seen?(@encarray[navMon])
  174.             @sprites["navMon"].text=(_INTL("<ac>\n???</ac>"))
  175.           else
  176.             @sprites["navMon"].text=(_INTL("<ac>\n{1}</ac>",GameData::Species.get(@encarray[navMon]).name))
  177.           end
  178.       elsif Input.trigger?(Input::RIGHT)
  179.         if @navChoice == 6 || @navChoice == 13 || @navChoice == 20 || @navChoice == lastMon
  180.           next
  181.         elsif (@navChoice !=6 && @navChoice !=13 && @navChoice !=20) || (@navChoice != lastMon)
  182.         @navChoice +=1
  183.         navMon +=1
  184.         @sprites["nav"].x += 64
  185.           if !$Trainer.seen?(@encarray[navMon])
  186.             @sprites["navMon"].text=(_INTL("<ac>\n???</ac>"))
  187.           else
  188.             @sprites["navMon"].text=(_INTL("<ac>\n{1}</ac>",GameData::Species.get(@encarray[navMon]).name))
  189.           end
  190.         end
  191.       elsif Input.trigger?(Input::C)
  192.         if !$Trainer.seen?(@encarray[navMon])
  193.           pbMessage("You cannot search for this Pokémon yet!")
  194.           pbMessage("Try looking for it first to register it to your Pokédex!")
  195.           next
  196.         elsif $currentDexSearch != nil
  197.           pbMessage("You're already searching for one. Try having a look around!")
  198.           @viewport2.dispose
  199.           break
  200.         else
  201.           pbMessage("Searching...")
  202.             if rand(2) == 0
  203.               DexNav.addToChain
  204.                pbMessage("Oh! A Pokémon was found nearby!")
  205.                 species=@encarray[@navChoice]
  206.                # We generate the pokemon they found (added to the encounters),
  207.                 # giving it some rare "egg moves" to incentivize using this function
  208.               if $Trainer.searchlvl
  209.               else
  210.                 $Trainer.searchlvl = []
  211.                 GameData::Species.each do |sp|
  212.                   $Trainer.searchlvl[sp.id_number]         = 0
  213.                 end
  214.               end
  215.               searchlvl = $Trainer.searchlvl[GameData::Species.get(species).id_number]
  216.               if searchlvl <5
  217.                 chance = 21
  218.               elsif searchlvl<10
  219.                 chance  = 46
  220.               elsif searchlvl < 25
  221.                 chance = 58
  222.               elsif seachlvl < 50
  223.                 chance = 63
  224.               elsif searchlvl < 100
  225.                 chance = 65
  226.               else
  227.                 chance = 83
  228.               end
  229.               test = rand(100)
  230.               if test<=chance
  231.                 $currentDexSearch=[species,DexNav.addRandomEggMove(species)]
  232.               else
  233.                 $currentDexSearch=[species,nil]
  234.               end
  235.                pbMessage("Try looking in wild Pokémon spots near you- it might appear!")
  236.                pbFadeOutAndHide(@sprites)
  237.                break
  238.             else
  239.                pbMessage("Nothing was found. Try looking somewhere else!")
  240.             end
  241.           end
  242.       elsif Input.trigger?(Input::B)
  243.         navMon = -1
  244.         dispose
  245.         break
  246.       else
  247.         next
  248.       end
  249.     end
  250.     if navMon != -1
  251.       @viewport2.dispose
  252.       main2
  253.     end
  254.   end
  255.  
  256.   def main2
  257.     searchmon = $currentDexSearch[0]
  258.     navRand = rand(3)
  259.     $game_variables[400] = navRand
  260.     hAbil = GameData::Species.get_species_form(searchmon,@form).hidden_abilities
  261.     navAbil1 = GameData::Species.get_species_form(searchmon,@form).abilities
  262.     #hAbil = pbGetSpeciesData(searchmon,@form,SpeciesHiddenAbility)
  263.     #navAbil1 = pbGetSpeciesData(searchmon,@form,SpeciesAbilities)
  264.     if navAbil1[1] = nil
  265.       navAbil = [navAbil1[0],navAbil1[1],hAbil[0]]
  266.     else
  267.       navAbil = [navAbil1[0],navAbil1[0],hAbil[0]]
  268.     end
  269.     ab = GameData::Ability.get(navAbil[navRand]).name
  270.     #ab = PBAbilities.getName(navAbil[navRand])
  271.     if $currentDexSearch[1]
  272.         move = GameData::Move.get($currentDexSearch[1]).name
  273.         #move = PBMoves.getName($currentDexSearch[1])
  274.     else
  275.       move=""
  276.     end
  277.     Graphics.update
  278.     searchtext = [GameData::Species.get(searchmon).name,ab,move]
  279.     $scene.spriteset.addUserSprite(DexNavWindow.new(searchtext))
  280.     pbFadeInAndShow(@sprites) {pbUpdate}
  281.     $game_switches[350] = true
  282.   end
  283. end
  284.  
  285. Events.onEndBattle += proc { |_sender,e|
  286.   decision = e[0]
  287.   if $game_switches[350] == true
  288.   case decision
  289.   when 1, 4   # Win, capture
  290.       pbMessage("Searching...")
  291.     #if rand(2) == 0
  292.        pbMessage("Oh! A Pokémon was found nearby!")
  293.         species=$game_variables[400]
  294.        # We generate the pokemon they found (added to the encounters),
  295.         # giving it some rare "egg moves" to incentivize using this function
  296.        $currentDexSearch=[species,DexNav.addRandomEggMove(species)]
  297.        pbMessage("Try looking in wild Pokémon spots near you- it might appear!")
  298.       navRand = rand(3)
  299.       $game_variables[400] = navRand
  300.       hAbil = GameData::Species.get_species_form(searchmon,@form).hidden_abilities
  301.       navAbil1 = GameData::Species.get_species_form(searchmon,@form).abilities
  302.       if navAbil1[1] = nil
  303.         navAbil = [navAbil1[0],navAbil1[1],hAbil[0]]
  304.       else
  305.         navAbil = [navAbil1[0],navAbil1[0],hAbil[0]]
  306.       end
  307.        ab = GameData::Ability.get(navAbil[navRand]).name
  308.        move = GameData::Move.get($currentDexSearch[1]).name
  309.        searchtext = [GameData::Species.get(searchmon).name,ab,move]
  310.        DexNav.addToChain
  311.        $scene.spriteset.addUserSprite(DexNavWindow.new(searchtext))
  312.     #else
  313.      #  pbMessage("Nothing was found. Try looking somewhere else!")
  314.    # end
  315.   end
  316.     $game_switches[350] = false
  317.     $dexNavData=0
  318.   end
  319. }
  320.  
  321.  
  322. Events.onMapChanging +=proc {|_sender,e|
  323.   if $game_switches[350] == true
  324.     $currentDexSearch = nil
  325.     $dexNavData=0
  326.     $game_switches[350] = false
  327.   end
  328. }
  329.  
  330. Events.onWildPokemonCreate+=proc {|sender,e|
  331.     pokemon=e[0]
  332.     # Checks current search value, if it exists, sets the Pokemon to it
  333.     if $currentDexSearch != nil && $currentDexSearch.is_a?(Array)
  334.       pokemon.species=$currentDexSearch[0]
  335.       pokemon.level+=($dexNavData/5).floor
  336.       if pokemon.level>100
  337.         pokemon.level=100
  338.       end
  339.     #Sets IV chances based on search level
  340.       if $Trainer.searchlvl
  341.         searchlvl = $Trainer.searchlvl[GameData::Species.get($currentDexSearch[0]).id_number]
  342.           chance = rand(100)
  343.         if searchlvl <5
  344.           star = 0
  345.         elsif searchlvl<10
  346.           if chance <85
  347.             star = 0
  348.           elsif chance <99
  349.             star = 1
  350.           else
  351.             star = 2
  352.           end
  353.         elsif searchlvl < 25
  354.           if chance <73
  355.             star = 0
  356.           elsif chance <90
  357.             star = 1
  358.           elsif chance <99
  359.             star = 2
  360.           else
  361.             star = 3
  362.           end
  363.         elsif seachlvl < 50
  364.           if chance <60
  365.             star = 0
  366.           elsif chance <77
  367.             star = 1
  368.           elsif chance <93
  369.             star = 2
  370.           else
  371.             star = 3
  372.           end
  373.         elsif searchlvl < 100
  374.           if chance <62
  375.             star = 0
  376.           elsif chance <77
  377.             star = 1
  378.           elsif chance <94
  379.             star = 2
  380.           else
  381.             star = 3
  382.           end
  383.         else
  384.           if chance <56
  385.             star = 0
  386.           elsif chance <64
  387.             star = 1
  388.           elsif chance <88
  389.             star = 2
  390.           else
  391.             star = 3
  392.           end
  393.         end
  394.       end
  395.       star.times do
  396.         stat=rand(5)
  397.         loop do
  398.             if pokemon.iv[stat] == 31
  399.               stat=rand(5)
  400.             else
  401.               break
  402.             end
  403.           end
  404.         pokemon.iv[stat] = 31
  405.       end
  406.       pokemon.name=GameData::Species.get(pokemon.species).name
  407.       pokemon.setAbility($game_variables[400])
  408.       pokemon.resetMoves
  409.       pokemon.moves[2]=Pokemon::Move.new($currentDexSearch[1]) if $currentDexSearch[1]
  410.       $game_switches[350] = true
  411.       if $currentDexSearch[1] != $currentDexSearch[2]
  412.         pokemon.moves[3]=Pokemon::Move.new($currentDexSearch[2]) if $currentDexSearch[2]
  413.       end
  414.       # There is a higher chance for shininess, so we give it another chance to force it to be shiny
  415.       tempInt = $PokemonBag.pbHasItem?(:SHINYCHARM) ? 256 : 768
  416.       if rand(tempInt)<=$dexNavData
  417.        pokemon.makeShiny
  418.      end
  419.      $game_variables[400] = $currentDexSearch[0]
  420.       $currentDexSearch = nil
  421.     end
  422. }
  423.    
  424.  
  425. class DexNav
  426.  
  427.   # This method triggers every time the dexnav is used (1 more to the chain)
  428.   # It recalculates the odds for a shiny, adds egg moves and so on
  429.   # It updates into $dexNavData which is retrieved with getThisPokemonData
  430.   def self.addToChain
  431.     $dexNavData=0 if !$dexNavData
  432.     $dexNavData+=1
  433.   end
  434.  
  435.  
  436.   # This method gets the appropriate shiny rate multiplier for a certain chain value
  437.   def self.getShinyMultiplier(datum)
  438.     value=1
  439.     if datum[0]<80
  440.       return value*datum[0]
  441.     else
  442.       return 80
  443.     end
  444.   end
  445.  
  446.   # This method gets a random ID of a legal egg move and returns it as a move object.
  447.   def self.addRandomEggMove(species)
  448.     baby = pbGetBabySpecies(species)
  449.     egg = pbGetSpeciesEggMoves(baby)
  450.     moveChoice = rand(egg.length)
  451.     moves = egg[moveChoice]
  452.     return moves
  453.   end
  454.  
  455. end
  456.  
  457.  
  458.  
  459.  
  460.  
  461.  
  462. #Tech here- $viewport1 was giving me all kinds of issues so I decided to
  463. #make a whole class for displaying the 'mon, based on the code for the LocationWindow
  464. class DexNavWindow
  465.   def initialize(searchtext)
  466.     @window = Window_UnformattedTextPokemon.newWithSize("",345,260,170,126)
  467.     @window.text = _INTL("{1}\n{2}\n{3}",searchtext[0],searchtext[1],searchtext[2])
  468.     @window.viewport = Viewport.new(0,0,Graphics.width,Graphics.height)
  469.     @window.viewport.z = 99999
  470.     @currentmap = $game_map.map_id
  471.     @frames = 0
  472.     searchmon=searchtext[0]
  473.     @sprites = {}
  474.     #GameData::Species.get(searchmon).id
  475.     @sprites["searchIcon"] = PokemonSpeciesIconSprite.new(searchmon,@window.viewport)
  476.     @sprites["searchIcon"].x = 450
  477.     @sprites["searchIcon"].y = 200
  478.   end
  479.  
  480.   def disposed?
  481.     @window.disposed?
  482.   end
  483.  
  484.   def dispose
  485.     @window.dispose
  486.     pbDisposeSpriteHash(@sprites)
  487.   end
  488.  
  489.   def update
  490.     return if @window.disposed?
  491.     @window.update
  492.     @sprites["searchIcon"].refresh
  493.     if @currentmap!=$game_map.map_id
  494.       dispose
  495.       return
  496.     end
  497.   end
  498. end
  499.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement