gamefic 1.0.0 → 1.1.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 42ffeca62def8cbb07d70245a06be065a602c28d
4
- data.tar.gz: 49c299be7bafa2aef310aeef08f84b17631b3ce4
3
+ metadata.gz: b365a88c85293650a4450cb905443a222aa1fa23
4
+ data.tar.gz: 2e299521b31b1c357651c52b7d2978c69988f306
5
5
  SHA512:
6
- metadata.gz: a2b1a5142f260633c4b3d59f2c2cd48896926566554e67fe89f09ad0cdd15f98ff2305a09ca8022af3bbc1ae7d50108a9e6a7ead77a1aa48c2445837e918e8b4
7
- data.tar.gz: 199e10aa6fd28ed8c4d29dbd17eb6420ff5350fa3689e23ba9f4468af75febf9a115af328e6652365a585c3df70bf2a81cf8b803270cf28ff4810a3346fdead0
6
+ metadata.gz: 5839d40d6211f3327e7f0d79667e591456e44a72da1f622f87af99127dcc97a207b6cefe06f6beb5edb75e135d85b1517a8731504b032fa706062f86d4c69e0b
7
+ data.tar.gz: 6ad1537348f09477915daab0a77b1709cea1380145323ab4d803565898f9ab693bd0fd065dd33eef57d94d09d104355d64e7119978e2f57fba359c58a599fde5
@@ -1,5 +1,10 @@
1
1
  module Gamefic
2
2
 
3
+ # Exception raised when the Action's proc arity is not compatible with the
4
+ # number of queries
5
+ class ActionArgumentError < ArgumentError
6
+ end
7
+
3
8
  # Actions manage the execution of commands that Characters can perform.
4
9
  #
5
10
  class Action
@@ -7,28 +12,24 @@ module Gamefic
7
12
  attr_writer :meta
8
13
  @@order_key_seed = 0
9
14
 
10
- def initialize(plot, verb, *queries, &proc)
15
+ def initialize(verb, *queries, &proc)
11
16
  if !verb.kind_of?(Symbol)
12
17
  verb = verb.to_s
13
18
  verb = nil if verb == ''
14
19
  end
15
- @plot = plot
16
20
  @order_key = @@order_key_seed
17
21
  @@order_key_seed += 1
18
22
  @proc = proc
19
23
  if (verb.kind_of?(Symbol) == false and !verb.nil?)
20
- raise "Action verbs must be symbols"
24
+ raise "Action verbs must be symbols #{verb}"
21
25
  end
22
26
  if !@proc.nil?
23
- if (queries.length + 1 != @proc.arity) and (queries.length == 0 and @proc.arity != -1)
24
- raise "Number of queries is not compatible with proc arguments"
27
+ if (queries.length + 1 != @proc.arity) and (@proc.arity > 0)
28
+ raise ActionArgumentError.new("Number of queries is not compatible with proc arguments")
25
29
  end
26
30
  end
27
31
  @verb = verb
28
32
  @queries = queries
29
- if !plot.nil?
30
- plot.send :add_action, self
31
- end
32
33
  end
33
34
 
34
35
  # Get the specificity of the Action.
@@ -44,14 +45,12 @@ module Gamefic
44
45
  if verb.nil?
45
46
  spec = -100
46
47
  end
47
- magnitude = 1
48
48
  @queries.each { |q|
49
49
  if q.kind_of?(Query::Base)
50
- spec += (q.specificity * magnitude)
50
+ spec += q.specificity
51
51
  else
52
- spec += magnitude
52
+ spec += 1
53
53
  end
54
- #magnitude = magnitude * 10
55
54
  }
56
55
  return spec
57
56
  end
@@ -4,7 +4,7 @@ module Gamefic
4
4
  # If we use Query::Base.new in the @disambiguator declaration, Opal
5
5
  # passes the block to the query instead of the action.
6
6
  base = Query::Base.new
7
- @@disambiguator = Action.new nil, nil, base do |actor, entities|
7
+ @@disambiguator = Action.new nil, base do |actor, entities|
8
8
  definites = []
