gamefic-sdk 0.3.1 → 1.0.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 9c0f125ab1ce21b53aad57448dc6cec8bbbd0026
4
- data.tar.gz: adbf7e761ad6e8be82b8151d58fe5aca7e80aeae
3
+ metadata.gz: 6950dc7d900b70606eb21d87497e78d18a38eea8
4
+ data.tar.gz: 4a3be87b77c9192303fcc68b41c758522c4ebff3
5
5
  SHA512:
6
- metadata.gz: 37125ae82a687f340871cb9516ae47e82472fdf0162b17401c688e67c46dcc70bbaaf0370d29991e7bae1e7dcbdd866ea6e357d51ae8bf9aaf3f0725e1bf8635
7
- data.tar.gz: 5e0da62f2011f16283235fc7d66be7e0c9344780eb8b67ff309b2eca6d65cd5933562fae5f1ac8e3aad900aba4950f4465a8d45673b8172bdf7fac86a0fb4d28
6
+ metadata.gz: 50059ed23b431c675ddbc0c8871ad5f08230bf34c6a88da6273323bbcea08120bd605b24a60b69843c2aa26bc0862afa2d58a2634c3c1560c25bfa134edf73d9
7
+ data.tar.gz: 846fc454de1f3f9cb795fa66b6f609f48f34f231718f6a13111e8a0fed3709b7e1f3d94ae4d4f0a04935ed3ae212a608902262ae8ca7858b4c338dabaaa963f9
data/bin/gfk CHANGED
@@ -1,7 +1,16 @@
1
1
  #!/usr/bin/env ruby
2
2
 
3
3
  require 'gamefic'
4
+ require 'gamefic/shell'
4
5
  require 'gamefic-sdk'
6
+ require 'gamefic-sdk/shell'
7
+
8
+ shell = Gamefic::Shell.new
9
+
10
+ shell.register "init", Gamefic::Sdk::Shell::Command::Init
11
+ shell.register "create", Gamefic::Sdk::Shell::Command::Init
12
+ shell.register "build", Gamefic::Sdk::Shell::Command::Build
13
+ shell.register "clean", Gamefic::Sdk::Shell::Command::Clean
14
+ shell.register "test", Gamefic::Sdk::Shell::Command::Test
5
15
 
6
- shell = Gamefic::Sdk::Gfk.new
7
16
  shell.execute
File without changes
File without changes
data/lib/gamefic-sdk.rb CHANGED
@@ -1,11 +1,12 @@
1
1
  require 'gamefic'
2
- require 'gamefic-sdk/gfk'
3
2
  require 'gamefic-sdk/platform'
4
3
  require 'gamefic-sdk/plot_config'
4
+ require 'gamefic-sdk/debug'
5
+ require 'gamefic-sdk/version'
5
6
 
6
7
  module Gamefic::Sdk
7
- HTML_TEMPLATE_PATH = File.dirname(__FILE__) + "/../html/"
8
- GLOBAL_SCRIPT_PATH = File.dirname(__FILE__) + "/../scripts/"
8
+ HTML_TEMPLATE_PATH = File.realpath(File.dirname(__FILE__) + "/../html/")
9
+ GLOBAL_SCRIPT_PATH = File.realpath(File.dirname(__FILE__) + "/../scripts/")
9
10
  # @deprecated
10
11
  GLOBAL_IMPORT_PATH = GLOBAL_SCRIPT_PATH
11
12
  LIB_PATH = File.dirname(__FILE__)
@@ -3,27 +3,31 @@ require 'yaml'
3
3
  module Gamefic::Sdk
4
4
 
5
5
  module Build
6
- def self.release directory
7
- config = YAML.load(File.read("#{directory}/config.yaml"))
8
- if File.file?("#{directory}/.uuid")
9
- config['uuid'] = File.read("#{directory}/.uuid").strip
6
+ def self.release directory, quiet = false
7
+ config = YAML.load(File.read(File.join(directory, 'config.yaml')))
8
+ uuid_file = File.join(directory, '.uuid')
9
+ if File.file?(uuid_file)
10
+ config['uuid'] = File.read(uuid_file).strip
10
11
  end
11
- platforms = YAML.load(File.read("#{directory}/build.yaml"))
12
+ build_file = File.join(directory, 'build.yaml')
13
+ platforms = YAML.load(File.read(build_file))
12
14
  platforms.each_pair { |k, v|
13
15
  v['name'] = k
14
16
  cls = Gamefic::Sdk::Platform.const_get(v['platform'])
15
17
  plat = cls.new(directory, v)
16
- puts "Building #{k}..." #unless quiet
18
+ puts "Building #{k}..." unless quiet
17
19
  plat.build
18
20
  }
19
- puts "Build#{platforms.length > 1 ? 's' : ''} complete." #unless quiet
21
+ puts "Build#{platforms.length > 1 ? 's' : ''} complete." unless quiet
20
22
  end
