summaryrefslogtreecommitdiffhomepage
path: root/samples/99_genre_platformer/the_little_probe
diff options
context:
space:
mode:
authorAmir Rajan <[email protected]>2020-09-11 02:02:01 -0500
committerAmir Rajan <[email protected]>2020-09-11 02:02:57 -0500
commit33ec37b141e896b47ed642923fd33b0c658ae9fb (patch)
treea40d3e5d41beeb06508200078f6f26b0ee57d6a4 /samples/99_genre_platformer/the_little_probe
parent958cf43779d2bf528869e80511c4c4f2a433b2db (diff)
downloaddragonruby-game-toolkit-contrib-33ec37b141e896b47ed642923fd33b0c658ae9fb.tar.gz
dragonruby-game-toolkit-contrib-33ec37b141e896b47ed642923fd33b0c658ae9fb.zip
synced samples
Diffstat (limited to 'samples/99_genre_platformer/the_little_probe')
-rw-r--r--samples/99_genre_platformer/the_little_probe/app/main.rb887
-rw-r--r--samples/99_genre_platformer/the_little_probe/level.txt1481
-rw-r--r--samples/99_genre_platformer/the_little_probe/level_lava.txt235
-rw-r--r--samples/99_genre_platformer/the_little_probe/license-for-sample.txt9
-rw-r--r--samples/99_genre_platformer/the_little_probe/metadata/game_metadata.txt6
-rw-r--r--samples/99_genre_platformer/the_little_probe/sounds/0301.wavbin0 -> 387170 bytes
-rw-r--r--samples/99_genre_platformer/the_little_probe/sounds/0302.wavbin0 -> 387170 bytes
-rw-r--r--samples/99_genre_platformer/the_little_probe/sounds/0303.wavbin0 -> 387170 bytes
-rw-r--r--samples/99_genre_platformer/the_little_probe/sounds/0304.wavbin0 -> 387170 bytes
-rw-r--r--samples/99_genre_platformer/the_little_probe/sounds/0305.wavbin0 -> 518498 bytes
-rw-r--r--samples/99_genre_platformer/the_little_probe/sounds/0306.wavbin0 -> 387170 bytes
-rw-r--r--samples/99_genre_platformer/the_little_probe/sounds/0307.wavbin0 -> 387170 bytes
-rw-r--r--samples/99_genre_platformer/the_little_probe/sounds/0308.wavbin0 -> 387170 bytes
-rw-r--r--samples/99_genre_platformer/the_little_probe/sounds/0309.wavbin0 -> 387170 bytes
-rw-r--r--samples/99_genre_platformer/the_little_probe/sounds/0310.wavbin0 -> 472418 bytes
-rw-r--r--samples/99_genre_platformer/the_little_probe/sounds/0311.wavbin0 -> 341090 bytes
-rw-r--r--samples/99_genre_platformer/the_little_probe/sounds/0312.wavbin0 -> 341090 bytes
-rw-r--r--samples/99_genre_platformer/the_little_probe/sounds/0313.wavbin0 -> 341090 bytes
-rw-r--r--samples/99_genre_platformer/the_little_probe/sounds/0314.wavbin0 -> 603746 bytes
-rw-r--r--samples/99_genre_platformer/the_little_probe/sounds/0315.wavbin0 -> 472418 bytes
-rw-r--r--samples/99_genre_platformer/the_little_probe/sounds/0316.wavbin0 -> 472418 bytes
-rw-r--r--samples/99_genre_platformer/the_little_probe/sounds/0317.wavbin0 -> 472418 bytes
-rw-r--r--samples/99_genre_platformer/the_little_probe/sounds/0318.wavbin0 -> 472418 bytes
-rw-r--r--samples/99_genre_platformer/the_little_probe/sounds/0319.wavbin0 -> 472418 bytes
-rw-r--r--samples/99_genre_platformer/the_little_probe/sounds/0320.wavbin0 -> 472418 bytes
-rw-r--r--samples/99_genre_platformer/the_little_probe/sounds/0321.wavbin0 -> 472418 bytes
-rw-r--r--samples/99_genre_platformer/the_little_probe/sounds/bg.oggbin0 -> 1348295 bytes
-rw-r--r--samples/99_genre_platformer/the_little_probe/sprites/area_one.pngbin0 -> 851626 bytes
-rw-r--r--samples/99_genre_platformer/the_little_probe/sprites/circle-black.pngbin0 -> 1882 bytes
-rw-r--r--samples/99_genre_platformer/the_little_probe/sprites/circle-blue.pngbin0 -> 2901 bytes
-rw-r--r--samples/99_genre_platformer/the_little_probe/sprites/circle-gray.pngbin0 -> 3006 bytes
-rw-r--r--samples/99_genre_platformer/the_little_probe/sprites/circle-green.pngbin0 -> 2887 bytes
-rw-r--r--samples/99_genre_platformer/the_little_probe/sprites/circle-indigo.pngbin0 -> 2433 bytes
-rw-r--r--samples/99_genre_platformer/the_little_probe/sprites/circle-orange.pngbin0 -> 2670 bytes
-rw-r--r--samples/99_genre_platformer/the_little_probe/sprites/circle-red.pngbin0 -> 2233 bytes
-rw-r--r--samples/99_genre_platformer/the_little_probe/sprites/circle-violet.pngbin0 -> 2439 bytes
-rw-r--r--samples/99_genre_platformer/the_little_probe/sprites/circle-white.pngbin0 -> 1754 bytes
-rw-r--r--samples/99_genre_platformer/the_little_probe/sprites/circle-yellow.pngbin0 -> 2456 bytes
-rw-r--r--samples/99_genre_platformer/the_little_probe/sprites/jupiter.pngbin0 -> 3240358 bytes
-rw-r--r--samples/99_genre_platformer/the_little_probe/sprites/level.pngbin0 -> 14054321 bytes
-rw-r--r--samples/99_genre_platformer/the_little_probe/sprites/probe.pngbin0 -> 93401 bytes
-rw-r--r--samples/99_genre_platformer/the_little_probe/sprites/square-black.pngbin0 -> 250 bytes
-rw-r--r--samples/99_genre_platformer/the_little_probe/sprites/square-blue.pngbin0 -> 283 bytes
-rw-r--r--samples/99_genre_platformer/the_little_probe/sprites/square-gray.pngbin0 -> 251 bytes
-rw-r--r--samples/99_genre_platformer/the_little_probe/sprites/square-green.pngbin0 -> 283 bytes
-rw-r--r--samples/99_genre_platformer/the_little_probe/sprites/square-indigo.pngbin0 -> 283 bytes
-rw-r--r--samples/99_genre_platformer/the_little_probe/sprites/square-orange.pngbin0 -> 282 bytes
-rw-r--r--samples/99_genre_platformer/the_little_probe/sprites/square-red.pngbin0 -> 274 bytes
-rw-r--r--samples/99_genre_platformer/the_little_probe/sprites/square-violet.pngbin0 -> 284 bytes
-rw-r--r--samples/99_genre_platformer/the_little_probe/sprites/square-white.pngbin0 -> 279 bytes
-rw-r--r--samples/99_genre_platformer/the_little_probe/sprites/square-yellow.pngbin0 -> 286 bytes
-rw-r--r--samples/99_genre_platformer/the_little_probe/sprites/whisp.pngbin0 -> 241 bytes
52 files changed, 2618 insertions, 0 deletions
diff --git a/samples/99_genre_platformer/the_little_probe/app/main.rb b/samples/99_genre_platformer/the_little_probe/app/main.rb
new file mode 100644
index 0000000..1c90218
--- /dev/null
+++ b/samples/99_genre_platformer/the_little_probe/app/main.rb
@@ -0,0 +1,887 @@
+class FallingCircle
+ attr_gtk
+
+ def tick
+ fiddle
+ defaults
+ render
+ input
+ calc
+ end
+
+ def fiddle
+ state.gravity = -0.02
+ circle.radius = 15
+ circle.elasticity = 0.4
+ camera.follow_speed = 0.4 * 0.4
+ end
+
+ def render
+ render_stage_editor
+ render_debug
+ render_game
+ end
+
+ def defaults
+ if state.tick_count == 0
+ outputs.sounds << "sounds/bg.ogg"
+ end
+
+ state.storyline ||= [
+ { text: "<- -> to aim, hold space to charge", distance_gate: 0 },
+ { text: "the little probe - by @amirrajan, made with DragonRuby Game Toolkit", distance_gate: 0 },
+ { text: "mission control, this is sasha. landing on europa successful.", distance_gate: 0 },
+ { text: "operation \"find earth 2.0\", initiated at 8-29-2036 14:00.", distance_gate: 0 },
+ { text: "jupiter's sure is beautiful...", distance_gate: 4000 },
+ { text: "hmm, it seems there's some kind of anomoly in the sky", distance_gate: 7000 },
+ { text: "dancing lights, i'll call them whisps.", distance_gate: 8000 },
+ { text: "#todo... look i ran out of time -_-", distance_gate: 9000 },
+ { text: "there's never enough time", distance_gate: 9000 },
+ { text: "the game jam was fun though ^_^", distance_gate: 10000 },
+ ]
+
+ load_level force: args.state.tick_count == 0
+ state.line_mode ||= :terrain
+
+ state.sound_index ||= 1
+ circle.potential_lift ||= 0
+ circle.angle ||= 90
+ circle.check_point_at ||= -1000
+ circle.game_over_at ||= -1000
+ circle.x ||= -485
+ circle.y ||= 12226
+ circle.check_point_x ||= circle.x
+ circle.check_point_y ||= circle.y
+ circle.dy ||= 0
+ circle.dx ||= 0
+ circle.previous_dy ||= 0
+ circle.previous_dx ||= 0
+ circle.angle ||= 0
+ circle.after_images ||= []
+ circle.terrains_to_monitor ||= {}
+ circle.impact_history ||= []
+
+ camera.x ||= 0
+ camera.y ||= 0
+ camera.target_x ||= 0
+ camera.target_y ||= 0
+ state.snaps ||= { }
+ state.snap_number = 10
+
+ args.state.storyline_x ||= -1000
+ args.state.storyline_y ||= -1000
+ end
+
+ def render_game
+ outputs.background_color = [0, 0, 0]
+ outputs.sprites << [-circle.x + 1100,
+ -circle.y - 100,
+ 2416 * 4,
+ 3574 * 4,
+ 'sprites/jupiter.png']
+ outputs.sprites << [-circle.x,
+ -circle.y,
+ 2416 * 4,
+ 3574 * 4,
+ 'sprites/level.png']
+ outputs.sprites << state.whisp_queue
+ render_aiming_retical
+ render_circle
+ render_notification
+ end
+
+ def render_notification
+ toast_length = 500
+ if circle.game_over_at.elapsed_time < toast_length
+ label_text = "..."
+ elsif circle.check_point_at.elapsed_time > toast_length
+ args.state.current_storyline = nil
+ return
+ end
+ if circle.check_point_at &&
+ circle.check_point_at.elapsed_time == 1 &&
+ !args.state.current_storyline
+ if args.state.storyline.length > 0 && args.state.distance_traveled > args.state.storyline[0][:distance_gate]
+ args.state.current_storyline = args.state.storyline.shift[:text]
+ args.state.distance_traveled ||= 0
+ args.state.storyline_x = circle.x
+ args.state.storyline_y = circle.y
+ end
+ return unless args.state.current_storyline
+ end
+ label_text = args.state.current_storyline
+ return unless label_text
+ x = circle.x + camera.x
+ y = circle.y + camera.y - 40
+ w = 900
+ h = 30
+ outputs.primitives << [x - w.idiv(2), y - h, w, h, 255, 255, 255, 255].solid
+ outputs.primitives << [x - w.idiv(2), y - h, w, h, 0, 0, 0, 255].border
+ outputs.labels << [x, y - 4, label_text, 1, 1, 0, 0, 0, 255]
+ end
+
+ def render_aiming_retical
+ outputs.sprites << [state.camera.x + circle.x + circle.angle.vector_x(circle.potential_lift * 10) - 5,
+ state.camera.y + circle.y + circle.angle.vector_y(circle.potential_lift * 10) - 5,
+ 10, 10, 'sprites/circle-orange.png']
+ outputs.sprites << [state.camera.x + circle.x + circle.angle.vector_x(circle.radius * 3) - 5,
+ state.camera.y + circle.y + circle.angle.vector_y(circle.radius * 3) - 5,
+ 10, 10, 'sprites/circle-orange.png', 0, 128]
+ if rand > 0.9
+ outputs.sprites << [state.camera.x + circle.x + circle.angle.vector_x(circle.radius * 3) - 5,
+ state.camera.y + circle.y + circle.angle.vector_y(circle.radius * 3) - 5,
+ 10, 10, 'sprites/circle-white.png', 0, 128]
+ end
+ end
+
+ def render_circle
+ outputs.sprites << circle.after_images.map do |ai|
+ ai.merge(x: ai.x + state.camera.x - circle.radius,
+ y: ai.y + state.camera.y - circle.radius,
+ w: circle.radius * 2,
+ h: circle.radius * 2,
+ path: 'sprites/circle-white.png')
+ end
+
+ outputs.sprites << [(circle.x - circle.radius) + state.camera.x,
+ (circle.y - circle.radius) + state.camera.y,
+ circle.radius * 2,
+ circle.radius * 2,
+ 'sprites/probe.png']
+ end
+
+ def render_debug
+ return unless state.debug_mode
+
+ outputs.labels << [10, 30, state.line_mode, 0, 0, 0, 0, 0]
+ outputs.labels << [12, 32, state.line_mode, 0, 0, 255, 255, 255]
+
+ args.outputs.lines << trajectory(circle).line.to_hash.tap do |h|
+ h[:x] += state.camera.x
+ h[:y] += state.camera.y
+ h[:x2] += state.camera.x
+ h[:y2] += state.camera.y
+ end
+
+ outputs.primitives << state.terrain.find_all do |t|
+ circle.x.between?(t.x - 640, t.x2 + 640) || circle.y.between?(t.y - 360, t.y2 + 360)
+ end.map do |t|
+ [
+ t.line.associate(r: 0, g: 255, b: 0) do |h|
+ h.x += state.camera.x
+ h.y += state.camera.y
+ h.x2 += state.camera.x
+ h.y2 += state.camera.y
+ if circle.rect.intersect_rect? t[:rect]
+ h[:r] = 255
+ h[:g] = 0
+ end
+ h
+ end,
+ t[:rect].border.associate(r: 255, g: 0, b: 0) do |h|
+ h.x += state.camera.x
+ h.y += state.camera.y
+ h.b = 255 if line_near_rect? circle.rect, t
+ h
+ end
+ ]
+ end
+
+ outputs.primitives << state.lava.find_all do |t|
+ circle.x.between?(t.x - 640, t.x2 + 640) || circle.y.between?(t.y - 360, t.y2 + 360)
+ end.map do |t|
+ [
+ t.line.associate(r: 0, g: 0, b: 255) do |h|
+ h.x += state.camera.x
+ h.y += state.camera.y
+ h.x2 += state.camera.x
+ h.y2 += state.camera.y
+ if circle.rect.intersect_rect? t[:rect]
+ h[:r] = 255
+ h[:b] = 0
+ end
+ h
+ end,
+ t[:rect].border.associate(r: 255, g: 0, b: 0) do |h|
+ h.x += state.camera.x
+ h.y += state.camera.y
+ h.b = 255 if line_near_rect? circle.rect, t
+ h
+ end
+ ]
+ end
+
+ if state.god_mode
+ border = circle.rect.merge(x: circle.rect.x + state.camera.x,
+ y: circle.rect.y + state.camera.y,
+ g: 255)
+ else
+ border = circle.rect.merge(x: circle.rect.x + state.camera.x,
+ y: circle.rect.y + state.camera.y,
+ b: 255)
+ end
+
+ outputs.borders << border
+
+ overlapping ||= {}
+
+ circle.impact_history.each do |h|
+ label_mod = 300
+ x = (h[:body][:x].-(150).idiv(label_mod)) * label_mod + camera.x
+ y = (h[:body][:y].+(150).idiv(label_mod)) * label_mod + camera.y
+ 10.times do
+ if overlapping[x] && overlapping[x][y]
+ y -= 52
+ else
+ break
+ end
+ end
+
+ overlapping[x] ||= {}
+ overlapping[x][y] ||= true
+ outputs.primitives << [x, y - 25, 300, 50, 0, 0, 0, 128].solid
+ outputs.labels << [x + 10, y + 24, "dy: %.2f" % h[:body][:new_dy], -2, 0, 255, 255, 255]
+ outputs.labels << [x + 10, y + 9, "dx: %.2f" % h[:body][:new_dx], -2, 0, 255, 255, 255]
+ outputs.labels << [x + 10, y - 5, " ?: #{h[:body][:new_reason]}", -2, 0, 255, 255, 255]
+
+ outputs.labels << [x + 100, y + 24, "angle: %.2f" % h[:impact][:angle], -2, 0, 255, 255, 255]
+ outputs.labels << [x + 100, y + 9, "m(l): %.2f" % h[:terrain][:slope], -2, 0, 255, 255, 255]
+ outputs.labels << [x + 100, y - 5, "m(c): %.2f" % h[:body][:slope], -2, 0, 255, 255, 255]
+
+ outputs.labels << [x + 200, y + 24, "ray: #{h[:impact][:ray]}", -2, 0, 255, 255, 255]
+ outputs.labels << [x + 200, y + 9, "nxt: #{h[:impact][:ray_next]}", -2, 0, 255, 255, 255]
+ outputs.labels << [x + 200, y - 5, "typ: #{h[:impact][:type]}", -2, 0, 255, 255, 255]
+ end
+
+ if circle.floor
+ outputs.labels << [circle.x + camera.x + 30, circle.y + camera.y + 100, "point: #{circle.floor_point.slice(:x, :y).values}", -2, 0]
+ outputs.labels << [circle.x + camera.x + 31, circle.y + camera.y + 101, "point: #{circle.floor_point.slice(:x, :y).values}", -2, 0, 255, 255, 255]
+ outputs.labels << [circle.x + camera.x + 30, circle.y + camera.y + 85, "circle: #{circle.hash.slice(:x, :y).values}", -2, 0]
+ outputs.labels << [circle.x + camera.x + 31, circle.y + camera.y + 86, "circle: #{circle.hash.slice(:x, :y).values}", -2, 0, 255, 255, 255]
+ outputs.labels << [circle.x + camera.x + 30, circle.y + camera.y + 70, "rel: #{circle.floor_relative_x} #{circle.floor_relative_y}", -2, 0]
+ outputs.labels << [circle.x + camera.x + 31, circle.y + camera.y + 71, "rel: #{circle.floor_relative_x} #{circle.floor_relative_y}", -2, 0, 255, 255, 255]
+ end
+ end
+
+ def render_stage_editor
+ return unless state.god_mode
+ return unless state.point_one
+ args.lines << [state.point_one, inputs.mouse.point, 0, 255, 255]
+ end
+
+ def trajectory body
+ [body.x + body.dx,
+ body.y + body.dy,
+ body.x + body.dx * 1000,
+ body.y + body.dy * 1000,
+ 0, 255, 255]
+ end
+
+ def lengthen_line line, num
+ line = normalize_line(line)
+ slope = geometry.line_slope(line, replace_infinity: 10).abs
+ if slope < 2
+ [line.x - num, line.y, line.x2 + num, line.y2].line.to_hash
+ else
+ [line.x, line.y, line.x2, line.y2].line.to_hash
+ end
+ end
+
+ def normalize_line line
+ if line.x > line.x2
+ x = line.x2
+ y = line.y2
+ x2 = line.x
+ y2 = line.y
+ else
+ x = line.x
+ y = line.y
+ x2 = line.x2
+ y2 = line.y2
+ end
+ [x, y, x2, y2]
+ end
+
+ def rect_for_line line
+ if line.x > line.x2
+ x = line.x2
+ y = line.y2
+ x2 = line.x
+ y2 = line.y
+ else
+ x = line.x
+ y = line.y
+ x2 = line.x2
+ y2 = line.y2
+ end
+
+ w = x2 - x
+ h = y2 - y
+
+ if h < 0
+ y += h
+ h = h.abs
+ end
+
+ if w < circle.radius
+ x -= circle.radius
+ w = circle.radius * 2
+ end
+
+ if h < circle.radius
+ y -= circle.radius
+ h = circle.radius * 2
+ end
+
+ { x: x, y: y, w: w, h: h }
+ end
+
+ def snap_to_grid x, y, snaps
+ snap_number = 10
+ x = x.to_i
+ y = y.to_i
+
+ x_floor = x.idiv(snap_number) * snap_number
+ x_mod = x % snap_number
+ x_ceil = (x.idiv(snap_number) + 1) * snap_number
+
+ y_floor = y.idiv(snap_number) * snap_number
+ y_mod = y % snap_number
+ y_ceil = (y.idiv(snap_number) + 1) * snap_number
+
+ if snaps[x_floor]
+ x_result = x_floor
+ elsif snaps[x_ceil]
+ x_result = x_ceil
+ elsif x_mod < snap_number.idiv(2)
+ x_result = x_floor
+ else
+ x_result = x_ceil
+ end
+
+ snaps[x_result] ||= {}
+
+ if snaps[x_result][y_floor]
+ y_result = y_floor
+ elsif snaps[x_result][y_ceil]
+ y_result = y_ceil
+ elsif y_mod < snap_number.idiv(2)
+ y_result = y_floor
+ else
+ y_result = y_ceil
+ end
+
+ snaps[x_result][y_result] = true
+ return [x_result, y_result]
+
+ end
+
+ def snap_line line
+ x, y, x2, y2 = line
+ end
+
+ def string_to_line s
+ x, y, x2, y2 = s.split(',').map(&:to_f)
+
+ if x > x2
+ x2, x = x, x2
+ y2, y = y, y2
+ end
+
+ x, y = snap_to_grid x, y, state.snaps
+ x2, y2 = snap_to_grid x2, y2, state.snaps
+ [x, y, x2, y2].line.to_hash
+ end
+
+ def load_lines file
+ data = gtk.read_file(file) || ""
+ data.each_line
+ .reject { |l| l.strip.length == 0 }
+ .map { |l| string_to_line l }
+ .map { |h| h.merge(rect: rect_for_line(h)) }
+ end
+
+ def load_terrain
+ load_lines 'level.txt'
+ end
+
+ def load_lava
+ load_lines 'level_lava.txt'
+ end
+
+ def load_level force: false
+ if force
+ state.snaps = {}
+ state.terrain = load_terrain
+ state.lava = load_lava
+ else
+ state.terrain ||= load_terrain
+ state.lava ||= load_lava
+ end
+ end
+
+ def save_lines lines, file
+ s = lines.map do |l|
+ "#{l.x1},#{l.y1},#{l.x2},#{l.y2}"
+ end.join("\n")
+ gtk.write_file(file, s)
+ end
+
+ def save_level
+ save_lines(state.terrain, 'level.txt')
+ save_lines(state.lava, 'level_lava.txt')
+ load_level force: true
+ end
+
+ def line_near_rect? rect, terrain
+ geometry.intersect_rect?(rect, terrain[:rect])
+ end
+
+ def point_within_line? point, line
+ return false if !point
+ return false if !line
+ return true
+ end
+
+ def calc_impacts x, dx, y, dy, radius
+ results = { }
+ results[:x] = x
+ results[:y] = y
+ results[:dx] = x
+ results[:dy] = y
+ results[:point] = { x: x, y: y }
+ results[:rect] = { x: x - radius, y: y - radius, w: radius * 2, h: radius * 2 }
+ results[:trajectory] = trajectory(results)
+ results[:impacts] = terrain.find_all { |t| line_near_rect? results[:rect], t }.map do |t|
+ {
+ terrain: t,
+ point: geometry.line_intersect(results[:trajectory], t),
+ type: :terrain
+ }
+ end.reject { |t| !point_within_line? t[:point], t[:terrain] }
+
+ results[:impacts] += lava.find_all { |t| line_near_rect? results[:rect], t }.map do |t|
+ {
+ terrain: t,
+ point: geometry.line_intersect(results[:trajectory], t),
+ type: :lava
+ }
+ end.reject { |t| !point_within_line? t[:point], t[:terrain] }
+
+ results
+ end
+
+ def calc_potential_impacts
+ impact_results = calc_impacts circle.x, circle.dx, circle.y, circle.dy, circle.radius
+ circle.rect = impact_results[:rect]
+ circle.trajectory = impact_results[:trajectory]
+ circle.impacts = impact_results[:impacts]
+ end
+
+ def calc_terrains_to_monitor
+ circle.impact = nil
+ circle.impacts.each do |i|
+ circle.terrains_to_monitor[i[:terrain]] ||= {
+ ray_start: geometry.ray_test(circle, i[:terrain]),
+ }
+
+ circle.terrains_to_monitor[i[:terrain]][:ray_current] = geometry.ray_test(circle, i[:terrain])
+ if circle.terrains_to_monitor[i[:terrain]][:ray_start] != circle.terrains_to_monitor[i[:terrain]][:ray_current]
+ if circle.x.between?(i[:terrain].x, i[:terrain].x2) || circle.y.between?(i[:terrain].y, i[:terrain].y2)
+ circle.impact = i
+ circle.ray_current = circle.terrains_to_monitor[i[:terrain]][:ray_current]
+ end
+ end
+ end
+ end
+
+ def impact_result body, impact
+ infinity_alias = 1000
+ r = {
+ body: {},
+ terrain: {},
+ impact: {}
+ }
+
+ r[:body][:line] = body.trajectory.dup
+ r[:body][:slope] = geometry.line_slope(body.trajectory, replace_infinity: infinity_alias)
+ r[:body][:slope_sign] = r[:body][:slope].sign
+ r[:body][:x] = body.x
+ r[:body][:y] = body.y
+ r[:body][:dy] = body.dy
+ r[:body][:dx] = body.dx
+
+ r[:terrain][:line] = impact[:terrain].dup
+ r[:terrain][:slope] = geometry.line_slope(impact[:terrain], replace_infinity: infinity_alias)
+ r[:terrain][:slope_sign] = r[:terrain][:slope].sign
+
+ r[:impact][:angle] = geometry.angle_between_lines(body.trajectory, impact[:terrain], replace_infinity: infinity_alias)
+ r[:impact][:point] = { x: impact[:point].x, y: impact[:point].y }
+ r[:impact][:same_slope_sign] = r[:body][:slope_sign] == r[:terrain][:slope_sign]
+ r[:impact][:ray] = body.ray_current
+ r[:body][:new_on_floor] = body.on_floor
+ r[:body][:new_floor] = r[:terrain][:line]
+
+ if r[:impact][:angle].abs < 90 && r[:terrain][:slope].abs < 3
+ play_sound
+ r[:body][:new_dy] = r[:body][:dy] * circle.elasticity * -1
+ r[:body][:new_dx] = r[:body][:dx] * circle.elasticity
+ r[:impact][:type] = :horizontal
+ r[:body][:new_reason] = "-"
+ elsif r[:impact][:angle].abs < 90 && r[:terrain][:slope].abs > 3
+ play_sound
+ r[:body][:new_dy] = r[:body][:dy] * 1.1
+ r[:body][:new_dx] = r[:body][:dx] * -circle.elasticity
+ r[:impact][:type] = :vertical
+ r[:body][:new_reason] = "|"
+ else
+ play_sound
+ r[:body][:new_dx] = r[:body][:dx] * -circle.elasticity
+ r[:body][:new_dy] = r[:body][:dy] * -circle.elasticity
+ r[:impact][:type] = :slanted
+ r[:body][:new_reason] = "/"
+ end
+
+ r[:impact][:energy] = r[:body][:new_dx].abs + r[:body][:new_dy].abs
+
+ if r[:impact][:energy] <= 0.3 && r[:terrain][:slope].abs < 4
+ r[:body][:new_dx] = 0
+ r[:body][:new_dy] = 0
+ r[:impact][:energy] = 0
+ r[:body][:new_on_floor] = true
+ r[:body][:new_floor] = r[:terrain][:line]
+ r[:body][:new_reason] = "0"
+ end
+
+ r[:impact][:ray_next] = geometry.ray_test({ x: r[:body][:x] - (r[:body][:dx] * 1.1) + r[:body][:new_dx],
+ y: r[:body][:y] - (r[:body][:dy] * 1.1) + r[:body][:new_dy] + state.gravity },
+ r[:terrain][:line])
+
+ if r[:impact][:ray_next] == r[:impact][:ray]
+ r[:body][:new_dx] *= -1
+ r[:body][:new_dy] *= -1
+ r[:body][:new_reason] = "clip"
+ end
+
+ r
+ end
+
+ def game_over!
+ circle.x = circle.check_point_x
+ circle.y = circle.check_point_y
+ circle.dx = 0
+ circle.dy = 0
+ circle.game_over_at = state.tick_count
+ end
+
+ def not_game_over!
+ impact_history_entry = impact_result circle, circle.impact
+ circle.impact_history << impact_history_entry
+ circle.x -= circle.dx * 1.1
+ circle.y -= circle.dy * 1.1
+ circle.dx = impact_history_entry[:body][:new_dx]
+ circle.dy = impact_history_entry[:body][:new_dy]
+ circle.on_floor = impact_history_entry[:body][:new_on_floor]
+
+ if circle.on_floor
+ circle.check_point_at = state.tick_count
+ circle.check_point_x = circle.x
+ circle.check_point_y = circle.y
+ end
+
+ circle.previous_floor = circle.floor || {}
+ circle.floor = impact_history_entry[:body][:new_floor] || {}
+ circle.floor_point = impact_history_entry[:impact][:point]
+ if circle.floor.slice(:x, :y, :x2, :y2) != circle.previous_floor.slice(:x, :y, :x2, :y2)
+ new_relative_x = if circle.dx > 0
+ :right
+ elsif circle.dx < 0
+ :left
+ else
+ nil
+ end
+
+ new_relative_y = if circle.dy > 0
+ :above
+ elsif circle.dy < 0
+ :below
+ else
+ nil
+ end
+
+ circle.floor_relative_x = new_relative_x
+ circle.floor_relative_y = new_relative_y
+ end
+
+ circle.impact = nil
+ circle.terrains_to_monitor.clear
+ end
+
+ def calc_physics
+ if args.state.god_mode
+ calc_potential_impacts
+ calc_terrains_to_monitor
+ return
+ end
+
+ if circle.y < -700
+ game_over
+ return
+ end
+
+ return if state.game_over
+ return if circle.on_floor
+ circle.previous_dy = circle.dy
+ circle.previous_dx = circle.dx
+ circle.x += circle.dx
+ circle.y += circle.dy
+ args.state.distance_traveled ||= 0
+ args.state.distance_traveled += circle.dx.abs + circle.dy.abs
+ circle.dy += state.gravity
+ calc_potential_impacts
+ calc_terrains_to_monitor
+ return unless circle.impact
+ if circle.impact && circle.impact[:type] == :lava
+ game_over!
+ else
+ not_game_over!
+ end
+ end
+
+ def input_god_mode
+ state.debug_mode = !state.debug_mode if inputs.keyboard.key_down.forward_slash
+
+ # toggle god mode
+ if inputs.keyboard.key_down.g
+ state.god_mode = !state.god_mode
+ state.potential_lift = 0
+ circle.floor = nil
+ circle.floor_point = nil
+ circle.floor_relative_x = nil
+ circle.floor_relative_y = nil
+ circle.impact = nil
+ circle.terrains_to_monitor.clear
+ return
+ end
+
+ return unless state.god_mode
+
+ circle.x = circle.x.to_i
+ circle.y = circle.y.to_i
+
+ # move god circle
+ if inputs.keyboard.left || inputs.keyboard.a
+ circle.x -= 20
+ elsif inputs.keyboard.right || inputs.keyboard.d || inputs.keyboard.f
+ circle.x += 20
+ end
+
+ if inputs.keyboard.up || inputs.keyboard.w
+ circle.y += 20
+ elsif inputs.keyboard.down || inputs.keyboard.s
+ circle.y -= 20
+ end
+
+ # delete terrain
+ if inputs.keyboard.key_down.x
+ calc_terrains_to_monitor
+ state.terrain = state.terrain.reject do |t|
+ t[:rect].intersect_rect? circle.rect
+ end
+
+ state.lava = state.lava.reject do |t|
+ t[:rect].intersect_rect? circle.rect
+ end
+
+ calc_potential_impacts
+ save_level
+ end
+
+ # change terrain type
+ if inputs.keyboard.key_down.l
+ if state.line_mode == :terrain
+ state.line_mode = :lava
+ else
+ state.line_mode = :terrain
+ end
+ end
+
+ if inputs.mouse.click && !state.point_one
+ state.point_one = inputs.mouse.click.point
+ elsif inputs.mouse.click && state.point_one
+ l = [*state.point_one, *inputs.mouse.click.point]
+ l = [l.x - state.camera.x,
+ l.y - state.camera.y,
+ l.x2 - state.camera.x,
+ l.y2 - state.camera.y].line.to_hash
+ l[:rect] = rect_for_line l
+ if state.line_mode == :terrain
+ state.terrain << l
+ else
+ state.lava << l
+ end
+ save_level
+ next_x = inputs.mouse.click.point.x - 640
+ next_y = inputs.mouse.click.point.y - 360
+ circle.x += next_x
+ circle.y += next_y
+ state.point_one = nil
+ elsif inputs.keyboard.one
+ state.point_one = [circle.x + camera.x, circle.y+ camera.y]
+ end
+
+ # cancel chain lines
+ if inputs.keyboard.key_down.nine || inputs.keyboard.key_down.escape || inputs.keyboard.key_up.six || inputs.keyboard.key_up.one
+ state.point_one = nil
+ end
+ end
+
+ def play_sound
+ return if state.sound_debounce > 0
+ state.sound_debounce = 5
+ outputs.sounds << "sounds/03#{"%02d" % state.sound_index}.wav"
+ state.sound_index += 1
+ if state.sound_index > 21
+ state.sound_index = 1
+ end
+ end
+
+ def input_game
+ if inputs.keyboard.down || inputs.keyboard.space
+ circle.potential_lift += 0.03
+ circle.potential_lift = circle.potential_lift.lesser(10)
+ elsif inputs.keyboard.key_up.down || inputs.keyboard.key_up.space
+ play_sound
+ circle.dy += circle.angle.vector_y circle.potential_lift
+ circle.dx += circle.angle.vector_x circle.potential_lift
+
+ if circle.on_floor
+ if circle.floor_relative_y == :above
+ circle.y += circle.potential_lift.abs * 2
+ elsif circle.floor_relative_y == :below
+ circle.y -= circle.potential_lift.abs * 2
+ end
+ end
+
+ circle.on_floor = false
+ circle.potential_lift = 0
+ circle.terrains_to_monitor.clear
+ circle.impact_history.clear
+ circle.impact = nil
+ calc_physics
+ end
+
+ # aim probe
+ if inputs.keyboard.right || inputs.keyboard.a
+ circle.angle -= 2
+ elsif inputs.keyboard.left || inputs.keyboard.d
+ circle.angle += 2
+ end
+ end
+
+ def input
+ input_god_mode
+ input_game
+ end
+
+ def calc_camera
+ state.camera.target_x = 640 - circle.x
+ state.camera.target_y = 360 - circle.y
+ xdiff = state.camera.target_x - state.camera.x
+ ydiff = state.camera.target_y - state.camera.y
+ state.camera.x += xdiff * camera.follow_speed
+ state.camera.y += ydiff * camera.follow_speed
+ end
+
+ def calc
+ state.sound_debounce ||= 0
+ state.sound_debounce -= 1
+ state.sound_debounce = 0 if state.sound_debounce < 0
+ if state.god_mode
+ circle.dy *= 0.1
+ circle.dx *= 0.1
+ end
+ calc_camera
+ state.whisp_queue ||= []
+ if state.tick_count.mod_zero?(4)
+ state.whisp_queue << {
+ x: -300,
+ y: 1400 * rand,
+ speed: 2.randomize(:ratio) + 3,
+ w: 20,
+ h: 20, path: 'sprites/whisp.png',
+ a: 0,
+ created_at: state.tick_count,
+ angle: 0,
+ r: 100,
+ g: 128 + 128 * rand,
+ b: 128 + 128 * rand
+ }
+ end
+
+ state.whisp_queue.each do |w|
+ w.x += w[:speed] * 2
+ w.x -= circle.dx * 0.3
+ w.y -= w[:speed]
+ w.y -= circle.dy * 0.3
+ w.angle += w[:speed]
+ w.a = w[:created_at].ease(30) * 255
+ end
+
+ state.whisp_queue = state.whisp_queue.reject { |w| w[:x] > 1280 }
+
+ if state.tick_count.mod_zero?(2) && (circle.dx != 0 || circle.dy != 0)
+ circle.after_images << {
+ x: circle.x,
+ y: circle.y,
+ w: circle.radius,
+ h: circle.radius,
+ a: 255,
+ created_at: state.tick_count
+ }
+ end
+
+ circle.after_images.each do |ai|
+ ai.a = ai[:created_at].ease(10, :flip) * 255
+ end
+
+ circle.after_images = circle.after_images.reject { |ai| ai[:created_at].elapsed_time > 10 }
+ calc_physics
+ end
+
+ def circle
+ state.circle
+ end
+
+ def camera
+ state.camera
+ end
+
+ def terrain
+ state.terrain
+ end
+
+ def lava
+ state.lava
+ end
+end
+
+# $gtk.reset
+
+def tick args
+ args.outputs.background_color = [0, 0, 0]
+ if args.inputs.keyboard.r
+ args.gtk.reset
+ return
+ end
+ # uncomment the line below to slow down the game so you
+ # can see each tick as it passes
+ # args.gtk.slowmo! 30
+ $game ||= FallingCircle.new
+ $game.args = args
+ $game.tick
+end
+
+def reset
+ $game = nil
+end
diff --git a/samples/99_genre_platformer/the_little_probe/level.txt b/samples/99_genre_platformer/the_little_probe/level.txt
new file mode 100644
index 0000000..62caf2d
--- /dev/null
+++ b/samples/99_genre_platformer/the_little_probe/level.txt
@@ -0,0 +1,1481 @@
+640,8840,1180,8840
+-60,10220,0,9960
+-60,10220,0,10500
+0,10500,0,10780
+0,10780,40,10900
+500,10920,760,10960
+300,10560,820,10600
+420,10320,700,10300
+820,10600,1500,10600
+1500,10600,1940,10600
+1940,10600,2380,10580
+2380,10580,2800,10620
+2240,11080,2480,11020
+2000,11120,2240,11080
+1760,11180,2000,11120
+1620,11180,1760,11180
+1500,11220,1620,11180
+1180,11280,1340,11220
+1040,11240,1180,11280
+840,11280,1040,11240
+640,11280,840,11280
+500,11220,640,11280
+420,11140,500,11220
+240,11100,420,11140
+100,11120,240,11100
+0,11180,100,11120
+-160,11220,0,11180
+-260,11240,-160,11220
+1340,11220,1500,11220
+960,13300,1280,13060
+1280,13060,1540,12860
+1540,12860,1820,12700
+1820,12700,2080,12520
+2080,12520,2240,12400
+2240,12400,2240,12240
+2240,12240,2400,12080
+2400,12080,2560,11920
+2560,11920,2640,11740
+2640,11740,2740,11580
+2740,11580,2800,11400
+2800,11400,2800,11240
+2740,11140,2800,11240
+2700,11040,2740,11140
+2700,11040,2740,10960
+2740,10960,2740,10920
+2700,10900,2740,10920
+2380,10900,2700,10900
+2040,10920,2380,10900
+1720,10940,2040,10920
+1380,11000,1720,10940
+1180,10980,1380,11000
+900,10980,1180,10980
+760,10960,900,10980
+240,10960,500,10920
+40,10900,240,10960
+0,9700,0,9960
+-60,9500,0,9700
+-60,9420,-60,9500
+-60,9420,-60,9340
+-60,9340,-60,9280
+-60,9120,-60,9280
+-60,8940,-60,9120
+-60,8940,-60,8780
+-60,8780,0,8700
+0,8700,40,8680
+40,8680,240,8700
+240,8700,360,8780
+360,8780,640,8840
+1420,8400,1540,8480
+1540,8480,1680,8500
+1680,8500,1940,8460
+1180,8840,1280,8880
+1280,8880,1340,8860
+1340,8860,1720,8860
+1720,8860,1820,8920
+1820,8920,1820,9140
+1820,9140,1820,9280
+1820,9460,1820,9280
+1760,9480,1820,9460
+1640,9480,1760,9480
+1540,9500,1640,9480
+1340,9500,1540,9500
+1100,9500,1340,9500
+1040,9540,1100,9500
+960,9540,1040,9540
+300,9420,360,9460
+240,9440,300,9420
+180,9600,240,9440
+120,9660,180,9600
+100,9820,120,9660
+100,9820,120,9860
+120,9860,140,9900
+140,9900,140,10000
+140,10440,180,10540
+100,10080,140,10000
+100,10080,140,10100
+140,10100,140,10440
+180,10540,300,10560
+2140,9560,2140,9640
+2140,9720,2140,9640
+1880,9780,2140,9720
+1720,9780,1880,9780
+1620,9740,1720,9780
+1500,9780,1620,9740
+1380,9780,1500,9780
+1340,9820,1380,9780
+1200,9820,1340,9820
+1100,9780,1200,9820
+900,9780,1100,9780
+820,9720,900,9780
+540,9720,820,9720
+360,9840,540,9720
+360,9840,360,9960
+360,9960,360,10080
+360,10140,360,10080
+360,10140,360,10240
+360,10240,420,10320
+700,10300,820,10280
+820,10280,820,10280
+820,10280,900,10320
+900,10320,1040,10300
+1040,10300,1200,10320
+1200,10320,1380,10280
+1380,10280,1500,10300
+1500,10300,1760,10300
+2800,10620,2840,10600
+2840,10600,2900,10600
+2900,10600,3000,10620
+3000,10620,3080,10620
+3080,10620,3140,10600
+3140,10540,3140,10600
+3140,10540,3140,10460
+3140,10460,3140,10360
+3140,10360,3140,10260
+3140,10260,3140,10140
+3140,10140,3140,10000
+3140,10000,3140,9860
+3140,9860,3160,9720
+3160,9720,3160,9580
+3160,9580,3160,9440
+3160,9300,3160,9440
+3160,9300,3160,9140
+3160,9140,3160,8980
+3160,8980,3160,8820
+3160,8820,3160,8680
+3160,8680,3160,8520
+1760,10300,1880,10300
+660,9500,960,9540
+640,9460,660,9500
+360,9460,640,9460
+-480,10760,-440,10880
+-480,11020,-440,10880
+-480,11160,-260,11240
+-480,11020,-480,11160
+-600,11420,-380,11320
+-380,11320,-200,11340
+-200,11340,0,11340
+0,11340,180,11340
+960,13420,960,13300
+960,13420,960,13520
+960,13520,1000,13560
+1000,13560,1040,13540
+1040,13540,1200,13440
+1200,13440,1380,13380
+1380,13380,1620,13300
+1620,13300,1820,13220
+1820,13220,2000,13200
+2000,13200,2240,13200
+2240,13200,2440,13160
+2440,13160,2640,13040
+-480,10760,-440,10620
+-440,10620,-360,10560
+-380,10460,-360,10560
+-380,10460,-360,10300
+-380,10140,-360,10300
+-380,10140,-380,10040
+-380,9880,-380,10040
+-380,9720,-380,9880
+-380,9720,-380,9540
+-380,9360,-380,9540
+-380,9180,-380,9360
+-380,9180,-380,9000
+-380,8840,-380,9000
+-380,8840,-380,8760
+-380,8760,-380,8620
+-380,8620,-380,8520
+-380,8520,-360,8400
+-360,8400,-100,8400
+-100,8400,-60,8420
+-60,8420,240,8440
+240,8440,240,8380
+240,8380,500,8440
+500,8440,760,8460
+760,8460,1000,8400
+1000,8400,1180,8420
+1180,8420,1420,8400
+1940,8460,2140,8420
+2140,8420,2200,8520
+2200,8680,2200,8520
+2140,8840,2200,8680
+2140,8840,2140,9020
+2140,9100,2140,9020
+2140,9200,2140,9100
+2140,9200,2200,9320
+2200,9320,2200,9440
+2140,9560,2200,9440
+1880,10300,2200,10280
+2200,10280,2480,10260
+2480,10260,2700,10240
+2700,10240,2840,10180
+2840,10180,2900,10060
+2900,9860,2900,10060
+2900,9640,2900,9860
+2900,9640,2900,9500
+2900,9460,2900,9500
+2740,9460,2900,9460
+2700,9460,2740,9460
+2700,9360,2700,9460
+2700,9320,2700,9360
+2600,9320,2700,9320
+2600,9260,2600,9320
+2600,9200,2600,9260
+2480,9120,2600,9200
+2440,9080,2480,9120
+2380,9080,2440,9080
+2320,9060,2380,9080
+2320,8860,2320,9060
+2320,8860,2380,8840
+2380,8840,2480,8860
+2480,8860,2600,8840
+2600,8840,2740,8840
+2740,8840,2840,8800
+2840,8800,2900,8700
+2900,8600,2900,8700
+2900,8480,2900,8600
+2900,8380,2900,8480
+2900,8380,2900,8260
+2900,8260,2900,8140
+2900,8140,2900,8020
+2900,8020,2900,7900
+2900,7820,2900,7900
+2900,7820,2900,7740
+2900,7660,2900,7740
+2900,7560,2900,7660
+2900,7460,2900,7560
+2900,7460,2900,7360
+2900,7260,2900,7360
+2840,7160,2900,7260
+2800,7080,2840,7160
+2700,7100,2800,7080
+2560,7120,2700,7100
+2400,7100,2560,7120
+2320,7100,2400,7100
+2140,7100,2320,7100
+2040,7080,2140,7100
+1940,7080,2040,7080
+1820,7140,1940,7080
+1680,7140,1820,7140
+1540,7140,1680,7140
+1420,7220,1540,7140
+1280,7220,1380,7220
+1140,7200,1280,7220
+1000,7220,1140,7200
+760,7280,900,7320
+540,7220,760,7280
+300,7180,540,7220
+180,7120,180,7160
+40,7140,180,7120
+-60,7160,40,7140
+-200,7120,-60,7160
+180,7160,300,7180
+-260,7060,-200,7120
+-260,6980,-260,7060
+-260,6880,-260,6980
+-260,6880,-260,6820
+-260,6820,-200,6760
+-200,6760,-100,6740
+-100,6740,-60,6740
+-60,6740,40,6740
+40,6740,300,6800
+300,6800,420,6760
+420,6760,500,6740
+500,6740,540,6760
+540,6760,540,6760
+540,6760,640,6780
+640,6660,640,6780
+580,6580,640,6660
+580,6440,580,6580
+580,6440,640,6320
+640,6320,640,6180
+580,6080,640,6180
+580,6080,640,5960
+640,5960,640,5840
+640,5840,640,5700
+640,5700,660,5560
+660,5560,660,5440
+660,5440,660,5300
+660,5140,660,5300
+660,5140,660,5000
+660,5000,660,4880
+660,4880,820,4860
+820,4860,1000,4840
+1000,4840,1100,4860
+1100,4860,1280,4860
+1280,4860,1420,4840
+1420,4840,1580,4860
+1580,4860,1720,4820
+1720,4820,1880,4860
+1880,4860,2000,4840
+2000,4840,2140,4840
+2140,4840,2320,4860
+2320,4860,2440,4880
+2440,4880,2600,4880
+2600,4880,2800,4880
+2800,4880,2900,4880
+2900,4880,2900,4820
+2900,4740,2900,4820
+2800,4700,2900,4740
+2520,4680,2800,4700
+2240,4660,2520,4680
+1940,4620,2240,4660
+1820,4580,1940,4620
+1820,4500,1820,4580
+1820,4500,1880,4420
+1880,4420,2000,4420
+2000,4420,2200,4420
+2200,4420,2400,4440
+2400,4440,2600,4440
+2600,4440,2840,4440
+2840,4440,2900,4400
+2740,4260,2900,4280
+2600,4240,2740,4260
+2480,4280,2600,4240
+2320,4240,2480,4280
+2140,4220,2320,4240
+1940,4220,2140,4220
+1880,4160,1940,4220
+1880,4160,1880,4080
+1880,4080,2040,4040
+2040,4040,2240,4060
+2240,4060,2400,4040
+2400,4040,2600,4060
+2600,4060,2740,4020
+2740,4020,2840,3940
+2840,3780,2840,3940
+2740,3660,2840,3780
+2700,3680,2740,3660
+2520,3700,2700,3680
+2380,3700,2520,3700
+2200,3720,2380,3700
+2040,3720,2200,3720
+1880,3700,2040,3720
+1820,3680,1880,3700
+1760,3600,1820,3680
+1760,3600,1820,3480
+1820,3480,1880,3440
+1880,3440,1960,3460
+1960,3460,2140,3460
+2140,3460,2380,3460
+2380,3460,2640,3440
+2640,3440,2900,3380
+2840,3280,2900,3380
+2840,3280,2900,3200
+2900,3200,2900,3140
+2840,3020,2900,3140
+2800,2960,2840,3020
+2700,3000,2800,2960
+2600,2980,2700,3000
+2380,3000,2600,2980
+2140,3000,2380,3000
+1880,3000,2140,3000
+1720,3040,1880,3000
+1640,2960,1720,3040
+1500,2940,1640,2960
+1340,3000,1500,2940
+1240,3000,1340,3000
+1140,3020,1240,3000
+1040,3000,1140,3020
+960,2960,1040,3000
+900,2960,960,2960
+840,2840,900,2960
+700,2820,840,2840
+540,2820,700,2820
+420,2820,540,2820
+180,2800,420,2820
+60,2780,180,2800
+-60,2800,60,2780
+-160,2760,-60,2800
+-260,2740,-160,2760
+-300,2640,-260,2740
+-360,2560,-300,2640
+-380,2460,-360,2560
+-380,2460,-300,2380
+-300,2300,-300,2380
+-300,2300,-300,2220
+-300,2100,-300,2220
+-300,2100,-300,2040
+-300,2040,-160,2040
+-160,2040,-60,2040
+-60,2040,60,2040
+60,2040,180,2040
+180,2040,360,2040
+360,2040,540,2040
+540,2040,700,2080
+660,2160,700,2080
+660,2160,700,2260
+660,2380,700,2260
+500,2340,660,2380
+360,2340,500,2340
+240,2340,360,2340
+40,2320,240,2340
+-60,2320,40,2320
+-100,2380,-60,2320
+-100,2380,-100,2460
+-100,2460,-100,2540
+-100,2540,0,2560
+0,2560,140,2600
+140,2600,300,2600
+300,2600,460,2600
+460,2600,640,2600
+640,2600,760,2580
+760,2580,820,2560
+820,2560,820,2500
+820,2500,820,2400
+820,2400,840,2320
+840,2320,840,2240
+820,2120,840,2240
+820,2020,820,2120
+820,1900,820,2020
+760,1840,820,1900
+640,1840,760,1840
+500,1840,640,1840
+300,1860,420,1880
+180,1840,300,1860
+420,1880,500,1840
+0,1840,180,1840
+-60,1860,0,1840
+-160,1840,-60,1860
+-200,1800,-160,1840
+-260,1760,-200,1800
+-260,1680,-260,1760
+-260,1620,-260,1680
+-260,1540,-260,1620
+-260,1540,-260,1460
+-300,1420,-260,1460
+-300,1420,-300,1340
+-300,1340,-260,1260
+-260,1260,-260,1160
+-260,1060,-260,1160
+-260,1060,-260,960
+-260,880,-260,960
+-260,880,-260,780
+-260,780,-260,680
+-300,580,-260,680
+-300,580,-300,480
+-300,480,-260,400
+-300,320,-260,400
+-300,320,-300,240
+-300,240,-200,220
+-200,220,-200,160
+-200,160,-100,140
+-100,140,0,120
+0,120,60,120
+60,120,180,120
+180,120,300,120
+300,120,420,140
+420,140,580,180
+580,180,760,180
+760,180,900,180
+960,180,1100,180
+1100,180,1340,200
+1340,200,1580,200
+1580,200,1720,180
+1720,180,2000,140
+2000,140,2240,140
+2240,140,2480,140
+2520,140,2800,160
+2800,160,3000,160
+3000,160,3140,160
+3140,260,3140,160
+3140,260,3140,380
+3080,500,3140,380
+3080,620,3080,500
+3080,620,3080,740
+3080,740,3080,840
+3080,960,3080,840
+3080,1080,3080,960
+3080,1080,3080,1200
+3080,1200,3080,1340
+3080,1340,3080,1460
+3080,1580,3080,1460
+3080,1700,3080,1580
+3080,1700,3080,1760
+3080,1760,3200,1760
+3200,1760,3320,1760
+3320,1760,3520,1760
+3520,1760,3680,1740
+3680,1740,3780,1700
+3780,1700,3840,1620
+3840,1620,3840,1520
+3840,1520,3840,1420
+3840,1320,3840,1420
+3840,1120,3840,1320
+3840,1120,3840,940
+3840,940,3840,760
+3780,600,3840,760
+3780,600,3780,440
+3780,320,3780,440
+3780,320,3780,160
+3780,60,3780,160
+3780,60,4020,60
+4020,60,4260,40
+4260,40,4500,40
+4500,40,4740,40
+4740,40,4840,20
+4840,20,4880,80
+4880,80,5080,40
+5080,40,5280,20
+5280,20,5500,0
+5500,0,5720,0
+5720,0,5940,60
+5940,60,6240,60
+6240,60,6540,20
+6540,20,6840,20
+6840,20,7040,0
+7040,0,7140,0
+7140,0,7400,20
+7400,20,7680,0
+7680,0,7940,0
+7940,0,8200,-20
+8200,-20,8360,20
+8360,20,8560,-40
+8560,-40,8760,0
+8760,0,8880,40
+8880,120,8880,40
+8840,220,8840,120
+8620,240,8840,220
+8420,260,8620,240
+8200,280,8420,260
+7940,280,8200,280
+7760,240,7940,280
+7560,220,7760,240
+7360,280,7560,220
+7140,260,7360,280
+6940,240,7140,260
+6720,220,6940,240
+6480,220,6720,220
+6360,300,6480,220
+6240,300,6360,300
+6200,500,6240,300
+6200,500,6360,540
+6360,540,6540,520
+6540,520,6720,480
+6720,480,6880,460
+6880,460,7080,500
+7080,500,7320,500
+7320,500,7680,500
+7680,620,7680,500
+7520,640,7680,620
+7360,640,7520,640
+7200,640,7360,640
+7040,660,7200,640
+6880,720,7040,660
+6720,700,6880,720
+6540,700,6720,700
+6420,760,6540,700
+6280,740,6420,760
+6240,760,6280,740
+6200,920,6240,760
+6200,920,6360,960
+6360,960,6540,960
+6540,960,6720,960
+6720,960,6760,980
+6760,980,6880,940
+6880,940,7080,940
+7080,940,7280,940
+7280,940,7520,920
+7520,920,7760,900
+7760,900,7980,860
+7980,860,8100,880
+8100,880,8280,900
+8280,900,8500,820
+8500,820,8700,820
+8700,820,8760,840
+8760,960,8760,840
+8700,1040,8760,960
+8560,1060,8700,1040
+8460,1080,8560,1060
+8360,1040,8460,1080
+8280,1080,8360,1040
+8160,1120,8280,1080
+8040,1120,8160,1120
+7940,1100,8040,1120
+7800,1120,7940,1100
+7680,1120,7800,1120
+7520,1100,7680,1120
+7360,1100,7520,1100
+7200,1120,7360,1100
+7040,1180,7200,1120
+6880,1160,7040,1180
+6720,1160,6880,1160
+6540,1160,6720,1160
+6360,1160,6540,1160
+6200,1160,6360,1160
+6040,1220,6200,1160
+6040,1220,6040,1400
+6040,1400,6200,1440
+6200,1440,6320,1440
+6320,1440,6440,1440
+6600,1440,6760,1440
+6760,1440,6940,1420
+6440,1440,6600,1440
+6940,1420,7280,1400
+7280,1400,7560,1400
+7560,1400,7760,1400
+7760,1400,7940,1360
+7940,1360,8100,1380
+8100,1380,8280,1340
+8280,1340,8460,1320
+8660,1300,8760,1360
+8460,1320,8660,1300
+8760,1360,8800,1500
+8800,1660,8800,1500
+8800,1660,8800,1820
+8700,1840,8800,1820
+8620,1860,8700,1840
+8560,1800,8620,1860
+8560,1800,8620,1680
+8500,1640,8620,1680
+8420,1680,8500,1640
+8280,1680,8420,1680
+8160,1680,8280,1680
+7900,1680,8160,1680
+7680,1680,7900,1680
+7400,1660,7680,1680
+7140,1680,7400,1660
+6880,1640,7140,1680
+6040,1820,6320,1780
+5900,1840,6040,1820
+6640,1700,6880,1640
+6320,1780,6640,1700
+5840,2040,5900,1840
+5840,2040,5840,2220
+5840,2220,5840,2320
+5840,2460,5840,2320
+5840,2560,5840,2460
+5840,2560,5960,2620
+5960,2620,6200,2620
+6200,2620,6380,2600
+6380,2600,6600,2580
+6600,2580,6800,2600
+6800,2600,7040,2580
+7040,2580,7280,2580
+7280,2580,7480,2560
+7760,2540,7980,2520
+7980,2520,8160,2500
+7480,2560,7760,2540
+8160,2500,8160,2420
+8160,2420,8160,2320
+8160,2180,8160,2320
+7980,2160,8160,2180
+7800,2180,7980,2160
+7600,2200,7800,2180
+7400,2200,7600,2200
+6960,2200,7200,2200
+7200,2200,7400,2200
+6720,2200,6960,2200
+6540,2180,6720,2200
+6320,2200,6540,2180
+6240,2160,6320,2200
+6240,2160,6240,2040
+6240,2040,6240,1940
+6240,1940,6440,1940
+6440,1940,6720,1940
+6720,1940,6940,1920
+7520,1920,7760,1920
+6940,1920,7280,1920
+7280,1920,7520,1920
+7760,1920,8100,1900
+8100,1900,8420,1900
+8420,1900,8460,1940
+8460,2120,8460,1940
+8460,2280,8460,2120
+8460,2280,8560,2420
+8560,2420,8660,2380
+8660,2380,8800,2340
+8800,2340,8840,2400
+8840,2520,8840,2400
+8800,2620,8840,2520
+8800,2740,8800,2620
+8800,2860,8800,2740
+8800,2940,8800,2860
+8760,2980,8800,2940
+8660,2980,8760,2980
+8620,2960,8660,2980
+8560,2880,8620,2960
+8560,2880,8560,2780
+8500,2740,8560,2780
+8420,2760,8500,2740
+8420,2840,8420,2760
+8420,2840,8420,2940
+8420,3040,8420,2940
+8420,3160,8420,3040
+8420,3280,8420,3380
+8420,3280,8420,3160
+8420,3380,8620,3460
+8620,3460,8760,3460
+8760,3460,8840,3400
+8840,3400,8960,3400
+8960,3400,9000,3500
+9000,3700,9000,3500
+9000,3900,9000,3700
+9000,4080,9000,3900
+9000,4280,9000,4080
+9000,4500,9000,4280
+9000,4620,9000,4500
+9000,4780,9000,4620
+9000,4780,9000,4960
+9000,5120,9000,4960
+9000,5120,9000,5300
+8960,5460,9000,5300
+8920,5620,8960,5460
+8920,5620,8920,5800
+8920,5800,8920,5960
+8920,5960,8920,6120
+8920,6120,8960,6300
+8960,6300,8960,6480
+8960,6660,8960,6480
+8960,6860,8960,6660
+8960,7040,8960,6860
+8920,7420,8920,7220
+8920,7420,8960,7620
+8960,7620,8960,7800
+8960,7800,8960,8000
+8960,8000,8960,8180
+8960,8180,8960,8380
+8960,8580,8960,8380
+8920,8800,8960,8580
+8880,9000,8920,8800
+8840,9180,8880,9000
+8800,9220,8840,9180
+8800,9220,8840,9340
+8760,9380,8840,9340
+8560,9340,8760,9380
+8360,9360,8560,9340
+8160,9360,8360,9360
+8040,9340,8160,9360
+7860,9360,8040,9340
+7680,9360,7860,9360
+7520,9360,7680,9360
+7420,9260,7520,9360
+7400,9080,7420,9260
+7400,9080,7420,8860
+7420,8860,7440,8720
+7440,8720,7480,8660
+7480,8660,7520,8540
+7520,8540,7600,8460
+7600,8460,7800,8480
+7800,8480,8040,8480
+8040,8480,8280,8480
+8280,8480,8500,8460
+8500,8460,8620,8440
+8620,8440,8660,8340
+8660,8340,8660,8220
+8660,8220,8700,8080
+8700,8080,8700,7920
+8700,7920,8700,7760
+8700,7760,8700,7620
+8700,7480,8700,7620
+8700,7480,8700,7320
+8700,7160,8700,7320
+8920,7220,8960,7040
+8660,7040,8700,7160
+8660,7040,8700,6880
+8660,6700,8700,6880
+8660,6700,8700,6580
+8700,6460,8700,6580
+8700,6460,8700,6320
+8700,6160,8700,6320
+8700,6160,8760,6020
+8760,6020,8760,5860
+8760,5860,8760,5700
+8760,5700,8760,5540
+8760,5540,8760,5360
+8760,5360,8760,5180
+8760,5000,8760,5180
+8700,4820,8760,5000
+8560,4740,8700,4820
+8420,4700,8560,4740
+8280,4700,8420,4700
+8100,4700,8280,4700
+7980,4700,8100,4700
+7820,4740,7980,4700
+7800,4920,7820,4740
+7800,4920,7900,4960
+7900,4960,8060,4980
+8060,4980,8220,5000
+8220,5000,8420,5040
+8420,5040,8460,5120
+8460,5180,8460,5120
+8360,5200,8460,5180
+8360,5280,8360,5200
+8160,5300,8360,5280
+8040,5260,8160,5300
+7860,5220,8040,5260
+7720,5160,7860,5220
+7640,5120,7720,5160
+7480,5120,7640,5120
+7240,5120,7480,5120
+7000,5120,7240,5120
+6800,5160,7000,5120
+6640,5220,6800,5160
+6600,5360,6640,5220
+6600,5460,6600,5360
+6480,5520,6600,5460
+6240,5540,6480,5520
+5980,5540,6240,5540
+5740,5540,5980,5540
+5500,5520,5740,5540
+5400,5520,5500,5520
+5280,5540,5400,5520
+5080,5540,5280,5540
+4940,5540,5080,5540
+4760,5540,4940,5540
+4600,5540,4760,5540
+4440,5560,4600,5540
+4040,5580,4120,5520
+4260,5540,4440,5560
+4120,5520,4260,5540
+4020,5720,4040,5580
+4020,5840,4020,5720
+4020,5840,4080,5940
+4080,5940,4120,6040
+4120,6040,4200,6080
+4200,6080,4340,6080
+4340,6080,4500,6060
+4500,6060,4700,6060
+4700,6060,4880,6060
+4880,6060,5080,6060
+5080,6060,5280,6080
+5280,6080,5440,6100
+5440,6100,5660,6100
+5660,6100,5900,6080
+5900,6080,6120,6080
+6120,6080,6360,6080
+6360,6080,6480,6100
+6480,6100,6540,6060
+6540,6060,6720,6060
+6720,6060,6940,6060
+6940,6060,7140,6060
+7400,6060,7600,6060
+7140,6060,7400,6060
+7600,6060,7800,6060
+7800,6060,7860,6080
+7860,6080,8060,6080
+8060,6080,8220,6080
+8220,6080,8320,6140
+8320,6140,8360,6300
+8320,6460,8360,6300
+8320,6620,8320,6460
+8320,6800,8320,6620
+8320,6960,8320,6800
+8320,6960,8360,7120
+8320,7280,8360,7120
+8320,7440,8320,7280
+8320,7600,8320,7440
+8100,7580,8220,7600
+8220,7600,8320,7600
+7900,7560,8100,7580
+7680,7560,7900,7560
+7480,7580,7680,7560
+7280,7580,7480,7580
+7080,7580,7280,7580
+7000,7600,7080,7580
+6880,7600,7000,7600
+6800,7580,6880,7600
+6640,7580,6800,7580
+6540,7580,6640,7580
+6380,7600,6540,7580
+6280,7620,6380,7600
+6240,7700,6280,7620
+6240,7700,6240,7800
+6240,7840,6240,7800
+6080,7840,6240,7840
+5960,7820,6080,7840
+5660,7840,5800,7840
+5500,7800,5660,7840
+5440,7700,5500,7800
+5800,7840,5960,7820
+5440,7540,5440,7700
+5440,7440,5440,7540
+5440,7320,5440,7440
+5400,7320,5440,7320
+5340,7400,5400,7320
+5340,7400,5340,7500
+5340,7600,5340,7500
+5340,7600,5340,7720
+5340,7720,5340,7860
+5340,7860,5340,7960
+5340,7960,5440,8020
+5440,8020,5560,8020
+5560,8020,5720,8040
+5720,8040,5900,8060
+5900,8060,6080,8060
+6080,8060,6240,8060
+6720,8040,6840,8060
+6240,8060,6480,8040
+6480,8040,6720,8040
+6840,8060,6940,8060
+6940,8060,7080,8120
+7080,8120,7140,8180
+7140,8460,7140,8320
+7140,8620,7140,8460
+7140,8620,7140,8740
+7140,8860,7140,8740
+7140,8960,7140,8860
+7140,8960,7200,9080
+7140,9200,7200,9080
+7140,9200,7200,9320
+7200,9320,7200,9460
+7200,9760,7200,9900
+7200,9620,7200,9460
+7200,9620,7200,9760
+7200,9900,7200,10060
+7200,10220,7200,10060
+7200,10360,7200,10220
+7140,10400,7200,10360
+6880,10400,7140,10400
+6640,10360,6880,10400
+6420,10360,6640,10360
+6160,10380,6420,10360
+5940,10340,6160,10380
+5720,10320,5940,10340
+5500,10340,5720,10320
+5280,10300,5500,10340
+5080,10300,5280,10300
+4840,10280,5080,10300
+4700,10280,4840,10280
+4540,10280,4700,10280
+4360,10280,4540,10280
+4200,10300,4360,10280
+4040,10380,4200,10300
+4020,10500,4040,10380
+3980,10640,4020,10500
+3980,10640,3980,10760
+3980,10760,4020,10920
+4020,10920,4080,11000
+4080,11000,4340,11020
+4340,11020,4600,11060
+4600,11060,4840,11040
+4840,11040,4880,10960
+4880,10740,4880,10960
+4880,10740,4880,10600
+4880,10600,5080,10560
+5080,10560,5340,10620
+5340,10620,5660,10620
+5660,10620,6040,10600
+6040,10600,6120,10620
+6120,10620,6240,10720
+6240,10720,6420,10740
+6420,10740,6640,10760
+6640,10760,6880,10780
+7140,10780,7400,10780
+6880,10780,7140,10780
+7400,10780,7680,10780
+7680,10780,8100,10760
+8100,10760,8460,10740
+8460,10740,8700,10760
+8800,10840,8800,10980
+8700,10760,8800,10840
+8760,11200,8800,10980
+8760,11200,8760,11380
+8760,11380,8800,11560
+8760,11680,8800,11560
+8760,11760,8760,11680
+8760,11760,8760,11920
+8760,11920,8800,12080
+8800,12200,8800,12080
+8700,12240,8800,12200
+8560,12220,8700,12240
+8360,12220,8560,12220
+8160,12240,8360,12220
+7720,12220,7980,12220
+7980,12220,8160,12240
+7400,12200,7720,12220
+7200,12180,7400,12200
+7000,12160,7200,12180
+6800,12160,7000,12160
+6280,12140,6380,12180
+6120,12180,6280,12140
+6540,12180,6800,12160
+6380,12180,6540,12180
+5900,12200,6120,12180
+5620,12180,5900,12200
+5340,12120,5620,12180
+5140,12100,5340,12120
+4980,12120,5140,12100
+4840,12120,4980,12120
+4700,12200,4840,12120
+4700,12380,4700,12200
+4740,12480,4940,12520
+4700,12380,4740,12480
+4940,12520,5160,12560
+5160,12560,5340,12600
+5340,12600,5400,12600
+5400,12600,5500,12600
+5500,12600,5620,12600
+5620,12600,5720,12560
+5720,12560,5800,12440
+5800,12440,5900,12380
+5900,12380,6120,12420
+6120,12420,6380,12440
+6380,12440,6600,12460
+6720,12460,6840,12520
+6840,12520,6960,12520
+6600,12460,6720,12460
+6960,12520,7040,12500
+7040,12500,7140,12440
+7200,12440,7360,12500
+7360,12500,7600,12560
+7600,12560,7860,12600
+7860,12600,8060,12500
+8100,12500,8200,12340
+8200,12340,8360,12360
+8360,12360,8560,12400
+8560,12400,8660,12420
+8660,12420,8840,12400
+8840,12400,9000,12360
+9000,12360,9000,12360
+2900,4400,2900,4280
+900,7320,1000,7220
+2640,13040,2900,12920
+2900,12920,3160,12840
+3480,12760,3780,12620
+3780,12620,4020,12460
+4300,12360,4440,12260
+4020,12460,4300,12360
+3160,12840,3480,12760
+4440,12080,4440,12260
+4440,12080,4440,11880
+4440,11880,4440,11720
+4440,11720,4600,11720
+4600,11720,4760,11740
+4760,11740,4980,11760
+4980,11760,5160,11760
+5160,11760,5340,11780
+6000,11860,6120,11820
+5340,11780,5620,11820
+5620,11820,6000,11860
+6120,11820,6360,11820
+6360,11820,6640,11860
+6940,11920,7240,11940
+7240,11940,7520,11960
+7520,11960,7860,11960
+7860,11960,8100,11920
+8100,11920,8420,11940
+8420,11940,8460,11960
+8460,11960,8500,11860
+8460,11760,8500,11860
+8320,11720,8460,11760
+8160,11720,8320,11720
+7940,11720,8160,11720
+7720,11700,7940,11720
+7520,11680,7720,11700
+7320,11680,7520,11680
+7200,11620,7320,11680
+7200,11620,7200,11500
+7200,11500,7280,11440
+7280,11440,7420,11440
+7420,11440,7600,11440
+7600,11440,7980,11460
+7980,11460,8160,11460
+8160,11460,8360,11460
+8360,11460,8460,11400
+8420,11060,8500,11200
+8280,11040,8420,11060
+8100,11060,8280,11040
+8460,11400,8500,11200
+7800,11060,8100,11060
+7520,11060,7800,11060
+7240,11060,7520,11060
+6940,11040,7240,11060
+6640,11000,6940,11040
+6420,10980,6640,11000
+6360,11060,6420,10980
+6360,11180,6360,11060
+6200,11280,6360,11180
+5960,11300,6200,11280
+5720,11280,5960,11300
+5500,11280,5720,11280
+4940,11300,5200,11280
+4660,11260,4940,11300
+4440,11280,4660,11260
+4260,11280,4440,11280
+4220,11220,4260,11280
+4080,11280,4220,11220
+3980,11420,4080,11280
+3980,11420,4040,11620
+4040,11620,4040,11820
+3980,11960,4040,11820
+3840,12000,3980,11960
+3720,11940,3840,12000
+3680,11800,3720,11940
+3680,11580,3680,11800
+3680,11360,3680,11580
+3680,11360,3680,11260
+3680,11080,3680,11260
+3680,11080,3680,10880
+3680,10700,3680,10880
+3680,10700,3680,10620
+3680,10480,3680,10620
+3680,10480,3680,10300
+3680,10300,3680,10100
+3680,10100,3680,9940
+3680,9940,3720,9860
+3720,9860,3920,9900
+3920,9900,4220,9880
+4980,9940,5340,9960
+4220,9880,4540,9900
+4540,9900,4980,9940
+5340,9960,5620,9960
+5620,9960,5900,9960
+5900,9960,6160,10000
+6160,10000,6480,10000
+6480,10000,6720,10000
+6720,10000,6880,9860
+6880,9860,6880,9520
+6880,9520,6940,9340
+6940,9120,6940,9340
+6940,9120,6940,8920
+6940,8700,6940,8920
+6880,8500,6940,8700
+6880,8320,6880,8500
+7140,8320,7140,8180
+6760,8260,6880,8320
+6540,8240,6760,8260
+6420,8180,6540,8240
+6280,8240,6420,8180
+6160,8300,6280,8240
+6120,8400,6160,8300
+6080,8520,6120,8400
+5840,8480,6080,8520
+5620,8500,5840,8480
+5500,8500,5620,8500
+5340,8560,5500,8500
+5160,8540,5340,8560
+4620,8520,4880,8520
+4360,8480,4620,8520
+4880,8520,5160,8540
+4140,8440,4360,8480
+3920,8460,4140,8440
+3720,8380,3920,8460
+3680,8160,3720,8380
+3680,8160,3720,7940
+3720,7720,3720,7940
+3680,7580,3720,7720
+3680,7580,3720,7440
+3720,7440,3720,7300
+3720,7160,3720,7300
+3720,7160,3720,7020
+3720,7020,3780,6900
+3780,6900,4080,6940
+4080,6940,4340,6980
+4340,6980,4600,6980
+4600,6980,4880,6980
+4880,6980,5160,6980
+5160,6980,5400,7000
+5400,7000,5560,7020
+5560,7020,5660,7080
+5660,7080,5660,7280
+5660,7280,5660,7440
+5660,7440,5740,7520
+5740,7520,5740,7600
+5740,7600,5900,7600
+5900,7600,6040,7540
+6040,7540,6040,7320
+6040,7320,6120,7200
+6120,7200,6120,7040
+6120,7040,6240,7000
+6240,7000,6480,7060
+6480,7060,6800,7060
+6800,7060,7080,7080
+7080,7080,7320,7100
+7940,7100,7980,6920
+7860,6860,7980,6920
+7640,6860,7860,6860
+7400,6840,7640,6860
+7320,7100,7560,7120
+7560,7120,7760,7120
+7760,7120,7940,7100
+7200,6820,7400,6840
+7040,6820,7200,6820
+6600,6840,6840,6840
+6380,6800,6600,6840
+6120,6800,6380,6800
+5900,6840,6120,6800
+5620,6820,5900,6840
+5400,6800,5620,6820
+5140,6800,5400,6800
+4880,6780,5140,6800
+4600,6760,4880,6780
+4340,6760,4600,6760
+4080,6760,4340,6760
+3840,6740,4080,6760
+3680,6720,3840,6740
+3680,6720,3680,6560
+3680,6560,3720,6400
+3720,6400,3720,6200
+3720,6200,3780,6000
+3720,5780,3780,6000
+3720,5580,3720,5780
+3720,5360,3720,5580
+3720,5360,3840,5240
+3840,5240,4200,5260
+4200,5260,4600,5280
+4600,5280,4880,5280
+4880,5280,5140,5200
+5140,5200,5220,5100
+5220,5100,5280,4900
+5280,4900,5340,4840
+5340,4840,5720,4880
+6120,4880,6480,4860
+6880,4840,7200,4860
+6480,4860,6880,4840
+7200,4860,7320,4860
+7320,4860,7360,4740
+7360,4600,7440,4520
+7360,4600,7360,4740
+7440,4520,7640,4520
+7640,4520,7800,4480
+7800,4480,7800,4280
+7800,4280,7800,4040
+7800,4040,7800,3780
+7800,3560,7800,3780
+7800,3560,7860,3440
+7860,3440,8060,3460
+8060,3460,8160,3340
+8160,3340,8160,3140
+8160,3140,8160,2960
+8000,2900,8160,2960
+7860,2900,8000,2900
+7640,2940,7860,2900
+7400,2980,7640,2940
+7100,2980,7400,2980
+6840,3000,7100,2980
+5620,2980,5840,2980
+5840,2980,6500,3000
+6500,3000,6840,3000
+5560,2780,5620,2980
+5560,2780,5560,2580
+5560,2580,5560,2380
+5560,2140,5560,2380
+5560,2140,5560,1900
+5560,1900,5620,1660
+5620,1660,5660,1460
+5660,1460,5660,1300
+5500,1260,5660,1300
+5340,1260,5500,1260
+4600,1220,4840,1240
+4440,1220,4600,1220
+4440,1080,4440,1220
+4440,1080,4600,1020
+5080,1260,5340,1260
+4840,1240,5080,1260
+4600,1020,4940,1020
+4940,1020,5220,1020
+5220,1020,5560,960
+5560,960,5660,860
+5660,740,5660,860
+5280,740,5660,740
+4940,780,5280,740
+4660,760,4940,780
+4500,700,4660,760
+4500,520,4500,700
+4500,520,4700,460
+4700,460,5080,440
+5440,420,5740,420
+5080,440,5440,420
+5740,420,5840,360
+5800,280,5840,360
+5560,280,5800,280
+4980,300,5280,320
+4360,320,4660,300
+4200,360,4360,320
+5280,320,5560,280
+4660,300,4980,300
+4140,480,4200,360
+4140,480,4140,640
+4140,640,4200,780
+4200,780,4200,980
+4200,980,4220,1180
+4220,1400,4220,1180
+4220,1400,4260,1540
+4260,1540,4500,1540
+4500,1540,4700,1520
+4700,1520,4980,1540
+5280,1560,5400,1560
+4980,1540,5280,1560
+5400,1560,5400,1700
+5400,1780,5400,1700
+5340,1900,5400,1780
+5340,2020,5340,1900
+5340,2220,5340,2020
+5340,2220,5340,2420
+5340,2420,5340,2520
+5080,2600,5220,2580
+5220,2580,5340,2520
+4900,2580,5080,2600
+4700,2540,4900,2580
+4500,2540,4700,2540
+4220,2580,4340,2540
+4200,2700,4220,2580
+4340,2540,4500,2540
+3980,2740,4200,2700
+3840,2740,3980,2740
+3780,2640,3840,2740
+3780,2640,3780,2460
+3780,2280,3780,2460
+3620,2020,3780,2100
+3780,2280,3780,2100
+3360,2040,3620,2020
+3080,2040,3360,2040
+2840,2020,3080,2040
+2740,1940,2840,2020
+2740,1940,2800,1800
+2800,1640,2800,1800
+2800,1640,2800,1460
+2800,1300,2800,1460
+2700,1180,2800,1300
+2480,1140,2700,1180
+1580,1200,1720,1200
+2240,1180,2480,1140
+1960,1180,2240,1180
+1720,1200,1960,1180
+1500,1320,1580,1200
+1500,1440,1500,1320
+1500,1440,1760,1480
+1760,1480,1940,1480
+1940,1480,2140,1500
+2140,1500,2320,1520
+2400,1560,2400,1700
+2280,1820,2380,1780
+2320,1520,2400,1560
+2380,1780,2400,1700
+2080,1840,2280,1820
+1720,1820,2080,1840
+1420,1800,1720,1820
+1280,1800,1420,1800
+1240,1720,1280,1800
+1240,1720,1240,1600
+1240,1600,1280,1480
+1280,1340,1280,1480
+1180,1280,1280,1340
+1000,1280,1180,1280
+760,1280,1000,1280
+360,1240,540,1260
+180,1220,360,1240
+540,1260,760,1280
+180,1080,180,1220
+180,1080,180,1000
+180,1000,360,940
+360,940,540,960
+540,960,820,980
+1100,980,1200,920
+820,980,1100,980
+6640,11860,6940,11920
+5200,11280,5500,11280
+4120,7330,4120,7230
+4120,7230,4660,7250
+4660,7250,4940,7250
+4940,7250,5050,7340
+5010,7400,5050,7340
+4680,7380,5010,7400
+4380,7370,4680,7380
+4120,7330,4360,7370
+4120,7670,4120,7760
+4120,7670,4280,7650
+4280,7650,4540,7660
+4550,7660,4820,7680
+4820,7680,4900,7730
+4880,7800,4900,7730
+4620,7820,4880,7800
+4360,7790,4620,7820
+4120,7760,4360,7790
+6840,6840,7040,6820
+5720,4880,6120,4880
+1200,920,1340,810
+1340,810,1520,790
+1520,790,1770,800
+2400,790,2600,750
+2600,750,2640,520
+2520,470,2640,520
+2140,470,2520,470
+1760,800,2090,800
+2080,800,2400,790
+1760,450,2140,470
+1420,450,1760,450
+1180,440,1420,450
+900,480,1180,440
+640,450,900,480
+360,440,620,450
+120,430,360,440
+0,520,120,430
+-20,780,0,520
+-20,780,-20,1020
+-20,1020,-20,1150
+-20,1150,0,1300
+0,1470,60,1530
+0,1300,0,1470
+60,1530,360,1530
+360,1530,660,1520
+660,1520,980,1520
+980,1520,1040,1520
+1040,1520,1070,1560
+1070,1770,1070,1560
+1070,1770,1100,2010
+1070,2230,1100,2010
+1070,2240,1180,2340
+1180,2340,1580,2340
+1580,2340,1940,2350
+1940,2350,2440,2350
+2440,2350,2560,2380
+2560,2380,2600,2540
+2810,2640,3140,2680
+2600,2540,2810,2640
+3140,2680,3230,2780
+3230,2780,3260,2970
+3230,3220,3260,2970
+3200,3470,3230,3220
+3200,3480,3210,3760
+3210,3760,3210,4040
+3200,4040,3230,4310
+3210,4530,3230,4310
+3210,4530,3230,4730
+3230,4960,3230,4730
+3230,4960,3260,5190
+3170,5330,3260,5190
+2920,5330,3170,5330
+2660,5360,2920,5330
+2420,5330,2660,5360
+2200,5280,2400,5330
+2020,5280,2200,5280
+1840,5260,2020,5280
+1660,5280,1840,5260
+1500,5300,1660,5280
+1360,5270,1500,5300
+1200,5290,1340,5270
+1070,5400,1200,5290
+1040,5630,1070,5400
+1000,5900,1040,5630
+980,6170,1000,5900
+980,6280,980,6170
+980,6540,980,6280
+980,6540,1040,6720
+1040,6720,1360,6730
+1360,6730,1760,6710
+2110,6720,2420,6730
+1760,6710,2110,6720
+2420,6730,2640,6720
+2640,6720,2970,6720
+2970,6720,3160,6700
+3160,6700,3240,6710
+3240,6710,3260,6890
+3260,7020,3260,6890
+3230,7180,3260,7020
+3230,7350,3230,7180
+3210,7510,3230,7350
+3210,7510,3210,7690
+3210,7870,3210,7690
+3210,7870,3210,7980
+3200,8120,3210,7980
+3200,8330,3200,8120
+3160,8520,3200,8330
+2460,11100,2480,11020
+2200,11180,2460,11100
+1260,11350,1600,11320
+600,11430,930,11400
+180,11340,620,11430
+1600,11320,1910,11280
+1910,11280,2200,11180
+923.0029599285435,11398.99893503157,1264.002959928544,11351.99893503157 \ No newline at end of file
diff --git a/samples/99_genre_platformer/the_little_probe/level_lava.txt b/samples/99_genre_platformer/the_little_probe/level_lava.txt
new file mode 100644
index 0000000..e2bc2bd
--- /dev/null
+++ b/samples/99_genre_platformer/the_little_probe/level_lava.txt
@@ -0,0 +1,235 @@
+100,10740,500,10780
+500,10780,960,10760
+960,10760,1340,10760
+1380,10760,1820,10780
+1820,10780,2240,10780
+2280,10780,2740,10740
+2740,10740,3000,10780
+3000,10780,3140,11020
+-520,8820,-480,9160
+-520,8480,-520,8820
+-520,8480,-480,8180
+-480,8180,-200,8120
+-200,8120,100,8220
+100,8220,420,8240
+420,8240,760,8260
+760,8260,1140,8280
+1140,8280,1500,8200
+1500,8200,1880,8240
+1880,8240,2240,8260
+2240,8260,2320,8480
+2320,8480,2380,8680
+2240,8860,2380,8680
+2240,9080,2240,8860
+2240,9080,2320,9260
+2320,9260,2480,9440
+2480,9440,2600,9640
+2480,9840,2600,9640
+2400,10020,2480,9840
+2240,10080,2400,10020
+1960,10080,2240,10080
+1720,10080,1960,10080
+1460,10080,1720,10080
+1180,10080,1420,10080
+900,10080,1180,10080
+640,10080,900,10080
+640,10080,640,9900
+60,10520,100,10740
+40,10240,60,10520
+40,10240,40,9960
+40,9960,40,9680
+40,9680,40,9360
+40,9360,60,9080
+60,9080,100,8860
+100,8860,460,9040
+460,9040,760,9220
+760,9220,1140,9220
+1140,9220,1720,9200
+-660,11580,-600,11420
+-660,11800,-660,11580
+-660,12000,-660,11800
+-660,12000,-600,12220
+-600,12220,-600,12440
+-600,12440,-600,12640
+-600,11240,-260,11280
+-260,11280,100,11240
+9000,12360,9020,12400
+9020,12620,9020,12400
+9020,12840,9020,12620
+9020,13060,9020,12840
+9020,13060,9020,13240
+9020,13240,9020,13420
+9020,13420,9020,13600
+9020,13600,9020,13780
+8880,13900,9020,13780
+8560,13800,8880,13900
+8220,13780,8560,13800
+7860,13760,8220,13780
+7640,13780,7860,13760
+7360,13800,7640,13780
+7100,13800,7360,13800
+6540,13760,6800,13780
+6800,13780,7100,13800
+6280,13760,6540,13760
+5760,13760,6280,13760
+5220,13780,5760,13760
+4700,13760,5220,13780
+4200,13740,4700,13760
+3680,13720,4200,13740
+3140,13700,3680,13720
+2600,13680,3140,13700
+2040,13940,2600,13680
+1640,13940,2040,13940
+1200,13960,1640,13940
+840,14000,1200,13960
+300,13960,840,14000
+-200,13900,300,13960
+-600,12840,-600,12640
+-600,13140,-600,12840
+-600,13140,-600,13420
+-600,13700,-600,13420
+-600,13700,-600,13820
+-600,13820,-200,13900
+-600,11240,-560,11000
+-560,11000,-480,10840
+-520,10660,-480,10840
+-520,10660,-520,10480
+-520,10480,-520,10300
+-520,10260,-480,10080
+-480,9880,-440,10060
+-520,9680,-480,9880
+-520,9680,-480,9400
+-480,9400,-480,9160
+1820,9880,2140,9800
+1540,9880,1820,9880
+1200,9920,1500,9880
+900,9880,1200,9920
+640,9900,840,9880
+2380,8760,2800,8760
+2800,8760,2840,8660
+2840,8660,2840,8420
+2840,8160,2840,8420
+2800,7900,2840,8160
+2800,7900,2800,7720
+2800,7540,2800,7720
+2800,7540,2800,7360
+2700,7220,2800,7360
+2400,7220,2700,7220
+2080,7240,2400,7220
+1760,7320,2080,7240
+1380,7360,1720,7320
+1040,7400,1340,7360
+640,7400,1000,7420
+300,7380,640,7400
+0,7300,240,7380
+-300,7180,-60,7300
+-380,6860,-360,7180
+-380,6880,-360,6700
+-360,6700,-260,6540
+-260,6540,0,6520
+0,6520,240,6640
+240,6640,460,6640
+460,6640,500,6480
+500,6260,500,6480
+460,6060,500,6260
+460,5860,460,6060
+460,5860,500,5640
+500,5640,540,5440
+540,5440,580,5220
+580,5220,580,5000
+580,4960,580,4740
+580,4740,960,4700
+960,4700,1140,4760
+1140,4760,1420,4740
+1420,4740,1720,4700
+1720,4700,2000,4740
+2000,4740,2380,4760
+2380,4760,2700,4800
+1720,4600,1760,4300
+1760,4300,2200,4340
+2200,4340,2560,4340
+2560,4340,2740,4340
+2160,12580,2440,12400
+1820,12840,2160,12580
+1500,13080,1820,12840
+1140,13340,1500,13080
+1140,13340,1580,13220
+2110,13080,2520,13000
+2520,13000,2900,12800
+1580,13220,2110,13080
+2900,12800,3200,12680
+3200,12680,3440,12640
+3440,12640,3720,12460
+3720,12460,4040,12320
+4040,12320,4360,12200
+4360,11940,4380,12180
+4360,11700,4360,11940
+4360,11700,4540,11500
+4540,11500,4880,11540
+6000,11660,6280,11640
+5440,11600,5720,11610
+5720,11610,6000,11660
+6280,11640,6760,11720
+6760,11720,7060,11780
+7060,11780,7360,11810
+7360,11810,7640,11840
+7640,11840,8000,11830
+8000,11830,8320,11850
+8320,11850,8390,11800
+8330,11760,8390,11800
+8160,11760,8330,11760
+7910,11750,8160,11760
+7660,11740,7900,11750
+7400,11730,7660,11740
+7160,11680,7400,11730
+7080,11570,7160,11680
+7080,11570,7100,11350
+7100,11350,7440,11280
+7440,11280,7940,11280
+7960,11280,8360,11280
+5840,11540,6650,11170
+4880,11540,5440,11600
+3410,11830,3420,11300
+3410,11260,3520,10920
+3520,10590,3520,10920
+3520,10590,3540,10260
+3520,9900,3540,10240
+3520,9900,3640,9590
+3640,9570,4120,9590
+4140,9590,4600,9680
+4620,9680,5030,9730
+5120,9750,5520,9800
+5620,9820,6080,9800
+6130,9810,6580,9820
+6640,9820,6800,9700
+6780,9400,6800,9700
+6780,9400,6840,9140
+6820,8860,6840,9120
+6780,8600,6820,8830
+6720,8350,6780,8570
+6480,8340,6720,8320
+6260,8400,6480,8340
+6050,8580,6240,8400
+5760,8630,6040,8590
+5520,8690,5740,8630
+5120,8690,5450,8700
+4570,8670,5080,8690
+4020,8610,4540,8670
+3540,8480,4020,8610
+3520,8230,3520,8480
+3520,7930,3520,8230
+3520,7930,3540,7630
+3480,7320,3540,7610
+3480,7280,3500,7010
+3500,6980,3680,6850
+3680,6850,4220,6840
+4230,6840,4760,6850
+4780,6850,5310,6860
+5310,6860,5720,6940
+5720,6940,5880,7250
+5880,7250,5900,7520
+100,11240,440,11300
+440,11300,760,11330
+1480,11280,1840,11230
+2200,11130,2360,11090
+1840,11230,2200,11130 \ No newline at end of file
diff --git a/samples/99_genre_platformer/the_little_probe/license-for-sample.txt b/samples/99_genre_platformer/the_little_probe/license-for-sample.txt
new file mode 100644
index 0000000..b1005ed
--- /dev/null
+++ b/samples/99_genre_platformer/the_little_probe/license-for-sample.txt
@@ -0,0 +1,9 @@
+Copyright 2019 DragonRuby LLC, Amir Rajan
+
+MIT License
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/samples/99_genre_platformer/the_little_probe/metadata/game_metadata.txt b/samples/99_genre_platformer/the_little_probe/metadata/game_metadata.txt
new file mode 100644
index 0000000..cba2788
--- /dev/null
+++ b/samples/99_genre_platformer/the_little_probe/metadata/game_metadata.txt
@@ -0,0 +1,6 @@
+devid=amirrajan
+devtitle=Amir Rajan
+gameid=the-little-probe
+gametitle=The Little Probe
+version=1.0
+icon=sprites/probe.png
diff --git a/samples/99_genre_platformer/the_little_probe/sounds/0301.wav b/samples/99_genre_platformer/the_little_probe/sounds/0301.wav
new file mode 100644
index 0000000..13bdf5a
--- /dev/null
+++ b/samples/99_genre_platformer/the_little_probe/sounds/0301.wav
Binary files differ
diff --git a/samples/99_genre_platformer/the_little_probe/sounds/0302.wav b/samples/99_genre_platformer/the_little_probe/sounds/0302.wav
new file mode 100644
index 0000000..b3e5849
--- /dev/null
+++ b/samples/99_genre_platformer/the_little_probe/sounds/0302.wav
Binary files differ
diff --git a/samples/99_genre_platformer/the_little_probe/sounds/0303.wav b/samples/99_genre_platformer/the_little_probe/sounds/0303.wav
new file mode 100644
index 0000000..0871983
--- /dev/null
+++ b/samples/99_genre_platformer/the_little_probe/sounds/0303.wav
Binary files differ
diff --git a/samples/99_genre_platformer/the_little_probe/sounds/0304.wav b/samples/99_genre_platformer/the_little_probe/sounds/0304.wav
new file mode 100644
index 0000000..9ee599e
--- /dev/null
+++ b/samples/99_genre_platformer/the_little_probe/sounds/0304.wav
Binary files differ
diff --git a/samples/99_genre_platformer/the_little_probe/sounds/0305.wav b/samples/99_genre_platformer/the_little_probe/sounds/0305.wav
new file mode 100644
index 0000000..d2f919f
--- /dev/null
+++ b/samples/99_genre_platformer/the_little_probe/sounds/0305.wav
Binary files differ
diff --git a/samples/99_genre_platformer/the_little_probe/sounds/0306.wav b/samples/99_genre_platformer/the_little_probe/sounds/0306.wav
new file mode 100644
index 0000000..4f15476
--- /dev/null
+++ b/samples/99_genre_platformer/the_little_probe/sounds/0306.wav
Binary files differ
diff --git a/samples/99_genre_platformer/the_little_probe/sounds/0307.wav b/samples/99_genre_platformer/the_little_probe/sounds/0307.wav
new file mode 100644
index 0000000..ffb55f9
--- /dev/null
+++ b/samples/99_genre_platformer/the_little_probe/sounds/0307.wav
Binary files differ
diff --git a/samples/99_genre_platformer/the_little_probe/sounds/0308.wav b/samples/99_genre_platformer/the_little_probe/sounds/0308.wav
new file mode 100644
index 0000000..86cae87
--- /dev/null
+++ b/samples/99_genre_platformer/the_little_probe/sounds/0308.wav
Binary files differ
diff --git a/samples/99_genre_platformer/the_little_probe/sounds/0309.wav b/samples/99_genre_platformer/the_little_probe/sounds/0309.wav
new file mode 100644
index 0000000..1dd2a65
--- /dev/null
+++ b/samples/99_genre_platformer/the_little_probe/sounds/0309.wav
Binary files differ
diff --git a/samples/99_genre_platformer/the_little_probe/sounds/0310.wav b/samples/99_genre_platformer/the_little_probe/sounds/0310.wav
new file mode 100644
index 0000000..cc0df6f
--- /dev/null
+++ b/samples/99_genre_platformer/the_little_probe/sounds/0310.wav
Binary files differ
diff --git a/samples/99_genre_platformer/the_little_probe/sounds/0311.wav b/samples/99_genre_platformer/the_little_probe/sounds/0311.wav
new file mode 100644
index 0000000..0e85a2d
--- /dev/null
+++ b/samples/99_genre_platformer/the_little_probe/sounds/0311.wav
Binary files differ
diff --git a/samples/99_genre_platformer/the_little_probe/sounds/0312.wav b/samples/99_genre_platformer/the_little_probe/sounds/0312.wav
new file mode 100644
index 0000000..0680440
--- /dev/null
+++ b/samples/99_genre_platformer/the_little_probe/sounds/0312.wav
Binary files differ
diff --git a/samples/99_genre_platformer/the_little_probe/sounds/0313.wav b/samples/99_genre_platformer/the_little_probe/sounds/0313.wav
new file mode 100644
index 0000000..466851b
--- /dev/null
+++ b/samples/99_genre_platformer/the_little_probe/sounds/0313.wav
Binary files differ
diff --git a/samples/99_genre_platformer/the_little_probe/sounds/0314.wav b/samples/99_genre_platformer/the_little_probe/sounds/0314.wav
new file mode 100644
index 0000000..81784c6
--- /dev/null
+++ b/samples/99_genre_platformer/the_little_probe/sounds/0314.wav
Binary files differ
diff --git a/samples/99_genre_platformer/the_little_probe/sounds/0315.wav b/samples/99_genre_platformer/the_little_probe/sounds/0315.wav
new file mode 100644
index 0000000..f6d0036
--- /dev/null
+++ b/samples/99_genre_platformer/the_little_probe/sounds/0315.wav
Binary files differ
diff --git a/samples/99_genre_platformer/the_little_probe/sounds/0316.wav b/samples/99_genre_platformer/the_little_probe/sounds/0316.wav
new file mode 100644
index 0000000..942c6d3
--- /dev/null
+++ b/samples/99_genre_platformer/the_little_probe/sounds/0316.wav
Binary files differ
diff --git a/samples/99_genre_platformer/the_little_probe/sounds/0317.wav b/samples/99_genre_platformer/the_little_probe/sounds/0317.wav
new file mode 100644
index 0000000..75e35ed
--- /dev/null
+++ b/samples/99_genre_platformer/the_little_probe/sounds/0317.wav
Binary files differ
diff --git a/samples/99_genre_platformer/the_little_probe/sounds/0318.wav b/samples/99_genre_platformer/the_little_probe/sounds/0318.wav
new file mode 100644
index 0000000..1fff907
--- /dev/null
+++ b/samples/99_genre_platformer/the_little_probe/sounds/0318.wav
Binary files differ
diff --git a/samples/99_genre_platformer/the_little_probe/sounds/0319.wav b/samples/99_genre_platformer/the_little_probe/sounds/0319.wav
new file mode 100644
index 0000000..016a76f
--- /dev/null
+++ b/samples/99_genre_platformer/the_little_probe/sounds/0319.wav
Binary files differ
diff --git a/samples/99_genre_platformer/the_little_probe/sounds/0320.wav b/samples/99_genre_platformer/the_little_probe/sounds/0320.wav
new file mode 100644
index 0000000..a41bafe
--- /dev/null
+++ b/samples/99_genre_platformer/the_little_probe/sounds/0320.wav
Binary files differ
diff --git a/samples/99_genre_platformer/the_little_probe/sounds/0321.wav b/samples/99_genre_platformer/the_little_probe/sounds/0321.wav
new file mode 100644
index 0000000..dede4f1
--- /dev/null
+++ b/samples/99_genre_platformer/the_little_probe/sounds/0321.wav
Binary files differ
diff --git a/samples/99_genre_platformer/the_little_probe/sounds/bg.ogg b/samples/99_genre_platformer/the_little_probe/sounds/bg.ogg
new file mode 100644
index 0000000..8a02a75
--- /dev/null
+++ b/samples/99_genre_platformer/the_little_probe/sounds/bg.ogg
Binary files differ
diff --git a/samples/99_genre_platformer/the_little_probe/sprites/area_one.png b/samples/99_genre_platformer/the_little_probe/sprites/area_one.png
new file mode 100644
index 0000000..afd2f46
--- /dev/null
+++ b/samples/99_genre_platformer/the_little_probe/sprites/area_one.png
Binary files differ
diff --git a/samples/99_genre_platformer/the_little_probe/sprites/circle-black.png b/samples/99_genre_platformer/the_little_probe/sprites/circle-black.png
new file mode 100644
index 0000000..c98e23d
--- /dev/null
+++ b/samples/99_genre_platformer/the_little_probe/sprites/circle-black.png
Binary files differ
diff --git a/samples/99_genre_platformer/the_little_probe/sprites/circle-blue.png b/samples/99_genre_platformer/the_little_probe/sprites/circle-blue.png
new file mode 100644
index 0000000..1726d2a
--- /dev/null
+++ b/samples/99_genre_platformer/the_little_probe/sprites/circle-blue.png
Binary files differ
diff --git a/samples/99_genre_platformer/the_little_probe/sprites/circle-gray.png b/samples/99_genre_platformer/the_little_probe/sprites/circle-gray.png
new file mode 100644
index 0000000..960f191
--- /dev/null
+++ b/samples/99_genre_platformer/the_little_probe/sprites/circle-gray.png
Binary files differ
diff --git a/samples/99_genre_platformer/the_little_probe/sprites/circle-green.png b/samples/99_genre_platformer/the_little_probe/sprites/circle-green.png
new file mode 100644
index 0000000..43cf7ee
--- /dev/null
+++ b/samples/99_genre_platformer/the_little_probe/sprites/circle-green.png
Binary files differ
diff --git a/samples/99_genre_platformer/the_little_probe/sprites/circle-indigo.png b/samples/99_genre_platformer/the_little_probe/sprites/circle-indigo.png
new file mode 100644
index 0000000..598e240
--- /dev/null
+++ b/samples/99_genre_platformer/the_little_probe/sprites/circle-indigo.png
Binary files differ
diff --git a/samples/99_genre_platformer/the_little_probe/sprites/circle-orange.png b/samples/99_genre_platformer/the_little_probe/sprites/circle-orange.png
new file mode 100644
index 0000000..5604a42
--- /dev/null
+++ b/samples/99_genre_platformer/the_little_probe/sprites/circle-orange.png
Binary files differ
diff --git a/samples/99_genre_platformer/the_little_probe/sprites/circle-red.png b/samples/99_genre_platformer/the_little_probe/sprites/circle-red.png
new file mode 100644
index 0000000..7f17ca6
--- /dev/null
+++ b/samples/99_genre_platformer/the_little_probe/sprites/circle-red.png
Binary files differ
diff --git a/samples/99_genre_platformer/the_little_probe/sprites/circle-violet.png b/samples/99_genre_platformer/the_little_probe/sprites/circle-violet.png
new file mode 100644
index 0000000..681d210
--- /dev/null
+++ b/samples/99_genre_platformer/the_little_probe/sprites/circle-violet.png
Binary files differ
diff --git a/samples/99_genre_platformer/the_little_probe/sprites/circle-white.png b/samples/99_genre_platformer/the_little_probe/sprites/circle-white.png
new file mode 100644
index 0000000..bd32155
--- /dev/null
+++ b/samples/99_genre_platformer/the_little_probe/sprites/circle-white.png
Binary files differ
diff --git a/samples/99_genre_platformer/the_little_probe/sprites/circle-yellow.png b/samples/99_genre_platformer/the_little_probe/sprites/circle-yellow.png
new file mode 100644
index 0000000..94992eb
--- /dev/null
+++ b/samples/99_genre_platformer/the_little_probe/sprites/circle-yellow.png
Binary files differ
diff --git a/samples/99_genre_platformer/the_little_probe/sprites/jupiter.png b/samples/99_genre_platformer/the_little_probe/sprites/jupiter.png
new file mode 100644
index 0000000..7982713
--- /dev/null
+++ b/samples/99_genre_platformer/the_little_probe/sprites/jupiter.png
Binary files differ
diff --git a/samples/99_genre_platformer/the_little_probe/sprites/level.png b/samples/99_genre_platformer/the_little_probe/sprites/level.png
new file mode 100644
index 0000000..1ce0f1a
--- /dev/null
+++ b/samples/99_genre_platformer/the_little_probe/sprites/level.png
Binary files differ
diff --git a/samples/99_genre_platformer/the_little_probe/sprites/probe.png b/samples/99_genre_platformer/the_little_probe/sprites/probe.png
new file mode 100644
index 0000000..e29b144
--- /dev/null
+++ b/samples/99_genre_platformer/the_little_probe/sprites/probe.png
Binary files differ
diff --git a/samples/99_genre_platformer/the_little_probe/sprites/square-black.png b/samples/99_genre_platformer/the_little_probe/sprites/square-black.png
new file mode 100644
index 0000000..cea7bd7
--- /dev/null
+++ b/samples/99_genre_platformer/the_little_probe/sprites/square-black.png
Binary files differ
diff --git a/samples/99_genre_platformer/the_little_probe/sprites/square-blue.png b/samples/99_genre_platformer/the_little_probe/sprites/square-blue.png
new file mode 100644
index 0000000..b840849
--- /dev/null
+++ b/samples/99_genre_platformer/the_little_probe/sprites/square-blue.png
Binary files differ
diff --git a/samples/99_genre_platformer/the_little_probe/sprites/square-gray.png b/samples/99_genre_platformer/the_little_probe/sprites/square-gray.png
new file mode 100644
index 0000000..2142b30
--- /dev/null
+++ b/samples/99_genre_platformer/the_little_probe/sprites/square-gray.png
Binary files differ
diff --git a/samples/99_genre_platformer/the_little_probe/sprites/square-green.png b/samples/99_genre_platformer/the_little_probe/sprites/square-green.png
new file mode 100644
index 0000000..5ef7f75
--- /dev/null
+++ b/samples/99_genre_platformer/the_little_probe/sprites/square-green.png
Binary files differ
diff --git a/samples/99_genre_platformer/the_little_probe/sprites/square-indigo.png b/samples/99_genre_platformer/the_little_probe/sprites/square-indigo.png
new file mode 100644
index 0000000..2384108
--- /dev/null
+++ b/samples/99_genre_platformer/the_little_probe/sprites/square-indigo.png
Binary files differ
diff --git a/samples/99_genre_platformer/the_little_probe/sprites/square-orange.png b/samples/99_genre_platformer/the_little_probe/sprites/square-orange.png
new file mode 100644
index 0000000..bb1eee7
--- /dev/null
+++ b/samples/99_genre_platformer/the_little_probe/sprites/square-orange.png
Binary files differ
diff --git a/samples/99_genre_platformer/the_little_probe/sprites/square-red.png b/samples/99_genre_platformer/the_little_probe/sprites/square-red.png
new file mode 100644
index 0000000..3ed5f13
--- /dev/null
+++ b/samples/99_genre_platformer/the_little_probe/sprites/square-red.png
Binary files differ
diff --git a/samples/99_genre_platformer/the_little_probe/sprites/square-violet.png b/samples/99_genre_platformer/the_little_probe/sprites/square-violet.png
new file mode 100644
index 0000000..333540c
--- /dev/null
+++ b/samples/99_genre_platformer/the_little_probe/sprites/square-violet.png
Binary files differ
diff --git a/samples/99_genre_platformer/the_little_probe/sprites/square-white.png b/samples/99_genre_platformer/the_little_probe/sprites/square-white.png
new file mode 100644
index 0000000..378c565
--- /dev/null
+++ b/samples/99_genre_platformer/the_little_probe/sprites/square-white.png
Binary files differ
diff --git a/samples/99_genre_platformer/the_little_probe/sprites/square-yellow.png b/samples/99_genre_platformer/the_little_probe/sprites/square-yellow.png
new file mode 100644
index 0000000..0edeeec
--- /dev/null
+++ b/samples/99_genre_platformer/the_little_probe/sprites/square-yellow.png
Binary files differ
diff --git a/samples/99_genre_platformer/the_little_probe/sprites/whisp.png b/samples/99_genre_platformer/the_little_probe/sprites/whisp.png
new file mode 100644
index 0000000..07154ee
--- /dev/null
+++ b/samples/99_genre_platformer/the_little_probe/sprites/whisp.png
Binary files differ