gamefic 2.4.0 → 3.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.github/workflows/rspec.yml +41 -40
- data/.rspec-opal +2 -0
- data/.solargraph.yml +20 -3
- data/CHANGELOG.md +9 -0
- data/Rakefile +11 -1
- data/bin/console +14 -0
- data/bin/setup +8 -0
- data/gamefic.gemspec +5 -2
- data/lib/gamefic/action.rb +52 -183
- data/lib/gamefic/active/cue.rb +25 -0
- data/lib/gamefic/active/epic.rb +68 -0
- data/lib/gamefic/active/messaging.rb +43 -0
- data/lib/gamefic/active/take.rb +69 -0
- data/lib/gamefic/active.rb +95 -192
- data/lib/gamefic/actor.rb +2 -0
- data/lib/gamefic/block.rb +28 -0
- data/lib/gamefic/command.rb +16 -6
- data/lib/gamefic/core_ext/array.rb +4 -4
- data/lib/gamefic/core_ext/string.rb +10 -5
- data/lib/gamefic/describable.rb +39 -65
- data/lib/gamefic/dispatcher.rb +63 -32
- data/lib/gamefic/entity.rb +44 -19
- data/lib/gamefic/logging.rb +32 -0
- data/lib/gamefic/messenger.rb +66 -0
- data/lib/gamefic/narrative.rb +104 -0
- data/lib/gamefic/node.rb +44 -53
- data/lib/gamefic/plot.rb +60 -93
- data/lib/gamefic/props/default.rb +41 -0
- data/lib/gamefic/props/multiple_choice.rb +65 -0
- data/lib/gamefic/props/pause.rb +11 -0
- data/lib/gamefic/props/yes_or_no.rb +21 -0
- data/lib/gamefic/props.rb +10 -0
- data/lib/gamefic/query/base.rb +45 -126
- data/lib/gamefic/query/general.rb +46 -0
- data/lib/gamefic/query/result.rb +20 -0
- data/lib/gamefic/query/scoped.rb +41 -0
- data/lib/gamefic/query/text.rb +30 -31
- data/lib/gamefic/query.rb +7 -15
- data/lib/gamefic/response.rb +118 -0
- data/lib/gamefic/rulebook/calls.rb +90 -0
- data/lib/gamefic/rulebook/events.rb +79 -0
- data/lib/gamefic/rulebook/hooks.rb +57 -0
- data/lib/gamefic/rulebook/scenes.rb +68 -0
- data/lib/gamefic/rulebook.rb +139 -0
- data/lib/gamefic/scanner.rb +103 -0
- data/lib/gamefic/scene/activity.rb +9 -17
- data/lib/gamefic/scene/conclusion.rb +6 -5
- data/lib/gamefic/scene/default.rb +88 -0
- data/lib/gamefic/scene/multiple_choice.rb +14 -69
- data/lib/gamefic/scene/pause.rb +9 -13
- data/lib/gamefic/scene/yes_or_no.rb +6 -46
- data/lib/gamefic/scene.rb +11 -7
- data/lib/gamefic/scope/base.rb +44 -0
- data/lib/gamefic/scope/children.rb +16 -0
- data/lib/gamefic/scope/family.rb +20 -0
- data/lib/gamefic/scope/myself.rb +13 -0
- data/lib/gamefic/scope/parent.rb +13 -0
- data/lib/gamefic/scope/siblings.rb +14 -0
- data/lib/gamefic/scope.rb +8 -0
- data/lib/gamefic/scriptable/actions.rb +156 -0
- data/lib/gamefic/scriptable/entities.rb +76 -0
- data/lib/gamefic/scriptable/events.rb +65 -0
- data/lib/gamefic/scriptable/proxy.rb +55 -0
- data/lib/gamefic/scriptable/queries.rb +73 -0
- data/lib/gamefic/scriptable/scenes.rb +162 -0
- data/lib/gamefic/scriptable.rb +167 -73
- data/lib/gamefic/snapshot.rb +36 -0
- data/lib/gamefic/stage.rb +51 -0
- data/lib/gamefic/subplot.rb +51 -79
- data/lib/gamefic/syntax/template.rb +67 -0
- data/lib/gamefic/syntax.rb +102 -83
- data/lib/gamefic/vault.rb +50 -0
- data/lib/gamefic/version.rb +1 -1
- data/lib/gamefic.rb +26 -15
- data/spec-opal/spec_helper.rb +24 -0
- metadata +91 -29
- data/lib/gamefic/element.rb +0 -46
- data/lib/gamefic/keywords.rb +0 -52
- data/lib/gamefic/messaging.rb +0 -43
- data/lib/gamefic/plot/darkroom.rb +0 -120
- data/lib/gamefic/plot/host.rb +0 -42
- data/lib/gamefic/plot/snapshot.rb +0 -27
- data/lib/gamefic/query/children.rb +0 -9
- data/lib/gamefic/query/descendants.rb +0 -15
- data/lib/gamefic/query/external.rb +0 -39
- data/lib/gamefic/query/family.rb +0 -18
- data/lib/gamefic/query/itself.rb +0 -13
- data/lib/gamefic/query/matches.rb +0 -75
- data/lib/gamefic/query/parent.rb +0 -9
- data/lib/gamefic/query/siblings.rb +0 -13
- data/lib/gamefic/query/tree.rb +0 -17
- data/lib/gamefic/scene/base.rb +0 -142
- data/lib/gamefic/scene/multiple_scene.rb +0 -29
- data/lib/gamefic/serialize.rb +0 -196
- data/lib/gamefic/world/callbacks.rb +0 -135
- data/lib/gamefic/world/commands.rb +0 -181
- data/lib/gamefic/world/entities.rb +0 -98
- data/lib/gamefic/world/playbook.rb +0 -233
- data/lib/gamefic/world/players.rb +0 -37
- data/lib/gamefic/world/scenes.rb +0 -228
- data/lib/gamefic/world.rb +0 -18
@@ -1,120 +0,0 @@
|
|
1
|
-
module Gamefic
|
2
|
-
# Create and restore plot snapshots.
|
3
|
-
#
|
4
|
-
class Plot
|
5
|
-
class Darkroom
|
6
|
-
# @return [Plot]
|
7
|
-
attr_reader :plot
|
8
|
-
|
9
|
-
# @param plot [Plot]
|
10
|
-
def initialize plot
|
11
|
-
@plot = plot
|
12
|
-
end
|
13
|
-
|
14
|
-
# Create a snapshot of the plot.
|
15
|
-
#
|
16
|
-
# @return [Hash]
|
17
|
-
def save
|
18
|
-
{
|
19
|
-
'program' => {}, # @todo Metadata for version control, etc.
|
20
|
-
'index' => index.map { |obj| serialize_indexed(obj) }
|
21
|
-
}
|
22
|
-
end
|
23
|
-
|
24
|
-
# Restore a snapshot.
|
25
|
-
#
|
26
|
-
# @param snapshot [Hash]
|
27
|
-
def restore snapshot
|
28
|
-
# @todo Use `program` for verification
|
29
|
-
|
30
|
-
plot.subplots.each(&:conclude)
|
31
|
-
plot.subplots.clear
|
32
|
-
|
33
|
-
index = plot.static + plot.players
|
34
|
-
snapshot['index'].each_with_index do |obj, idx|
|
35
|
-
next if index[idx]
|
36
|
-
elematch = obj['class'].match(/^#<ELE_([\d]+)>$/)
|
37
|
-
if elematch
|
38
|
-
klass = index[elematch[1].to_i]
|
39
|
-
else
|
40
|
-
klass = Gamefic::Serialize.string_to_constant(obj['class'])
|
41
|
-
end
|
42
|
-
index.push klass.allocate
|
43
|
-
end
|
44
|
-
|
45
|
-
snapshot['index'].each_with_index do |obj, idx|
|
46
|
-
if index[idx].class.to_s != obj['class']
|
47
|
-
STDERR.puts "MISMATCH: #{index[idx].class} is not #{obj['class']}"
|
48
|
-
STDERR.puts obj.inspect
|
49
|
-
end
|
50
|
-
obj['ivars'].each_pair do |k, v|
|
51
|
-
next if k == '@subplots'
|
52
|
-
uns = v.from_serial(index)
|
53
|
-
next if uns == "#<UNKNOWN>"
|
54
|
-
index[idx].instance_variable_set(k, uns)
|
55
|
-
end
|
56
|
-
if index[idx].is_a?(Gamefic::Subplot)
|
57
|
-
index[idx].extend Gamefic::Scriptable
|
58
|
-
index[idx].instance_variable_set(:@theater, nil)
|
59
|
-
index[idx].send(:run_scripts)
|
60
|
-
index[idx].players.each do |pl|
|
61
|
-
pl.playbooks.push index[idx].playbook unless pl.playbooks.include?(index[idx].playbook)
|
62
|
-
end
|
63
|
-
index[idx].instance_variable_set(:@static, [index[idx]] + index[idx].scene_classes + index[idx].entities)
|
64
|
-
plot.subplots.push index[idx]
|
65
|
-
end
|
66
|
-
end
|
67
|
-
end
|
68
|
-
|
69
|
-
private
|
70
|
-
|
71
|
-
def index
|
72
|
-
@index ||= begin
|
73
|
-
populate_full_index_from(plot)
|
74
|
-
Set.new(plot.static + plot.players).merge(full_index).to_a
|
75
|
-
end
|
76
|
-
end
|
77
|
-
|
78
|
-
def full_index
|
79
|
-
@full_index ||= Set.new
|
80
|
-
end
|
81
|
-
|
82
|
-
def populate_full_index_from(object)
|
83
|
-
return if full_index.include?(object)
|
84
|
-
if object.is_a?(Array) || object.is_a?(Set)
|
85
|
-
object.each { |ele| populate_full_index_from(ele) }
|
86
|
-
elsif object.is_a?(Hash)
|
87
|
-
object.each_pair do |k, v|
|
88
|
-
populate_full_index_from(k)
|
89
|
-
populate_full_index_from(v)
|
90
|
-
end
|
91
|
-
else
|
92
|
-
if object.is_a?(Gamefic::Serialize)
|
93
|
-
full_index.add object unless object.is_a?(Module) && object.name
|
94
|
-
object.instance_variables.each do |v|
|
95
|
-
next if object.class.excluded_from_serial.include?(v)
|
96
|
-
populate_full_index_from(object.instance_variable_get(v))
|
97
|
-
end
|
98
|
-
else
|
99
|
-
object.instance_variables.each do |v|
|
100
|
-
populate_full_index_from(object.instance_variable_get(v))
|
101
|
-
end
|
102
|
-
end
|
103
|
-
end
|
104
|
-
end
|
105
|
-
|
106
|
-
def serialize_indexed object
|
107
|
-
if object.is_a?(Gamefic::Serialize)
|
108
|
-
# Serialized objects in the index should be a full serialization.
|
109
|
-
# Serialize#to_serial rturns a reference to the indexed object.
|
110
|
-
{
|
111
|
-
'class' => object.class.to_s,
|
112
|
-
'ivars' => object.serialize_instance_variables(index)
|
113
|
-
}
|
114
|
-
else
|
115
|
-
object.to_serial(index)
|
116
|
-
end
|
117
|
-
end
|
118
|
-
end
|
119
|
-
end
|
120
|
-
end
|
data/lib/gamefic/plot/host.rb
DELETED
@@ -1,42 +0,0 @@
|
|
1
|
-
require 'gamefic/subplot'
|
2
|
-
|
3
|
-
module Gamefic
|
4
|
-
# Methods for hosting and managing subplots.
|
5
|
-
#
|
6
|
-
module Plot::Host
|
7
|
-
# Get an array of all the current subplots.
|
8
|
-
#
|
9
|
-
# @return [Array<Subplot>]
|
10
|
-
def subplots
|
11
|
-
@subplots ||= []
|
12
|
-
end
|
13
|
-
|
14
|
-
# Start a new subplot based on the provided class.
|
15
|
-
#
|
16
|
-
# @param subplot_class [Class<Gamefic::Subplot>] The class of the subplot to be created (Subplot by default)
|
17
|
-
# @return [Gamefic::Subplot]
|
18
|
-
def branch subplot_class = Gamefic::Subplot, introduce: nil, next_cue: nil, **more
|
19
|
-
subplot = subplot_class.new(self, introduce: introduce, next_cue: next_cue, **more)
|
20
|
-
subplots.push subplot
|
21
|
-
subplot
|
22
|
-
end
|
23
|
-
|
24
|
-
# Get the player's current subplots.
|
25
|
-
#
|
26
|
-
# @return [Array<Subplot>]
|
27
|
-
def subplots_featuring player
|
28
|
-
result = []
|
29
|
-
subplots.each { |s|
|
30
|
-
result.push s if s.players.include?(player)
|
31
|
-
}
|
32
|
-
result
|
33
|
-
end
|
34
|
-
|
35
|
-
# Determine whether the player is involved in a subplot.
|
36
|
-
#
|
37
|
-
# @return [Boolean]
|
38
|
-
def in_subplot? player
|
39
|
-
!subplots_featuring(player).empty?
|
40
|
-
end
|
41
|
-
end
|
42
|
-
end
|
@@ -1,27 +0,0 @@
|
|
1
|
-
require 'json'
|
2
|
-
|
3
|
-
module Gamefic
|
4
|
-
module Plot::Snapshot
|
5
|
-
# Save the current game state as a data hash.
|
6
|
-
# See Gamefic::Plot::Darkroom for more information about
|
7
|
-
# the data format.
|
8
|
-
#
|
9
|
-
# @return [Hash]
|
10
|
-
def save
|
11
|
-
Gamefic::Plot::Darkroom.new(self).save
|
12
|
-
end
|
13
|
-
|
14
|
-
# Restore the game state from a snapshot.
|
15
|
-
#
|
16
|
-
# If `snapshot` is a string, parse it as a JSON object.
|
17
|
-
#
|
18
|
-
# @note The string conversion is performed as a convenience for web apps.
|
19
|
-
#
|
20
|
-
# @param snapshot [Hash, String]
|
21
|
-
# @return [void]
|
22
|
-
def restore snapshot
|
23
|
-
snapshot = JSON.parse(snapshot) if snapshot.is_a?(String)
|
24
|
-
Gamefic::Plot::Darkroom.new(self).restore(snapshot)
|
25
|
-
end
|
26
|
-
end
|
27
|
-
end
|
@@ -1,15 +0,0 @@
|
|
1
|
-
module Gamefic
|
2
|
-
module Query
|
3
|
-
class Descendants < Children
|
4
|
-
def context_from(subject)
|
5
|
-
result = []
|
6
|
-
children = super
|
7
|
-
result.concat children
|
8
|
-
children.each do |c|
|
9
|
-
result.concat subquery_accessible(c)
|
10
|
-
end
|
11
|
-
result
|
12
|
-
end
|
13
|
-
end
|
14
|
-
end
|
15
|
-
end
|
@@ -1,39 +0,0 @@
|
|
1
|
-
module Gamefic
|
2
|
-
module Query
|
3
|
-
class External < Base
|
4
|
-
# @param container [Plot, Subplot, Array]
|
5
|
-
def initialize container, *args
|
6
|
-
super(*args)
|
7
|
-
@container = container
|
8
|
-
end
|
9
|
-
|
10
|
-
def context_from subject
|
11
|
-
Set.new
|
12
|
-
.merge(container_entities)
|
13
|
-
.merge(container_subplots_for(@container, subject))
|
14
|
-
.to_a
|
15
|
-
end
|
16
|
-
|
17
|
-
private
|
18
|
-
|
19
|
-
# @return [Array<Entity>]
|
20
|
-
def container_entities
|
21
|
-
if @container.is_a?(World::Entities)
|
22
|
-
@container.entities
|
23
|
-
elsif @container.is_a?(Enumerable)
|
24
|
-
@container
|
25
|
-
else
|
26
|
-
raise ArgumentError, "Unable to derive entities from #{@container}"
|
27
|
-
end
|
28
|
-
end
|
29
|
-
|
30
|
-
# @return [Array<Entity>]
|
31
|
-
def container_subplots_for container, subject
|
32
|
-
return [] unless container.is_a?(Plot::Host)
|
33
|
-
container.subplots_featuring(subject).flat_map do |subplot|
|
34
|
-
subplot.entities + container_subplots_for(subplot, subject)
|
35
|
-
end
|
36
|
-
end
|
37
|
-
end
|
38
|
-
end
|
39
|
-
end
|
data/lib/gamefic/query/family.rb
DELETED
@@ -1,18 +0,0 @@
|
|
1
|
-
module Gamefic
|
2
|
-
module Query
|
3
|
-
# Query to retrieve the subject's siblings and all accessible descendants.
|
4
|
-
#
|
5
|
-
class Family < Base
|
6
|
-
def context_from(subject)
|
7
|
-
result = []
|
8
|
-
result.concat subquery_accessible(subject.parent)
|
9
|
-
result.delete subject
|
10
|
-
subject.children.each { |c|
|
11
|
-
result.push c
|
12
|
-
result.concat subquery_accessible(c)
|
13
|
-
}
|
14
|
-
result
|
15
|
-
end
|
16
|
-
end
|
17
|
-
end
|
18
|
-
end
|
data/lib/gamefic/query/itself.rb
DELETED
@@ -1,75 +0,0 @@
|
|
1
|
-
module Gamefic
|
2
|
-
module Query
|
3
|
-
class Matches
|
4
|
-
# The resolved tokens
|
5
|
-
# @return [Array<Object>]
|
6
|
-
attr_reader :objects
|
7
|
-
|
8
|
-
# The matching string
|
9
|
-
# @return [String]
|
10
|
-
attr_reader :matching
|
11
|
-
|
12
|
-
# The remaining (unmatched) string
|
13
|
-
# @return [String]
|
14
|
-
attr_reader :remaining
|
15
|
-
|
16
|
-
def initialize objects, matching, remaining
|
17
|
-
@objects = objects
|
18
|
-
@matching = matching
|
19
|
-
@remaining = remaining
|
20
|
-
end
|
21
|
-
|
22
|
-
def self.execute objects, description, continued: false
|
23
|
-
if continued
|
24
|
-
match_with_remainder objects, description
|
25
|
-
else
|
26
|
-
match_without_remainder objects, description
|
27
|
-
end
|
28
|
-
end
|
29
|
-
|
30
|
-
class << self
|
31
|
-
private
|
32
|
-
|
33
|
-
def match_without_remainder objects, description
|
34
|
-
matches = objects.select{ |e| e.specified?(description) }
|
35
|
-
if matches.empty?
|
36
|
-
matching = ''
|
37
|
-
remaining = description
|
38
|
-
else
|
39
|
-
matching = description
|
40
|
-
remaining = ''
|
41
|
-
end
|
42
|
-
Matches.new(matches, matching, remaining)
|
43
|
-
end
|
44
|
-
|
45
|
-
def match_with_remainder objects, description
|
46
|
-
matching_objects = objects
|
47
|
-
matching_text = []
|
48
|
-
words = description.split(Keywords::SPLIT_REGEXP)
|
49
|
-
i = 0
|
50
|
-
words.each { |w|
|
51
|
-
cursor = inner_match matching_objects, words, matching_text, i, w
|
52
|
-
break if cursor.empty? or (cursor & matching_objects).empty?
|
53
|
-
matching_objects = (cursor & matching_objects)
|
54
|
-
i += 1
|
55
|
-
}
|
56
|
-
objects = matching_objects
|
57
|
-
matching = matching_text.uniq.join(' ')
|
58
|
-
remaining = words[i..-1].join(' ')
|
59
|
-
Matches.new(objects, matching, remaining)
|
60
|
-
end
|
61
|
-
|
62
|
-
def inner_match matching_objects, words, matching_text, i, w
|
63
|
-
cursor = []
|
64
|
-
matching_objects.each { |o|
|
65
|
-
if o.specified?(words[0..i].join(' '), fuzzy: true)
|
66
|
-
cursor.push o
|
67
|
-
matching_text.push w
|
68
|
-
end
|
69
|
-
}
|
70
|
-
cursor
|
71
|
-
end
|
72
|
-
end
|
73
|
-
end
|
74
|
-
end
|
75
|
-
end
|
data/lib/gamefic/query/parent.rb
DELETED
data/lib/gamefic/query/tree.rb
DELETED
@@ -1,17 +0,0 @@
|
|
1
|
-
module Gamefic
|
2
|
-
module Query
|
3
|
-
# Query to retrieve all of the subject's ancestors, siblings, and descendants.
|
4
|
-
#
|
5
|
-
class Tree < Family
|
6
|
-
def context_from(subject)
|
7
|
-
result = super
|
8
|
-
parent = subject.parent
|
9
|
-
until parent.nil?
|
10
|
-
result.unshift parent
|
11
|
-
parent = parent.parent
|
12
|
-
end
|
13
|
-
result
|
14
|
-
end
|
15
|
-
end
|
16
|
-
end
|
17
|
-
end
|
data/lib/gamefic/scene/base.rb
DELETED
@@ -1,142 +0,0 @@
|
|
1
|
-
module Gamefic
|
2
|
-
# An abstract class for building different types of scenes. It can be
|
3
|
-
# extended either through concrete subclasses or by creating anonymous
|
4
|
-
# subclasses through a scene helper method like
|
5
|
-
# `Gamefic::World::Scenes#custom`.
|
6
|
-
#
|
7
|
-
class Scene::Base
|
8
|
-
include Gamefic::Serialize
|
9
|
-
extend Gamefic::Serialize
|
10
|
-
|
11
|
-
# The scene's primary actor.
|
12
|
-
#
|
13
|
-
# @return [Gamefic::Actor]
|
14
|
-
attr_reader :actor
|
15
|
-
|
16
|
-
# A human-readable string identifying the type of scene.
|
17
|
-
#
|
18
|
-
# @return [String]
|
19
|
-
attr_writer :type
|
20
|
-
|
21
|
-
# The text to display when requesting input.
|
22
|
-
#
|
23
|
-
# @return [String]
|
24
|
-
attr_writer :prompt
|
25
|
-
|
26
|
-
# The input received from the actor.
|
27
|
-
#
|
28
|
-
# @return [String]
|
29
|
-
attr_reader :input
|
30
|
-
|
31
|
-
# @return [Hash{Symbol => Object}]
|
32
|
-
attr_reader :data
|
33
|
-
|
34
|
-
def initialize actor, **data
|
35
|
-
@actor = actor
|
36
|
-
@data = data
|
37
|
-
post_initialize
|
38
|
-
end
|
39
|
-
|
40
|
-
# A shortcut for the #data hash.
|
41
|
-
#
|
42
|
-
# @param key [Symbol]
|
43
|
-
# @return [Object]
|
44
|
-
def [] key
|
45
|
-
data[key]
|
46
|
-
end
|
47
|
-
|
48
|
-
def post_initialize
|
49
|
-
end
|
50
|
-
|
51
|
-
# Set a proc to be executed at the end of the scene.
|
52
|
-
#
|
53
|
-
def on_finish &block
|
54
|
-
@finish_block = block
|
55
|
-
end
|
56
|
-
|
57
|
-
# Update the scene.
|
58
|
-
#
|
59
|
-
def update
|
60
|
-
@input = actor.queue.shift
|
61
|
-
finish
|
62
|
-
end
|
63
|
-
|
64
|
-
# Start the scene.
|
65
|
-
#
|
66
|
-
def start
|
67
|
-
self.class.start_block.call @actor, self unless self.class.start_block.nil?
|
68
|
-
@actor.entered self if tracked?
|
69
|
-
end
|
70
|
-
|
71
|
-
# Finish the scene.
|
72
|
-
#
|
73
|
-
def finish
|
74
|
-
@finish_block.call @actor, self unless @finish_block.nil?
|
75
|
-
@finished = true
|
76
|
-
end
|
77
|
-
|
78
|
-
# Determine whether the scene's execution is finished.
|
79
|
-
#
|
80
|
-
# @return [Boolean]
|
81
|
-
def finished?
|
82
|
-
@finished ||= false
|
83
|
-
end
|
84
|
-
|
85
|
-
# Get a hash that describes the current state of the scene.
|
86
|
-
#
|
87
|
-
# @return [Hash]
|
88
|
-
def state
|
89
|
-
{
|
90
|
-
scene: type, prompt: prompt
|
91
|
-
}
|
92
|
-
end
|
93
|
-
|
94
|
-
# @yieldparam [Class<Gamefic::Actor>]
|
95
|
-
# @return [Class<Gamefic::Scene::Base>]
|
96
|
-
def self.subclass &block
|
97
|
-
c = Class.new(self) do
|
98
|
-
on_start &block
|
99
|
-
end
|
100
|
-
c
|
101
|
-
end
|
102
|
-
|
103
|
-
# Get the prompt to be displayed to the user when accepting input.
|
104
|
-
#
|
105
|
-
# @return [String] The text to be displayed.
|
106
|
-
def prompt
|
107
|
-
@prompt ||= '>'
|
108
|
-
end
|
109
|
-
|
110
|
-
# Get a String that describes the type of scene.
|
111
|
-
#
|
112
|
-
# @return [String]
|
113
|
-
def type
|
114
|
-
@type ||= 'Scene'
|
115
|
-
end
|
116
|
-
|
117
|
-
# @yieldparam [Class<Gamefic::Scene::Base>]
|
118
|
-
def self.on_start &block
|
119
|
-
@start_block = block
|
120
|
-
end
|
121
|
-
|
122
|
-
def tracked?
|
123
|
-
self.class.tracked?
|
124
|
-
end
|
125
|
-
|
126
|
-
def tracked= bool
|
127
|
-
self.class.tracked = bool
|
128
|
-
end
|
129
|
-
|
130
|
-
class << self
|
131
|
-
attr_writer :tracked
|
132
|
-
|
133
|
-
def start_block
|
134
|
-
@start_block
|
135
|
-
end
|
136
|
-
|
137
|
-
def tracked?
|
138
|
-
@tracked ||= false
|
139
|
-
end
|
140
|
-
end
|
141
|
-
end
|
142
|
-
end
|
@@ -1,29 +0,0 @@
|
|
1
|
-
module Gamefic
|
2
|
-
class Scene::MultipleScene < Scene::MultipleChoice
|
3
|
-
def option_map
|
4
|
-
@option_map ||= {}
|
5
|
-
end
|
6
|
-
|
7
|
-
# @param option [String]
|
8
|
-
# @param scene [Class<Gamefic::Scene::Base>]
|
9
|
-
def map option, scene
|
10
|
-
options.push option
|
11
|
-
option_map[option] = scene
|
12
|
-
end
|
13
|
-
|
14
|
-
def finish
|
15
|
-
get_choice
|
16
|
-
unless selection.nil?
|
17
|
-
actor.prepare option_map[selection]
|
18
|
-
end
|
19
|
-
end
|
20
|
-
|
21
|
-
def state
|
22
|
-
entered = {}
|
23
|
-
option_map.each_pair do |k, v|
|
24
|
-
entered[k] = actor.entered?(v)
|
25
|
-
end
|
26
|
-
super.merge entered: entered
|
27
|
-
end
|
28
|
-
end
|
29
|
-
end
|