module PokemonDebugMixin def pbPokemonDebugCommands(settingUpBattle=false) commands = CommandMenuList.new commands.add("main","hpstatusmenu",_INTL("HP/Status...")) commands.add("hpstatusmenu","sethp",_INTL("Set HP")) commands.add("hpstatusmenu","setstatus",_INTL("Set status")) commands.add("hpstatusmenu","fullheal",_INTL("Fully heal")) commands.add("hpstatusmenu","makefainted",_INTL("Make fainted")) commands.add("hpstatusmenu","setpokerus",_INTL("Set Pokérus")) commands.add("main","levelstats",_INTL("Level/stats...")) commands.add("levelstats","setlevel",_INTL("Set level")) commands.add("levelstats","setexp",_INTL("Set Exp")) commands.add("levelstats","hiddenvalues",_INTL("EV/IV/pID...")) commands.add("levelstats","sethappiness",_INTL("Set happiness")) commands.add("levelstats","conteststats",_INTL("Contest stats...")) commands.add("conteststats","setbeauty",_INTL("Set Beauty")) commands.add("conteststats","setcool",_INTL("Set Cool")) commands.add("conteststats","setcute",_INTL("Set Cute")) commands.add("conteststats","setsmart",_INTL("Set Smart")) commands.add("conteststats","settough",_INTL("Set Tough")) commands.add("conteststats","setsheen",_INTL("Set Sheen")) commands.add("main","moves",_INTL("Moves...")) commands.add("moves","teachmove",_INTL("Teach move")) commands.add("moves","forgetmove",_INTL("Forget move")) commands.add("moves","resetmoves",_INTL("Reset moves")) commands.add("moves","setmovepp",_INTL("Set move PP")) commands.add("moves","setinitialmoves",_INTL("Reset initial moves")) commands.add("main","setability",_INTL("Set ability")) commands.add("main","setnature",_INTL("Set nature")) commands.add("main","setgender",_INTL("Set gender")) commands.add("main","speciesform",_INTL("Species/form...")) commands.add("main","cosmetic",_INTL("Cosmetic info...")) commands.add("cosmetic","setshininess",_INTL("Set shininess")) commands.add("cosmetic","setpokeball",_INTL("Set Poké Ball")) commands.add("cosmetic","setribbons",_INTL("Set ribbons")) commands.add("cosmetic","setnickname",_INTL("Set nickname")) commands.add("cosmetic","ownership",_INTL("Ownership...")) commands.add("main","setegg",_INTL("Set egg")) commands.add("main","shadowpkmn",_INTL("Shadow Pkmn...")) if !settingUpBattle commands.add("main","mysterygift",_INTL("Mystery Gift")) commands.add("main","duplicate",_INTL("Duplicate")) commands.add("main","delete",_INTL("Delete")) end return commands end def pbPokemonDebugActions(command,pkmn,pkmnid,heldpoke=nil,settingUpBattle=false) case command #=========================================================================== when "sethp" if pkmn.egg? pbDisplay(_INTL("{1} is an egg.",pkmn.name)) else params = ChooseNumberParams.new params.setRange(0,pkmn.totalhp) params.setDefaultValue(pkmn.hp) newhp = pbMessageChooseNumber( _INTL("Set {1}'s HP (max. {2}).",pkmn.name,pkmn.totalhp),params) { pbUpdate } if newhp!=pkmn.hp pkmn.hp = newhp pbRefreshSingle(pkmnid) end end #=========================================================================== when "setstatus" if pkmn.egg? pbDisplay(_INTL("{1} is an egg.",pkmn.name)) elsif pkmn.hp<=0 pbDisplay(_INTL("{1} is fainted, can't change status.",pkmn.name)) else cmd = 0 loop do cmd = pbShowCommands(_INTL("Set {1}'s status.",pkmn.name),[ _INTL("[Cure]"), _INTL("Sleep"), _INTL("Poison"), _INTL("Burn"), _INTL("Paralysis"), _INTL("Frozen") ],cmd) break if cmd<0 case cmd when 0 # Cure pkmn.healStatus pbDisplay(_INTL("{1}'s status was cured.",pkmn.name)) pbRefreshSingle(pkmnid) else # Give status problem count = 0 cancel = false if cmd==PBStatuses::SLEEP params = ChooseNumberParams.new params.setRange(0,9) params.setDefaultValue(3) count = pbMessageChooseNumber( _INTL("Set the Pokémon's sleep count."),params) { pbUpdate } cancel = true if count<=0 end if !cancel pkmn.status = cmd pkmn.statusCount = count pbRefreshSingle(pkmnid) end end end end #=========================================================================== when "fullheal" if pkmn.egg? pbDisplay(_INTL("{1} is an egg.",pkmn.name)) else pkmn.heal pbDisplay(_INTL("{1} was fully healed.",pkmn.name)) pbRefreshSingle(pkmnid) end #=========================================================================== when "makefainted" if pkmn.egg? pbDisplay(_INTL("{1} is an egg.",pkmn.name)) else pkmn.hp = 0 pbRefreshSingle(pkmnid) end #=========================================================================== when "setpokerus" cmd = 0 loop do pokerus = (pkmn.pokerus) ? pkmn.pokerus : 0 msg = [_INTL("{1} doesn't have Pokérus.",pkmn.name), _INTL("Has strain {1}, infectious for {2} more days.",pokerus/16,pokerus%16), _INTL("Has strain {1}, not infectious.",pokerus/16)][pkmn.pokerusStage] cmd = pbShowCommands(msg,[ _INTL("Give random strain"), _INTL("Make not infectious"), _INTL("Clear Pokérus")],cmd) break if cmd<0 case cmd when 0 # Give random strain pkmn.givePokerus pbRefreshSingle(pkmnid) when 1 # Make not infectious if pokerus>0 strain = pokerus/16 p = strain << 4 pkmn.pokerus = p pbRefreshSingle(pkmnid) end when 2 # Clear Pokérus pkmn.pokerus = 0 pbRefreshSingle(pkmnid) end end #=========================================================================== when "setlevel" if pkmn.egg? pbDisplay(_INTL("{1} is an egg.",pkmn.name)) else mLevel = PBExperience.maxLevel params = ChooseNumberParams.new params.setRange(1,mLevel) params.setDefaultValue(pkmn.level) level = pbMessageChooseNumber( _INTL("Set the Pokémon's level (max. {1}).",mLevel),params) { pbUpdate } if level!=pkmn.level pkmn.level = level pkmn.calcStats pbRefreshSingle(pkmnid) end end #=========================================================================== when "setexp" if pkmn.egg? pbDisplay(_INTL("{1} is an egg.",pkmn.name)) else minxp = PBExperience.pbGetStartExperience(pkmn.level,pkmn.growthrate) maxxp = PBExperience.pbGetStartExperience(pkmn.level+1,pkmn.growthrate) if minxp==maxxp pbDisplay(_INTL("{1} is at the maximum level.",pkmn.name)) else params = ChooseNumberParams.new params.setRange(minxp,maxxp-1) params.setDefaultValue(pkmn.exp) newexp = pbMessageChooseNumber( _INTL("Set the Pokémon's Exp (range {1}-{2}).",minxp,maxxp-1),params) { pbUpdate } if newexp!=pkmn.exp pkmn.exp = newexp pkmn.calcStats pbRefreshSingle(pkmnid) end end end #=========================================================================== when "hiddenvalues" numstats = 6 cmd = 0 loop do persid = sprintf("0x%08X",pkmn.personalID) cmd = pbShowCommands(_INTL("Personal ID is {1}.",persid),[ _INTL("Set EVs"), _INTL("Set IVs"), _INTL("Randomise pID")],cmd) break if cmd<0 case cmd when 0 # Set EVs cmd2 = 0 loop do totalev = 0 evcommands = [] for i in 0...numstats evcommands.push(PBStats.getName(i)+" (#{pkmn.ev[i]})") totalev += pkmn.ev[i] end evcommands.push(_INTL("Randomise all")) evcommands.push(_INTL("Max randomise all")) cmd2 = pbShowCommands(_INTL("Change which EV?\nTotal: {1}/{2} ({3}%)", totalev, Pokemon::EV_LIMIT, 100*totalev/Pokemon::EV_LIMIT), evcommands, cmd2) break if cmd2<0 if cmd20 r = rand(numstats) next if pkmn.ev[r]>=Pokemon::EV_STAT_LIMIT addVal = 1+rand(Pokemon::EV_STAT_LIMIT/4) addVal = evTotalTarget if addVal>evTotalTarget addVal = [addVal, Pokemon::EV_STAT_LIMIT-pkmn.ev[r]].min next if addVal==0 pkmn.ev[r] += addVal evTotalTarget -= addVal end pkmn.calcStats pbRefreshSingle(pkmnid) end end when 1 # Set IVs cmd2 = 0 loop do hiddenpower = pbHiddenPower(pkmn) totaliv = 0 ivcommands = [] for i in 0...numstats ivcommands.push(PBStats.getName(i)+" (#{pkmn.iv[i]})") totaliv += pkmn.iv[i] end msg = _INTL("Change which IV?\nHidden Power:\n{1}, power {2}\nTotal: {3}/{4} ({5}%)", PBTypes.getName(hiddenpower[0]),hiddenpower[1],totaliv,numstats*31, 100*totaliv/(numstats*31)) ivcommands.push(_INTL("Randomise all")) cmd2 = pbShowCommands(msg,ivcommands,cmd2) break if cmd2<0 if cmd2=0 movename = PBMoves.getName(pkmn.moves[moveindex].id) pkmn.pbDeleteMoveAtIndex(moveindex) pbDisplay(_INTL("{1} forgot {2}.",pkmn.name,movename)) pbRefreshSingle(pkmnid) end #=========================================================================== when "resetmoves" pkmn.resetMoves pbDisplay(_INTL("{1}'s moves were reset.",pkmn.name)) pbRefreshSingle(pkmnid) #=========================================================================== when "setmovepp" cmd = 0 loop do commands = [] for i in pkmn.moves break if i.id==0 if i.totalpp<=0 commands.push(_INTL("{1} (PP: ---)",PBMoves.getName(i.id))) else commands.push(_INTL("{1} (PP: {2}/{3})",PBMoves.getName(i.id),i.pp,i.totalpp)) end end commands.push(_INTL("Restore all PP")) cmd = pbShowCommands(_INTL("Alter PP of which move?"),commands,cmd) break if cmd<0 if cmd>=0 && cmdmove.totalpp end end end elsif cmd==commands.length-1 # Restore all PP pkmn.healPP end end #=========================================================================== when "setinitialmoves" pkmn.pbRecordFirstMoves pbDisplay(_INTL("{1}'s moves were set as its first-known moves.",pkmn.name)) pbRefreshSingle(pkmnid) #=========================================================================== when "setability" cmd = 0 loop do abils = pkmn.getAbilityList oldabil = PBAbilities.getName(pkmn.ability) commands = [] for i in abils commands.push(((i[1]<2) ? "" : "(H) ")+PBAbilities.getName(i[0])) end commands.push(_INTL("Remove override")) msg = [_INTL("Ability {1} is natural.",oldabil), _INTL("Ability {1} is being forced.",oldabil)][pkmn.abilityflag!=nil ? 1 : 0] cmd = pbShowCommands(msg,commands,cmd) break if cmd<0 if cmd>=0 && cmd=0 && cmd0 end balls.sort! { |a,b| a[1]<=>b[1] } cmd = 0 for i in 0...balls.length if balls[i][0]==pkmn.ballused cmd = i; break end end for i in balls commands.push(i[1]) end loop do oldball = PBItems.getName(pbBallTypeToItem(pkmn.ballused)) cmd = pbShowCommands(_INTL("{1} used.",oldball),commands,cmd) break if cmd<0 pkmn.ballused = balls[cmd][0] end #=========================================================================== when "setribbons" cmd = 0 loop do commands = [] for i in 1..PBRibbons.maxValue commands.push(_INTL("{1} {2}", (pkmn.hasRibbon?(i)) ? "[Y]" : "[ ]",PBRibbons.getName(i))) end commands.push(_INTL("Give all")) commands.push(_INTL("Clear all")) cmd = pbShowCommands(_INTL("{1} ribbons.",pkmn.ribbonCount),commands,cmd) break if cmd<0 if cmd>=0 && cmd=0 when 3 # Random foreign ID pkmn.trainerID = $Trainer.getForeignID when 4 # Set foreign ID params = ChooseNumberParams.new params.setRange(0,65535) params.setDefaultValue(pkmn.publicID) val = pbMessageChooseNumber( _INTL("Set the new ID (max. 65535)."),params) { pbUpdate } pkmn.trainerID = val pkmn.trainerID |= val << 16 end end #=========================================================================== when "setegg" cmd = 0 loop do msg = [_INTL("Not an egg"), _INTL("Egg with eggsteps: {1}.",pkmn.eggsteps)][pkmn.egg? ? 1 : 0] cmd = pbShowCommands(msg,[ _INTL("Make egg"), _INTL("Make Pokémon"), _INTL("Set eggsteps to 1")],cmd) break if cmd<0 case cmd when 0 # Make egg if !pkmn.egg? && (pbHasEgg?(pkmn.species) || pbConfirm(_INTL("{1} cannot legally be an egg. Make egg anyway?",PBSpecies.getName(pkmn.species)))) pkmn.level = EGG_LEVEL pkmn.calcStats pkmn.name = _INTL("Egg") pkmn.eggsteps = pbGetSpeciesData(pkmn.species,pkmn.form,SpeciesData::STEPS_TO_HATCH) pkmn.hatchedMap = 0 pkmn.obtainMode = 1 pbRefreshSingle(pkmnid) end when 1 # Make Pokémon if pkmn.egg? pkmn.name = PBSpecies.getName(pkmn.species) pkmn.eggsteps = 0 pkmn.hatchedMap = 0 pkmn.obtainMode = 0 pbRefreshSingle(pkmnid) end when 2 # Set eggsteps to 1 pkmn.eggsteps = 1 if pkmn.egg? end end #=========================================================================== when "shadowpkmn" cmd = 0 loop do msg = [_INTL("Not a Shadow Pokémon."), _INTL("Heart gauge is {1} (stage {2}).",pkmn.heartgauge,pkmn.heartStage) ][pkmn.shadowPokemon? ? 1 : 0] cmd = pbShowCommands(msg,[ _INTL("Make Shadow"), _INTL("Set heart gauge")],cmd) break if cmd<0 case cmd when 0 # Make Shadow if !pkmn.shadowPokemon? pkmn.makeShadow pbRefreshSingle(pkmnid) else pbDisplay(_INTL("{1} is already a Shadow Pokémon.",pkmn.name)) end when 1 # Set heart gauge if pkmn.shadowPokemon? oldheart = pkmn.heartgauge params = ChooseNumberParams.new params.setRange(0, Pokemon::HEARTGAUGESIZE) params.setDefaultValue(pkmn.heartgauge) val = pbMessageChooseNumber( _INTL("Set the heart gauge (max. {1}).", Pokemon::HEARTGAUGESIZE), params) { pbUpdate } if val!=oldheart pkmn.adjustHeart(val-oldheart) pbReadyToPurify(pkmn) end else pbDisplay(_INTL("{1} is not a Shadow Pokémon.",pkmn.name)) end end end #=========================================================================== when "mysterygift" pbCreateMysteryGift(0,pkmn) #=========================================================================== when "duplicate" if pbConfirm(_INTL("Are you sure you want to copy this Pokémon?")) clonedpkmn = pkmn.clone if self.is_a?(PokemonPartyScreen) pbStorePokemon(clonedpkmn) pbHardRefresh pbDisplay(_INTL("The Pokémon was duplicated.")) elsif self.is_a?(PokemonStorageScreen) if @storage.pbMoveCaughtToParty(clonedpkmn) if pkmnid[0]!=-1 pbDisplay(_INTL("The duplicated Pokémon was moved to your party.")) end else oldbox = @storage.currentBox newbox = @storage.pbStoreCaught(clonedpkmn) if newbox<0 pbDisplay(_INTL("All boxes are full.")) elsif newbox!=oldbox pbDisplay(_INTL("The duplicated Pokémon was moved to box \"{1}.\"",@storage[newbox].name)) @storage.currentBox = oldbox end end pbHardRefresh end return false end #=========================================================================== when "delete" if pbConfirm(_INTL("Are you sure you want to delete this Pokémon?")) if self.is_a?(PokemonPartyScreen) @party[pkmnid] = nil @party.compact! pbHardRefresh elsif self.is_a?(PokemonStorageScreen) @scene.pbRelease(pkmnid,heldpoke) (heldpoke) ? @heldpkmn = nil : @storage.pbDelete(pkmnid[0],pkmnid[1]) @scene.pbRefresh end return false end end return true end def pbPokemonDebug(pkmn,pkmnid,heldpoke=nil,settingUpBattle=false) command = 0 commands = pbPokemonDebugCommands(settingUpBattle) loop do command = pbShowCommands(_INTL("Do what with {1}?",pkmn.name),commands.list,command) if command<0 parent = commands.getParent if parent commands.currentList = parent[0] command = parent[1] else break end else cmd = commands.getCommand(command) if commands.hasSubMenu?(cmd) commands.currentList = cmd command = 0 else cont = pbPokemonDebugActions(cmd,pkmn,pkmnid,heldpoke,settingUpBattle) break if !cont end end end end end class PokemonPartyScreen include PokemonDebugMixin end class PokemonStorageScreen include PokemonDebugMixin end class PokemonDebugPartyScreen include PokemonDebugMixin end