21
- def self.clean directory, config
23
+ def self.clean directory
24
+ build_file = File.join(directory, 'build.yaml')
25
+ config = YAML.load(File.read(build_file))
22
26
  config.each_pair { |k, v|
23
27
  v['name'] = k
24
28
  puts "Cleaning #{k}..."
25
29
  build_dir = "#{directory}/build/#{k}"
26
- platform_dir = "#{directory}/release/#{k}"
30
+ platform_dir = File.join(directory, release, k)
27
31
  cls = Gamefic::Sdk::Platform.const_get(v['platform'])
28
32
  plat = cls.new(directory, v)
29
33
  plat.clean
@@ -1,5 +1,4 @@
1
1
  module Gamefic::Sdk::Debug
2
2
  autoload :Plot, 'gamefic-sdk/debug/plot'
3
3
  autoload :Action, 'gamefic-sdk/debug/action'
4
- autoload :Meta, 'gamefic-sdk/debug/meta'
5
4
  end
@@ -1,5 +1,6 @@
1
1
  require 'gamefic-sdk'
2
2
  require 'gamefic-sdk/debug/plot'
3
+ require 'gamefic-sdk/plot_config'
3
4
 
4
5
  module Gamefic::Sdk
5
6
  class Platform::Base
@@ -19,10 +20,14 @@ module Gamefic::Sdk
19
20
  @config['build_dir'] = File.absolute_path(@config['build_dir'], source_dir)
20
21
  end
21
22
 
23
+ # @return [PlotConfig]
24
+ def plot_config
25
+ @plot_config ||= PlotConfig.new("#{source_dir}/config.yaml")
26
+ end
27
+
22
28
  def plot
23
29
  if @plot.nil?
24
- config = PlotConfig.new "#{source_dir}/config.yaml"
25
- paths = config.script_paths + [Gamefic::Sdk::GLOBAL_SCRIPT_PATH]
30
+ paths = plot_config.script_paths + [Gamefic::Sdk::GLOBAL_SCRIPT_PATH]
26
31
  @plot = Gamefic::Sdk::Debug::Plot.new(Gamefic::Source::File.new(*paths))
27
32
  @plot.script 'main'
28
33
  end
@@ -44,5 +49,18 @@ module Gamefic::Sdk
44
49
  def clean
45
50
  puts "Nothing to do for this platform."
46
51
  end
52
+
53
+ # Get a string of build metadata, represented as a hash.
54
+ #
55
+ # @return [Hash]
56
+ def metadata
57
+ hash = {}
58
+ uuid = File.exist?(source_dir + '/.uuid') ? File.read(source_dir + '/.uuid').strip : ''
59
+ hash[:uuid] = "#{uuid}"
60
+ hash[:gamefic_version] = "#{Gamefic::VERSION}"
61
+ hash[:sdk_version] = "#{Gamefic::Sdk::VERSION}"
62
+ hash[:build_data] = "#{DateTime.now}"
63
+ hash
64
+ end
47
65
  end
48
66
  end
@@ -1,5 +1,7 @@
1
1
  require 'zip'
2
-
2
+ require 'tempfile'
3
+ require 'yaml'
4
+
3
5
  module Gamefic::Sdk
4
6
 
5
7
  class Platform::Gfic < Platform::Base
@@ -13,18 +15,19 @@ module Gamefic::Sdk
13
15
  def build
14
16
  target_dir = config['target_dir']
15
17
  if config['filename'].to_s == ''
16
- filename = target_dir + '/' + source_dir.split('/').delete_if{|i| i.to_s == ''}.last + '.gfic'
18
+ filename = File.join(target_dir, source_dir.split('/').delete_if{|i| i.to_s == ''}.last + '.gfic')
17
19
  else
18
- filename = "#{target_dir}/#{config['filename']}"
20
+ filename = File.join(target_dir, config['filename'])
19
21
  end
20
- stream = StringIO.new("")
21
22
  FileUtils.rm filename if File.file?(filename)
22
23
  FileUtils.mkdir_p target_dir
23
24
  Zip::File.open(filename, Zip::File::CREATE) do |zipfile|
24
- if plot.imported_scripts.length > 0
25
- plot.imported_scripts.each { |script|
26
- zipfile.add "scripts/#{script.path}", script.absolute_path
27
- }
25
+ plot.imported_scripts.each { |script|
26
+ zipfile.add File.join('scripts', "#{script.path}.plot.rb"), script.absolute_path
27
+ }
28
+ Tempfile.open('metadata.yaml') do |file|
29
+ file.puts metadata.to_yaml
30
+ zipfile.add "metadata.yaml", file.path
28
31
  end
29
32
  end
30
33
  end
@@ -14,26 +14,60 @@ module Gamefic::Sdk
14
14
  }
15
15
  end
16
16
 
17
+ def app_config
18
+ @app_config ||= AppConfig.new source_dir, config
19
+ end
20
+
17
21
  def build
18
22
  target_dir = config['target_dir']
19
23
  build_dir = config['build_dir']
20
- app_config = AppConfig.new source_dir, config
21
24
  html_dir = app_config.html_dir
22
-
23
25
 
24
26
  FileUtils.mkdir_p target_dir
27
+ copy_html_files target_dir
28
+ build_opal_js build_dir
29
+ build_gamefic_js build_dir
30
+ build_static_js build_dir
31
+ build_scripts_js build_dir
32
+ render_index target_dir
33
+ copy_assets build_dir, target_dir
34
+ copy_media source_dir, target_dir
35
+
36
+ end
37
+
38
+ def clean
39
+ FileUtils.remove_entry_secure config['build_dir'] if File.exist?(config['build_dir'])
40
+ FileUtils.mkdir_p config['build_dir']
41
+ puts "#{config['build_dir']} cleaned."
42
+ end
43
+
44
+ private
45
+
46
+ def resolve filename, paths
47
+ absolute = nil
48
+ paths.each { |path|
49
+ if File.file?("#{path}/#{filename}")
50
+ absolute = File.join(path, filename)
51
+ break
52
+ end
53
+ }
54
+ raise "#{filename} not found" if absolute.nil?
55
+ absolute
56
+ end
25
57
 
