gamefic 3.3.0 → 3.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG.md +6 -0
- data/lib/gamefic/action.rb +4 -4
- data/lib/gamefic/callback.rb +16 -0
- data/lib/gamefic/chapter.rb +88 -0
- data/lib/gamefic/narrative.rb +24 -6
- data/lib/gamefic/plot.rb +23 -1
- data/lib/gamefic/response.rb +2 -5
- data/lib/gamefic/rulebook/calls.rb +0 -4
- data/lib/gamefic/rulebook/events.rb +10 -24
- data/lib/gamefic/rulebook/hooks.rb +10 -10
- data/lib/gamefic/rulebook.rb +8 -22
- data/lib/gamefic/scriptable/actions.rb +4 -4
- data/lib/gamefic/scriptable/events.rb +13 -7
- data/lib/gamefic/scriptable/scenes.rb +3 -3
- data/lib/gamefic/scriptable.rb +6 -27
- data/lib/gamefic/subplot.rb +4 -6
- data/lib/gamefic/version.rb +1 -1
- data/lib/gamefic.rb +2 -0
- metadata +4 -2
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 79b61813b56cbbabb76ecbef9abb370b2fe77b58ea3e155377f8c4dfd2677684
|
|
4
|
+
data.tar.gz: 611c108a0c080796c8308bee5f3e361c60fc4ddd316234bf9468c09742b1a52d
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 85732c76dae467bd5d032462ca23d34b03b7be59c6327202fd9bef307ef3d06bc40af085f32010cfae9dfd93a85b20524785313388964772534632cc95159625
|
|
7
|
+
data.tar.gz: 5c3db85ff44b268bd7604d33e28b92ca454c82c2a812f023af39a3da816a4252dfea01869d313f1ab6d24a1f062782ac002f5bf8fc40fd435efaa0c1ac14d337
|
data/CHANGELOG.md
CHANGED
data/lib/gamefic/action.rb
CHANGED
|
@@ -16,12 +16,12 @@ module Gamefic
|
|
|
16
16
|
# @param [Array<Symbol>]
|
|
17
17
|
attr_reader :verbs
|
|
18
18
|
|
|
19
|
-
# @param [
|
|
20
|
-
attr_reader :
|
|
19
|
+
# @param [Callback]
|
|
20
|
+
attr_reader :callback
|
|
21
21
|
|
|
22
|
-
def initialize
|
|
22
|
+
def initialize verbs, callback
|
|
23
23
|
@verbs = verbs
|
|
24
|
-
@
|
|
24
|
+
@callback = callback
|
|
25
25
|
end
|
|
26
26
|
|
|
27
27
|
def match?(input)
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Gamefic
|
|
4
|
+
class Callback
|
|
5
|
+
# @param narrative [Narrative]
|
|
6
|
+
# @param code [Proc]
|
|
7
|
+
def initialize narrative, code
|
|
8
|
+
@narrative = narrative
|
|
9
|
+
@code = code
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def run *args
|
|
13
|
+
Stage.run @narrative, *args, &@code
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
end
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Gamefic
|
|
4
|
+
# Chapters are plot extensions that manage their own namespaces. Authors can
|
|
5
|
+
# use them to encapsulate related content in a separate object instead of
|
|
6
|
+
# adding the required instance variables, methods, and attributes to the
|
|
7
|
+
# plot.
|
|
8
|
+
#
|
|
9
|
+
# Chapters are similar to subplots with a few important exceptions:
|
|
10
|
+
# * Chapters persist for the duration of the plot.
|
|
11
|
+
# * Players do not need to be introduced to a chapter.
|
|
12
|
+
# * Scripts in chapters apply to the parent plot's rulebook.
|
|
13
|
+
# * Using `make` to create an entity in a chapter adds it to the parent
|
|
14
|
+
# plot's entity list.
|
|
15
|
+
#
|
|
16
|
+
# @example
|
|
17
|
+
# class MyChapter < Gamefic::Chapter
|
|
18
|
+
# seed do
|
|
19
|
+
# @thing = make Gamefic::Entity, name: 'chapter thing'
|
|
20
|
+
# end
|
|
21
|
+
# end
|
|
22
|
+
#
|
|
23
|
+
# class MyPlot < Gamefic::Plot
|
|
24
|
+
# append MyChapter
|
|
25
|
+
# end
|
|
26
|
+
#
|
|
27
|
+
# plot = MyPlot.new
|
|
28
|
+
# plot.entities #=> [<#Gamefic::Entity a chapter thing>]
|
|
29
|
+
# plot.instance_exec { @thing } #=> nil
|
|
30
|
+
#
|
|
31
|
+
class Chapter
|
|
32
|
+
extend Scriptable
|
|
33
|
+
|
|
34
|
+
include Scriptable::Actions
|
|
35
|
+
include Scriptable::Events
|
|
36
|
+
include Scriptable::Proxy
|
|
37
|
+
include Scriptable::Queries
|
|
38
|
+
include Scriptable::Scenes
|
|
39
|
+
|
|
40
|
+
# @return [Plot]
|
|
41
|
+
attr_reader :plot
|
|
42
|
+
|
|
43
|
+
# @param plot [Plot]
|
|
44
|
+
def initialize plot
|
|
45
|
+
@plot = plot
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
def included_blocks
|
|
49
|
+
self.class.included_blocks - plot.included_blocks
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
def seed
|
|
53
|
+
included_blocks.select(&:seed?).each { |blk| Stage.run self, &blk.code }
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
def script
|
|
57
|
+
included_blocks.select(&:script?).each { |blk| Stage.run self, &blk.code }
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
def rulebook
|
|
61
|
+
plot.rulebook
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
def make klass, **opts
|
|
65
|
+
plot.make klass, **opts
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
def entities
|
|
69
|
+
plot.entities
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
def players
|
|
73
|
+
plot.players
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
def destroy entity
|
|
77
|
+
plot.destroy entity
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
def pick description
|
|
81
|
+
plot.pick description
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
def pick! description
|
|
85
|
+
plot.pick! description
|
|
86
|
+
end
|
|
87
|
+
end
|
|
88
|
+
end
|
data/lib/gamefic/narrative.rb
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
|
+
require 'set'
|
|
4
|
+
|
|
3
5
|
module Gamefic
|
|
4
6
|
# A base class for building and managing the resources that compose a story.
|
|
5
7
|
# The Plot and Subplot classes inherit from Narrative and provide additional
|
|
@@ -19,10 +21,27 @@ module Gamefic
|
|
|
19
21
|
attr_reader :rulebook
|
|
20
22
|
|
|
21
23
|
def initialize
|
|
22
|
-
|
|
24
|
+
seed
|
|
25
|
+
script
|
|
26
|
+
post_initialize
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
def seed
|
|
30
|
+
included_blocks.select(&:seed?).each { |blk| Stage.run self, &blk.code }
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
def script
|
|
34
|
+
@rulebook = Rulebook.new
|
|
35
|
+
included_blocks.select(&:script?).each { |blk| Stage.run self, &blk.code }
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
def included_blocks
|
|
39
|
+
self.class.included_blocks
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
def post_initialize
|
|
23
43
|
entity_vault.lock
|
|
24
|
-
|
|
25
|
-
hydrate
|
|
44
|
+
rulebook.freeze
|
|
26
45
|
end
|
|
27
46
|
|
|
28
47
|
def scenes
|
|
@@ -91,9 +110,8 @@ module Gamefic
|
|
|
91
110
|
end
|
|
92
111
|
|
|
93
112
|
def hydrate
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
@rulebook.freeze
|
|
113
|
+
script
|
|
114
|
+
post_initialize
|
|
97
115
|
end
|
|
98
116
|
|
|
99
117
|
def self.inherited klass
|
data/lib/gamefic/plot.rb
CHANGED
|
@@ -5,12 +5,26 @@ module Gamefic
|
|
|
5
5
|
# methods for creating entities, actions, scenes, and hooks.
|
|
6
6
|
#
|
|
7
7
|
class Plot < Narrative
|
|
8
|
+
def seed
|
|
9
|
+
super
|
|
10
|
+
chapters.each(&:seed)
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
def script
|
|
14
|
+
super
|
|
15
|
+
chapters.each(&:script)
|
|
16
|
+
rulebook.scenes.with_defaults self
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def chapters
|
|
20
|
+
@chapters ||= self.class.appended_chapters.map { |klass| klass.new(self) }
|
|
21
|
+
end
|
|
22
|
+
|
|
8
23
|
def ready
|
|
9
24
|
super
|
|
10
25
|
subplots.each(&:ready)
|
|
11
26
|
players.each(&:start_take)
|
|
12
27
|
subplots.each(&:conclude) if concluding?
|
|
13
|
-
|
|
14
28
|
players.select(&:concluding?).each { |plyr| rulebook.run_player_conclude_blocks plyr }
|
|
15
29
|
subplots.delete_if(&:concluding?)
|
|
16
30
|
end
|
|
@@ -76,6 +90,14 @@ module Gamefic
|
|
|
76
90
|
subplots.each(&:hydrate)
|
|
77
91
|
end
|
|
78
92
|
|
|
93
|
+
def self.append chapter
|
|
94
|
+
appended_chapters.add chapter
|
|
95
|
+
end
|
|
96
|
+
|
|
97
|
+
def self.appended_chapters
|
|
98
|
+
@appended_chapters ||= Set.new
|
|
99
|
+
end
|
|
100
|
+
|
|
79
101
|
def self.restore data
|
|
80
102
|
Snapshot.restore data
|
|
81
103
|
end
|
data/lib/gamefic/response.rb
CHANGED
|
@@ -11,9 +11,6 @@ module Gamefic
|
|
|
11
11
|
# @return [Array<Query::Base>]
|
|
12
12
|
attr_reader :queries
|
|
13
13
|
|
|
14
|
-
# @return [Narrative]
|
|
15
|
-
attr_reader :narrative
|
|
16
|
-
|
|
17
14
|
# @param verb [Symbol]
|
|
18
15
|
# @param narrative [Narrative]
|
|
19
16
|
# @param queries [Array<Query::Base>]
|
|
@@ -21,10 +18,10 @@ module Gamefic
|
|
|
21
18
|
# @param block [Proc]
|
|
22
19
|
def initialize verb, narrative, *queries, meta: false, &block
|
|
23
20
|
@verb = verb
|
|
24
|
-
@narrative = narrative
|
|
25
21
|
@queries = map_queryable_objects(queries)
|
|
26
22
|
@meta = meta
|
|
27
23
|
@block = block
|
|
24
|
+
@callback = Callback.new(narrative, block)
|
|
28
25
|
end
|
|
29
26
|
|
|
30
27
|
# The `meta?` flag is just a way for authors to identify responses that
|
|
@@ -70,7 +67,7 @@ module Gamefic
|
|
|
70
67
|
end
|
|
71
68
|
|
|
72
69
|
def execute *args
|
|
73
|
-
|
|
70
|
+
@callback.run *args
|
|
74
71
|
end
|
|
75
72
|
|
|
76
73
|
def precision
|
|
@@ -35,44 +35,30 @@ module Gamefic
|
|
|
35
35
|
end
|
|
36
36
|
|
|
37
37
|
# @return [void]
|
|
38
|
-
def on_ready
|
|
39
|
-
@ready_blocks.push
|
|
38
|
+
def on_ready callback
|
|
39
|
+
@ready_blocks.push callback
|
|
40
40
|
end
|
|
41
41
|
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
def on_player_ready &block
|
|
45
|
-
@ready_blocks.push(proc do
|
|
46
|
-
players.each { |plyr| instance_exec plyr, &block }
|
|
47
|
-
end)
|
|
48
|
-
end
|
|
49
|
-
|
|
50
|
-
def on_update &block
|
|
51
|
-
@update_blocks.push block
|
|
52
|
-
end
|
|
53
|
-
|
|
54
|
-
def on_player_update &block
|
|
55
|
-
@update_blocks.push(proc do
|
|
56
|
-
players.each { |plyr| instance_exec plyr, &block }
|
|
57
|
-
end)
|
|
42
|
+
def on_update callback
|
|
43
|
+
@update_blocks.push callback
|
|
58
44
|
end
|
|
59
45
|
|
|
60
46
|
# @return [void]
|
|
61
|
-
def on_conclude
|
|
62
|
-
@conclude_blocks.push
|
|
47
|
+
def on_conclude callback
|
|
48
|
+
@conclude_blocks.push callback
|
|
63
49
|
end
|
|
64
50
|
|
|
65
51
|
# @yieldparam [Actor]
|
|
66
52
|
# @return [void]
|
|
67
|
-
def on_player_conclude
|
|
68
|
-
@player_conclude_blocks.push
|
|
53
|
+
def on_player_conclude callback
|
|
54
|
+
@player_conclude_blocks.push callback
|
|
69
55
|
end
|
|
70
56
|
|
|
71
57
|
# @yieldparam [Actor]
|
|
72
58
|
# @yieldparam [Hash]
|
|
73
59
|
# @return [void]
|
|
74
|
-
def on_player_output
|
|
75
|
-
@player_output_blocks.push
|
|
60
|
+
def on_player_output callback
|
|
61
|
+
@player_output_blocks.push callback
|
|
76
62
|
end
|
|
77
63
|
end
|
|
78
64
|
end
|
|
@@ -21,35 +21,35 @@ module Gamefic
|
|
|
21
21
|
self
|
|
22
22
|
end
|
|
23
23
|
|
|
24
|
-
def before_action *verbs, &block
|
|
25
|
-
before_actions.push Action::Hook.new(
|
|
24
|
+
def before_action narrative, *verbs, &block
|
|
25
|
+
before_actions.push Action::Hook.new(verbs, Callback.new(narrative, block))
|
|
26
26
|
end
|
|
27
27
|
|
|
28
|
-
def after_action *verbs, &block
|
|
29
|
-
after_actions.push Action::Hook.new(
|
|
28
|
+
def after_action narrative, *verbs, &block
|
|
29
|
+
after_actions.push Action::Hook.new(verbs, Callback.new(narrative, block))
|
|
30
30
|
end
|
|
31
31
|
|
|
32
32
|
def empty?
|
|
33
33
|
before_actions.empty? && after_actions.empty?
|
|
34
34
|
end
|
|
35
35
|
|
|
36
|
-
def run_before action
|
|
37
|
-
run_action_hooks action,
|
|
36
|
+
def run_before action
|
|
37
|
+
run_action_hooks action, before_actions
|
|
38
38
|
end
|
|
39
39
|
|
|
40
|
-
def run_after action
|
|
41
|
-
run_action_hooks action,
|
|
40
|
+
def run_after action
|
|
41
|
+
run_action_hooks action, after_actions
|
|
42
42
|
end
|
|
43
43
|
|
|
44
44
|
private
|
|
45
45
|
|
|
46
|
-
def run_action_hooks action,
|
|
46
|
+
def run_action_hooks action, hooks
|
|
47
47
|
hooks.each do |hook|
|
|
48
48
|
break if action.cancelled?
|
|
49
49
|
|
|
50
50
|
next unless hook.match?(action.verb)
|
|
51
51
|
|
|
52
|
-
|
|
52
|
+
hook.callback.run action
|
|
53
53
|
end
|
|
54
54
|
end
|
|
55
55
|
end
|
data/lib/gamefic/rulebook.rb
CHANGED
|
@@ -25,12 +25,7 @@ module Gamefic
|
|
|
25
25
|
# @return [Scenes]
|
|
26
26
|
attr_reader :scenes
|
|
27
27
|
|
|
28
|
-
|
|
29
|
-
attr_reader :narrative
|
|
30
|
-
|
|
31
|
-
# @param narrative [Narrative]
|
|
32
|
-
def initialize(narrative)
|
|
33
|
-
@narrative = narrative
|
|
28
|
+
def initialize
|
|
34
29
|
@calls = Calls.new
|
|
35
30
|
@events = Events.new
|
|
36
31
|
@hooks = Hooks.new
|
|
@@ -96,44 +91,35 @@ module Gamefic
|
|
|
96
91
|
end
|
|
97
92
|
|
|
98
93
|
def run_ready_blocks
|
|
99
|
-
events.ready_blocks.each
|
|
94
|
+
events.ready_blocks.each(&:run)
|
|
100
95
|
end
|
|
101
96
|
|
|
102
97
|
def run_update_blocks
|
|
103
|
-
events.update_blocks.each
|
|
98
|
+
events.update_blocks.each(&:run)
|
|
104
99
|
end
|
|
105
100
|
|
|
106
101
|
def run_before_actions action
|
|
107
|
-
hooks.run_before action
|
|
102
|
+
hooks.run_before action
|
|
108
103
|
end
|
|
109
104
|
|
|
110
105
|
def run_after_actions action
|
|
111
|
-
hooks.run_after action
|
|
106
|
+
hooks.run_after action
|
|
112
107
|
end
|
|
113
108
|
|
|
114
109
|
def run_conclude_blocks
|
|
115
|
-
events.conclude_blocks.each
|
|
110
|
+
events.conclude_blocks.each(&:run)
|
|
116
111
|
end
|
|
117
112
|
|
|
118
113
|
def run_player_conclude_blocks player
|
|
119
|
-
events.player_conclude_blocks.each { |blk|
|
|
114
|
+
events.player_conclude_blocks.each { |blk| blk.run(player) }
|
|
120
115
|
end
|
|
121
116
|
|
|
122
117
|
def run_player_output_blocks player, output
|
|
123
|
-
events.player_output_blocks.each { |blk|
|
|
118
|
+
events.player_output_blocks.each { |blk| blk.run(player, output) }
|
|
124
119
|
end
|
|
125
120
|
|
|
126
121
|
def empty?
|
|
127
122
|
calls.empty? && hooks.empty? && scenes.empty? && events.empty?
|
|
128
123
|
end
|
|
129
|
-
|
|
130
|
-
def script
|
|
131
|
-
narrative.class.included_blocks.select(&:script?).each { |blk| Stage.run(narrative, &blk.code) }
|
|
132
|
-
end
|
|
133
|
-
|
|
134
|
-
def script_with_defaults
|
|
135
|
-
script
|
|
136
|
-
scenes.with_defaults narrative
|
|
137
|
-
end
|
|
138
124
|
end
|
|
139
125
|
end
|
|
@@ -31,7 +31,7 @@ module Gamefic
|
|
|
31
31
|
# @return [Symbol]
|
|
32
32
|
def respond(verb, *queries, &proc)
|
|
33
33
|
args = map_response_args(queries)
|
|
34
|
-
rulebook.calls.add_response Response.new(verb,
|
|
34
|
+
rulebook.calls.add_response Response.new(verb, self, *args, &proc)
|
|
35
35
|
verb
|
|
36
36
|
end
|
|
37
37
|
|
|
@@ -52,7 +52,7 @@ module Gamefic
|
|
|
52
52
|
# @return [Symbol]
|
|
53
53
|
def meta(verb, *queries, &proc)
|
|
54
54
|
args = map_response_args(queries)
|
|
55
|
-
rulebook.calls.add_response Response.new(verb,
|
|
55
|
+
rulebook.calls.add_response Response.new(verb, self, *args, meta: true, &proc)
|
|
56
56
|
verb
|
|
57
57
|
end
|
|
58
58
|
|
|
@@ -64,7 +64,7 @@ module Gamefic
|
|
|
64
64
|
# @yieldparam [Gamefic::Action]
|
|
65
65
|
# @return [Action::Hook]
|
|
66
66
|
def before_action *verbs, &block
|
|
67
|
-
rulebook.hooks.before_action *verbs, &block
|
|
67
|
+
rulebook.hooks.before_action self, *verbs, &block
|
|
68
68
|
end
|
|
69
69
|
|
|
70
70
|
# Add a proc to be evaluated after a character executes an action.
|
|
@@ -75,7 +75,7 @@ module Gamefic
|
|
|
75
75
|
# @yieldparam [Gamefic::Action]
|
|
76
76
|
# @return [Action::Hook]
|
|
77
77
|
def after_action *verbs, &block
|
|
78
|
-
rulebook.hooks.after_action *verbs, &block
|
|
78
|
+
rulebook.hooks.after_action self, *verbs, &block
|
|
79
79
|
end
|
|
80
80
|
|
|
81
81
|
# Create an alternate Syntax for a response.
|
|
@@ -14,7 +14,7 @@ module Gamefic
|
|
|
14
14
|
# end
|
|
15
15
|
#
|
|
16
16
|
def on_ready &block
|
|
17
|
-
rulebook.events.on_ready(
|
|
17
|
+
rulebook.events.on_ready(Callback.new(self, block))
|
|
18
18
|
end
|
|
19
19
|
|
|
20
20
|
# Add a block to be executed for each player at the beginning of a turn.
|
|
@@ -28,37 +28,43 @@ module Gamefic
|
|
|
28
28
|
#
|
|
29
29
|
# @yieldparam [Gamefic::Actor]
|
|
30
30
|
def on_player_ready &block
|
|
31
|
-
|
|
31
|
+
wrapper = proc do
|
|
32
|
+
players.each { |player| Stage.run(self, player, &block) }
|
|
33
|
+
end
|
|
34
|
+
on_ready &wrapper
|
|
32
35
|
end
|
|
33
36
|
|
|
34
37
|
# Add a block to be executed after the Plot is finished updating a turn.
|
|
35
38
|
#
|
|
36
39
|
def on_update &block
|
|
37
|
-
rulebook.events.on_update(
|
|
40
|
+
rulebook.events.on_update(Callback.new(self, block))
|
|
38
41
|
end
|
|
39
42
|
|
|
40
43
|
# Add a block to be executed for each player at the end of a turn.
|
|
41
44
|
#
|
|
42
45
|
# @yieldparam [Gamefic::Actor]
|
|
43
46
|
def on_player_update &block
|
|
44
|
-
|
|
47
|
+
wrapper = proc do
|
|
48
|
+
players.each { |player| Stage.run(self, player, &block) }
|
|
49
|
+
end
|
|
50
|
+
on_update &wrapper
|
|
45
51
|
end
|
|
46
52
|
|
|
47
53
|
def on_conclude &block
|
|
48
|
-
rulebook.events.on_conclude(
|
|
54
|
+
rulebook.events.on_conclude(Callback.new(self, block))
|
|
49
55
|
end
|
|
50
56
|
|
|
51
57
|
# @yieldparam [Actor]
|
|
52
58
|
# @return [Proc]
|
|
53
59
|
def on_player_conclude &block
|
|
54
|
-
rulebook.events.on_player_conclude(
|
|
60
|
+
rulebook.events.on_player_conclude(Callback.new(self, block))
|
|
55
61
|
end
|
|
56
62
|
|
|
57
63
|
# @yieldparam [Actor]
|
|
58
64
|
# @yieldparam [Hash]
|
|
59
65
|
# @return [Proc]
|
|
60
66
|
def on_player_output &block
|
|
61
|
-
rulebook.events.on_player_output(
|
|
67
|
+
rulebook.events.on_player_output Callback.new(self, block)
|
|
62
68
|
end
|
|
63
69
|
end
|
|
64
70
|
end
|
|
@@ -33,13 +33,13 @@ module Gamefic
|
|
|
33
33
|
# @yieldparam [Scene]
|
|
34
34
|
# @return [Symbol]
|
|
35
35
|
def block name, klass = Scene::Default, on_start: nil, on_finish: nil, &blk
|
|
36
|
-
rulebook.scenes.add klass.new(name,
|
|
36
|
+
rulebook.scenes.add klass.new(name, self, on_start: on_start, on_finish: on_finish, &blk)
|
|
37
37
|
name
|
|
38
38
|
end
|
|
39
39
|
alias scene block
|
|
40
40
|
|
|
41
41
|
def preface name, klass = Scene::Activity, &start
|
|
42
|
-
rulebook.scenes.add klass.new(name,
|
|
42
|
+
rulebook.scenes.add klass.new(name, self, on_start: start)
|
|
43
43
|
name
|
|
44
44
|
end
|
|
45
45
|
alias precursor preface
|
|
@@ -60,7 +60,7 @@ module Gamefic
|
|
|
60
60
|
def introduction(&start)
|
|
61
61
|
rulebook.scenes
|
|
62
62
|
.introduction Scene::Default.new nil,
|
|
63
|
-
|
|
63
|
+
self,
|
|
64
64
|
on_start: proc { |actor, _props| Stage.run(self, actor, &start) }
|
|
65
65
|
end
|
|
66
66
|
|
data/lib/gamefic/scriptable.rb
CHANGED
|
@@ -117,6 +117,7 @@ module Gamefic
|
|
|
117
117
|
# plot = Plot.new
|
|
118
118
|
# plot.thing #=> #<Gamefic::Entity a thing>
|
|
119
119
|
#
|
|
120
|
+
# @param name [Symbol] The attribute name
|
|
120
121
|
# @param klass [Class<Gamefic::Entity>]
|
|
121
122
|
def attr_seed name, klass, **opts
|
|
122
123
|
@count ||= 0
|
|
@@ -154,35 +155,13 @@ module Gamefic
|
|
|
154
155
|
# This can be useful when you need access to the Scriptable's constants and
|
|
155
156
|
# instance methods, but you don't want to duplicate its rules.
|
|
156
157
|
#
|
|
157
|
-
# @
|
|
158
|
-
#
|
|
159
|
-
# # only Plot will implement the `think` action.
|
|
160
|
-
#
|
|
161
|
-
# module Shared
|
|
162
|
-
# extend Gamefic::Scriptable
|
|
163
|
-
#
|
|
164
|
-
# def info
|
|
165
|
-
# "This method was added by the Shared module."
|
|
166
|
-
# end
|
|
167
|
-
#
|
|
168
|
-
# respond :think do |actor|
|
|
169
|
-
# actor.tell 'You ponder your predicament.'
|
|
170
|
-
# end
|
|
171
|
-
# end
|
|
158
|
+
# @deprecated Removing script blocks is no longer necessary. This method
|
|
159
|
+
# will simply return self until it's removed.
|
|
172
160
|
#
|
|
173
|
-
#
|
|
174
|
-
# include Shared
|
|
175
|
-
# end
|
|
176
|
-
#
|
|
177
|
-
# class Subplot < Gamefic::Subplot
|
|
178
|
-
# include Shared.no_scripts
|
|
179
|
-
# end
|
|
180
|
-
#
|
|
181
|
-
# @return [Module]
|
|
161
|
+
# @return [Module<self>]
|
|
182
162
|
def no_scripts
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
end
|
|
163
|
+
Logging.logger.warn 'Calling `no_scripts` on Scriptable modules is no longer necessary.'
|
|
164
|
+
self
|
|
186
165
|
end
|
|
187
166
|
end
|
|
188
167
|
end
|
data/lib/gamefic/subplot.rb
CHANGED
|
@@ -25,6 +25,10 @@ module Gamefic
|
|
|
25
25
|
[introduce].flatten.each { |pl| self.introduce pl }
|
|
26
26
|
end
|
|
27
27
|
|
|
28
|
+
def included_blocks
|
|
29
|
+
super - plot.included_blocks
|
|
30
|
+
end
|
|
31
|
+
|
|
28
32
|
def ready
|
|
29
33
|
super
|
|
30
34
|
conclude if concluding?
|
|
@@ -68,11 +72,5 @@ module Gamefic
|
|
|
68
72
|
def inspect
|
|
69
73
|
"#<#{self.class}>"
|
|
70
74
|
end
|
|
71
|
-
|
|
72
|
-
def hydrate
|
|
73
|
-
@rulebook = Rulebook.new(self)
|
|
74
|
-
@rulebook.script
|
|
75
|
-
@rulebook.freeze
|
|
76
|
-
end
|
|
77
75
|
end
|
|
78
76
|
end
|
data/lib/gamefic/version.rb
CHANGED
data/lib/gamefic.rb
CHANGED
|
@@ -8,6 +8,7 @@ require 'gamefic/core_ext/string'
|
|
|
8
8
|
require 'gamefic/syntax'
|
|
9
9
|
require 'gamefic/response'
|
|
10
10
|
require 'gamefic/rulebook'
|
|
11
|
+
require 'gamefic/callback'
|
|
11
12
|
require 'gamefic/query'
|
|
12
13
|
require 'gamefic/scanner'
|
|
13
14
|
require 'gamefic/scope'
|
|
@@ -22,6 +23,7 @@ require 'gamefic/stage'
|
|
|
22
23
|
require 'gamefic/vault'
|
|
23
24
|
require 'gamefic/narrative'
|
|
24
25
|
require 'gamefic/plot'
|
|
26
|
+
require 'gamefic/chapter'
|
|
25
27
|
require 'gamefic/subplot'
|
|
26
28
|
require 'gamefic/snapshot'
|
|
27
29
|
require 'gamefic/node'
|
metadata
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: gamefic
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 3.
|
|
4
|
+
version: 3.4.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Fred Snyder
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: bin
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date: 2024-09-
|
|
11
|
+
date: 2024-09-10 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: opal
|
|
@@ -135,6 +135,8 @@ files:
|
|
|
135
135
|
- lib/gamefic/active/take.rb
|
|
136
136
|
- lib/gamefic/actor.rb
|
|
137
137
|
- lib/gamefic/block.rb
|
|
138
|
+
- lib/gamefic/callback.rb
|
|
139
|
+
- lib/gamefic/chapter.rb
|
|
138
140
|
- lib/gamefic/command.rb
|
|
139
141
|
- lib/gamefic/composer.rb
|
|
140
142
|
- lib/gamefic/core_ext/array.rb
|