gamefic-sdk 0.3.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 +7 -0
- data/bin/gfk +7 -0
- data/html/skins/minimal/config.rb +10 -0
- data/lib/gamefic-sdk.rb +28 -0
- data/lib/gamefic-sdk/build.rb +34 -0
- data/lib/gamefic-sdk/debug.rb +5 -0
- data/lib/gamefic-sdk/debug/action.rb +30 -0
- data/lib/gamefic-sdk/debug/plot.rb +21 -0
- data/lib/gamefic-sdk/gfk.rb +244 -0
- data/lib/gamefic-sdk/platform.rb +9 -0
- data/lib/gamefic-sdk/platform/base.rb +48 -0
- data/lib/gamefic-sdk/platform/gfic.rb +33 -0
- data/lib/gamefic-sdk/platform/web.rb +130 -0
- data/lib/gamefic-sdk/platform/web/app_config.rb +56 -0
- data/lib/gamefic-sdk/platform/web/gamefic_opal.rb +36 -0
- data/lib/gamefic-sdk/plot_config.rb +25 -0
- data/lib/gamefic-sdk/version.rb +5 -0
- metadata +103 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 61acd296a500629ea97c6e31db00b4c966aa975d
|
4
|
+
data.tar.gz: cbe43ae8d137c1708f7a65c008230f534bf1a3d6
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 1ed83278eacd87d0582a3f0bf9cd8097b9b9425a1f2f4b6ace6514bd9c6873cfeff95d33987307fd8944c3b46f5a05df9481d57ee876107b11064674398e29f1
|
7
|
+
data.tar.gz: 250a6098b55a035e05141758ee2115a72afacb1ae6342b7f91fbfbecd1d2ffec5611ed6e2480caa1fab43a642bb8c77a3b0f245a10d0b5b6e1acda0e12f3f582
|
data/bin/gfk
ADDED
@@ -0,0 +1,10 @@
|
|
1
|
+
javascripts.push "core/opal.js"
|
2
|
+
javascripts.push "core/gamefic.js"
|
3
|
+
javascripts.push "core/static.js"
|
4
|
+
javascripts.push "core/scripts.js"
|
5
|
+
javascripts.push "core/engine.js"
|
6
|
+
javascripts.push "core/jquery.js"
|
7
|
+
|
8
|
+
javascripts.push "play.js"
|
9
|
+
|
10
|
+
stylesheets.push "style.css"
|
data/lib/gamefic-sdk.rb
ADDED
@@ -0,0 +1,28 @@
|
|
1
|
+
require 'gamefic'
|
2
|
+
require 'gamefic-sdk/gfk'
|
3
|
+
require 'gamefic-sdk/platform'
|
4
|
+
require 'gamefic-sdk/plot_config'
|
5
|
+
|
6
|
+
module Gamefic::Sdk
|
7
|
+
HTML_TEMPLATE_PATH = File.dirname(__FILE__) + "/../html/"
|
8
|
+
GLOBAL_SCRIPT_PATH = File.dirname(__FILE__) + "/../scripts/"
|
9
|
+
# @deprecated
|
10
|
+
GLOBAL_IMPORT_PATH = GLOBAL_SCRIPT_PATH
|
11
|
+
LIB_PATH = File.dirname(__FILE__)
|
12
|
+
end
|
13
|
+
|
14
|
+
class Class
|
15
|
+
def descendants
|
16
|
+
result = []
|
17
|
+
ObjectSpace.each_object(::Class) {|klass| result << klass if klass < self }
|
18
|
+
result
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
class Entity
|
23
|
+
def self.names
|
24
|
+
result = []
|
25
|
+
Entity.descendants.each { |e| result << e.to_s.split('::').last }
|
26
|
+
result
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
require 'yaml'
|
2
|
+
|
3
|
+
module Gamefic::Sdk
|
4
|
+
|
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
|
10
|
+
end
|
11
|
+
platforms = YAML.load(File.read("#{directory}/build.yaml"))
|
12
|
+
platforms.each_pair { |k, v|
|
13
|
+
v['name'] = k
|
14
|
+
cls = Gamefic::Sdk::Platform.const_get(v['platform'])
|
15
|
+
plat = cls.new(directory, v)
|
16
|
+
puts "Building #{k}..." #unless quiet
|
17
|
+
plat.build
|
18
|
+
}
|
19
|
+
puts "Build#{platforms.length > 1 ? 's' : ''} complete." #unless quiet
|
20
|
+
end
|
21
|
+
def self.clean directory, config
|
22
|
+
config.each_pair { |k, v|
|
23
|
+
v['name'] = k
|
24
|
+
puts "Cleaning #{k}..."
|
25
|
+
build_dir = "#{directory}/build/#{k}"
|
26
|
+
platform_dir = "#{directory}/release/#{k}"
|
27
|
+
cls = Gamefic::Sdk::Platform.const_get(v['platform'])
|
28
|
+
plat = cls.new(directory, v)
|
29
|
+
plat.clean
|
30
|
+
}
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
require 'gamefic'
|
2
|
+
|
3
|
+
module Gamefic::Sdk
|
4
|
+
module Debug
|
5
|
+
class Action < Gamefic::Action
|
6
|
+
attr_reader :source_location
|
7
|
+
def initialize(story, command, *queries, &proc)
|
8
|
+
super
|
9
|
+
@executed = false
|
10
|
+
caller.each { |c|
|
11
|
+
if c.end_with?(":in `stage'")
|
12
|
+
@source_location = c[0..-12]
|
13
|
+
break
|
14
|
+
end
|
15
|
+
}
|
16
|
+
end
|
17
|
+
def execute *args
|
18
|
+
super
|
19
|
+
@executed = true
|
20
|
+
end
|
21
|
+
def executed?
|
22
|
+
@executed
|
23
|
+
end
|
24
|
+
def standard?
|
25
|
+
return false if source_location.nil?
|
26
|
+
source_location.start_with?(Gamefic::Sdk::GLOBAL_IMPORT_PATH)
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
require 'gamefic'
|
2
|
+
|
3
|
+
module Gamefic::Sdk::Debug
|
4
|
+
class Plot < Gamefic::Plot
|
5
|
+
attr_reader :main_dir
|
6
|
+
def post_initialize
|
7
|
+
meta :debug, Query::Text.new("unused") do |actor, text|
|
8
|
+
unused = []
|
9
|
+
actions.each { |a|
|
10
|
+
if !a.standard? and !a.executed?
|
11
|
+
unused.push "#{a.verb}:#{a.source_location}"
|
12
|
+
end
|
13
|
+
}
|
14
|
+
actor.tell "#{unused.join("\r\n")}"
|
15
|
+
end
|
16
|
+
end
|
17
|
+
def action(command, *queries, &proc)
|
18
|
+
Gamefic::Sdk::Debug::Action.new(self, command, *queries, &proc)
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,244 @@
|
|
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', GetoptLong::REQUIRED_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'
|
78
|
+
html = arg
|
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 + "/core/*"], directory + "/html")
|
143
|
+
FileUtils.cp_r(Dir[Gamefic::Sdk::HTML_TEMPLATE_PATH + "/skins/" + html + "/*"], directory + "/html")
|
144
|
+
end
|
145
|
+
uuid = SecureRandom.uuid
|
146
|
+
File.open("#{directory}/.uuid", "w") { |f| f.write uuid }
|
147
|
+
puts "Game directory '#{directory}' initialized." unless quiet
|
148
|
+
end
|
149
|
+
def fetch directory
|
150
|
+
if directory.to_s == ''
|
151
|
+
puts "No source directory was specified."
|
152
|
+
exit 1
|
153
|
+
end
|
154
|
+
if !File.directory?(directory)
|
155
|
+
puts "#{directory} is not a directory."
|
156
|
+
exit 1
|
157
|
+
end
|
158
|
+
puts "Loading game data..."
|
159
|
+
story = Plot.new(Source.new(GLOBAL_SCRIPT_PATH))
|
160
|
+
begin
|
161
|
+
story.load directory + '/main', true
|
162
|
+
rescue Exception => e
|
163
|
+
puts "'#{directory}' has errors or is not a valid source directory."
|
164
|
+
puts "#{e}"
|
165
|
+
exit 1
|
166
|
+
end
|
167
|
+
puts "Checking for external script references..."
|
168
|
+
fetched = 0
|
169
|
+
story.imported_scripts.each { |script|
|
170
|
+
if !script.filename.start_with?(directory)
|
171
|
+
base = script.filename[(script.filename.rindex('scripts/') + 7)..-1]
|
172
|
+
puts "Fetching #{base}"
|
173
|
+
FileUtils.mkdir_p directory + '/scripts/' + File.dirname(base)
|
174
|
+
FileUtils.copy script.filename, directory + '/scripts/' + base
|
175
|
+
fetched += 1
|
176
|
+
end
|
177
|
+
}
|
178
|
+
if fetched == 0
|
179
|
+
puts "Nothing to fetch."
|
180
|
+
else
|
181
|
+
puts "Done."
|
182
|
+
end
|
183
|
+
end
|
184
|
+
def build directory
|
185
|
+
Build.release directory
|
186
|
+
end
|
187
|
+
def clean directory
|
188
|
+
config = YAML.load(File.read(directory + '/build.yaml'))
|
189
|
+
Build.clean directory, config
|
190
|
+
end
|
191
|
+
def help command
|
192
|
+
shell_script = File.basename($0)
|
193
|
+
case command
|
194
|
+
when "test"
|
195
|
+
puts <<EOS
|
196
|
+
#{shell_script} test [path]
|
197
|
+
Test a Gamefic source directory or script.
|
198
|
+
EOS
|
199
|
+
when "init"
|
200
|
+
puts <<EOS
|
201
|
+
#{shell_script} init [directory]
|
202
|
+
Initialize a Gamefic source directory. The resulting directory will contain
|
203
|
+
source files ready to build into a Gamefic file.
|
204
|
+
EOS
|
205
|
+
when "fetch"
|
206
|
+
puts <<EOS
|
207
|
+
#{shell_script} fetch [directory]
|
208
|
+
Copy shared scripts to the source directory.
|
209
|
+
If the specified game directory imports external scripts, such as the ones
|
210
|
+
that are distributed with the Gamefic gem, this command will copy them into
|
211
|
+
the game's script directory. Fetching can be useful if you want to customize
|
212
|
+
common features.
|
213
|
+
EOS
|
214
|
+
when "build"
|
215
|
+
puts <<EOS
|
216
|
+
#{shell_script} build [directory] [-o | --output filename]
|
217
|
+
Build a distributable Gamefic file from the source directory. The default
|
218
|
+
filename is [directory].gfic. You can change the filename with the -o option.
|
219
|
+
EOS
|
220
|
+
when "clean"
|
221
|
+
puts <<EOS
|
222
|
+
#{shell_script} clean [directory]
|
223
|
+
Clean Gamefic source directories. This command will delete any intermediate
|
224
|
+
files that are used during the build process. The next build will rebuild
|
225
|
+
everything from source.
|
226
|
+
EOS
|
227
|
+
when nil, "help"
|
228
|
+
puts <<EOS
|
229
|
+
#{shell_script} init [directory] - initialize a Gamefic source directory
|
230
|
+
#{shell_script} test [path] - test a Gamefic source directory or script
|
231
|
+
#{shell_script} fetch [directory] - copy shared scripts into directory
|
232
|
+
#{shell_script} build [directory] - build games
|
233
|
+
#{shell_script} build [directory] - clean game directories
|
234
|
+
#{shell_script} help - display this message
|
235
|
+
#{shell_script} help [command] - display info about command
|
236
|
+
EOS
|
237
|
+
else
|
238
|
+
puts "Unrecognized command '#{command}'"
|
239
|
+
exit 1
|
240
|
+
end
|
241
|
+
end
|
242
|
+
end
|
243
|
+
|
244
|
+
end
|
@@ -0,0 +1,48 @@
|
|
1
|
+
require 'gamefic-sdk'
|
2
|
+
require 'gamefic-sdk/debug/plot'
|
3
|
+
|
4
|
+
module Gamefic::Sdk
|
5
|
+
class Platform::Base
|
6
|
+
# @return [Gamefic::Sdk::Debug::Plot]
|
7
|
+
attr_reader :source_dir
|
8
|
+
|
9
|
+
# @return [Hash]
|
10
|
+
attr_reader :config
|
11
|
+
|
12
|
+
def initialize source_dir, config = {}
|
13
|
+
@source_dir = source_dir
|
14
|
+
@config = defaults.merge(config)
|
15
|
+
@config['target_dir'] ||= "release/#{config['name'] || self.class.to_s.split("::").last}"
|
16
|
+
@config['build_dir'] ||= "build/#{config['name'] || self.class.to_s.split("::").last}"
|
17
|
+
# Convert config directories into absolute paths
|
18
|
+
@config['target_dir'] = File.absolute_path(@config['target_dir'], source_dir)
|
19
|
+
@config['build_dir'] = File.absolute_path(@config['build_dir'], source_dir)
|
20
|
+
end
|
21
|
+
|
22
|
+
def plot
|
23
|
+
if @plot.nil?
|
24
|
+
config = PlotConfig.new "#{source_dir}/config.yaml"
|
25
|
+
paths = config.script_paths + [Gamefic::Sdk::GLOBAL_SCRIPT_PATH]
|
26
|
+
@plot = Gamefic::Sdk::Debug::Plot.new(Gamefic::Source::File.new(*paths))
|
27
|
+
@plot.script 'main'
|
28
|
+
end
|
29
|
+
@plot
|
30
|
+
end
|
31
|
+
|
32
|
+
# Get a hash of default configuration values.
|
33
|
+
# Platforms can overload this method to define their own defaults.
|
34
|
+
# @return [Hash]
|
35
|
+
def defaults
|
36
|
+
@defaults ||= Hash.new
|
37
|
+
end
|
38
|
+
|
39
|
+
def build
|
40
|
+
# Platforms need to build/compile the deployment here.
|
41
|
+
raise "The base Platform class does not have a build method"
|
42
|
+
end
|
43
|
+
|
44
|
+
def clean
|
45
|
+
puts "Nothing to do for this platform."
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
require 'zip'
|
2
|
+
|
3
|
+
module Gamefic::Sdk
|
4
|
+
|
5
|
+
class Platform::Gfic < Platform::Base
|
6
|
+
def defaults
|
7
|
+
@defaults ||= {
|
8
|
+
:filename => nil,
|
9
|
+
:with_html => true,
|
10
|
+
:with_media => true
|
11
|
+
}
|
12
|
+
end
|
13
|
+
def build
|
14
|
+
target_dir = config['target_dir']
|
15
|
+
if config['filename'].to_s == ''
|
16
|
+
filename = target_dir + '/' + source_dir.split('/').delete_if{|i| i.to_s == ''}.last + '.gfic'
|
17
|
+
else
|
18
|
+
filename = "#{target_dir}/#{config['filename']}"
|
19
|
+
end
|
20
|
+
stream = StringIO.new("")
|
21
|
+
FileUtils.rm filename if File.file?(filename)
|
22
|
+
FileUtils.mkdir_p target_dir
|
23
|
+
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
|
+
}
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
end
|
@@ -0,0 +1,130 @@
|
|
1
|
+
require 'gamefic'
|
2
|
+
require 'gamefic-sdk'
|
3
|
+
require 'opal'
|
4
|
+
|
5
|
+
module Gamefic::Sdk
|
6
|
+
|
7
|
+
class Platform::Web < Platform::Base
|
8
|
+
autoload :AppConfig, 'gamefic-sdk/platform/web/app_config'
|
9
|
+
|
10
|
+
def defaults
|
11
|
+
@defaults ||= {
|
12
|
+
:html_skin => 'multimedia',
|
13
|
+
:with_media => true
|
14
|
+
}
|
15
|
+
end
|
16
|
+
|
17
|
+
def build
|
18
|
+
target_dir = config['target_dir']
|
19
|
+
# TODO Configurable build folder?
|
20
|
+
build_dir = config['build_dir']
|
21
|
+
html_dir = resolve_html_dir
|
22
|
+
app_config = AppConfig.new html_dir
|
23
|
+
|
24
|
+
FileUtils.mkdir_p target_dir
|
25
|
+
|
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 != '..'
|
29
|
+
FileUtils.mkdir_p target_dir + File.dirname(entry)
|
30
|
+
FileUtils.cp_r "#{html_dir}/#{entry}", "#{target_dir}/#{entry}"
|
31
|
+
end
|
32
|
+
}
|
33
|
+
|
34
|
+
# Make sure core exists in build directory
|
35
|
+
FileUtils.mkdir_p build_dir + "/core"
|
36
|
+
|
37
|
+
# Opal core
|
38
|
+
if !File.exist?(build_dir + "/core/opal.js")
|
39
|
+
File.open(build_dir + "/core/opal.js", "w") do |file|
|
40
|
+
file << Opal::Builder.build('opal')
|
41
|
+
file << Opal::Builder.build('json')
|
42
|
+
file << Opal::Builder.build('native')
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
# Gamefic core
|
47
|
+
Opal.append_path Gamefic::Sdk::LIB_PATH
|
48
|
+
if !File.exist?(build_dir + "/core/gamefic.js")
|
49
|
+
File.open(build_dir + "/core/gamefic.js", "w") do |file|
|
50
|
+
file << Opal::Builder.build('gamefic').to_s
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
# GameficOpal
|
55
|
+
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
|
59
|
+
end
|
60
|
+
|
61
|
+
# Plot scripts
|
62
|
+
File.open("#{build_dir}/scripts.rb", 'w') do |file|
|
63
|
+
file << "def GameficOpal.load_scripts\n"
|
64
|
+
plot.imported_scripts.each { |script|
|
65
|
+
file << "GameficOpal.static_plot.stage do\n"
|
66
|
+
file << script.read
|
67
|
+
file << "\nend\n"
|
68
|
+
}
|
69
|
+
file << "end\n"
|
70
|
+
end
|
71
|
+
Opal.append_path build_dir
|
72
|
+
File.open(build_dir + "/core/scripts.js", 'w') do |file|
|
73
|
+
file << Opal::Builder.build('scripts')
|
74
|
+
end
|
75
|
+
|
76
|
+
# Render index
|
77
|
+
File.open(target_dir + "/index.html", "w") do |file|
|
78
|
+
file << app_config.render
|
79
|
+
end
|
80
|
+
|
81
|
+
# Copy requisite assets
|
82
|
+
app_config.resource_paths.push build_dir
|
83
|
+
app_config.javascripts.each { |js|
|
84
|
+
absolute = resolve(js, app_config.resource_paths)
|
85
|
+
FileUtils.mkdir_p target_dir + "/" + File.dirname(js)
|
86
|
+
FileUtils.cp_r absolute, target_dir + "/" + js
|
87
|
+
}
|
88
|
+
app_config.stylesheets.each { |css|
|
89
|
+
absolute = resolve(css, app_config.resource_paths)
|
90
|
+
FileUtils.mkdir_p target_dir + "/" + File.dirname(css)
|
91
|
+
FileUtils.cp_r absolute, target_dir + "/" + css
|
92
|
+
}
|
93
|
+
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
|
+
|
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
|
109
|
+
end
|
110
|
+
}
|
111
|
+
raise "#{filename} not found" if absolute.nil?
|
112
|
+
absolute
|
113
|
+
end
|
114
|
+
|
115
|
+
def resolve_html_dir
|
116
|
+
html_dir = "#{source_dir}/html"
|
117
|
+
if !File.directory?(html_dir) and config['html_skin'].to_s != ''
|
118
|
+
html_dir = "#{Gamefic::Sdk::HTML_TEMPLATE_PATH}/skins/#{config['html_skin']}"
|
119
|
+
end
|
120
|
+
if !File.directory?(html_dir)
|
121
|
+
html_dir = "#{Gamefic::Sdk::HTML_TEMPLATE_PATH}/skins/minimal"
|
122
|
+
end
|
123
|
+
if !File.directory?(html_dir)
|
124
|
+
raise "Could not resolve HTML directory"
|
125
|
+
end
|
126
|
+
html_dir
|
127
|
+
end
|
128
|
+
end
|
129
|
+
|
130
|
+
end
|
@@ -0,0 +1,56 @@
|
|
1
|
+
require 'erb'
|
2
|
+
require 'gamefic/stage'
|
3
|
+
|
4
|
+
class Gamefic::Sdk::Platform::Web::AppConfig
|
5
|
+
include Stage
|
6
|
+
attr_reader :javascripts, :stylesheets, :resource_paths
|
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
|
11
|
+
@javascripts = []
|
12
|
+
@stylesheets = []
|
13
|
+
@source_dir = source_dir
|
14
|
+
@resource_paths = ["#{source_dir}", Gamefic::Sdk::HTML_TEMPLATE_PATH]
|
15
|
+
config_file = "#{source_dir}/config.rb"
|
16
|
+
stage File.read(config_file), config_file
|
17
|
+
end
|
18
|
+
|
19
|
+
# @return [BuildConfig::Data]
|
20
|
+
def data
|
21
|
+
Data.new @javascripts, @stylesheets
|
22
|
+
end
|
23
|
+
|
24
|
+
# Render HTML using the build config data
|
25
|
+
#
|
26
|
+
# @return [String] The resulting HTML
|
27
|
+
def render
|
28
|
+
erb = ERB.new(File.read(@source_dir + "/index.html.erb"))
|
29
|
+
erb.result data.get_binding
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
class Gamefic::Sdk::Platform::Web::AppConfig::Data
|
34
|
+
attr_reader :javascripts, :stylesheets
|
35
|
+
def initialize javascripts, stylesheets
|
36
|
+
@javascripts = javascripts
|
37
|
+
@stylesheets = stylesheets
|
38
|
+
end
|
39
|
+
def javascript_tags
|
40
|
+
result = ""
|
41
|
+
javascripts.each { |js|
|
42
|
+
result += "<script type=\"text/javascript\" src=\"#{js}\"></script>"
|
43
|
+
}
|
44
|
+
result
|
45
|
+
end
|
46
|
+
def stylesheet_tags
|
47
|
+
result = ""
|
48
|
+
stylesheets.each { |css|
|
49
|
+
result += "<link rel=\"stylesheet\" type=\"text/css\" href=\"#{css}\" />"
|
50
|
+
}
|
51
|
+
result
|
52
|
+
end
|
53
|
+
def get_binding
|
54
|
+
binding()
|
55
|
+
end
|
56
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
# HACK Explicit requires to fix Opal's failure to resolve autoloads
|
2
|
+
require 'gamefic/query/expression'
|
3
|
+
require 'gamefic/query/matches'
|
4
|
+
require 'gamefic/grammar/verb_set'
|
5
|
+
|
6
|
+
# HACK Opal doesn't recognizes classes and modules declared from scripts
|
7
|
+
def Object.const_missing sym
|
8
|
+
Gamefic.const_get sym
|
9
|
+
end
|
10
|
+
|
11
|
+
module GameficOpal
|
12
|
+
def self.static_plot
|
13
|
+
@@static_plot ||= WebPlot.new(Gamefic::Source::Text.new)
|
14
|
+
end
|
15
|
+
def self.static_player
|
16
|
+
@@static_player ||= WebUser.new(GameficOpal.static_plot)
|
17
|
+
end
|
18
|
+
|
19
|
+
class WebPlot < Gamefic::Plot
|
20
|
+
def script path
|
21
|
+
# Stub
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
class WebUser < Gamefic::User
|
26
|
+
def save filename, data
|
27
|
+
`Gamefic.Engine.save(filename, data);`
|
28
|
+
end
|
29
|
+
def restore filename
|
30
|
+
data = `Gamefic.Engine.restore(filename);`
|
31
|
+
return data
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
GameficOpal.static_plot.script 'main'
|
@@ -0,0 +1,25 @@
|
|
1
|
+
require 'yaml'
|
2
|
+
|
3
|
+
module Gamefic
|
4
|
+
|
5
|
+
class PlotConfig
|
6
|
+
attr_reader :author, :title, :script_paths, :asset_paths
|
7
|
+
def initialize filename = nil
|
8
|
+
@script_paths = []
|
9
|
+
@asset_paths = []
|
10
|
+
if !filename.nil?
|
11
|
+
config = YAML.load_file filename
|
12
|
+
base_dir = File.dirname(filename)
|
13
|
+
@author = config['author']
|
14
|
+
@title = config['title']
|
15
|
+
config['script_paths'].each { |p|
|
16
|
+
@script_paths.push File.absolute_path(p, base_dir)
|
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?
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
end
|
metadata
ADDED
@@ -0,0 +1,103 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: gamefic-sdk
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.3.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Fred Snyder
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2016-04-16 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: gamefic
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - '>='
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - '>='
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: opal
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - '>='
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: 0.7.2
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - '>='
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: 0.7.2
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: rspec
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - '>='
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - '>='
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
55
|
+
description: Development tools for Gamefic
|
56
|
+
email: fsnyder@gamefic.com
|
57
|
+
executables:
|
58
|
+
- gfk
|
59
|
+
extensions: []
|
60
|
+
extra_rdoc_files: []
|
61
|
+
files:
|
62
|
+
- lib/gamefic-sdk.rb
|
63
|
+
- lib/gamefic-sdk/platform/base.rb
|
64
|
+
- lib/gamefic-sdk/platform/gfic.rb
|
65
|
+
- lib/gamefic-sdk/platform/web.rb
|
66
|
+
- lib/gamefic-sdk/platform/web/app_config.rb
|
67
|
+
- lib/gamefic-sdk/platform/web/gamefic_opal.rb
|
68
|
+
- lib/gamefic-sdk/plot_config.rb
|
69
|
+
- 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/minimal/config.rb
|
77
|
+
- bin/gfk
|
78
|
+
homepage: http://gamefic.com
|
79
|
+
licenses:
|
80
|
+
- MIT
|
81
|
+
metadata: {}
|
82
|
+
post_install_message:
|
83
|
+
rdoc_options: []
|
84
|
+
require_paths:
|
85
|
+
- lib
|
86
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
87
|
+
requirements:
|
88
|
+
- - '>='
|
89
|
+
- !ruby/object:Gem::Version
|
90
|
+
version: 1.9.3
|
91
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
92
|
+
requirements:
|
93
|
+
- - '>='
|
94
|
+
- !ruby/object:Gem::Version
|
95
|
+
version: '0'
|
96
|
+
requirements: []
|
97
|
+
rubyforge_project:
|
98
|
+
rubygems_version: 2.0.14
|
99
|
+
signing_key:
|
100
|
+
specification_version: 4
|
101
|
+
summary: Gamefic SDK
|
102
|
+
test_files: []
|
103
|
+
has_rdoc:
|