26
- # Copy everything in source except config and template
27
- Dir.entries(html_dir).each { |entry|
28
- if entry != 'config.rb' and entry != 'index.html.erb' and entry != '.' and entry != '..'
58
+ # Copy everything in source except config and template
59
+ def copy_html_files target_dir
60
+ Dir.entries(app_config.html_dir).each { |entry|
61
+ if entry != 'index.rb' and entry != 'index.html.erb' and entry != '.' and entry != '..'
29
62
  FileUtils.mkdir_p target_dir + '/' + File.dirname(entry)
30
- FileUtils.cp_r "#{html_dir}/#{entry}", "#{target_dir}/#{entry}"
63
+ FileUtils.cp_r "#{app_config.html_dir}/#{entry}", "#{target_dir}/#{entry}"
31
64
  end
32
65
  }
66
+ end
33
67
 
34
- # Make sure core exists in build directory
68
+ def build_opal_js build_dir
69
+ # Make sure core exists in build directory
35
70
  FileUtils.mkdir_p build_dir + "/core"
36
-
37
71
  # Opal core
38
72
  if !File.exist?(build_dir + "/core/opal.js")
39
73
  File.open(build_dir + "/core/opal.js", "w") do |file|
@@ -42,7 +76,9 @@ module Gamefic::Sdk
42
76
  file << Opal::Builder.build('native')
43
77
  end
44
78
  end
45
-
79
+ end
80
+
81
+ def build_gamefic_js build_dir
46
82
  # Gamefic core
47
83
  Opal.append_path Gamefic::Sdk::LIB_PATH
48
84
  if !File.exist?(build_dir + "/core/gamefic.js")
@@ -50,14 +86,18 @@ module Gamefic::Sdk
50
86
  file << Opal::Builder.build('gamefic').to_s
51
87
  end
52
88
  end
53
-
89
+ end
90
+
91
+ def build_static_js build_dir
54
92
  # GameficOpal
55
93
  if !File.exist?(build_dir + "/core/static.js")
56
- File.open(build_dir + "/core/static.js", "w") do |file|
57
- file << Opal::Builder.build('gamefic-sdk/platform/web/gamefic_opal')
58
- end
94
+ File.open(build_dir + "/core/static.js", "w") do |file|
95
+ file << Opal::Builder.build('gamefic-sdk/platform/web/gamefic_opal')
96
+ end
59
97
  end
60
-
98
+ end
99
+
100
+ def build_scripts_js build_dir
61
101
  # Plot scripts
62
102
  File.open("#{build_dir}/scripts.rb", 'w') do |file|
63
103
  file << "def GameficOpal.load_scripts\n"
@@ -67,51 +107,51 @@ module Gamefic::Sdk
67
107
  file << "\nend\n"
68
108
  }
69
109
  file << "end\n"
110
+ #file << metadata
70
111
  end
71
112
  Opal.append_path build_dir
72
113
  File.open(build_dir + "/core/scripts.js", 'w') do |file|
73
114
  file << Opal::Builder.build('scripts')
74
115
  end
75
-
116
+ end
117
+
118
+ def render_index target_dir
76
119
  # Render index
77
120
  File.open(target_dir + "/index.html", "w") do |file|
78
121
  file << app_config.render
79
122
  end
80
-
81
- # Copy requisite assets
82
- app_config.resource_paths.push build_dir
123
+ end
124
+
125
+ def copy_assets build_dir, target_dir
126
+ paths = app_config.resource_paths
127
+ paths.push build_dir
83
128
  app_config.javascripts.each { |js|
84
- absolute = resolve(js, app_config.resource_paths)
129
+ absolute = resolve(js, paths)
85
130
  FileUtils.mkdir_p target_dir + "/" + File.dirname(js)
86
131
  FileUtils.cp_r absolute, target_dir + "/" + js
87
132
  }
88
133
  app_config.stylesheets.each { |css|
89
- absolute = resolve(css, app_config.resource_paths)
134
+ absolute = resolve(css, paths)
90
135
  FileUtils.mkdir_p target_dir + "/" + File.dirname(css)
91
136
  FileUtils.cp_r absolute, target_dir + "/" + css
92
137
  }
93
138
  end
94
-
95
- def clean
96
- FileUtils.remove_entry_secure config['build_dir'] if File.exist?(config['build_dir'])
97
- FileUtils.mkdir_p config['build_dir']
98
- puts "#{config['build_dir']} cleaned."
99
- end
100
139
 
101
- private
102
-
103
- def resolve filename, paths
104
- absolute = nil
105
- paths.each { |path|
106
- if File.file?("#{path}/#{filename}")
107
- absolute = "#{path}/#{filename}"
108
- break
140
+ def copy_media source_dir, target_dir
141
+ # Copy media
142
+ pc = PlotConfig.new "#{source_dir}/config.yaml"
143
+ pc.media_paths.each { |path|
144
+ if File.directory?(path)
145
+ FileUtils.mkdir_p target_dir + "/media"
146
+ Dir.entries(path).each { |entry|
147
+ if entry != '.' and entry != '..'
148
+ FileUtils.mkdir_p target_dir + "/media/" + File.dirname(entry)
149
+ FileUtils.cp_r path + "/" + entry, target_dir + "/media/" + entry
150
+ end
151
+ }
109
152
  end
110
153
  }
111
- raise "#{filename} not found" if absolute.nil?
112
- absolute
113
154
  end
114
-
115
155
  end
116
156
 
117
157
  end
@@ -1,54 +1,57 @@
1
1
  require 'erb'
2
2
  require 'gamefic/stage'
3
3
 
4
- class Gamefic::Sdk::Platform::Web::AppConfig
5
- include Stage
6
- attr_reader :javascripts, :stylesheets, :resource_paths, :source_dir, :config, :html_dir
7
- expose :javascripts, :stylesheets, :resource_paths
8
-
9
- # @param main_dir [String] The directory containing the resources (config file, HTML template, etc.) for this build
10
- def initialize source_dir, config
11
- @javascripts = []
12
- @stylesheets = []
13
- @source_dir = source_dir
14
- @config = config
15
- @html_dir = resolve_html_dir
16
- @game_config = PlotConfig.new("#{source_dir}/config.yaml")
17
- @resource_paths = ["#{html_dir}", Gamefic::Sdk::HTML_TEMPLATE_PATH]
18
- config_file = "#{html_dir}/config.rb"
19
- stage File.read(config_file), config_file
20
- javascripts.push "core/opal.js", "core/gamefic.js", "core/static.js", "core/scripts.js", "core/engine.js"
4
+ module Gamefic
5
+ module Sdk
6
+ class Gamefic::Sdk::Platform::Web::AppConfig
7
+ include Stage
8
+ attr_reader :javascripts, :stylesheets, :resource_paths, :source_dir, :config, :html_dir
9
+ expose :javascripts, :stylesheets, :resource_paths
10
+
11
+ # @param main_dir [String] The directory containing the resources (config file, HTML template, etc.) for this build
12
+ def initialize source_dir, config
13
+ @javascripts = []
14
+ @stylesheets = []
15
+ @source_dir = source_dir
16
+ @config = config
17
+ @html_dir = resolve_html_dir
18
+ @game_config = PlotConfig.new("#{source_dir}/config.yaml")
19
+ @resource_paths = ["#{html_dir}", Gamefic::Sdk::HTML_TEMPLATE_PATH]
20
+ config_file = "#{html_dir}/index.rb"
21
+ stage File.read(config_file), config_file
22
+ javascripts.push "core/opal.js", "core/gamefic.js", "core/static.js", "core/scripts.js", "core/engine.js"
23
+ end
24
+
25
+ # @return [BuildConfig::Data]
26
+ def data
27
+ Data.new @game_config, @javascripts, @stylesheets
28
+ end
29
+
30
+ # Render HTML using the build config data
31
+ #
32
+ # @return [String] The resulting HTML
33
+ def render
34
+ erb = ERB.new(File.read(html_dir + "/index.html.erb"))
35
+ erb.result data.get_binding
36
+ end
37
+
38
+ private
39
+
40
+ def resolve_html_dir
41
+ dir = "#{source_dir}/html"
42
+ if !File.directory?(dir) and config['html_skin'].to_s != ''
43
+ dir = "#{Gamefic::Sdk::HTML_TEMPLATE_PATH}/skins/#{config['html_skin']}"
44
+ end
45
+ if !File.directory?(dir)
46
+ dir = "#{Gamefic::Sdk::HTML_TEMPLATE_PATH}/skins/minimal"
47
+ end
48
+ if !File.directory?(dir)
49
+ raise "Could not resolve HTML directory"
50
+ end
51
+ dir
52
+ end
53
+ end
21
54
  end
22
-
23
- # @return [BuildConfig::Data]
24
- def data
25
- Data.new @game_config, @javascripts, @stylesheets
26
- end
27
-
28
- # Render HTML using the build config data
29
- #
30
- # @return [String] The resulting HTML
31
- def render
32
- erb = ERB.new(File.read(html_dir + "/index.html.erb"))
33
- erb.result data.get_binding
34
- end
35
-
36
- private
37
-
38
- def resolve_html_dir
39
- dir = "#{source_dir}/html"
40
- if !File.directory?(dir) and config['html_skin'].to_s != ''
41
- dir = "#{Gamefic::Sdk::HTML_TEMPLATE_PATH}/skins/#{config['html_skin']}"
42
- end
43
- if !File.directory?(dir)
44
- dir = "#{Gamefic::Sdk::HTML_TEMPLATE_PATH}/skins/minimal"
45
- end
46
- if !File.directory?(dir)
47
- raise "Could not resolve HTML directory"
48
- end
49
- dir
50
- end
51
-
52
55
  end
53
56
 
54
57
  class Gamefic::Sdk::Platform::Web::AppConfig::Data
@@ -2,12 +2,13 @@
2
2
  require 'gamefic/query/expression'
3
3
  require 'gamefic/query/matches'
4
4
  require 'gamefic/grammar/verb_set'
5
+ require 'gamefic/scene/multiple_choice/input'
5
6
 
6
7
  # HACK Opal doesn't recognizes classes and modules declared from scripts
7
8
  def Object.const_missing sym
8
9
  Gamefic.const_get sym
9
10
  end
10
-
11
+
11
12
  module GameficOpal
12
13
  def self.static_plot
13
14
  @@static_plot ||= WebPlot.new(Gamefic::Source::Text.new)
@@ -24,12 +25,15 @@ module GameficOpal
24
25
 
25
26
  class WebUser < Gamefic::User
26
27
  def save filename, data
27
- `Gamefic.Engine.save(filename, data);`
28
+ `Gamefic.save(filename, data);`
28
29
  end
29
30
  def restore filename
30
- data = `Gamefic.Engine.restore(filename);`
31
+ data = `Gamefic.restore(filename);`
31
32
  return data
32
33
  end
34
+ def test_queue
35
+ character[:test_queue] || []
36
+ end
33
37
  end
34
38
  end
35
39
 
@@ -1,12 +1,12 @@
1
1
  require 'yaml'
2
2
 
3
- module Gamefic
3
+ module Gamefic::Sdk
4
4
 
5
5
  class PlotConfig
6
- attr_reader :author, :title, :script_paths, :asset_paths
6
+ attr_reader :author, :title, :script_paths, :media_paths
7
7
  def initialize filename = nil
8
8
  @script_paths = []
9
- @asset_paths = []
9
+ @media_paths = []
10
10
  if !filename.nil?
11
11
  config = YAML.load_file filename
12
12
  base_dir = File.dirname(filename)
@@ -15,9 +15,9 @@ module Gamefic
15
15
  config['script_paths'].each { |p|
16
16
  @script_paths.push File.absolute_path(p, base_dir)
17
17
  } if !config['script_paths'].nil?
18
- config['asset_paths'].map! { |p|
19
- @asset_paths.push File.absolute_path(p, base_dir)
20
- } if !config['asset_paths'].nil?
18
+ config['media_paths'].map! { |p|
19
+ @media_paths.push File.absolute_path(p, base_dir)
20
+ } if !config['media_paths'].nil?
21
21
  end
22
22
  end
23
23
  end
@@ -0,0 +1,5 @@
1
+ require 'gamefic/shell'
2
+
3
+ class Gamefic::Sdk::Shell < Gamefic::Shell
4
+ autoload :Command, 'gamefic-sdk/shell/command'
5
+ end
@@ -0,0 +1,8 @@
1
+ require 'slop'
2
+
3
+ module Gamefic::Sdk::Shell::Command
4
+ autoload :Init, 'gamefic-sdk/shell/command/init'
5
+ autoload :Build, 'gamefic-sdk/shell/command/build'
6
+ autoload :Clean, 'gamefic-sdk/shell/command/clean'
7
+ autoload :Test, 'gamefic-sdk/shell/command/test'
8
+ end
@@ -0,0 +1,12 @@
1
+ require 'gamefic-sdk/build'
2
+
3
+ class Gamefic::Sdk::Shell::Command::Build < Gamefic::Shell::Command::Base
4
+ def initialize
5
+ options.boolean '-q', '--quiet', 'suppress output', default: false
6
+ end
7
+
8
+ def run input
9
+ result = parse input
10
+ Gamefic::Sdk::Build.release result.arguments[1], result['--quiet']
11
+ end
12
+ end
@@ -0,0 +1,12 @@
1
+ require 'gamefic-sdk/build'
2
+
3
+ class Gamefic::Sdk::Shell::Command::Clean < Gamefic::Shell::Command::Base
4
+ def initialize
5
+ #options.boolean '-q', '--quiet', 'suppress output', default: false
6
+ end
7
+
8
+ def run input
9
+ result = parse input
10
+ Gamefic::Sdk::Build.clean result.arguments[1]
11
+ end
12
+ end
@@ -0,0 +1,100 @@
1
+ require 'securerandom'
2
+ require 'fileutils'
3
+ require 'getoptlong'
4
+
5
+ class Gamefic::Sdk::Shell::Command::Init < Gamefic::Shell::Command::Base
6
+ def initialize
7
+ @quiet = false
8
+ @html = 'standard'
9
+ @scripts = ['standard']
10
+ @platforms = ['Gfic', 'Web']
11
+ options.boolean '-q', '--quiet', 'suppress output', default: false
12
+ end
13
+
14
+ def run input
15
+ get_arguments input
16
+ make_game_directories
17
+ write_main_script
18
+ write_test_script
19
+ write_build_yaml
20
+ write_config_yaml
21
+ write_uuid_file
22
+ copy_html_skin
23
+ Dir.mkdir(File.join(@directory, 'media'))
24
+ puts "Game directory '#{@directory}' initialized." unless @quiet
25
+ end
26
+
27
+ private
28
+
29
+ def get_arguments input
30
+ result = parse input
31
+ @quiet = result['--quiet']
32
+ @directory = result.arguments[1]
33
+ end
34
+
35
+ def make_game_directories
36
+ if @directory.to_s == ''
37
+ raise "No directory specified."
38
+ end
39
+ if File.exist?(@directory)
40
+ if File.file?(@directory)
41
+ raise "#{@directory} is a file."
42
+ else
43
+ if !Dir['your_directory/*'].empty?
44
+ raise "#{@directory} is not an empty directory."
45
+ end
46
+ end
47
+ else
48
+ Dir.mkdir(@directory)
49
+ end
50
+ Dir.mkdir(@directory + '/scripts')
51
+ end
52
+
53
+ def write_main_script
54
+ main_file = File.join(@directory, 'scripts', 'main.plot.rb')
55
+ File.open(main_file, 'w') do |file|
56
+ @scripts.each { |script|
57
+ file.puts "script '#{script}'"
58
+ }
59
+ end
60
+ end
61
+
62
+ def write_test_script
63
+ File.open("#{@directory}/scripts/test.plot.rb", 'w') do |file|
64
+ file.puts "script 'standard/test'"
65
+ end
66
+ end
67
+
68
+ def write_build_yaml
69
+ File.open("#{@directory}/build.yaml", 'w') do |file|
70
+ file.puts "web:",
71
+ " platform: Web",
72
+ "gfic:",
73
+ " platform: Gfic"
74
+ end
75
+ end
76
+
77
+ def write_config_yaml
78
+ File.open("#{@directory}/config.yaml", 'w') do |file|
79
+ file.puts "title: Untitled",
80
+ "author: Anonymous",
81
+ "",
82
+ "script_paths:",
83
+ " - ./scripts",
84
+ "media_paths:",
85
+ " - ./media"
86
+ end
87
+ end
88
+
89
+ def write_uuid_file
90
+ uuid = SecureRandom.uuid
91
+ File.open("#{@directory}/.uuid", "w") { |f| f.write uuid }
92
+ end
93
+
94
+ def copy_html_skin
95
+ Dir.mkdir("#{@directory}/html")
96
+ skin = 'standard'
97
+ FileUtils.cp_r(Dir[Gamefic::Sdk::HTML_TEMPLATE_PATH + "/skins/" + @html + "/*"], "#{@directory}/html")
98
+ end
99
+
100
+ end
@@ -0,0 +1,35 @@
1
+ require 'gamefic/shell'
2
+ require 'gamefic-sdk/plot_config'
3
+ require 'gamefic/engine/tty'
4
+
5
+ module Gamefic
6
+ module Sdk
7
+
8
+ class Shell::Command::Test < Gamefic::Shell::Command::Base
9
+ def run input
10
+ result = parse input
11
+ puts "Loading..."
12
+ path = result.arguments[1]
13
+ if !File.exist?(path)
14
+ raise "Invalid path: #{path}"
15
+ end
16
+ build_file = nil
17
+ main_file = path
18
+ test_file = nil
19
+ if File.directory?(path)
20
+ config = PlotConfig.new File.join(path, 'config.yaml')
21
+ else
22
+ config = PlotConfig.new
23
+ end
24
+ paths = config.script_paths + [Gamefic::Sdk::GLOBAL_SCRIPT_PATH]
25
+ plot = Gamefic::Sdk::Debug::Plot.new Source::File.new(*paths)
26
+ plot.script 'main'
27
+ plot.script 'debug'
28
+ engine = Tty::Engine.new plot
29
+ puts "\n"
30
+ engine.run
31
+ end
32
+ end
33
+
34
+ end
35
+ end
@@ -1,5 +1,5 @@
1
1
  module Gamefic
2
2
  module Sdk
3
- VERSION = '0.3.1'
3
+ VERSION = '1.0.0'
4
4
  end
5
5
  end
metadata CHANGED
@@ -1,55 +1,83 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: gamefic-sdk
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.1
4
+ version: 1.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: 2016-04-18 00:00:00.000000000 Z
11
+ date: 2016-09-15 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: gamefic
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - '>='
17
+ - - ">="
18
18
  - !ruby/object:Gem::Version
19
19
  version: '0'
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - '>='
24
+ - - ">="
25
25
  - !ruby/object:Gem::Version
26
26
  version: '0'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: opal
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - '>='
31
+ - - ">="
32
32
  - !ruby/object:Gem::Version
33
33
  version: 0.7.2
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
- - - '>='
38
+ - - ">="
39
39
  - !ruby/object:Gem::Version
40
40
  version: 0.7.2
41
+ - !ruby/object:Gem::Dependency
42
+ name: slop
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
41
55
  - !ruby/object:Gem::Dependency
42
56
  name: rspec
43
57
  requirement: !ruby/object:Gem::Requirement
44
58
  requirements:
45
- - - '>='
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: poltergeist
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
46
74
  - !ruby/object:Gem::Version
47
75
  version: '0'
48
76
  type: :development
49
77
  prerelease: false
50
78
  version_requirements: !ruby/object:Gem::Requirement
51
79
  requirements:
52
- - - '>='
80
+ - - ">="
53
81
  - !ruby/object:Gem::Version
54
82
  version: '0'
55
83
  description: Development tools for Gamefic
@@ -59,23 +87,28 @@ executables:
59
87
  extensions: []
60
88
  extra_rdoc_files: []
61
89
  files:
90
+ - bin/gfk
91
+ - html/skins/minimal/index.rb
92
+ - html/skins/standard/index.rb
62
93
  - lib/gamefic-sdk.rb
94
+ - lib/gamefic-sdk/build.rb
95
+ - lib/gamefic-sdk/debug.rb
96
+ - lib/gamefic-sdk/debug/action.rb
97
+ - lib/gamefic-sdk/debug/plot.rb
98
+ - lib/gamefic-sdk/platform.rb
63
99
  - lib/gamefic-sdk/platform/base.rb
64
100
  - lib/gamefic-sdk/platform/gfic.rb
65
101
  - lib/gamefic-sdk/platform/web.rb
66
102
  - lib/gamefic-sdk/platform/web/app_config.rb
67
103
  - lib/gamefic-sdk/platform/web/gamefic_opal.rb
68
104
  - lib/gamefic-sdk/plot_config.rb
105
+ - lib/gamefic-sdk/shell.rb
106
+ - lib/gamefic-sdk/shell/command.rb
107
+ - lib/gamefic-sdk/shell/command/build.rb
108
+ - lib/gamefic-sdk/shell/command/clean.rb
109
+ - lib/gamefic-sdk/shell/command/init.rb
110
+ - lib/gamefic-sdk/shell/command/test.rb
69
111
  - lib/gamefic-sdk/version.rb
70
- - lib/gamefic-sdk/debug.rb
71
- - lib/gamefic-sdk/debug/action.rb
72
- - lib/gamefic-sdk/debug/plot.rb
73
- - lib/gamefic-sdk/build.rb
74
- - lib/gamefic-sdk/gfk.rb
75
- - lib/gamefic-sdk/platform.rb
76
- - html/skins/standard/config.rb
77
- - html/skins/minimal/config.rb
78
- - bin/gfk
79
112
  homepage: http://gamefic.com
80
113
  licenses:
81
114
  - MIT
@@ -86,19 +119,18 @@ require_paths:
86
119
  - lib
87
120
  required_ruby_version: !ruby/object:Gem::Requirement
88
121
  requirements:
89
- - - '>='
122
+ - - ">="
90
123
  - !ruby/object:Gem::Version
91
124
  version: 1.9.3
92
125
  required_rubygems_version: !ruby/object:Gem::Requirement
93
126
  requirements:
94
- - - '>='
127
+ - - ">="
95
128
  - !ruby/object:Gem::Version
96
129
  version: '0'
97
130
  requirements: []
98
131
  rubyforge_project:
99
- rubygems_version: 2.0.14
132
+ rubygems_version: 2.4.8
100
133
  signing_key:
101
134
  specification_version: 4
102
135
  summary: Gamefic SDK
103
136
  test_files: []
104
- has_rdoc:
@@ -1,243 +0,0 @@
1
- require 'tmpdir'
2
- require 'zip'
3
- require 'getoptlong'
4
- require 'gamefic/engine/tty'
5
- require 'gamefic-sdk'
6
- require 'gamefic-sdk/build'
7
- require 'securerandom'
8
- require 'gamefic-sdk/debug'
9
-
10
- include Gamefic
11
-
12
- module Gamefic::Sdk
13
- class Gfk
14
- attr_accessor :argv
15
- def initialize
16
-
17
- end
18
- def execute
19
- if ARGV.length == 0
20
- ARGV.push 'help'
21
- end
22
- cmd = ARGV.shift
23
- case cmd
24
- when 'test'
25
- test ARGV.shift
26
- when 'init'
27
- init ARGV.shift
28
- when 'build'
29
- build ARGV.shift
30
- when 'clean'
31
- clean ARGV.shift
32
- when 'fetch'
33
- fetch ARGV.shift
34
- when 'help'
35
- help ARGV.shift
36
- else
37
- help nil
38
- end
39
- end
40
- private
41
- def test path
42
- puts "Loading..."
43
- STDOUT.flush
44
- if !File.exist?(path)
45
- raise "Invalid path: #{path}"
46
- end
47
- build_file = nil
48
- main_file = path
49
- test_file = nil
50
- if File.directory?(path)
51
- config = PlotConfig.new "#{path}/config.yaml"
52
- else
53
- config = PlotConfig.new
54
- end
55
- paths = config.script_paths + [Gamefic::Sdk::GLOBAL_SCRIPT_PATH]
56
- plot = Gamefic::Sdk::Debug::Plot.new Source::File.new(*paths)
57
- plot.script 'main'
58
- plot.script 'debug'
59
- engine = Tty::Engine.new plot
60
- puts "\n"
61
- engine.run
62
- end
63
- def init directory
64
- quiet = false
65
- html = nil
66
- imports = []
67
- opts = GetoptLong.new(
68
- [ '-q', '--quiet', GetoptLong::NO_ARGUMENT ],
69
- [ '--with-html-skin', GetoptLong::OPTIONAL_ARGUMENT ],
70
- [ '-i', '--import', GetoptLong::REQUIRED_ARGUMENT ]
71
- )
72
- begin
73
- opts.each { |opt, arg|
74
- case opt
75
- when '-q'
76
- quiet = true
77
- when '--with-html-skin'
78
- html = arg || 'standard'
79
- when '-i'
80
- imports = arg.split(';')
81
- end
82
- }
83
- rescue Exception => e
84
- puts "#{e}"
85
- exit 1
86
- end
87
- if directory.to_s == ''
88
- puts "No directory specified."
89
- exit 1
90
- elsif File.exist?(directory)
91
- if File.directory?(directory)
92
- files = Dir[directory + '/*']
93
- if files.length > 0
94
- dotfiles = Dir[directory + '/\.*']
95
- if dotfiles.length < files.length
96
- puts "'#{directory}' is not an empty directory."
97
- exit 1
98
- end
99
- end
100
- else
101
- puts "'#{directory}' is a file."
102
- exit 1
103
- end
104
- else
105
- Dir.mkdir(directory)
106
- end
107
- Dir.mkdir(directory + '/scripts')
108
- main_rb = File.new(directory + '/scripts/main.plot.rb', 'w')
109
- main_rb.write <<EOS
110
- script 'standard'
111
- EOS
112
- imports.each { |i|
113
- main_rb.write "require '#{i}'\n"
114
- }
115
- main_rb.close
116
- test_rb = File.new(directory + '/scripts/test.plot.rb', 'w')
117
- test_rb.write <<EOS
118
- script 'standard/test'
119
- EOS
120
- test_rb.close
121
- build_rb = File.new(directory + '/build.yaml', 'w')
122
- build_rb.write <<EOS
123
- web:
124
- platform: Web
125
- gfic:
126
- platform: Gfic
127
- EOS
128
- build_rb.close
129
- config_rb = File.new(directory + '/config.yaml', 'w')
130
- config_rb.write <<EOS
131
- title: Untitled
132
- author: Anonymous
133
-
134
- script_paths:
135
- - ./scripts
136
- asset_paths:
137
- - ./assets
138
- EOS
139
- config_rb.close
140
- Dir.mkdir(directory + '/html')
141
- if !html.nil?
142
- FileUtils.cp_r(Dir[Gamefic::Sdk::HTML_TEMPLATE_PATH + "/skins/" + html + "/*"], directory + "/html")
143
- end
144
- uuid = SecureRandom.uuid
145
- File.open("#{directory}/.uuid", "w") { |f| f.write uuid }
146
- puts "Game directory '#{directory}' initialized." unless quiet
147
- end
148
- def fetch directory
149
- if directory.to_s == ''
150
- puts "No source directory was specified."
151
- exit 1
152
- end
153
- if !File.directory?(directory)
154
- puts "#{directory} is not a directory."
155
- exit 1
156
- end
157
- puts "Loading game data..."
158
- story = Plot.new(Source.new(GLOBAL_SCRIPT_PATH))
159
- begin
160
- story.load directory + '/main', true
161
- rescue Exception => e
162
- puts "'#{directory}' has errors or is not a valid source directory."
163
- puts "#{e}"
164
- exit 1
165
- end
166
- puts "Checking for external script references..."
167
- fetched = 0
168
- story.imported_scripts.each { |script|
169
- if !script.filename.start_with?(directory)
170
- base = script.filename[(script.filename.rindex('scripts/') + 7)..-1]
171
- puts "Fetching #{base}"
172
- FileUtils.mkdir_p directory + '/scripts/' + File.dirname(base)
173
- FileUtils.copy script.filename, directory + '/scripts/' + base
174
- fetched += 1
175
- end
176
- }
177
- if fetched == 0
178
- puts "Nothing to fetch."
179
- else
180
- puts "Done."
181
- end
182
- end
183
- def build directory
184
- Build.release directory
185
- end
186
- def clean directory
187
- config = YAML.load(File.read(directory + '/build.yaml'))
188
- Build.clean directory, config
189
- end
190
- def help command
191
- shell_script = File.basename($0)
192
- case command
193
- when "test"
194
- puts <<EOS
195
- #{shell_script} test [path]
196
- Test a Gamefic source directory or script.
197
- EOS
198
- when "init"
199
- puts <<EOS
200
- #{shell_script} init [directory]
201
- Initialize a Gamefic source directory. The resulting directory will contain
202
- source files ready to build into a Gamefic file.
203
- EOS
204
- when "fetch"
205
- puts <<EOS
206
- #{shell_script} fetch [directory]
207
- Copy shared scripts to the source directory.
208
- If the specified game directory imports external scripts, such as the ones
209
- that are distributed with the Gamefic gem, this command will copy them into
210
- the game's script directory. Fetching can be useful if you want to customize
211
- common features.
212
- EOS
213
- when "build"
214
- puts <<EOS
215
- #{shell_script} build [directory] [-o | --output filename]
216
- Build a distributable Gamefic file from the source directory. The default
217
- filename is [directory].gfic. You can change the filename with the -o option.
218
- EOS
219
- when "clean"
220
- puts <<EOS
221
- #{shell_script} clean [directory]
222
- Clean Gamefic source directories. This command will delete any intermediate
223
- files that are used during the build process. The next build will rebuild
224
- everything from source.
225
- EOS
226
- when nil, "help"
227
- puts <<EOS
228
- #{shell_script} init [directory] - initialize a Gamefic source directory
229
- #{shell_script} test [path] - test a Gamefic source directory or script
230
- #{shell_script} fetch [directory] - copy shared scripts into directory
231
- #{shell_script} build [directory] - build games
232
- #{shell_script} build [directory] - clean game directories
233
- #{shell_script} help - display this message
234
- #{shell_script} help [command] - display info about command
235
- EOS
236
- else
237
- puts "Unrecognized command '#{command}'"
238
- exit 1
239
- end
240
- end
241
- end
242
-
243
- end