diff options
| author | realtradam <[email protected]> | 2021-12-30 04:26:26 -0500 |
|---|---|---|
| committer | realtradam <[email protected]> | 2021-12-30 04:26:26 -0500 |
| commit | 38e1a046dcc0ecf5e3ec672ca466f02038b86a02 (patch) | |
| tree | 18420cfd465fa56e6da891563cd84e2ace406e0e /lib/felflame | |
| parent | 8badd8f55231a5b569027501ed28d2e13bf9810e (diff) | |
| download | FelECS-38e1a046dcc0ecf5e3ec672ca466f02038b86a02.tar.gz FelECS-38e1a046dcc0ecf5e3ec672ca466f02038b86a02.zip | |
check the changelog bro
Diffstat (limited to 'lib/felflame')
| -rw-r--r-- | lib/felflame/component_manager.rb | 115 | ||||
| -rw-r--r-- | lib/felflame/entity_manager.rb | 75 | ||||
| -rw-r--r-- | lib/felflame/scene_manager.rb | 4 | ||||
| -rw-r--r-- | lib/felflame/stage_manager.rb | 4 | ||||
| -rw-r--r-- | lib/felflame/system_manager.rb | 2 |
5 files changed, 83 insertions, 117 deletions
diff --git a/lib/felflame/component_manager.rb b/lib/felflame/component_manager.rb index 2fa4949..c513498 100644 --- a/lib/felflame/component_manager.rb +++ b/lib/felflame/component_manager.rb @@ -1,8 +1,7 @@ -class FelFlame - class Components +module FelFlame + module Components @component_map = [] class <<self - include Enumerable # Creates a new {FelFlame::ComponentManager component manager}. # # @example @@ -46,10 +45,26 @@ class FelFlame FelFlame::Components.const_get(component_name) end - # Iterate over all existing component managers. You also call other enumerable methods instead of each, such as +each_with_index+ or +select+ - # @return [Enumerator] - def each(&block) - constants.each(&block) + # Makes component module behave like an array of component + # managers with additional methods for managing the array + # @!visibility private + def respond_to_missing?(method, *) + if constants.respond_to? method + true + else + super + end + end + + # Makes component module behave like arrays with additional + # methods for managing the array + # @!visibility private + def method_missing(method, *args, **kwargs, &block) + if constants.respond_to? method + constants.send(method, *args, **kwargs, &block) + else + super + end end end end @@ -58,16 +73,6 @@ class FelFlame # When a Component is created from a Component Manager that has accessors given to it, you can set or get the values of those accessors using standard ruby message sending (e.g [email protected] = 5+), or by using the {#attrs} and {#update_attrs} methods instead. class ComponentManager - # Holds the {id unique ID} of a component. The {id ID} is only unique within the scope of the component manager it was created from. - # @return [Integer] - #attr_reader :id - - # A seperate attr_writer was made for documentation readability reasons. - # Yard will list attr_reader is readonly which is my intention. - # This value needs to be changable as it is set by other functions. - # @!visibility private - #attr_writer :id - # Allows overwriting the storage of triggers, such as for clearing. # This method should generally only need to be used internally and # not by a game developer. @@ -104,37 +109,43 @@ class FelFlame def initialize(**attrs) # Prepare the object # (this is a function created with metaprogramming - # in FelFlame::Components + # in FelFlame::Components) set_defaults - # Generate ID - #new_id = self.class.data.find_index { |i| i.nil? } - #new_id = self.class.data.size if new_id.nil? - #@id = new_id - # Fill params attrs.each do |key, value| send "#{key}=", value end # Save Component - #self.class.data[new_id] = self self.class.push self end class <<self - # Allows using the manager as an array of components. Forwards any - # method calls to the array stored in the component manager - def respond_to_missing?(method, *args, &block) - puts 'got here' - if self.data.respond_to? method - self.data.send(symbol, *args, &block) + # Makes component managers behave like arrays with additional + # methods for managing the array + # @!visibility private + def respond_to_missing?(method, *) + if self._data.respond_to? method + true else super end end + # Makes component managers behave like arrays with additional + # methods for managing the array + # @!visibility private + def method_missing(method, *args, **kwargs, &block) + if self._data.respond_to? method + self._data.send(method, *args, **kwargs, &block) + else + super + end + end + + # Allows overwriting the storage of triggers, such as for clearing. # This method should generally only need to be used internally and # not by a game developer. @@ -167,36 +178,12 @@ class FelFlame # @return [Array<Component>] Array of all Components that belong to a given component manager # @!visibility private - def data + def _data @data ||= [] end - - # Gets a Component from the given {id unique ID}. Usage is simular to how an Array lookup works. - # - # @example - # # this gets the 'Health' Component with ID 7 - # FelFlame::Components::Health[7] - # @param component_id [Integer] - # @return [Component] Returns the Component that uses the given unique {id ID}, nil if there is no Component associated with the given {id ID} - #def [](component_id) - # data[component_id] - #end - - # Iterates over all components within the component manager. - # Special Enumerable methods like +map+ or +each_with_index+ are not implemented - # @return [Enumerator] - #def each(&block) - # data.compact.each(&block) - #end end - # An alias for the {id ID Reader} - # @return [Integer] - #def to_i - # id - #end - - # A list of entity ids that are linked to the component + # Entities that have this component # @return [Array<Integer>] def entities @entities ||= [] @@ -218,25 +205,19 @@ class FelFlame systems_to_execute |= attr_triggers[attr] unless attr_triggers[attr].nil? - systems_to_execute.sort_by(&:priority).reverse.each(&:call) + systems_to_execute.sort_by(&:priority).reverse_each(&:call) true end - - # Removes this component from the list and purges all references to this Component from other Entities, as well as its {id ID} and data. + # Removes this component from the list and purges all references to this Component from other Entities, as well as its data. # @return [Boolean] +true+. def delete addition_triggers.each do |system| system.clear_triggers component_or_manager: self end - # This needs to be cloned because indices get deleted as - # the remove command is called, breaking the loop if it - # wasn't referencing a clone(will get Nil errors) - iter = entities.map(&:clone) - iter.each do |entity| - #FelFlame::Entities[entity_id].remove self #unless FelFlame::Entities[entity_id].nil? + entities.reverse_each do |entity| entity.remove self end - self.class.delete self + self.class._data.delete self instance_variables.each do |var| instance_variable_set(var, nil) end @@ -244,7 +225,7 @@ class FelFlame end # @return [Hash<Symbol, Value>] A hash, where all the keys are attributes linked to their respective values. - def attrs + def to_h return_hash = instance_variables.each_with_object({}) do |key, final| final[key.to_s.delete_prefix('@').to_sym] = instance_variable_get(key) end diff --git a/lib/felflame/entity_manager.rb b/lib/felflame/entity_manager.rb index a05ef93..0e40b21 100644 --- a/lib/felflame/entity_manager.rb +++ b/lib/felflame/entity_manager.rb @@ -1,53 +1,32 @@ -class FelFlame +module FelFlame class Entities - # Holds the unique ID of this entity - # @return [Integer] - attr_reader :id - - # A seperate attr_writer was made for documentation readability reasons. - # Yard will list attr_reader is readonly which is my intention. - # This value needs to be changable as it is set by other functions. - # @!visibility private - attr_writer :id # Creating a new Entity # @param components [Components] Can be any number of components, identical duplicates will be automatically purged however different components from the same component manager are allowed. # @return [Entity] def initialize(*components) - # Assign new unique ID - new_id = self.class.data.find_index(&:nil?) - new_id = self.class.data.size if new_id.nil? - self.id = new_id - # Add each component add(*components) - self.class.data[id] = self + self.class._data.push self end - # A hash that uses component manager constant names as keys, and where the values of those keys are arrays that contain the {FelFlame::ComponentManager#id IDs} of the components attached to this entity. + # A hash that uses component manager constant names as keys, and where the values of those keys are arrays that contain the the components attached to this entity. # @return [Hash<Component_Manager, Array<Integer>>] def components @components ||= {} end - # An alias for the {#id ID reader} - # @return [Integer] - def to_i - id - end - - # Removes this Entity from the list and purges all references to this Entity from other Components, as well as its {id ID} and data. + # Removes this Entity from the list and purges all references to this Entity from other Components, as well as its data. # @return [Boolean] +true+ def delete components.each do |component_manager, component_array| - component_array.each do |component| + component_array.reverse_each do |component| component.entities.delete(self) end end - FelFlame::Entities.data[id] = nil + FelFlame::Entities._data.delete self @components = {} - @id = nil true end @@ -99,29 +78,35 @@ class FelFlame #def to_json() end class <<self - include Enumerable - # @return [Array<Entity>] Array of all Entities that exist + #include Enumerable + + # Makes component managers behave like arrays with additional + # methods for managing the array # @!visibility private - def data - @data ||= [] + def respond_to_missing?(method, *) + if self._data.respond_to? method + true + else + super + end end - # Gets an Entity from the given {id unique ID}. Usage is simular to how an Array lookup works - # - # @example - # # This gets the Entity with ID 7 - # FelFlame::Entities[7] - # @param entity_id [Integer] - # @return [Entity] returns the Entity that uses the given unique ID, nil if there is no Entity associated with the given ID - def [](entity_id) - data[entity_id] + # Makes component managers behave like arrays with additional + # methods for managing the array + # @!visibility private + def method_missing(method, *args, **kwargs, &block) + if self._data.respond_to? method + self._data.send(method, *args, **kwargs, &block) + else + super + end end - # Iterates over all entities. The data is compacted so that means index does not correlate to ID. - # You also call other enumerable methods instead of each, such as +each_with_index+ or +select+ - # @return [Enumerator] - def each(&block) - data.compact.each(&block) + + # @return [Array<Entity>] Array of all Entities that exist + # @!visibility private + def _data + @data ||= [] end # Creates a new entity using the data from a JSON string diff --git a/lib/felflame/scene_manager.rb b/lib/felflame/scene_manager.rb index 36ecedb..a9d3ac7 100644 --- a/lib/felflame/scene_manager.rb +++ b/lib/felflame/scene_manager.rb @@ -1,4 +1,4 @@ -class FelFlame +module FelFlame class Scenes # The Constant name assigned to this Scene attr_reader :const_name @@ -38,7 +38,7 @@ class FelFlame true end - # Removes any number of SystemS from this Scene + # Removes any number of Systems from this Scene # @return [Boolean] +true+ def remove(*systems_to_remove) self.systems -= systems_to_remove diff --git a/lib/felflame/stage_manager.rb b/lib/felflame/stage_manager.rb index 2939bd0..05b5c19 100644 --- a/lib/felflame/stage_manager.rb +++ b/lib/felflame/stage_manager.rb @@ -1,5 +1,5 @@ -class FelFlame - class Stage +module FelFlame + module Stage class <<self # Allows clearing of scenes and systems. # Used internally by FelFlame and shouldn't need to be ever used by developers diff --git a/lib/felflame/system_manager.rb b/lib/felflame/system_manager.rb index ac5b9c3..d936e8e 100644 --- a/lib/felflame/system_manager.rb +++ b/lib/felflame/system_manager.rb @@ -1,4 +1,4 @@ -class FelFlame +module FelFlame class Systems # How early this System should be executed in a list of Systems attr_accessor :priority |
