gamefic 2.3.0 → 2.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/.github/workflows/rspec.yml +40 -0
- data/.rubocop.yml +4 -1
- data/CHANGELOG.md +6 -0
- data/Gemfile +0 -4
- data/gamefic.gemspec +1 -1
- data/lib/gamefic/action.rb +14 -3
- data/lib/gamefic/active.rb +2 -0
- data/lib/gamefic/dispatcher.rb +7 -0
- data/lib/gamefic/scriptable.rb +8 -3
- data/lib/gamefic/version.rb +3 -1
- data/lib/gamefic/world/commands.rb +15 -7
- data/lib/gamefic/world/playbook.rb +12 -4
- data/lib/gamefic/world/scenes.rb +15 -13
- metadata +4 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 2288262e86ac4a5cf259b3a37e80ba56a3a4ed334b8842770109e1930799585d
|
4
|
+
data.tar.gz: 542aaff9c3f4d0aae1a4471fba5d52ff35b569971c861af006ddc78f0d1cc568
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 6a89c7fb5978047517827e3cc2de5f172da5e6905a7e7efe0725763b4ce01d56725df46a443b903906effd962cebdbd238d81719b315eb26f3b8bf289d337089
|
7
|
+
data.tar.gz: 9976d0c58957309ba605e645a8c7e214d798c12e114b71e5d5fa2bb4b6d39878537612e670da6e42168dfd31ee5fce7304eee9983d1177d878262af630e6e582
|
@@ -0,0 +1,40 @@
|
|
1
|
+
# This workflow uses actions that are not certified by GitHub.
|
2
|
+
# They are provided by a third-party and are governed by
|
3
|
+
# separate terms of service, privacy policy, and support
|
4
|
+
# documentation.
|
5
|
+
# This workflow will download a prebuilt Ruby version, install dependencies and run tests with rspec.
|
6
|
+
# For more information see: https://github.com/marketplace/actions/setup-ruby-jruby-and-truffleruby
|
7
|
+
|
8
|
+
name: RSpec
|
9
|
+
|
10
|
+
on:
|
11
|
+
push:
|
12
|
+
branches: [ master ]
|
13
|
+
pull_request:
|
14
|
+
branches: [ master ]
|
15
|
+
|
16
|
+
permissions:
|
17
|
+
contents: read
|
18
|
+
|
19
|
+
jobs:
|
20
|
+
test:
|
21
|
+
|
22
|
+
runs-on: ubuntu-latest
|
23
|
+
strategy:
|
24
|
+
matrix:
|
25
|
+
ruby-version: ['2.5', '2.6', '2.7', '3.0', '3.1']
|
26
|
+
|
27
|
+
steps:
|
28
|
+
- uses: actions/checkout@v3
|
29
|
+
- name: Set up Ruby
|
30
|
+
# To automatically get bug fixes and new Ruby versions for ruby/setup-ruby,
|
31
|
+
# change this to (see https://github.com/ruby/setup-ruby#versioning):
|
32
|
+
uses: ruby/setup-ruby@v1
|
33
|
+
# uses: ruby/setup-ruby@2b019609e2b0f1ea1a2bc8ca11cb82ab46ada124
|
34
|
+
with:
|
35
|
+
ruby-version: ${{ matrix.ruby-version }}
|
36
|
+
bundler-cache: false
|
37
|
+
- name: Install dependencies
|
38
|
+
run: bundle install
|
39
|
+
- name: Run tests
|
40
|
+
run: bundle exec rspec
|
data/.rubocop.yml
CHANGED
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,9 @@
|
|
1
|
+
## 2.4.0 - February 11, 2023
|
2
|
+
- Fix arity of delegated methods in scripts
|
3
|
+
- Action hooks accept verb filters
|
4
|
+
- Opal exception for delegated methods
|
5
|
+
- Support separation of kwargs in Ruby >= 2.7
|
6
|
+
|
1
7
|
## 2.3.0 - January 25, 2023
|
2
8
|
- Remove unused Active#actions method
|
3
9
|
- Add before_action and after_action hooks
|
data/Gemfile
CHANGED
data/gamefic.gemspec
CHANGED
@@ -19,7 +19,7 @@ Gem::Specification.new do |s|
|
|
19
19
|
end
|
20
20
|
s.require_paths = ['lib']
|
21
21
|
|
22
|
-
s.required_ruby_version = '>= 2.
|
22
|
+
s.required_ruby_version = '>= 2.3.0'
|
23
23
|
|
24
24
|
s.add_development_dependency 'rake', '~> 12.3', '>= 12.3'
|
25
25
|
s.add_development_dependency 'rspec', '~> 3.5', '>= 3.5.0'
|
data/lib/gamefic/action.rb
CHANGED
@@ -32,8 +32,11 @@ module Gamefic
|
|
32
32
|
|
33
33
|
# Cancel an action. This method can be called in a before_action hook to
|
34
34
|
# prevent subsequent hooks and the action itself from being executed.
|
35
|
+
# Cancelling an action in an after_action hook has no effect.
|
35
36
|
#
|
36
37
|
def cancel
|
38
|
+
# @todo Emit a warning for attempts to cancel an action after it's been
|
39
|
+
# executed
|
37
40
|
@cancelled = true
|
38
41
|
end
|
39
42
|
|
@@ -44,6 +47,10 @@ module Gamefic
|
|
44
47
|
@executed
|
45
48
|
end
|
46
49
|
|
50
|
+
def cancelled?
|
51
|
+
!@executed && @cancelled
|
52
|
+
end
|
53
|
+
|
47
54
|
# The verb associated with this action.
|
48
55
|
#
|
49
56
|
# @return [Symbol] The symbol representing the verb
|
@@ -91,8 +98,9 @@ module Gamefic
|
|
91
98
|
return unless @with_callbacks
|
92
99
|
@actor.playbooks
|
93
100
|
.flat_map(&:before_actions)
|
94
|
-
.each do |
|
95
|
-
|
101
|
+
.each do |hook|
|
102
|
+
next unless hook.verb.nil? || hook.verb == verb
|
103
|
+
hook.block.call(self)
|
96
104
|
break if @cancelled
|
97
105
|
end
|
98
106
|
end
|
@@ -101,7 +109,10 @@ module Gamefic
|
|
101
109
|
return unless @with_callbacks
|
102
110
|
@actor.playbooks
|
103
111
|
.flat_map(&:after_actions)
|
104
|
-
.each
|
112
|
+
.each do |hook|
|
113
|
+
next unless hook.verb.nil? || hook.verb == verb
|
114
|
+
hook.block.call(self)
|
115
|
+
end
|
105
116
|
end
|
106
117
|
|
107
118
|
class << self
|
data/lib/gamefic/active.rb
CHANGED
data/lib/gamefic/dispatcher.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Gamefic
|
2
4
|
# The action selector for character commands.
|
3
5
|
#
|
@@ -12,11 +14,16 @@ module Gamefic
|
|
12
14
|
@started = false
|
13
15
|
end
|
14
16
|
|
17
|
+
# @param dispatcher [Dispatcher]
|
18
|
+
# @return [void]
|
15
19
|
def merge dispatcher
|
16
20
|
commands.concat dispatcher.commands
|
17
21
|
actions.concat dispatcher.actions
|
18
22
|
end
|
19
23
|
|
24
|
+
# Get the next executable action.
|
25
|
+
#
|
26
|
+
# @return [Action]
|
20
27
|
def next
|
21
28
|
instance = nil
|
22
29
|
while instance.nil? && !@actions.empty?
|
data/lib/gamefic/scriptable.rb
CHANGED
@@ -76,9 +76,14 @@ Gamefic::Scriptable.module_exec do
|
|
76
76
|
instance = self
|
77
77
|
theater ||= Object.new
|
78
78
|
theater.instance_exec do
|
79
|
-
|
80
|
-
|
81
|
-
|
79
|
+
if RUBY_ENGINE == 'opal' || RUBY_VERSION =~ /^2\.[456]\./
|
80
|
+
define_singleton_method :method_missing do |symbol, *args, &block|
|
81
|
+
instance.public_send :public_send, symbol, *args, &block
|
82
|
+
end
|
83
|
+
else
|
84
|
+
define_singleton_method :method_missing do |symbol, *args, **splat, &block|
|
85
|
+
instance.public_send :public_send, symbol, *args, **splat, &block
|
86
|
+
end
|
82
87
|
end
|
83
88
|
end
|
84
89
|
theater.extend Gamefic::Serialize
|
data/lib/gamefic/version.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'gamefic/action'
|
2
4
|
|
3
5
|
module Gamefic
|
@@ -91,23 +93,29 @@ module Gamefic
|
|
91
93
|
# @param command [Symbol] An imperative verb for the command
|
92
94
|
# @param queries [Array<Query::Base>] Filters for the command's tokens
|
93
95
|
# @yieldparam [Gamefic::Actor]
|
94
|
-
def meta(command, *queries, &
|
95
|
-
playbook.meta command, *queries, &
|
96
|
+
def meta(command, *queries, &block)
|
97
|
+
playbook.meta command, *queries, &block
|
96
98
|
end
|
97
99
|
|
98
100
|
# Add a proc to be evaluated before a character executes an action.
|
101
|
+
# When a verb is specified, the proc will only be evaluated if the
|
102
|
+
# action's verb matches it.
|
99
103
|
#
|
104
|
+
# @param verb [Symbol, nil]
|
100
105
|
# @yieldparam [Gamefic::Action]
|
101
|
-
def before_action &block
|
102
|
-
playbook.
|
106
|
+
def before_action verb = nil, &block
|
107
|
+
playbook.before_action verb, &block
|
103
108
|
end
|
104
109
|
alias validate before_action
|
105
110
|
|
106
111
|
# Add a proc to be evaluated after a character executes an action.
|
112
|
+
# When a verb is specified, the proc will only be evaluated if the
|
113
|
+
# action's verb matches it.
|
107
114
|
#
|
115
|
+
# @param [Symbol, nil]
|
108
116
|
# @yieldparam [Gamefic::Action]
|
109
|
-
def after_action &block
|
110
|
-
playbook.
|
117
|
+
def after_action verb = nil, &block
|
118
|
+
playbook.after_action verb, &block
|
111
119
|
end
|
112
120
|
|
113
121
|
# Create an alternate Syntax for an Action.
|
@@ -164,7 +172,7 @@ module Gamefic
|
|
164
172
|
elsif q.is_a?(Gamefic::Element) || (q.is_a?(Class) && q <= Gamefic::Element)
|
165
173
|
get_default_query.new(q)
|
166
174
|
else
|
167
|
-
raise ArgumentError
|
175
|
+
raise ArgumentError, "Invalid argument for response: #{q.inspect}"
|
168
176
|
end
|
169
177
|
end
|
170
178
|
end
|
@@ -5,6 +5,8 @@ module Gamefic
|
|
5
5
|
# A collection of rules for performing commands.
|
6
6
|
#
|
7
7
|
class Playbook
|
8
|
+
ActionHook = Struct.new(:verb, :block)
|
9
|
+
|
8
10
|
# An array of available syntaxes.
|
9
11
|
#
|
10
12
|
# @return [Array<Gamefic::Syntax>]
|
@@ -47,18 +49,24 @@ module Gamefic
|
|
47
49
|
end
|
48
50
|
|
49
51
|
# Add a proc to be evaluated before a character executes an action.
|
52
|
+
# When a verb is specified, the proc will only be evaluated if the
|
53
|
+
# action's verb matches it.
|
50
54
|
#
|
55
|
+
# @param verb [Symbol, nil]
|
51
56
|
# @yieldparam [Gamefic::Action]
|
52
|
-
def before_action &block
|
53
|
-
@before_actions.push block
|
57
|
+
def before_action verb = nil, &block
|
58
|
+
@before_actions.push ActionHook.new(verb, block)
|
54
59
|
end
|
55
60
|
alias validate before_action
|
56
61
|
|
57
62
|
# Add a proc to be evaluated after a character executes an action.
|
63
|
+
# When a verb is specified, the proc will only be evaluated if the
|
64
|
+
# action's verb matches it.
|
58
65
|
#
|
66
|
+
# @param verb [Symbol, nil]
|
59
67
|
# @yieldparam [Gamefic::Action]
|
60
|
-
def after_action &block
|
61
|
-
@after_actions.push block
|
68
|
+
def after_action verb = nil, &block
|
69
|
+
@after_actions.push ActionHook.new(verb, block)
|
62
70
|
end
|
63
71
|
|
64
72
|
# Get an Array of all Actions associated with the specified verb.
|
data/lib/gamefic/world/scenes.rb
CHANGED
@@ -1,6 +1,9 @@
|
|
1
1
|
module Gamefic
|
2
2
|
module World
|
3
3
|
module Scenes
|
4
|
+
include Commands
|
5
|
+
include Players
|
6
|
+
|
4
7
|
# @return [Class<Gamefic::Scene::Activity>]
|
5
8
|
def default_scene
|
6
9
|
@default_scene ||= Scene::Activity
|
@@ -29,13 +32,12 @@ module Gamefic
|
|
29
32
|
# This method is typically called by the Engine that manages game execution.
|
30
33
|
#
|
31
34
|
# @param [Gamefic::Actor]
|
35
|
+
# @return [void]
|
32
36
|
def introduce(player)
|
33
37
|
player.playbooks.push playbook unless player.playbooks.include?(playbook)
|
34
38
|
player.cue default_scene
|
35
39
|
players.push player
|
36
|
-
@introduction
|
37
|
-
# @todo Find a better way to persist player characters
|
38
|
-
# Gamefic::Index.stick
|
40
|
+
@introduction&.call(player)
|
39
41
|
end
|
40
42
|
|
41
43
|
# Create a multiple-choice scene.
|
@@ -53,7 +55,7 @@ module Gamefic
|
|
53
55
|
# @yieldparam [Gamefic::Scene::MultipleChoice]
|
54
56
|
# @return [Class<Gamefic::Scene::MultipleChoice>]
|
55
57
|
def multiple_choice *choices, &block
|
56
|
-
s = Scene::MultipleChoice.subclass do |
|
58
|
+
s = Scene::MultipleChoice.subclass do |_actor, scene|
|
57
59
|
scene.options.concat choices
|
58
60
|
scene.on_finish &block
|
59
61
|
end
|
@@ -73,12 +75,12 @@ module Gamefic
|
|
73
75
|
# end
|
74
76
|
# end
|
75
77
|
#
|
76
|
-
# @param prompt [String]
|
78
|
+
# @param prompt [String, nil]
|
77
79
|
# @yieldparam [Gamefic::Actor]
|
78
80
|
# @yieldparam [Gamefic::Scene::YesOrNo]
|
79
81
|
# @return [Class<Gamefic::Scene::YesOrNo>]
|
80
82
|
def yes_or_no prompt = nil, &block
|
81
|
-
s = Scene::YesOrNo.subclass do |
|
83
|
+
s = Scene::YesOrNo.subclass do |_actor, scene|
|
82
84
|
scene.prompt = prompt
|
83
85
|
scene.on_finish &block
|
84
86
|
end
|
@@ -98,7 +100,7 @@ module Gamefic
|
|
98
100
|
# @yieldparam [Gamefic::Scene::Base]
|
99
101
|
# @return [Class<Gamefic::Scene::Base>]
|
100
102
|
def question prompt = 'What is your answer?', &block
|
101
|
-
s = Scene::Base.subclass do |
|
103
|
+
s = Scene::Base.subclass do |_actor, scene|
|
102
104
|
scene.prompt = prompt
|
103
105
|
scene.on_finish &block
|
104
106
|
end
|
@@ -116,13 +118,13 @@ module Gamefic
|
|
116
118
|
# actor.prepare default_scene
|
117
119
|
# end
|
118
120
|
#
|
119
|
-
# @param prompt [String] The text to display when prompting the user to continue
|
121
|
+
# @param prompt [String, nil] The text to display when prompting the user to continue
|
120
122
|
# @yieldparam [Gamefic::Actor]
|
121
123
|
# @return [Class<Gamefic::Scene::Pause>]
|
122
124
|
def pause prompt = nil, &block
|
123
125
|
s = Scene::Pause.subclass do |actor, scene|
|
124
126
|
scene.prompt = prompt unless prompt.nil?
|
125
|
-
block
|
127
|
+
block&.call(actor, scene)
|
126
128
|
end
|
127
129
|
scene_classes.push s
|
128
130
|
s
|
@@ -163,7 +165,7 @@ module Gamefic
|
|
163
165
|
# end
|
164
166
|
# end
|
165
167
|
#
|
166
|
-
# @param cls [Class] The class of scene to be instantiated.
|
168
|
+
# @param cls [Class<Scene::Base>] The class of scene to be instantiated.
|
167
169
|
# @yieldparam [Gamefic::Actor]
|
168
170
|
# @return [Class<Gamefic::Scene::Base>]
|
169
171
|
def custom cls = Scene::Base, &block
|
@@ -208,10 +210,10 @@ module Gamefic
|
|
208
210
|
# @return [Class<Gamefic::Scene::MultipleScene>]
|
209
211
|
def multiple_scene map = {}, &block
|
210
212
|
s = Scene::MultipleScene.subclass do |actor, scene|
|
211
|
-
map.each_pair
|
213
|
+
map.each_pair do |k, v|
|
212
214
|
scene.map k, v
|
213
|
-
|
214
|
-
block
|
215
|
+
end
|
216
|
+
block&.call actor, scene
|
215
217
|
end
|
216
218
|
scene_classes.push s
|
217
219
|
s
|
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: 2.
|
4
|
+
version: 2.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: 2023-
|
11
|
+
date: 2023-02-11 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rake
|
@@ -70,6 +70,7 @@ executables: []
|
|
70
70
|
extensions: []
|
71
71
|
extra_rdoc_files: []
|
72
72
|
files:
|
73
|
+
- ".github/workflows/rspec.yml"
|
73
74
|
- ".gitignore"
|
74
75
|
- ".rspec"
|
75
76
|
- ".rubocop.yml"
|
@@ -142,7 +143,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
142
143
|
requirements:
|
143
144
|
- - ">="
|
144
145
|
- !ruby/object:Gem::Version
|
145
|
-
version: 2.
|
146
|
+
version: 2.3.0
|
146
147
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
147
148
|
requirements:
|
148
149
|
- - ">="
|