author_engine 0.5.0 → 0.9.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 240a86f7ca8210f55b1000684999a28d178bb8aee05816924c09987279930acb
4
- data.tar.gz: b020c530b4e217ff3b2c6fa8f956eae3a7faef8c3e07de8226fdbd239a0adec9
3
+ metadata.gz: 61261132ab4fc88d6e4c6639443f4cc967cc41cc73956345c20de4091065df5c
4
+ data.tar.gz: 1c941abf61b677cb4c501285fb414ed6c1d062c0ba8989ba31c2655634383afb
5
5
  SHA512:
6
- metadata.gz: 979bd0fc59a1767dede59ca38f1ac63965beb8c538c95c25fd824d7d5c0b4449508d83f4dec6bc2e4b0d8c046f37f35c1995da4f2460e4d9562534d59b4e41fd
7
- data.tar.gz: d105fe0793a73d82bb36c69623a031ad0a45ffd0dfbae4027a55e4a77e05bcd75be360fc9fa8427080a2ab1dc4f993f87065a63b0fdbb7e1ec89c99dbc2649d6
6
+ metadata.gz: ef8a21c43402efa405310f0d5ad862ca5becbaebf18d187bc3b431f48d1ec915149b14c1f82507c47f299851c0e601f1418ffdc691f2ababc777aee6bbbf0d9e
7
+ data.tar.gz: 53c585c3057a349b727a805302dc13599e25eec236bce3b79ff031ac40970b8975303f7f6fc0da425ce49ea74d746d5979e464c86efd9b9bfd75297dc5f3a826
data/README.md CHANGED
@@ -22,7 +22,7 @@ A virtual console¹ that you code in Ruby.
22
22
  ## Sprite Editor
23
23
  ![sprite_editor_view](https://raw.githubusercontent.com/cyberarm/author_engineV2/master/screenshots/sprite_editor.png)
24
24
  ## Level Editor
25
- ![level_editor_view](#)
25
+ ![level_editor_view](https://raw.githubusercontent.com/cyberarm/author_engineV2/master/screenshots/level_editor.png)
26
26
  ## Code Editor
27
27
  ![code_editor_view](https://raw.githubusercontent.com/cyberarm/author_engineV2/master/screenshots/code_editor.png)
28
28
 
Binary file
@@ -30,13 +30,13 @@ Gem::Specification.new do |spec|
30
30
  end
31
31
  spec.bindir = "bin"
32
32
  spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
33
- spec.require_paths = ["lib", "assets"]
33
+ spec.require_paths = ["lib", "assets", "vendor"]
34
34
 
35
- spec.add_dependency "gosu", "~> 0.14.4"
35
+ spec.add_dependency "gosu", "~> 0.15.0"
36
36
  spec.add_dependency "coderay", "~> 1.1.2"
37
- spec.add_dependency "opal", "~> 0.11.4"
37
+ spec.add_dependency "opal", "~> 1.0.0"
38
38
 
39
- spec.add_development_dependency "bundler", "~> 1.16"
40
- spec.add_development_dependency "rake", "~> 10.0"
41
- spec.add_development_dependency "minitest", "~> 5.0"
39
+ spec.add_development_dependency "bundler", "~> 2.0"
40
+ spec.add_development_dependency "rake", "~> 13.0"
41
+ spec.add_development_dependency "minitest", "~> 5.13"
42
42
  end
@@ -10,6 +10,15 @@ class AuthorEngine
10
10
  puts "author_engine export project [exported_name]"
11
11
  end
12
12
 
13
+ elsif ARGV[0] && ARGV[0] == "inflate"
14
+ if ARGV[1] && ARGV[1].end_with?(".authorengine")
15
+ if File.exists?(ARGV[1])
16
+ savefile = SaveFile.new(ARGV[1])
17
+ savefile.inflate!
18
+ puts "Inflated #{ARGV[1]}"
19
+ end
20
+ end
21
+
13
22
  elsif ARGV[0] && ARGV[0].end_with?(".authorengine")
14
23
  # The Loader Container handles loading projects
15
24
  AuthorEngine::Window.new.show
@@ -3,7 +3,7 @@ class AuthorEngine
3
3
  Color = Struct.new(:red, :green, :blue, :alpha)
4
4
  BoundingBox = Struct.new(:x, :y, :width, :height)
5
5
 
6
- def initialize(game_sprites, game_levels)
6
+ def initialize(game_sprites, game_levels, spritesheet)
7
7
  @game_sprites = game_sprites
8
8
  @game_levels = game_levels
9
9
 
@@ -11,21 +11,30 @@ class AuthorEngine
11
11
  @levels = []
12
12
 
13
13
  @known_collisions = []
14
+
15
+ spritesheet_blob = RUBY_ENGINE == "opal" ? spritesheet.to_blob.each_slice(4).to_a : spritesheet.to_blob.bytes.each_slice(4).to_a
16
+ (spritesheet.rows / 16).times do |y|
17
+ (spritesheet.columns / 16).times do |x|
18
+ blob = []
19
+
20
+ 16.times do |sy|
21
+ 16.times do |sx|
22
+ blob << spritesheet_blob[(y * 16 + sy) * spritesheet.columns + (x * 16 + sx)]
23
+ end
24
+ end
25
+
26
+ add_sprite(blob.flatten!)
27
+ end
28
+ end
29
+
30
+ @game_levels.each { |level| add_level(level) }
14
31
  end
15
32
 
16
33
  def clear
17
34
  @known_collisions.clear
18
35
  end
19
36
 
20
- def add_sprite(image_or_blob)
21
- blob = nil
22
- if RUBY_ENGINE != "opal"
23
- blob = image_or_blob.to_blob
24
- else
25
- blob = []
26
- `#{image_or_blob}.forEach(function(value) {#{blob << `value`}})`#.each {|n| blob << n}
27
- end
28
-
37
+ def add_sprite(blob)
29
38
  @sprites << {blob: blob, box: bounding_box(blob)}
30
39
  end
31
40
 
@@ -94,7 +103,7 @@ class AuthorEngine
94
103
  def render_bounding_box(sprite_index, box, sprite_x, sprite_y, edges = {}, z = Float::INFINITY, color = 0xc800ff00, collision_color = 0xc8ff00ff)
95
104
  if RUBY_ENGINE == "opal"
96
105
  color = "green"
97
- collision_color = "red"
106
+ collision_color = "purple"
98
107
  end
99
108
  paint_color = color
100
109
  # EDGE: TOP
@@ -142,13 +151,13 @@ class AuthorEngine
142
151
 
143
152
  def draw_line(x, y, x2, y2, color, z = 0)
144
153
  if RUBY_ENGINE == "opal"
145
- `#{AuthorEngine::GameRunner.instance.game.canvas_context}.strokeStyle = #{color}`
146
- `#{AuthorEngine::GameRunner.instance.game.canvas_context}.lineWidth = 1`
154
+ `#{AuthorEngine::GameRunner.instance.game.authorengine_canvas_context}.strokeStyle = #{color}`
155
+ `#{AuthorEngine::GameRunner.instance.game.authorengine_canvas_context}.lineWidth = 1`
147
156
 
148
- `#{AuthorEngine::GameRunner.instance.game.canvas_context}.beginPath()`
149
- `#{AuthorEngine::GameRunner.instance.game.canvas_context}.moveTo(#{x}, #{y})`
150
- `#{AuthorEngine::GameRunner.instance.game.canvas_context}.lineTo(#{x2}, #{y2})`
151
- `#{AuthorEngine::GameRunner.instance.game.canvas_context}.stroke()`
157
+ `#{AuthorEngine::GameRunner.instance.game.authorengine_canvas_context}.beginPath()`
158
+ `#{AuthorEngine::GameRunner.instance.game.authorengine_canvas_context}.moveTo(#{x}, #{y})`
159
+ `#{AuthorEngine::GameRunner.instance.game.authorengine_canvas_context}.lineTo(#{x2}, #{y2})`
160
+ `#{AuthorEngine::GameRunner.instance.game.authorengine_canvas_context}.stroke()`
152
161
  else
153
162
  Gosu.draw_line(x, y, color, x2, y2, color, z)
154
163
  end
@@ -158,14 +167,14 @@ class AuthorEngine
158
167
  def solid_at?(blob, x, y)
159
168
  width = 16
160
169
 
161
- blob[(y * width + x) * 4 + 3].ord
170
+ blob[(y * width + x) * 4 + 3].ord > 0
162
171
  end
163
172
 
164
173
  def bounding_box(blob, size = 16)
165
174
  box = BoundingBox.new(size, size, 0, 0)
166
175
  size.times do |y|
167
176
  size.times do |x|
168
- if solid_at?(blob, x, y) > 0
177
+ if solid_at?(blob, x, y)
169
178
  box.x = x if x < box.x
170
179
  box.y = y if y < box.y
171
180
  box.width = x if x > box.width
@@ -2,8 +2,17 @@ class AuthorEngine
2
2
  class Loader < Container
3
3
  Project = Struct.new(:name, :block)
4
4
  def setup
5
- @root_directory = Dir.pwd#"#{Dir.home}/AuthorEngineProjects"
6
- Dir.mkdir(@root_directory) unless File.exists?(@root_directory)
5
+ if ARGV[0] && File.exists?(ARGV[0]) && Gosu.milliseconds < 1500
6
+ if ARGV[0].end_with?(".authorengine")
7
+ load(ARGV[0])
8
+ return
9
+ elsif File.directory?(ARGV[0])
10
+ @root_directory = ARGV[0]
11
+ else
12
+ puts "AuthorEngine: #{ARGV[0]} is not a compatible file."
13
+ end
14
+ end
15
+ @root_directory ||= Dir.pwd #"#{Dir.home}/AuthorEngineProjects"
7
16
 
8
17
  @list = []
9
18
  @files = Dir.glob(@root_directory+"/*.authorengine")
@@ -27,13 +36,9 @@ class AuthorEngine
27
36
  end
28
37
  @new_button.x = window.width - @new_button.width
29
38
 
30
- if ARGV[0] && File.exists?(ARGV[0])
31
- if ARGV[0].end_with?(".authorengine")
32
- load(ARGV[0])
33
- else
34
- puts "AuthorEngine: #{ARGV[0]} is not a compatible file."
35
- end
36
- end
39
+ @draw_caret = true
40
+ @last_caret_update = Gosu.milliseconds
41
+ @caret_interval = 500
37
42
  end
38
43
 
39
44
  def load(filename)
@@ -53,8 +58,23 @@ class AuthorEngine
53
58
  end
54
59
 
55
60
  def draw_inputter
61
+ caret_x = @font.text_width(window.text_input.text[0..window.text_input.caret_pos-1])
62
+ caret_x = 0 if window.text_input.caret_pos == 0
63
+ if Gosu.milliseconds > @last_caret_update + @caret_interval
64
+ @draw_caret = !@draw_caret
65
+ @last_caret_update = Gosu.milliseconds
66
+ end
67
+
56
68
  x = window.width/2 - @font.text_width(window.text_input.text+".authorengine")/2
69
+ error_x = window.width/2 - @font.text_width(window.text_input.text.strip+".authorengine already exists!")/2
57
70
  y = window.height/2 - @font.height/2
71
+
72
+ Gosu.draw_rect(x+caret_x, y, 2, @font.height, Gosu::Color::WHITE) if @draw_caret
73
+ if window.text_input.text.strip+".authorengine" == @name_exists
74
+ @font.draw_text(window.text_input.text.strip+".authorengine already exists!", error_x, y - 32, 0, 1,1, red) if @name_exists
75
+ else
76
+ @name_exists = false
77
+ end
58
78
  @font.draw_text(window.text_input.text+".authorengine", x, y, 0)
59
79
  end
60
80
 
@@ -100,12 +120,22 @@ class AuthorEngine
100
120
  @index = 0 if @list.size == 0
101
121
  @index = @index % @list.size-1 if @list.size != 0
102
122
  when Gosu::KbEnter, Gosu::KbReturn
123
+ filename = window.text_input.text.strip if window.text_input
124
+
103
125
  if @entering_name
104
- SaveFile.create(window.text_input.text.strip+".authorengine")
105
- load(window.text_input.text.strip+".authorengine")
126
+ if File.exists?(filename)
127
+ @name_exists = filename
128
+ else
129
+ window.text_input = nil
130
+ savefile = SaveFile.create(filename+".authorengine")
131
+ load(filename+".authorengine")
132
+ end
106
133
  else
107
134
  @list[@index].block.call if @list[@index]&.block
108
135
  end
136
+ when Gosu::KbEscape
137
+ @entering_name = false
138
+ window.text_input = nil
109
139
  end
110
140
  end
111
141
  end
@@ -2,31 +2,31 @@ class AuthorEngine
2
2
  class Part
3
3
  module CollisionDetection
4
4
  def bounding_box(sprite_index)
5
- @collision_detection.box(sprite_index)
5
+ @authorengine_collision_detection.box(sprite_index)
6
6
  end
7
7
 
8
8
  def colliding_edge(sprite_index, sprite_x, sprite_y, target_sprite_index, target_x, target_y)
9
- @collision_detection.colliding_edge(sprite_index, sprite_x, sprite_y, target_sprite_index, target_x, target_y)
9
+ @authorengine_collision_detection.colliding_edge(sprite_index, sprite_x, sprite_y, target_sprite_index, target_x, target_y)
10
10
  end
11
11
 
12
12
  def sprite_vs_sprite(sprite_index, sprite_x, sprite_y, target_sprite_index, target_x, target_y)
13
- @collision_detection.sprite_vs_sprite(sprite_index, sprite_x, sprite_y, target_sprite_index, target_x, target_y)
13
+ @authorengine_collision_detection.sprite_vs_sprite(sprite_index, sprite_x, sprite_y, target_sprite_index, target_x, target_y)
14
14
  end
15
15
 
16
16
  def sprite_vs_level(sprite_index, sprite_x, sprite_y, level)
17
- @collision_detection.sprite_vs_level(sprite_index, sprite_x, sprite_y, level)
17
+ @authorengine_collision_detection.sprite_vs_level(sprite_index, sprite_x, sprite_y, level)
18
18
  end
19
19
 
20
20
  def draw_sprite_box(sprite_index, sprite_x, sprite_y)
21
- @collision_detection.debug_draw_sprite(sprite_index, sprite_x, sprite_y)
21
+ @authorengine_collision_detection.debug_draw_sprite(sprite_index, sprite_x, sprite_y)
22
22
  end
23
23
 
24
24
  def draw_level_boxes(level_index)
25
- @collision_detection.debug_draw_level(level_index)
25
+ @authorengine_collision_detection.debug_draw_level(level_index)
26
26
  end
27
27
 
28
28
  def render_bounding_box(sprite_index, box, sprite_x, sprite_y, edges = {}, z = Float::INFINITY)
29
- @collision_detection.render_bounding_box(sprite_index, box, sprite_x, sprite_y, edges, z)
29
+ @authorengine_collision_detection.render_bounding_box(sprite_index, box, sprite_x, sprite_y, edges, z)
30
30
  end
31
31
  end
32
32
  end
@@ -1,14 +1,17 @@
1
1
  class AuthorEngine
2
2
  class Part
3
3
  module Common
4
+ # returns display width
4
5
  def width
5
6
  128
6
7
  end
7
8
 
9
+ # returns display height
8
10
  def height
9
11
  128
10
12
  end
11
13
 
14
+ # returns frames per seconds
12
15
  def fps
13
16
  if RUBY_ENGINE == "opal"
14
17
  AuthorEngine::GameRunner.instance.fps
@@ -17,10 +20,22 @@ class AuthorEngine
17
20
  end
18
21
  end
19
22
 
23
+ def distance(x1, y1, x2, y2)
24
+ dx = x2 - x1
25
+ dy = y2 - y1
26
+
27
+ Math.sqrt(dx * dx + dy * dy)
28
+ end
29
+
30
+ def levels
31
+ @authorengine_levels ? @authorengine_levels : AuthorEngine::GameRunner.instance.levels
32
+ end
33
+
34
+ # returns number of milliseconds since game started
20
35
  def milliseconds
21
36
  if RUBY_ENGINE == "opal"
22
37
  @__initial_milliseconds ||= `performance.now()`
23
- (`performance.now()` - @__initial_milliseconds).round(3)
38
+ (`performance.now()` - @__initial_milliseconds)
24
39
  else
25
40
  Gosu.milliseconds
26
41
  end
@@ -12,34 +12,39 @@ class AuthorEngine
12
12
  include AuthorEngine::Part::GosuInput
13
13
  end
14
14
 
15
- attr_accessor :scale, :canvas, :canvas_context
16
- attr_accessor :collision_detection
15
+ attr_accessor :authorengine_scale, :authorengine_canvas, :authorengine_canvas_context
16
+ attr_accessor :authorengine_collision_detection
17
17
  def initialize(code:)
18
+ @authorengine_code = code
19
+
18
20
  if RUBY_ENGINE == "opal"
19
- @scale = 1.0
20
- @canvas = `document.getElementById('canvas')`
21
- @canvas_context = `#{@canvas}.getContext('2d')`
21
+ @authorengine_scale = 1.0
22
+ @authorengine_canvas = `document.getElementById('canvas')`
23
+ @authorengine_canvas_context = `#{@authorengine_canvas}.getContext('2d')`
22
24
  end
23
25
 
24
26
  if RUBY_ENGINE != "opal"
25
- @sprites = SpriteEditor.instance.sprites
27
+ @authorengine_sprites = SpriteEditor.instance.sprites
26
28
 
27
- @levels = []
29
+ @authorengine_levels = []
28
30
  # Create a "Deep Copy" to allow for swapping of a level's sprites without corrupting LevelEditor's version
29
31
  LevelEditor.instance.levels.each do |level|
30
- @levels << level.sort_by {|sprite| sprite.z}.map {|sprite| sprite.dup}
32
+ @authorengine_levels << level.sort_by {|sprite| sprite.z}.map {|sprite| sprite.dup}
31
33
  end
32
34
  size = 16
33
- @levels.each {|level| level.each {|sprite| sprite.x = sprite.x * size; sprite.y = sprite.y * size}}
35
+ @authorengine_levels.each {|level| level.each {|sprite| sprite.x = sprite.x * size; sprite.y = sprite.y * size}}
34
36
 
35
- @collision_detection = CollisionDetection.new(@sprites, @levels)
37
+ spritesheet = SpriteEditor.instance.spritesheet
38
+ @authorengine_collision_detection = CollisionDetection.new(@authorengine_sprites, @authorengine_levels, SaveFile::SpriteSheetData.new(spritesheet.width, spritesheet.height, spritesheet.to_blob))
36
39
 
37
- @sprites.each {|sprite| @collision_detection.add_sprite(sprite) }
38
- @levels.each {|level| @collision_detection.add_level(level) }
40
+ self.instance_eval(code)
39
41
  end
40
42
 
41
43
  @background_color = black
42
- self.instance_eval(code)
44
+ end
45
+
46
+ def authorengine_eval_code
47
+ self.instance_eval(@authorengine_code)
43
48
  end
44
49
 
45
50
  def draw_background
@@ -6,27 +6,27 @@ class AuthorEngine
6
6
  end
7
7
 
8
8
  def text(text, x = 0, y = 0, size = 4, z = 0, color = white)
9
- @fonts ||= {}
9
+ @authorengine_fonts ||= {}
10
10
 
11
11
  font = nil
12
12
 
13
- if @fonts.dig(size)
14
- font = @fonts.dig(size)
13
+ if @authorengine_fonts.dig(size)
14
+ font = @authorengine_fonts.dig(size)
15
15
  else
16
- font = (@fonts[size] = Gosu::Font.new(size, name: Text::FONT_DEFAULT))
16
+ font = (@authorengine_fonts[size] = Gosu::Font.new(size, name: Text::FONT_DEFAULT))
17
17
  end
18
18
 
19
19
  font.draw_markup(text, x, y, z, 1, 1, color)
20
20
  end
21
21
 
22
22
  def sprite(index, x = 0, y = 0, z = 0, alpha = 255)
23
- image = @sprites[index]
23
+ image = @authorengine_sprites[index]
24
24
  raise "No sprite at '#{index}'!" unless image
25
25
  image.draw(x, y, z, 1,1, Gosu::Color.rgba(255,255,255, alpha))
26
26
  end
27
27
 
28
28
  def level(index, z = 0)
29
- _level = @levels[index]
29
+ _level = @authorengine_levels[index]
30
30
  raise "No level at '#{index}'!" unless _level
31
31
 
32
32
  _level.each do |sprite|
@@ -35,10 +35,10 @@ class AuthorEngine
35
35
  end
36
36
 
37
37
  def swap(level, current_sprite, replacement_sprite)
38
- _level = @levels[level]
38
+ _level = @authorengine_levels[level]
39
39
  raise "No level at '#{index}'!" unless _level
40
- raise "No sprite at '#{current_sprite}'!" unless @sprites[current_sprite]
41
- raise "No sprite at '#{current_sprite}'!" unless @sprites[replacement_sprite]
40
+ raise "No sprite at '#{current_sprite}'!" unless @authorengine_sprites[current_sprite]
41
+ raise "No sprite at '#{current_sprite}'!" unless @authorengine_sprites[replacement_sprite]
42
42
 
43
43
  _level.each {|sprite| sprite.sprite = replacement_sprite if sprite.sprite == current_sprite}
44
44
  end
@@ -1,5 +1,6 @@
1
1
  require "opal"
2
2
  require "fileutils"
3
+ require_relative "../../version"
3
4
 
4
5
  class AuthorEngine
5
6
  class OpalExporter
@@ -14,16 +15,16 @@ class AuthorEngine
14
15
  return name.split("_").map {|n| n.capitalize}.join(" ")
15
16
  end
16
17
 
17
- # Rebuild opal runtime of it doesn't exist or if its out of date
18
- def build_opal?
19
- opal_runtime = "#{export_directory}/js/runtime.js"
18
+ # Rebuild author_engine runtime if it doesn't exist or if its out of date
19
+ def build_authorengine?
20
+ authorengine_runtime = "#{export_directory}/js/author_engine.js"
20
21
 
21
- if File.exists?(opal_runtime)
22
- file = File.open(opal_runtime)
22
+ if File.exists?(authorengine_runtime)
23
+ file = File.open(authorengine_runtime)
23
24
  version = file.first.gsub("/", "").strip
24
25
  file.close
25
26
 
26
- Opal::VERSION != version
27
+ AuthorEngine::VERSION != version
27
28
  else
28
29
  true
29
30
  end
@@ -42,10 +43,10 @@ body {
42
43
  #canvas {
43
44
  display: block;
44
45
  margin: 0 auto;
45
- // cursor: none;
46
+ cursor: none;
46
47
  }
47
48
  #loading {
48
- font-family: Connection, sans serif;
49
+ font-family: Connection, sans-serif;
49
50
  color: white;
50
51
  text-align: center;
51
52
 
@@ -62,15 +63,15 @@ body {
62
63
  end
63
64
 
64
65
  def project
66
+ file = File.read(@project_file)
67
+
65
68
  %{
66
- var projectString = `#{File.open(@project_file).read}`;
69
+ var projectString = `#{file}`;
67
70
  }
68
71
  end
69
72
 
70
- def game_runtime
73
+ def author_engine_runtime
71
74
  program = %{
72
- # require "opal"
73
- # require "opal-parser"
74
75
  require "author_engine/opal"
75
76
 
76
77
  `var callback = function(){
@@ -89,32 +90,25 @@ if (
89
90
 
90
91
  puts "Transpiling to JavaScript using Opal..."
91
92
 
92
- opal_builder = nil
93
- if build_opal?
94
- puts " Building Opal runtime..."
93
+ author_engine_builder = nil
94
+ if build_authorengine?
95
+ puts " Building AuthorEngine runtime..."
96
+
97
+ author_engine_builder = Opal::Builder.new
98
+ base_path = File.expand_path("../../../..", __FILE__)
99
+ author_engine_builder.append_paths("#{base_path}")
95
100
 
96
- opal_builder = Opal::Builder.new
97
- opal_builder.build("opal")
98
- opal_builder.build("opal-parser")
101
+ author_engine_builder.build_require("author_engine/opal")
99
102
  else
100
- puts " Skipping Opal runtime. Already exists as v#{Opal::VERSION}..."
103
+ puts " Skipping AuthorEngine runtime. Already exists and up to date (v#{AuthorEngine::VERSION})..."
101
104
  end
102
105
 
103
- puts " Building AuthorEngine runtime with project..."
104
- game_builder = Opal::Builder.new
105
- base_path = File.expand_path("../../../..", __FILE__)
106
- game_builder.append_paths("#{base_path}")
107
-
108
- game_builder.build_require("author_engine/opal")
109
-
110
- opal_builder_js = nil
111
- if opal_builder
112
- opal_runtime_js = opal_builder.build_str("", "(inline)").to_s
106
+ author_engine_js = nil
107
+ if author_engine_builder
108
+ author_engine_js = author_engine_builder.build_str(program, "(inline)").to_s
113
109
  end
114
110
 
115
- author_engine_js = game_builder.build_str(program, "(inline)").to_s
116
-
117
- return {opal_runtime: opal_runtime_js, author_engine_runtime: author_engine_js}
111
+ return author_engine_js
118
112
  end
119
113
 
120
114
  def template
@@ -122,6 +116,7 @@ if (
122
116
  <!doctype html5>
123
117
  <html>
124
118
  <head>
119
+ <meta content="width=device-width, initial-scale=1" name="viewport" />
125
120
  <meta charset="utf-8" />
126
121
  <title>#{project_name} | AuthorEngine</title>
127
122
  </head>
@@ -138,19 +133,30 @@ if (
138
133
  <script>
139
134
  // Add a small delay before loading application in order to finish loading page and show "Loading..."
140
135
  window.setTimeout(function() {
141
- console.log("Loading Opal runtime...");
136
+ console.log("Loading Opal...");
137
+
138
+ var opal = document.createElement('script');
139
+ opal.onload = function() {
140
+ console.log("Loading Opal Parser...");
142
141
 
143
- var opal_runtime = document.createElement('script');
144
- opal_runtime.onload = function() {
145
- console.log("Loading AuthorEngine runtime...");
142
+ var opal_parser = document.createElement('script');
143
+ opal_parser.onload = function() {
144
+ Opal.load('opal-parser');
146
145
 
147
- var author_engine_runtime = document.createElement('script');
148
- author_engine_runtime.src = "js/author_engine.js";
149
- document.head.appendChild(author_engine_runtime);
146
+ console.log("Loading AuthorEngine runtime...");
147
+
148
+ var author_engine_runtime = document.createElement('script');
149
+ author_engine_runtime.src = "js/author_engine.js";
150
+
151
+ document.head.appendChild(author_engine_runtime);
152
+ }
153
+ opal_parser.src = "js/opal-parser.min.js";
154
+
155
+ document.head.appendChild(opal_parser);
150
156
  }
151
- opal_runtime.src = "js/runtime.js";
157
+ opal.src = "js/opal.min.js";
152
158
 
153
- document.head.appendChild(opal_runtime);
159
+ document.head.appendChild(opal);
154
160
  }, 500);
155
161
  </script>
156
162
  </body>
@@ -191,20 +197,19 @@ if (
191
197
  file.write(string)
192
198
  end
193
199
 
194
- hash = game_runtime
195
- if hash[:opal_runtime]
196
- File.open("#{export_path}/js/runtime.js", "w") do |file|
197
- file.write("// #{Opal::VERSION}\n")
198
- file.write(hash[:opal_runtime])
199
- end
200
- end
200
+ local = File.expand_path("../../../../../vendor", __FILE__)
201
+ FileUtils.cp(["#{local}/opal.min.js", "#{local}/opal.min.js"], "#{export_directory}/js")
201
202
 
203
+ puts " Building game..."
202
204
  File.open("#{export_path}/game.js", "w") do |file|
203
205
  file.write(project)
204
206
  end
205
207
 
206
- File.open("#{export_path}/js/author_engine.js", "w") do |file|
207
- file.write(hash[:author_engine_runtime])
208
+ if runtime = author_engine_runtime
209
+ File.open("#{export_path}/js/author_engine.js", "w") do |file|
210
+ file.write("// #{AuthorEngine::VERSION}\n")
211
+ file.write(runtime)
212
+ end
208
213
  end
209
214
 
210
215
  fonts_path = "#{File.expand_path("../../../../../", __FILE__)}/assets/fonts"