Module: Gamefic::Scriptable::Entities

Includes:
Proxies
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 Proxies

#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

#find(*args) ⇒ Object



52
53
54
55
56
57
58
59
60
61
62
# File 'lib/gamefic/scriptable/entities.rb', line 52

def find *args
  args.inject(entities) do |entities, arg|
    case arg
    when String
      result = Scanner.scan(entities, arg)
      result.remainder.empty? ? result.match : []
    else
      entities.that_are(arg)
    end
  end
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(*args) ⇒ Gamefic::Entity?

Pick a unique entity based on the given arguments. String arguments are used to scan the entities for matching names and synonyms. Return nil if an entity could not be found or there is more than one possible match.

Parameters:

Returns:



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

def pick *args
  matches = find(*args)
  return nil unless matches.one?

  matches.first
end

#pick!(*args) ⇒ Gamefic::Entity

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

Parameters:

Returns:

Raises:

  • (RuntimeError)

    if a unique match was not found.



85
86
87
88
89
90
91
# File 'lib/gamefic/scriptable/entities.rb', line 85

def pick! *args
  matches = find(*args)
  raise "no entity matching '#{args.inspect}'" if matches.empty?
  raise "multiple entities matching '#{args.inspect}': #{matches.join_and}" unless matches.one?

  matches.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