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. module ClassMethods # @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) # if other.is_a?(Integer) # p "Please switch to symbols, thanks." # end 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 => [Symbol, self, String, Integer] return other if other.is_a?(self) other = other.to_sym if other.is_a?(String) # if other.is_a?(Integer) # p "Please switch to symbols, thanks." # end return (self::DATA.has_key?(other)) ? self::DATA[other] : nil end def each keys = self::DATA.keys.sort { |a, b| self::DATA[a].id_number <=> self::DATA[b].id_number } keys.each do |key| yield self::DATA[key] if key.is_a?(Symbol) end 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? validate other => [Symbol, self.class, String, Integer] if other.is_a?(Symbol) return @id == other elsif other.is_a?(self.class) return @id == other.id elsif other.is_a?(String) return @id_number == other.to_sym elsif other.is_a?(Integer) return @id_number == other end return false end end end