summaryrefslogtreecommitdiffhomepage
path: root/lib/felflame
diff options
context:
space:
mode:
authorrealtradam <[email protected]>2021-12-30 04:26:26 -0500
committerrealtradam <[email protected]>2021-12-30 04:26:26 -0500
commit38e1a046dcc0ecf5e3ec672ca466f02038b86a02 (patch)
tree18420cfd465fa56e6da891563cd84e2ace406e0e /lib/felflame
parent8badd8f55231a5b569027501ed28d2e13bf9810e (diff)
downloadFelECS-38e1a046dcc0ecf5e3ec672ca466f02038b86a02.tar.gz
FelECS-38e1a046dcc0ecf5e3ec672ca466f02038b86a02.zip
check the changelog bro
Diffstat (limited to 'lib/felflame')
-rw-r--r--lib/felflame/component_manager.rb115
-rw-r--r--lib/felflame/entity_manager.rb75
-rw-r--r--lib/felflame/scene_manager.rb4
-rw-r--r--lib/felflame/stage_manager.rb4
-rw-r--r--lib/felflame/system_manager.rb2
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