gamefic-sdk 2.4.0 → 3.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (38) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/rspec.yml +40 -0
  3. data/.rspec +2 -3
  4. data/CHANGELOG.md +14 -0
  5. data/README.md +1 -1
  6. data/bin/console +14 -14
  7. data/gamefic-sdk.gemspec +6 -6
  8. data/lib/gamefic-sdk/diagram.rb +23 -15
  9. data/lib/gamefic-sdk/scaffold.rb +15 -8
  10. data/lib/gamefic-sdk/server.rb +8 -22
  11. data/lib/gamefic-sdk/tasks/common.rb +15 -0
  12. data/lib/gamefic-sdk/tasks/ruby.rb +4 -4
  13. data/lib/gamefic-sdk/tasks/web.rb +22 -26
  14. data/lib/gamefic-sdk/tasks.rb +1 -0
  15. data/lib/gamefic-sdk/version.rb +1 -1
  16. data/scaffolds/library/__name__.gemspec.gf.erb +37 -12
  17. data/scaffolds/library/lib/__name__/version.rb.gf.erb +5 -0
  18. data/scaffolds/library/lib/__name__.rb.gf.erb +10 -0
  19. data/scaffolds/project/README.md.gf.erb +2 -2
  20. data/scaffolds/project/__name__/plot.rb.gf.erb +17 -0
  21. data/scaffolds/project/__name__/subplot.rb.gf.erb +12 -0
  22. data/scaffolds/project/main.rb.gf.erb +7 -6
  23. metadata +31 -53
  24. data/scaffolds/library/lib/__name__.rb +0 -5
  25. data/scaffolds/react/.babelrc +0 -3
  26. data/scaffolds/react/package.json.gf.erb +0 -34
  27. data/scaffolds/react/web/public/index.html.gf.erb +0 -11
  28. data/scaffolds/react/web/src/driver/development.js +0 -4
  29. data/scaffolds/react/web/src/driver/opal.rb +0 -7
  30. data/scaffolds/react/web/src/driver/production.js +0 -5
  31. data/scaffolds/react/web/src/index.js +0 -28
  32. data/scaffolds/react/web/src/scenes/Activity.jsx +0 -13
  33. data/scaffolds/react/web/src/scenes/Conclusion.jsx +0 -12
  34. data/scaffolds/react/web/src/scenes/MultipleChoice.jsx +0 -13
  35. data/scaffolds/react/web/src/scenes/Pause.jsx +0 -13
  36. data/scaffolds/react/web/src/scenes/index.js +0 -11
  37. data/scaffolds/react/web/src/style.css +0 -3
  38. data/scaffolds/react/webpack.config.js +0 -74
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 76da51db81b6dc52df2c2c5e845f778ff9a9d71154f707b19ae387f391b8e6b2
4
- data.tar.gz: 2ac813718878085ddf4480afea7b833aba67bf4f090729719d06b03f322a17ac
3
+ metadata.gz: a65534f07f1678a5e82275ec3a8e8158e8d96096d4adcf8e1d4277ab8961a5dd
4
+ data.tar.gz: fd315e465a03350354a2c0f795088d63d14b16ec55a83a7025eef28dca35017f
5
5
  SHA512:
6
- metadata.gz: 59fdb821c8e7fc454182c69b91bc9915b0086e4aaa2048de90c22b5cbf74c62ef216a7ca25a972e3c1786170ed1c5a1ca46fac668bb6ebf9eeff6c0aade26f07
7
- data.tar.gz: 6646a38f8a8bd6dcf0c50fccc48cdad108adf5122a2c6a047ecc1ae675d95d5ce1d6f3a153df72b0962c322e9b9973e60e9fb7536a9e7c37e4095686e5f9006e
6
+ metadata.gz: 452327933e7a5f43100f4331a324b77b45e585187d9f470e15c4c4fb4cf3414105551430e340c4ae07f9e9c73ff082444d6840940a039478282cf71f517e8193
7
+ data.tar.gz: 6f2dacd9c0f9273baebb359a25397ac5e3589c85ae1081a9e12d5472ee4f575d7edc6cab940654b2581ac75076bda01aaf92be56215707dbbcf37141e36c92a1
@@ -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.7', '3.0', '3.1']
26
+
27
+ steps:
28
+ - uses: actions/checkout@v3
29
+ - name: Set up Ruby
30
+ uses: ruby/setup-ruby@v1
31
+ with:
32
+ ruby-version: ${{ matrix.ruby-version }}
33
+ bundler-cache: false
34
+ # - uses: browser-actions/setup-geckodriver@latest
35
+ # with:
36
+ # token: ${{ secrets.GITHUB_TOKEN }}
37
+ - name: Install dependencies
38
+ run: bundle install
39
+ - name: Run tests
40
+ run: bundle exec rspec --tag ~type:feature
data/.rspec CHANGED
@@ -1,3 +1,2 @@
1
- --format documentation
2
- --color
3
- --require spec_helper
1
+ --color
2
+ --require spec_helper
data/CHANGELOG.md CHANGED
@@ -1,3 +1,17 @@
1
+ ## 3.0.0 - January 27, 2024
2
+ - Deprecate broken/redundant commands
3
+ - Improved serialization
4
+ - Queries use proxies for static entities
5
+ - All scripted blocks get evaluated on stage
6
+ - Use create-react-gamefic for web scaffolds
7
+ - Modular projects and libraries
8
+ - New project scaffold
9
+
10
+ ## 2.5.0 - February 11, 2023
11
+ - Update dependencies
12
+ - Improve tests and examples
13
+ - Add RSpec workflow
14
+
1
15
  ## 2.4.0 - September 9, 2021
2
16
  - Update dependencies
3
17
  - README template formatting
data/README.md CHANGED
@@ -74,7 +74,7 @@ require 'gamefic-standard'
74
74
  Gamefic.script do
75
75
  @living_room = make Room, name: 'living room', description: 'This is your living room.'
76
76
  @bedroom = make Room, name: 'bedroom', description: 'This is your bedroom.'
77
- @living_room.connect @bedroom, 'north'
77
+ connect @living_room, @bedroom, 'north'
78
78
  @backpack = make Room, name: 'backpack', description: 'Your trusty backpack.', parent: @bedroom
79
79
  @book = make Room, name: 'book', description: 'Your favorite novel.', parent: @living_room
80
80
 
data/bin/console CHANGED
@@ -1,14 +1,14 @@
1
- #!/usr/bin/env ruby
2
-
3
- require "bundler/setup"
4
- require "gamefic/sdk"
5
-
6
- # You can add fixtures and/or initialization code here to make experimenting
7
- # with your gem easier. You can also use a different console, if you like.
8
-
9
- # (If you use this, don't forget to add pry to your Gemfile!)
10
- # require "pry"
11
- # Pry.start
12
-
13
- require "irb"
14
- IRB.start(__FILE__)
1
+ #!/usr/bin/env ruby
2
+
3
+ require "bundler/setup"
4
+ require "gamefic-sdk"
5
+
6
+ # You can add fixtures and/or initialization code here to make experimenting
7
+ # with your gem easier. You can also use a different console, if you like.
8
+
9
+ # (If you use this, don't forget to add pry to your Gemfile!)
10
+ # require "pry"
11
+ # Pry.start
12
+
13
+ require "irb"
14
+ IRB.start(__FILE__)
data/gamefic-sdk.gemspec CHANGED
@@ -22,21 +22,21 @@ Gem::Specification.new do |s|
22
22
  s.executables = ['gamefic']
23
23
  s.require_paths = ['lib']
24
24
 
25
- s.required_ruby_version = '>= 2.3.0'
25
+ s.required_ruby_version = '>= 2.7.0'
26
26
 
27
- s.add_runtime_dependency 'gamefic', '~> 2.0', '>= 2.1.1'
28
- s.add_runtime_dependency 'gamefic-standard', '~> 2.0'
29
- s.add_runtime_dependency 'gamefic-tty', '~> 2.0', '>= 2.0.2'
27
+ s.add_runtime_dependency 'gamefic', '~> 3.0'
28
+ s.add_runtime_dependency 'gamefic-standard', '~> 3.0'
29
+ s.add_runtime_dependency 'gamefic-tty', '~> 3.0'
30
30
  s.add_runtime_dependency 'listen', '~> 3.0'
31
31
  s.add_runtime_dependency 'opal', '~> 1.1'
32
+ s.add_runtime_dependency 'puma', '~> 6'
32
33
  s.add_runtime_dependency 'sinatra', '~> 2'
33
34
  s.add_runtime_dependency 'thor', '~> 1.0'
34
35
 
35
36
  s.add_development_dependency 'bundler', '~> 2.0'
36
37
  s.add_development_dependency 'capybara', '~> 3.3'
37
- s.add_development_dependency 'puma', '~> 4'
38
38
  s.add_development_dependency 'rake', '~> 13.0'
39
39
  s.add_development_dependency 'rspec', '~> 3.0'
40
- s.add_development_dependency 'selenium-webdriver', '~> 3.13'
40
+ s.add_development_dependency 'selenium-webdriver', '~> 4.2'
41
41
  s.add_development_dependency 'simplecov', '~> 0.14'
42
42
  end
@@ -3,6 +3,8 @@ require 'json'
3
3
  module Gamefic
4
4
  module Sdk
5
5
  class Diagram
6
+ DIAGRAMMABLE = %w[entities responses verbs syntaxes commands scenes].freeze
7
+
6
8
  class Position
7
9
  attr_accessor :x, :y
8
10
 
@@ -53,31 +55,28 @@ module Gamefic
53
55
  end
54
56
 
55
57
  def entities
56
- plot.initial_state[:entities].map do |e|
57
- e.transform_keys do |k|
58
- str = k.to_s
59
- if str.start_with?('@')
60
- str[1..-1]
61
- else
62
- str
63
- end
64
- end
58
+ plot.entities.map do |ent|
59
+ {
60
+ name: ent.name,
61
+ type: ent.class,
62
+ parent: ent.parent&.name
63
+ }
65
64
  end
66
65
  end
67
66
 
68
- def actions
69
- plot.actions.map do |act|
67
+ def responses
68
+ plot.playbook.responses.map do |act|
70
69
  {
71
70
  verb: act.verb,
72
71
  meta: act.meta?,
73
- signature: act.signature
72
+ # signature: act.signature
74
73
  }
75
74
  end
76
75
  end
77
76
 
78
77
  def commands
79
78
  {
80
- actions: actions,
79
+ responses: responses,
81
80
  verbs: verbs,
82
81
  syntaxes: syntaxes
83
82
  }
@@ -92,14 +91,23 @@ module Gamefic
92
91
  {
93
92
  template: syn.template,
94
93
  command: syn.command,
95
- first_word: syn.first_word,
94
+ synonym: syn.synonym,
96
95
  verb: syn.verb
97
96
  }
98
97
  end
99
98
  end
100
99
 
100
+ def scenes
101
+ plot.scenebook.scenes.map do |scene|
102
+ {
103
+ name: scene.name,
104
+ type: scene.type
105
+ }
106
+ end
107
+ end
108
+
101
109
  def valid? type
102
- %w[rooms entities actions verbs syntaxes commands].include?(type)
110
+ DIAGRAMMABLE.include?(type)
103
111
  end
104
112
 
105
113
  private
@@ -8,8 +8,16 @@ module Gamefic
8
8
  module Sdk
9
9
  module Scaffold
10
10
  class Binder < OpenStruct
11
+ def camelcase string
12
+ string.split(/[_\s\-]+/).collect(&:capitalize).join
13
+ end
14
+
15
+ def snake_case string
16
+ string.split(/[_\s\-]+/).collect(&:downcase).join('_')
17
+ end
18
+
11
19
  def get_binding
12
- binding()
20
+ binding
13
21
  end
14
22
  end
15
23
 
@@ -23,7 +31,7 @@ module Gamefic
23
31
 
24
32
  def custom_copy origin, destination, data
25
33
  FileUtils.mkdir_p File.dirname(destination)
26
- if destination.end_with?('.gf.erb')
34
+ if origin.end_with?('.gf.erb')
27
35
  File.write destination[0..-8], render(origin, data)
28
36
  else
29
37
  FileUtils.cp_r origin, destination
@@ -33,18 +41,17 @@ module Gamefic
33
41
  def build name, destination
34
42
  dir = File.join(SCAFFOLDS_PATH, name)
35
43
  raise LoadError, "Scaffold `#{name}` does not exist" unless File.directory?(dir)
44
+
36
45
  path = Pathname.new('.').join(destination).realdirpath
37
46
  data = Binder.new(name: File.basename(path))
38
47
  files = Dir.glob(File.join(dir, '**', '*'), File::FNM_DOTMATCH).select { |entry| File.file?(entry) }
39
48
  map = {}
40
49
  files.each do |file|
41
- rename = File.join(File.dirname(file), File.basename(file).gsub('__name__', data.name))
50
+ rename = File.join(File.dirname(file), File.basename(file)).gsub('__name__', data.name)
42
51
  dst = File.join(destination, rename[dir.length..-1])
43
- if File.file?(dst)
44
- raise "Gamefic generation would overwrite existing file #{rename}"
45
- else
46
- map[file] = dst
47
- end
52
+ raise "Gamefic generation would overwrite existing file #{rename}" if File.file?(dst)
53
+
54
+ map[file] = dst
48
55
  end
49
56
  map.each_pair { |src, dst| custom_copy src, dst, data }
50
57
  system "cd #{Shellwords.escape(destination)} && bundle install"
@@ -1,11 +1,12 @@
1
1
  require 'sinatra/base'
2
2
  require 'yaml'
3
+ require 'puma'
3
4
 
4
5
  module Gamefic
5
6
  module Sdk
6
7
  class Server < Sinatra::Base
7
8
  set :port, 4342
8
- set :server, :webrick
9
+ set :server, :puma
9
10
 
10
11
  get '/' do
11
12
  File.read File.join(settings.public_folder, 'index.html')
@@ -31,19 +32,18 @@ module Gamefic
31
32
  end
32
33
 
33
34
  get '/snapshot' do
34
- content_type :json
35
- @@plot.save.to_json
35
+ content_type :text
36
+ snapshot = @@plot.save
37
+ snapshot
36
38
  end
37
39
 
38
40
  post '/restore' do
39
41
  content_type :json
40
- start_plot
41
42
  # The snapshot needs to be received as a JSON string because of issues
42
43
  # with IndifferentHash malforming arrays.
43
44
  snapshot = JSON.parse(params['snapshot'])
44
- @@plot.restore snapshot
45
- @@character.cue @@plot.default_scene
46
- @@plot.update
45
+ @@plot = Gamefic::Plot.restore snapshot
46
+ @@character = @@plot.players.first
47
47
  @@plot.ready
48
48
  @@character.output.to_json
49
49
  end
@@ -52,7 +52,7 @@ module Gamefic
52
52
  reset_features
53
53
  load File.join(settings.source_dir, 'main.rb')
54
54
  @@plot = Gamefic::Plot.new
55
- @@character = @@plot.get_player_character
55
+ @@character = @@plot.make_player_character
56
56
  @@plot.introduce @@character
57
57
  @@plot.ready
58
58
  end
@@ -66,20 +66,6 @@ module Gamefic
66
66
  end
67
67
  Gamefic::Plot.blocks.clear
68
68
  end
69
-
70
- class << self
71
- # def run!
72
- # start_browser if settings.browser
73
- # super
74
- # end
75
-
76
- # def start_browser
77
- # Thread.new {
78
- # sleep 1 until Server.running?
79
- # `start http://localhost:#{settings.port}`
80
- # }
81
- # end
82
- end
83
69
  end
84
70
  end
85
71
  end
@@ -1,4 +1,7 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'pathname'
4
+ require 'yaml'
2
5
 
3
6
  module Gamefic
4
7
  module Sdk
@@ -15,6 +18,18 @@ module Gamefic
15
18
  def absolute_path
16
19
  @absolute_path ||= Pathname.new(directory).realpath.to_s
17
20
  end
21
+
22
+ def plot_class
23
+ GAMEFIC_PLOT_CLASS
24
+ end
25
+
26
+ def string_to_constant string
27
+ space = Object
28
+ string.split('::').each do |part|
29
+ space = space.const_get(part)
30
+ end
31
+ space
32
+ end
18
33
  end
19
34
  end
20
35
  end
@@ -16,7 +16,7 @@ module Gamefic
16
16
  #
17
17
  def run
18
18
  require_relative File.join(absolute_path, 'main')
19
- Gamefic::Tty::Engine.run
19
+ Gamefic::Tty::Engine.run(plot: plot_class.new)
20
20
  end
21
21
 
22
22
  # Build a distributable Ruby app.
@@ -36,8 +36,8 @@ module Gamefic
36
36
  files[rel] = Base64.encode64(Zlib::Deflate.deflate(File.read(full)))
37
37
  end
38
38
  program = program_code(files)
39
- FileUtils.mkdir_p File.join(absolute_path, 'builds', 'ruby')
40
- File.write(File.join(absolute_path, 'builds', 'ruby', "#{File.basename(absolute_path)}.rb"), program)
39
+ FileUtils.mkdir_p File.join(absolute_path, 'ruby', 'build')
40
+ File.write(File.join(absolute_path, 'ruby', 'build', "#{File.basename(absolute_path)}.rb"), program)
41
41
  end
42
42
 
43
43
  private
@@ -89,7 +89,7 @@ Dir.mktmpdir do |tmp|
89
89
  require 'gamefic-tty'
90
90
  require 'main'
91
91
  puts "\n"
92
- Gamefic::Tty::Engine.run
92
+ Gamefic::Tty::Engine.run(plot: #{plot_class}.new)
93
93
  end
94
94
  )
95
95
  end
@@ -11,42 +11,36 @@ module Gamefic
11
11
  # Generate a web app using NPM.
12
12
  #
13
13
  def generate
14
- Dir.chdir absolute_path do
15
- nv = `npm -v`.strip
16
- puts "Node version #{nv} detected. Preparing the web app..."
17
- Gamefic::Sdk::Scaffold.build 'react', '.'
18
- puts 'The web app scaffold is ready.'
19
- puts 'Run `npm install` to download the dependencies.'
14
+ puts "Node version #{check_for_npm} detected. Preparing the web app..."
15
+ web_path = File.join(absolute_path, 'web')
16
+ FileUtils.mkdir_p web_path
17
+ Dir.chdir web_path do
18
+ name = File.basename(absolute_path)
19
+ system 'npx', 'react-gamefic', '--name', name, '--class', 'GAMEFIC_PLOT_CLASS'
20
+ puts 'The web app is ready.'
21
+ puts 'Run `rake web:run` to start the app in dev mode.'
20
22
  end
21
- rescue Errno::ENOENT => e
22
- STDERR.puts "#{e.class}: #{e.message}"
23
- STDERR.puts "Web app generation requires Node (https://nodejs.org)."
24
23
  end
25
24
 
26
25
  # Run the web app in a server.
27
26
  #
28
27
  def run
29
28
  check_for_web_build
30
- build_development
31
- listener = Listen.to(File.join(absolute_path, 'web')) do |_mod, _add, _rem|
32
- build_development
29
+ Dir.chdir File.join(absolute_path, 'web') do
30
+ system 'npm start'
33
31
  end
34
- listener.start
35
- # @todo Get the public folder from a config?
36
- Gamefic::Sdk::Server.run! source_dir: absolute_path, public_folder: File.join(absolute_path, 'builds', 'web', 'development')
37
32
  end
38
33
 
39
34
  # Build a distributable web app using NPM.
40
35
  #
41
36
  def build
42
37
  check_for_web_build
43
- Dir.chdir absolute_path do
44
- pid = Process.spawn 'npm run build'
45
- Process.wait pid
38
+ Dir.chdir File.join(absolute_path, 'web') do
39
+ system 'npm run build'
46
40
  end
47
41
  rescue Errno::ENOENT => e
48
- STDERR.puts "#{e.class}: #{e.message}"
49
- STDERR.puts "Web app building requires Node (https://nodejs.org)."
42
+ warn "#{e.class}: #{e.message}"
43
+ warn 'Web app building requires Node (https://nodejs.org).'
50
44
  end
51
45
 
52
46
  private
@@ -55,7 +49,7 @@ module Gamefic
55
49
  #
56
50
  # @return [Boolean]
57
51
  def web_build_exists?
58
- File.exist?(File.join(absolute_path, 'package.json'))
52
+ File.exist?(File.join(absolute_path, 'web', 'package.json'))
59
53
  end
60
54
 
61
55
  # Check if a web build exists.
@@ -64,16 +58,18 @@ module Gamefic
64
58
  # @return [void]
65
59
  def check_for_web_build
66
60
  return if web_build_exists?
61
+
67
62
  puts 'This project does not appear to be configured for web builds.'
68
63
  puts 'Try running `rake web:generate` first.' if Rake::Task.task_defined?('web:generate')