9
9
  entities.each { |entity|
10
10
  definites.push entity.definitely
@@ -23,53 +23,7 @@ module Gamefic
23
23
  while !executed
24
24
  order = @orders.shift
25
25
  break if order.nil?
26
- arg_i = 0
27
- final_arguments = []
28
- order.arguments.each { |argument|
29
- if argument.length > 1 and !order.action.queries[arg_i].allow_many?
30
- if argument[0].kind_of?(Array)
31
- # This thing refers to multiple items. Just keep going.
32
- final_arguments = nil
33
- break
34
- else
35
- ambiguous = argument
36
- end
37
- order = Order.new(@actor, @@disambiguator, [])
38
- final_arguments = [ambiguous]
39
- break
40
- end
41
- valid = []
42
- if order.action.queries[arg_i].allow_ambiguous?
43
- valid = argument.flatten
44
- else
45
- argument.each { |m|
46
- if order.action.queries[arg_i].validate(@actor, m)
47
- valid.push m
48
- else
49
- final_arguments = nil
50
- break
51
- end
52
- }
53
- end
54
- if order.action == @@disambiguator or final_arguments.nil?
55
- break
56
- end
57
- if order.action.queries[arg_i].allow_many?
58
- final_arguments.push valid.flatten
59
- elsif valid.length == 1
60
- final_arguments.push valid[0]
61
- else
62
- final_arguments = nil
63
- break
64
- end
65
- arg_i += 1
66
- }
67
- if !final_arguments.nil?
68
- # The actor is always the first argument to an Action proc
69
- final_arguments.unshift @actor
70
- order.action.execute(*final_arguments)
71
- executed = true
72
- end
26
+ executed = try(order)
73
27
  end
74
28
  @actor.send(:delegate_stack).pop
75
29
  end
@@ -86,6 +40,65 @@ module Gamefic
86
40
  proceed
87
41
  end
88
42
  private
43
+ def try order
44
+ executed = false
45
+ arg_i = 0
46
+ final_arguments = []
47
+ order.arguments.each { |argument|
48
+ if argument.length > 1 and !order.action.queries[arg_i].allow_many?
49
+ if argument[0].kind_of?(Array)
50
+ # This thing refers to multiple items. Just keep going.
51
+ final_arguments = nil
52
+ break
53
+ else
54
+ ambiguous = argument
55
+ end
56
+ order = Order.new(@actor, @@disambiguator, [])
57
+ final_arguments = [ambiguous]
58
+ break
59
+ end
60
+ if order.action.queries[arg_i].allow_ambiguous?
61
+ valid = argument.flatten
62
+ else
63
+ valid = validate(argument, arg_i, order)
64
+ if valid.nil?
65
+ final_arguments = nil
66
+ break
67
+ end
68
+ end
69
+ if order.action == @@disambiguator or final_arguments.nil?
70
+ break
71
+ end
72
+ if order.action.queries[arg_i].allow_many?
73
+ final_arguments.push valid.flatten
74
+ elsif valid.length == 1
75
+ final_arguments.push valid[0]
76
+ else
77
+ final_arguments = nil
78
+ break
79
+ end
80
+ arg_i += 1
81
+ }
82
+ if !final_arguments.nil?
83
+ # The actor is always the first argument to an Action proc
84
+ final_arguments.unshift @actor
85
+ order.action.execute(*final_arguments)
86
+ executed = true
87
+ end
88
+ executed
89
+ end
90
+ def validate argument, arg_i, order
91
+ valid = []
92
+ argument.each { |m|
93
+ if order.action.queries[arg_i].validate(@actor, m)
94
+ valid.push m
95
+ else
96
+ valid = nil
97
+ break
98
+ end
99
+ }
100
+ valid
101
+ end
89
102
  end
90
103
  end
91
104
  end
@@ -102,7 +102,7 @@ module Gamefic
102
102
  objects.push Order.new(actor, action, prepared)
103
103
  else
104
104
  if !action.queries.last.allow_many? or action.queries.last.allow_ambiguous?
105
- misunderstood = Action.new nil, nil, Query::Text.new do |actor, text|
105
+ misunderstood = Action.new nil, Query::Text.new do |actor, text|
106
106
  actor.tell "I understand the first part of your command but not \"#{text}.\""
107
107
  end
108
108
  misunderstood.meta = true
@@ -33,10 +33,7 @@ module Gamefic
33
33
  @stream.ansi
34
34
  end
35
35
  def save filename, snapshot
36
- data = {
37
- :metadata => @character.plot.metadata,
38
- :entities => snapshot
39
- }
36
+ data = snapshot.merge(:metadata => @character.plot.metadata)
40
37
  json = JSON.generate data
41
38
  if json.nil?
42
39
  @character.tell "Nothing to save."
@@ -63,7 +60,7 @@ module Gamefic
63
60
  if (data[:metadata] != @character.plot.metadata)
64
61
  @character.tell "The save file is not compatible with this version of the game."
65
62
  else
66
- return data[:entities]
63
+ return data
67
64
  end
68
65
  else
69
66
  @character.tell "File \"#{filename}\" not found."
@@ -5,6 +5,7 @@ require 'gamefic/tester'
5
5
  require 'gamefic/source'
6
6
  require 'gamefic/script'
7
7
  require 'gamefic/query'
8
+ require 'gamefic/subplot'
8
9
 
9
10
  module Gamefic
10
11
 
@@ -25,8 +26,11 @@ module Gamefic
25
26
  # Gamefic Studio has a PlotStageMetaMapper that handles it, but it doesn't run if
26
27
  # the plugin isn't activated.
27
28
  #include Gamefic, Tester, SceneMount, CommandMount, EntityMount, QueryMount, ArticleMount, YouMount, Snapshot
28
- mount Gamefic, Tester, SceneMount, CommandMount, EntityMount, QueryMount, ArticleMount, YouMount, Snapshot
29
- expose :script, :introduction, :assert_action, :before_player_update, :on_update, :on_player_update, :entities, :on_ready, :on_player_ready, :players, :scenes, :metadata
29
+ mount Gamefic, Tester, SceneMount, CommandMount, EntityMount, QueryMount,
30
+ ArticleMount, YouMount, Snapshot, Subplot::Host
31
+ expose :script, :introduction, :assert_action, :before_player_update,
32
+ :on_update, :on_player_update, :entities, :on_ready, :on_player_ready,
33
+ :players, :scenes, :metadata
30
34
 
31
35
  # @param [Source::Base]
32
36
  def initialize(source = nil)
@@ -44,6 +48,7 @@ module Gamefic
44
48
  @players = []
45
49
  @asserts = {}
46
50
  @default_scene = :active
51
+ @subplots = []
47
52
  post_initialize
48
53
  end
49
54
 
@@ -165,6 +170,7 @@ module Gamefic
165
170
  # Introduce a player to the game.
166
171
  # This method is typically called by the Engine that manages game execution.
167
172
  def introduce(player)
173
+ player.extend Subplot::Feature
168
174
  @players.push player
169
175
  if @introduction != nil
170
176
  @introduction.call(player)
@@ -341,7 +347,7 @@ module Gamefic
341
347
  user_friendly += " #{new_name}"
342
348
  args.push new_name
343
349
  }
