Implemented GameData::Ribbon

This commit is contained in:
Maruno17
2021-02-02 20:53:43 +00:00
parent 66494b0044
commit 44e3c934ad
13 changed files with 332 additions and 408 deletions

View File

@@ -19,7 +19,7 @@ critical hit.
def pbPurify(pkmn, scene)
return if !pkmn.shadowPokemon? || pkmn.heart_gauge != 0
pkmn.shadow = false
pkmn.giveRibbon(PBRibbons::NATIONAL)
pkmn.giveRibbon(:NATIONAL)
scene.pbDisplay(_INTL("{1} opened the door to its heart!", pkmn.name))
old_moves = []
pkmn.moves.each { |m| old_moves.push(m.id) }

View File

@@ -35,7 +35,7 @@ class Pokemon
attr_accessor :moves
# @return [Array<Integer>] the IDs of moves known by this Pokémon when it was obtained
attr_accessor :first_moves
# @return [Array<Integer>] an array of ribbons owned by this Pokémon
# @return [Array<Symbol>] an array of ribbons owned by this Pokémon
attr_accessor :ribbons
# @return [Integer] contest stats
attr_accessor :cool, :beauty, :cute, :smart, :tough, :sheen
@@ -662,50 +662,56 @@ class Pokemon
return @ribbons.length
end
# @param ribbon [Integer, Symbol, String] ribbon ID to check
# @param ribbon [Symbol, String, GameData::Ribbon, Integer] ribbon ID to check for
# @return [Boolean] whether this Pokémon has the specified ribbon
def hasRibbon?(ribbon)
ribbon = getID(PBRibbons, ribbon)
return ribbon > 0 && @ribbons.include?(ribbon)
ribbon_data = GameData::Ribbon.try_get(ribbon)
return ribbon_data && @ribbons.include?(ribbon_data.id)
end
# Gives a ribbon to this Pokémon.
# @param ribbon [Integer, Symbol, String] ID of the ribbon to give
# @param ribbon [Symbol, String, GameData::Ribbon, Integer] ID of the ribbon to give
def giveRibbon(ribbon)
ribbon = getID(PBRibbons, ribbon)
return if ribbon == 0
@ribbons.push(ribbon) if !@ribbons.include?(ribbon)
ribbon_data = GameData::Ribbon.try_get(ribbon)
return if !ribbon_data || @ribbons.include?(ribbon_data.id)
@ribbons.push(ribbon_data.id)
end
# Replaces one ribbon with the next one along, if possible.
# Replaces one ribbon with the next one along, if possible. If none of the
# given ribbons are owned, give the first one.
# @return [Symbol, nil] ID of the ribbon that was gained
def upgradeRibbon(*arg)
for i in 0...arg.length - 1
this_ribbon_data = GameData::Ribbon.try_get(i)
next if !this_ribbon_data
for j in 0...@ribbons.length
next if @ribbons[j] != getID(PBRibbons, arg[i])
@ribbons[j] = getID(PBRibbons, arg[i + 1])
next if @ribbons[j] != this_ribbon_data.id
next_ribbon_data = GameData::Ribbon.try_get(arg[i + 1])
next if !next_ribbon_data
@ribbons[j] = next_ribbon_data.id
return @ribbons[j]
end
end
if !hasRibbon?(arg[arg.length - 1])
first_ribbon = getID(PBRibbons, arg[0])
giveRibbon(first_ribbon)
return first_ribbon
first_ribbon_data = GameData::Ribbon.try_get(arg[0])
last_ribbon_data = GameData::Ribbon.try_get(arg[arg.length - 1])
if first_ribbon_data && last_ribbon_data && !hasRibbon?(last_ribbon_data.id)
giveRibbon(first_ribbon_data.id)
return first_ribbon_data.id
end
return 0
return nil
end
# Removes the specified ribbon from this Pokémon.
# @param ribbon [Integer, Symbol, String] id of the ribbon to remove
# @param ribbon [Symbol, String, GameData::Ribbon, Integer] ID of the ribbon to remove
def takeRibbon(ribbon)
return if !@ribbons
ribbon = getID(PBRibbons, ribbon)
return if ribbon == 0
ribbon_data = GameData::Ribbon.try_get(ribbon)
return if !ribbon_data
for i in 0...@ribbons.length
next if @ribbons[i] != ribbon
next if @ribbons[i] != ribbon_data.id
@ribbons[i] = nil
@ribbons.compact!
break
end
@ribbons.compact!
end
# Removes all ribbons from this Pokémon.

View File

