Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- PluginManager.register({
- :name => "Better DexNav",
- :version => "1.0",
- :credits => ["Phantombass, with portions of code taken from:","Suzerain","Nuri Yuri","Developers of SimpleEncounterUI"],
- :link => "https://reliccastle.com/resources/520/"
- })
- class Trainer
- attr_accessor :searchlvl
- @searchlvl = []
- end
- class PokeBattle_Battle
- def pbSetSeen(battler)
- return if !battler || !@internalBattle
- pbPlayer.pokedex.register(battler.displaySpecies,battler.displayGender,battler.displayForm)
- if pbPlayer.searchlvl
- pbPlayer.searchlvl[GameData::Species.get(battler.displaySpecies).id_number] += 1
- else
- pbPlayer.searchlvl = []
- GameData::Species.each do |sp|
- pbPlayer.searchlvl[sp.id_number] = 0
- end
- pbPlayer.searchlvl[GameData::Species.get(battler.displaySpecies).id_number] += 1
- end
- end
- end
- class NewDexNav
- def initialize
- @viewport1 = Viewport.new(0, 0, Graphics.width, Graphics.height)
- @viewport1.z = 99999
- @viewport2 = Viewport.new(30, 60, Graphics.width, Graphics.height)
- @viewport2.z = 999999
- @viewport3 = Viewport.new(0, 60, Graphics.width, Graphics.height)
- @viewport3.z = 999999
- searchmon = 0
- @sprites = {}
- @encarray = []
- @pkmnsprite = []
- @navChoice = 0
- @form = 0
- navAbil = []
- @ab = []
- encstringarray = [] # Savordez simplified this on discord but I kept it for me to understand better
- @encarray = getEncData
- # Following variable is unused, but can be a good sub in if you need it
- #textColor=["0070F8,78B8E8","E82010,F8A8B8","0070F8,78B8E8"][$Trainer.gender]
- loctext = _INTL("<ac><c2=43F022E8>{1}</c2></ac>", $game_map.name)
- temparray = @encarray.dup # doing `if @encarray.pop==7` actually pops the last species off before the loop!
- if temparray.pop==7 # i picked 7 cause funny
- loctext += sprintf("<al><c2=7FF05EE8>This area has no encounters</c2></al>")
- loctext += sprintf("<c2=63184210>-----------------------------------------</c2>")
- else
- i = 0
- @encarray.each do |specie|
- encstringarray.push(GameData::Species.get(specie).name)#+", ")
- if !$Trainer.seen?(specie)
- @pkmnsprite[i]=PokemonSpeciesIconSprite.new(000,@viewport2)
- else
- @pkmnsprite[i]=PokemonSpeciesIconSprite.new(specie,@viewport2)
- end
- if i > 6 && i < 14
- @pkmnsprite[i].y += 64
- @pkmnsprite[i].x = (64 * (i-7))
- elsif i > 13
- @pkmnsprite[i].y += 128
- @pkmnsprite[i].x = (64 * (i-14))
- else
- @pkmnsprite[i].x += 64 * i
- end
- i +=1
- end
- #loctext += sprintf("<al><c2=7FF05EE8>Total encounters for area: %s</c2></al>",@encarray.length)
- # loctext += sprintf("<c2=63184210>-----------------------------------------</c2>")
- #loctext += sprintf("<al>%s</al>",encstringarray.join(", "))#.map{|a| a.to_s})
- end
- @sprites["locwindow"]=Window_AdvancedTextPokemon.new(loctext)
- @sprites["locwindow"].viewport=@viewport1
- @sprites["locwindow"].x=0
- @sprites["locwindow"].y=0
- @sprites["locwindow"].width=512 #if @sprites["locwindow"].width<420
- @sprites["locwindow"].height=344
- @sprites["locwindow"].visible=true
- @sprites["nav"] = AnimatedSprite.new("Graphics/Pictures/rightarrow",8,40,28,2,@viewport3)
- @sprites["nav"].x = 5
- @sprites["nav"].y = 18
- @sprites["nav"].visible
- @sprites["nav"].play
- pbFadeInAndShow(@sprites)
- main
- end
- def pbUpdate
- pbUpdateSpriteHash(@sprites)
- end
- def dispose
- pbFadeOutAndHide(@sprites) {pbUpdate}
- pbDisposeSpriteHash(@sprites)
- @viewport1.dispose
- @viewport2.dispose
- @viewport3.dispose
- end
- #From Welsh_One
- def getEncData
- mapid = $game_map.map_id
- encounter_data = GameData::Encounter.get(mapid, $PokemonGlobal.encounter_version)
- encounter_tables = Marshal.load(Marshal.dump(encounter_data.types)) if encounter_data
- currKey = encounter_tables.keys[0] #@index
- keys = encounter_tables.keys
- arr = []
- enc_array = []
- for key in keys
- encounter_tables[key].each { |s| arr.push( s[1] ) }
- GameData::Species.each { |s| enc_array.push(s.id) if arr.include?(s.id) } # From Maruno
- end
- enc_array.uniq!
- return enc_array
- end
- def main
- navMon = 0
- @navChoice = 0
- lastMon = @encarray.length - 1
- if !$Trainer.seen?(@encarray[navMon])
- @sprites["navMon"]=Window_AdvancedTextPokemon.new(_INTL("<ac>\n???</ac>"))
- else
- @sprites["navMon"]=Window_AdvancedTextPokemon.new(_INTL("<ac>\n{1}</ac>",GameData::Species.get(@encarray[navMon]).name))
- end
- @sprites["navMon"].viewport = @viewport1
- @sprites["navMon"].windowskin = nil
- @sprites["navMon"].x=0
- @sprites["navMon"].y=0
- @sprites["navMon"].width=512
- @sprites["navMon"].height=344
- loop do
- Graphics.update
- Input.update
- pbUpdateSpriteHash(@sprites)
- if Input.trigger?(Input::DOWN)
- next if lastMon < 7 && @navChoice < 7
- next if lastMon > 6 && lastMon <14 && @navChoice > 6 && @navChoice < 14
- next if (@navChoice + 7) > lastMon
- @navChoice +=7
- navMon += 7
- @sprites["nav"].y += 64
- if !$Trainer.seen?(@encarray[navMon])
- @sprites["navMon"].text=(_INTL("<ac>\n???</ac>"))
- else
- @sprites["navMon"].text=(_INTL("<ac>\n{1}</ac>",GameData::Species.get(@encarray[navMon]).name))
- end
- elsif Input.trigger?(Input::UP) && @navChoice > 6
- @navChoice -=7
- navMon -=7
- @sprites["nav"].y -= 64
- if !$Trainer.seen?(@encarray[navMon])
- @sprites["navMon"].text=(_INTL("<ac>\n???</ac>"))
- else
- @sprites["navMon"].text=(_INTL("<ac>\n{1}</ac>",GameData::Species.get(@encarray[navMon]).name))
- end
- elsif Input.trigger?(Input::LEFT) && (@navChoice != 0 && @navChoice != 7 && @navChoice != 14)
- @navChoice -=1
- navMon -=1
- @sprites["nav"].x -= 64
- if !$Trainer.seen?(@encarray[navMon])
- @sprites["navMon"].text=(_INTL("<ac>\n???</ac>"))
- else
- @sprites["navMon"].text=(_INTL("<ac>\n{1}</ac>",GameData::Species.get(@encarray[navMon]).name))
- end
- elsif Input.trigger?(Input::RIGHT)
- if @navChoice == 6 || @navChoice == 13 || @navChoice == 20 || @navChoice == lastMon
- next
- elsif (@navChoice !=6 && @navChoice !=13 && @navChoice !=20) || (@navChoice != lastMon)
- @navChoice +=1
- navMon +=1
- @sprites["nav"].x += 64
- if !$Trainer.seen?(@encarray[navMon])
- @sprites["navMon"].text=(_INTL("<ac>\n???</ac>"))
- else
- @sprites["navMon"].text=(_INTL("<ac>\n{1}</ac>",GameData::Species.get(@encarray[navMon]).name))
- end
- end
- elsif Input.trigger?(Input::C)
- if !$Trainer.seen?(@encarray[navMon])
- pbMessage("You cannot search for this Pokémon yet!")
- pbMessage("Try looking for it first to register it to your Pokédex!")
- next
- elsif $currentDexSearch != nil
- pbMessage("You're already searching for one. Try having a look around!")
- @viewport2.dispose
- break
- else
- pbMessage("Searching...")
- if rand(2) == 0
- DexNav.addToChain
- pbMessage("Oh! A Pokémon was found nearby!")
- species=@encarray[@navChoice]
- # We generate the pokemon they found (added to the encounters),
- # giving it some rare "egg moves" to incentivize using this function
- if $Trainer.searchlvl
- else
- $Trainer.searchlvl = []
- GameData::Species.each do |sp|
- $Trainer.searchlvl[sp.id_number] = 0
- end
- end
- searchlvl = $Trainer.searchlvl[GameData::Species.get(species).id_number]
- if searchlvl <5
- chance = 21
- elsif searchlvl<10
- chance = 46
- elsif searchlvl < 25
- chance = 58
- elsif seachlvl < 50
- chance = 63
- elsif searchlvl < 100
- chance = 65
- else
- chance = 83
- end
- test = rand(100)
- if test<=chance
- $currentDexSearch=[species,DexNav.addRandomEggMove(species)]
- else
- $currentDexSearch=[species,nil]
- end
- pbMessage("Try looking in wild Pokémon spots near you- it might appear!")
- pbFadeOutAndHide(@sprites)
- break
- else
- pbMessage("Nothing was found. Try looking somewhere else!")
- end
- end
- elsif Input.trigger?(Input::B)
- navMon = -1
- dispose
- break
- else
- next
- end
- end
- if navMon != -1
- @viewport2.dispose
- main2
- end
- end
- def main2
- searchmon = $currentDexSearch[0]
- navRand = rand(3)
- $game_variables[400] = navRand
- hAbil = GameData::Species.get_species_form(searchmon,@form).hidden_abilities
- navAbil1 = GameData::Species.get_species_form(searchmon,@form).abilities
- #hAbil = pbGetSpeciesData(searchmon,@form,SpeciesHiddenAbility)
- #navAbil1 = pbGetSpeciesData(searchmon,@form,SpeciesAbilities)
- if navAbil1[1] = nil
- navAbil = [navAbil1[0],navAbil1[1],hAbil[0]]
- else
- navAbil = [navAbil1[0],navAbil1[0],hAbil[0]]
- end
- ab = GameData::Ability.get(navAbil[navRand]).name
- #ab = PBAbilities.getName(navAbil[navRand])
- if $currentDexSearch[1]
- move = GameData::Move.get($currentDexSearch[1]).name
- #move = PBMoves.getName($currentDexSearch[1])
- else
- move=""
- end
- Graphics.update
- searchtext = [GameData::Species.get(searchmon).name,ab,move]
- $scene.spriteset.addUserSprite(DexNavWindow.new(searchtext))
- pbFadeInAndShow(@sprites) {pbUpdate}
- $game_switches[350] = true
- end
- end
- Events.onEndBattle += proc { |_sender,e|
- decision = e[0]
- if $game_switches[350] == true
- case decision
- when 1, 4 # Win, capture
- pbMessage("Searching...")
- #if rand(2) == 0
- pbMessage("Oh! A Pokémon was found nearby!")
- species=$game_variables[400]
- # We generate the pokemon they found (added to the encounters),
- # giving it some rare "egg moves" to incentivize using this function
- $currentDexSearch=[species,DexNav.addRandomEggMove(species)]
- pbMessage("Try looking in wild Pokémon spots near you- it might appear!")
- navRand = rand(3)
- $game_variables[400] = navRand
- hAbil = GameData::Species.get_species_form(searchmon,@form).hidden_abilities
- navAbil1 = GameData::Species.get_species_form(searchmon,@form).abilities
- if navAbil1[1] = nil
- navAbil = [navAbil1[0],navAbil1[1],hAbil[0]]
- else
- navAbil = [navAbil1[0],navAbil1[0],hAbil[0]]
- end
- ab = GameData::Ability.get(navAbil[navRand]).name
- move = GameData::Move.get($currentDexSearch[1]).name
- searchtext = [GameData::Species.get(searchmon).name,ab,move]
- DexNav.addToChain
- $scene.spriteset.addUserSprite(DexNavWindow.new(searchtext))
- #else
- # pbMessage("Nothing was found. Try looking somewhere else!")
- # end
- end
- $game_switches[350] = false
- $dexNavData=0
- end
- }
- Events.onMapChanging +=proc {|_sender,e|
- if $game_switches[350] == true
- $currentDexSearch = nil
- $dexNavData=0
- $game_switches[350] = false
- end
- }
- Events.onWildPokemonCreate+=proc {|sender,e|
- pokemon=e[0]
- # Checks current search value, if it exists, sets the Pokemon to it
- if $currentDexSearch != nil && $currentDexSearch.is_a?(Array)
- pokemon.species=$currentDexSearch[0]
- pokemon.level+=($dexNavData/5).floor
- if pokemon.level>100
- pokemon.level=100
- end
- #Sets IV chances based on search level
- if $Trainer.searchlvl
- searchlvl = $Trainer.searchlvl[GameData::Species.get($currentDexSearch[0]).id_number]
- chance = rand(100)
- if searchlvl <5
- star = 0
- elsif searchlvl<10
- if chance <85
- star = 0
- elsif chance <99
- star = 1
- else
- star = 2
- end
- elsif searchlvl < 25
- if chance <73
- star = 0
- elsif chance <90
- star = 1
- elsif chance <99
- star = 2
- else
- star = 3
- end
- elsif seachlvl < 50
- if chance <60
- star = 0
- elsif chance <77
- star = 1
- elsif chance <93
- star = 2
- else
- star = 3
- end
- elsif searchlvl < 100
- if chance <62
- star = 0
- elsif chance <77
- star = 1
- elsif chance <94
- star = 2
- else
- star = 3
- end
- else
- if chance <56
- star = 0
- elsif chance <64
- star = 1
- elsif chance <88
- star = 2
- else
- star = 3
- end
- end
- end
- star.times do
- stat=rand(5)
- loop do
- if pokemon.iv[stat] == 31
- stat=rand(5)
- else
- break
- end
- end
- pokemon.iv[stat] = 31
- end
- pokemon.name=GameData::Species.get(pokemon.species).name
- pokemon.setAbility($game_variables[400])
- pokemon.resetMoves
- pokemon.moves[2]=Pokemon::Move.new($currentDexSearch[1]) if $currentDexSearch[1]
- $game_switches[350] = true
- if $currentDexSearch[1] != $currentDexSearch[2]
- pokemon.moves[3]=Pokemon::Move.new($currentDexSearch[2]) if $currentDexSearch[2]
- end
- # There is a higher chance for shininess, so we give it another chance to force it to be shiny
- tempInt = $PokemonBag.pbHasItem?(:SHINYCHARM) ? 256 : 768
- if rand(tempInt)<=$dexNavData
- pokemon.makeShiny
- end
- $game_variables[400] = $currentDexSearch[0]
- $currentDexSearch = nil
- end
- }
- class DexNav
- # This method triggers every time the dexnav is used (1 more to the chain)
- # It recalculates the odds for a shiny, adds egg moves and so on
- # It updates into $dexNavData which is retrieved with getThisPokemonData
- def self.addToChain
- $dexNavData=0 if !$dexNavData
- $dexNavData+=1
- end
- # This method gets the appropriate shiny rate multiplier for a certain chain value
- def self.getShinyMultiplier(datum)
- value=1
- if datum[0]<80
- return value*datum[0]
- else
- return 80
- end
- end
- # This method gets a random ID of a legal egg move and returns it as a move object.
- def self.addRandomEggMove(species)
- baby = pbGetBabySpecies(species)
- egg = pbGetSpeciesEggMoves(baby)
- moveChoice = rand(egg.length)
- moves = egg[moveChoice]
- return moves
- end
- end
- #Tech here- $viewport1 was giving me all kinds of issues so I decided to
- #make a whole class for displaying the 'mon, based on the code for the LocationWindow
- class DexNavWindow
- def initialize(searchtext)
- @window = Window_UnformattedTextPokemon.newWithSize("",345,260,170,126)
- @window.text = _INTL("{1}\n{2}\n{3}",searchtext[0],searchtext[1],searchtext[2])
- @window.viewport = Viewport.new(0,0,Graphics.width,Graphics.height)
- @window.viewport.z = 99999
- @currentmap = $game_map.map_id
- @frames = 0
- searchmon=searchtext[0]
- @sprites = {}
- #GameData::Species.get(searchmon).id
- @sprites["searchIcon"] = PokemonSpeciesIconSprite.new(searchmon,@window.viewport)
- @sprites["searchIcon"].x = 450
- @sprites["searchIcon"].y = 200
- end
- def disposed?
- @window.disposed?
- end
- def dispose
- @window.dispose
- pbDisposeSpriteHash(@sprites)
- end
- def update
- return if @window.disposed?
- @window.update
- @sprites["searchIcon"].refresh
- if @currentmap!=$game_map.map_id
- dispose
- return
- end
- end
- end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement