Advertisement
TechSkylander1518

Level Caps Fix

Apr 20th, 2021 (edited)
72
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Ruby 16.25 KB | None | 0 0
  1. #==============================================================================#
  2. #\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\#
  3. #==============================================================================#
  4. #                                                                              #
  5. #                        Simple Customizable Level Caps                        #
  6. #                                     v1.0                                     #
  7. #                               By Golisopod User                              #
  8. #                                                                              #
  9. #==============================================================================#
  10. #\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\#
  11. #==============================================================================#
  12. #                                                                              #
  13. # Implements very simple level caps feature in Pokemon Essentials. The script  #
  14. # not only blocks gaining experience in battle. It also prevents any level     #
  15. # up attempts outside battles. It also blocks any attempts to use Rare Candies #
  16. # and EXP Candies. There are 2 main Level Cap methods in this script.          #
  17. #                                                                              #
  18. # Hard Cap: Similar to Pokemon Reborn, the Pokemon will not gain any exp       #
  19. #           once it has reached the Level Cap. It will block usage of all      #
  20. #           items as well.                                                     #
  21. #                                                                              #
  22. # Soft Cap: Similar to Pokemon Clover, the Pokemon will only gain a fraction   #
  23. #           exp it would gain once it has reached the Level Cap. It will block #
  24. #           usage of all items as well.                                        #
  25. #                                                                              #
  26. # This Script is meant for the default Essentials v18. I have no plan for      #
  27. # supporting older versions.                                                   #
  28. #                                                                              #
  29. #==============================================================================#
  30. #                              INSTRUCTIONS                                    #
  31. #------------------------------------------------------------------------------#
  32. # 1. Place this in a New Script Section above Main                             #
  33. # 2. Edit the Customizable Options                                             #
  34. # 3. Start a new save (Not nescessary, but just to be on the safe side)        #
  35. #                                                                              #
  36. # Note that the level caps aren't applied when in Debug Mode.                  #
  37. #------------------------------------------------------------------------------#
  38. #                          CUSTOMIZABLE OPTIONS                                #
  39. #==============================================================================#
  40. GYM_BASED = true # Set this to true if you want the Lv Caps to use the number of
  41.                  # badges as the factor to decide the level cap
  42.  
  43. HARD_CAP = false # Set this to true if you want the Lv Caps to use the number of
  44.                  # badges as the factor to decide the level cap
  45.  
  46. VARIABLE_USED = 0 # Set this to a game variable number if you want the Lv Caps
  47.                   # to use a value other than game variables. If this is set
  48.                   # then GYM_BASED must be set to false.
  49.  
  50. LEVEL_CAPS = [10,20,30,40,50,60,70,80,100] # Array to store the level caps.
  51.                                            # The cap is determined by Array
  52.                                            # Index. So if tour variable is value
  53.                                            # 4 or you are at the 4th Gym, then the
  54.                                            # cap will be the the (4+1)th value
  55.                                            # in the array. (In this case 50)
  56. #==============================================================================#
  57. #//////////////////////////////////////////////////////////////////////////////#
  58. #==============================================================================#
  59.  
  60. class PokeBattle_Battle
  61.   def pbGainExpOne(idxParty,defeatedBattler,numPartic,expShare,expAll,showMessages=true)
  62.     pkmn = pbParty(0)[idxParty]   # The Pokémon gaining EVs from defeatedBattler
  63.     growthRate = pkmn.growthrate
  64.     # Don't bother calculating if gainer is already at max Exp
  65.     if pkmn.exp>=PBExperience.pbGetMaxExperience(growthRate)
  66.       pkmn.calcStats   # To ensure new EVs still have an effect
  67.       return
  68.     end
  69.     isPartic    = defeatedBattler.participants.include?(idxParty)
  70.     hasExpShare = expShare.include?(idxParty)
  71.     level = defeatedBattler.level
  72.     # Main Exp calculation
  73.     exp = 0
  74.     a = level*defeatedBattler.pokemon.baseExp
  75.     if expShare.length>0 && (isPartic || hasExpShare)
  76.       if numPartic==0   # No participants, all Exp goes to Exp Share holders
  77.         exp = a/(SPLIT_EXP_BETWEEN_GAINERS ? expShare.length : 1)
  78.       elsif SPLIT_EXP_BETWEEN_GAINERS   # Gain from participating and/or Exp Share
  79.         exp = a/(2*numPartic) if isPartic
  80.         exp += a/(2*expShare.length) if hasExpShare
  81.       else   # Gain from participating and/or Exp Share (Exp not split)
  82.         exp = (isPartic) ? a : a/2
  83.       end
  84.     elsif isPartic   # Participated in battle, no Exp Shares held by anyone
  85.       exp = a/(SPLIT_EXP_BETWEEN_GAINERS ? numPartic : 1)
  86.     elsif expAll   # Didn't participate in battle, gaining Exp due to Exp All
  87.       # NOTE: Exp All works like the Exp Share from Gen 6+, not like the Exp All
  88.       #       from Gen 1, i.e. Exp isn't split between all Pokémon gaining it.
  89.       exp = a/2
  90.     end
  91.     return if exp<=0
  92.     # Pokémon gain more Exp from trainer battles
  93.     exp = (exp*1.5).floor if trainerBattle?
  94.     # Scale the gained Exp based on the gainer's level (or not)
  95.     if SCALED_EXP_FORMULA
  96.       exp /= 5
  97.       levelAdjust = (2*level+10.0)/(pkmn.level+level+10.0)
  98.       levelAdjust = levelAdjust**5
  99.       levelAdjust = Math.sqrt(levelAdjust)
  100.       exp *= levelAdjust
  101.       exp = exp.floor
  102.       exp += 1 if isPartic || hasExpShare
  103.     else
  104.       exp /= 7
  105.     end
  106.     # Foreign Pokémon gain more Exp
  107.     isOutsider = (pkmn.trainerID!=pbPlayer.id ||
  108.                  (pkmn.language!=0 && pkmn.language!=pbPlayer.language))
  109.     if isOutsider
  110.       if pkmn.language!=0 && pkmn.language!=pbPlayer.language
  111.         exp = (exp*1.7).floor
  112.       else
  113.         exp = (exp*1.5).floor
  114.       end
  115.     end
  116.     # Modify Exp gain based on pkmn's held item
  117.     i = BattleHandlers.triggerExpGainModifierItem(pkmn.item,pkmn,exp)
  118.     if i<0
  119.       i = BattleHandlers.triggerExpGainModifierItem(@initialItems[0][idxParty],pkmn,exp)
  120.     end
  121.     exp = (exp*1.5).floor if hasConst?(PBItems,:EXPCHARM) && $PokemonBag.pbHasItem?(:EXPCHARM)
  122.     exp = i if i>=0
  123.     # Make sure Exp doesn't exceed the maximum
  124.     if $game_switches[x] == true
  125.       if GYM_BASED
  126.         levelCap=LEVEL_CAPS[$Trainer.numbadges]
  127.       else
  128.         if $game_variables[VARIABLE_USED].is_a(Numeric)
  129.           levelCap=LEVEL_CAPS[$game_variables[VARIABLE_USED]]
  130.         end
  131.       end
  132.     else
  133.       levelCap = PBExperience.maxLevel
  134.     end
  135.     levelCap = PBExperience.maxLevel if !levelCap.is_a?(Numeric)
  136.     return if pkmn.level>levelCap && !$DEBUG && HARD_CAP
  137.     if pkmn.level>levelCap && !$DEBUG
  138.       if pkmn.level>levelCap+10
  139.         exp = 2
  140.       else
  141.         exp = (exp/100).floor
  142.       end
  143.       exp = 2 if exp < 2
  144.       expFinal=PBExperience.pbAddExperience(pkmn.exp,2,growthRate)
  145.     else
  146.       expFinal=PBExperience.pbAddExperience(pkmn.exp,exp,growthRate)
  147.     end
  148.   #  expFinal=PBExperience.pbAddExperience(pkmn.exp,exp,growthRate)
  149.     expGained = expFinal-pkmn.exp
  150.     return if expGained<=0
  151.     # "Exp gained" message
  152.     if showMessages
  153.       if pkmn.level>levelCap && !$DEBUG
  154.         pbDisplayPaused(_INTL("{1} gained a meager {2} Exp. Points.",pkmn.name,expGained))
  155.       elsif isOutsider
  156.         pbDisplayPaused(_INTL("{1} got a boosted {2} Exp. Points!",pkmn.name,expGained))
  157.       else
  158.         pbDisplayPaused(_INTL("{1} got {2} Exp. Points!",pkmn.name,expGained))
  159.       end
  160.     end
  161.     curLevel = pkmn.level
  162.     newLevel = PBExperience.pbGetLevelFromExperience(expFinal,growthRate)
  163.     if newLevel<curLevel
  164.       debugInfo = "Levels: #{curLevel}->#{newLevel} | Exp: #{pkmn.exp}->#{expFinal} | gain: #{expGained}"
  165.       raise RuntimeError.new(
  166.          _INTL("{1}'s new level is less than its\r\ncurrent level, which shouldn't happen.\r\n[Debug: {2}]",
  167.          pkmn.name,debugInfo))
  168.     end
  169.     # Give Exp
  170.     if pkmn.shadowPokemon?
  171.       pkmn.exp += expGained
  172.       return
  173.     end
  174.     tempExp1 = pkmn.exp
  175.     battler = pbFindBattler(idxParty)
  176.     loop do   # For each level gained in turn...
  177.       # EXP Bar animation
  178.       levelMinExp = PBExperience.pbGetStartExperience(curLevel,growthRate)
  179.       levelMaxExp = PBExperience.pbGetStartExperience(curLevel+1,growthRate)
  180.       tempExp2 = (levelMaxExp<expFinal) ? levelMaxExp : expFinal
  181.       pkmn.exp = tempExp2
  182.       @scene.pbEXPBar(battler,levelMinExp,levelMaxExp,tempExp1,tempExp2)
  183.       tempExp1 = tempExp2
  184.       curLevel += 1
  185.       if curLevel>newLevel
  186.         # Gained all the Exp now, end the animation
  187.         pkmn.calcStats
  188.         battler.pbUpdate(false) if battler
  189.         @scene.pbRefreshOne(battler.index) if battler
  190.         break
  191.       end
  192.       # Levelled up
  193.       pbCommonAnimation("LevelUp",battler) if battler
  194.       oldTotalHP = pkmn.totalhp
  195.       oldAttack  = pkmn.attack
  196.       oldDefense = pkmn.defense
  197.       oldSpAtk   = pkmn.spatk
  198.       oldSpDef   = pkmn.spdef
  199.       oldSpeed   = pkmn.speed
  200.       if battler && battler.pokemon
  201.         battler.pokemon.changeHappiness("levelup")
  202.       end
  203.       pkmn.calcStats
  204.       battler.pbUpdate(false) if battler
  205.       @scene.pbRefreshOne(battler.index) if battler
  206.       pbDisplayPaused(_INTL("{1} grew to Lv. {2}!",pkmn.name,curLevel))
  207.       @scene.pbLevelUp(pkmn,battler,oldTotalHP,oldAttack,oldDefense,
  208.                                     oldSpAtk,oldSpDef,oldSpeed)
  209.       # Learn all moves learned at this level
  210.       moveList = pkmn.getMoveList
  211.       moveList.each { |m| pbLearnMove(idxParty,m[1]) if m[0]==curLevel }
  212.     end
  213.   end
  214. end
  215.  
  216. def pbChangeLevel(pkmn,newlevel,scene)
  217.   newlevel = 1 if newlevel<1
  218.   mLevel = PBExperience.maxLevel
  219.   newlevel = mLevel if newlevel>mLevel
  220.   levelCap=mLevel
  221.   if $game_switches[x] == true
  222.     if GYM_BASED
  223.       levelCap=LEVEL_CAPS[$Trainer.numbadges]
  224.     else
  225.       levelCap=LEVEL_CAPS[$game_variables[VARIABLE_USED]]
  226.     end
  227.   end
  228.   levelCap = PBExperience.maxLevel if !levelCap.is_a?(Numeric)
  229.   if newlevel > levelCap && !$DEBUG
  230.     pbMessage(_INTL("{1}'s level remained unchanged.",pkmn.name))
  231.     return false
  232.   elsif pkmn.level==newlevel
  233.     pbMessage(_INTL("{1}'s level remained unchanged.",pkmn.name))
  234.   elsif pkmn.level>newlevel
  235.     attackdiff  = pkmn.attack
  236.     defensediff = pkmn.defense
  237.     speeddiff   = pkmn.speed
  238.     spatkdiff   = pkmn.spatk
  239.     spdefdiff   = pkmn.spdef
  240.     totalhpdiff = pkmn.totalhp
  241.     pkmn.level = newlevel
  242.     pkmn.calcStats
  243.     scene.pbRefresh
  244.     pbMessage(_INTL("{1} dropped to Lv. {2}!",pkmn.name,pkmn.level))
  245.     attackdiff  = pkmn.attack-attackdiff
  246.     defensediff = pkmn.defense-defensediff
  247.     speeddiff   = pkmn.speed-speeddiff
  248.     spatkdiff   = pkmn.spatk-spatkdiff
  249.     spdefdiff   = pkmn.spdef-spdefdiff
  250.     totalhpdiff = pkmn.totalhp-totalhpdiff
  251.     pbTopRightWindow(_INTL("Max. HP<r>{1}\r\nAttack<r>{2}\r\nDefense<r>{3}\r\nSp. Atk<r>{4}\r\nSp. Def<r>{5}\r\nSpeed<r>{6}",
  252.        totalhpdiff,attackdiff,defensediff,spatkdiff,spdefdiff,speeddiff))
  253.     pbTopRightWindow(_INTL("Max. HP<r>{1}\r\nAttack<r>{2}\r\nDefense<r>{3}\r\nSp. Atk<r>{4}\r\nSp. Def<r>{5}\r\nSpeed<r>{6}",
  254.        pkmn.totalhp,pkmn.attack,pkmn.defense,pkmn.spatk,pkmn.spdef,pkmn.speed))
  255.   else
  256.     attackdiff  = pkmn.attack
  257.     defensediff = pkmn.defense
  258.     speeddiff   = pkmn.speed
  259.     spatkdiff   = pkmn.spatk
  260.     spdefdiff   = pkmn.spdef
  261.     totalhpdiff = pkmn.totalhp
  262.     pkmn.level = newlevel
  263.     pkmn.changeHappiness("vitamin")
  264.     pkmn.calcStats
  265.     scene.pbRefresh
  266.     if scene.is_a?(PokemonPartyScreen)
  267.       scene.pbDisplay(_INTL("{1} grew to Lv. {2}!",pkmn.name,pkmn.level))
  268.     else
  269.       pbMessage(_INTL("{1} grew to Lv. {2}!",pkmn.name,pkmn.level))
  270.     end
  271.     attackdiff  = pkmn.attack-attackdiff
  272.     defensediff = pkmn.defense-defensediff
  273.     speeddiff   = pkmn.speed-speeddiff
  274.     spatkdiff   = pkmn.spatk-spatkdiff
  275.     spdefdiff   = pkmn.spdef-spdefdiff
  276.     totalhpdiff = pkmn.totalhp-totalhpdiff
  277.     pbTopRightWindow(_INTL("Max. HP<r>+{1}\r\nAttack<r>+{2}\r\nDefense<r>+{3}\r\nSp. Atk<r>+{4}\r\nSp. Def<r>+{5}\r\nSpeed<r>+{6}",
  278.        totalhpdiff,attackdiff,defensediff,spatkdiff,spdefdiff,speeddiff),scene)
  279.     pbTopRightWindow(_INTL("Max. HP<r>{1}\r\nAttack<r>{2}\r\nDefense<r>{3}\r\nSp. Atk<r>{4}\r\nSp. Def<r>{5}\r\nSpeed<r>{6}",
  280.        pkmn.totalhp,pkmn.attack,pkmn.defense,pkmn.spatk,pkmn.spdef,pkmn.speed),scene)
  281.     # Learn new moves upon level up
  282.     movelist = pkmn.getMoveList
  283.     for i in movelist
  284.       next if i[0]!=pkmn.level
  285.       pbLearnMove(pkmn,i[1],true) { scene.pbUpdate }
  286.     end
  287.     # Check for evolution
  288.     newspecies = pbCheckEvolution(pkmn)
  289.     if newspecies>0
  290.       pbFadeOutInWithMusic {
  291.         evo = PokemonEvolutionScene.new
  292.         evo.pbStartScreen(pkmn,newspecies)
  293.         evo.pbEvolution
  294.         evo.pbEndScreen
  295.         scene.pbRefresh if scene.is_a?(PokemonPartyScreen)
  296.       }
  297.     end
  298.   end
  299. end
  300.  
  301. ItemHandlers::UseOnPokemon.add(:RARECANDY,proc { |item,pkmn,scene|
  302.   levelCap=PBExperience.maxLevel
  303.   if $game_switches[x] == true
  304.     if GYM_BASED
  305.       levelCap=LEVEL_CAPS[$Trainer.numbadges]
  306.     else
  307.       levelCap=LEVEL_CAPS[$game_variables[VARIABLE_USED]]
  308.     end
  309.   end
  310.     levelCap = PBExperience.maxLevel if !levelCap.is_a?(Numeric)
  311.   if pkmn.level>=PBExperience.maxLevel || pkmn.shadowPokemon?
  312.     scene.pbDisplay(_INTL("It won't have any effect."))
  313.     next false
  314.   elsif pkmn.level>levelCap && !$DEBUG
  315.     scene.pbDisplay(_INTL("{1} refuses to eat the Rare Candy.",pkmn.name))
  316.     next false
  317.   end
  318.   pbChangeLevel(pkmn,pkmn.level+1,scene)
  319.   scene.pbHardRefresh
  320.   next true
  321. })
  322.  
  323. ItemHandlers::UseOnPokemon.add(:EXPCANDYXS,proc { |item,pkmn,scene|
  324.    if pkmn.level>=PBExperience::maxLevel || (pokemon.isShadow? rescue false)
  325.      scene.pbDisplay(_INTL("It won't have any effect."))
  326.      next false
  327.    else
  328.      experience=100   if isConst?(item,PBItems,:EXPCANDYXS)
  329.      experience=800   if isConst?(item,PBItems,:EXPCANDYS)
  330.      experience=3000  if isConst?(item,PBItems,:EXPCANDYM)
  331.      experience=10000 if isConst?(item,PBItems,:EXPCANDYL)
  332.      experience=30000 if isConst?(item,PBItems,:EXPCANDYXL)
  333.      newexp=PBExperience.pbAddExperience(pkmn.exp,experience,pkmn.growthrate)
  334.      newlevel=PBExperience.pbGetLevelFromExperience(newexp,pkmn.growthrate)
  335.      curlevel=pkmn.level
  336.      leveldif = newlevel - curlevel
  337.      levelCap=PBExperience.maxLevel
  338.     if $game_switches[x] == true
  339.       if GYM_BASED
  340.         levelCap=LEVEL_CAPS[$Trainer.numbadges]
  341.       else
  342.         levelCap=LEVEL_CAPS[$game_variables[VARIABLE_USED]]
  343.       end
  344.     end
  345.      levelCap = PBExperience.maxLevel if !levelCap.is_a?(Numeric)
  346.      if leveldif>1 && newlevel > levelCap && !$DEBUG
  347.        scene.pbDisplay(_INTL("{1} refuses to eat the Candy.",pkmn.name))
  348.        next false
  349.      end
  350.      if PBExperience.pbGetMaxExperience(pkmn.growthrate) < (pkmn.exp + experience)
  351.        scene.pbDisplay(_INTL("Your Pokémon gained {1} Exp. Points!",(PBExperience.pbGetMaxExperience(pkmn.growthrate)-pkmn.exp)))
  352.      else
  353.        scene.pbDisplay(_INTL("Your Pokémon gained {1} Exp. Points!",experience))
  354.      end
  355.      if newlevel==curlevel
  356.        pkmn.exp=newexp
  357.        pkmn.calcStats
  358.        scene.pbRefresh
  359.      else
  360.        leveldif.times do
  361.          pbChangeLevel(pkmn,pkmn.level+1,scene)
  362.          scene.pbHardRefresh
  363.        end
  364.        next true
  365.      end
  366.    end
  367. })
  368.  
  369. ItemHandlers::UseOnPokemon.copy(:EXPCANDYXS,:EXPCANDYS,:EXPCANDYM,:EXPCANDYL,:EXPCANDYXL)
  370.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement