Module: Gamefic::Scriptable::Entities

Includes:
Proxy
Included in:
Narrative
Defined in:
lib/gamefic/scriptable/entities.rb

Overview

Note:

The public versions of the entity and player arrays are frozen. Authors need access to them but shouldn’t modify them directly. Use #make and #destroy instead.

Scriptable methods related to managing entities.

Instance Method Summary collapse

Methods included from Proxy

#proxy, #unproxy

Instance Method Details

#destroy(entity) ⇒ Object



46
47
48
49
50
# File 'lib/gamefic/scriptable/entities.rb', line 46

def destroy entity
  entity.children.each { |child| destroy child }
  entity.parent = nil
  entity_vault.delete entity
end

#entitiesArray<Gamefic::Entity>

Returns:



23
24
25
# File 'lib/gamefic/scriptable/entities.rb', line 23

def entities
  entity_vault.array
end

#entity_vaultObject



14
15
16
# File 'lib/gamefic/scriptable/entities.rb', line 14

def entity_vault
  @entity_vault ||= Vault.new
end

#make(klass, **opts) ⇒ Gamefic::Entity

Create an entity.

Examples:

class MyPlot < Gamefic::Plot
  seed { make Gamefic::Entity, name: 'thing' }
end

Parameters:

Returns:



42
43
44
# File 'lib/gamefic/scriptable/entities.rb', line 42

def make klass, **opts
  entity_vault.add klass.new(**unproxy(opts))
end

#pick(description) ⇒ Gamefic::Entity?

Pick an entity based on a unique name or description. Return nil if an entity could not be found or there is more than one possible match.

Parameters:

Returns:



57
58
59
60
61
62
# File 'lib/gamefic/scriptable/entities.rb', line 57

def pick description
  result = Scanner.scan(entities, description)
  return nil unless result.matched.one?

  result.matched.first
end

#pick!(description) ⇒ Gamefic::Entity?

Same as #pick, but raise an error if a unique match could not be found.

Parameters:

Returns:



68
69
70
71
72
73
74
75
76
# File 'lib/gamefic/scriptable/entities.rb', line 68

def pick! description
  result = Scanner.scan(entities, description)

  raise "no entity matching '#{description}'" if result.matched.empty?

  raise "multiple entities matching '#{description}': #{result.matched.join_and}" unless result.matched.one?

  result.matched.first
end

#player_vaultObject



18
19
20
# File 'lib/gamefic/scriptable/entities.rb', line 18

def player_vault
  @player_vault ||= Vault.new
end

#playersArray<Gamefic::Actor, Gamefic::Active>



28
29
30
# File 'lib/gamefic/scriptable/entities.rb', line 28

def players
  player_vault.array
end