@@ -27,62 +27,64 @@ class PokeBattle_Pokemon
def self.copy(pkmn)
owner = Pokemon::Owner.new(pkmn.trainerID, pkmn.ot, pkmn.otgender, pkmn.language)
ret = Pokemon.new(pkmn.species, pkmn.level, owner, false)
ret.forced_form = pkmn.forcedForm if pkmn.forcedForm
ret.time_form_set = pkmn.formTime
ret.exp = pkmn.exp
ret.steps_to_hatch = pkmn.eggsteps
ret.status = pkmn.status
ret.statusCount = pkmn.statusCount
ret.gender = pkmn.genderflag
ret.shiny = pkmn.shinyflag
ret.ability_index = pkmn.abilityflag
ret.nature = pkmn.natureflag
ret.forced_form = pkmn.forcedForm if pkmn.forcedForm
ret.time_form_set = pkmn.formTime
ret.exp = pkmn.exp
ret.steps_to_hatch = pkmn.eggsteps
ret.status = pkmn.status
ret.statusCount = pkmn.statusCount
ret.gender = pkmn.genderflag
ret.shiny = pkmn.shinyflag
ret.ability_index = pkmn.abilityflag
ret.nature = pkmn.natureflag
ret.nature_for_stats = pkmn.natureOverride
ret.item = pkmn.item
ret.mail = PokemonMail.copy(pkmn.mail) if pkmn.mail
ret.item = pkmn.item
ret.mail = PokemonMail.copy(pkmn.mail) if pkmn.mail
pkmn.moves.each { |m| ret.moves.push(PBMove.copy(m)) if m && m.id > 0 }
pkmn.firstmoves.each { |m| ret.add_first_move(m) }
ret.ribbons = pkmn.ribbons.clone if pkmn.ribbons
ret.cool = pkmn.cool if pkmn.cool
ret.beauty = pkmn.beauty if pkmn.beauty
ret.cute = pkmn.cute if pkmn.cute
ret.smart = pkmn.smart if pkmn.smart
ret.tough = pkmn.tough if pkmn.tough
ret.sheen = pkmn.sheen if pkmn.sheen
ret.pokerus = pkmn.pokerus if pkmn.pokerus
ret.name = pkmn.name
ret.happiness = pkmn.happiness
ret.poke_ball = pbBallTypeToItem(pkmn.ballused)
ret.markings = pkmn.markings if pkmn.markings
ret.iv = pkmn.iv.clone
ret.ivMaxed = pkmn.ivMaxed.clone if pkmn.ivMaxed
ret.ev = pkmn.ev.clone
ret.obtain_method = pkmn.obtainMode
ret.obtain_map = pkmn.obtainMap
ret.obtain_text = pkmn.obtainText
ret.obtain_level = pkmn.obtainLevel if pkmn.obtainLevel
ret.hatched_map = pkmn.hatchedMap
ret.timeReceived = pkmn.timeReceived
ret.timeEggHatched = pkmn.timeEggHatched
if pkmn.ribbons
pkmn.ribbons.each { |r| ret.giveRibbon(r) }
end
ret.cool = pkmn.cool if pkmn.cool
ret.beauty = pkmn.beauty if pkmn.beauty
ret.cute = pkmn.cute if pkmn.cute
ret.smart = pkmn.smart if pkmn.smart
ret.tough = pkmn.tough if pkmn.tough
ret.sheen = pkmn.sheen if pkmn.sheen
ret.pokerus = pkmn.pokerus if pkmn.pokerus
ret.name = pkmn.name
ret.happiness = pkmn.happiness
ret.poke_ball = pbBallTypeToItem(pkmn.ballused)
ret.markings = pkmn.markings if pkmn.markings
ret.iv = pkmn.iv.clone
ret.ivMaxed = pkmn.ivMaxed.clone if pkmn.ivMaxed
ret.ev = pkmn.ev.clone
ret.obtain_method = pkmn.obtainMode
ret.obtain_map = pkmn.obtainMap
ret.obtain_text = pkmn.obtainText
ret.obtain_level = pkmn.obtainLevel if pkmn.obtainLevel
ret.hatched_map = pkmn.hatchedMap
ret.timeReceived = pkmn.timeReceived
ret.timeEggHatched = pkmn.timeEggHatched
if pkmn.fused
ret.fused = PokeBattle_Pokemon.copy(pkmn.fused) if pkmn.fused.is_a?(PokeBattle_Pokemon)
ret.fused = pkmn.fused if pkmn.fused.is_a?(Pokemon)
end
ret.personalID = pkmn.personalID
ret.hp = pkmn.hp
ret.personalID = pkmn.personalID
ret.hp = pkmn.hp
if pkmn.shadow
ret.shadow = pkmn.shadow
ret.heart_gauge = pkmn.heartgauge
ret.hyper_mode = pkmn.hypermode
ret.saved_exp = pkmn.savedexp
ret.saved_ev = pkmn.savedev.clone
ret.shadow_moves = []
ret.shadow = pkmn.shadow
ret.heart_gauge = pkmn.heartgauge
ret.hyper_mode = pkmn.hypermode
ret.saved_exp = pkmn.savedexp
ret.saved_ev = pkmn.savedev.clone
ret.shadow_moves = []
pkmn.shadowmoves.each_with_index do |move, i|
ret.shadow_moves[i] = GameData::Move.get(move).id if move
end
end
# NOTE: Intentionally set last, as it recalculates stats.
ret.form_simple = pkmn.form || 0
ret.form_simple = pkmn.form || 0
return ret
end
end