Class: FelFlame::ComponentManager

Inherits:
Object
  • Object
show all
Defined in:
lib/felflame/component_manager.rb

Overview

Component Managers are what is used to create individual components which can be attached to entities. 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 @component.var = 5), or by using the #attrs and #update_attrs methods instead.

Class Attribute Summary collapse

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(**attrs) ⇒ Component

Creates a new component and sets the values of the attributes given to it. If an attritbute is not passed then it will remain as the default.

Parameters:

  • attrs (Keyword: Value)

    You can pass any number of Keyword-Value pairs



104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
# File 'lib/felflame/component_manager.rb', line 104

def initialize(**attrs)
  # Prepare the object
  # (this is a function created with metaprogramming
  # 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
end

Class Attribute Details

.addition_triggersArray<System>

Stores references to systems that should be triggered when this component is added to an enitity. Do not edit this array as it is managed by FelFlame automatically.

Returns:

  • (Array<System>)


136
137
138
# File 'lib/felflame/component_manager.rb', line 136

def addition_triggers
  @addition_triggers ||= []
end

.attr_triggersHash<Symbol, System>

Stores references to systems that should be triggered when an attribute from this component changed. Do not edit this hash as it is managed by FelFlame automatically.

Returns:

  • (Hash<Symbol, System>)


152
153
154
# File 'lib/felflame/component_manager.rb', line 152

def attr_triggers
  @attr_triggers ||= {}
end

.removal_triggersArray<System>

Stores references to systems that should be triggered when this component is removed from an enitity. Do not edit this array as it is managed by FelFlame automatically.

Returns:

  • (Array<System>)


144
145
146
# File 'lib/felflame/component_manager.rb', line 144

def removal_triggers
  @removal_triggers ||= []
end

Instance Attribute Details

#addition_triggersArray<System>

Stores references to systems that should be triggered when a component from this manager is added. Do not edit this array as it is managed by FelFlame automatically.

Returns:

  • (Array<System>)


81
82
83
# File 'lib/felflame/component_manager.rb', line 81

def addition_triggers
  @addition_triggers ||= []
end

#attr_triggersHash<Symbol, Array<System>>

Stores references to systems that should be triggered when an attribute from this manager is changed. Do not edit this hash as it is managed by FelFlame automatically.

Returns:

  • (Hash<Symbol, Array<System>>)


97
98
99
# File 'lib/felflame/component_manager.rb', line 97

def attr_triggers
  @attr_triggers ||= {}
end

#idInteger

Holds the unique ID of a component. The ID is only unique within the scope of the component manager it was created from.

Returns:

  • (Integer)


63
64
65
# File 'lib/felflame/component_manager.rb', line 63

def id
  @id
end

#removal_triggersArray<System>

Stores references to systems that should be triggered when a component from this manager is removed. Do not edit this array as it is managed by FelFlame automatically.

Returns:

  • (Array<System>)


89
90
91
# File 'lib/felflame/component_manager.rb', line 89

def removal_triggers
  @removal_triggers ||= []
end

Class Method Details

.[](component_id) ⇒ Component

Gets a Component from the given unique ID. Usage is simular to how an Array lookup works.

Examples:

# this gets the 'Health' Component with ID 7
FelFlame::Components::Health[7]

Parameters:

  • component_id (Integer)

Returns:

  • (Component)

    Returns the Component that uses the given unique ID, nil if there is no Component associated with the given ID



169
170
171
# File 'lib/felflame/component_manager.rb', line 169

def [](component_id)
  data[component_id]
end

.each(&block) ⇒ Enumerator

Iterates over all components within the component manager. Special Enumerable methods like map or each_with_index are not implemented

Returns:

  • (Enumerator)


176
177
178
# File 'lib/felflame/component_manager.rb', line 176

def each(&block)
  data.compact.each(&block)
end

Instance Method Details

#attr_changed_trigger_systems(attr) ⇒ Boolean

Execute systems that have been added to execute on variable change

Returns:

  • (Boolean)

    true



203
204
205
206
207
208
209
210
211
# File 'lib/felflame/component_manager.rb', line 203

def attr_changed_trigger_systems(attr)
  systems_to_execute = self.class.attr_triggers[attr]
  systems_to_execute = [] if systems_to_execute.nil?

  systems_to_execute |= attr_triggers[attr] unless attr_triggers[attr].nil?

  systems_to_execute.sort_by(&:priority).reverse.each(&:call)
  true
end

#attrsHash<Symbol, Value>

Returns A hash, where all the keys are attributes linked to their respective values.

Returns:

  • (Hash<Symbol, Value>)

    A hash, where all the keys are attributes linked to their respective values.



235
236
237
238
239
240
241
# File 'lib/felflame/component_manager.rb', line 235

def attrs
  return_hash = instance_variables.each_with_object({}) do |key, final|
    final[key.to_s.delete_prefix('@').to_sym] = instance_variable_get(key)
  end
  return_hash.delete(:attr_triggers)
  return_hash
end

#deleteBoolean

Removes this component from the list and purges all references to this Component from other Entities, as well as its ID and data.

Returns:

  • (Boolean)

    true.



215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
# File 'lib/felflame/component_manager.rb', line 215

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?
    entity.remove self
  end
  self.class.data[id] = nil
  instance_variables.each do |var|
    instance_variable_set(var, nil)
  end
  true
end

#entitiesArray<Integer>

A list of entity ids that are linked to the component

Returns:

  • (Array<Integer>)


189
190
191
# File 'lib/felflame/component_manager.rb', line 189

def entities
  @entities ||= []
end

#to_iInteger

An alias for the ID Reader

Returns:

  • (Integer)


183
184
185
# File 'lib/felflame/component_manager.rb', line 183

def to_i
  id
end

#update_attrs(**opts) ⇒ Hash<Symbol, Value>

Update attribute values using a hash or keywords.

Returns:

  • (Hash<Symbol, Value>)

    Hash of updated attributes



195
196
197
198
199
# File 'lib/felflame/component_manager.rb', line 195

def update_attrs(**opts)
  opts.each do |key, value|
    send "#{key}=", value
  end
end