69
64
  raise LoadError, 'package.json not found'
70
65
  end
71
66
 
72
- def build_development
73
- Dir.chdir absolute_path do
74
- pid = Process.spawn('npm run develop')
75
- Process.wait pid
76
- end
67
+ def check_for_npm
68
+ `npm -v`.strip
69
+ rescue Errno::ENOENT => e
70
+ warn "#{e.class}: #{e.message}"
71
+ warn 'Web app generation requires Node (https://nodejs.org).'
72
+ raise
77
73
  end
78
74
  end
79
75
  end
@@ -33,6 +33,7 @@ module Gamefic::Sdk::Tasks
33
33
 
34
34
  def define_task name, desc, &block
35
35
  return if Rake::Task.task_defined?(name)
36
+
36
37
  # @type [Rake::Task]
37
38
  task = Rake::Task.define_task(name, &block)
38
39
  task.add_description desc
@@ -1,5 +1,5 @@
1
1
  module Gamefic
2
2
  module Sdk
3
- VERSION = '2.4.0'
3
+ VERSION = '3.0.0'
4
4
  end
5
5
  end
@@ -1,14 +1,39 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "lib/<%= name %>/version"
4
+
1
5
  Gem::Specification.new do |spec|
2
- spec.name = '<%= name %>'
3
- spec.version = '1.0.0'
4
- spec.summary = 'A Gamefic library'
5
- spec.authors = ['Anomynous']
6
- spec.license = 'MIT'
7
- spec.files = Dir['lib/**/*.rb']
8
-
9
- spec.add_runtime_dependency 'gamefic', '~> 2.0'
10
- spec.add_runtime_dependency 'gamefic-standard', '~> 2.0'
11
-
12
- spec.add_development_dependency 'gamefic-sdk', '~> 2.0'
13
- spec.add_development_dependency 'rake', '~> 12.3'
6
+ spec.name = "<%= name %>"
7
+ spec.version = <%= camelcase(name) %>::VERSION
8
+ spec.authors = ["TODO: Author name(s)"]
9
+ spec.email = ["TODO: Author email(s)"]
10
+
11
+ spec.summary = "TODO: Write a short summary, because RubyGems requires one."
12
+ spec.description = "TODO: Write a longer description or delete this line."
13
+ spec.homepage = "TODO: Put your gem's website or public repo URL here."
14
+ spec.required_ruby_version = ">= 2.6.0"
15
+
16
+ spec.metadata["allowed_push_host"] = "TODO: Set to your gem server 'https://example.com'"
17
+
18
+ spec.metadata["homepage_uri"] = spec.homepage
19
+ spec.metadata["source_code_uri"] = "TODO: Put your gem's public repo URL here."
20
+ spec.metadata["changelog_uri"] = "TODO: Put your gem's CHANGELOG.md URL here."
21
+
22
+ # Specify which files should be added to the gem when it is released.
23
+ # The `git ls-files -z` loads the files in the RubyGem that have been added into git.
24
+ spec.files = Dir.chdir(__dir__) do
25
+ `git ls-files -z`.split("\x0").reject do |f|
26
+ (File.expand_path(f) == __FILE__) ||
27
+ f.start_with?(*%w[bin/ test/ spec/ features/ .git .circleci appveyor Gemfile])
28
+ end
29
+ end
30
+ spec.bindir = "exe"
31
+ spec.executables = spec.files.grep(%r{\Aexe/}) { |f| File.basename(f) }
32
+ spec.require_paths = ["lib"]
33
+
34
+ spec.add_dependency 'gamefic', '~> 3.0'
35
+ spec.add_dependency 'gamefic-standard', '~> 3.0'
36
+
37
+ # For more information and examples about making a new gem, check out our
38
+ # guide at: https://bundler.io/guides/creating_gem.html
14
39
  end
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ module <%= camelcase(name) %>
4
+ VERSION = '0.1.0'
5
+ end
@@ -0,0 +1,10 @@
1
+ require 'gamefic'
2
+ require 'gamefic-standard'
3
+ require '<%= name %>/version'
4
+
5
+ module %<= camelcase(name) %>
6
+ extend Gamefic::Scriptable
7
+ include Gamefic::Standard
8
+
9
+ # Game code goes here
10
+ end
@@ -14,7 +14,7 @@ A Gamefic game project
14
14
 
15
15
  $ rake ruby:build
16
16
 
17
- The script will be saved in the `builds/ruby` directory.
17
+ The script will be saved in the `ruby/build` directory.
18
18
 
19
19
  ## Web-Based Games
20
20
 
@@ -37,7 +37,7 @@ Open http://localhost:4342 in a browser.
37
37
 
38
38
  $ rake web:build
39
39
 
40
- The application will be saved in the `builds/web/production` directory.
40
+ The application will be saved in the `web/build` directory.
41
41
 
42
42
  ## More Information
43
43
 
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ module <%= camelcase(name) %>
4
+ # The main plot.
5
+ #
6
+ class Plot < Gamefic::Plot
7
+ UUID = 'fe5d62a7-7036-45c0-b5cb-39c336bf1b5a'
8
+
9
+ include Gamefic::Standard
10
+
11
+ script do
12
+ introduction do |actor|
13
+ actor.tell "Hello, world!"
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,12 @@
1
+ # frozen_string_literal: true
2
+
3
+ module <%= camelcase(name) %>
4
+ # The base subplot.
5
+ #
6
+ # Authors should extend subclasses to create subplots that the plot can
7
+ # branch.
8
+ #
9
+ class Subplot < Gamefic::Subplot
10
+ include Gamefic::Standard.no_scripts
11
+ end
12
+ end
@@ -1,9 +1,10 @@
1
- GAMEFIC_UUID = '<%= SecureRandom.uuid %>'
1
+ # frozen_string_literal: true
2
+
2
3
  require 'gamefic'
3
4
  require 'gamefic-standard'
4
5
 
5
- Gamefic.script do
6
- introduction do |actor|
7
- actor.tell "Hello, world!"
8
- end
9
- end
6
+ require_relative '<%= name %>/plot'
7
+ require_relative '<%= name %>/subplot'
8
+
9
+ # The Gamefic SDK uses this constant to select the main Plot for game engines.
10
+ GAMEFIC_PLOT_CLASS = <%= camelcase(name) %>::Plot
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: gamefic-sdk
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.4.0
4
+ version: 3.0.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: 2021-09-09 00:00:00.000000000 Z
11
+ date: 2024-01-27 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: gamefic
@@ -16,54 +16,42 @@ dependencies:
16
16
  requirements:
17
17
  - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: '2.0'
20
- - - ">="
21
- - !ruby/object:Gem::Version
22
- version: 2.1.1
19
+ version: '3.0'
23
20
  type: :runtime
24
21
  prerelease: false
25
22
  version_requirements: !ruby/object:Gem::Requirement
26
23
  requirements:
27
24
  - - "~>"
28
25
  - !ruby/object:Gem::Version
29
- version: '2.0'
30
- - - ">="
31
- - !ruby/object:Gem::Version
32
- version: 2.1.1
26
+ version: '3.0'
33
27
  - !ruby/object:Gem::Dependency
34
28
  name: gamefic-standard
35
29
  requirement: !ruby/object:Gem::Requirement
36
30
  requirements:
37
31
  - - "~>"
38
32
  - !ruby/object:Gem::Version
39
- version: '2.0'
33
+ version: '3.0'
40
34
  type: :runtime
41
35
  prerelease: false
42
36
  version_requirements: !ruby/object:Gem::Requirement
43
37
  requirements:
44
38
  - - "~>"
45
39
  - !ruby/object:Gem::Version
46
- version: '2.0'
40
+ version: '3.0'
47
41
  - !ruby/object:Gem::Dependency
48
42
  name: gamefic-tty
49
43
  requirement: !ruby/object:Gem::Requirement
50
44
  requirements:
51
45
  - - "~>"
52
46
  - !ruby/object:Gem::Version
53
- version: '2.0'
54
- - - ">="
55
- - !ruby/object:Gem::Version
56
- version: 2.0.2
47
+ version: '3.0'
57
48
  type: :runtime
58
49
  prerelease: false
59
50
  version_requirements: !ruby/object:Gem::Requirement
60
51
  requirements:
61
52
  - - "~>"
62
53
  - !ruby/object:Gem::Version
63
- version: '2.0'
64
- - - ">="
65
- - !ruby/object:Gem::Version
66
- version: 2.0.2
54
+ version: '3.0'
67
55
  - !ruby/object:Gem::Dependency
68
56
  name: listen
69
57
  requirement: !ruby/object:Gem::Requirement
@@ -92,6 +80,20 @@ dependencies:
92
80
  - - "~>"
93
81
  - !ruby/object:Gem::Version
94
82
  version: '1.1'
83
+ - !ruby/object:Gem::Dependency
84
+ name: puma
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: '6'
90
+ type: :runtime
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: '6'
95
97
  - !ruby/object:Gem::Dependency
96
98
  name: sinatra
97
99
  requirement: !ruby/object:Gem::Requirement
@@ -148,20 +150,6 @@ dependencies:
148
150
  - - "~>"
149
151
  - !ruby/object:Gem::Version
150
152
  version: '3.3'
151
- - !ruby/object:Gem::Dependency
152
- name: puma
153
- requirement: !ruby/object:Gem::Requirement
154
- requirements:
155
- - - "~>"
156
- - !ruby/object:Gem::Version
157
- version: '4'
158
- type: :development
159
- prerelease: false
160
- version_requirements: !ruby/object:Gem::Requirement
161
- requirements:
162
- - - "~>"
163
- - !ruby/object:Gem::Version
164
- version: '4'
165
153
  - !ruby/object:Gem::Dependency
166
154
  name: rake
167
155
  requirement: !ruby/object:Gem::Requirement
@@ -196,14 +184,14 @@ dependencies:
196
184
  requirements:
197
185
  - - "~>"
198
186
  - !ruby/object:Gem::Version
199
- version: '3.13'
187
+ version: '4.2'
200
188
  type: :development
201
189
  prerelease: false
202
190
  version_requirements: !ruby/object:Gem::Requirement
203
191
  requirements:
204
192
  - - "~>"
205
193
  - !ruby/object:Gem::Version
206
- version: '3.13'
194
+ version: '4.2'
207
195
  - !ruby/object:Gem::Dependency
208
196
  name: simplecov
209
197
  requirement: !ruby/object:Gem::Requirement
@@ -225,6 +213,7 @@ executables:
225
213
  extensions: []
226
214
  extra_rdoc_files: []
227
215
  files:
216
+ - ".github/workflows/rspec.yml"
228
217
  - ".gitignore"
229
218
  - ".rspec"
230
219
  - ".travis.yml"
@@ -250,26 +239,15 @@ files:
250
239
  - scaffolds/library/Gemfile
251
240
  - scaffolds/library/README.md.gf.erb
252
241
  - scaffolds/library/__name__.gemspec.gf.erb
253
- - scaffolds/library/lib/__name__.rb
242
+ - scaffolds/library/lib/__name__.rb.gf.erb
243
+ - scaffolds/library/lib/__name__/version.rb.gf.erb
254
244
  - scaffolds/project/.gitignore
255
245
  - scaffolds/project/Gemfile
256
246
  - scaffolds/project/README.md.gf.erb
257
247
  - scaffolds/project/Rakefile
248
+ - scaffolds/project/__name__/plot.rb.gf.erb
249
+ - scaffolds/project/__name__/subplot.rb.gf.erb
258
250
  - scaffolds/project/main.rb.gf.erb
259
- - scaffolds/react/.babelrc
260
- - scaffolds/react/package.json.gf.erb
261
- - scaffolds/react/web/public/index.html.gf.erb
262
- - scaffolds/react/web/src/driver/development.js
263
- - scaffolds/react/web/src/driver/opal.rb
264
- - scaffolds/react/web/src/driver/production.js
265
- - scaffolds/react/web/src/index.js
266
- - scaffolds/react/web/src/scenes/Activity.jsx
267
- - scaffolds/react/web/src/scenes/Conclusion.jsx
268
- - scaffolds/react/web/src/scenes/MultipleChoice.jsx
269
- - scaffolds/react/web/src/scenes/Pause.jsx
270
- - scaffolds/react/web/src/scenes/index.js
271
- - scaffolds/react/web/src/style.css
272
- - scaffolds/react/webpack.config.js
273
251
  homepage: http://gamefic.com
274
252
  licenses:
275
253
  - MIT
@@ -282,14 +260,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
282
260
  requirements:
283
261
  - - ">="
284
262
  - !ruby/object:Gem::Version
285
- version: 2.3.0
263
+ version: 2.7.0
286
264
  required_rubygems_version: !ruby/object:Gem::Requirement
287
265
  requirements:
288
266
  - - ">="
289
267
  - !ruby/object:Gem::Version
290
268
  version: '0'
291
269
  requirements: []
292
- rubygems_version: 3.1.6
270
+ rubygems_version: 3.3.7
293
271
  signing_key:
294
272
  specification_version: 4
295
273
  summary: Gamefic SDK
