author_engine 0.6.0 → 0.6.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile.lock +4 -4
- data/lib/author_engine/cli.rb +9 -0
- data/lib/author_engine/collision_detection/collision_detection.rb +22 -13
- data/lib/author_engine/game/game.rb +1 -4
- data/lib/author_engine/game/opal/exporter.rb +4 -2
- data/lib/author_engine/game/opal/game_runner.rb +1 -4
- data/lib/author_engine/level_picker.rb +1 -1
- data/lib/author_engine/save_file.rb +86 -8
- data/lib/author_engine/version.rb +1 -1
- metadata +3 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f4708e029c91cdcb46645b45bf91a957c24a0fa5f9526a4160da593d0a1ac109
|
4
|
+
data.tar.gz: 5270d1b8af030bf17c53a8d332e8e07dfd84b70aaf505580a52c094856bd69c3
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d2f1290dd9488db2e3fbb6c7af5ba34e1b2f2ea441f76cc8bb22b3ae6f42040d6230e68c514a7a05677b1f0336574ab4e6207f33bb4d47f49a690a7a8ff46b1d
|
7
|
+
data.tar.gz: 584f14bc9da7a63e19cbd633f65a8c6e1fc6d05e2b5aa9c152dc05d67bf7c09031c01db94cd0543848c10d828fb220452be1db583c4fa70b780aaa84d973aa62
|
data/Gemfile.lock
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
author_engine (0.6.
|
4
|
+
author_engine (0.6.1)
|
5
5
|
coderay (~> 1.1.2)
|
6
6
|
gosu (~> 0.14.4)
|
7
7
|
opal (~> 0.11.4)
|
@@ -11,9 +11,9 @@ GEM
|
|
11
11
|
specs:
|
12
12
|
ast (2.4.0)
|
13
13
|
coderay (1.1.2)
|
14
|
-
gosu (0.14.
|
14
|
+
gosu (0.14.5)
|
15
15
|
hike (1.2.3)
|
16
|
-
minitest (5.
|
16
|
+
minitest (5.13.0)
|
17
17
|
opal (0.11.4)
|
18
18
|
ast (>= 2.3.0)
|
19
19
|
hike (~> 1.2)
|
@@ -34,4 +34,4 @@ DEPENDENCIES
|
|
34
34
|
rake (~> 10.0)
|
35
35
|
|
36
36
|
BUNDLED WITH
|
37
|
-
1.17.
|
37
|
+
1.17.3
|
data/lib/author_engine/cli.rb
CHANGED
@@ -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(
|
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 = "
|
106
|
+
collision_color = "purple"
|
98
107
|
end
|
99
108
|
paint_color = color
|
100
109
|
# EDGE: TOP
|
@@ -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)
|
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
|
@@ -32,10 +32,7 @@ class AuthorEngine
|
|
32
32
|
size = 16
|
33
33
|
@levels.each {|level| level.each {|sprite| sprite.x = sprite.x * size; sprite.y = sprite.y * size}}
|
34
34
|
|
35
|
-
@collision_detection = CollisionDetection.new(@sprites, @levels)
|
36
|
-
|
37
|
-
@sprites.each {|sprite| @collision_detection.add_sprite(sprite) }
|
38
|
-
@levels.each {|level| @collision_detection.add_level(level) }
|
35
|
+
@collision_detection = CollisionDetection.new(@sprites, @levels, Window.instance.container.savefile.sprites)
|
39
36
|
end
|
40
37
|
|
41
38
|
@background_color = black
|
@@ -45,7 +45,7 @@ body {
|
|
45
45
|
// cursor: none;
|
46
46
|
}
|
47
47
|
#loading {
|
48
|
-
font-family: Connection, sans
|
48
|
+
font-family: Connection, sans-serif;
|
49
49
|
color: white;
|
50
50
|
text-align: center;
|
51
51
|
|
@@ -62,8 +62,10 @@ body {
|
|
62
62
|
end
|
63
63
|
|
64
64
|
def project
|
65
|
+
file = File.read(@project_file)
|
66
|
+
|
65
67
|
%{
|
66
|
-
var projectString = `#{
|
68
|
+
var projectString = `#{file}`;
|
67
69
|
}
|
68
70
|
end
|
69
71
|
|
@@ -36,11 +36,9 @@ class AuthorEngine
|
|
36
36
|
build_spritesheet_and_sprites_list
|
37
37
|
resize_canvas
|
38
38
|
|
39
|
-
@collision_detection = AuthorEngine::CollisionDetection.new(@sprites, @levels)
|
39
|
+
@collision_detection = AuthorEngine::CollisionDetection.new(@sprites, @levels, @save_file.sprites)
|
40
40
|
@game.collision_detection = @collision_detection
|
41
41
|
|
42
|
-
@levels.each {|level| @collision_detection.add_level(level) }
|
43
|
-
|
44
42
|
@game.init
|
45
43
|
|
46
44
|
@show_touch_controls = false
|
@@ -191,7 +189,6 @@ class AuthorEngine
|
|
191
189
|
(width/size).times do |x|
|
192
190
|
`#{temp_canvas_context}.clearRect(0,0, #{size}, #{size})`
|
193
191
|
`#{temp_canvas_context}.drawImage(#{@spritesheet}, #{x * size}, #{y * size}, #{size}, #{size}, 0, 0, #{size}, #{size})`
|
194
|
-
@collision_detection.add_sprite(`#{temp_canvas_context}.getImageData(0,0, #{size}, #{size}).data`)
|
195
192
|
|
196
193
|
`createImageBitmap(#{@spritesheet}, #{x * size}, #{y * size}, #{size}, #{size}).then(sprite => { #{@sprites.push(`sprite`)} })`
|
197
194
|
end
|
@@ -54,7 +54,7 @@ class AuthorEngine
|
|
54
54
|
|
55
55
|
@buttons << Button.new(label: ">", x: @buttons.last.x + @buttons.last.width + @offset, y: @y + @offset*2, z: 18, tooltip: "→ Next Level", color: Gosu::Color::GRAY) do
|
56
56
|
@active_level+=1
|
57
|
-
@active_level = 0
|
57
|
+
@active_level = 0 unless @active_level < LevelEditor.instance.levels.size
|
58
58
|
end
|
59
59
|
end
|
60
60
|
|
@@ -15,11 +15,12 @@ class AuthorEngine
|
|
15
15
|
end
|
16
16
|
end
|
17
17
|
|
18
|
-
attr_reader :file
|
18
|
+
attr_reader :file, :mode
|
19
19
|
attr_reader :code, :sprites, :levels
|
20
20
|
def initialize(file)
|
21
21
|
@file = file
|
22
22
|
@buffer = ""
|
23
|
+
@mode = :compact # or :inflated
|
23
24
|
|
24
25
|
@code, @sprites, @levels = nil, nil, nil
|
25
26
|
|
@@ -27,6 +28,7 @@ class AuthorEngine
|
|
27
28
|
end
|
28
29
|
|
29
30
|
def save
|
31
|
+
@buffer = "# inflated\n" if inflated?
|
30
32
|
save_code
|
31
33
|
save_spritesheet
|
32
34
|
save_levels
|
@@ -39,16 +41,58 @@ class AuthorEngine
|
|
39
41
|
puts "Saved #{file}"
|
40
42
|
end
|
41
43
|
|
42
|
-
def
|
43
|
-
|
44
|
-
@
|
44
|
+
def inflate!
|
45
|
+
load
|
46
|
+
@mode = :inflated
|
47
|
+
save_code(@code)
|
48
|
+
save_spritesheet(Gosu::Image.new(@sprites, retro: true))
|
49
|
+
|
50
|
+
file = File.read(@file)
|
51
|
+
unless file.lines.first.include?("# inflated")
|
52
|
+
File.open(@file, "w") do |f|
|
53
|
+
f.write "# inflated\n"
|
54
|
+
f.write file
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
end
|
59
|
+
|
60
|
+
def inflated?
|
61
|
+
@mode == :inflated
|
62
|
+
end
|
63
|
+
|
64
|
+
def project_name
|
65
|
+
File.basename(@file, ".authorengine")
|
66
|
+
end
|
67
|
+
|
68
|
+
def project_path
|
69
|
+
File.expand_path(@file).sub(File.basename(@file), "")
|
70
|
+
end
|
71
|
+
|
72
|
+
# code is a String
|
73
|
+
def save_code(code = CodeEditor.instance.code)
|
74
|
+
if inflated?
|
75
|
+
@buffer+= "___CODE___?#{project_path}#{project_name}.rb\n"
|
76
|
+
File.write("#{project_path}#{project_name}.rb", code)
|
77
|
+
puts "Saved code to #{project_path}#{project_name}.rb"
|
78
|
+
else
|
79
|
+
@buffer+= "___CODE___\n"
|
80
|
+
end
|
81
|
+
@buffer+= code
|
45
82
|
# @buffer+="\n" # CodeEditor always has this newline
|
46
83
|
end
|
47
84
|
|
48
|
-
|
49
|
-
|
85
|
+
# sheet is a Gosu::Image
|
86
|
+
def save_spritesheet(sheet = SpriteEditor.instance.spritesheet)
|
87
|
+
|
88
|
+
if inflated?
|
89
|
+
@buffer+= "___SPRITES___?#{project_path}#{project_name}.png\n"
|
90
|
+
sheet.save("#{project_path}#{project_name}.png")
|
91
|
+
puts "Saved spritesheet to #{project_path}#{project_name}.png"
|
92
|
+
else
|
93
|
+
@buffer+= "___SPRITES___\n"
|
94
|
+
end
|
50
95
|
|
51
|
-
@buffer+= "___SPRITES___\n"
|
52
96
|
@buffer+="#{sheet.width}x#{sheet.height}"
|
53
97
|
@buffer+="\n"
|
54
98
|
|
@@ -78,16 +122,32 @@ class AuthorEngine
|
|
78
122
|
string = data
|
79
123
|
end
|
80
124
|
|
125
|
+
identify_mode(string)
|
126
|
+
|
81
127
|
load_code(string)
|
82
128
|
load_spritesheet(string)
|
83
129
|
load_levels(string)
|
84
130
|
end
|
85
131
|
|
132
|
+
def identify_mode(string)
|
133
|
+
if RUBY_ENGINE != "opal" && string.lines.size > 0 && string.lines.first.include?("# inflated")
|
134
|
+
@mode = :inflated
|
135
|
+
else
|
136
|
+
@mode = :compact
|
137
|
+
end
|
138
|
+
end
|
139
|
+
|
86
140
|
def load_code(string)
|
87
141
|
buffer = ""
|
88
142
|
in_code= false
|
89
143
|
string.each_line do |line|
|
90
144
|
if line.start_with?("___CODE___")
|
145
|
+
if line.strip.include?("?") && inflated?
|
146
|
+
# load from file
|
147
|
+
puts "Loading code from: #{line.strip.split("?").last}"
|
148
|
+
buffer = File.read(line.strip.split("?").last)
|
149
|
+
break
|
150
|
+
end
|
91
151
|
in_code = true
|
92
152
|
next
|
93
153
|
end
|
@@ -109,6 +169,14 @@ class AuthorEngine
|
|
109
169
|
|
110
170
|
string.each_line do |line|
|
111
171
|
if line.strip.start_with?("___SPRITES___")
|
172
|
+
if line.strip.include?("?") && inflated?
|
173
|
+
# load from file
|
174
|
+
puts "Loading spritesheet from: #{line.strip.split("?").last}"
|
175
|
+
image = Gosu::Image.new(line.strip.split("?").last, retro: true)
|
176
|
+
buffer = image.to_blob
|
177
|
+
width, height = image.width, image.height
|
178
|
+
break
|
179
|
+
end
|
112
180
|
in_sprites = true
|
113
181
|
next
|
114
182
|
end
|
@@ -131,7 +199,11 @@ class AuthorEngine
|
|
131
199
|
|
132
200
|
stream = nil
|
133
201
|
if RUBY_ENGINE != "opal"
|
134
|
-
|
202
|
+
if inflated?
|
203
|
+
stream = buffer
|
204
|
+
else
|
205
|
+
stream = buffer.scan(/../).map { |x| x.hex }.pack('c*')
|
206
|
+
end
|
135
207
|
else
|
136
208
|
stream = buffer.scan(/../).map { |x| Integer(x.hex) }
|
137
209
|
end
|
@@ -145,6 +217,12 @@ class AuthorEngine
|
|
145
217
|
|
146
218
|
string.each_line do |line|
|
147
219
|
if line.start_with?("___LEVELS___")
|
220
|
+
# if line.strip.start_with?("__LEVELS___?")
|
221
|
+
# # load from file
|
222
|
+
# puts "Loading level data from: #{line.strip.split("?").last}"
|
223
|
+
|
224
|
+
# break
|
225
|
+
# end
|
148
226
|
in_level = true
|
149
227
|
next
|
150
228
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: author_engine
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.6.
|
4
|
+
version: 0.6.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Cyberarm
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2019-11-02 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: gosu
|
@@ -189,8 +189,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
189
189
|
- !ruby/object:Gem::Version
|
190
190
|
version: '0'
|
191
191
|
requirements: []
|
192
|
-
|
193
|
-
rubygems_version: 2.7.8
|
192
|
+
rubygems_version: 3.0.4
|
194
193
|
signing_key:
|
195
194
|
specification_version: 4
|
196
195
|
summary: A virtual console that you code in Ruby.
|