mirror of
https://github.com/infinitefusion/infinitefusion-e18.git
synced 2025-12-06 06:01:46 +00:00
284 lines
8.8 KiB
Ruby
284 lines
8.8 KiB
Ruby
module GameData
|
|
#=============================================================================
|
|
# A mixin module for data classes which provides common class methods (called
|
|
# by GameData::Thing.method) that provide access to data held within.
|
|
# Assumes the data class's data is stored in a class constant hash called DATA.
|
|
# For data that is known by a symbol or an ID number.
|
|
#=============================================================================
|
|
module ClassMethods
|
|
def schema
|
|
return self::SCHEMA
|
|
end
|
|
|
|
def register(hash)
|
|
self::DATA[hash[:id]] = self::DATA[hash[:id_number]] = self.new(hash)
|
|
end
|
|
|
|
# @param other [Symbol, self, String, Integer]
|
|
# @return [Boolean] whether the given other is defined as a self
|
|
def exists?(other)
|
|
return false if other.nil?
|
|
validate other => [Symbol, self, String, Integer]
|
|
other = other.id if other.is_a?(self)
|
|
other = other.to_sym if other.is_a?(String)
|
|
return !self::DATA[other].nil?
|
|
end
|
|
|
|
# @param other [Symbol, self, String, Integer]
|
|
# @return [self]
|
|
def get(other)
|
|
validate other => [Symbol, self, String, Integer]
|
|
return other if other.is_a?(self)
|
|
other = other.to_sym if other.is_a?(String)
|
|
raise "Unknown ID #{other}." unless self::DATA.has_key?(other)
|
|
return self::DATA[other]
|
|
end
|
|
|
|
# @param other [Symbol, self, String, Integer]
|
|
# @return [self, nil]
|
|
def try_get(other)
|
|
return nil if other.nil?
|
|
validate other => [Symbol, self, String, Integer]
|
|
return other if other.is_a?(self)
|
|
other = other.to_sym if other.is_a?(String)
|
|
return (self::DATA.has_key?(other)) ? self::DATA[other] : nil
|
|
end
|
|
|
|
# Returns the array of keys for the data.
|
|
# @return [Array]
|
|
def keys
|
|
return self::DATA.keys
|
|
end
|
|
|
|
# Yields all data in order of their id_number.
|
|
def each
|
|
sorted_keys = self::DATA.keys.sort { |a, b| self::DATA[a].id_number <=> self::DATA[b].id_number }
|
|
sorted_keys.each { |key| yield self::DATA[key] if !key.is_a?(Integer) }
|
|
end
|
|
|
|
def count
|
|
return self::DATA.length / 2
|
|
end
|
|
|
|
def load
|
|
const_set(:DATA, load_data("Data/#{self::DATA_FILENAME}"))
|
|
end
|
|
|
|
def save
|
|
save_data(self::DATA, "Data/#{self::DATA_FILENAME}")
|
|
end
|
|
end
|
|
|
|
#=============================================================================
|
|
# A mixin module for data classes which provides common class methods (called
|
|
# by GameData::Thing.method) that provide access to data held within.
|
|
# Assumes the data class's data is stored in a class constant hash called DATA.
|
|
# For data that is only known by a symbol.
|
|
#=============================================================================
|
|
module ClassMethodsSymbols
|
|
def schema
|
|
return self::SCHEMA
|
|
end
|
|
|
|
def register(hash)
|
|
self::DATA[hash[:id]] = self.new(hash)
|
|
end
|
|
|
|
# @param other [Symbol, self, String]
|
|
# @return [Boolean] whether the given other is defined as a self
|
|
def exists?(other)
|
|
return false if other.nil?
|
|
validate other => [Symbol, self, String]
|
|
other = other.id if other.is_a?(self)
|
|
other = other.to_sym if other.is_a?(String)
|
|
return !self::DATA[other].nil?
|
|
end
|
|
|
|
# @param other [Symbol, self, String]
|
|
# @return [self]
|
|
def get(other)
|
|
validate other => [Symbol, self, String]
|
|
return other if other.is_a?(self)
|
|
other = other.to_sym if other.is_a?(String)
|
|
raise "Unknown ID #{other}." unless self::DATA.has_key?(other)
|
|
return self::DATA[other]
|
|
end
|
|
|
|
# @param other [Symbol, self, String]
|
|
# @return [self, nil]
|
|
def try_get(other)
|
|
return nil if other.nil?
|
|
validate other => [Symbol, self, String]
|
|
return other if other.is_a?(self)
|
|
other = other.to_sym if other.is_a?(String)
|
|
return (self::DATA.has_key?(other)) ? self::DATA[other] : nil
|
|
end
|
|
|
|
# Returns the array of keys for the data.
|
|
# @return [Array]
|
|
def keys
|
|
return self::DATA.keys
|
|
end
|
|
|
|
# Yields all data in the order they were defined.
|
|
def each
|
|
self::DATA.each_value { |value| yield value }
|
|
end
|
|
|
|
# Yields all data in alphabetical order.
|
|
def each_alphabetically
|
|
keys = self::DATA.keys.sort { |a, b| self::DATA[a].real_name <=> self::DATA[b].real_name }
|
|
keys.each { |key| yield self::DATA[key] }
|
|
end
|
|
|
|
def count
|
|
return self::DATA.length
|
|
end
|
|
|
|
def load
|
|
const_set(:DATA, load_data("Data/#{self::DATA_FILENAME}"))
|
|
end
|
|
|
|
def save
|
|
save_data(self::DATA, "Data/#{self::DATA_FILENAME}")
|
|
end
|
|
end
|
|
|
|
#=============================================================================
|
|
# A mixin module for data classes which provides common class methods (called
|
|
# by GameData::Thing.method) that provide access to data held within.
|
|
# Assumes the data class's data is stored in a class constant hash called DATA.
|
|
# For data that is only known by an ID number.
|
|
#=============================================================================
|
|
module ClassMethodsIDNumbers
|
|
def schema
|
|
return self::SCHEMA
|
|
end
|
|
|
|
def register(hash)
|
|
self::DATA[hash[:id]] = self.new(hash)
|
|
end
|
|
|
|
# @param other [self, Integer]
|
|
# @return [Boolean] whether the given other is defined as a self
|
|
def exists?(other)
|
|
return false if other.nil?
|
|
validate other => [self, Integer]
|
|
other = other.id if other.is_a?(self)
|
|
return !self::DATA[other].nil?
|
|
end
|
|
|
|
# @param other [self, Integer]
|
|
# @return [self]
|
|
def get(other)
|
|
validate other => [self, Integer]
|
|
return other if other.is_a?(self)
|
|
raise "Unknown ID #{other}." unless self::DATA.has_key?(other)
|
|
return self::DATA[other]
|
|
end
|
|
|
|
def try_get(other)
|
|
return nil if other.nil?
|
|
validate other => [self, Integer]
|
|
return other if other.is_a?(self)
|
|
return (self::DATA.has_key?(other)) ? self::DATA[other] : nil
|
|
end
|
|
|
|
# Returns the array of keys for the data.
|
|
# @return [Array]
|
|
def keys
|
|
return self::DATA.keys
|
|
end
|
|
|
|
# Yields all data in numberical order.
|
|
def each
|
|
keys = self::DATA.keys.sort
|
|
keys.each { |key| yield self::DATA[key] }
|
|
end
|
|
|
|
def count
|
|
return self::DATA.length
|
|
end
|
|
|
|
def load
|
|
const_set(:DATA, load_data("Data/#{self::DATA_FILENAME}"))
|
|
end
|
|
|
|
def save
|
|
save_data(self::DATA, "Data/#{self::DATA_FILENAME}")
|
|
end
|
|
end
|
|
|
|
#=============================================================================
|
|
# A mixin module for data classes which provides common instance methods
|
|
# (called by thing.method) that analyse the data of a particular thing which
|
|
# the instance represents.
|
|
#=============================================================================
|
|
module InstanceMethods
|
|
# @param other [Symbol, self.class, String, Integer]
|
|
# @return [Boolean] whether other represents the same thing as this thing
|
|
def ==(other)
|
|
return false if other.nil?
|
|
case other
|
|
when Symbol
|
|
return @id == other
|
|
when self.class
|
|
return @id == other.id
|
|
when String
|
|
return @id == other.to_sym
|
|
when Integer
|
|
return @id_number == other
|
|
end
|
|
return false
|
|
end
|
|
|
|
def get_property_for_PBS(key)
|
|
ret = nil
|
|
if self.class::SCHEMA.include?(key) && self.respond_to?(self.class::SCHEMA[key][0])
|
|
ret = self.send(self.class::SCHEMA[key][0])
|
|
ret = nil if ret == false || (ret.is_a?(Array) && ret.length == 0)
|
|
end
|
|
return ret
|
|
end
|
|
end
|
|
|
|
#=============================================================================
|
|
# A bulk loader method for all data stored in .dat files in the Data folder.
|
|
#=============================================================================
|
|
def self.load_all
|
|
self.constants.each do |c|
|
|
next if !self.const_get(c).is_a?(Class)
|
|
self.const_get(c).load if self.const_get(c).const_defined?(:DATA_FILENAME)
|
|
end
|
|
end
|
|
|
|
def self.get_all_data_filenames
|
|
ret = []
|
|
self.constants.each do |c|
|
|
next if !self.const_get(c).is_a?(Class)
|
|
next if !self.const_get(c).const_defined?(:DATA_FILENAME)
|
|
if self.const_get(c).const_defined?(:OPTIONAL) && self.const_get(c)::OPTIONAL
|
|
ret.push([self.const_get(c)::DATA_FILENAME, false])
|
|
else
|
|
ret.push([self.const_get(c)::DATA_FILENAME, true])
|
|
end
|
|
end
|
|
return ret
|
|
end
|
|
|
|
def self.get_all_pbs_base_filenames
|
|
ret = {}
|
|
self.constants.each do |c|
|
|
next if !self.const_get(c).is_a?(Class)
|
|
ret[c] = self.const_get(c)::PBS_BASE_FILENAME if self.const_get(c).const_defined?(:PBS_BASE_FILENAME)
|
|
next if !ret[c].is_a?(Array)
|
|
ret[c].length.times do |i|
|
|
next if i == 0
|
|
ret[(c.to_s + i.to_s).to_sym] = ret[c][i] # :Species1 => "pokemon_forms"
|
|
end
|
|
ret[c] = ret[c][0] # :Species => "pokemon"
|
|
end
|
|
return ret
|
|
end
|
|
end
|