mirror of
https://github.com/infinitefusion/infinitefusion-e18.git
synced 2025-12-06 06:01:46 +00:00
248 lines
8.0 KiB
Ruby
248 lines
8.0 KiB
Ruby
#===============================================================================
|
|
#
|
|
#===============================================================================
|
|
module GameData
|
|
class Move
|
|
attr_reader :id
|
|
attr_reader :real_name
|
|
attr_reader :type
|
|
attr_reader :category
|
|
attr_reader :power
|
|
attr_reader :accuracy
|
|
attr_reader :total_pp
|
|
attr_reader :target
|
|
attr_reader :priority
|
|
attr_reader :function_code
|
|
attr_reader :flags
|
|
attr_reader :effect_chance
|
|
attr_reader :real_description
|
|
attr_reader :pbs_file_suffix
|
|
|
|
DATA = {}
|
|
DATA_FILENAME = "moves.dat"
|
|
PBS_BASE_FILENAME = "moves"
|
|
SCHEMA = {
|
|
"SectionName" => [:id, "m"],
|
|
"Name" => [:real_name, "s"],
|
|
"Type" => [:type, "e", :Type],
|
|
"Category" => [:category, "e", ["Physical", "Special", "Status"]],
|
|
"Power" => [:power, "u"],
|
|
"Accuracy" => [:accuracy, "u"],
|
|
"TotalPP" => [:total_pp, "u"],
|
|
"Target" => [:target, "e", :Target],
|
|
"Priority" => [:priority, "i"],
|
|
"FunctionCode" => [:function_code, "s"],
|
|
"Flags" => [:flags, "*s"],
|
|
"EffectChance" => [:effect_chance, "u"],
|
|
"Description" => [:real_description, "q"]
|
|
}
|
|
CATEGORY_ICON_SIZE = [64, 28]
|
|
|
|
extend ClassMethodsSymbols
|
|
include InstanceMethods
|
|
|
|
#---------------------------------------------------------------------------
|
|
|
|
def initialize(hash)
|
|
@id = hash[:id]
|
|
@real_name = hash[:real_name] || "Unnamed"
|
|
@type = hash[:type] || :NONE
|
|
@category = hash[:category] || 2
|
|
@power = hash[:power] || 0
|
|
@accuracy = hash[:accuracy] || 100
|
|
@total_pp = hash[:total_pp] || 5
|
|
@target = hash[:target] || :None
|
|
@priority = hash[:priority] || 0
|
|
@function_code = hash[:function_code] || "None"
|
|
@flags = hash[:flags] || []
|
|
@flags = [@flags] if !@flags.is_a?(Array)
|
|
@effect_chance = hash[:effect_chance] || 0
|
|
@real_description = hash[:real_description] || "???"
|
|
@pbs_file_suffix = hash[:pbs_file_suffix] || ""
|
|
end
|
|
|
|
# @return [String] the translated name of this move
|
|
def name
|
|
return pbGetMessageFromHash(MessageTypes::MOVE_NAMES, @real_name)
|
|
end
|
|
|
|
# @return [String] the translated description of this move
|
|
def description
|
|
return pbGetMessageFromHash(MessageTypes::MOVE_DESCRIPTIONS, @real_description)
|
|
end
|
|
|
|
def has_flag?(flag)
|
|
return @flags.any? { |f| f.downcase == flag.downcase }
|
|
end
|
|
|
|
def physical?
|
|
return false if @power == 0
|
|
return @category == 0 if Settings::MOVE_CATEGORY_PER_MOVE
|
|
return GameData::Type.get(@type).physical?
|
|
end
|
|
|
|
def special?
|
|
return false if @power == 0
|
|
return @category == 1 if Settings::MOVE_CATEGORY_PER_MOVE
|
|
return GameData::Type.get(@type).special?
|
|
end
|
|
|
|
def damaging?
|
|
return @category != 2
|
|
end
|
|
|
|
def status?
|
|
return @category == 2
|
|
end
|
|
|
|
def hidden_move?
|
|
GameData::Item.each do |i|
|
|
return true if i.is_HM? && i.move == @id
|
|
end
|
|
return false
|
|
end
|
|
|
|
# TODO: Make the below depend on a Setting rather than quoting it out.
|
|
def display_type(pkmn, move = nil)
|
|
=begin
|
|
case @function_code
|
|
when "TypeDependsOnUserIVs"
|
|
return pbHiddenPower(pkmn)[0]
|
|
when "TypeAndPowerDependOnUserBerry"
|
|
item_data = pkmn.item
|
|
if item_data
|
|
item_data.flags.each do |flag|
|
|
next if !flag[/^NaturalGift_(\w+)_(?:\d+)$/i]
|
|
typ = $~[1].to_sym
|
|
ret = typ if GameData::Type.exists?(typ)
|
|
break
|
|
end
|
|
end
|
|
return :NORMAL
|
|
when "TypeDependsOnUserPlate"
|
|
item_types = {
|
|
:FISTPLATE => :FIGHTING,
|
|
:SKYPLATE => :FLYING,
|
|
:TOXICPLATE => :POISON,
|
|
:EARTHPLATE => :GROUND,
|
|
:STONEPLATE => :ROCK,
|
|
:INSECTPLATE => :BUG,
|
|
:SPOOKYPLATE => :GHOST,
|
|
:IRONPLATE => :STEEL,
|
|
:FLAMEPLATE => :FIRE,
|
|
:SPLASHPLATE => :WATER,
|
|
:MEADOWPLATE => :GRASS,
|
|
:ZAPPLATE => :ELECTRIC,
|
|
:MINDPLATE => :PSYCHIC,
|
|
:ICICLEPLATE => :ICE,
|
|
:DRACOPLATE => :DRAGON,
|
|
:DREADPLATE => :DARK,
|
|
:PIXIEPLATE => :FAIRY
|
|
}
|
|
if pkmn.hasItem?
|
|
item_types.each do |item, item_type|
|
|
return item_type if pkmn.item_id == item && GameData::Type.exists?(item_type)
|
|
end
|
|
end
|
|
when "TypeDependsOnUserMemory"
|
|
item_types = {
|
|
:FIGHTINGMEMORY => :FIGHTING,
|
|
:FLYINGMEMORY => :FLYING,
|
|
:POISONMEMORY => :POISON,
|
|
:GROUNDMEMORY => :GROUND,
|
|
:ROCKMEMORY => :ROCK,
|
|
:BUGMEMORY => :BUG,
|
|
:GHOSTMEMORY => :GHOST,
|
|
:STEELMEMORY => :STEEL,
|
|
:FIREMEMORY => :FIRE,
|
|
:WATERMEMORY => :WATER,
|
|
:GRASSMEMORY => :GRASS,
|
|
:ELECTRICMEMORY => :ELECTRIC,
|
|
:PSYCHICMEMORY => :PSYCHIC,
|
|
:ICEMEMORY => :ICE,
|
|
:DRAGONMEMORY => :DRAGON,
|
|
:DARKMEMORY => :DARK,
|
|
:FAIRYMEMORY => :FAIRY
|
|
}
|
|
if pkmn.hasItem?
|
|
item_types.each do |item, item_type|
|
|
return item_type if pkmn.item_id == item && GameData::Type.exists?(item_type)
|
|
end
|
|
end
|
|
when "TypeDependsOnUserDrive"
|
|
item_types = {
|
|
:SHOCKDRIVE => :ELECTRIC,
|
|
:BURNDRIVE => :FIRE,
|
|
:CHILLDRIVE => :ICE,
|
|
:DOUSEDRIVE => :WATER
|
|
}
|
|
if pkmn.hasItem?
|
|
item_types.each do |item, item_type|
|
|
return item_type if pkmn.item_id == item && GameData::Type.exists?(item_type)
|
|
end
|
|
end
|
|
when "TypeIsUserFirstType"
|
|
return pkmn.types[0]
|
|
end
|
|
=end
|
|
return @type
|
|
end
|
|
|
|
# TODO: Make the below depend on a Setting rather than quoting it out.
|
|
def display_damage(pkmn, move = nil)
|
|
=begin
|
|
case @function_code
|
|
when "TypeDependsOnUserIVs"
|
|
return pbHiddenPower(pkmn)[1]
|
|
when "TypeAndPowerDependOnUserBerry"
|
|
item_data = pkmn.item
|
|
if item_data
|
|
item_data.flags.each do |flag|
|
|
return [$~[1].to_i, 10].max if flag[/^NaturalGift_(?:\w+)_(\d+)$/i]
|
|
end
|
|
end
|
|
return 1
|
|
when "ThrowUserItemAtTarget"
|
|
item_data = pkmn.item
|
|
if item_data
|
|
item_data.flags.each do |flag|
|
|
return [$~[1].to_i, 10].max if flag[/^Fling_(\d+)$/i]
|
|
end
|
|
return 10
|
|
end
|
|
return 0
|
|
when "PowerHigherWithUserHP"
|
|
return [150 * pkmn.hp / pkmn.totalhp, 1].max
|
|
when "PowerLowerWithUserHP"
|
|
n = 48 * pkmn.hp / pkmn.totalhp
|
|
return 200 if n < 2
|
|
return 150 if n < 5
|
|
return 100 if n < 10
|
|
return 80 if n < 17
|
|
return 40 if n < 33
|
|
return 20
|
|
when "PowerHigherWithUserHappiness"
|
|
return [(pkmn.happiness * 2 / 5).floor, 1].max
|
|
when "PowerLowerWithUserHappiness"
|
|
return [((255 - pkmn.happiness) * 2 / 5).floor, 1].max
|
|
when "PowerHigherWithLessPP"
|
|
dmgs = [200, 80, 60, 50, 40]
|
|
ppLeft = [[(move&.pp || @total_pp) - 1, 0].max, dmgs.length - 1].min
|
|
return dmgs[ppLeft]
|
|
end
|
|
=end
|
|
return @power
|
|
end
|
|
|
|
def display_category(pkmn, move = nil); return @category; end
|
|
def display_accuracy(pkmn, move = nil); return @accuracy; end
|
|
|
|
alias __orig__get_property_for_PBS get_property_for_PBS unless method_defined?(:__orig__get_property_for_PBS)
|
|
def get_property_for_PBS(key)
|
|
ret = __orig__get_property_for_PBS(key)
|
|
ret = nil if ["Power", "Priority", "EffectChance"].include?(key) && ret == 0
|
|
return ret
|
|
end
|
|
end
|
|
end
|