Files
infinitefusion-e18/Data/Scripts/018_Alternate battle modes/002_Battle Frontier rules/004_Challenge_LevelAdjustment.rb
2021-05-07 18:23:20 +01:00

228 lines
6.4 KiB
Ruby

#===============================================================================
#
#===============================================================================
class LevelAdjustment
BothTeams = 0
EnemyTeam = 1
MyTeam = 2
BothTeamsDifferent = 3
def initialize(adjustment)
@adjustment = adjustment
end
def type
@adjustment
end
def self.getNullAdjustment(thisTeam, _otherTeam)
ret = []
thisTeam.each_with_index { |pkmn, i| ret[i] = pkmn.level }
return ret
end
def getAdjustment(thisTeam, otherTeam)
return self.getNullAdjustment(thisTeam, otherTeam)
end
def getOldExp(team1, _team2)
ret = []
team1.each_with_index { |pkmn, i| ret[i] = pkmn.exp }
return ret
end
def unadjustLevels(team1, team2, adjustments)
team1.each_with_index do |pkmn, i|
next if !adjustments[0][i] || pkmn.exp == adjustments[0][i]
pkmn.exp = adjustments[0][i]
pkmn.calc_stats
end
team2.each_with_index do |pkmn, i|
next if !adjustments[1][i] || pkmn.exp == adjustments[1][i]
pkmn.exp = adjustments[1][i]
pkmn.calc_stats
end
end
def adjustLevels(team1, team2)
adj1 = nil
adj2 = nil
ret = [getOldExp(team1, team2), getOldExp(team2, team1)]
if @adjustment == BothTeams || @adjustment == MyTeam
adj1 = getAdjustment(team1, team2)
elsif @adjustment == BothTeamsDifferent
adj1 = getMyAdjustment(team1, team2)
end
if @adjustment == BothTeams || @adjustment == EnemyTeam
adj2 = getAdjustment(team2, team1)
elsif @adjustment == BothTeamsDifferent
adj2 = getTheirAdjustment(team2, team1)
end
if adj1
team1.each_with_index do |pkmn, i|
next if pkmn.level == adj1[i]
pkmn.level = adj1[i]
pkmn.calc_stats
end
end
if adj2
team2.each_with_index do |pkmn, i|
next if pkmn.level == adj2[i]
pkmn.level = adj2[i]
pkmn.calc_stats
end
end
return ret
end
end
#===============================================================================
#
#===============================================================================
class FixedLevelAdjustment < LevelAdjustment
def initialize(level)
super(LevelAdjustment::BothTeams)
@level = level.clamp(1, GameData::GrowthRate.max_level)
end
def getAdjustment(thisTeam, _otherTeam)
ret = []
thisTeam.each_with_index { |pkmn, i| ret[i] = @level }
return ret
end
end
#===============================================================================
#
#===============================================================================
class TotalLevelAdjustment < LevelAdjustment
def initialize(minLevel, maxLevel, totalLevel)
super(LevelAdjustment::EnemyTeam)
@minLevel = minLevel.clamp(1, GameData::GrowthRate.max_level)
@maxLevel = maxLevel.clamp(1, GameData::GrowthRate.max_level)
@totalLevel=totalLevel
end
def getAdjustment(thisTeam, _otherTeam)
ret = []
total = 0
thisTeam.each_with_index do |pkmn, i|
ret[i] = @minLevel
total += @minLevel
end
loop do
work = false
thisTeam.each_with_index do |pkmn, i|
next if ret[i] >= @maxLevel || total >= @totalLevel
ret[i] += 1
total += 1
work = true
end
break if !work
end
return ret
end
end
#===============================================================================
#
#===============================================================================
class CombinedLevelAdjustment < LevelAdjustment
def initialize(my, their)
super(LevelAdjustment::BothTeamsDifferent)
@my = my
@their = their
end
def getMyAdjustment(myTeam,theirTeam)
return @my.getAdjustment(myTeam, theirTeam) if @my
return LevelAdjustment.getNullAdjustment(myTeam, theirTeam)
end
def getTheirAdjustment(theirTeam,myTeam)
return @their.getAdjustment(theirTeam, myTeam) if @their
return LevelAdjustment.getNullAdjustment(theirTeam, myTeam)
end
end
#===============================================================================
#
#===============================================================================
class SinglePlayerCappedLevelAdjustment < CombinedLevelAdjustment
def initialize(level)
super(CappedLevelAdjustment.new(level), FixedLevelAdjustment.new(level))
end
end
#===============================================================================
#
#===============================================================================
class CappedLevelAdjustment < LevelAdjustment
def initialize(level)
super(LevelAdjustment::BothTeams)
@level = level.clamp(1, GameData::GrowthRate.max_level)
end
def getAdjustment(thisTeam, _otherTeam)
ret = []
thisTeam.each_with_index { |pkmn, i| ret[i] = [pkmn.level, @level].min }
return ret
end
end
#===============================================================================
# Unused
#===============================================================================
class LevelBalanceAdjustment < LevelAdjustment
def initialize(minLevel)
super(LevelAdjustment::BothTeams)
@minLevel = minLevel
end
def getAdjustment(thisTeam, _otherTeam)
ret = []
thisTeam.each_with_index do |pkmn, i|
ret[i] = (113 - (pbBaseStatTotal(pkmn.species) * 0.072)).round
end
return ret
end
end
#===============================================================================
#
#===============================================================================
class EnemyLevelAdjustment < LevelAdjustment
def initialize(level)
super(LevelAdjustment::EnemyTeam)
@level = level.clamp(1, GameData::GrowthRate.max_level)
end
def getAdjustment(thisTeam, _otherTeam)
ret = []
thisTeam.each_with_index { |pkmn, i| ret[i] = @level }
return ret
end
end
#===============================================================================
#
#===============================================================================
class OpenLevelAdjustment < LevelAdjustment
def initialize(minLevel = 1)
super(LevelAdjustment::EnemyTeam)
@minLevel = minLevel
end
def getAdjustment(thisTeam, otherTeam)
maxLevel = 1
otherTeam.each do |pkmn|
level = pkmn.level
maxLevel = level if maxLevel < level
end
maxLevel = @minLevel if maxLevel < @minLevel
ret = []
thisTeam.each_with_index { |pkmn, i| ret[i] = maxLevel }
return ret
end
end