344
- Syntax.new self, user_friendly.strip, "#{action.verb} #{args.join(' ')}"
350
+ add_syntax Syntax.new(user_friendly.strip, "#{action.verb} #{args.join(' ')}")
345
351
  end
346
352
  def rem_action(action)
347
353
  @commands[action.verb].delete(action)
@@ -24,7 +24,9 @@ module Gamefic
24
24
  act
25
25
  end
26
26
  def action(command, *queries, &proc)
27
- Action.new(self, command, *queries, &proc)
27
+ act = Action.new(command, *queries, &proc)
28
+ add_action act
29
+ act
28
30
  end
29
31
  # Create an Action that responds to a command.
30
32
  # An Action uses the command argument to identify the imperative verb that
@@ -72,7 +74,8 @@ module Gamefic
72
74
  xlate(*args)
73
75
  end
74
76
  def xlate(*args)
75
- syn = Syntax.new(self, *args)
77
+ syn = Syntax.new(*args)
78
+ add_syntax syn
76
79
  syn
77
80
  end
78
81
  def commandwords
@@ -2,6 +2,10 @@ require 'json'
2
2
 
3
3
  module Gamefic
4
4
  module Plot::Snapshot
5
+
6
+ # Take a snapshot of the plot's current state.
7
+ #
8
+ # @return [Hash]
5
9
  def save
6
10
  store = []
7
11
  index = 0
@@ -44,44 +48,59 @@ module Gamefic
44
48
  else
45
49
  store = reduce(store)
46
50
  end
47
- store
51
+ return {
52
+ entities: store,
53
+ subplots: save_subplots
54
+ }
48
55
  end