@@ -1,5 +0,0 @@
1
- require 'gamefic-standard'
2
-
3
- Gamefic.script do
4
- # Game code goes here
5
- end
@@ -1,3 +0,0 @@
1
- {
2
- "presets" : ["@babel/preset-env", "@babel/preset-react"]
3
- }
@@ -1,34 +0,0 @@
1
- {
2
- "name": "<%= name %>",
3
- "version": "1.0.0",
4
- "description": "A Gamefic web app",
5
- "keywords": [],
6
- "author": "Anonymous",
7
- "license": "UNLICENSED",
8
- "private": true,
9
- "scripts": {
10
- "test": "echo \"Error: no test specified\" && exit 1",
11
- "build": "webpack --mode production",
12
- "develop": "webpack --mode development"
13
- },
14
- "devDependencies": {
15
- "@babel/core": "^7.12.0",
16
- "babel-loader": "^8.2.2",
17
- "@babel/preset-env": "^7.12.10",
18
- "@babel/preset-react": "^7.12.10",
19
- "copy-webpack-plugin": "^7.0.0",
20
- "css-loader": "^5.0.1",
21
- "file-loader": "^6.2.0",
22
- "opal-webpack-bundler": "^0.0.1",
23
- "style-loader": "^0.23.1",
24
- "url-loader": "^4.1.1",
25
- "webpack": "^5.10.1",
26
- "webpack-cli": "^4.2.0"
27
- },
28
- "dependencies": {
29
- "gamefic-driver": "^0.2.1",
30
- "react": "^16.5.2",
31
- "react-dom": "^16.5.2",
32
- "react-gamefic": "^0.5.0"
33
- }
34
- }
@@ -1,11 +0,0 @@
1
- <!DOCTYPE html>
2
- <html>
3
- <head>
4
- <meta charset="utf-8">
5
- <title><%= name %></title>
6
- </head>
7
- <body>
8
- <div id="root" />
9
- <script src="bundle.js" type="text/javascript"></script>
10
- </body>
11
- </html>
@@ -1,4 +0,0 @@
1
- import { WebDriver } from 'gamefic-driver';
2
-
3
- const driver = new WebDriver('http://localhost:4342');
4
- export { driver };
@@ -1,7 +0,0 @@
1
- require 'opal'
2
- require 'gamefic'
3
- require 'main'
4
-
5
- $plot = Gamefic::Plot.new
6
- $character = $plot.get_player_character
7
- $plot.introduce $character
@@ -1,5 +0,0 @@
1
- import './opal.rb';
2
- import { OpalDriver } from 'gamefic-driver';
3
-
4
- const driver = new OpalDriver(Opal);
5
- export { driver };
@@ -1,28 +0,0 @@
1
- import React from 'react';
2
- import { render } from 'react-dom';
3
- import { Console, Terminal } from 'react-gamefic';
4
-
5
- import { driver } from 'driver';
6
-
7
- import { Activity, Pause, MultipleChoice, Conclusion } from './scenes';
8
- import 'react-gamefic/styles/ebook';
9
- import './style.css';
10
-
11
- const sceneComponents = {
12
- Activity: Activity,
13
- Pause: Pause,
14
- MultipleChoice: MultipleChoice,
15
- YesOrNo: MultipleChoice,
16
- Conclusion: Conclusion
17
- }
18
-
19
- render(
20
- <Console driver={driver}>
21
- <Terminal sceneComponents={sceneComponents} autoScroll={true} />
22
- </Console>,
23
- document.getElementById('root')
24
- );
25
-
26
- driver.start().then((state) => {
27
- driver.notify(state);
28
- });
@@ -1,13 +0,0 @@
1
- import React from 'react';
2
- import { ActivityScene, Output, CommandForm } from 'react-gamefic';
3
-
4
- export class Activity extends React.Component {
5
- render() {
6
- return (
7
- <ActivityScene>
8
- <Output {...this.props} transcribe={true} />
9
- <CommandForm prompt={this.props.state.prompt} />
10
- </ActivityScene>
11
- );
12
- }
13
- }
@@ -1,12 +0,0 @@
1
- import React from 'react';
2
- import { ConclusionScene, Output } from 'react-gamefic';
3
-
4
- export class Conclusion extends React.Component {
5
- render() {
6
- return (
7
- <ConclusionScene>
8
- <Output {...this.props} transcribe={true} />
9
- </ConclusionScene>
10
- );
11
- }
12
- }
@@ -1,13 +0,0 @@
1
- import React from 'react';
2
- import { MultipleChoiceScene, ChoiceList } from 'react-gamefic';
3
-
4
- export class MultipleChoice extends React.Component {
5
- render() {
6
- return (
7
- <MultipleChoiceScene>
8
- <Output {...this.props} transcribe={true} />,
9
- <ChoiceList options={this.props.state.options} prompt={this.props.state.prompt} />
10
- </MultipleChoiceScene>
11
- );
12
- }
13
- }
@@ -1,13 +0,0 @@
1
- import React from 'react';
2
- import { PauseScene, Output, CommandLink } from 'react-gamefic';
3
-
4
- export class Pause extends React.Component {
5
- render() {
6
- return (
7
- <PauseScene>
8
- <Output {...this.props} transcribe={true} />
9
- <CommandLink command="">Continue</CommandLink>
10
- </PauseScene>
11
- );
12
- }
13
- }
@@ -1,11 +0,0 @@
1
- import { Activity } from './Activity.jsx';
2
- import { Pause } from './Pause.jsx';
3
- import { MultipleChoice } from './MultipleChoice.jsx';
4
- import { Conclusion } from './Conclusion.jsx';
5
-
6
- export {
7
- Activity,
8
- Pause,
9
- MultipleChoice,
10
- Conclusion
11
- }
@@ -1,3 +0,0 @@
1
- html {
2
- background-color: #EFEFEF;
3
- }
@@ -1,74 +0,0 @@
1
- const path = require('path');
2
- const CopyWebpackPlugin = require('copy-webpack-plugin');
3
-
4
- module.exports = (_env, argv) => {
5
- var config = {
6
- entry: path.resolve(__dirname, 'web', 'src', 'index.js'),
7
- output: {
8
- filename: 'bundle.js',
9
- path: path.resolve(__dirname, "builds", "web", argv.mode)
10
- },
11
- resolve: {
12
- alias: {
13
- driver: path.join(__dirname, 'web', 'src', 'driver', argv.mode)
14
- }
15
- },
16
- plugins: [
17
- new CopyWebpackPlugin({
18
- patterns: [
19
- {
20
- from: path.resolve(__dirname, 'web', 'public')
21
- }
22
- ]
23
- })
24
- ],
25
- module: {
26
- rules: [
27
- {
28
- test: /\.css$/,
29
- use: [
30
- 'style-loader',
31
- { loader: 'css-loader', options: { esModule: false } }
32
- ]
33
- },
34
- {
35
- test: /\.(png|jp(e*)g|svg)$/,
36
- use: [{
37
- loader: 'url-loader',
38
- options: {
39
- limit: 8000, // Convert images < 8kb to base64 strings
40
- name: 'images/[hash]-[name].[ext]'
41
- }
42
- }]
43
- },
44
- {
45
- test: /\.jsx?/,
46
- include: path.resolve(__dirname, 'web'),
47
- use: 'babel-loader'
48
- }
49
- ]
50
- }
51
- }
52
-
53
- if (argv.mode == 'production') {
54
- config.module.rules.push(
55
- {
56
- // opal-webpack-bundler will compile and include ruby files in the pack
57
- test: /\.rb$/,
58
- use: [
59
- {
60
- loader: 'opal-webpack-bundler',
61
- options: {
62
- useBundler: true,
63
- paths: [path.resolve(__dirname), path.resolve(__dirname, 'lib')],
64
- sourceMap: false,
65
- root: path.resolve(__dirname)
66
- }
67
- }
68
- ]
69
- }
70
- );
71
- }
72
-
73
- return config;
74
- };