56
+
57
+ # Restore the plot to the state of the provided snapshot.
58
+ #
59
+ # @param [Hash]
49
60
  def restore snapshot
50
- internal_restore snapshot, true
61
+ restore_initial_state
62
+ internal_restore snapshot[:entities]
63
+ restore_subplots snapshot[:subplots]
51
64
  end
65
+
52
66
  private
53
- def internal_restore snapshot, with_restore = true
54
- if with_restore
67
+
68
+ # Restore the plot to the state of its first snapshot.
69
+ #
70
+ def restore_initial_state
55
71
  @entities[@initial_state.length..-1].each { |e|
56
72
  e.parent = nil
57
73
  }
58
74
  @entities.slice! @initial_state.length..-1
59
- internal_restore @initial_state, false
60
- end
75
+ internal_restore @initial_state
76
+ end
77
+
78
+ def internal_restore snapshot
61
79
  index = 0
62
80
  snapshot.each { |hash|
63
81
  if entities[index].nil?
64
- if with_restore
65
- cls = Kernel.const_get(hash[:class])
66
- entities[index] = make cls
67
- else
68
- break
69
- end
82
+ cls = Kernel.const_get(hash[:class])
83
+ @entities[index] = make cls
70
84
  end
71
- hash.each_pair { |k, v|
72
- if k == :scene
73
- entities[index].cue v.to_sym
74
- else
75
- entities[index].send("#{k}=", unserialize(v)) if k != :session and k != :class
76
- end
77
- }
85
+ internal_restore_hash hash, index
86
+ index += 1
87
+ }
88
+ nil
89
+ end
90
+ def internal_restore_hash hash, index
91
+ hash.each { |k, v|
92
+ if k == :scene
93
+ entities[index].cue v.to_sym
94
+ elsif (k != :session and k != :class)
95
+ entities[index].send("#{k}=", unserialize(v))
96
+ end
78
97
  unless hash[:session].nil?
79
98
  hash[:session].each_pair { |k, v|
80
99
  entities[index].session[k.to_sym] = unserialize(v)
81
100
  }
82
101
  end
83
- index += 1
84
102
  }
103
+ nil
85
104
  end
86
105
  def reduce entities
87
106
  reduced = []
@@ -98,7 +117,6 @@ module Gamefic
98
117
  }
99
118
  reduced
100
119
  end
101
- private
102
120
  def can_serialize? obj
103
121
  return true if (obj == true or obj == false or obj.nil?)
104
122
  allowed = [String, Fixnum, Float, Numeric, Entity, Direction, Hash, Array, Symbol]
@@ -111,23 +129,9 @@ module Gamefic
111
129
  return nil if obj.nil?
112
130
  return false if obj == false
113
131
  if obj.kind_of?(Hash)
114
- hash = {}
115
- obj.each_pair { |k, v|
116
- if can_serialize?(k) and can_serialize?(v)
117
- hash[serialize_obj(k)] = serialize_obj(v)
118
- end
119
- }
120
- return hash
132
+ return serialize_hash obj
121
133
  elsif obj.kind_of?(Array)
122
- arr = []
123
- obj.each_index { |i|
124
- if can_serialize?(obj[i])
125
- arr[i] = serialize_obj(obj[i])
126
- else
127
- raise "Bad array in snapshot"
128
- end
129
- }
130
- return arr
134
+ return serialize_array obj
131
135
  else
132
136
  if obj.kind_of?(Entity)
133
137
  return "#<EIN_#{@entities.index(obj)}>"
@@ -137,29 +141,91 @@ module Gamefic
137
141
  end
138
142
  return obj
139
143
  end
144
+ def serialize_hash obj
145
+ hash = {}
146
+ obj.each_pair { |k, v|
147
+ if can_serialize?(k) and can_serialize?(v)
148
+ hash[serialize_obj(k)] = serialize_obj(v)
149
+ end
150
+ }
151
+ return hash
152
+ end
153
+ def serialize_array obj
154
+ arr = []
155
+ obj.each_index { |i|
156
+ if can_serialize?(obj[i])
157
+ arr[i] = serialize_obj(obj[i])
158
+ else
159
+ raise "Bad array in snapshot"
160
+ end
161
+ }
162
+ return arr
163
+ end
140
164
  def unserialize obj
141
165
  if obj.kind_of?(Hash)
142
- hash = {}
143
- obj.each_pair { |k, v|
144
- hash[unserialize(k)] = unserialize(v)
145
- }
146
- hash
166
+ unserialize_hash obj
147
167
  elsif obj.kind_of?(Array)
148
- arr = []
149
- obj.each_index { |i|
150
- arr[i] = unserialize(obj[i])
151
- }
152
- arr
168
+ unserialize_array obj
169
+ elsif obj.to_s.match(/^#<EIN_[0-9]+>$/)
170
+ i = obj[6..-2].to_i
171
+ @entities[i]
172
+ elsif obj.to_s.match(/^#<DIR_[a-z]+>$/)
173
+ Direction.find(obj[6..-2])
153
174
  else
154
- if obj.to_s.match(/^#<EIN_[0-9]+>$/)
155
- i = obj[6..-2].to_i
156
- @entities[i]
157
- elsif obj.to_s.match(/^#<DIR_[a-z]+>$/)
158
- Direction.find(obj[6..-2])
159
- else
160
- obj
161
- end
175
+ obj
162
176
  end
163
177
  end
178
+ def unserialize_hash obj
179
+ hash = {}
180
+ obj.each_pair { |k, v|
181
+ hash[unserialize(k)] = unserialize(v)
182
+ }
183
+ hash
184
+ end
185
+ def unserialize_array obj
186
+ arr = []
187
+ obj.each_index { |i|
188
+ arr[i] = unserialize(obj[i])
189
+ }
190
+ arr
191
+ end
192
+ def save_subplots
193
+ arr = []
194
+ subplots.each { |s|
195
+ hash = {}
196
+ hash[:class] = s.class.to_s
197
+ s.instance_variables.each { |k|
198
+ v = s.instance_variable_get(k)
199
+ if can_serialize?(v)
200
+ hash[k] = serialize_obj(v)
201
+ end
202
+ }
203
+ arr.push hash
204
+ }
205
+ arr
206
+ end
207
+ def restore_subplots arr
208
+ players.each { |p|
209
+ p.send(:p_subplots).clear
210
+ }
211
+ p_subplots.clear
212
+ arr.each { |hash|
213
+ cls = Kernel.const_get(hash[:class])
214
+ subplot = cls.new self
215
+ hash.each { |k, v|
216
+ if k != :class
217
+ subplot.instance_variable_set(k, unserialize(v))
218
+ end
219
+ }
220
+ subplot.players.each { |p|
221
+ p.send(:p_subplots).push subplot
222
+ }
223
+ subplot.entities.each { |e|
224
+ e.extend Subplot::Element
225
+ e.instance_variable_set(:@subplot, subplot)
226
+ }
227
+ p_subplots.push subplot
228
+ }
229
+ end
164
230
  end
165
231
  end
@@ -0,0 +1,81 @@
1
+ module Gamefic
2
+
3
+ class Subplot
4
+ module Element
5
+ attr_reader :subplot
6
+ end
7
+ module Feature
8
+ def subplots
9
+ p_subplots.clone
10
+ end
11
+ private
12
+ def p_subplots
13
+ @p_subplots ||= []
14
+ end
15
+ end
16
+ module Host
17
+ # Get an array of all the current subplots.
18
+ #
19
+ # @return [Array<Subplot>]
20
+ def subplots
21
+ p_subplots.clone
22
+ end
23
+
24
+ # Start a new subplot based on the provided class.
25
+ #
26
+ # @param [Class] The class of the subplot to be created (Subplot by default)
27
+ # @return [Subplot]
28
+ def branch subplot_class = Subplot, &block
29
+ subplot = subplot_class.new(self, &block)
30
+ p_subplots.push subplot
31
+ subplot
32
+ end
33
+
34
+ private
35
+ def p_subplots
36
+ @p_subplots ||= []
37
+ end
38
+ end
39
+
40
+ attr_reader :plot, :entities, :players
41
+
42
+ def initialize plot
43
+ @plot = plot
44
+ @entities = []
45
+ @players = []
46
+ @concluded = false
47
+ post_initialize
48
+ yield(self) if block_given?
49
+ end
50
+ def post_initialize
51
+ end
52
+ def make *args
53
+ e = plot.make(*args)
54
+ e.extend Gamefic::Subplot::Element
55
+ e.instance_variable_set(:@subplot, self)
56
+ entities.push e
57
+ e
58
+ end
59
+ def introduce player
60
+ player.send(:p_subplots).push self
61
+ players.push player
62
+ end
63
+ def exeunt player
64
+ player.send(:p_subplots).delete self
65
+ players.delete player
66
+ end
67
+ def conclude
68
+ concluded = true
69
+ entities.each { |e|
70
+ e.destroy
71
+ }
72
+ players.each { |p|
73
+ exeunt p
74
+ }
75
+ end
76
+ def concluded?
77
+ @concluded
78
+ end
79
+ end
80
+
81
+ end
@@ -6,7 +6,7 @@ module Gamefic
6
6
  attr_reader :token_count, :first_word, :verb, :template, :command
7
7
  @@phrase = '([\w\W\s\S]*?)'
8
8
 
9
- def initialize plot, template, *command
9
+ def initialize template, *command
10
10
  command = command.join(' ')
11
11
  words = template.split_words
12
12
  @token_count = words.length
@@ -50,9 +50,6 @@ module Gamefic
50
50
  }
51
51
  @replace = subs.join(' ')
52
52
  @regexp = Regexp.new("^#{tokens.join(' ')}$", Regexp::IGNORECASE)
53
- if !plot.nil?
54
- plot.send :add_syntax, self
55
- end
56
53
  end
57
54
 
58
55
  # Convert a String into a Command.
@@ -1,3 +1,3 @@
1
1
  module Gamefic
2
- VERSION = '1.0.0'
2
+ VERSION = '1.1.0'
3
3
  end
metadata CHANGED
@@ -1,41 +1,55 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: gamefic
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0
4
+ version: 1.1.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: 2016-09-15 00:00:00.000000000 Z
11
+ date: 2016-11-27 00:00:00.000000000 Z
12
12
  dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: slop
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ~>
18
+ - !ruby/object:Gem::Version
19
+ version: '4.0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ~>
25
+ - !ruby/object:Gem::Version
26
+ version: '4.0'
13
27
  - !ruby/object:Gem::Dependency
14
28
  name: rubyzip
15
29
  requirement: !ruby/object:Gem::Requirement
16
30
  requirements:
17
- - - ">="
31
+ - - '>='
18
32
  - !ruby/object:Gem::Version
19
33
  version: '0'
20
34
  type: :runtime
21
35
  prerelease: false
22
36
  version_requirements: !ruby/object:Gem::Requirement
23
37
  requirements:
24
- - - ">="
38
+ - - '>='
25
39
  - !ruby/object:Gem::Version
26
40
  version: '0'
27
41
  - !ruby/object:Gem::Dependency
28
42
  name: rspec
29
43
  requirement: !ruby/object:Gem::Requirement
30
44
  requirements:
31
- - - ">="
45
+ - - '>='
32
46
  - !ruby/object:Gem::Version
33
47
  version: '0'
34
48
  type: :development
35
49
  prerelease: false
36
50
  version_requirements: !ruby/object:Gem::Requirement
37
51
  requirements:
38
- - - ">="
52
+ - - '>='
39
53
  - !ruby/object:Gem::Version
40
54
  version: '0'
41
55
  description: An adventure game and interactive fiction framework
@@ -124,6 +138,7 @@ files:
124
138
  - lib/gamefic/source/file.rb
125
139
  - lib/gamefic/source/text.rb
126
140
  - lib/gamefic/stage.rb
141
+ - lib/gamefic/subplot.rb
127
142
  - lib/gamefic/syntax.rb
128
143
  - lib/gamefic/tester.rb
129
144
  - lib/gamefic/version.rb
@@ -137,18 +152,19 @@ require_paths:
137
152
  - lib
138
153
  required_ruby_version: !ruby/object:Gem::Requirement
139
154
  requirements:
140
- - - ">="
155
+ - - '>='
141
156
  - !ruby/object:Gem::Version
142
- version: 1.9.3
157
+ version: 2.0.0
143
158
  required_rubygems_version: !ruby/object:Gem::Requirement
144
159
  requirements:
145
- - - ">="
160
+ - - '>='
146
161
  - !ruby/object:Gem::Version
147
162
  version: '0'
148
163
  requirements: []
149
164
  rubyforge_project:
150
- rubygems_version: 2.4.8
165
+ rubygems_version: 2.6.8
151
166
  signing_key:
152
167
  specification_version: 4
153
168
  summary: Gamefic
154
169
  test_files: []
170
+ has_rdoc: