From a1b8552ae442d1fa22df1e569652eb99750dcebf Mon Sep 17 00:00:00 2001 From: Amir Rajan Date: Sat, 7 Aug 2021 00:18:49 -0500 Subject: Sync core oss engine files. --- dragon/draw.rb | 234 ++++++++++++--------------------------------------------- 1 file changed, 50 insertions(+), 184 deletions(-) (limited to 'dragon/draw.rb') diff --git a/dragon/draw.rb b/dragon/draw.rb index 128624d..7136994 100644 --- a/dragon/draw.rb +++ b/dragon/draw.rb @@ -1,4 +1,4 @@ -# Contributors outside of DragonRuby who also hold Copyright: Nick Sandberg +# coding: utf-8 # Copyright 2019 DragonRuby LLC # MIT License # draw.rb has been released under MIT (*only this file*). @@ -6,197 +6,44 @@ module GTK class Runtime module Draw - - def execute_draw_order pass - # Don't change this draw order unless you understand - # the implications. - render_solids pass - render_static_solids pass - render_sprites pass - render_static_sprites pass - render_primitives pass - render_static_primitives pass - render_labels pass - render_static_labels pass - render_lines pass - render_static_lines pass - render_borders pass - render_static_borders pass - end - def primitives pass if $top_level.respond_to? :primitives_override return $top_level.tick_render @args, pass end - execute_draw_order pass + fn.each_send pass.solids, self, :draw_solid + fn.each_send pass.static_solids, self, :draw_solid + fn.each_send pass.sprites, self, :draw_sprite + fn.each_send pass.static_sprites, self, :draw_sprite + fn.each_send pass.primitives, self, :draw_primitive + fn.each_send pass.static_primitives, self, :draw_primitive + fn.each_send pass.labels, self, :draw_label + fn.each_send pass.static_labels, self, :draw_label + fn.each_send pass.lines, self, :draw_line + fn.each_send pass.static_lines, self, :draw_line + fn.each_send pass.borders, self, :draw_border + fn.each_send pass.static_borders, self, :draw_border if !$gtk.production - # pass.debug.each { |r| draw_primitive r } - idx = 0 - length = pass.debug.length - while idx < length - draw_primitive (pass.debug.at idx) - idx += 1 - end - - # pass.static_debug.each { |r| draw_primitive r } - idx = 0 - length = pass.static_debug.length - while idx < length - draw_primitive (pass.static_debug.at idx) - idx += 1 - end + fn.each_send pass.debug, self, :draw_primitive + fn.each_send pass.static_debug, self, :draw_primitive end - # pass.reserved.each { |r| draw_primitive r } - idx = 0 - length = pass.reserved.length - while idx < length - draw_primitive (pass.reserved.at idx) - idx += 1 - end - - # pass.static_reserved.each { |r| draw_primitive r } - idx = 0 - length = pass.static_reserved.length - while idx < length - draw_primitive (pass.static_reserved.at idx) - idx += 1 - end + fn.each_send pass.reserved, self, :draw_primitive + fn.each_send pass.static_reserved, self, :draw_primitive rescue Exception => e pause! pretty_print_exception_and_export! e end - - def render_solids pass - # pass.solids.each { |s| draw_solid s } - # while loops are faster than each with block - idx = 0 - length = pass.solids.length - while idx < pass.solids.length - draw_solid (pass.solids.at idx) # accessing an array using .value instead of [] is faster - idx += 1 - end - end - - def render_static_solids pass - # pass.static_solids.each { |s| draw_solid s } - idx = 0 - length = pass.static_solids.length - while idx < length - draw_solid (pass.static_solids.at idx) - idx += 1 - end - end - - def render_sprites pass - # pass.sprites.each { |s| draw_sprite s } - idx = 0 - length = pass.sprites.length - while idx < length - draw_sprite (pass.sprites.at idx) - idx += 1 - end - end - - def render_static_sprites pass - # pass.static_sprites.each { |s| draw_sprite s } - idx = 0 - length = pass.static_sprites.length - while idx < length - draw_sprite (pass.static_sprites.at idx) - idx += 1 - end - end - - def render_primitives pass - # pass.primitives.each { |p| draw_primitive p } - idx = 0 - length = pass.primitives.length - while idx < length - draw_primitive (pass.primitives.at idx) - idx += 1 - end - end - - def render_static_primitives pass - # pass.static_primitives.each { |p| draw_primitive p } - idx = 0 - length = pass.static_primitives.length - while idx < length - draw_primitive (pass.static_primitives.at idx) - idx += 1 - end - end - - def render_labels pass - # pass.labels.each { |l| draw_label l } - idx = 0 - length = pass.labels.length - while idx < length - draw_label (pass.labels.at idx) - idx += 1 - end - end - - def render_static_labels pass - # pass.static_labels.each { |l| draw_label l } - idx = 0 - length = pass.static_labels.length - while idx < length - draw_label (pass.static_labels.at idx) - idx += 1 - end - end - - def render_lines pass - # pass.lines.each { |l| draw_line l } - idx = 0 - length = pass.lines.length - while idx < length - draw_line (pass.lines.at idx) - idx += 1 - end - end - - def render_static_lines pass - # pass.static_lines.each { |l| draw_line l } - idx = 0 - length = pass.static_lines.length - while idx < pass.static_lines.length - draw_line (pass.static_lines.at idx) - idx += 1 - end - end - - def render_borders pass - # pass.borders.each { |b| draw_border b } - idx = 0 - length = pass.borders.length - while idx < length - draw_border (pass.borders.at idx) - idx += 1 - end - end - - def render_static_borders pass - # pass.static_borders.each { |b| draw_border b } - idx = 0 - length = pass.static_borders.length - while idx < length - draw_border (pass.static_borders.at idx) - idx += 1 - end - end - def draw_solid s return unless s if s.respond_to? :draw_override s.draw_override @ffi_draw else - @ffi_draw.draw_solid s.x, s.y, s.w, s.h, s.r, s.g, s.b, s.a + @ffi_draw.draw_solid_2 s.x, s.y, s.w, s.h, + s.r, s.g, s.b, s.a, + (s.blendmode_enum || 1) end rescue Exception => e raise_conversion_for_rendering_failed s, e, :solid @@ -207,14 +54,15 @@ module GTK if s.respond_to? :draw_override s.draw_override @ffi_draw else - @ffi_draw.draw_sprite_3 s.x, s.y, s.w, s.h, - s.path.s_or_default, + @ffi_draw.draw_sprite_4 s.x, s.y, s.w, s.h, + (s.path || '').to_s, s.angle, s.a, s.r, s.g, s.b, s.tile_x, s.tile_y, s.tile_w, s.tile_h, !!s.flip_horizontally, !!s.flip_vertically, s.angle_anchor_x, s.angle_anchor_y, - s.source_x, s.source_y, s.source_w, s.source_h + s.source_x, s.source_y, s.source_w, s.source_h, + (s.blendmode_enum || 1) end rescue Exception => e raise_conversion_for_rendering_failed s, e, :sprite @@ -225,7 +73,7 @@ module GTK if s.respond_to? :draw_override s.draw_override @ffi_draw else - @ffi_draw.draw_screenshot s.path.s_or_default, + @ffi_draw.draw_screenshot (s.path || '').to_s, s.x, s.y, s.w, s.h, s.angle, s.a, s.r, s.g, s.b, @@ -243,10 +91,13 @@ module GTK if l.respond_to? :draw_override l.draw_override @ffi_draw else - @ffi_draw.draw_label l.x, l.y, l.text.s_or_default, - l.size_enum, l.alignment_enum, - l.r, l.g, l.b, l.a, - l.font.s_or_default(nil) + @ffi_draw.draw_label_3 l.x, l.y, + (l.text || '').to_s, + l.size_enum, l.alignment_enum, + l.r, l.g, l.b, l.a, + l.font, + (l.vertical_alignment_enum || 2), + (l.blendmode_enum || 1) end rescue Exception => e raise_conversion_for_rendering_failed l, e, :label @@ -257,7 +108,21 @@ module GTK if l.respond_to? :draw_override l.draw_override @ffi_draw else - @ffi_draw.draw_line l.x, l.y, l.x2, l.y2, l.r, l.g, l.b, l.a + if l.x2 + @ffi_draw.draw_line_2 l.x, l.y, l.x2, l.y2, + l.r, l.g, l.b, l.a, + (l.blendmode_enum || 1) + else + w = l.w || 0 + w = 1 if w == 0 + h = l.h || 0 + h = 1 if h == 0 + @ffi_draw.draw_line_2 l.x, l.y, + l.x + w - 1, + l.y + h - 1, + l.r, l.g, l.b, l.a, + (l.blendmode_enum || 1) + end end rescue Exception => e raise_conversion_for_rendering_failed l, e, :line @@ -268,7 +133,9 @@ module GTK if s.respond_to? :draw_override s.draw_override @ffi_draw else - @ffi_draw.draw_border s.x, s.y, s.w, s.h, s.r, s.g, s.b, s.a + @ffi_draw.draw_border_2 s.x, s.y, s.w, s.h, + s.r, s.g, s.b, s.a, + (s.blendmode_enum || 1) end rescue Exception => e raise_conversion_for_rendering_failed s, e, :border @@ -288,7 +155,6 @@ module GTK pause! pretty_print_exception_and_export! e end - end end end -- cgit v1.2.3 From eaa29e72939f5edf61735ccbb73c36ee89369f65 Mon Sep 17 00:00:00 2001 From: Amir Rajan Date: Fri, 10 Dec 2021 00:09:48 -0600 Subject: Synced with DragonRuby Game Toolkit v3.2. --- docs/docs.css | 12 +- docs/docs.html | 2838 +- docs/docs.txt | 3724 +- docs/parse_log.txt | 54535 +++++++++++-------- docs/todo/05-sprites.md | 20 +- dragon/args.rb | 2 + dragon/benchmark.rb | 3 +- dragon/console.rb | 99 +- dragon/docs.rb | 2 +- dragon/draw.rb | 8 +- dragon/easing.rb | 4 +- dragon/framerate.rb | 2 +- dragon/geometry.rb | 34 +- dragon/inputs.rb | 3 +- dragon/ios_wizard.rb | 78 +- dragon/numeric.rb | 104 - dragon/outputs_docs.rb | 16 +- dragon/runtime_docs.rb | 38 +- dragon/tweetcart.rb | 4 +- .../02_input_basics/01_moving_a_sprite/replay.txt | 73 + .../06_box_collision_3/app/main.rb | 12 +- .../07_jump_physics/app/main.rb | 10 +- samples/05_mouse/01_mouse_click/app/main.rb | 16 +- samples/05_mouse/02_mouse_move/app/main.rb | 2 +- samples/05_mouse/04_coordinate_systems/app/main.rb | 4 +- .../07_advanced_audio/01_audio_mixer/app/main.rb | 5 +- .../01_audio_mixer/sounds/drum.mp3 | Bin 0 -> 55090 bytes .../00_labels_with_wrapped_text/app/main.rb | 88 + .../00_labels_with_wrapped_text/replay.txt | 93 + .../00_rotating_label/app/main.rb | 32 + .../08_splitscreen_camera/app/main.rb | 35 +- .../03_sprites_as_struct/app/main.rb | 82 + .../03_sprites_as_struct/license-for-sample.txt | 9 + .../03_sprites_as_struct/sprites/tiny-star.png | Bin 0 -> 112 bytes .../04_sprites_as_strict_entities/app/main.rb | 72 + .../license-for-sample.txt | 9 + .../sprites/tiny-star.png | Bin 0 -> 112 bytes .../05_sprites_as_classes/app/main.rb | 55 + .../05_sprites_as_classes/license-for-sample.txt | 9 + .../05_sprites_as_classes/sprites/tiny-star.png | Bin 0 -> 112 bytes .../06_static_sprites_as_classes/app/main.rb | 56 + .../license-for-sample.txt | 9 + .../sprites/tiny-star.png | Bin 0 -> 112 bytes .../app/main.rb | 88 + .../license-for-sample.txt | 9 + .../sprites/tiny-star.png | Bin 0 -> 112 bytes .../09_performance/08_collision_limits/app/main.rb | 55 + .../08_collision_limits/license-for-sample.txt | 9 + .../10_advanced_debugging/00_logging/app/main.rb | 19 + samples/11_http/01_retrieve_images/app/main.rb | 4 +- .../02_in_game_web_server_http_get/app/main.rb | 28 + .../license-for-sample.txt | 9 + .../03_in_game_web_server_http_post/app/main.rb | 72 + .../03_in_game_web_server_http_post/replay.txt | 415 + samples/12_c_extensions/.gitignore | 2 + .../01_basics/native/ext-bindings.c | 37 +- .../02_intermediate/native/re-bindings.c | 67 +- .../03_native_pixel_arrays/native/ext-bindings.c | 37 +- .../01_breadth_first_search/replay.txt | 203 + .../02_detailed_breadth_first_search/replay.txt | 241 + .../03_breadcrumbs/app/main.rb | 136 +- .../03_breadcrumbs/replay.txt | 365 + .../04_early_exit/app/main.rb | 204 +- .../04_early_exit/replay.txt | 364 + .../05_dijkstra/app/main.rb | 218 +- .../05_dijkstra/replay.txt | 686 + .../06_heuristic/app/main.rb | 2 +- .../06_heuristic/replay.txt | 719 + .../07_heuristic_with_walls/app/main.rb | 2 +- .../07_heuristic_with_walls/replay.txt | 352 + .../08_a_star/app/main.rb | 258 +- .../08_a_star/replay.txt | 434 + samples/99_genre_3d/02_wireframe/replay.txt | 242 + samples/99_genre_3d/03_yaw_pitch_roll/app/main.rb | 351 + samples/99_genre_3d/03_yaw_pitch_roll/replay.txt | 361 + samples/99_genre_arcade/bullet_hell/replay.txt | 126 + samples/99_genre_arcade/flappy_dragon/app/main.rb | 97 +- samples/99_genre_arcade/twinstick/replay.txt | 174 + .../farming_game_starting_point/replay.txt | 170 + samples/99_genre_crafting/replay.txt | 170 + .../99_genre_dungeon_crawl/classics_jam/replay.txt | 197 + samples/99_genre_mario/01_jumping/app/main.rb | 78 + samples/99_genre_mario/01_jumping/replay.txt | 52 + .../01_jumping/sprites/square/red.png | Bin 0 -> 335 bytes .../02_jumping_and_collisions/app/main.rb | 281 + .../02_jumping_and_collisions/replay.txt | 159 + .../sprites/square/red.png | Bin 0 -> 335 bytes .../sprites/square/white.png | Bin 0 -> 325 bytes .../99_genre_platformer/clepto_frog/app/main.rb | 171 +- samples/99_genre_platformer/clepto_frog/app/map.rb | 5 + samples/99_genre_platformer/clepto_frog/replay.txt | 249 + .../the_little_probe/app/main.rb | 10 +- .../the_little_probe/bug-replay.txt | 205 + .../01_roguelike_starting_point/replay.txt | 196 + .../topdown_casino/app/main.rb | 139 + .../topdown_casino/license-for-sample.txt | 9 + .../99_genre_rpg_topdown/topdown_casino/replay.txt | 123 + .../topdown_casino/sprites/fire.png | Bin 0 -> 893 bytes .../topdown_casino/sprites/gem200.png | Bin 0 -> 916 bytes .../topdown_casino/sprites/gem400.png | Bin 0 -> 920 bytes .../topdown_casino/sprites/herodown100.png | Bin 0 -> 3600 bytes .../topdown_casino/sprites/herodown200.png | Bin 0 -> 3600 bytes .../topdown_casino/sprites/heroleft100.png | Bin 0 -> 3600 bytes .../topdown_casino/sprites/heroleft200.png | Bin 0 -> 3600 bytes .../topdown_casino/sprites/heroright100.png | Bin 0 -> 3600 bytes .../topdown_casino/sprites/heroright200.png | Bin 0 -> 3600 bytes .../topdown_casino/sprites/heroup100.png | Bin 0 -> 3600 bytes .../topdown_casino/sprites/heroup200.png | Bin 0 -> 3600 bytes .../topdown_casino/sprites/oldman.png | Bin 0 -> 967 bytes .../teenytiny_starting_point/app/main.rb | 162 + .../teenytiny_starting_point/license.txt | 9 + .../sprites/square-green.png | Bin 0 -> 283 bytes .../sprites/square-red.png | Bin 0 -> 274 bytes 113 files changed, 45537 insertions(+), 25431 deletions(-) create mode 100644 samples/02_input_basics/01_moving_a_sprite/replay.txt create mode 100644 samples/07_advanced_audio/01_audio_mixer/sounds/drum.mp3 create mode 100644 samples/07_advanced_rendering/00_labels_with_wrapped_text/app/main.rb create mode 100644 samples/07_advanced_rendering/00_labels_with_wrapped_text/replay.txt create mode 100644 samples/07_advanced_rendering/00_rotating_label/app/main.rb create mode 100644 samples/09_performance/03_sprites_as_struct/app/main.rb create mode 100644 samples/09_performance/03_sprites_as_struct/license-for-sample.txt create mode 100644 samples/09_performance/03_sprites_as_struct/sprites/tiny-star.png create mode 100644 samples/09_performance/04_sprites_as_strict_entities/app/main.rb create mode 100644 samples/09_performance/04_sprites_as_strict_entities/license-for-sample.txt create mode 100644 samples/09_performance/04_sprites_as_strict_entities/sprites/tiny-star.png create mode 100644 samples/09_performance/05_sprites_as_classes/app/main.rb create mode 100644 samples/09_performance/05_sprites_as_classes/license-for-sample.txt create mode 100644 samples/09_performance/05_sprites_as_classes/sprites/tiny-star.png create mode 100644 samples/09_performance/06_static_sprites_as_classes/app/main.rb create mode 100644 samples/09_performance/06_static_sprites_as_classes/license-for-sample.txt create mode 100644 samples/09_performance/06_static_sprites_as_classes/sprites/tiny-star.png create mode 100644 samples/09_performance/07_static_sprites_as_classes_with_custom_drawing/app/main.rb create mode 100644 samples/09_performance/07_static_sprites_as_classes_with_custom_drawing/license-for-sample.txt create mode 100644 samples/09_performance/07_static_sprites_as_classes_with_custom_drawing/sprites/tiny-star.png create mode 100644 samples/09_performance/08_collision_limits/app/main.rb create mode 100644 samples/09_performance/08_collision_limits/license-for-sample.txt create mode 100644 samples/10_advanced_debugging/00_logging/app/main.rb create mode 100644 samples/11_http/02_in_game_web_server_http_get/app/main.rb create mode 100644 samples/11_http/02_in_game_web_server_http_get/license-for-sample.txt create mode 100644 samples/11_http/03_in_game_web_server_http_post/app/main.rb create mode 100644 samples/11_http/03_in_game_web_server_http_post/replay.txt create mode 100644 samples/12_c_extensions/.gitignore create mode 100644 samples/13_path_finding_algorithms/01_breadth_first_search/replay.txt create mode 100644 samples/13_path_finding_algorithms/02_detailed_breadth_first_search/replay.txt create mode 100644 samples/13_path_finding_algorithms/03_breadcrumbs/replay.txt create mode 100644 samples/13_path_finding_algorithms/04_early_exit/replay.txt create mode 100644 samples/13_path_finding_algorithms/05_dijkstra/replay.txt create mode 100644 samples/13_path_finding_algorithms/06_heuristic/replay.txt create mode 100644 samples/13_path_finding_algorithms/07_heuristic_with_walls/replay.txt create mode 100644 samples/13_path_finding_algorithms/08_a_star/replay.txt create mode 100644 samples/99_genre_3d/02_wireframe/replay.txt create mode 100644 samples/99_genre_3d/03_yaw_pitch_roll/app/main.rb create mode 100644 samples/99_genre_3d/03_yaw_pitch_roll/replay.txt create mode 100644 samples/99_genre_arcade/bullet_hell/replay.txt create mode 100644 samples/99_genre_arcade/twinstick/replay.txt create mode 100644 samples/99_genre_crafting/farming_game_starting_point/replay.txt create mode 100644 samples/99_genre_crafting/replay.txt create mode 100644 samples/99_genre_dungeon_crawl/classics_jam/replay.txt create mode 100644 samples/99_genre_mario/01_jumping/app/main.rb create mode 100644 samples/99_genre_mario/01_jumping/replay.txt create mode 100644 samples/99_genre_mario/01_jumping/sprites/square/red.png create mode 100644 samples/99_genre_mario/02_jumping_and_collisions/app/main.rb create mode 100644 samples/99_genre_mario/02_jumping_and_collisions/replay.txt create mode 100644 samples/99_genre_mario/02_jumping_and_collisions/sprites/square/red.png create mode 100644 samples/99_genre_mario/02_jumping_and_collisions/sprites/square/white.png create mode 100644 samples/99_genre_platformer/clepto_frog/replay.txt create mode 100644 samples/99_genre_platformer/the_little_probe/bug-replay.txt create mode 100644 samples/99_genre_rpg_roguelike/01_roguelike_starting_point/replay.txt create mode 100644 samples/99_genre_rpg_topdown/topdown_casino/app/main.rb create mode 100644 samples/99_genre_rpg_topdown/topdown_casino/license-for-sample.txt create mode 100644 samples/99_genre_rpg_topdown/topdown_casino/replay.txt create mode 100644 samples/99_genre_rpg_topdown/topdown_casino/sprites/fire.png create mode 100644 samples/99_genre_rpg_topdown/topdown_casino/sprites/gem200.png create mode 100644 samples/99_genre_rpg_topdown/topdown_casino/sprites/gem400.png create mode 100644 samples/99_genre_rpg_topdown/topdown_casino/sprites/herodown100.png create mode 100644 samples/99_genre_rpg_topdown/topdown_casino/sprites/herodown200.png create mode 100644 samples/99_genre_rpg_topdown/topdown_casino/sprites/heroleft100.png create mode 100644 samples/99_genre_rpg_topdown/topdown_casino/sprites/heroleft200.png create mode 100644 samples/99_genre_rpg_topdown/topdown_casino/sprites/heroright100.png create mode 100644 samples/99_genre_rpg_topdown/topdown_casino/sprites/heroright200.png create mode 100644 samples/99_genre_rpg_topdown/topdown_casino/sprites/heroup100.png create mode 100644 samples/99_genre_rpg_topdown/topdown_casino/sprites/heroup200.png create mode 100644 samples/99_genre_rpg_topdown/topdown_casino/sprites/oldman.png create mode 100644 samples/99_genre_teenytiny/teenytiny_starting_point/app/main.rb create mode 100644 samples/99_genre_teenytiny/teenytiny_starting_point/license.txt create mode 100644 samples/99_genre_teenytiny/teenytiny_starting_point/sprites/square-green.png create mode 100644 samples/99_genre_teenytiny/teenytiny_starting_point/sprites/square-red.png (limited to 'dragon/draw.rb') diff --git a/docs/docs.css b/docs/docs.css index 115fd34..84cd977 100644 --- a/docs/docs.css +++ b/docs/docs.css @@ -127,30 +127,30 @@ blockquote { font-style: italic; } -#toc { +#table-of-contents { font-size: 14px; } -#toc ul { +#table-of-contents ul { margin-left: 3px; padding-left: 15px; } -#toc .header-1 { +#table-of-contents .header-1 { display: inline-block; margin-top: 10px; font-weight: 900; } -#toc .header-2 { +#table-of-contents .header-2 { display: inline-block; padding-left: 5px; padding-right: 5px; margin-top: 10px; } -#toc .header-3 { +#table-of-contents .header-3 { } @media only screen and (min-width: 1280px) { @@ -160,7 +160,7 @@ blockquote { padding-left: 310px; } - #toc { + #table-of-contents { border: solid 1px #f0f0f0; padding: 10px; padding-bottom: 30px; diff --git a/docs/docs.html b/docs/docs.html index 6967368..67cd054 100644 --- a/docs/docs.html +++ b/docs/docs.html @@ -2,10 +2,10 @@ DragonRuby Game Toolkit Documentation - + -
+

Table Of Contents

+

DragonRuby Game Toolkit Live Docs

@@ -1765,6 +1766,33 @@ This function takes in two parameters. The first parameter is the file path and end end +

DOCS: GTK::Runtime#benchmark

+

+You can use this function to compare the relative performance of methods. +

+
def tick args
+  # press r to run benchmark
+  if args.inputs.keyboard.key_down.r
+    args.gtk.console.show
+    args.gtk.benchmark iterations: 1000, # number of iterations
+                       # label for experiment
+                       using_numeric_map: -> () {
+                         # experiment body
+                         v = 100.map do |i|
+                           i * 100
+                         end
+                       },
+                       # label for experiment
+                       using_numeric_times: -> () {
+                         # experiment body
+                         v = []
+                         100.times do |i|
+                           v << i * 100
+                         end
+                       }
+  end
+end
+

DOCS: Array

The Array class has been extend to provide methods that will help in common game development tasks. Array is one of the most powerful classes in Ruby and a very fundamental component of Game Toolkit. @@ -4163,7 +4191,7 @@ Reminder: # Use args.inputs.mouse.click.created_at # To see how many frames its been since the click occurred -# Use args.inputs.mouse.click.creat_at_elapsed +# Use args.inputs.mouse.click.created_at_elapsed # Saving the click in args.state can be quite useful @@ -6776,17 +6804,17 @@ class Game end def calc_player_dx - player.y += player.dy - player.dy += state.gravity - player.dy += player.dy * state.drag ** 2 * -1 - end - - def calc_player_dy player.dx = player.dx.clamp(-5, 5) player.dx *= 0.9 player.x += player.dx end + def calc_player_dy + player.y += player.dy + player.dy += state.gravity + player.dy += player.dy * state.drag ** 2 * -1 + end + def reset_player player.x = 100 player.y = 720 @@ -6928,8 +6956,7 @@ class VerticalPlatformer input end - # Sets default values - def defaults + def init_game s.platforms ||= [ # initializes platforms collection with two platforms using hashes new_platform(x: 0, y: 0, w: 700, h: 32, dx: 1, speed: 0, rect: nil), new_platform(x: 0, y: 300, w: 700, h: 32, dx: 1, speed: 0, rect: nil), # 300 pixels higher @@ -6952,6 +6979,11 @@ class VerticalPlatformer s.camera ||= { y: -100 } # shows view on screen (as the player moves upward, the camera does too) end + # Sets default values + def defaults + init_game + end + # Outputs objects onto the screen def render outputs.solids << s.platforms.map do |p| # outputs platforms onto screen @@ -7039,7 +7071,9 @@ class VerticalPlatformer rect: nil) end else + # game over s.as_hash.clear # otherwise clear the hash (no new platform is necessary) + init_game end end @@ -9698,12 +9732,23 @@ class TicTacToe # Starts the game with player x's turn and creates an array (to_a) for space combinations. # Calls methods necessary for the game to run properly. def tick - state.current_turn ||= :x - state.space_combinations = [-1, 0, 1].product([-1, 0, 1]).to_a + init_new_game render_board input_board end + def init_new_game + state.current_turn ||= :x + state.space_combinations ||= [-1, 0, 1].product([-1, 0, 1]).to_a + + state.spaces ||= {} + + state.space_combinations.each do |x, y| + state.spaces[x] ||= {} + state.spaces[x][y] ||= state.new_entity(:space) + end + end + # Uses borders to create grid squares for the game's board. Also outputs the game pieces using labels. def render_board square_size = 80 @@ -9779,6 +9824,7 @@ class TicTacToe def input_restart_game return unless state.game_over gtk.reset + init_new_game end # Checks if x or o won the game. @@ -10093,7 +10139,7 @@ class ProtectThePuppiesFromTheZombies def calc_kill_zombie # Find all zombies that intersect with the player. They are considered killed. - killed_this_frame = state.zombies.find_all { |z| z.sprite.intersect_rect? state.player_sprite } + killed_this_frame = state.zombies.find_all { |z| z.sprite && (z.sprite.intersect_rect? state.player_sprite) } state.zombies = state.zombies - killed_this_frame # remove newly killed zombies from zombies collection state.killed_zombies += killed_this_frame # add newly killed zombies to killed zombies @@ -10989,6 +11035,7 @@ def render_sources args end def playtime_str t + return "" unless t minutes = (t / 60.0).floor seconds = t - (minutes * 60.0).to_f return minutes.to_s + ':' + seconds.floor.to_s + ((seconds - seconds.floor).to_s + "000")[1..3] @@ -11101,7 +11148,7 @@ def panel_primitives args, audio_entry results.playtime_slider_rect = progress_bar(args: args, row: 2.5, col: 2, - percentage: audio_entry.playtime / audio_entry.length_, + percentage: (audio_entry.playtime || 1) / (audio_entry.length_ || 1), text: "#{playtime_str(audio_entry.playtime)} / #{playtime_str(audio_entry.length_)}") results.primitives << results.playtime_slider_rect.primitives @@ -11297,19 +11344,6 @@ end

Advanced Audio - Audio Mixer - server_ip_address.txt

# ./samples/07_advanced_audio/01_audio_mixer/app/server_ip_address.txt
 192.168.1.65
-
-

Advanced Audio - Audio Mixer - Metadata - ios_metadata.txt

-
# ./samples/07_advanced_audio/01_audio_mixer/metadata/ios_metadata.txt
-# ios_metadata.txt is used by the Pro version of DragonRuby Game Toolkit to create iOS apps.
-# Information about the Pro version can be found at: http://dragonruby.org/toolkit/game#purchase
-
-# teamid needs to be set to your assigned Team Id which can be found at https://developer.apple.com/account/#/membership/
-teamid=
-# appid needs to be set to your application identifier which can be found at https://developer.apple.com/account/resources/identifiers/list
-appid=
-# appname is the name you want to show up underneath the app icon on the device. Keep it under 10 characters.
-appname=
-
 

Advanced Audio - Sound Synthesis - main.rb

# ./samples/07_advanced_audio/02_sound_synthesis/app/main.rb
@@ -11907,6 +11941,134 @@ end
 
 $gtk.reset
 
+
+

Advanced Rendering - Labels With Wrapped Text - main.rb

+
# ./samples/07_advanced_rendering/00_labels_with_wrapped_text/app/main.rb
+def tick args
+  # defaults
+  args.state.scroll_location  ||= 0
+  args.state.textbox.messages ||= []
+  args.state.textbox.scroll   ||= 0
+
+  # render
+  args.outputs.background_color = [0, 0, 0, 255]
+  render_messages args
+  render_instructions args
+
+  # inputs
+  if args.inputs.keyboard.key_down.one
+    queue_message args, "Hello there neighbour! my name is mark, how is your day today?"
+  end
+
+  if args.inputs.keyboard.key_down.two
+    queue_message args, "I'm doing great sir, actually I'm having a picnic today"
+  end
+
+  if args.inputs.keyboard.key_down.three
+    queue_message args, "Well that sounds wonderful!"
+  end
+
+  if args.inputs.keyboard.key_down.home
+    args.state.scroll_location = 1
+  end
+
+  if args.inputs.keyboard.key_down.delete
+    clear_message_queue args
+  end
+end
+
+def queue_message args, msg
+  args.state.textbox.messages.concat msg.wrapped_lines 50
+end
+
+def clear_message_queue args
+  args.state.textbox.messages = nil
+  args.state.textbox.scroll = 0
+end
+
+def render_messages args
+  args.outputs[:textbox].w = 400
+  args.outputs[:textbox].h = 720
+
+  args.outputs.primitives << args.state.textbox.messages.each_with_index.map do |s, idx|
+    {
+      x: 0,
+      y: 20 * (args.state.textbox.messages.size - idx) + args.state.textbox.scroll * 20,
+      text: s,
+      size_enum: -3,
+      alignment_enum: 0,
+      r: 255, g:255, b: 255, a: 255
+    }
+  end
+
+  args.outputs[:textbox].labels << args.state.textbox.messages.each_with_index.map do |s, idx|
+    {
+      x: 0,
+      y: 20 * (args.state.textbox.messages.size - idx) + args.state.textbox.scroll * 20,
+      text: s,
+      size_enum: -3,
+      alignment_enum: 0,
+      r: 255, g:255, b: 255, a: 255
+    }
+  end
+
+  args.outputs[:textbox].borders << [0, 0, args.outputs[:textbox].w, 720]
+
+  args.state.textbox.scroll += args.inputs.mouse.wheel.y unless args.inputs.mouse.wheel.nil?
+
+  if args.state.scroll_location > 0
+    args.state.textbox.scroll = 0
+    args.state.scroll_location = 0
+  end
+
+  args.outputs.sprites << [900, 0, args.outputs[:textbox].w, 720, :textbox]
+end
+
+def render_instructions args
+  args.outputs.labels << [30,
+                          30.from_top,
+                          "press 1, 2, 3 to display messages, MOUSE WHEEL to scroll, HOME to go to top, BACKSPACE to delete.",
+                          0, 255, 255]
+
+  args.outputs.primitives << [0, 55.from_top, 1280, 30, :pixel, 0, 255, 0, 0, 0].sprite
+end
+
+
+

Advanced Rendering - Rotating Label - main.rb

+
# ./samples/07_advanced_rendering/00_rotating_label/app/main.rb
+def tick args
+  # set the render target width and height to match the label
+  args.outputs[:scene].w = 220
+  args.outputs[:scene].h = 30
+
+
+  # make the background transparent
+  args.outputs[:scene].background_color = [255, 255, 255, 0]
+
+  # set the blendmode of the label to 0 (no blending)
+  # center it inside of the scene
+  # set the vertical_alignment_enum to 1 (center)
+  args.outputs[:scene].labels  << { x: 0,
+                                    y: 15,
+                                    text: "label in render target",
+                                    blendmode_enum: 0,
+                                    vertical_alignment_enum: 1 }
+
+  # add a border to the render target
+  args.outputs[:scene].borders << { x: 0,
+                                    y: 0,
+                                    w: args.outputs[:scene].w,
+                                    h: args.outputs[:scene].h }
+
+  # add the rendertarget to the main output as a sprite
+  args.outputs.sprites << { x: 640 - args.outputs[:scene].w.half,
+                            y: 360 - args.outputs[:scene].h.half,
+                            w: args.outputs[:scene].w,
+                            h: args.outputs[:scene].h,
+                            angle: args.state.tick_count,
+                            path: :scene }
+end
+
 

Advanced Rendering - Simple Render Targets - main.rb

# ./samples/07_advanced_rendering/01_simple_render_targets/app/main.rb
@@ -13146,6 +13308,7 @@ class CameraMovement
     default_camera(0,0,1280,720)
   end
 
+
   def new_room
     default_floor_tile(0,0,1024,1024,'sprites/rooms/camera_room.png')
   end
@@ -14244,9 +14407,95 @@ def reset_with count: count
   $gtk.args.state.star_count = count
 end
 
+
+

Performance - Sprites As Struct - main.rb

+
# ./samples/09_performance/03_sprites_as_struct/app/main.rb
+# create a Struct variant that allows for named parameters on construction.
+class NamedStruct < Struct
+  def initialize **opts
+    super(*members.map { |k| opts[k] })
+  end
+end
+
+# create a Star NamedStruct
+Star = NamedStruct.new(:x, :y, :w, :h, :path, :s,
+                       :angle, :angle_anchor_x, :angle_anchor_y,
+                       :r, :g, :b, :a,
+                       :tile_x, :tile_y,
+                       :tile_w, :tile_h,
+                       :source_x, :source_y,
+                       :source_w, :source_h,
+                       :flip_horizontally, :flip_vertically,
+                       :blendmode_enum)
+
+# Sprites represented as Structs. They require a little bit more code than Hashes,
+# but are the a little faster to render too.
+def random_x args
+  (args.grid.w.randomize :ratio) * -1
+end
+
+def random_y args
+  (args.grid.h.randomize :ratio) * -1
+end
+
+def random_speed
+  1 + (4.randomize :ratio)
+end
+
+def new_star args
+  Star.new x: (random_x args),
+           y: (random_y args),
+           w: 4, h: 4,
+           path: 'sprites/tiny-star.png',
+           s: random_speed
+end
+
+def move_star args, star
+  star.x += star[:s]
+  star.y += star[:s]
+  if star.x > args.grid.w || star.y > args.grid.h
+    star.x = (random_x args)
+    star.y = (random_y args)
+    star[:s] = random_speed
+  end
+end
+
+def tick args
+  args.state.star_count ||= 0
+
+  # sets console command when sample app initially opens
+  if Kernel.global_tick_count == 0
+    puts ""
+    puts ""
+    puts "========================================================="
+    puts "* INFO: Sprites, Structs"
+    puts "* INFO: Please specify the number of sprites to render."
+    args.gtk.console.set_command "reset_with count: 100"
+  end
+
+  # init
+  if args.state.tick_count == 0
+    args.state.stars = args.state.star_count.map { |i| new_star args }
+  end
+
+  # update
+  args.state.stars.each { |s| move_star args, s }
+
+  # render
+  args.outputs.sprites << args.state.stars
+  args.outputs.background_color = [0, 0, 0]
+  args.outputs.primitives << args.gtk.current_framerate_primitives
+end
+
+# resets game, and assigns star count given by user
+def reset_with count: count
+  $gtk.reset
+  $gtk.args.state.star_count = count
+end
+
 

Performance - Sprites As Strict Entities - main.rb

-
# ./samples/09_performance/03_sprites_as_strict_entities/app/main.rb
+
# ./samples/09_performance/04_sprites_as_strict_entities/app/main.rb
 # Sprites represented as StrictEntities using the queue ~args.outputs.sprites~
 # yields apis access similar to Entities, but all properties that can be set on the
 # entity must be predefined with a default value. Strict entities do not support the
@@ -14322,7 +14571,7 @@ end
 
 

Performance - Sprites As Classes - main.rb

-
# ./samples/09_performance/04_sprites_as_classes/app/main.rb
+
# ./samples/09_performance/05_sprites_as_classes/app/main.rb
 # Sprites represented as Classes using the queue ~args.outputs.sprites~.
 # gives you full control of property declaration and method invocation.
 # They are more performant than OpenEntities and StrictEntities, but more code upfront.
@@ -14381,7 +14630,7 @@ end
 
 

Performance - Static Sprites As Classes - main.rb

-
# ./samples/09_performance/05_static_sprites_as_classes/app/main.rb
+
# ./samples/09_performance/06_static_sprites_as_classes/app/main.rb
 # Sprites represented as Classes using the queue ~args.outputs.static_sprites~.
 # bypasses the queue behavior of ~args.outputs.sprites~. All instances are held
 # by reference. You get better performance, but you are mutating state of held objects
@@ -14441,7 +14690,7 @@ end
 
 

Performance - Static Sprites As Classes With Custom Drawing - main.rb

-
# ./samples/09_performance/06_static_sprites_as_classes_with_custom_drawing/app/main.rb
+
# ./samples/09_performance/07_static_sprites_as_classes_with_custom_drawing/app/main.rb
 # Sprites represented as Classes, with a draw_override method, and using the queue ~args.outputs.static_sprites~.
 # is the fastest approach. This is comparable to what other game engines set as the default behavior.
 # There are tradeoffs for all this speed if the creation of a full blown class, and bypassing
@@ -14533,7 +14782,7 @@ end
 
 

Performance - Collision Limits - main.rb

-
# ./samples/09_performance/07_collision_limits/app/main.rb
+
# ./samples/09_performance/08_collision_limits/app/main.rb
 =begin
 
  Reminders:
@@ -14590,6 +14839,29 @@ end
 # Resets the game.
 $gtk.reset
 
+
+

Advanced Debugging - Logging - main.rb

+
# ./samples/10_advanced_debugging/00_logging/app/main.rb
+def tick args
+  args.outputs.background_color = [255, 255, 255, 0]
+  if args.state.tick_count == 0
+    args.gtk.log_spam "log level spam"
+    args.gtk.log_debug "log level debug"
+    args.gtk.log_info "log level info"
+    args.gtk.log_warn "log level warn"
+    args.gtk.log_error "log level error"
+    args.gtk.log_unfiltered "log level unfiltered"
+    puts "This is a puts call"
+    args.gtk.console.show
+  end
+
+  if args.state.tick_count == 60
+    puts "This is a puts call on tick 60"
+  elsif args.state.tick_count == 120
+    puts "This is a puts call on tick 120"
+  end
+end
+
 

Advanced Debugging - Trace Debugging - main.rb

# ./samples/10_advanced_debugging/01_trace_debugging/app/main.rb
@@ -15407,12 +15679,12 @@ def test_serialize args, assert
   GTK::Entity.__reset_id__!
   args.state.player_one = "test"
   result = args.gtk.serialize_state args.state
-  assert.equal! result, "{:entity_id=>3, :entity_keys_by_ref=>{}, :tick_count=>-1, :player_one=>\"test\"}"
+  assert.equal! result, "{:entity_id=>4, :entity_keys_by_ref=>{}, :tick_count=>-1, :player_one=>\"test\"}"
 
   GTK::Entity.__reset_id__!
   args.gtk.write_file 'state.txt', ''
   result = args.gtk.serialize_state 'state.txt', args.state
-  assert.equal! result, "{:entity_id=>3, :entity_keys_by_ref=>{}, :tick_count=>-1, :player_one=>\"test\"}"
+  assert.equal! result, "{:entity_id=>4, :entity_keys_by_ref=>{}, :tick_count=>-1, :player_one=>\"test\"}"
 end
 
 def test_deserialize args, assert
@@ -15461,7 +15733,7 @@ def test_strict_entity_serialization_with_nil args, assert
   args.state.player_two = args.state.new_entity_strict(:player_strict, name: "Ken", blood_type: nil)
 
   serialized_state = args.gtk.serialize_state args.state
-  assert.equal! serialized_state, '{:entity_id=>9, :entity_keys_by_ref=>{}, :tick_count=>-1, :player_one=>{:entity_id=>1, :entity_name=>:player, :entity_keys_by_ref=>{}, :entity_type=>:player, :created_at=>-1, :global_created_at=>-1, :name=>"Ryu"}, :player_two=>{:entity_id=>2, :entity_name=>:player_strict, :entity_type=>:player_strict, :created_at=>-1, :global_created_at_elapsed=>-1, :entity_strict=>true, :entity_keys_by_ref=>{:entity_type=>:entity_name, :global_created_at_elapsed=>:created_at}, :name=>"Ken", :blood_type=>nil}}'
+  assert.equal! serialized_state, '{:entity_id=>7, :entity_keys_by_ref=>{}, :tick_count=>-1, :player_one=>{:entity_id=>1, :entity_name=>:player, :entity_keys_by_ref=>{}, :entity_type=>:player, :created_at=>-1, :global_created_at=>-1, :name=>"Ryu"}, :player_two=>{:entity_id=>2, :entity_name=>:player_strict, :entity_type=>:player_strict, :created_at=>-1, :global_created_at_elapsed=>-1, :entity_strict=>true, :entity_keys_by_ref=>{:entity_type=>:entity_name, :global_created_at_elapsed=>:created_at}, :name=>"Ken", :blood_type=>nil}}'
 
   GTK::Entity.__reset_id__!
   deserialized_state = args.gtk.deserialize_state serialized_state
@@ -15519,6 +15791,18 @@ def test_by_reference_state_strict_entities args, assert
   assert.equal! deserialized_state.strict_entity.one, deserialized_state.strict_entity.two
 end
 
+def test_serialization_excludes_thrash_count args, assert
+  GTK::Entity.__reset_id__!
+  args.state.player.name = "Ryu"
+  # force a nil pun
+  if args.state.player.age > 30
+  end
+  assert.equal! args.state.player.as_hash[:__thrash_count__][:>], 1
+  result = args.gtk.serialize_state args.state
+  assert.false! (result.include? "__thrash_count__"),
+                "The __thrash_count__ key exists in state when it shouldn't have."
+end
+
 

Advanced Debugging - Unit Tests - state_serialization_experimental_tests.rb

# ./samples/10_advanced_debugging/03_unit_tests/state_serialization_experimental_tests.rb
@@ -15674,11 +15958,13 @@ end
 

Http - Retrieve Images - main.rb

# ./samples/11_http/01_retrieve_images/app/main.rb
+$gtk.register_cvar 'app.warn_seconds', "seconds to wait before starting", :uint, 11
+
 def tick args
   args.outputs.background_color = [0, 0, 0]
 
   # Show a warning at the start.
-  args.state.warning_debounce ||= 11 * 60
+  args.state.warning_debounce ||= args.cvars['app.warn_seconds'].value * 60
   if args.state.warning_debounce > 0
     args.state.warning_debounce -= 1
     args.outputs.labels << [640, 600, "This app shows random images from the Internet.", 10, 1, 255, 255, 255]
@@ -15729,10 +16015,11 @@ def tick args
 end
 
 
-

Http - Web Server - main.rb

-
# ./samples/11_http/02_web_server/app/main.rb
+

Http - In Game Web Server Http Get - main.rb

+
# ./samples/11_http/02_in_game_web_server_http_get/app/main.rb
 def tick args
   args.state.port ||= 3000
+  args.state.reqnum ||= 0
   # by default the embedded webserver runs on port 9001 (the port number is over 9000) and is disabled in a production build
   # to enable the http server in a production build, you need to manually start
   # the server up:
@@ -15759,6 +16046,82 @@ def tick args
   }
 end
 
+
+

Http - In Game Web Server Http Post - main.rb

+
# ./samples/11_http/03_in_game_web_server_http_post/app/main.rb
+def tick args
+  # defaults
+  args.state.post_button      = args.layout.rect(row: 0, col: 0, w: 5, h: 1).merge(text: "execute http_post")
+  args.state.post_body_button = args.layout.rect(row: 1, col: 0, w: 5, h: 1).merge(text: "execute http_post_body")
+  args.state.request_to_s ||= ""
+  args.state.request_body ||= ""
+
+  # render
+  args.state.post_button.yield_self do |b|
+    args.outputs.borders << b
+    args.outputs.labels  << b.merge(text: b.text,
+                                    y:    b.y + 30,
+                                    x:    b.x + 10)
+  end
+
+  args.state.post_body_button.yield_self do |b|
+    args.outputs.borders << b
+    args.outputs.labels  << b.merge(text: b.text,
+                                    y:    b.y + 30,
+                                    x:    b.x + 10)
+  end
+
+  draw_label args, 0,  6, "Request:", args.state.request_to_s
+  draw_label args, 0, 14, "Request Body Unaltered:", args.state.request_body
+
+  # input
+  if args.inputs.mouse.click
+    # ============= HTTP_POST =============
+    if (args.inputs.mouse.inside_rect? args.state.post_button)
+      # ========= DATA TO SEND ===========
+      form_fields = { "userId" => "#{Time.now.to_i}" }
+      # ==================================
+
+      args.gtk.http_post "http://localhost:9001/testing",
+                         form_fields,
+                         ["Content-Type: application/x-www-form-urlencoded"]
+
+      args.gtk.notify! "http_post"
+    end
+
+    # ============= HTTP_POST_BODY =============
+    if (args.inputs.mouse.inside_rect? args.state.post_body_button)
+      # =========== DATA TO SEND ==============
+      json = "{ \"userId\": \"#{Time.now.to_i}\"}"
+      # ==================================
+
+      args.gtk.http_post_body "http://localhost:9001/testing",
+                              json,
+                              ["Content-Type: application/json", "Content-Length: #{json.length}"]
+
+      args.gtk.notify! "http_post_body"
+    end
+  end
+
+  # calc
+  args.inputs.http_requests.each do |r|
+    puts "#{r}"
+    if r.uri == "/testing"
+      puts r
+      args.state.request_to_s = "#{r}"
+      args.state.request_body = r.raw_body
+      r.respond 200, "ok"
+    end
+  end
+end
+
+def draw_label args, row, col, header, text
+  label_pos = args.layout.rect(row: row, col: col, w: 0, h: 0)
+  args.outputs.labels << "#{header}\n\n#{text}".wrapped_lines(80).map_with_index do |l, i|
+    { x: label_pos.x, y: label_pos.y - (i * 15), text: l, size_enum: -2 }
+  end
+end
+
 

C Extensions - Basics - main.rb

# ./samples/12_c_extensions/01_basics/app/main.rb
@@ -17693,7 +18056,7 @@ def tick args
   end
 
   # Every tick, new args are passed, and the Breadth First Search tick is called
-  $breadcrumbs ||= Breadcrumbs.new(args)
+  $breadcrumbs ||= Breadcrumbs.new
   $breadcrumbs.args = args
   $breadcrumbs.tick
 end
@@ -18342,7 +18705,7 @@ def tick args
   end
 
   # Every tick, new args are passed, and the Breadth First Search tick is called
-  $early_exit_breadth_first_search ||= EarlyExitBreadthFirstSearch.new(args)
+  $early_exit_breadth_first_search ||= EarlyExitBreadthFirstSearch.new
   $early_exit_breadth_first_search.args = args
   $early_exit_breadth_first_search.tick
 end
@@ -19190,7 +19553,7 @@ def tick args
   end
 
   # Every tick, new args are passed, and the Dijkstra tick method is called
-  $movement_costs ||= Movement_Costs.new(args)
+  $movement_costs ||= Movement_Costs.new
   $movement_costs.args = args
   $movement_costs.tick
 end
@@ -20174,7 +20537,7 @@ def tick args
   end
 
   # Every tick, new args are passed, and the Breadth First Search tick is called
-  $heuristic_with_walls ||= Heuristic_With_Walls.new(args)
+  $heuristic_with_walls ||= Heuristic_With_Walls.new
   $heuristic_with_walls.args = args
   $heuristic_with_walls.tick
 end
@@ -21191,7 +21554,7 @@ def tick args
   end
 
   # Every tick, new args are passed, and the Breadth First Search tick is called
-  $heuristic ||= Heuristic.new(args)
+  $heuristic ||= Heuristic.new
   $heuristic.args = args
   $heuristic.tick
 end
@@ -22224,7 +22587,7 @@ def tick args
   end
 
   # Every tick, new args are passed, and the Breadth First Search tick is called
-  $a_star_algorithm ||= A_Star_Algorithm.new(args)
+  $a_star_algorithm ||= A_Star_Algorithm.new
   $a_star_algorithm.args = args
   $a_star_algorithm.tick
 end
@@ -22750,6 +23113,361 @@ end
 

3d - Wireframe - Data - what-is-this.txt

# ./samples/99_genre_3d/02_wireframe/data/what-is-this.txt
 https://en.wikipedia.org/wiki/OFF_(file_format)
+
+

3d - Yaw Pitch Roll - main.rb

+
# ./samples/99_genre_3d/03_yaw_pitch_roll/app/main.rb
+class Game
+  attr_gtk
+
+  def tick
+    defaults
+    render
+    input
+  end
+
+  def matrix_mul m, v
+    (hmap x: ((m.x.x * v.x) + (m.x.y * v.y) + (m.x.z * v.z) + (m.x.w * v.w)),
+          y: ((m.y.x * v.x) + (m.y.y * v.y) + (m.y.z * v.z) + (m.y.w * v.w)),
+          z: ((m.z.x * v.x) + (m.z.y * v.y) + (m.z.z * v.z) + (m.z.w * v.w)),
+          w: ((m.w.x * v.x) + (m.w.y * v.y) + (m.w.z * v.z) + (m.w.w * v.w)))
+  end
+
+  def player_ship
+    [
+      # engine back
+      { x: -1, y: -1, z: 1, w: 0 },
+      { x: -1, y:  1, z: 1, w: 0 },
+
+      { x: -1, y:  1, z: 1, w: 0 },
+      { x:  1, y:  1, z: 1, w: 0 },
+
+      { x:  1, y:  1, z: 1, w: 0 },
+      { x:  1, y: -1, z: 1, w: 0 },
+
+      { x:  1, y: -1, z: 1, w: 0 },
+      { x: -1, y: -1, z: 1, w: 0 },
+
+      # engine front
+      { x: -1, y: -1, z: -1, w: 0 },
+      { x: -1, y:  1, z: -1, w: 0 },
+
+      { x: -1, y:  1, z: -1, w: 0 },
+      { x:  1, y:  1, z: -1, w: 0 },
+
+      { x:  1, y:  1, z: -1, w: 0 },
+      { x:  1, y: -1, z: -1, w: 0 },
+
+      { x:  1, y: -1, z: -1, w: 0 },
+      { x: -1, y: -1, z: -1, w: 0 },
+
+      # engine left
+      { x: -1, z:  -1, y: -1, w: 0 },
+      { x: -1, z:  -1, y:  1, w: 0 },
+
+      { x: -1, z:  -1, y:  1, w: 0 },
+      { x: -1, z:   1, y:  1, w: 0 },
+
+      { x: -1, z:   1, y:  1, w: 0 },
+      { x: -1, z:   1, y: -1, w: 0 },
+
+      { x: -1, z:   1, y: -1, w: 0 },
+      { x: -1, z:  -1, y: -1, w: 0 },
+
+      # engine right
+      { x:  1, z:  -1, y: -1, w: 0 },
+      { x:  1, z:  -1, y:  1, w: 0 },
+
+      { x:  1, z:  -1, y:  1, w: 0 },
+      { x:  1, z:   1, y:  1, w: 0 },
+
+      { x:  1, z:   1, y:  1, w: 0 },
+      { x:  1, z:   1, y: -1, w: 0 },
+
+      { x:  1, z:   1, y: -1, w: 0 },
+      { x:  1, z:  -1, y: -1, w: 0 },
+
+      # top front of engine to front of ship
+      { x:  1, y:   1, z: 1, w: 0 },
+      { x:  0, y:  -1, z: 9, w: 0 },
+
+      { x:  0, y:  -1, z: 9, w: 0 },
+      { x: -1, y:   1, z: 1, w: 0 },
+
+      # bottom front of engine
+      { x:  1, y:  -1, z: 1, w: 0 },
+      { x:  0, y:  -1, z: 9, w: 0 },
+
+      { x: -1, y:  -1, z: 1, w: 0 },
+      { x:  0, y:  -1, z: 9, w: 0 },
+
+      # right wing
+      # front of wing
+      { x: 1, y: 0.10, z:  1, w: 0 },
+      { x: 9, y: 0.10, z: -1, w: 0 },
+
+      { x:  9, y: 0.10, z: -1, w: 0 },
+      { x: 10, y: 0.10, z: -2, w: 0 },
+
+      # back of wing
+      { x: 1, y: 0.10, z: -1, w: 0 },
+      { x: 9, y: 0.10, z: -1, w: 0 },
+
+      { x: 10, y: 0.10, z: -2, w: 0 },
+      { x:  8, y: 0.10, z: -1, w: 0 },
+
+      # front of wing
+      { x: 1, y: -0.10, z:  1, w: 0 },
+      { x: 9, y: -0.10, z: -1, w: 0 },
+
+      { x:  9, y: -0.10, z: -1, w: 0 },
+      { x: 10, y: -0.10, z: -2, w: 0 },
+
+      # back of wing
+      { x: 1, y: -0.10, z: -1, w: 0 },
+      { x: 9, y: -0.10, z: -1, w: 0 },
+
+      { x: 10, y: -0.10, z: -2, w: 0 },
+      { x:  8, y: -0.10, z: -1, w: 0 },
+
+      # left wing
+      # front of wing
+      { x: -1, y: 0.10, z:  1, w: 0 },
+      { x: -9, y: 0.10, z: -1, w: 0 },
+
+      { x: -9, y: 0.10, z: -1, w: 0 },
+      { x: -10, y: 0.10, z: -2, w: 0 },
+
+      # back of wing
+      { x: -1, y: 0.10, z: -1, w: 0 },
+      { x: -9, y: 0.10, z: -1, w: 0 },
+
+      { x: -10, y: 0.10, z: -2, w: 0 },
+      { x: -8, y: 0.10, z: -1, w: 0 },
+
+      # front of wing
+      { x: -1, y: -0.10, z:  1, w: 0 },
+      { x: -9, y: -0.10, z: -1, w: 0 },
+
+      { x: -9, y: -0.10, z: -1, w: 0 },
+      { x: -10, y: -0.10, z: -2, w: 0 },
+
+      # back of wing
+      { x: -1, y: -0.10, z: -1, w: 0 },
+      { x: -9, y: -0.10, z: -1, w: 0 },
+
+      { x: -10, y: -0.10, z: -2, w: 0 },
+      { x: -8, y: -0.10, z: -1, w: 0 },
+
+      # left fin
+      # top
+      { x: -1, y: 0.10, z: 1, w: 0 },
+      { x: -1, y: 3, z: -3, w: 0 },
+
+      { x: -1, y: 0.10, z: -1, w: 0 },
+      { x: -1, y: 3, z: -3, w: 0 },
+
+      { x: -1.1, y: 0.10, z: 1, w: 0 },
+      { x: -1.1, y: 3, z: -3, w: 0 },
+
+      { x: -1.1, y: 0.10, z: -1, w: 0 },
+      { x: -1.1, y: 3, z: -3, w: 0 },
+
+      # bottom
+      { x: -1, y: -0.10, z: 1, w: 0 },
+      { x: -1, y: -2, z: -2, w: 0 },
+
+      { x: -1, y: -0.10, z: -1, w: 0 },
+      { x: -1, y: -2, z: -2, w: 0 },
+
+      { x: -1.1, y: -0.10, z: 1, w: 0 },
+      { x: -1.1, y: -2, z: -2, w: 0 },
+
+      { x: -1.1, y: -0.10, z: -1, w: 0 },
+      { x: -1.1, y: -2, z: -2, w: 0 },
+
+      # right fin
+      { x:  1, y: 0.10, z: 1, w: 0 },
+      { x:  1, y: 3, z: -3, w: 0 },
+
+      { x:  1, y: 0.10, z: -1, w: 0 },
+      { x:  1, y: 3, z: -3, w: 0 },
+
+      { x:  1.1, y: 0.10, z: 1, w: 0 },
+      { x:  1.1, y: 3, z: -3, w: 0 },
+
+      { x:  1.1, y: 0.10, z: -1, w: 0 },
+      { x:  1.1, y: 3, z: -3, w: 0 },
+
+      # bottom
+      { x:  1, y: -0.10, z: 1, w: 0 },
+      { x:  1, y: -2, z: -2, w: 0 },
+
+      { x:  1, y: -0.10, z: -1, w: 0 },
+      { x:  1, y: -2, z: -2, w: 0 },
+
+      { x:  1.1, y: -0.10, z: 1, w: 0 },
+      { x:  1.1, y: -2, z: -2, w: 0 },
+
+      { x:  1.1, y: -0.10, z: -1, w: 0 },
+      { x:  1.1, y: -2, z: -2, w: 0 },
+    ]
+  end
+
+  def defaults
+    state.points ||= player_ship
+    state.shifted_points ||= state.points.map { |point| point }
+
+    state.scale   ||= 1
+    state.angle_x ||= 0
+    state.angle_y ||= 0
+    state.angle_z ||= 0
+  end
+
+  def matrix_new x0, y0, z0, w0, x1, y1, z1, w1, x2, y2, z2, w2, x3, y3, z3, w3
+    (hmap x: (hmap x: x0, y: y0, z: z0, w: w0),
+          y: (hmap x: x1, y: y1, z: z1, w: w1),
+          z: (hmap x: x2, y: y2, z: z2, w: w2),
+          w: (hmap x: x3, y: y3, z: z3, w: w3))
+  end
+
+  def angle_z_matrix degrees
+    cos_t = Math.cos degrees.to_radians
+    sin_t = Math.sin degrees.to_radians
+    (matrix_new cos_t, -sin_t, 0, 0,
+                sin_t,  cos_t, 0, 0,
+                0,      0,     1, 0,
+                0,      0,     0, 1)
+  end
+
+  def angle_y_matrix degrees
+    cos_t = Math.cos degrees.to_radians
+    sin_t = Math.sin degrees.to_radians
+    (matrix_new  cos_t,  0, sin_t, 0,
+                 0,      1, 0,     0,
+                 -sin_t, 0, cos_t, 0,
+                 0,      0, 0,     1)
+  end
+
+  def angle_x_matrix degrees
+    cos_t = Math.cos degrees.to_radians
+    sin_t = Math.sin degrees.to_radians
+    (matrix_new  1,     0,      0, 0,
+                 0, cos_t, -sin_t, 0,
+                 0, sin_t,  cos_t, 0,
+                 0,     0,      0, 1)
+  end
+
+  def scale_matrix factor
+    (matrix_new factor,      0,      0, 0,
+                0,      factor,      0, 0,
+                0,           0, factor, 0,
+                0,           0,      0, 1)
+  end
+
+  def input
+    if (inputs.keyboard.shift && inputs.keyboard.p)
+      state.scale -= 0.1
+    elsif  inputs.keyboard.p
+      state.scale += 0.1
+    end
+
+    if inputs.mouse.wheel
+      state.scale += inputs.mouse.wheel.y
+    end
+
+    state.scale = state.scale.clamp(0.1, 1000)
+
+    if (inputs.keyboard.shift && inputs.keyboard.y) || inputs.keyboard.right
+      state.angle_y += 1
+    elsif (inputs.keyboard.y) || inputs.keyboard.left
+      state.angle_y -= 1
+    end
+
+    if (inputs.keyboard.shift && inputs.keyboard.x) || inputs.keyboard.down
+      state.angle_x -= 1
+    elsif (inputs.keyboard.x || inputs.keyboard.up)
+      state.angle_x += 1
+    end
+
+    if inputs.keyboard.shift && inputs.keyboard.z
+      state.angle_z += 1
+    elsif inputs.keyboard.z
+      state.angle_z -= 1
+    end
+
+    if inputs.keyboard.zero
+      state.angle_x = 0
+      state.angle_y = 0
+      state.angle_z = 0
+    end
+
+    angle_x = state.angle_x
+    angle_y = state.angle_y
+    angle_z = state.angle_z
+    scale   = state.scale
+
+    s_matrix = scale_matrix state.scale
+    x_matrix = angle_z_matrix angle_z
+    y_matrix = angle_y_matrix angle_y
+    z_matrix = angle_x_matrix angle_x
+
+    state.shifted_points = state.points.map do |point|
+      (matrix_mul s_matrix,
+                  (matrix_mul z_matrix,
+                              (matrix_mul x_matrix,
+                                          (matrix_mul y_matrix, point)))).merge(original: point)
+    end
+  end
+
+  def thick_line line
+    [
+      line.merge(y: line.y - 1, y2: line.y2 - 1, r: 0, g: 0, b: 0),
+      line.merge(x: line.x - 1, x2: line.x2 - 1, r: 0, g: 0, b: 0),
+      line.merge(x: line.x - 0, x2: line.x2 - 0, r: 0, g: 0, b: 0),
+      line.merge(y: line.y + 1, y2: line.y2 + 1, r: 0, g: 0, b: 0),
+      line.merge(x: line.x + 1, x2: line.x2 + 1, r: 0, g: 0, b: 0)
+    ]
+  end
+
+  def render
+    outputs.lines << state.shifted_points.each_slice(2).map do |(p1, p2)|
+      perc = 0
+      thick_line({ x:  p1.x.*(10) + 640, y:  p1.y.*(10) + 320,
+                   x2: p2.x.*(10) + 640, y2: p2.y.*(10) + 320,
+                   r: 255 * perc,
+                   g: 255 * perc,
+                   b: 255 * perc })
+    end
+
+    outputs.labels << [ 10, 700, "angle_x: #{state.angle_x.to_sf}", 0]
+    outputs.labels << [ 10, 670, "x, shift+x", 0]
+
+    outputs.labels << [210, 700, "angle_y: #{state.angle_y.to_sf}", 0]
+    outputs.labels << [210, 670, "y, shift+y", 0]
+
+    outputs.labels << [410, 700, "angle_z: #{state.angle_z.to_sf}", 0]
+    outputs.labels << [410, 670, "z, shift+z", 0]
+
+    outputs.labels << [610, 700, "scale: #{state.scale.to_sf}", 0]
+    outputs.labels << [610, 670, "p, shift+p", 0]
+  end
+end
+
+$game = Game.new
+
+def tick args
+  $game.args = args
+  $game.tick
+end
+
+def set_angles x, y, z
+  $game.state.angle_x = x
+  $game.state.angle_y = y
+  $game.state.angle_z = z
+end
+
+$gtk.reset
+
 

Arcade - Bullet Hell - main.rb

# ./samples/99_genre_arcade/bullet_hell/app/main.rb
@@ -23362,31 +24080,36 @@ class FlappyDragon
   end
 
   def render_score
-    outputs.primitives << [10, 710, "HI SCORE: #{state.hi_score}", large_white_typeset].label
-    outputs.primitives << [10, 680, "SCORE: #{state.score}", large_white_typeset].label
-    outputs.primitives << [10, 650, "DIFFICULTY: #{state.difficulty.upcase}", large_white_typeset].label
+    outputs.primitives << { x: 10, y: 710, text: "HI SCORE: #{state.hi_score}", **large_white_typeset }
+    outputs.primitives << { x: 10, y: 680, text: "SCORE: #{state.score}", **large_white_typeset }
+    outputs.primitives << { x: 10, y: 650, text: "DIFFICULTY: #{state.difficulty.upcase}", **large_white_typeset }
   end
 
   def render_menu
     return unless state.scene == :menu
     render_overlay
 
-    outputs.labels << [640, 700, "Flappy Dragon", 50, 1, 255, 255, 255]
-    outputs.labels << [640, 500, "Instructions: Press Spacebar to flap. Don't die.", 4, 1, 255, 255, 255]
-    outputs.labels << [430, 430, "[Tab]    Change difficulty", 4, 0, 255, 255, 255]
-    outputs.labels << [430, 400, "[Enter]  Start at New Difficulty ", 4, 0, 255, 255, 255]
-    outputs.labels << [430, 370, "[Escape] Cancel/Resume ", 4, 0, 255, 255, 255]
-    outputs.labels << [640, 300, "(mouse, touch, and game controllers work, too!) ", 4, 1, 255, 255, 255]
-    outputs.labels << [640, 200, "Difficulty: #{state.new_difficulty.capitalize}", 4, 1, 255, 255, 255]
+    outputs.labels << { x: 640, y: 700, text: "Flappy Dragon", size_enum: 50, alignment_enum: 1, **white }
+    outputs.labels << { x: 640, y: 500, text: "Instructions: Press Spacebar to flap. Don't die.", size_enum: 4, alignment_enum: 1, **white }
+    outputs.labels << { x: 430, y: 430, text: "[Tab]    Change difficulty", size_enum: 4, alignment_enum: 0, **white }
+    outputs.labels << { x: 430, y: 400, text: "[Enter]  Start at New Difficulty ", size_enum: 4, alignment_enum: 0, **white }
+    outputs.labels << { x: 430, y: 370, text: "[Escape] Cancel/Resume ", size_enum: 4, alignment_enum: 0, **white }
+    outputs.labels << { x: 640, y: 300, text: "(mouse, touch, and game controllers work, too!) ", size_enum: 4, alignment_enum: 1, **white }
+    outputs.labels << { x: 640, y: 200, text: "Difficulty: #{state.new_difficulty.capitalize}", size_enum: 4, alignment_enum: 1, **white }
 
-    outputs.labels << [10, 100, "Code:   @amirrajan",     255, 255, 255]
-    outputs.labels << [10,  80, "Art:    @mobypixel",     255, 255, 255]
-    outputs.labels << [10,  60, "Music:  @mobypixel",     255, 255, 255]
-    outputs.labels << [10,  40, "Engine: DragonRuby GTK", 255, 255, 255]
+    outputs.labels << { x: 10, y: 100, text: "Code:   @amirrajan",     **white }
+    outputs.labels << { x: 10, y:  80, text: "Art:    @mobypixel",     **white }
+    outputs.labels << { x: 10, y:  60, text: "Music:  @mobypixel",     **white }
+    outputs.labels << { x: 10, y:  40, text: "Engine: DragonRuby GTK", **white }
   end
 
   def render_overlay
-    outputs.primitives << [grid.rect.scale_rect(1.1, 0, 0), 0, 0, 0, 230].solid
+    overlay_rect = grid.rect.scale_rect(1.1, 0, 0)
+    outputs.primitives << { x: overlay_rect.x,
+                            y: overlay_rect.y,
+                            w: overlay_rect.w,
+                            h: overlay_rect.h,
+                            r: 0, g: 0, b: 0, a: 230 }.solid!
   end
 
   def render_game
@@ -23399,14 +24122,14 @@ class FlappyDragon
 
   def render_game_over
     return unless state.scene == :game
-    outputs.labels << [638, 358, score_text, 20, 1]
-    outputs.labels << [635, 360, score_text, 20, 1, 255, 255, 255]
-    outputs.labels << [638, 428, countdown_text, 20, 1]
-    outputs.labels << [635, 430, countdown_text, 20, 1, 255, 255, 255]
+    outputs.labels << { x: 638, y: 358, text: score_text,     size_enum: 20, alignment_enum: 1 }
+    outputs.labels << { x: 635, y: 360, text: score_text,     size_enum: 20, alignment_enum: 1, r: 255, g: 255, b: 255 }
+    outputs.labels << { x: 638, y: 428, text: countdown_text, size_enum: 20, alignment_enum: 1 }
+    outputs.labels << { x: 635, y: 430, text: countdown_text, size_enum: 20, alignment_enum: 1, r: 255, g: 255, b: 255 }
   end
 
   def render_background
-    outputs.sprites << [0, 0, 1280, 720, 'sprites/background.png']
+    outputs.sprites << { x: 0, y: 0, w: 1280, h: 720, path: 'sprites/background.png' }
 
     scroll_point_at   = state.tick_count
     scroll_point_at   = state.scene_at if state.scene == :menu
@@ -23418,11 +24141,18 @@ class FlappyDragon
     outputs.sprites << scrolling_background(scroll_point_at, 'sprites/parallax_front.png',  1.00, -80)
   end
 
+  def scrolling_background at, path, rate, y = 0
+    [
+      { x:    0 - at.*(rate) % 1440, y: y, w: 1440, h: 720, path: path },
+      { x: 1440 - at.*(rate) % 1440, y: y, w: 1440, h: 720, path: path }
+    ]
+  end
+
   def render_walls
     state.walls.each do |w|
       w.sprites = [
-        [w.x, w.bottom_height - 720, 100, 720, 'sprites/wall.png', 180],
-        [w.x, w.top_y,               100, 720, 'sprites/wallbottom.png', 0]
+        { x: w.x, y: w.bottom_height - 720, w: 100, h: 720, path: 'sprites/wall.png',       angle: 180 },
+        { x: w.x, y: w.top_y,               w: 100, h: 720, path: 'sprites/wallbottom.png', angle: 0 }
       ]
     end
     outputs.sprites << state.walls.map(&:sprites)
@@ -23431,15 +24161,13 @@ class FlappyDragon
   def render_dragon
     state.show_death = true if state.countdown == 3.seconds
 
-    render_debug_hitbox false
-
     if state.show_death == false || !state.death_at
       animation_index = state.flapped_at.frame_index 6, 2, false if state.flapped_at
       sprite_name = "sprites/dragon_fly#{animation_index.or(0) + 1}.png"
-      state.dragon_sprite = [state.x, state.y, 100, 80, sprite_name, state.dy * 1.2]
+      state.dragon_sprite = { x: state.x, y: state.y, w: 100, h: 80, path: sprite_name, angle: state.dy * 1.2 }
     else
       sprite_name = "sprites/dragon_die.png"
-      state.dragon_sprite = [state.x, state.y, 100, 80, sprite_name, state.dy * 1.2]
+      state.dragon_sprite = { x: state.x, y: state.y, w: 100, h: 80, path: sprite_name, angle: state.dy * 1.2 }
       sprite_changed_elapsed    = state.death_at.elapsed_time - 1.seconds
       state.dragon_sprite.angle += (sprite_changed_elapsed ** 1.3) * state.death_fall_direction * -1
       state.dragon_sprite.x     += (sprite_changed_elapsed ** 1.2) * state.death_fall_direction
@@ -23449,20 +24177,12 @@ class FlappyDragon
     outputs.sprites << state.dragon_sprite
   end
 
-  def render_debug_hitbox show
-    return unless show
-    outputs.borders << [dragon_collision_box.rect, 255, 0, 0] if state.dragon_sprite
-    outputs.borders << state.walls.flat_map do |w|
-       w.sprites.map { |s| [s.rect, 255, 0, 0] }
-    end
-  end
-
   def render_flash
     return unless state.flash_at
 
-    outputs.primitives << [grid.rect,
-                           white,
-                           255 * state.flash_at.ease(20, :flip)].solid
+    outputs.primitives << { **grid.rect.to_hash,
+                            **white,
+                            a: 255 * state.flash_at.ease(20, :flip) }.solid!
 
     state.flash_at = 0 if state.flash_at.elapsed_time > 20
   end
@@ -23582,19 +24302,12 @@ class FlappyDragon
     end
   end
 
-  def scrolling_background at, path, rate, y = 0
-    [
-      [   0 - at.*(rate) % 1440, y, 1440, 720, path],
-      [1440 - at.*(rate) % 1440, y, 1440, 720, path]
-    ]
-  end
-
   def white
-    [255, 255, 255]
+    { r: 255, g: 255, b: 255 }
   end
 
   def large_white_typeset
-    [5, 0, 255, 255, 255]
+    { size_enum: 5, alignment_enum: 0, r: 255, g: 255, b: 255 }
   end
 
   def at_beginning?
@@ -23603,9 +24316,9 @@ class FlappyDragon
 
   def dragon_collision_box
     state.dragon_sprite
-        .scale_rect(1.0 - collision_forgiveness, 0.5, 0.5)
-        .rect_shift_right(10)
-        .rect_shift_up(state.dy * 2)
+         .scale_rect(1.0 - collision_forgiveness, 0.5, 0.5)
+         .rect_shift_right(10)
+         .rect_shift_up(state.dy * 2)
   end
 
   def game_over?
@@ -23614,7 +24327,7 @@ class FlappyDragon
     state.walls
         .flat_map { |w| w.sprites }
         .any? do |s|
-          s.intersect_rect?(dragon_collision_box)
+          s && s.intersect_rect?(dragon_collision_box)
         end
   end
 
@@ -24990,317 +25703,6 @@ def move_player args, *vector
                     vector.y * args.state.player_speed) # the box will move extremely slow
 end
 
-
-

Crafting - Farming Game Starting Point - repl.rb

-
# ./samples/99_genre_crafting/farming_game_starting_point/app/repl.rb
-# ===============================================================
-# Welcome to repl.rb
-# ===============================================================
-# You can experiement with code within this file. Code in this
-# file is only executed when you save (and only excecuted ONCE).
-# ===============================================================
-
-# ===============================================================
-# REMOVE the "x" from the word "xrepl" and save the file to RUN
-# the code in between the do/end block delimiters.
-# ===============================================================
-
-# ===============================================================
-# ADD the "x" to the word "repl" (make it xrepl) and save the
-# file to IGNORE the code in between the do/end block delimiters.
-# ===============================================================
-
-# Remove the x from xrepl to run the code. Add the x back to ignore to code.
-xrepl do
-  puts "The result of 1 + 2 is: #{1 + 2}"
-end
-
-# ====================================================================================
-# Ruby Crash Course:
-# Strings, Numeric, Booleans, Conditionals, Looping, Enumerables, Arrays
-# ====================================================================================
-
-# ====================================================================================
-#  Strings
-# ====================================================================================
-# Remove the x from xrepl to run the code. Add the x back to ignore to code.
-xrepl do
-  message = "Hello World"
-  puts "The value of message is: " + message
-  puts "Any value can be interpolated within a string using \#{}."
-  puts "Interpolated message: #{message}."
-  puts 'This #{message} is not interpolated because the string uses single quotes.'
-end
-
-# ====================================================================================
-#  Numerics
-# ====================================================================================
-# Remove the x from xrepl to run the code. Add the x back to ignore to code.
-xrepl do
-  a = 10
-  puts "The value of a is: #{a}"
-  puts "a + 1 is: #{a + 1}"
-  puts "a / 3 is: #{a / 3}"
-end
-
-# Remove the x from xrepl to run the code. Add the x back to ignore to code.
-xrepl do
-  b = 10.12
-  puts "The value of b is: #{b}"
-  puts "b + 1 is: #{b + 1}"
-  puts "b as an integer is: #{b.to_i}"
-  puts ''
-end
-
-# ====================================================================================
-#  Booleans
-# ====================================================================================
-# Remove the x from xrepl to run the code. Add the x back to ignore to code.
-xrepl do
-  c = 30
-  puts "The value of c is #{c}."
-
-  if c
-    puts "This if statement ran because c is truthy."
-  end
-end
-
-# Remove the x from xrepl to run the code. Add the x back to ignore to code.
-xrepl do
-  d = false
-  puts "The value of d is #{d}."
-
-  if !d
-    puts "This if statement ran because d is falsey, using the not operator (!) makes d evaluate to true."
-  end
-
-  e = nil
-  puts "Nil is also considered falsey. The value of e is: #{e}."
-
-  if !e
-    puts "This if statement ran because e is nil (a falsey value)."
-  end
-end
-
-# ====================================================================================
-#  Conditionals
-# ====================================================================================
-# Remove the x from xrepl to run the code. Add the x back to ignore to code.
-xrepl do
-  i_am_true  = true
-  i_am_nil   = nil
-  i_am_false = false
-  i_am_hi    = "hi"
-
-  puts "======== if statement"
-  i_am_one = 1
-  if i_am_one
-    puts "This was printed because i_am_one is truthy."
-  end
-
-  puts "======== if/else statement"
-  if i_am_false
-    puts "This will NOT get printed because i_am_false is false."
-  else
-    puts "This was printed because i_am_false is false."
-  end
-
-  puts "======== if/elsif/else statement"
-  if i_am_false
-    puts "This will NOT get printed because i_am_false is false."
-  elsif i_am_true
-    puts "This was printed because i_am_true is true."
-  else
-    puts "This will NOT get printed i_am_true was true."
-  end
-
-  puts "======== case statement "
-  i_am_one = 1
-  case i_am_one
-  when 10
-    puts "case equaled: 10"
-  when 9
-    puts "case equaled: 9"
-  when 5
-    puts "case equaled: 5"
-  when 1
-    puts "case equaled: 1"
-  else
-    puts "Value wasn't cased."
-  end
-
-  puts "======== different types of comparisons"
-  if 4 == 4
-    puts "equal (4 == 4)"
-  end
-
-  if 4 != 3
-    puts "not equal (4 != 3)"
-  end
-
-  if 3 < 4
-    puts "less than (3 < 4)"
-  end
-
-  if 4 > 3
-    puts "greater than (4 > 3)"
-  end
-
-  if ((4 > 3) || (3 < 4) || false)
-    puts "or statement ((4 > 3) || (3 < 4) || false)"
-  end
-
-  if ((4 > 3) && (3 < 4))
-    puts "and statement ((4 > 3) && (3 < 4))"
-  end
-end
-
-# ====================================================================================
-# Looping
-# ====================================================================================
-# Remove the x from xrepl to run the code. Add the x back to ignore to code.
-xrepl do
-  puts "======== times block"
-  3.times do |i|
-    puts i
-  end
-  puts "======== range block exclusive"
-  (0...3).each do |i|
-    puts i
-  end
-  puts "======== range block inclusive"
-  (0..3).each do |i|
-    puts i
-  end
-end
-
-# ====================================================================================
-#  Enumerables
-# ====================================================================================
-# Remove the x from xrepl to run the code. Add the x back to ignore to code.
-xrepl do
-  puts "======== array each"
-  colors = ["red", "blue", "yellow"]
-  colors.each do |color|
-    puts color
-  end
-
-  puts '======== array each_with_index'
-  colors = ["red", "blue", "yellow"]
-  colors.each_with_index do |color, i|
-    puts "#{color} at index #{i}"
-  end
-end
-
-# Remove the x from xrepl to run the code. Add the x back to ignore to code.
-xrepl do
-  puts "======== single parameter function"
-  def add_one_to n
-    n + 5
-  end
-
-  puts add_one_to(3)
-
-  puts "======== function with default value"
-  def function_with_default_value v = 10
-    v * 10
-  end
-
-  puts "passing three: #{function_with_default_value(3)}"
-  puts "passing nil: #{function_with_default_value}"
-
-  puts "======== Or Equal (||=) operator for nil values"
-  def function_with_nil_default_with_local a = nil
-    result   = a
-    result ||= "or equal operator was exected and set a default value"
-  end
-
-  puts "passing 'hi': #{function_with_nil_default_with_local 'hi'}"
-  puts "passing nil: #{function_with_nil_default_with_local}"
-end
-
-# ====================================================================================
-#  Arrays
-# ====================================================================================
-# Remove the x from xrepl to run the code. Add the x back to ignore to code.
-xrepl do
-  puts "======== Create an array with the numbers 1 to 10."
-  one_to_ten = (1..10).to_a
-  puts one_to_ten
-
-  puts "======== Create a new array that only contains even numbers from the previous array."
-  one_to_ten = (1..10).to_a
-  evens = one_to_ten.find_all do |number|
-    number % 2 == 0
-  end
-  puts evens
-
-  puts "======== Create a new array that rejects odd numbers."
-  one_to_ten = (1..10).to_a
-  also_even = one_to_ten.reject do |number|
-    number % 2 != 0
-  end
-  puts also_even
-
-  puts "======== Create an array that doubles every number."
-  one_to_ten = (1..10).to_a
-  doubled = one_to_ten.map do |number|
-    number * 2
-  end
-  puts doubled
-
-  puts "======== Create an array that selects only odd numbers and then multiply those by 10."
-  one_to_ten = (1..10).to_a
-  odd_doubled = one_to_ten.find_all do |number|
-    number % 2 != 0
-  end.map do |odd_number|
-    odd_number * 10
-  end
-  puts odd_doubled
-
-  puts "======== All combination of numbers 1 to 10."
-  one_to_ten = (1..10).to_a
-  all_combinations = one_to_ten.product(one_to_ten)
-  puts all_combinations
-
-  puts "======== All uniq combinations of numbers. For example: [1, 2] is the same as [2, 1]."
-  one_to_ten = (1..10).to_a
-  uniq_combinations =
-    one_to_ten.product(one_to_ten)
-      .map do |unsorted_number|
-    unsorted_number.sort
-  end.uniq
-  puts uniq_combinations
-end
-
-# ====================================================================================
-#  Advanced Arrays
-# ====================================================================================
-# Remove the x from xrepl to run the code. Add the x back to ignore to code.
-xrepl do
-  puts "======== All unique Pythagorean Triples between 1 and 40 sorted by area of the triangle."
-
-  one_to_hundred = (1..40).to_a
-  triples =
-    one_to_hundred.product(one_to_hundred).map do |width, height|
-    [width, height, Math.sqrt(width ** 2 + height ** 2)]
-  end.find_all do |_, _, hypotenuse|
-    hypotenuse.to_i == hypotenuse
-  end.map do |triangle|
-    triangle.map(&:to_i)
-  end.uniq do |triangle|
-    triangle.sort
-  end.map do |width, height, hypotenuse|
-    [width, height, hypotenuse, (width * height) / 2]
-  end.sort_by do |_, _, _, area|
-    area
-  end
-
-  triples.each do |width, height, hypotenuse, area|
-    puts "(#{width}, #{height}, #{hypotenuse}) = #{area}"
-  end
-end
-
 

Crafting - Farming Game Starting Point - tests.rb

# ./samples/99_genre_crafting/farming_game_starting_point/app/tests.rb
@@ -28441,10 +28843,377 @@ end
 
 $gtk.reset
 
+
+

Mario - Jumping - main.rb

+
# ./samples/99_genre_mario/01_jumping/app/main.rb
+def tick args
+  defaults args
+  render args
+  input args
+  calc args
+end
+
+def defaults args
+  args.state.player.x      ||= args.grid.w.half
+  args.state.player.y      ||= 0
+  args.state.player.size   ||= 100
+  args.state.player.dy     ||= 0
+  args.state.player.action ||= :jumping
+  args.state.jump.power           = 20
+  args.state.jump.increase_frames = 10
+  args.state.jump.increase_power  = 1
+  args.state.gravity              = -1
+end
+
+def render args
+  args.outputs.sprites << {
+    x: args.state.player.x -
+       args.state.player.size.half,
+    y: args.state.player.y,
+    w: args.state.player.size,
+    h: args.state.player.size,
+    path: 'sprites/square/red.png'
+  }
+end
+
+def input args
+  if args.inputs.keyboard.key_down.space
+    if args.state.player.action == :standing
+      args.state.player.action = :jumping
+      args.state.player.dy = args.state.jump.power
+
+      # record when the action took place
+      current_frame = args.state.tick_count
+      args.state.player.action_at = current_frame
+    end
+  end
+
+  # if the space bar is being held
+  if args.inputs.keyboard.key_held.space
+    # is the player jumping
+    is_jumping = args.state.player.action == :jumping
+
+    # when was the jump performed
+    time_of_jump = args.state.player.action_at
+
+    # how much time has passed since the jump
+    jump_elapsed_time = time_of_jump.elapsed_time
+
+    # how much time is allowed for increasing power
+    time_allowed = args.state.jump.increase_frames
+
+    # if the player is jumping
+    # and the elapsed time is less than
+    # the allowed time
+    if is_jumping && jump_elapsed_time < time_allowed
+       # increase the dy by the increase power
+       power_to_add = args.state.jump.increase_power
+       args.state.player.dy += power_to_add
+    end
+  end
+end
+
+def calc args
+  if args.state.player.action == :jumping
+    args.state.player.y  += args.state.player.dy
+    args.state.player.dy += args.state.gravity
+  end
+
+  if args.state.player.y < 0
+    args.state.player.y      = 0
+    args.state.player.action = :standing
+  end
+end
+
+
+

Mario - Jumping And Collisions - main.rb

+
# ./samples/99_genre_mario/02_jumping_and_collisions/app/main.rb
+class Game
+  attr_gtk
+
+  def tick
+    defaults
+    render
+    input
+    calc
+  end
+
+  def defaults
+    return if state.tick_count != 0
+
+    player.x                     = 64
+    player.y                     = 800
+    player.size                  = 50
+    player.dx                    = 0
+    player.dy                    = 0
+    player.action                = :falling
+
+    player.max_speed             = 20
+    player.jump_power            = 15
+    player.jump_air_time         = 15
+    player.jump_increase_power   = 1
+
+    state.gravity                = -1
+    state.drag                   = 0.001
+    state.tile_size              = 64
+    state.tiles                ||= [
+      { ordinal_x:  0, ordinal_y: 0 },
+      { ordinal_x:  1, ordinal_y: 0 },
+      { ordinal_x:  2, ordinal_y: 0 },
+      { ordinal_x:  3, ordinal_y: 0 },
+      { ordinal_x:  4, ordinal_y: 0 },
+      { ordinal_x:  5, ordinal_y: 0 },
+      { ordinal_x:  6, ordinal_y: 0 },
+      { ordinal_x:  7, ordinal_y: 0 },
+      { ordinal_x:  8, ordinal_y: 0 },
+      { ordinal_x:  9, ordinal_y: 0 },
+      { ordinal_x: 10, ordinal_y: 0 },
+      { ordinal_x: 11, ordinal_y: 0 },
+      { ordinal_x: 12, ordinal_y: 0 },
+
+      { ordinal_x:  9, ordinal_y: 3 },
+      { ordinal_x: 10, ordinal_y: 3 },
+      { ordinal_x: 11, ordinal_y: 3 },
+    ]
+
+    tiles.each do |t|
+      t.rect = { x: t.ordinal_x * 64,
+                 y: t.ordinal_y * 64,
+                 w: 64,
+                 h: 64 }
+    end
+  end
+
+  def render
+    render_player
+    render_tiles
+    # render_grid
+  end
+
+  def input
+    input_jump
+    input_move
+  end
+
+  def calc
+    calc_player_rect
+    calc_left
+    calc_right
+    calc_below
+    calc_above
+    calc_player_dy
+    calc_player_dx
+    calc_game_over
+  end
+
+  def render_player
+    outputs.sprites << {
+      x: player.x,
+      y: player.y,
+      w: player.size,
+      h: player.size,
+      path: 'sprites/square/red.png'
+    }
+  end
+
+  def render_tiles
+    outputs.sprites << state.tiles.map do |t|
+      t.merge path: 'sprites/square/white.png',
+              x: t.ordinal_x * 64,
+              y: t.ordinal_y * 64,
+              w: 64,
+              h: 64
+    end
+  end
+
+  def render_grid
+    if state.tick_count == 0
+      outputs[:grid].background_color = [0, 0, 0, 0]
+      outputs[:grid].borders << available_brick_locations
+      outputs[:grid].labels  << available_brick_locations.map do |b|
+        [
+          b.merge(text: "#{b.ordinal_x},#{b.ordinal_y}",
+                  x: b.x + 2,
+                  y: b.y + 2,
+                  size_enum: -3,
+                  vertical_alignment_enum: 0,
+                  blendmode_enum: 0),
+          b.merge(text: "#{b.x},#{b.y}",
+                  x: b.x + 2,
+                  y: b.y + 2 + 20,
+                  size_enum: -3,
+                  vertical_alignment_enum: 0,
+                  blendmode_enum: 0)
+        ]
+      end
+    end
+
+    outputs.sprites << { x: 0, y: 0, w: 1280, h: 720, path: :grid }
+  end
+
+  def input_jump
+    if inputs.keyboard.key_down.space
+      player_jump
+    end
+
+    if inputs.keyboard.key_held.space
+      player_jump_increase_air_time
+    end
+  end
+
+  def input_move
+    if player.dx.abs < 20
+      if inputs.keyboard.left
+        player.dx -= 2
+      elsif inputs.keyboard.right
+        player.dx += 2
+      end
+    end
+  end
+
+  def calc_game_over
+    if player.y < -64
+      player.x = 64
+      player.y = 800
+      player.dx = 0
+      player.dy = 0
+    end
+  end
+
+  def calc_player_rect
+    player.rect      = player_current_rect
+    player.next_rect = player_next_rect
+    player.prev_rect = player_prev_rect
+  end
+
+  def calc_player_dx
+    player.dx  = player_next_dx
+    player.x  += player.dx
+  end
+
+  def calc_player_dy
+    player.y  += player.dy
+    player.dy  = player_next_dy
+  end
+
+  def calc_below
+    return unless player.dy < 0
+    tiles_below = tiles_find { |t| t.rect.top <= player.prev_rect.y }
+    collision = tiles_find_colliding tiles_below, (player.rect.merge y: player.next_rect.y)
+    if collision
+      player.y  = collision.rect.y + state.tile_size
+      player.dy = 0
+      player.action = :standing
+    else
+      player.action = :falling
+    end
+  end
+
+  def calc_left
+    return unless player.dx < 0 && player_next_dx < 0
+    tiles_left = tiles_find { |t| t.rect.right <= player.prev_rect.left }
+    collision = tiles_find_colliding tiles_left, (player.rect.merge x: player.next_rect.x)
+    return unless collision
+    player.x  = collision.rect.right
+    player.dx = 0
+  end
+
+  def calc_right
+    return unless player.dx > 0 && player_next_dx > 0
+    tiles_right = tiles_find { |t| t.rect.left >= player.prev_rect.right }
+    collision = tiles_find_colliding tiles_right, (player.rect.merge x: player.next_rect.x)
+    return unless collision
+    player.x  = collision.rect.left - player.rect.w
+    player.dx = 0
+  end
+
+  def calc_above
+    return unless player.dy > 0
+    tiles_above = tiles_find { |t| t.rect.y >= player.prev_rect.y }
+    collision = tiles_find_colliding tiles_above, (player.rect.merge y: player.next_rect.y)
+    return unless collision
+    player.dy = 0
+    player.y  = collision.rect.bottom - player.rect.h
+  end
+
+  def player_current_rect
+    { x: player.x, y: player.y, w: player.size, h: player.size }
+  end
+
+  def available_brick_locations
+    (0..19).to_a
+      .product(0..11)
+      .map do |(ordinal_x, ordinal_y)|
+      { ordinal_x: ordinal_x,
+        ordinal_y: ordinal_y,
+        x: ordinal_x * 64,
+        y: ordinal_y * 64,
+        w: 64,
+        h: 64 }
+    end
+  end
+
+  def player
+    state.player ||= args.state.new_entity :player
+  end
+
+  def player_next_dy
+    player.dy + state.gravity + state.drag ** 2 * -1
+  end
+
+  def player_next_dx
+    player.dx * 0.8
+  end
+
+  def player_next_rect
+    player.rect.merge x: player.x + player_next_dx,
+                      y: player.y + player_next_dy
+  end
+
+  def player_prev_rect
+    player.rect.merge x: player.x - player.dx,
+                      y: player.y - player.dy
+  end
+
+  def player_jump
+    return if player.action != :standing
+    player.action = :jumping
+    player.dy = state.player.jump_power
+    current_frame = state.tick_count
+    player.action_at = current_frame
+  end
+
+  def player_jump_increase_air_time
+    return if player.action != :jumping
+    return if player.action_at.elapsed_time >= player.jump_air_time
+    player.dy += player.jump_increase_power
+  end
+
+  def tiles
+    state.tiles
+  end
+
+  def tiles_find_colliding tiles, target
+    tiles.find { |t| t.rect.intersect_rect? target }
+  end
+
+  def tiles_find &block
+    tiles.find_all(&block)
+  end
+end
+
+def tick args
+  $game ||= Game.new
+  $game.args = args
+  $game.tick
+end
+
+$gtk.reset
+
 

Platformer - Clepto Frog - main.rb

# ./samples/99_genre_platformer/clepto_frog/app/main.rb
-MAP_FILE_PATH = 'app/map.txt'
+MAP_FILE_PATH = 'map.txt'
 
 require 'app/map.rb'
 
@@ -28499,35 +29268,7 @@ class CleptoFrog
 
   def render_intro
     outputs.labels << [640, 700, "Clepto Frog", 4, 1]
-    if state.tick_count >= 120
-      outputs.labels << [640, 620, "\"Uh... your office has a pet frog?\" - New Guy",
-                         4, 1, 0, 0, 0, 255 * 120.ease(60)]
-    end
-
-    if state.tick_count >= 240
-      outputs.labels << [640, 580, "\"Yep! His name is Clepto.\" - Jim",
-                         4, 1, 0, 0, 0, 255 * 240.ease(60)]
-    end
-
-    if state.tick_count >= 360
-      outputs.labels << [640, 540, "\"Uh...\" - New Guy",
-                         4, 1, 0, 0, 0, 255 * 360.ease(60)]
-    end
-
-    if state.tick_count >= 480
-      outputs.labels << [640, 500, "\"He steals mugs while we're away...\" - Jim",
-                         4, 1, 0, 0, 0, 255 * 480.ease(60)]
-    end
-
-    if state.tick_count >= 600
-      outputs.labels << [640, 460, "\"It's not a big deal, we take them back in the morning.\" - Jim",
-                         4, 1, 0, 0, 0, 255 * 600.ease(60)]
-    end
-
-    outputs.sprites << [640 - 50, 360 - 50, 100, 100,
-                        "sprites/square-green.png"]
-
-    if state.tick_count == 800
+    if state.tick_count == 120
       state.scene = :game
       state.game_start_at = state.tick_count
     end
@@ -28535,7 +29276,7 @@ class CleptoFrog
 
   def tick
     defaults
-    if state.scene == :intro && state.tick_count <= 800
+    if state.scene == :intro && state.tick_count <= 120
       render_intro
     elsif state.scene == :ending
       render_ending
@@ -28638,15 +29379,15 @@ class CleptoFrog
 
     if state.god_mode
       # SHOW HIDE COLLISIONS
-      outputs.sprites << state.world.map do |x, y, w, h|
-        x = vx(x)
-        y = vy(y)
+      outputs.sprites << state.world.map do |rect|
+        x = vx(rect.x)
+        y = vy(rect.y)
         if x > -80 && x < 1280 && y > -80 && y < 720
           {
             x: x,
             y: y,
-            w: vw(w || state.tile_size),
-            h: vh(h || state.tile_size),
+            w: vw(rect.w || state.tile_size),
+            h: vh(rect.h || state.tile_size),
             path: 'sprites/square-gray.png',
             a: 128
           }
@@ -28669,8 +29410,10 @@ class CleptoFrog
 
 
       # Creates sprite following mouse to help indicate which sprite you have selected
-      outputs.primitives << [inputs.mouse.position.x, inputs.mouse.position.y,
-                             state.tile_size, state.tile_size, 'sprites/square-indigo.png', 0, 100].sprite
+      outputs.primitives << [inputs.mouse.position.x - 32 * state.camera_scale,
+                             inputs.mouse.position.y - 32 * state.camera_scale,
+                             state.tile_size * state.camera_scale,
+                             state.tile_size * state.camera_scale, 'sprites/square-indigo.png', 0, 100].sprite
     end
 
     render_mini_map
@@ -28751,6 +29494,29 @@ class CleptoFrog
       set_camera_scale 1
     end
 
+    if inputs.mouse.click
+      state.id_seed += 1
+      id = state.id_seed
+      x = state.camera_x + (inputs.mouse.click.x.fdiv(state.camera_scale) - 32)
+      y = state.camera_y + (inputs.mouse.click.y.fdiv(state.camera_scale) - 32)
+      x = ((x + 2).idiv 4) * 4
+      y = ((y + 2).idiv 4) * 4
+      w = 64
+      h = 64
+      candidate_rect = { id: id, x: x, y: y, w: w, h: h }
+      scaled_candidate_rect = { x: x + 30, y: y + 30, w: w - 60, h: h - 60 }
+      to_remove = state.world.find { |r| r.intersect_rect? scaled_candidate_rect }
+      if to_remove && args.inputs.keyboard.x
+        state.world.reject! { |r| r.id == to_remove.id }
+      else
+        state.world << candidate_rect
+      end
+      export_map
+      state.world_lookup = {}
+      state.world_collision_rects = nil
+      calc_world_lookup
+    end
+
     if input_up?
       state.y += 10
       state.dy = 0
@@ -28772,12 +29538,6 @@ class CleptoFrog
     if state.scene == :game
       process_inputs_player_movement
       process_inputs_god_mode
-    elsif state.scene == :intro
-      if args.inputs.keyboard.key_down.enter || args.inputs.keyboard.key_down.space
-        if Kernel.tick_count < 600
-          Kernel.tick_count = 600
-        end
-      end
     end
   end
 
@@ -28875,17 +29635,6 @@ class CleptoFrog
     end
   end
 
-  def add_floors
-    # floors
-    state.world += [
-      [0,       0, 10000, 40],
-      [0,    1670, 3250, 60],
-      [6691, 1653, 3290, 60],
-      [1521, 3792, 7370, 60],
-      [0, 5137, 3290, 60]
-    ]
-  end
-
   def attempt_load_world_from_file
     return if state.world
     # exported_world = gtk.read_file(MAP_FILE_PATH)
@@ -28893,26 +29642,11 @@ class CleptoFrog
     state.objects = []
 
     if $collisions
-      $collisions.map do |x, y, w, h|
-        state.world << [x, y, w, h]
+      state.id_seed ||= 0
+      $collisions.each do |x, y, w, h|
+        state.id_seed += 1
+        state.world << { id: state.id_seed, x: x, y: y, w: w, h: h }
       end
-
-      add_floors
-    # elsif exported_world
-    #   exported_world.each_line.map do |l|
-    #     tokens = l.strip.split(',')
-    #     x    = tokens[0].to_i
-    #     y    = tokens[1].to_i
-    #     type = tokens[2].to_i
-    #     if type == 1
-    #       state.world << [x, y, state.tile_size, state.tile_size]
-    #     elsif type == 2
-    #       w, h, path = tokens[3..-1]
-    #       state.objects << [x, y, w.to_i, h.to_i, path]
-    #     end
-    #   end
-
-    #   add_floors
     end
 
     if $mugs
@@ -28933,23 +29667,24 @@ class CleptoFrog
 
     # Searches through the world and finds the cordinates that exist
     state.world_lookup = {}
-    state.world.each do |x, y, w, h|
-      state.world_lookup[[x, y, w || state.tile_size, h || state.tile_size]] = true
+    state.world.each do |rect|
+      state.world_lookup[rect.id] = rect
     end
 
     # Assigns collision rects for every sprite drawn
     state.world_collision_rects =
       state.world_lookup
            .keys
-           .map do |x, y, w, h|
+           .map do |key|
+             rect = state.world_lookup[key]
              s = state.tile_size
-             w ||= s
-             h ||= s
+             rect.w ||= s
+             rect.h ||= s
              {
-               args:       [x, y, w, h],
-               left_right: [x,     y + 4, w,     h - 6],
-               top:        [x + 4, y + 6, w - 8, h - 6],
-               bottom:     [x + 1, y - 1, w - 2, h - 8],
+               args:       rect,
+               left_right: { x: rect.x,     y: rect.y + 4, w: rect.w,     h: rect.h - 6 },
+               top:        { x: rect.x + 4, y: rect.y + 6, w: rect.w - 8, h: rect.h - 6 },
+               bottom:     { x: rect.x + 1, y: rect.y - 1, w: rect.w - 2, h: rect.h - 8 },
              }
            end
 
@@ -29005,12 +29740,21 @@ class CleptoFrog
 
   def end_of_tongue
     p = state.tongue_angle.vector(state.tongue_length)
-    [start_of_tongue.x + p.x, start_of_tongue.y + p.y]
+    { x: start_of_tongue.x + p.x, y: start_of_tongue.y + p.y }
   end
 
   def calc_shooting
+    calc_shooting_increment
+    calc_shooting_increment
+    calc_shooting_increment
+    calc_shooting_increment
+    calc_shooting_increment
+    calc_shooting_increment
+  end
+
+  def calc_shooting_increment
     return unless state.action == :shooting
-    state.tongue_length += 30
+    state.tongue_length += 5
     potential_anchor = end_of_tongue
     if potential_anchor.x <= 0
       state.anchor_point = potential_anchor
@@ -29029,9 +29773,9 @@ class CleptoFrog
       state.action = :anchored
       outputs.sounds << 'sounds/attached.wav'
     else
-      anchor_rect = [potential_anchor.x - 5, potential_anchor.y - 5, 10, 10]
+      anchor_rect = { x: potential_anchor.x - 5, y: potential_anchor.y - 5, w: 10, h: 10 }
       collision = state.world_collision_rects.find_all do |v|
-        [v[:args].x, v[:args].y, v[:args].w, v[:args].h].intersect_rect?(anchor_rect)
+        v[:args].intersect_rect?(anchor_rect)
       end.first
       if collision
         state.anchor_point = potential_anchor
@@ -29127,7 +29871,7 @@ class CleptoFrog
                              .first
 
     return unless left_side_collisions
-    state.x = left_side_collisions[:left_right].right
+    state.x = left_side_collisions[:left_right].right + 1
     state.dx = state.dy.abs * 0.8
     state.collision_on_x = true
   end
@@ -29142,7 +29886,7 @@ class CleptoFrog
                               .first
 
     return unless right_side_collisions
-    state.x = right_side_collisions[:left_right].left - state.tile_size
+    state.x = right_side_collisions[:left_right].left - state.tile_size - 1
     state.dx = state.dx.abs * 0.8 * -1
     state.collision_on_x = true
   end
@@ -29158,7 +29902,7 @@ class CleptoFrog
                         .first
 
     return unless ceil_collisions
-    state.y = ceil_collisions[:bottom].y - state.tile_size
+    state.y = ceil_collisions[:bottom].y - state.tile_size - 1
     state.dy = state.dy.abs * 0.8 * -1
     state.collision_on_y = true
   end
@@ -29171,13 +29915,17 @@ class CleptoFrog
   end
 
   def export_map
-    export_string = state.world.map do |x, y|
-      "#{x},#{y},1"
-    end
+    export_string = "$collisions = [\n"
+    export_string += state.world.map do |rect|
+      "[#{rect.x},#{rect.y},#{rect.w},#{rect.h}],"
+    end.join "\n"
+    export_string += "\n]\n\n"
+    export_string += "$mugs = [\n"
     export_string += state.objects.map do |x, y, w, h, path|
-      "#{x},#{y},2,#{w},#{h},#{path}"
-    end
-    gtk.write_file(MAP_FILE_PATH, export_string.join("\n"))
+      "[#{x},#{y},#{w},#{h},'#{path}'],"
+    end.join "\n"
+    export_string += "\n]\n\n"
+    gtk.write_file(MAP_FILE_PATH, export_string)
     state.map_saved_at = state.tick_count
   end
 
@@ -30303,6 +31051,11 @@ $collisions = [
   [4459, 3997, 64, 64],
   [76, 5215, 64, 64],
   [39, 5217, 64, 64],
+  [0,       0, 10000, 40],
+  [0,    1670, 3250, 60],
+  [6691, 1653, 3290, 60],
+  [1521, 3792, 7370, 60],
+  [0, 5137, 3290, 60]
 ]
 
 $mugs = [
@@ -31148,6 +31901,7 @@ class FallingCircle
   end
 
   def load_lines file
+    return unless state.snaps
     data = gtk.read_file(file) || ""
     data.each_line
         .reject { |l| l.strip.length == 0 }
@@ -31206,10 +31960,10 @@ class FallingCircle
     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|
+    results[:impacts] = terrain.find_all { |t| t && (line_near_rect? results[:rect], t) }.map do |t|
       {
         terrain: t,
-        point: geometry.line_intersect(results[:trajectory], t),
+        point: geometry.line_intersect(results[:trajectory], t, replace_infinity: 1000),
         type: :terrain
       }
     end.reject { |t| !point_within_line? t[:point], t[:terrain] }
@@ -31217,10 +31971,10 @@ class FallingCircle
     results[:impacts] += lava.find_all { |t| line_near_rect? results[:rect], t }.map do |t|
       {
         terrain: t,
-        point: geometry.line_intersect(results[:trajectory], t),
+        point: geometry.line_intersect(results[:trajectory], t, replace_infinity: 1000),
         type: :lava
       }
-    end.reject { |t| !point_within_line? t[:point], t[:terrain] }
+    end.reject { |t| !t || (!point_within_line? t[:point], t[:terrain]) }
 
     results
   end
@@ -31233,6 +31987,7 @@ class FallingCircle
   end
 
   def calc_terrains_to_monitor
+    return unless circle.impacts
     circle.impact = nil
     circle.impacts.each do |i|
       circle.terrains_to_monitor[i[:terrain]] ||= {
@@ -36732,6 +37487,149 @@ def tick args
     $isometric.tick
 end
 
+
+

Rpg Topdown - Topdown Casino - main.rb

+
# ./samples/99_genre_rpg_topdown/topdown_casino/app/main.rb
+$gtk.reset
+
+def coinflip
+  rand < 0.5
+end
+
+class Game
+  attr_accessor :args
+
+  def text_font
+    return nil #"rpg.ttf"
+  end
+
+  def text_color
+    [ 255, 255, 255, 255 ]
+  end
+
+  def set_gem_values
+    @args.state.gem0 = ((coinflip) ?  100 : 20)
+    @args.state.gem1 = ((coinflip) ? -10 : -50)
+    @args.state.gem2 = ((coinflip) ? -10 : -30)
+    if coinflip
+      tmp = @args.state.gem0
+      @args.state.gem0 = @args.state.gem1
+      @args.state.gem1 = tmp
+    end
+    if coinflip
+      tmp = @args.state.gem1
+      @args.state.gem1 = @args.state.gem2
+      @args.state.gem2 = tmp
+    end
+    if coinflip
+      tmp = @args.state.gem0
+      @args.state.gem0 = @args.state.gem2
+      @args.state.gem2 = tmp
+    end
+  end
+
+  def initialize args
+    @args = args
+    @args.state.animticks = 0
+    @args.state.score = 0
+    @args.state.gem_chosen = false
+    @args.state.round_finished = false
+    @args.state.gem0_x = 197
+    @args.state.gem0_y = 720-274
+    @args.state.gem1_x = 623
+    @args.state.gem1_y = 720-274
+    @args.state.gem2_x = 1049
+    @args.state.gem2_y = 720-274
+    @args.state.hero_sprite = "sprites/herodown100.png"
+    @args.state.hero_x = 608
+    @args.state.hero_y = 720-656
+    set_gem_values
+  end
+
+  def render_gem_value x, y, gem
+    if @args.state.gem_chosen
+      @args.outputs.labels << [ x, y + 96, gem.to_s, 1, 1, *text_color, text_font ]
+    end
+  end
+
+  def render
+    gemsprite = ((@args.state.animticks % 400) < 200) ? 'sprites/gem200.png' : 'sprites/gem400.png'
+    @args.outputs.background_color = [ 0, 0, 0, 255 ]
+    @args.outputs.sprites << [608, 720-150, 64, 64, 'sprites/oldman.png']
+    @args.outputs.sprites << [300, 720-150, 64, 64, 'sprites/fire.png']
+    @args.outputs.sprites << [900, 720-150, 64, 64, 'sprites/fire.png']
+    @args.outputs.sprites << [@args.state.gem0_x, @args.state.gem0_y, 32, 64, gemsprite]
+    @args.outputs.sprites << [@args.state.gem1_x, @args.state.gem1_y, 32, 64, gemsprite]
+    @args.outputs.sprites << [@args.state.gem2_x, @args.state.gem2_y, 32, 64, gemsprite]
+    @args.outputs.sprites << [@args.state.hero_x, @args.state.hero_y, 64, 64, @args.state.hero_sprite]
+
+    @args.outputs.labels << [ 630, 720-30, "IT'S A SECRET TO EVERYONE.", 1, 1, *text_color, text_font ]
+    @args.outputs.labels << [ 50, 720-85, @args.state.score.to_s, 1, 1, *text_color, text_font ]
+    render_gem_value @args.state.gem0_x, @args.state.gem0_y, @args.state.gem0
+    render_gem_value @args.state.gem1_x, @args.state.gem1_y, @args.state.gem1
+    render_gem_value @args.state.gem2_x, @args.state.gem2_y, @args.state.gem2
+  end
+
+  def calc
+    @args.state.animticks += 16
+
+    return unless @args.state.gem_chosen
+    @args.state.round_finished_debounce ||= 60 * 3
+    @args.state.round_finished_debounce -= 1
+    return if @args.state.round_finished_debounce > 0
+
+    @args.state.gem_chosen = false
+    @args.state.hero.sprite[0] = 'sprites/herodown100.png'
+    @args.state.hero.sprite[1] = 608
+    @args.state.hero.sprite[2] = 656
+    @args.state.round_finished_debounce = nil
+    set_gem_values
+  end
+
+  def walk xdir, ydir, anim
+    @args.state.hero_sprite = "sprites/#{anim}#{(((@args.state.animticks % 200) < 100) ? '100' : '200')}.png"
+    @args.state.hero_x += 5 * xdir
+    @args.state.hero_y += 5 * ydir
+  end
+
+  def check_gem_touching gem_x, gem_y, gem
+    return if @args.state.gem_chosen
+    herorect = [ @args.state.hero_x, @args.state.hero_y, 64, 64 ]
+    return if !herorect.intersect_rect?([gem_x, gem_y, 32, 64])
+    @args.state.gem_chosen = true
+    @args.state.score += gem
+    @args.outputs.sounds << ((gem < 0) ? 'sounds/lose.wav' : 'sounds/win.wav')
+  end
+
+  def input
+    if @args.inputs.keyboard.key_held.left
+      walk(-1.0, 0.0, 'heroleft')
+    elsif @args.inputs.keyboard.key_held.right
+      walk(1.0, 0.0, 'heroright')
+    elsif @args.inputs.keyboard.key_held.up
+      walk(0.0, 1.0, 'heroup')
+    elsif @args.inputs.keyboard.key_held.down
+      walk(0.0, -1.0, 'herodown')
+    end
+
+    check_gem_touching(@args.state.gem0_x, @args.state.gem0_y, @args.state.gem0)
+    check_gem_touching(@args.state.gem1_x, @args.state.gem1_y, @args.state.gem1)
+    check_gem_touching(@args.state.gem2_x, @args.state.gem2_y, @args.state.gem2)
+  end
+
+  def tick
+    input
+    calc
+    render
+  end
+end
+
+def tick args
+    args.state.game ||= Game.new args
+    args.state.game.args = args
+    args.state.game.tick
+end
+
 

Rpg Topdown - Topdown Starting Point - main.rb

# ./samples/99_genre_rpg_topdown/topdown_starting_point/app/main.rb
@@ -36844,6 +37742,185 @@ def move_player args, *vector
                     vector.y * args.state.player_speed) # the box will move extremely slow
 end
 
+
+

Teenytiny - Teenytiny Starting Point - main.rb

+
# ./samples/99_genre_teenytiny/teenytiny_starting_point/app/main.rb
+# full documenation is at http://docs.dragonruby.org
+# be sure to come to the discord if you hit any snags: http://discord.dragonruby.org
+def tick args
+  # ====================================================
+  # initialize default variables
+  # ====================================================
+
+  # ruby has an operator called ||= which means "only initialize this if it's nil"
+  args.state.count_down   ||= 20 * 60 # set the count down to 20 seconds
+  # set the initial position of the target
+  args.state.target       ||= { x: args.grid.w.half,
+                                y: args.grid.h.half,
+                                w: 20,
+                                h: 20 }
+
+  # set the initial position of the player
+  args.state.player       ||= { x: 50,
+                                y: 50,
+                                w: 20,
+                                h: 20 }
+
+  # set the player movement speed
+  args.state.player_speed ||= 5
+
+  # set the score
+  args.state.score        ||= 0
+  args.state.teleports    ||= 3
+
+  # set the instructions
+  args.state.instructions ||= "Get to the red goal! Use arrow keys to move. Spacebar to teleport (use them carefully)!"
+
+  # ====================================================
+  # render the game
+  # ====================================================
+  args.outputs.labels  << { x: args.grid.w.half, y: args.grid.h - 10,
+                            text: args.state.instructions,
+                            alignment_enum: 1 }
+
+  # check if it's game over. if so, then render game over
+  # otherwise render the current time left
+  if game_over? args
+    args.outputs.labels  << { x: args.grid.w.half,
+                              y: args.grid.h - 40,
+                              text: "game over! (press r to start over)",
+                              alignment_enum: 1 }
+  else
+    args.outputs.labels  << { x: args.grid.w.half,
+                              y: args.grid.h - 40,
+                              text: "time left: #{(args.state.count_down.idiv 60) + 1}",
+                              alignment_enum: 1 }
+  end
+
+  # render the score
+  args.outputs.labels  << { x: args.grid.w.half,
+                            y: args.grid.h - 70,
+                            text: "score: #{args.state.score}",
+                            alignment_enum: 1 }
+
+  # render the player with teleport count
+  args.outputs.sprites << { x: args.state.player.x,
+                            y: args.state.player.y,
+                            w: args.state.player.w,
+                            h: args.state.player.h,
+                            path: 'sprites/square-green.png' }
+
+  args.outputs.labels << { x: args.state.player.x + 10,
+                           y: args.state.player.y + 40,
+                           text: "teleports: #{args.state.teleports}",
+                           alignment_enum: 1, size_enum: -2 }
+
+  # render the target
+  args.outputs.sprites << { x: args.state.target.x,
+                            y: args.state.target.y,
+                            w: args.state.target.w,
+                            h: args.state.target.h,
+                            path: 'sprites/square-red.png' }
+
+  # ====================================================
+  # run simulation
+  # ====================================================
+
+  # count down calculation
+  args.state.count_down -= 1
+  args.state.count_down = -1 if args.state.count_down < -1
+
+  # ====================================================
+  # process player input
+  # ====================================================
+  # if it isn't game over let them move
+  if !game_over? args
+    dir_y = 0
+    dir_x = 0
+
+    # determine the change horizontally
+    if args.inputs.keyboard.up
+      dir_y += args.state.player_speed
+    elsif args.inputs.keyboard.down
+      dir_y -= args.state.player_speed
+    end
+
+    # determine the change vertically
+    if args.inputs.keyboard.left
+      dir_x -= args.state.player_speed
+    elsif args.inputs.keyboard.right
+      dir_x += args.state.player_speed
+    end
+
+    # determine if teleport can be used
+    if args.inputs.keyboard.key_down.space && args.state.teleports > 0
+      args.state.teleports -= 1
+      dir_x *= 20
+      dir_y *= 20
+    end
+
+    # apply change to player
+    args.state.player.x += dir_x
+    args.state.player.y += dir_y
+  else
+    # if r is pressed, reset the game
+    if args.inputs.keyboard.key_down.r
+      $gtk.reset
+      return
+    end
+  end
+
+  # ====================================================
+  # determine score
+  # ====================================================
+
+  # calculate new score if the player is at goal
+  if !game_over? args
+
+    # if the player is at the goal, then move the goal
+    if args.state.player.intersect_rect? args.state.target
+      # increment the goal
+      args.state.score += 1
+
+      # move the goal to a random location
+      args.state.target = { x: (rand args.grid.w), y: (rand args.grid.h), w: 20, h: 20 }
+
+      # make sure the goal is inside the view area
+      if args.state.target.x < 0
+        args.state.target.x += 20
+      elsif args.state.target.x > 1280
+        args.state.target.x -= 20
+      end
+
+      # make sure the goal is inside the view area
+      if args.state.target.y < 0
+        args.state.target.y += 20
+      elsif args.state.target.y > 720
+        args.state.target.y -= 20
+      end
+    end
+  end
+end
+
+def game_over? args
+  args.state.count_down < 0
+end
+
+$gtk.reset
+
+
+

Teenytiny - Teenytiny Starting Point - license.txt

+
# ./samples/99_genre_teenytiny/teenytiny_starting_point/license.txt
+Copyright 2019 DragonRuby LLC
+
+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.
+
 

OSS

@@ -36863,6 +37940,7 @@ module GTK class Args include ArgsDeprecated include Serialize + attr_accessor :cvars attr_accessor :inputs attr_accessor :outputs attr_accessor :audio @@ -36883,6 +37961,7 @@ module GTK def initialize runtime, recording @inputs = Inputs.new @outputs = Outputs.new args: self + @cvars = {} @audio = {} @passes = [] @state = OpenEntity.new @@ -37053,6 +38132,23 @@ module GTK def autocomplete_methods [:inputs, :outputs, :gtk, :state, :geometry, :audio, :grid, :layout, :fn] end + + def method_missing name, *args, &block + if (args.length <= 1) && (@state.as_hash.key? name) + raise <<-S +* ERROR - :#{name} method missing on ~#{self.class.name}~. +The method + :#{name} +with args + #{args} +doesn't exist on #{inspect}. +** POSSIBLE SOLUTION - ~args.state.#{name}~ exists. +Did you forget ~.state~ before ~.#{name}~? +S + end + + super + end end end @@ -37340,14 +38436,17 @@ module GTK class Console include ConsoleDeprecated - attr_accessor :show_reason, :log, :logo, :background_color, - :text_color, :animation_duration, + attr_accessor :show_reason, :log, :logo, + :animation_duration, :max_log_lines, :max_history, :log, - :last_command_errored, :last_command, :error_color, :shown_at, - :header_color, :archived_log, :last_log_lines, :last_log_lines_count, + :last_command_errored, :last_command, :shown_at, + :archived_log, :last_log_lines, :last_log_lines_count, :suppress_left_arrow_behavior, :command_set_at, :toast_ids, :bottom, - :font_style, :menu + :font_style, :menu, + :background_color, :spam_color, :text_color, :warn_color, + :error_color, :header_color, :code_color, :comment_color, + :debug_color, :unfiltered_color def initialize @font_style = FontStyle.new(font: 'font.ttf', size_enum: -1.5, line_height: 1.1) @@ -37365,15 +38464,22 @@ module GTK @command_history_index = -1 @nonhistory_input = '' @logo = 'console-logo.png' - @history_fname = 'console_history.txt' + @history_fname = 'logs/console_history.txt' @background_color = Color.new [0, 0, 0, 224] - @text_color = Color.new [255, 255, 255] - @error_color = Color.new [200, 50, 50] @header_color = Color.new [100, 200, 220] @code_color = Color.new [210, 168, 255] - @comment_color = Color.new [0, 200, 100] + @comment_color = Color.new [0, 200, 100] @animation_duration = 1.seconds @shown_at = -1 + + # these are the colors for text at various log levels. + @spam_color = Color.new [160, 160, 160] + @debug_color = Color.new [0, 255, 0] + @text_color = Color.new [255, 255, 255] + @warn_color = Color.new [255, 255, 0] + @error_color = Color.new [200, 50, 50] + @unfiltered_color = Color.new [0, 255, 255] + load_history end @@ -37439,7 +38545,13 @@ module GTK nil end - def add_text obj + def add_text obj, loglevel=-1 + # loglevel is one of the values of LogLevel in logging.h, or -1 to say "we don't care, colorize it with your special string parsing magic" + loglevel = -1 if loglevel < 0 + loglevel = 5 if loglevel > 5 # 5 == unfiltered (it's 0x7FFFFFFE in C, clamp it down) + loglevel = 2 if (loglevel == -1) && obj.start_with?('!c!') # oh well + colorstr = (loglevel != -1) ? "!c!#{loglevel}" : nil + @last_log_lines_count ||= 1 @log_invocation_count += 1 @@ -37448,12 +38560,18 @@ module GTK log_lines = [] str.each_line do |s| - s.wrapped_lines(self.console_text_width).each do |l| - log_lines << l + if colorstr.nil? + s.wrapped_lines(self.console_text_width).each do |l| + log_lines << l + end + else + s.wrapped_lines(self.console_text_width).each do |l| + log_lines << "#{colorstr}#{l}" + end end end - if log_lines == @last_log_lines + if log_lines == @last_log_lines && log_lines.length != 0 @last_log_lines_count += 1 new_log_line_with_count = @last_log_lines.last + " (#{@last_log_lines_count})" if log_lines.length > 1 @@ -37728,10 +38846,12 @@ S def mouse_wheel_scroll args @inertia ||= 0 - if args.inputs.mouse.wheel && args.inputs.mouse.wheel.y > 0 - @inertia = 1 - elsif args.inputs.mouse.wheel && args.inputs.mouse.wheel.y < 0 - @inertia = -1 + if args.inputs.mouse.wheel + if args.inputs.mouse.wheel.y > 0 + @inertia = 1 + elsif args.inputs.mouse.wheel.y < 0 + @inertia = -1 + end end if args.inputs.mouse.click @@ -37740,13 +38860,11 @@ S return if @inertia == 0 - if @inertia != 0 - @inertia = (@inertia * 0.7) - if @inertia > 0 - @log_offset -= 1 - elsif @inertia < 0 - @log_offset += 1 - end + @inertia = (@inertia * 0.7) + if @inertia > 0 + @log_offset += 1 + elsif @inertia < 0 + @log_offset -= 1 end if @inertia.abs < 0.01 @@ -37764,6 +38882,7 @@ S if console_toggle_key_down? args args.inputs.text.clear toggle + args.inputs.keyboard.clear if !@visible end return unless visible? @@ -37775,7 +38894,16 @@ S @log_offset = 0 if @log_offset < 0 if args.inputs.keyboard.key_down.enter - eval_the_set_command + if slide_progress > 0.5 + # in the event of an exception, the console window pops up + # and is pre-filled with $gtk.reset. + # there is an annoying scenario where the exception could be thrown + # by pressing enter (while playing the game). if you press enter again + # quickly, then the game is reset which closes the console. + # so enter in the console is only evaluated if the slide_progress + # is atleast half way down the page. + eval_the_set_command + end elsif args.inputs.keyboard.key_down.v if args.inputs.keyboard.key_down.control || args.inputs.keyboard.key_down.meta prompt << $gtk.ffi_misc.getclipboard @@ -37852,7 +38980,7 @@ S def write_line(args, left, y, str, archived: false) color = color_for_log_entry(str) color = color.mult_alpha(0.5) if archived - + str = str[4..-1] if str.start_with?('!c!') # chop off loglevel color args.outputs.reserved << font_style.label(x: left.shift_right(10), y: y, text: str, color: color) end @@ -38088,7 +39216,9 @@ S return false end - def color_for_log_entry(log_entry) + def color_for_plain_text log_entry + log_entry = log_entry[4..-1] if log_entry.start_with? "!c!" + if code? log_entry @code_color elsif code_comment? log_entry @@ -38108,6 +39238,29 @@ S end end + def color_for_log_entry(log_entry) + if log_entry.start_with?('!c!') # loglevel color specified. + return case log_entry[3..3].to_i + when 0 # spam + @spam_color + when 1 # debug + @debug_color + #when 2 # info (caught by the `else` block.) + # @text_color + when 3 # warn + @warn_color + when 4 # error + @error_color + when 5 # unfiltered + @unfiltered_color + else + color_for_plain_text log_entry + end + end + + return color_for_plain_text log_entry + end + def prompt @prompt ||= Prompt.new(font_style: font_style, text_color: @text_color, console_text_width: console_text_width) end @@ -38551,11 +39704,11 @@ S # partition the original list of items into a string to be printed items.each_slice(columns).each_with_index do |cells, i| - pretty_print_row_seperator string_width, cell_width, column_width, columns + pretty_print_row_separator string_width, cell_width, column_width, columns pretty_print_row cells, string_width, cell_width, column_width, columns end - pretty_print_row_seperator string_width, cell_width, column_width, columns + pretty_print_row_separator string_width, cell_width, column_width, columns end end @@ -39382,8 +40535,8 @@ module GTK ease_extended start_tick, current_tick, start_tick + duration, - (initial_value *definitions), - (final_value *definitions), + initial_value(*definitions), + final_value(*definitions), *definitions end @@ -39574,8 +40727,8 @@ end module GTK module Geometry def self.rotate_point point, angle, around = nil - s = Math.sin a.to_radians - c = Math.cos a.to_radians + s = Math.sin angle.to_radians + c = Math.cos angle.to_radians px = point.x py = point.y cx = 0 @@ -39756,8 +40909,16 @@ S end # @gtk - def self.line_y_intercept line - line.y - line_slope(line) * line.x + def self.line_y_intercept line, replace_infinity: nil + line.y - line_slope(line, replace_infinity: replace_infinity) * line.x + rescue Exception => e +raise <<-S +* ERROR: ~Geometry::line_y_intercept~ +The following exception was thrown for line: #{line} +#{e} + +Consider passing in ~replace_infinity: VALUE~ to handle for vertical lines. +S end # @gtk @@ -39833,14 +40994,22 @@ S end # @gtk - def self.line_intersect line_one, line_two - m1 = line_slope(line_one) - m2 = line_slope(line_two) - b1 = line_y_intercept(line_one) - b2 = line_y_intercept(line_two) + def self.line_intersect line_one, line_two, replace_infinity: nil + m1 = line_slope(line_one, replace_infinity: replace_infinity) + m2 = line_slope(line_two, replace_infinity: replace_infinity) + b1 = line_y_intercept(line_one, replace_infinity: replace_infinity) + b2 = line_y_intercept(line_two, replace_infinity: replace_infinity) x = (b1 - b2) / (m2 - m1) y = (-b2.fdiv(m2) + b1.fdiv(m1)).fdiv(1.fdiv(m1) - 1.fdiv(m2)) [x, y] + rescue Exception => e +raise <<-S +* ERROR: ~Geometry::line_intersect~ +The following exception was thrown for line_one: #{line_one}, line_two: #{line_two} +#{e} + +Consider passing in ~replace_infinity: VALUE~ to handle for vertical lines. +S end def self.contract_intersect_rect? @@ -40521,7 +41690,8 @@ module GTK value = Kernel.tick_count if value collection.each do |m| - self.instance_variable_set("@#{m.to_s}".to_sym, value) + m_to_s = m.to_s + self.instance_variable_set("@#{m_to_s}".to_sym, value) if m_to_s.strip.length > 0 rescue Exception => e raise e, <<-S * ERROR: @@ -41063,6 +42233,7 @@ class IOSWizard < Wizard :check_for_dev_profile, *app_metadata_retrieval_steps, + :determine_devcert, :clear_tmp_directory, :stage_app, @@ -41091,6 +42262,7 @@ class IOSWizard < Wizard :determine_app_version, *app_metadata_retrieval_steps, + :determine_prodcert, :clear_tmp_directory, :stage_app, @@ -41285,6 +42457,10 @@ teamid= appid= # appname is the name you want to show up underneath the app icon on the device. Keep it under 10 characters. appname= +# devcert is the certificate to use for development/deploying to your local device +devcert= +# prodcert is the certificate to use for distribution to the app store +prodcert= S end @@ -41320,7 +42496,7 @@ S def raise_ios_metadata_required raise WizardException.new( "* mygame/metadata/ios_metadata.txt needs to be filled out.", - "You need to update metadata/ios_metadata.txt with a valid teamid, appname, and appid.", + "You need to update metadata/ios_metadata.txt with a valid teamid, appname, appid, devcert, and prodcert.", "Instructions for where the values should come from are within metadata/ios_metadata.txt." ) end @@ -41360,7 +42536,19 @@ S def determine_app_id @app_id = ios_metadata.appid raise_ios_metadata_required if @app_id.strip.length == 0 - log_info "App Identifier is set to : #{@app_id}" + log_info "App Identifier is set to: #{@app_id}" + end + + def determine_devcert + @certificate_name = ios_metadata.devcert + raise_ios_metadata_required if @certificate_name.strip.length == 0 + log_info "Dev Certificate is set to: #{@certificate_name}" + end + + def determine_prodcert + @certificate_name = ios_metadata.prodcert + raise_ios_metadata_required if @certificate_name.strip.length == 0 + log_info "Production (Distribution) Certificate is set to: #{@certificate_name}" end def set_app_name name @@ -41382,12 +42570,6 @@ S sh "rm -rf #{tmp_directory}" end - def stage_app - log_info "Staging." - sh "mkdir -p #{tmp_directory}" - sh "cp -R #{relative_path}/dragonruby-ios.app \"#{tmp_directory}/#{@app_name}.app\"" - end - def set_app_id id log_info = "App Id set to: #{id}" @app_id = id @@ -41418,34 +42600,13 @@ S def check_for_certs log_info "Attempting to find certificates on your computer." - if !cli_app_exist?(security_cli_app) - raise WizardException.new( - "* It doesn't look like you have #{security_cli_app}.", - "** 1. Open Disk Utility and run First Aid.", - { w: 700, h: 148, path: get_reserved_sprite("disk-utility.png") }, - ) - end - - if valid_certs.length == 0 - raise WizardException.new( - "* It doesn't look like you have any valid certs installed.", - "** 1. Open Xcode.", - "** 2. Log into your developer account. Xcode -> Preferences -> Accounts.", - { w: 700, h: 98, path: get_reserved_sprite("login-xcode.png") }, - "** 3. After loggin in, select Manage Certificates...", - { w: 700, h: 115, path: get_reserved_sprite("manage-certificates.png") }, - "** 4. Add a certificate for Apple Development.", - { w: 700, h: 217, path: get_reserved_sprite("add-cert.png") }, - ) - raise "You do not have any Apple development certs on this computer." - end - if @production_build - @certificate_name = valid_certs.find_all { |f| f[:name].include? "Distribution" }.first[:name] + @certificate_name = ios_metadata[:prodcert] else - @certificate_name = valid_certs.find_all { |f| f[:name].include? "Development" }.first[:name] + @certificate_name = ios_metadata[:devcert] end - log_info "I will be using Certificate: '#{@certificate_name}'." + + log_info "I will be using certificate: '#{@certificate_name}'." end def idevice_id_cli_app @@ -41460,24 +42621,6 @@ S "xcodebuild" end - def valid_certs - certs = sh("#{security_cli_app} -q find-identity -p codesigning -v").each_line.map do |l| - if l.include?(")") && !l.include?("Developer ID") && (l.include?("Development") || l.include?("Distribution")) - l.strip - else - nil - end - end.reject_nil.map do |l| - number, id, name = l.split(' ', 3) - name = name.gsub("\"", "") if name - { - number: 1, - id: id, - name: name - } - end - end - def connected_devices sh("idevice_id -l").strip.each_line.map do |l| l.strip @@ -42007,6 +43150,9 @@ XML end def stage_app + log_info "Staging." + sh "mkdir -p #{tmp_directory}" + sh "cp -R #{relative_path}/dragonruby-ios.app \"#{tmp_directory}/#{@app_name}.app\"" sh %Q[cp -r "#{root_folder}/app/" "#{app_path}/app/"] sh %Q[cp -r "#{root_folder}/sounds/" "#{app_path}/sounds/"] sh %Q[cp -r "#{root_folder}/sprites/" "#{app_path}/sprites/"] @@ -43834,26 +44980,6 @@ S (0..self).to_a end - def >= other - return false if !other - return gte other - end - - def > other - return false if !other - return gt other - end - - def <= other - return false if !other - return lte other - end - - def < other - return false if !other - return gt other - end - # @gtk def map unless block_given? @@ -43939,34 +45065,6 @@ The object above is not a Numeric. S end - def - other - return self unless other - self - other - rescue Exception => e - __raise_arithmetic_exception__ other, :-, e - end - - def + other - return self unless other - self + other - rescue Exception => e - __raise_arithmetic_exception__ other, :+, e - end - - def * other - return self unless other - self * other - rescue Exception => e - __raise_arithmetic_exception__ other, :*, e - end - - def / other - return self unless other - self / other - rescue Exception => e - __raise_arithmetic_exception__ other, :/, e - end - def serialize self end @@ -44021,34 +45119,6 @@ class Fixnum return !even? end - def + other - return self unless other - self + other - rescue Exception => e - __raise_arithmetic_exception__ other, :+, e - end - - def * other - return self unless other - self * other - rescue Exception => e - __raise_arithmetic_exception__ other, :*, e - end - - def / other - return self unless other - self / other - rescue Exception => e - __raise_arithmetic_exception__ other, :/, e - end - - def - other - return self unless other - self - other - rescue Exception => e - __raise_arithmetic_exception__ other, :-, e - end - # Returns `-1` if the number is less than `0`. `+1` if the number # is greater than `0`. Returns `0` if the number is equal to `0`. # @@ -44104,34 +45174,6 @@ class Float alias_method :__original_multiply__, :* unless Float.instance_methods.include? :__original_multiply__ alias_method :__original_divide__, :- unless Float.instance_methods.include? :__original_divide__ - def - other - return self unless other - super - rescue Exception => e - __raise_arithmetic_exception__ other, :-, e - end - - def + other - return self unless other - super - rescue Exception => e - __raise_arithmetic_exception__ other, :+, e - end - - def * other - return self unless other - super - rescue Exception => e - __raise_arithmetic_exception__ other, :*, e - end - - def / other - return self unless other - super - rescue Exception => e - __raise_arithmetic_exception__ other, :/, e - end - def serialize self end @@ -44179,6 +45221,270 @@ class Integer end end +

+

recording.rb

+
# ./dragon/recording.rb
+# coding: utf-8
+# Copyright 2019 DragonRuby LLC
+# MIT License
+# recording.rb has been released under MIT (*only this file*).
+
+module GTK
+  # FIXME: Gross
+  # @gtk
+  class Replay
+    # @gtk
+    def self.start file_name = nil
+      $recording.start_replay file_name
+    end
+
+    # @gtk
+    def self.stop
+      $recording.stop_replay
+    end
+  end
+
+  # @gtk
+  class Recording
+    def initialize runtime
+      @runtime = runtime
+      @tick_count = 0
+      @global_input_order = 1
+    end
+
+    def tick
+      @tick_count += 1
+    end
+
+    def start_recording seed_number = nil
+      if !seed_number
+        log <<-S
+* ERROR:
+To start recording, you must provide an integer value to
+seed random number generation.
+S
+        $console.set_command "$recording.start SEED_NUMBER"
+        return
+      end
+
+      if @is_recording
+        log <<-S
+* ERROR:
+You are already recording, first cancel (or stop) the current recording.
+S
+        $console.set_command "$recording.cancel"
+        return
+      end
+
+      if @is_replaying
+        log <<-S
+* ERROR:
+You are currently replaying a recording, first stop the replay.
+S
+        return
+      end
+
+      log_info <<-S
+Recording has begun with RNG seed value set to #{seed_number}.
+To stop recording use stop_recording(filename).
+The recording will stop without saving a file if a filename is nil.
+S
+
+      $console.set_command "$recording.stop 'replay.txt'"
+      @runtime.__reset__
+      @seed_number = seed_number
+      @runtime.set_rng seed_number
+
+      @tick_count = 0
+      @global_input_order = 1
+      @is_recording = true
+      @input_history = []
+      @runtime.notify! "Recording started. When completed, open the console to save it using $recording.stop FILE_NAME (or cancel).", 300
+    end
+
+    # @gtk
+    def start seed_number = nil
+      start_recording seed_number
+    end
+
+    def is_replaying?
+      @is_replaying
+    end
+
+    def is_recording?
+      @is_recording
+    end
+
+    # @gtk
+    def stop file_name = nil
+      stop_recording file_name
+    end
+
+    # @gtk
+    def cancel
+      stop_recording_core
+      @runtime.notify! "Recording cancelled."
+    end
+
+    def stop_recording file_name = nil
+      if !file_name
+        log <<-S
+* ERROR:
+To please specify a file name when calling:
+$recording.stop FILE_NAME
+
+If you do NOT want to save the recording, call:
+$recording.cancel
+S
+        $console.set_command "$recording.stop 'replay.txt'"
+        return
+      end
+
+      if !@is_recording
+        log_info "You are not currently recording. Use start_recording(seed_number) to start recording."
+        $console.set_command "$recording.start"
+        return
+      end
+
+      if file_name
+        text = "replay_version 2.0\n"
+        text << "stopped_at #{@tick_count}\n"
+        text << "seed #{@seed_number}\n"
+        text << "recorded_at #{Time.now.to_s}\n"
+        @input_history.each do |items|
+          text << "#{items}\n"
+        end
+        @runtime.write_file file_name, text
+        @runtime.write_file 'last_replay.txt', text
+        log_info "The recording has been saved successfully at #{file_name}. You can use start_replay(\"#{file_name}\") to replay the recording."
+      end
+
+      $console.set_command "$replay.start '#{file_name}'"
+      stop_recording_core
+      @runtime.notify! "Recording saved to #{file_name}. To replay it: $replay.start \"#{file_name}\"."
+      log_info "You can run the replay later on startup using: ./dragonruby mygame --replay #{@replay_file_name}"
+      nil
+    end
+
+    def stop_recording_core
+      @is_recording = false
+      @input_history = nil
+      @last_history = nil
+      @runtime.__reset__
+    end
+
+    def start_replay file_name = nil
+      if !file_name
+        log <<-S
+* ERROR:
+Please provide a file name to $recording.start.
+S
+        $console.set_command "$replay.start 'replay.txt'"
+        return
+      end
+
+      text = @runtime.read_file file_name
+      return false unless text
+
+      if text.each_line.first.strip != "replay_version 2.0"
+        raise "The replay file #{file_name} is not compatible with this version of DragonRuby Game Toolkit. Please recreate the replay (sorry)."
+      end
+
+      @replay_file_name = file_name
+
+      $replay_data = { input_history: { } }
+      text.each_line do |l|
+        if l.strip.length == 0
+          next
+        elsif l.start_with? 'replay_version'
+          next
+        elsif l.start_with? 'seed'
+          $replay_data[:seed] = l.split(' ').last.to_i
+        elsif l.start_with? 'stopped_at'
+          $replay_data[:stopped_at] = l.split(' ').last.to_i
+        elsif l.start_with? 'recorded_at'
+          $replay_data[:recorded_at] = l.split(' ')[1..-1].join(' ')
+        elsif l.start_with? '['
+          name, value_1, value_2, value_count, id, tick_count = l.strip.gsub('[', '').gsub(']', '').split(',')
+          $replay_data[:input_history][tick_count.to_i] ||= []
+          $replay_data[:input_history][tick_count.to_i] << {
+            id: id.to_i,
+            name: name.gsub(':', '').to_sym,
+            value_1: value_1.to_f,
+            value_2: value_2.to_f,
+            value_count: value_count.to_i
+          }
+        else
+          raise "Replay data seems corrupt. I don't know how to parse #{l}."
+        end
+      end
+
+      $replay_data[:input_history].keys.each do |key|
+        $replay_data[:input_history][key] = $replay_data[:input_history][key].sort_by {|input| input[:id]}
+      end
+
+      @runtime.__reset__
+      @runtime.set_rng $replay_data[:seed]
+      @tick_count = 0
+      @is_replaying = true
+      log_info "Replay has been started."
+      @runtime.notify! "Replay started [#{@replay_file_name}]."
+    end
+
+    def stop_replay notification_message =  "Replay has been stopped."
+      if !is_replaying?
+        log <<-S
+* ERROR:
+No replay is currently running. Call $replay.start FILE_NAME to start a replay.
+S
+
+        $console.set_command "$replay.start 'replay.txt'"
+        return
+      end
+      log_info notification_message
+      @is_replaying = false
+      $replay_data = nil
+      @tick_count = 0
+      @global_input_order = 1
+      $console.set_command_silent "$replay.start '#{@replay_file_name}'"
+      @runtime.__reset__
+      @runtime.notify! notification_message
+    end
+
+    def record_input_history name, value_1, value_2, value_count, clear_cache = false
+      return if @is_replaying
+      return unless @is_recording
+      @input_history << [name, value_1, value_2, value_count, @global_input_order, @tick_count]
+      @global_input_order += 1
+    end
+
+    def stage_replay_values
+      return unless @is_replaying
+      return unless $replay_data
+
+      if $replay_data[:stopped_at] <= @tick_count
+        stop_replay "Replay completed [#{@replay_file_name}]. To rerun, bring up the Console and press enter."
+        return
+      end
+
+      inputs_this_tick = $replay_data[:input_history][@tick_count]
+
+      if @tick_count.zmod? 60
+        log_info "Replay ends in #{($replay_data[:stopped_at] - @tick_count).idiv 60} second(s)."
+      end
+
+      return unless inputs_this_tick
+      inputs_this_tick.each do |v|
+        args = []
+        args << v[:value_1] if v[:value_count] >= 1
+        args << v[:value_2] if v[:value_count] >= 2
+        args << :replay
+        $gtk.send v[:name], *args
+      end
+    end
+  end
+end
+
 

remote_hotload_client.rb

# ./dragon/remote_hotload_client.rb
@@ -44546,14 +45852,13 @@ module GTK
         log <<-S
 ** Invoking :#{name}...
 S
-        time_start = Time.now
         idx = 0
         r = nil
+        time_start = Time.now
         while idx < iterations
           r = proc.call
           idx += 1
         end
-
         result = (Time.now - time_start).round 3
 
         { name: name,
@@ -44676,7 +45981,7 @@ module GTK
         fn.each_send pass.borders,           self, :draw_border
         fn.each_send pass.static_borders,    self, :draw_border
 
-        if !$gtk.production
+        if !self.production
           fn.each_send pass.debug,           self, :draw_primitive
           fn.each_send pass.static_debug,    self, :draw_primitive
         end
@@ -44693,6 +45998,7 @@ module GTK
         if s.respond_to? :draw_override
           s.draw_override @ffi_draw
         else
+          s = s.as_hash if s.is_a? OpenEntity
           @ffi_draw.draw_solid_2 s.x, s.y, s.w, s.h,
                                  s.r, s.g, s.b, s.a,
                                  (s.blendmode_enum || 1)
@@ -44706,6 +46012,7 @@ module GTK
         if s.respond_to? :draw_override
           s.draw_override @ffi_draw
         else
+          s = s.as_hash if s.is_a? OpenEntity
           @ffi_draw.draw_sprite_4 s.x, s.y, s.w, s.h,
                                   (s.path || '').to_s,
                                   s.angle,
@@ -44725,6 +46032,7 @@ module GTK
         if s.respond_to? :draw_override
           s.draw_override @ffi_draw
         else
+          s = s.as_hash if s.is_a? OpenEntity
           @ffi_draw.draw_screenshot (s.path || '').to_s,
                                     s.x, s.y, s.w, s.h,
                                     s.angle,
@@ -44743,6 +46051,7 @@ module GTK
         if l.respond_to? :draw_override
           l.draw_override @ffi_draw
         else
+          l = l.as_hash if l.is_a? OpenEntity
           @ffi_draw.draw_label_3 l.x, l.y,
                                  (l.text || '').to_s,
                                  l.size_enum, l.alignment_enum,
@@ -44760,6 +46069,7 @@ module GTK
         if l.respond_to? :draw_override
           l.draw_override @ffi_draw
         else
+          l = l.as_hash if l.is_a? OpenEntity
           if l.x2
             @ffi_draw.draw_line_2 l.x, l.y, l.x2, l.y2,
                                   l.r, l.g, l.b, l.a,
@@ -44785,6 +46095,7 @@ module GTK
         if s.respond_to? :draw_override
           s.draw_override @ffi_draw
         else
+          s = s.as_hash if s.is_a? OpenEntity
           @ffi_draw.draw_border_2 s.x, s.y, s.w, s.h,
                                   s.r, s.g, s.b, s.a,
                                   (s.blendmode_enum || 1)
@@ -44850,13 +46161,8 @@ module GTK
             if @tick_speed_count > 60 * 2
               if framerate_below_threshold?
                 @last_framerate = current_framerate
-                if !@console.visible?
-                  if !@framerate_important_notification_happened
-                    log_important framerate_warning_message
-                  else
-                    log framerate_warning_message
-                  end
-                  @framerate_important_notification_happened = true
+                if !@console.visible? && !@recording.is_replaying?
+                  log framerate_warning_message
                 end
               end
 
@@ -45720,6 +47026,112 @@ module GTK
   end
 end
 
+
+

tweetcart.rb

+
# ./dragon/tweetcart.rb
+# coding: utf-8
+# Copyright 2019 DragonRuby LLC
+# MIT License
+# tweetcart.rb has been released under MIT (*only this file*).
+
+def $top_level.TICK &block
+  $top_level.define_method(:tick) do |args|
+    args.outputs[:scene].w = 160
+    args.outputs[:scene].h = 90
+    args.outputs[:scene].background_color = [0, 0, 0, 0]
+    block.call args
+    args.outputs.sprites << { x: 0, y: 0, w: 1280, h: 720, path: :scene }
+  end
+
+  def $top_level.bg! *rgb
+    r,g,b = rgb
+    r ||= 255
+    g ||= r
+    b ||= g
+    $args.outputs.background_color = [r, g, b]
+  end
+
+  def $top_level.slds
+    $args.outputs[:scene].sprites
+  end
+
+  def $top_level.slds! *os
+    if (os.first.is_a? Numeric)
+      sld!(*os)
+    else
+      os.each { |o| sld!(*o) }
+    end
+  end
+
+  def $top_level.sld! *params
+    x, y, w, h, r, g, b, a = nil
+    if params.length == 2
+      x, y = params
+    elsif params.length == 3 && (params.last.is_a? Array)
+      x = params[0]
+      y = params[1]
+      r, g, b, a = params[2]
+      r ||= 255
+      g ||= r
+      b ||= g
+      a ||= 255
+    elsif params.length == 4
+      x, y, w, h = params
+    elsif params.length == 5 && (params.last.is_a? Array)
+      x = params[0]
+      y = params[1]
+      w = params[2]
+      h = params[3]
+      r,g,b,a = params[4]
+      r ||= 255
+      g ||= r
+      b ||= g
+      a ||= 255
+    elsif params.length >= 7
+      x, y, w, h, r, g, b = params
+    else
+      raise "I don't know how to render #{params} with reasonable defaults."
+    end
+
+    w ||= 1
+    h ||= 1
+    r ||= 255
+    g ||= 255
+    b ||= 255
+    a ||= 255
+
+    slds << { x: x, y: y,
+              w: w, h: h,
+              r: r, g: g, b: b, a: a,
+              path: :pixel }
+  end
+end
+
+=begin
+wht  = [255] * 3
+red  = [255, 0, 0]
+blu  = [0, 130, 255]
+purp = [150, 80, 255]
+
+TICK {
+  bg! 0
+
+  slds << [0, 0, 3, 3, 0, 255, 0, 255]
+
+  sld!     10, 10
+  sld!     20, 20, 3, 2
+  sld!     30, 30, 2, 2, red
+  sld!     35, 35, blu
+
+  slds!    40, 40
+
+  slds!   [50, 50],
+          [60, 60, purp],
+          [70, 70, 10, 10, wht],
+          [80, 80, 4, 4, 255, 0, 255]
+}
+=end
+
 

wizards.rb

# ./dragon/wizards.rb
diff --git a/docs/docs.txt b/docs/docs.txt
index d6f5def..c0cc841 100644
--- a/docs/docs.txt
+++ b/docs/docs.txt
@@ -1654,6 +1654,34 @@ is currently in the file. Use ~GTK::Runtime#append_file~ to append to the file a
   end
 #+end_src
 
+* DOCS: ~GTK::Runtime#benchmark~
+You can use this function to compare the relative performance of methods.
+
+#+begin_src ruby
+  def tick args
+    # press r to run benchmark
+    if args.inputs.keyboard.key_down.r
+      args.gtk.console.show
+      args.gtk.benchmark iterations: 1000, # number of iterations
+                         # label for experiment
+                         using_numeric_map: -> () {
+                           # experiment body
+                           v = 100.map do |i|
+                             i * 100
+                           end
+                         },
+                         # label for experiment
+                         using_numeric_times: -> () {
+                           # experiment body
+                           v = []
+                           100.times do |i|
+                             v << i * 100
+                           end
+                         }
+    end
+  end
+#+end_src
+
 * DOCS: ~Array~
 
 The Array class has been extend to provide methods that
@@ -4199,7 +4227,7 @@ Follows is a source code listing for all files that have been open sourced. This
   # Use args.inputs.mouse.click.created_at
   
   # To see how many frames its been since the click occurred
-  # Use args.inputs.mouse.click.creat_at_elapsed
+  # Use args.inputs.mouse.click.created_at_elapsed
   
   # Saving the click in args.state can be quite useful
   
@@ -6840,17 +6868,17 @@ Follows is a source code listing for all files that have been open sourced. This
     end
   
     def calc_player_dx
-      player.y  += player.dy
-      player.dy += state.gravity
-      player.dy += player.dy * state.drag ** 2 * -1
-    end
-  
-    def calc_player_dy
       player.dx  = player.dx.clamp(-5,  5)
       player.dx *= 0.9
       player.x  += player.dx
     end
   
+    def calc_player_dy
+      player.y  += player.dy
+      player.dy += state.gravity
+      player.dy += player.dy * state.drag ** 2 * -1
+    end
+  
     def reset_player
       player.x  = 100
       player.y  = 720
@@ -6994,8 +7022,7 @@ Follows is a source code listing for all files that have been open sourced. This
       input
     end
   
-    # Sets default values
-    def defaults
+    def init_game
       s.platforms ||= [ # initializes platforms collection with two platforms using hashes
         new_platform(x: 0, y: 0, w: 700, h: 32, dx: 1, speed: 0, rect: nil),
         new_platform(x: 0, y: 300, w: 700, h: 32, dx: 1, speed: 0, rect: nil), # 300 pixels higher
@@ -7018,6 +7045,11 @@ Follows is a source code listing for all files that have been open sourced. This
       s.camera ||= { y: -100 } # shows view on screen (as the player moves upward, the camera does too)
     end
   
+    # Sets default values
+    def defaults
+      init_game
+    end
+  
     # Outputs objects onto the screen
     def render
       outputs.solids << s.platforms.map do |p| # outputs platforms onto screen
@@ -7105,7 +7137,9 @@ Follows is a source code listing for all files that have been open sourced. This
                                       rect: nil)
         end
       else
+        # game over
         s.as_hash.clear # otherwise clear the hash (no new platform is necessary)
+        init_game
       end
     end
   
@@ -7244,15 +7278,15 @@ Follows is a source code listing for all files that have been open sourced. This
   # ./samples/04_physics_and_collisions/08_bouncing_on_collision/app/block.rb
   DEGREES_TO_RADIANS = Math::PI / 180
   
-  class Block 
+  class Block
     def initialize(x, y, block_size, rotation)
       @x = x
-      @y = y 
+      @y = y
       @block_size = block_size
       @rotation = rotation
   
       #The repel velocity?
-      @velocity = {x: 2, y: 0}        
+      @velocity = {x: 2, y: 0}
   
       horizontal_offset = (3 * block_size) * Math.cos(rotation * DEGREES_TO_RADIANS)
       vertical_offset = block_size * Math.sin(rotation * DEGREES_TO_RADIANS)
@@ -7280,7 +7314,7 @@ Follows is a source code listing for all files that have been open sourced. This
   
         @imaginary_line = [ @x1, @y1, @x2, @y2 ]
       end
-      
+  
     end
   
     def draw args
@@ -7324,7 +7358,7 @@ Follows is a source code listing for all files that have been open sourced. This
   
       collision = false
       if @rotation >= 0
-        if (current_area < min_area && 
+        if (current_area < min_area &&
           current_area > 0 &&
           args.state.ball.center.y > @y1 &&
           args.state.ball.center.x < @x2)
@@ -7332,7 +7366,7 @@ Follows is a source code listing for all files that have been open sourced. This
           collision = true
         end
       else
-        if (current_area < min_area && 
+        if (current_area < min_area &&
           current_area > 0 &&
           args.state.ball.center.y > @y2 &&
           args.state.ball.center.x > @x1)
@@ -7340,7 +7374,7 @@ Follows is a source code listing for all files that have been open sourced. This
         collision = true
         end
       end
-      
+  
       return collision
     end
   
@@ -7361,7 +7395,7 @@ Follows is a source code listing for all files that have been open sourced. This
         x:args.state.ball.center.x-args.state.ball.velocity.x,
         y:args.state.ball.center.y-args.state.ball.velocity.y
       }
-      
+  
       velocityMag = (args.state.ball.velocity.x**2 + args.state.ball.velocity.y**2)**0.5 # the current velocity magnitude of the ball
       theta_ball = Math.atan2(args.state.ball.velocity.y, args.state.ball.velocity.x)         #the angle of the ball's velocity
       theta_repel = (180 * DEGREES_TO_RADIANS) - theta_ball + (@rotation * DEGREES_TO_RADIANS)
@@ -7383,7 +7417,7 @@ Follows is a source code listing for all files that have been open sourced. This
   
       dampener = 0.3
       ynew *= dampener * 0.5
-      
+  
       #If the bounce is very low, that means the ball is rolling and we don't want to dampenen the X velocity
       if ynew > -0.1
         xnew *= dampener
@@ -7392,7 +7426,7 @@ Follows is a source code listing for all files that have been open sourced. This
       #Add the sine component of gravity back in (X component)
       gravity_x = 4 * Math.sin(@rotation * DEGREES_TO_RADIANS)
       xnew += gravity_x
-    
+  
       args.state.ball.velocity.x = -xnew
       args.state.ball.velocity.y = -ynew
   
@@ -9806,12 +9840,23 @@ Follows is a source code listing for all files that have been open sourced. This
     # Starts the game with player x's turn and creates an array (to_a) for space combinations.
     # Calls methods necessary for the game to run properly.
     def tick
-      state.current_turn ||= :x
-      state.space_combinations = [-1, 0, 1].product([-1, 0, 1]).to_a
+      init_new_game
       render_board
       input_board
     end
   
+    def init_new_game
+      state.current_turn       ||= :x
+      state.space_combinations ||= [-1, 0, 1].product([-1, 0, 1]).to_a
+  
+      state.spaces             ||= {}
+  
+      state.space_combinations.each do |x, y|
+        state.spaces[x]    ||= {}
+        state.spaces[x][y] ||= state.new_entity(:space)
+      end
+    end
+  
     # Uses borders to create grid squares for the game's board. Also outputs the game pieces using labels.
     def render_board
       square_size = 80
@@ -9887,6 +9932,7 @@ Follows is a source code listing for all files that have been open sourced. This
     def input_restart_game
       return unless state.game_over
       gtk.reset
+      init_new_game
     end
   
     # Checks if x or o won the game.
@@ -10203,7 +10249,7 @@ Follows is a source code listing for all files that have been open sourced. This
     def calc_kill_zombie
   
       # Find all zombies that intersect with the player. They are considered killed.
-      killed_this_frame = state.zombies.find_all { |z| z.sprite.intersect_rect? state.player_sprite }
+      killed_this_frame = state.zombies.find_all { |z| z.sprite && (z.sprite.intersect_rect? state.player_sprite) }
       state.zombies = state.zombies - killed_this_frame # remove newly killed zombies from zombies collection
       state.killed_zombies += killed_this_frame # add newly killed zombies to killed zombies
   
@@ -11107,6 +11153,7 @@ Follows is a source code listing for all files that have been open sourced. This
   end
   
   def playtime_str t
+    return "" unless t
     minutes = (t / 60.0).floor
     seconds = t - (minutes * 60.0).to_f
     return minutes.to_s + ':' + seconds.floor.to_s + ((seconds - seconds.floor).to_s + "000")[1..3]
@@ -11219,7 +11266,7 @@ Follows is a source code listing for all files that have been open sourced. This
     results.playtime_slider_rect = progress_bar(args: args,
                                                 row:  2.5,
                                                 col:  2,
-                                                percentage: audio_entry.playtime / audio_entry.length_,
+                                                percentage: (audio_entry.playtime || 1) / (audio_entry.length_ || 1),
                                                 text: "#{playtime_str(audio_entry.playtime)} / #{playtime_str(audio_entry.length_)}")
   
     results.primitives << results.playtime_slider_rect.primitives
@@ -11419,21 +11466,6 @@ Follows is a source code listing for all files that have been open sourced. This
   192.168.1.65
 #+end_src
 
-*** Advanced Audio - Audio Mixer - Metadata - ios_metadata.txt
-#+begin_src ruby
-  # ./samples/07_advanced_audio/01_audio_mixer/metadata/ios_metadata.txt
-  # ios_metadata.txt is used by the Pro version of DragonRuby Game Toolkit to create iOS apps.
-  # Information about the Pro version can be found at: http://dragonruby.org/toolkit/game#purchase
-  
-  # teamid needs to be set to your assigned Team Id which can be found at https://developer.apple.com/account/#/membership/
-  teamid=
-  # appid needs to be set to your application identifier which can be found at https://developer.apple.com/account/resources/identifiers/list
-  appid=
-  # appname is the name you want to show up underneath the app icon on the device. Keep it under 10 characters.
-  appname=
-
-#+end_src
-
 *** Advanced Audio - Sound Synthesis - main.rb
 #+begin_src ruby
   # ./samples/07_advanced_audio/02_sound_synthesis/app/main.rb
@@ -12033,6 +12065,138 @@ Follows is a source code listing for all files that have been open sourced. This
 
 #+end_src
 
+*** Advanced Rendering - Labels With Wrapped Text - main.rb
+#+begin_src ruby
+  # ./samples/07_advanced_rendering/00_labels_with_wrapped_text/app/main.rb
+  def tick args
+    # defaults
+    args.state.scroll_location  ||= 0
+    args.state.textbox.messages ||= []
+    args.state.textbox.scroll   ||= 0
+  
+    # render
+    args.outputs.background_color = [0, 0, 0, 255]
+    render_messages args
+    render_instructions args
+  
+    # inputs
+    if args.inputs.keyboard.key_down.one
+      queue_message args, "Hello there neighbour! my name is mark, how is your day today?"
+    end
+  
+    if args.inputs.keyboard.key_down.two
+      queue_message args, "I'm doing great sir, actually I'm having a picnic today"
+    end
+  
+    if args.inputs.keyboard.key_down.three
+      queue_message args, "Well that sounds wonderful!"
+    end
+  
+    if args.inputs.keyboard.key_down.home
+      args.state.scroll_location = 1
+    end
+  
+    if args.inputs.keyboard.key_down.delete
+      clear_message_queue args
+    end
+  end
+  
+  def queue_message args, msg
+    args.state.textbox.messages.concat msg.wrapped_lines 50
+  end
+  
+  def clear_message_queue args
+    args.state.textbox.messages = nil
+    args.state.textbox.scroll = 0
+  end
+  
+  def render_messages args
+    args.outputs[:textbox].w = 400
+    args.outputs[:textbox].h = 720
+  
+    args.outputs.primitives << args.state.textbox.messages.each_with_index.map do |s, idx|
+      {
+        x: 0,
+        y: 20 * (args.state.textbox.messages.size - idx) + args.state.textbox.scroll * 20,
+        text: s,
+        size_enum: -3,
+        alignment_enum: 0,
+        r: 255, g:255, b: 255, a: 255
+      }
+    end
+  
+    args.outputs[:textbox].labels << args.state.textbox.messages.each_with_index.map do |s, idx|
+      {
+        x: 0,
+        y: 20 * (args.state.textbox.messages.size - idx) + args.state.textbox.scroll * 20,
+        text: s,
+        size_enum: -3,
+        alignment_enum: 0,
+        r: 255, g:255, b: 255, a: 255
+      }
+    end
+  
+    args.outputs[:textbox].borders << [0, 0, args.outputs[:textbox].w, 720]
+  
+    args.state.textbox.scroll += args.inputs.mouse.wheel.y unless args.inputs.mouse.wheel.nil?
+  
+    if args.state.scroll_location > 0
+      args.state.textbox.scroll = 0
+      args.state.scroll_location = 0
+    end
+  
+    args.outputs.sprites << [900, 0, args.outputs[:textbox].w, 720, :textbox]
+  end
+  
+  def render_instructions args
+    args.outputs.labels << [30,
+                            30.from_top,
+                            "press 1, 2, 3 to display messages, MOUSE WHEEL to scroll, HOME to go to top, BACKSPACE to delete.",
+                            0, 255, 255]
+  
+    args.outputs.primitives << [0, 55.from_top, 1280, 30, :pixel, 0, 255, 0, 0, 0].sprite
+  end
+
+#+end_src
+
+*** Advanced Rendering - Rotating Label - main.rb
+#+begin_src ruby
+  # ./samples/07_advanced_rendering/00_rotating_label/app/main.rb
+  def tick args
+    # set the render target width and height to match the label
+    args.outputs[:scene].w = 220
+    args.outputs[:scene].h = 30
+  
+  
+    # make the background transparent
+    args.outputs[:scene].background_color = [255, 255, 255, 0]
+  
+    # set the blendmode of the label to 0 (no blending)
+    # center it inside of the scene
+    # set the vertical_alignment_enum to 1 (center)
+    args.outputs[:scene].labels  << { x: 0,
+                                      y: 15,
+                                      text: "label in render target",
+                                      blendmode_enum: 0,
+                                      vertical_alignment_enum: 1 }
+  
+    # add a border to the render target
+    args.outputs[:scene].borders << { x: 0,
+                                      y: 0,
+                                      w: args.outputs[:scene].w,
+                                      h: args.outputs[:scene].h }
+  
+    # add the rendertarget to the main output as a sprite
+    args.outputs.sprites << { x: 640 - args.outputs[:scene].w.half,
+                              y: 360 - args.outputs[:scene].h.half,
+                              w: args.outputs[:scene].w,
+                              h: args.outputs[:scene].h,
+                              angle: args.state.tick_count,
+                              path: :scene }
+  end
+
+#+end_src
+
 *** Advanced Rendering - Simple Render Targets - main.rb
 #+begin_src ruby
   # ./samples/07_advanced_rendering/01_simple_render_targets/app/main.rb
@@ -13198,7 +13362,7 @@ Follows is a source code listing for all files that have been open sourced. This
     def serialize
       {state: state, inputs: inputs, outputs: outputs, grid: grid }
     end
-    
+  
     def inspect
       serialize.to_s
     end
@@ -13268,12 +13432,12 @@ Follows is a source code listing for all files that have been open sourced. This
       default_player(0, 0, 64, 64,
                      "sprites/player/player_#{state.player_cyan.orientation}_standing.png")
     end
-    
+  
     def new_player_magenta
       default_player(64, 0, 64, 64,
                      "sprites/player/player_#{state.player_magenta.orientation}_standing.png")
     end
-    
+  
     def new_camera_magenta
       default_camera(0,0,720,720)
     end
@@ -13285,7 +13449,8 @@ Follows is a source code listing for all files that have been open sourced. This
     def new_camera_center
       default_camera(0,0,1280,720)
     end
-    
+  
+  
     def new_room
       default_floor_tile(0,0,1024,1024,'sprites/rooms/camera_room.png')
     end
@@ -13310,7 +13475,7 @@ Follows is a source code listing for all files that have been open sourced. This
       state.player_cyan.x += state.player_cyan.dx
       state.player_cyan.y += state.player_cyan.dy
     end
-    
+  
     def calc_player_magenta
       state.player_magenta.x += state.player_magenta.dx
       state.player_magenta.y += state.player_magenta.dy
@@ -13325,7 +13490,7 @@ Follows is a source code listing for all files that have been open sourced. This
       state.camera_center.x += (targetX - state.camera_center.x) * 0.1 * timeScale
       state.camera_center.y += (targetY - state.camera_center.y) * 0.1 * timeScale
     end
-    
+  
   
     def calc_camera_magenta
       timeScale = 1
@@ -13362,7 +13527,7 @@ Follows is a source code listing for all files that have been open sourced. This
     def calc_trauma_decay
       state.trauma = state.trauma * 0.9
     end
-    
+  
     def calc_random_float_range(min, max)
       rand * (max-min) + min
     end
@@ -13390,7 +13555,7 @@ Follows is a source code listing for all files that have been open sourced. This
                                   g: 255,
                                   b: 255}
     end
-    
+  
     def render_player_magenta
       outputs[:scene].sprites << {x: state.player_magenta.x,
                                   y: state.player_magenta.y,
@@ -13436,16 +13601,16 @@ Follows is a source code listing for all files that have been open sourced. This
        render_camera_magenta_scene
        render_camera_cyan_scene
   
-       angle = Math.atan((state.player_magenta.y - state.player_cyan.y)/(state.player_magenta.x- state.player_cyan.x)) * 180/Math::PI 
+       angle = Math.atan((state.player_magenta.y - state.player_cyan.y)/(state.player_magenta.x- state.player_cyan.x)) * 180/Math::PI
        output_split_camera angle
-       
+  
     end
   
     def render_camera_magenta_scene
        zoomFactor = 1
        offsetX = 32
        offsetY = 32
-       
+  
        outputs[:scene_magenta].sprites << {x: (-state.camera_magenta.x*2),
                                            y: (-state.camera_magenta.y),
                                            w: outputs[:scene].width*2,
@@ -13471,7 +13636,7 @@ Follows is a source code listing for all files that have been open sourced. This
       outputs.labels << [128,64,"#{quadrant}",8,2,255,0,255,255]
       if quadrant == 1
         set_camera_attributes(w: 640, h: 720, m_x: 640, m_y: 0, c_x: 0, c_y: 0)
-        
+  
       elsif quadrant == 2
         set_camera_attributes(w: 1280, h: 360, m_x: 0, m_y: 360, c_x: 0, c_y: 0)
   
@@ -13489,7 +13654,7 @@ Follows is a source code listing for all files that have been open sourced. This
       state.camera_cyan.h = h + 64
       outputs[:scene_cyan].width = (w) * 2
       outputs[:scene_cyan].height = h
-      
+  
       state.camera_magenta.w = w + 64
       state.camera_magenta.h = h + 64
       outputs[:scene_magenta].width = (w) * 2
@@ -13501,7 +13666,7 @@ Follows is a source code listing for all files that have been open sourced. This
                           path: :scene_magenta}
       outputs.sprites << {x: c_x,
                           y: c_y,
-                          w: w, 
+                          w: w,
                           h: h,
                           path: :scene_cyan}
     end
@@ -13509,7 +13674,7 @@ Follows is a source code listing for all files that have been open sourced. This
     def add_trauma amount
       state.trauma = [state.trauma + amount, 1.0].min
     end
-    
+  
     def remove_trauma amount
       state.trauma = [state.trauma - amount, 0.0].max
     end
@@ -13549,7 +13714,7 @@ Follows is a source code listing for all files that have been open sourced. This
       outputs.labels << [128,512,"#{state.player_cyan.x.round()}",8,2,0,255,255,255]
       outputs.labels << [128,480,"#{state.player_cyan.y.round()}",8,2,0,255,255,255]
     end
-    
+  
     def input_move_magenta
       if inputs.keyboard.key_held.w
         state.player_magenta.dy = 5
@@ -13583,7 +13748,7 @@ Follows is a source code listing for all files that have been open sourced. This
     $camera_movement.outputs = args.outputs
     $camera_movement.state   = args.state
     $camera_movement.grid    = args.grid
-    $camera_movement.tick  
+    $camera_movement.tick
   end
 
 #+end_src
@@ -14404,9 +14569,97 @@ Follows is a source code listing for all files that have been open sourced. This
 
 #+end_src
 
+*** Performance - Sprites As Struct - main.rb
+#+begin_src ruby
+  # ./samples/09_performance/03_sprites_as_struct/app/main.rb
+  # create a Struct variant that allows for named parameters on construction.
+  class NamedStruct < Struct
+    def initialize **opts
+      super(*members.map { |k| opts[k] })
+    end
+  end
+  
+  # create a Star NamedStruct
+  Star = NamedStruct.new(:x, :y, :w, :h, :path, :s,
+                         :angle, :angle_anchor_x, :angle_anchor_y,
+                         :r, :g, :b, :a,
+                         :tile_x, :tile_y,
+                         :tile_w, :tile_h,
+                         :source_x, :source_y,
+                         :source_w, :source_h,
+                         :flip_horizontally, :flip_vertically,
+                         :blendmode_enum)
+  
+  # Sprites represented as Structs. They require a little bit more code than Hashes,
+  # but are the a little faster to render too.
+  def random_x args
+    (args.grid.w.randomize :ratio) * -1
+  end
+  
+  def random_y args
+    (args.grid.h.randomize :ratio) * -1
+  end
+  
+  def random_speed
+    1 + (4.randomize :ratio)
+  end
+  
+  def new_star args
+    Star.new x: (random_x args),
+             y: (random_y args),
+             w: 4, h: 4,
+             path: 'sprites/tiny-star.png',
+             s: random_speed
+  end
+  
+  def move_star args, star
+    star.x += star[:s]
+    star.y += star[:s]
+    if star.x > args.grid.w || star.y > args.grid.h
+      star.x = (random_x args)
+      star.y = (random_y args)
+      star[:s] = random_speed
+    end
+  end
+  
+  def tick args
+    args.state.star_count ||= 0
+  
+    # sets console command when sample app initially opens
+    if Kernel.global_tick_count == 0
+      puts ""
+      puts ""
+      puts "========================================================="
+      puts "* INFO: Sprites, Structs"
+      puts "* INFO: Please specify the number of sprites to render."
+      args.gtk.console.set_command "reset_with count: 100"
+    end
+  
+    # init
+    if args.state.tick_count == 0
+      args.state.stars = args.state.star_count.map { |i| new_star args }
+    end
+  
+    # update
+    args.state.stars.each { |s| move_star args, s }
+  
+    # render
+    args.outputs.sprites << args.state.stars
+    args.outputs.background_color = [0, 0, 0]
+    args.outputs.primitives << args.gtk.current_framerate_primitives
+  end
+  
+  # resets game, and assigns star count given by user
+  def reset_with count: count
+    $gtk.reset
+    $gtk.args.state.star_count = count
+  end
+
+#+end_src
+
 *** Performance - Sprites As Strict Entities - main.rb
 #+begin_src ruby
-  # ./samples/09_performance/03_sprites_as_strict_entities/app/main.rb
+  # ./samples/09_performance/04_sprites_as_strict_entities/app/main.rb
   # Sprites represented as StrictEntities using the queue ~args.outputs.sprites~
   # yields apis access similar to Entities, but all properties that can be set on the
   # entity must be predefined with a default value. Strict entities do not support the
@@ -14484,7 +14737,7 @@ Follows is a source code listing for all files that have been open sourced. This
 
 *** Performance - Sprites As Classes - main.rb
 #+begin_src ruby
-  # ./samples/09_performance/04_sprites_as_classes/app/main.rb
+  # ./samples/09_performance/05_sprites_as_classes/app/main.rb
   # Sprites represented as Classes using the queue ~args.outputs.sprites~.
   # gives you full control of property declaration and method invocation.
   # They are more performant than OpenEntities and StrictEntities, but more code upfront.
@@ -14545,7 +14798,7 @@ Follows is a source code listing for all files that have been open sourced. This
 
 *** Performance - Static Sprites As Classes - main.rb
 #+begin_src ruby
-  # ./samples/09_performance/05_static_sprites_as_classes/app/main.rb
+  # ./samples/09_performance/06_static_sprites_as_classes/app/main.rb
   # Sprites represented as Classes using the queue ~args.outputs.static_sprites~.
   # bypasses the queue behavior of ~args.outputs.sprites~. All instances are held
   # by reference. You get better performance, but you are mutating state of held objects
@@ -14607,7 +14860,7 @@ Follows is a source code listing for all files that have been open sourced. This
 
 *** Performance - Static Sprites As Classes With Custom Drawing - main.rb
 #+begin_src ruby
-  # ./samples/09_performance/06_static_sprites_as_classes_with_custom_drawing/app/main.rb
+  # ./samples/09_performance/07_static_sprites_as_classes_with_custom_drawing/app/main.rb
   # Sprites represented as Classes, with a draw_override method, and using the queue ~args.outputs.static_sprites~.
   # is the fastest approach. This is comparable to what other game engines set as the default behavior.
   # There are tradeoffs for all this speed if the creation of a full blown class, and bypassing
@@ -14701,7 +14954,7 @@ Follows is a source code listing for all files that have been open sourced. This
 
 *** Performance - Collision Limits - main.rb
 #+begin_src ruby
-  # ./samples/09_performance/07_collision_limits/app/main.rb
+  # ./samples/09_performance/08_collision_limits/app/main.rb
   =begin
   
    Reminders:
@@ -14760,6 +15013,31 @@ Follows is a source code listing for all files that have been open sourced. This
 
 #+end_src
 
+*** Advanced Debugging - Logging - main.rb
+#+begin_src ruby
+  # ./samples/10_advanced_debugging/00_logging/app/main.rb
+  def tick args
+    args.outputs.background_color = [255, 255, 255, 0]
+    if args.state.tick_count == 0
+      args.gtk.log_spam "log level spam"
+      args.gtk.log_debug "log level debug"
+      args.gtk.log_info "log level info"
+      args.gtk.log_warn "log level warn"
+      args.gtk.log_error "log level error"
+      args.gtk.log_unfiltered "log level unfiltered"
+      puts "This is a puts call"
+      args.gtk.console.show
+    end
+  
+    if args.state.tick_count == 60
+      puts "This is a puts call on tick 60"
+    elsif args.state.tick_count == 120
+      puts "This is a puts call on tick 120"
+    end
+  end
+
+#+end_src
+
 *** Advanced Debugging - Trace Debugging - main.rb
 #+begin_src ruby
   # ./samples/10_advanced_debugging/01_trace_debugging/app/main.rb
@@ -15603,12 +15881,12 @@ Follows is a source code listing for all files that have been open sourced. This
     GTK::Entity.__reset_id__!
     args.state.player_one = "test"
     result = args.gtk.serialize_state args.state
-    assert.equal! result, "{:entity_id=>3, :entity_keys_by_ref=>{}, :tick_count=>-1, :player_one=>\"test\"}"
+    assert.equal! result, "{:entity_id=>4, :entity_keys_by_ref=>{}, :tick_count=>-1, :player_one=>\"test\"}"
   
     GTK::Entity.__reset_id__!
     args.gtk.write_file 'state.txt', ''
     result = args.gtk.serialize_state 'state.txt', args.state
-    assert.equal! result, "{:entity_id=>3, :entity_keys_by_ref=>{}, :tick_count=>-1, :player_one=>\"test\"}"
+    assert.equal! result, "{:entity_id=>4, :entity_keys_by_ref=>{}, :tick_count=>-1, :player_one=>\"test\"}"
   end
   
   def test_deserialize args, assert
@@ -15657,7 +15935,7 @@ Follows is a source code listing for all files that have been open sourced. This
     args.state.player_two = args.state.new_entity_strict(:player_strict, name: "Ken", blood_type: nil)
   
     serialized_state = args.gtk.serialize_state args.state
-    assert.equal! serialized_state, '{:entity_id=>9, :entity_keys_by_ref=>{}, :tick_count=>-1, :player_one=>{:entity_id=>1, :entity_name=>:player, :entity_keys_by_ref=>{}, :entity_type=>:player, :created_at=>-1, :global_created_at=>-1, :name=>"Ryu"}, :player_two=>{:entity_id=>2, :entity_name=>:player_strict, :entity_type=>:player_strict, :created_at=>-1, :global_created_at_elapsed=>-1, :entity_strict=>true, :entity_keys_by_ref=>{:entity_type=>:entity_name, :global_created_at_elapsed=>:created_at}, :name=>"Ken", :blood_type=>nil}}'
+    assert.equal! serialized_state, '{:entity_id=>7, :entity_keys_by_ref=>{}, :tick_count=>-1, :player_one=>{:entity_id=>1, :entity_name=>:player, :entity_keys_by_ref=>{}, :entity_type=>:player, :created_at=>-1, :global_created_at=>-1, :name=>"Ryu"}, :player_two=>{:entity_id=>2, :entity_name=>:player_strict, :entity_type=>:player_strict, :created_at=>-1, :global_created_at_elapsed=>-1, :entity_strict=>true, :entity_keys_by_ref=>{:entity_type=>:entity_name, :global_created_at_elapsed=>:created_at}, :name=>"Ken", :blood_type=>nil}}'
   
     GTK::Entity.__reset_id__!
     deserialized_state = args.gtk.deserialize_state serialized_state
@@ -15714,6 +15992,18 @@ Follows is a source code listing for all files that have been open sourced. This
     deserialized_state = args.gtk.deserialize_state serialized_state
     assert.equal! deserialized_state.strict_entity.one, deserialized_state.strict_entity.two
   end
+  
+  def test_serialization_excludes_thrash_count args, assert
+    GTK::Entity.__reset_id__!
+    args.state.player.name = "Ryu"
+    # force a nil pun
+    if args.state.player.age > 30
+    end
+    assert.equal! args.state.player.as_hash[:__thrash_count__][:>], 1
+    result = args.gtk.serialize_state args.state
+    assert.false! (result.include? "__thrash_count__"),
+                  "The __thrash_count__ key exists in state when it shouldn't have."
+  end
 
 #+end_src
 
@@ -15876,11 +16166,13 @@ Follows is a source code listing for all files that have been open sourced. This
 *** Http - Retrieve Images - main.rb
 #+begin_src ruby
   # ./samples/11_http/01_retrieve_images/app/main.rb
+  $gtk.register_cvar 'app.warn_seconds', "seconds to wait before starting", :uint, 11
+  
   def tick args
     args.outputs.background_color = [0, 0, 0]
   
     # Show a warning at the start.
-    args.state.warning_debounce ||= 11 * 60
+    args.state.warning_debounce ||= args.cvars['app.warn_seconds'].value * 60
     if args.state.warning_debounce > 0
       args.state.warning_debounce -= 1
       args.outputs.labels << [640, 600, "This app shows random images from the Internet.", 10, 1, 255, 255, 255]
@@ -15932,11 +16224,12 @@ Follows is a source code listing for all files that have been open sourced. This
 
 #+end_src
 
-*** Http - Web Server - main.rb
+*** Http - In Game Web Server Http Get - main.rb
 #+begin_src ruby
-  # ./samples/11_http/02_web_server/app/main.rb
+  # ./samples/11_http/02_in_game_web_server_http_get/app/main.rb
   def tick args
     args.state.port ||= 3000
+    args.state.reqnum ||= 0
     # by default the embedded webserver runs on port 9001 (the port number is over 9000) and is disabled in a production build
     # to enable the http server in a production build, you need to manually start
     # the server up:
@@ -15965,6 +16258,84 @@ Follows is a source code listing for all files that have been open sourced. This
 
 #+end_src
 
+*** Http - In Game Web Server Http Post - main.rb
+#+begin_src ruby
+  # ./samples/11_http/03_in_game_web_server_http_post/app/main.rb
+  def tick args
+    # defaults
+    args.state.post_button      = args.layout.rect(row: 0, col: 0, w: 5, h: 1).merge(text: "execute http_post")
+    args.state.post_body_button = args.layout.rect(row: 1, col: 0, w: 5, h: 1).merge(text: "execute http_post_body")
+    args.state.request_to_s ||= ""
+    args.state.request_body ||= ""
+  
+    # render
+    args.state.post_button.yield_self do |b|
+      args.outputs.borders << b
+      args.outputs.labels  << b.merge(text: b.text,
+                                      y:    b.y + 30,
+                                      x:    b.x + 10)
+    end
+  
+    args.state.post_body_button.yield_self do |b|
+      args.outputs.borders << b
+      args.outputs.labels  << b.merge(text: b.text,
+                                      y:    b.y + 30,
+                                      x:    b.x + 10)
+    end
+  
+    draw_label args, 0,  6, "Request:", args.state.request_to_s
+    draw_label args, 0, 14, "Request Body Unaltered:", args.state.request_body
+  
+    # input
+    if args.inputs.mouse.click
+      # ============= HTTP_POST =============
+      if (args.inputs.mouse.inside_rect? args.state.post_button)
+        # ========= DATA TO SEND ===========
+        form_fields = { "userId" => "#{Time.now.to_i}" }
+        # ==================================
+  
+        args.gtk.http_post "http://localhost:9001/testing",
+                           form_fields,
+                           ["Content-Type: application/x-www-form-urlencoded"]
+  
+        args.gtk.notify! "http_post"
+      end
+  
+      # ============= HTTP_POST_BODY =============
+      if (args.inputs.mouse.inside_rect? args.state.post_body_button)
+        # =========== DATA TO SEND ==============
+        json = "{ \"userId\": \"#{Time.now.to_i}\"}"
+        # ==================================
+  
+        args.gtk.http_post_body "http://localhost:9001/testing",
+                                json,
+                                ["Content-Type: application/json", "Content-Length: #{json.length}"]
+  
+        args.gtk.notify! "http_post_body"
+      end
+    end
+  
+    # calc
+    args.inputs.http_requests.each do |r|
+      puts "#{r}"
+      if r.uri == "/testing"
+        puts r
+        args.state.request_to_s = "#{r}"
+        args.state.request_body = r.raw_body
+        r.respond 200, "ok"
+      end
+    end
+  end
+  
+  def draw_label args, row, col, header, text
+    label_pos = args.layout.rect(row: row, col: col, w: 0, h: 0)
+    args.outputs.labels << "#{header}\n\n#{text}".wrapped_lines(80).map_with_index do |l, i|
+      { x: label_pos.x, y: label_pos.y - (i * 15), text: l, size_enum: -2 }
+    end
+  end
+
+#+end_src
+
 *** C Extensions - Basics - main.rb
 #+begin_src ruby
   # ./samples/12_c_extensions/01_basics/app/main.rb
@@ -17401,8 +17772,8 @@ Follows is a source code listing for all files that have been open sourced. This
         calc
         # Calc Path
       end
-      render 
-      input  
+      render
+      input
     end
   
     def defaults
@@ -17479,7 +17850,7 @@ Follows is a source code listing for all files that have been open sourced. This
         [24, 9] => true,
         [25, 8] => true,
         [25, 9] => true,
-      }    
+      }
   
       # Variables that are used by the breadth first search
       # Storing cells that the search has visited, prevents unnecessary steps
@@ -17498,36 +17869,36 @@ Follows is a source code listing for all files that have been open sourced. This
       # We store this value, because we want to remember the value even when
       # the user's cursor is no longer over what they're interacting with, but
       # they are still clicking down on the mouse.
-      state.current_input ||= :none 
+      state.current_input ||= :none
     end
   
     def calc
       # Setup the search to start from the star
-      search.frontier << grid.star                   
+      search.frontier << grid.star
       search.came_from[grid.star] = nil
   
       # Until there are no more cells to expand from
-      until search.frontier.empty? 
+      until search.frontier.empty?
         # Takes the next frontier cell
-        new_frontier = search.frontier.shift 
+        new_frontier = search.frontier.shift
         # For each of its neighbors
-        adjacent_neighbors(new_frontier).each do |neighbor| 
+        adjacent_neighbors(new_frontier).each do |neighbor|
           # That have not been visited and are not walls
-          unless search.came_from.has_key?(neighbor) || grid.walls.has_key?(neighbor) 
+          unless search.came_from.has_key?(neighbor) || grid.walls.has_key?(neighbor)
             # Add them to the frontier and mark them as visited in the first grid
             # Unless the target has been visited
             # Add the neighbor to the frontier and remember which cell it came from
-            search.frontier << neighbor 
+            search.frontier << neighbor
             search.came_from[neighbor] = new_frontier
           end
         end
       end
     end
-    
+  
   
     # Draws everything onto the screen
     def render
-      render_background       
+      render_background
       # render_heat_map
       render_walls
       # render_path
@@ -17546,7 +17917,7 @@ Follows is a source code listing for all files that have been open sourced. This
       if current_cell && parent_cell
         outputs.lines << [(current_cell.x + 0.5) * grid.cell_size, (current_cell.y + 0.5) * grid.cell_size,
         (parent_cell.x + 0.5) * grid.cell_size, (parent_cell.y + 0.5) * grid.cell_size, purple]
-          
+  
       end
       render_trail(parent_cell)
     end
@@ -17572,8 +17943,8 @@ Follows is a source code listing for all files that have been open sourced. This
   
     # Draws what the grid looks like with nothing on it
     def render_background
-      render_unvisited  
-      render_grid_lines 
+      render_unvisited
+      render_grid_lines
     end
   
     # Draws both grids
@@ -17588,7 +17959,7 @@ Follows is a source code listing for all files that have been open sourced. This
       end
   
       for y in 0..grid.height
-        outputs.lines << horizontal_line(y) 
+        outputs.lines << horizontal_line(y)
       end
     end
   
@@ -17604,7 +17975,7 @@ Follows is a source code listing for all files that have been open sourced. This
   
     # Draws the walls on both grids
     def render_walls
-      grid.walls.each_key do |wall| 
+      grid.walls.each_key do |wall|
         outputs.solids << [scale_up(wall), wall_color]
       end
     end
@@ -17612,12 +17983,12 @@ Follows is a source code listing for all files that have been open sourced. This
     # Renders the star on both grids
     def render_star
       outputs.sprites << [scale_up(grid.star), 'star.png']
-    end 
+    end
   
     # Renders the target on both grids
     def render_target
       outputs.sprites << [scale_up(grid.target), 'target.png']
-    end 
+    end
   
     # Labels the grids
     def render_labels
@@ -17677,14 +18048,14 @@ Follows is a source code listing for all files that have been open sourced. This
       # The program has to remember that the user is dragging an object
       # even when the mouse is no longer over that object
       # So detecting input and processing input is separate
-      # detect_input          
-      # process_input         
+      # detect_input
+      # process_input
       if inputs.mouse.up
         state.current_input = :none
       elsif star_clicked?
         state.current_input = :star
       end
-        
+  
       if mouse_inside_grid?
         unless grid.target == cell_closest_to_mouse
           grid.target = cell_closest_to_mouse
@@ -17702,33 +18073,33 @@ Follows is a source code listing for all files that have been open sourced. This
     # mouse left click is held
     def detect_input
       # When the mouse is up, nothing is being edited
-      if inputs.mouse.up                  
-        state.current_input = :none          
+      if inputs.mouse.up
+        state.current_input = :none
       # When the star in the no second grid is clicked
-      elsif star_clicked?                 
-        state.current_input = :star          
+      elsif star_clicked?
+        state.current_input = :star
       # When the target in the no second grid is clicked
-      elsif target_clicked?                 
-        state.current_input = :target          
+      elsif target_clicked?
+        state.current_input = :target
       # When a wall in the first grid is clicked
-      elsif wall_clicked?                 
-        state.current_input = :remove_wall   
+      elsif wall_clicked?
+        state.current_input = :remove_wall
       # When the first grid is clicked
-      elsif grid_clicked?                 
+      elsif grid_clicked?
         state.current_input = :add_wall
       end
     end
   
     # Processes click and drag based on what the user is currently dragging
     def process_input
-      if state.current_input == :star         
-        input_star                            
-      elsif state.current_input == :target         
-        input_target                            
-      elsif state.current_input == :remove_wall  
-        input_remove_wall                     
-      elsif state.current_input == :add_wall     
-        input_add_wall                        
+      if state.current_input == :star
+        input_star
+      elsif state.current_input == :target
+        input_target
+      elsif state.current_input == :remove_wall
+        input_remove_wall
+      elsif state.current_input == :add_wall
+        input_add_wall
       end
     end
   
@@ -17736,10 +18107,10 @@ Follows is a source code listing for all files that have been open sourced. This
     # Only resets the search if the star changes position
     # Called whenever the user is editing the star (puts mouse down on star)
     def input_star
-      old_star = grid.star.clone 
+      old_star = grid.star.clone
       grid.star = cell_closest_to_mouse
-      unless old_star == grid.star 
-        reset_search 
+      unless old_star == grid.star
+        reset_search
       end
     end
   
@@ -17747,10 +18118,10 @@ Follows is a source code listing for all files that have been open sourced. This
     # Only reset_searchs the search if the target changes position
     # Called whenever the user is editing the target (puts mouse down on target)
     def input_target
-      old_target = grid.target.clone 
+      old_target = grid.target.clone
       grid.target = cell_closest_to_mouse
-      unless old_target == grid.target 
-        reset_search 
+      unless old_target == grid.target
+        reset_search
       end
     end
   
@@ -17759,32 +18130,32 @@ Follows is a source code listing for all files that have been open sourced. This
       # The mouse needs to be inside the grid, because we only want to remove walls
       # the cursor is directly over
       # Recalculations should only occur when a wall is actually deleted
-      if mouse_inside_grid? 
+      if mouse_inside_grid?
         if grid.walls.has_key?(cell_closest_to_mouse)
-          grid.walls.delete(cell_closest_to_mouse) 
-          reset_search 
+          grid.walls.delete(cell_closest_to_mouse)
+          reset_search
         end
       end
     end
   
     # Adds a wall in the first grid in the cell the mouse is over
     def input_add_wall
-      if mouse_inside_grid? 
+      if mouse_inside_grid?
         unless grid.walls.has_key?(cell_closest_to_mouse)
-          grid.walls[cell_closest_to_mouse] = true 
-          reset_search 
+          grid.walls[cell_closest_to_mouse] = true
+          reset_search
         end
       end
     end
   
-    
+  
     # Whenever the user edits the grid,
     # The search has to be reset_searchd upto the current step
     # with the current grid as the initial state of the grid
     def reset_search
       # Reset_Searchs the search
-      search.frontier  = [] 
-      search.came_from = {} 
+      search.frontier  = []
+      search.came_from = {}
       search.path      = {}
     end
   
@@ -17792,21 +18163,21 @@ Follows is a source code listing for all files that have been open sourced. This
     # Returns a list of adjacent cells
     # Used to determine what the next cells to be added to the frontier are
     def adjacent_neighbors(cell)
-      neighbors = [] 
+      neighbors = []
   
       # Gets all the valid neighbors into the array
       # From southern neighbor, clockwise
-      neighbors << [cell.x, cell.y - 1] unless cell.y == 0 
-      neighbors << [cell.x - 1, cell.y] unless cell.x == 0 
-      neighbors << [cell.x, cell.y + 1] unless cell.y == grid.height - 1 
-      neighbors << [cell.x + 1, cell.y] unless cell.x == grid.width - 1 
+      neighbors << [cell.x, cell.y - 1] unless cell.y == 0
+      neighbors << [cell.x - 1, cell.y] unless cell.x == 0
+      neighbors << [cell.x, cell.y + 1] unless cell.y == grid.height - 1
+      neighbors << [cell.x + 1, cell.y] unless cell.x == grid.width - 1
   
       # Sorts the neighbors so the rendered path is a zigzag path
       # Cells in a diagonal direction are given priority
       # Comment this line to see the difference
       neighbors = neighbors.sort_by { |neighbor_x, neighbor_y|  proximity_to_star(neighbor_x, neighbor_y) }
   
-      neighbors 
+      neighbors
     end
   
     # Finds the vertical and horizontal distance of a cell from the star
@@ -17831,13 +18202,13 @@ Follows is a source code listing for all files that have been open sourced. This
     # Finding the cell closest to the mouse helps with this
     def cell_closest_to_mouse
       # Closest cell to the mouse in the first grid
-      x = (inputs.mouse.point.x / grid.cell_size).to_i 
-      y = (inputs.mouse.point.y / grid.cell_size).to_i 
+      x = (inputs.mouse.point.x / grid.cell_size).to_i
+      y = (inputs.mouse.point.y / grid.cell_size).to_i
       # Bound x and y to the grid
-      x = grid.width - 1 if x > grid.width - 1 
-      y = grid.height - 1 if y > grid.height - 1 
+      x = grid.width - 1 if x > grid.width - 1
+      y = grid.height - 1 if y > grid.height - 1
       # Return closest cell
-      [x, y] 
+      [x, y]
     end
   
     # Signal that the user is going to be moving the star from the first grid
@@ -17865,13 +18236,13 @@ Follows is a source code listing for all files that have been open sourced. This
   
     # Light brown
     def unvisited_color
-      [221, 212, 213] 
+      [221, 212, 213]
       # [255, 255, 255]
     end
   
     # Camo Green
     def wall_color
-      [134, 134, 120] 
+      [134, 134, 120]
     end
   
     # Pastel White
@@ -17909,7 +18280,7 @@ Follows is a source code listing for all files that have been open sourced. This
     end
   
     # Every tick, new args are passed, and the Breadth First Search tick is called
-    $breadcrumbs ||= Breadcrumbs.new(args)
+    $breadcrumbs ||= Breadcrumbs.new
     $breadcrumbs.args = args
     $breadcrumbs.tick
   end
@@ -17966,8 +18337,8 @@ Follows is a source code listing for all files that have been open sourced. This
         # And calculate the path
         calc_path
       end
-      render 
-      input  
+      render
+      input
     end
   
     def defaults
@@ -17983,14 +18354,14 @@ Follows is a source code listing for all files that have been open sourced. This
       # This step is roughly the grid's width * height
       # When anim_steps equals max_steps no more calculations will occur
       # and the slider will be at the end
-      state.max_steps  ||= args.state.grid.width * args.state.grid.height 
+      state.max_steps  ||= args.state.grid.width * args.state.grid.height
   
       # The location of the star and walls of the grid
       # They can be modified to have a different initial grid
       # Walls are stored in a hash for quick look up when doing the search
       state.star   ||= [2, 8]
       state.target ||= [10, 5]
-      state.walls  ||= {}    
+      state.walls  ||= {}
   
       # Variables that are used by the breadth first search
       # Storing cells that the search has visited, prevents unnecessary steps
@@ -18013,12 +18384,12 @@ Follows is a source code listing for all files that have been open sourced. This
       # We store this value, because we want to remember the value even when
       # the user's cursor is no longer over what they're interacting with, but
       # they are still clicking down on the mouse.
-      state.current_input ||= :none 
+      state.current_input ||= :none
     end
   
     # Draws everything onto the screen
     def render
-      render_background       
+      render_background
       render_heat_map
       render_walls
       render_path
@@ -18031,8 +18402,8 @@ Follows is a source code listing for all files that have been open sourced. This
   
     # Draws what the grid looks like with nothing on it
     def render_background
-      render_unvisited  
-      render_grid_lines 
+      render_unvisited
+      render_grid_lines
     end
   
     # Draws both grids
@@ -18049,7 +18420,7 @@ Follows is a source code listing for all files that have been open sourced. This
       end
   
       for y in 0..grid.height
-        outputs.lines << horizontal_line(y) 
+        outputs.lines << horizontal_line(y)
         outputs.lines << early_exit_horizontal_line(y)
       end
     end
@@ -18076,7 +18447,7 @@ Follows is a source code listing for all files that have been open sourced. This
   
     # Draws the walls on both grids
     def render_walls
-      state.walls.each_key do |wall| 
+      state.walls.each_key do |wall|
         outputs.solids << [scale_up(wall), wall_color]
         outputs.solids << [early_exit_scale_up(wall), wall_color]
       end
@@ -18086,13 +18457,13 @@ Follows is a source code listing for all files that have been open sourced. This
     def render_star
       outputs.sprites << [scale_up(state.star), 'star.png']
       outputs.sprites << [early_exit_scale_up(state.star), 'star.png']
-    end 
+    end
   
     # Renders the target on both grids
     def render_target
       outputs.sprites << [scale_up(state.target), 'target.png']
       outputs.sprites << [early_exit_scale_up(state.target), 'target.png']
-    end 
+    end
   
     # Labels the grids
     def render_labels
@@ -18184,8 +18555,8 @@ Follows is a source code listing for all files that have been open sourced. This
       # The program has to remember that the user is dragging an object
       # even when the mouse is no longer over that object
       # So detecting input and processing input is separate
-      detect_input          
-      process_input         
+      detect_input
+      process_input
     end
   
     # Determines what the user is editing and stores the value
@@ -18193,53 +18564,53 @@ Follows is a source code listing for all files that have been open sourced. This
     # mouse left click is held
     def detect_input
       # When the mouse is up, nothing is being edited
-      if inputs.mouse.up                  
-        state.current_input = :none          
+      if inputs.mouse.up
+        state.current_input = :none
       # When the star in the no second grid is clicked
-      elsif star_clicked?                 
-        state.current_input = :star          
+      elsif star_clicked?
+        state.current_input = :star
       # When the star in the second grid is clicked
-      elsif star2_clicked?                 
-        state.current_input = :star2          
+      elsif star2_clicked?
+        state.current_input = :star2
       # When the target in the no second grid is clicked
-      elsif target_clicked?                 
-        state.current_input = :target          
+      elsif target_clicked?
+        state.current_input = :target
       # When the target in the second grid is clicked
-      elsif target2_clicked?                 
-        state.current_input = :target2 
+      elsif target2_clicked?
+        state.current_input = :target2
       # When a wall in the first grid is clicked
-      elsif wall_clicked?                 
-        state.current_input = :remove_wall   
+      elsif wall_clicked?
+        state.current_input = :remove_wall
       # When a wall in the second grid is clicked
-      elsif wall2_clicked?                 
+      elsif wall2_clicked?
         state.current_input = :remove_wall2
       # When the first grid is clicked
-      elsif grid_clicked?                 
+      elsif grid_clicked?
         state.current_input = :add_wall
       # When the second grid is clicked
-      elsif grid2_clicked?                 
+      elsif grid2_clicked?
         state.current_input = :add_wall2
       end
     end
   
     # Processes click and drag based on what the user is currently dragging
     def process_input
-      if state.current_input == :star         
-        input_star                            
+      if state.current_input == :star
+        input_star
       elsif state.current_input == :star2
-        input_star2                            
-      elsif state.current_input == :target         
-        input_target                            
-      elsif state.current_input == :target2         
-        input_target2                            
-      elsif state.current_input == :remove_wall  
-        input_remove_wall                     
+        input_star2
+      elsif state.current_input == :target
+        input_target
+      elsif state.current_input == :target2
+        input_target2
+      elsif state.current_input == :remove_wall
+        input_remove_wall
       elsif state.current_input == :remove_wall2
-        input_remove_wall2                     
-      elsif state.current_input == :add_wall     
-        input_add_wall                        
-      elsif state.current_input == :add_wall2     
-        input_add_wall2                        
+        input_remove_wall2
+      elsif state.current_input == :add_wall
+        input_add_wall
+      elsif state.current_input == :add_wall2
+        input_add_wall2
       end
     end
   
@@ -18247,10 +18618,10 @@ Follows is a source code listing for all files that have been open sourced. This
     # Only resets the search if the star changes position
     # Called whenever the user is editing the star (puts mouse down on star)
     def input_star
-      old_star = state.star.clone 
+      old_star = state.star.clone
       state.star = cell_closest_to_mouse
-      unless old_star == state.star 
-        reset_search 
+      unless old_star == state.star
+        reset_search
       end
     end
   
@@ -18258,10 +18629,10 @@ Follows is a source code listing for all files that have been open sourced. This
     # Only resets the search if the star changes position
     # Called whenever the user is editing the star (puts mouse down on star)
     def input_star2
-      old_star = state.star.clone 
+      old_star = state.star.clone
       state.star = cell_closest_to_mouse2
-      unless old_star == state.star 
-        reset_search 
+      unless old_star == state.star
+        reset_search
       end
     end
   
@@ -18269,10 +18640,10 @@ Follows is a source code listing for all files that have been open sourced. This
     # Only reset_searchs the search if the target changes position
     # Called whenever the user is editing the target (puts mouse down on target)
     def input_target
-      old_target = state.target.clone 
+      old_target = state.target.clone
       state.target = cell_closest_to_mouse
-      unless old_target == state.target 
-        reset_search 
+      unless old_target == state.target
+        reset_search
       end
     end
   
@@ -18280,10 +18651,10 @@ Follows is a source code listing for all files that have been open sourced. This
     # Only reset_searchs the search if the target changes position
     # Called whenever the user is editing the target (puts mouse down on target)
     def input_target2
-      old_target = state.target.clone 
+      old_target = state.target.clone
       state.target = cell_closest_to_mouse2
-      unless old_target == state.target 
-        reset_search 
+      unless old_target == state.target
+        reset_search
       end
     end
   
@@ -18292,10 +18663,10 @@ Follows is a source code listing for all files that have been open sourced. This
       # The mouse needs to be inside the grid, because we only want to remove walls
       # the cursor is directly over
       # Recalculations should only occur when a wall is actually deleted
-      if mouse_inside_grid? 
+      if mouse_inside_grid?
         if state.walls.has_key?(cell_closest_to_mouse)
-          state.walls.delete(cell_closest_to_mouse) 
-          reset_search 
+          state.walls.delete(cell_closest_to_mouse)
+          reset_search
         end
       end
     end
@@ -18305,31 +18676,31 @@ Follows is a source code listing for all files that have been open sourced. This
       # The mouse needs to be inside the grid, because we only want to remove walls
       # the cursor is directly over
       # Recalculations should only occur when a wall is actually deleted
-      if mouse_inside_grid2? 
+      if mouse_inside_grid2?
         if state.walls.has_key?(cell_closest_to_mouse2)
-          state.walls.delete(cell_closest_to_mouse2) 
-          reset_search 
+          state.walls.delete(cell_closest_to_mouse2)
+          reset_search
         end
       end
     end
   
     # Adds a wall in the first grid in the cell the mouse is over
     def input_add_wall
-      if mouse_inside_grid? 
+      if mouse_inside_grid?
         unless state.walls.has_key?(cell_closest_to_mouse)
-          state.walls[cell_closest_to_mouse] = true 
-          reset_search 
+          state.walls[cell_closest_to_mouse] = true
+          reset_search
         end
       end
     end
   
-    
+  
     # Adds a wall in the second grid in the cell the mouse is over
     def input_add_wall2
-      if mouse_inside_grid2? 
+      if mouse_inside_grid2?
         unless state.walls.has_key?(cell_closest_to_mouse2)
-          state.walls[cell_closest_to_mouse2] = true 
-          reset_search 
+          state.walls[cell_closest_to_mouse2] = true
+          reset_search
         end
       end
     end
@@ -18339,10 +18710,10 @@ Follows is a source code listing for all files that have been open sourced. This
     # with the current grid as the initial state of the grid
     def reset_search
       # Reset_Searchs the search
-      state.frontier  = [] 
-      state.visited   = {} 
-      state.early_exit_visited   = {} 
-      state.came_from = {} 
+      state.frontier  = []
+      state.visited   = {}
+      state.early_exit_visited   = {}
+      state.came_from = {}
       state.path      = {}
     end
   
@@ -18350,23 +18721,23 @@ Follows is a source code listing for all files that have been open sourced. This
     def step
       # The setup to the search
       # Runs once when there are no visited cells
-      if state.visited.empty?  
-        state.visited[state.star] = true              
-        state.early_exit_visited[state.star] = true              
-        state.frontier << state.star                   
+      if state.visited.empty?
+        state.visited[state.star] = true
+        state.early_exit_visited[state.star] = true
+        state.frontier << state.star
         state.came_from[state.star] = nil
       end
   
       # A step in the search
-      unless state.frontier.empty? 
+      unless state.frontier.empty?
         # Takes the next frontier cell
-        new_frontier = state.frontier.shift 
+        new_frontier = state.frontier.shift
         # For each of its neighbors
-        adjacent_neighbors(new_frontier).each do |neighbor| 
+        adjacent_neighbors(new_frontier).each do |neighbor|
           # That have not been visited and are not walls
-          unless state.visited.has_key?(neighbor) || state.walls.has_key?(neighbor) 
+          unless state.visited.has_key?(neighbor) || state.walls.has_key?(neighbor)
             # Add them to the frontier and mark them as visited in the first grid
-            state.visited[neighbor] = true 
+            state.visited[neighbor] = true
             # Unless the target has been visited
             unless state.visited.has_key?(state.target)
               # Mark the neighbor as visited in the second grid as well
@@ -18374,32 +18745,32 @@ Follows is a source code listing for all files that have been open sourced. This
             end
   
             # Add the neighbor to the frontier and remember which cell it came from
-            state.frontier << neighbor 
+            state.frontier << neighbor
             state.came_from[neighbor] = new_frontier
           end
         end
       end
     end
-    
+  
   
     # Returns a list of adjacent cells
     # Used to determine what the next cells to be added to the frontier are
     def adjacent_neighbors(cell)
-      neighbors = [] 
+      neighbors = []
   
       # Gets all the valid neighbors into the array
       # From southern neighbor, clockwise
-      neighbors << [cell.x, cell.y - 1] unless cell.y == 0 
-      neighbors << [cell.x - 1, cell.y] unless cell.x == 0 
-      neighbors << [cell.x, cell.y + 1] unless cell.y == grid.height - 1 
-      neighbors << [cell.x + 1, cell.y] unless cell.x == grid.width - 1 
+      neighbors << [cell.x, cell.y - 1] unless cell.y == 0
+      neighbors << [cell.x - 1, cell.y] unless cell.x == 0
+      neighbors << [cell.x, cell.y + 1] unless cell.y == grid.height - 1
+      neighbors << [cell.x + 1, cell.y] unless cell.x == grid.width - 1
   
       # Sorts the neighbors so the rendered path is a zigzag path
       # Cells in a diagonal direction are given priority
       # Comment this line to see the difference
       neighbors = neighbors.sort_by { |neighbor_x, neighbor_y|  proximity_to_star(neighbor_x, neighbor_y) }
   
-      neighbors 
+      neighbors
     end
   
     # Finds the vertical and horizontal distance of a cell from the star
@@ -18424,13 +18795,13 @@ Follows is a source code listing for all files that have been open sourced. This
     # Finding the cell closest to the mouse helps with this
     def cell_closest_to_mouse
       # Closest cell to the mouse in the first grid
-      x = (inputs.mouse.point.x / grid.cell_size).to_i 
-      y = (inputs.mouse.point.y / grid.cell_size).to_i 
+      x = (inputs.mouse.point.x / grid.cell_size).to_i
+      y = (inputs.mouse.point.y / grid.cell_size).to_i
       # Bound x and y to the grid
-      x = grid.width - 1 if x > grid.width - 1 
-      y = grid.height - 1 if y > grid.height - 1 
+      x = grid.width - 1 if x > grid.width - 1
+      y = grid.height - 1 if y > grid.height - 1
       # Return closest cell
-      [x, y] 
+      [x, y]
     end
   
     # When the user grabs the star and puts their cursor to the far right
@@ -18438,15 +18809,15 @@ Follows is a source code listing for all files that have been open sourced. This
     # Finding the cell closest to the mouse in the second grid helps with this
     def cell_closest_to_mouse2
       # Closest cell grid to the mouse in the second
-      x = (inputs.mouse.point.x / grid.cell_size).to_i 
-      y = (inputs.mouse.point.y / grid.cell_size).to_i 
+      x = (inputs.mouse.point.x / grid.cell_size).to_i
+      y = (inputs.mouse.point.y / grid.cell_size).to_i
       # Translate the cell to the first grid
       x -= grid.width + 1
       # Bound x and y to the first grid
-      x = grid.width - 1 if x > grid.width - 1 
-      y = grid.height - 1 if y > grid.height - 1 
+      x = grid.width - 1 if x > grid.width - 1
+      y = grid.height - 1 if y > grid.height - 1
       # Return closest cell
-      [x, y] 
+      [x, y]
     end
   
     # Signal that the user is going to be moving the star from the first grid
@@ -18525,12 +18896,12 @@ Follows is a source code listing for all files that have been open sourced. This
   
     # Light brown
     def unvisited_color
-      [221, 212, 213] 
+      [221, 212, 213]
     end
   
     # Camo Green
     def wall_color
-      [134, 134, 120] 
+      [134, 134, 120]
     end
   
     # Pastel White
@@ -18560,7 +18931,7 @@ Follows is a source code listing for all files that have been open sourced. This
     end
   
     # Every tick, new args are passed, and the Breadth First Search tick is called
-    $early_exit_breadth_first_search ||= EarlyExitBreadthFirstSearch.new(args)
+    $early_exit_breadth_first_search ||= EarlyExitBreadthFirstSearch.new
     $early_exit_breadth_first_search.args = args
     $early_exit_breadth_first_search.tick
   end
@@ -18596,8 +18967,8 @@ Follows is a source code listing for all files that have been open sourced. This
     # The next step in the search is calculated
     def tick
       defaults
-      render 
-      input  
+      render
+      input
       calc
     end
   
@@ -18614,7 +18985,7 @@ Follows is a source code listing for all files that have been open sourced. This
       # Walls are stored in a hash for quick look up when doing the search
       state.star   ||= [1, 5]
       state.target ||= [8, 4]
-      state.walls  ||= {[1, 1] => true, [2, 1] => true, [3, 1] => true, [1, 2] => true, [2, 2] => true, [3, 2] => true}    
+      state.walls  ||= {[1, 1] => true, [2, 1] => true, [3, 1] => true, [1, 2] => true, [2, 2] => true, [3, 2] => true}
       state.hills  ||= {
         [4, 1] => true,
         [5, 1] => true,
@@ -18649,7 +19020,7 @@ Follows is a source code listing for all files that have been open sourced. This
       # We store this value, because we want to remember the value even when
       # the user's cursor is no longer over what they're interacting with, but
       # they are still clicking down on the mouse.
-      state.user_input ||= :none 
+      state.user_input ||= :none
   
       # Values that are used for the breadth first search
       # Keeping track of what cells were visited prevents counting cells multiple times
@@ -18673,7 +19044,7 @@ Follows is a source code listing for all files that have been open sourced. This
   
     # Draws everything onto the screen
     def render
-      render_background       
+      render_background
   
       render_heat_maps
   
@@ -18688,8 +19059,8 @@ Follows is a source code listing for all files that have been open sourced. This
   
     # Draws what the grid looks like with nothing on it
     def render_background
-      render_unvisited  
-      render_grid_lines 
+      render_unvisited
+      render_grid_lines
       render_labels
     end
   
@@ -18708,7 +19079,7 @@ Follows is a source code listing for all files that have been open sourced. This
       end
   
       for y in 0..grid.height
-        outputs.lines << horizontal_line(y) 
+        outputs.lines << horizontal_line(y)
         outputs.lines << shifted_horizontal_line(y)
       end
     end
@@ -18821,16 +19192,16 @@ Follows is a source code listing for all files that have been open sourced. This
     def render_star
       outputs.sprites << [scale_up(state.star), 'star.png']
       outputs.sprites << [move_and_scale_up(state.star), 'star.png']
-    end 
+    end
   
     # Renders the target on both grids
     def render_target
       outputs.sprites << [scale_up(state.target), 'target.png']
       outputs.sprites << [move_and_scale_up(state.target), 'target.png']
-    end 
+    end
   
     def render_hills
-      state.hills.each_key do |hill| 
+      state.hills.each_key do |hill|
         outputs.solids << [scale_up(hill), hill_color]
         outputs.solids << [move_and_scale_up(hill), hill_color]
       end
@@ -18838,7 +19209,7 @@ Follows is a source code listing for all files that have been open sourced. This
   
     # Draws the walls on both grids
     def render_walls
-      state.walls.each_key do |wall| 
+      state.walls.each_key do |wall|
         outputs.solids << [scale_up(wall), wall_color]
         outputs.solids << [move_and_scale_up(wall), wall_color]
       end
@@ -18921,7 +19292,7 @@ Follows is a source code listing for all files that have been open sourced. This
       # If the mouse was clicked this tick
       if inputs.mouse.down
         # Determine what the user is editing and edit the state.user_input variable
-        determine_input          
+        determine_input
       end
   
       # Process user input based on user_input variable and current mouse position
@@ -18934,43 +19305,43 @@ Follows is a source code listing for all files that have been open sourced. This
     # mouse left click is held
     def determine_input
       # If the mouse is over the star in the first grid
-      if mouse_over_star?                 
+      if mouse_over_star?
         # The user is editing the star from the first grid
-        state.user_input = :star          
+        state.user_input = :star
       # If the mouse is over the star in the second grid
-      elsif mouse_over_star2?                 
+      elsif mouse_over_star2?
         # The user is editing the star from the second grid
-        state.user_input = :star2          
+        state.user_input = :star2
       # If the mouse is over the target in the first grid
-      elsif mouse_over_target?                 
+      elsif mouse_over_target?
         # The user is editing the target from the first grid
-        state.user_input = :target          
+        state.user_input = :target
       # If the mouse is over the target in the second grid
-      elsif mouse_over_target2?                 
+      elsif mouse_over_target2?
         # The user is editing the target from the second grid
-        state.user_input = :target2 
+        state.user_input = :target2
       # If the mouse is over a wall in the first grid
-      elsif mouse_over_wall?                 
+      elsif mouse_over_wall?
         # The user is removing a wall from the first grid
-        state.user_input = :remove_wall   
+        state.user_input = :remove_wall
       # If the mouse is over a wall in the second grid
-      elsif mouse_over_wall2?                 
+      elsif mouse_over_wall2?
         # The user is removing a wall from the second grid
         state.user_input = :remove_wall2
       # If the mouse is over a hill in the first grid
-      elsif mouse_over_hill?                 
+      elsif mouse_over_hill?
         # The user is adding a wall from the first grid
-        state.user_input = :add_wall   
+        state.user_input = :add_wall
       # If the mouse is over a hill in the second grid
-      elsif mouse_over_hill2?                 
+      elsif mouse_over_hill2?
         # The user is adding a wall from the second grid
         state.user_input = :add_wall2
       # If the mouse is over the first grid
-      elsif mouse_over_grid?                 
+      elsif mouse_over_grid?
         # The user is adding a hill from the first grid
         state.user_input = :add_hill
       # If the mouse is over the second grid
-      elsif mouse_over_grid2?                 
+      elsif mouse_over_grid2?
         # The user is adding a hill from the second grid
         state.user_input = :add_hill2
       end
@@ -18978,26 +19349,26 @@ Follows is a source code listing for all files that have been open sourced. This
   
     # Processes click and drag based on what the user is currently dragging
     def process_input
-      if state.user_input == :star         
-        input_star                            
+      if state.user_input == :star
+        input_star
       elsif state.user_input == :star2
-        input_star2                            
-      elsif state.user_input == :target         
-        input_target                            
-      elsif state.user_input == :target2         
-        input_target2                            
-      elsif state.user_input == :remove_wall  
-        input_remove_wall                     
+        input_star2
+      elsif state.user_input == :target
+        input_target
+      elsif state.user_input == :target2
+        input_target2
+      elsif state.user_input == :remove_wall
+        input_remove_wall
       elsif state.user_input == :remove_wall2
-        input_remove_wall2                     
-      elsif state.user_input == :add_hill     
-        input_add_hill                        
-      elsif state.user_input == :add_hill2     
-        input_add_hill2                        
-      elsif state.user_input == :add_wall     
-        input_add_wall                        
-      elsif state.user_input == :add_wall2     
-        input_add_wall2                        
+        input_remove_wall2
+      elsif state.user_input == :add_hill
+        input_add_hill
+      elsif state.user_input == :add_hill2
+        input_add_hill2
+      elsif state.user_input == :add_wall
+        input_add_wall
+      elsif state.user_input == :add_wall2
+        input_add_wall2
       end
     end
   
@@ -19010,26 +19381,26 @@ Follows is a source code listing for all files that have been open sourced. This
         calc_dijkstra
       end
     end
-    
+  
   
     def calc_breadth_first
       # Sets up the Breadth First Search
-      breadth_first_search.visited[state.star]   = true              
-      breadth_first_search.frontier              << state.star                   
+      breadth_first_search.visited[state.star]   = true
+      breadth_first_search.frontier              << state.star
       breadth_first_search.came_from[state.star] = nil
   
       until breadth_first_search.frontier.empty?
         return if breadth_first_search.visited.has_key?(state.target)
         # A step in the search
         # Takes the next frontier cell
-        new_frontier = breadth_first_search.frontier.shift 
+        new_frontier = breadth_first_search.frontier.shift
         # For each of its neighbors
-        adjacent_neighbors(new_frontier).each do | neighbor | 
+        adjacent_neighbors(new_frontier).each do | neighbor |
           # That have not been visited and are not walls
-          unless breadth_first_search.visited.has_key?(neighbor) || state.walls.has_key?(neighbor) 
+          unless breadth_first_search.visited.has_key?(neighbor) || state.walls.has_key?(neighbor)
             # Add them to the frontier and mark them as visited in the first grid
-            breadth_first_search.visited[neighbor] = true 
-            breadth_first_search.frontier << neighbor 
+            breadth_first_search.visited[neighbor] = true
+            breadth_first_search.frontier << neighbor
             # Remember which cell the neighbor came from
             breadth_first_search.came_from[neighbor] = new_frontier
           end
@@ -19089,12 +19460,12 @@ Follows is a source code listing for all files that have been open sourced. This
     # Only resets the search if the star changes position
     # Called whenever the user is editing the star (puts mouse down on star)
     def input_star
-      old_star = state.star.clone 
+      old_star = state.star.clone
       unless cell_closest_to_mouse == state.target
-        state.star = cell_closest_to_mouse 
+        state.star = cell_closest_to_mouse
       end
-      unless old_star == state.star 
-        reset_search 
+      unless old_star == state.star
+        reset_search
       end
     end
   
@@ -19102,12 +19473,12 @@ Follows is a source code listing for all files that have been open sourced. This
     # Only resets the search if the star changes position
     # Called whenever the user is editing the star (puts mouse down on star)
     def input_star2
-      old_star = state.star.clone 
+      old_star = state.star.clone
       unless cell_closest_to_mouse2 == state.target
         state.star = cell_closest_to_mouse2
       end
-      unless old_star == state.star 
-        reset_search 
+      unless old_star == state.star
+        reset_search
       end
     end
   
@@ -19115,12 +19486,12 @@ Follows is a source code listing for all files that have been open sourced. This
     # Only reset_searchs the search if the target changes position
     # Called whenever the user is editing the target (puts mouse down on target)
     def input_target
-      old_target = state.target.clone 
+      old_target = state.target.clone
       unless cell_closest_to_mouse == state.star
         state.target = cell_closest_to_mouse
       end
-      unless old_target == state.target 
-        reset_search 
+      unless old_target == state.target
+        reset_search
       end
     end
   
@@ -19128,12 +19499,12 @@ Follows is a source code listing for all files that have been open sourced. This
     # Only reset_searchs the search if the target changes position
     # Called whenever the user is editing the target (puts mouse down on target)
     def input_target2
-      old_target = state.target.clone 
+      old_target = state.target.clone
       unless cell_closest_to_mouse2 == state.star
         state.target = cell_closest_to_mouse2
       end
-      unless old_target == state.target 
-        reset_search 
+      unless old_target == state.target
+        reset_search
       end
     end
   
@@ -19142,11 +19513,11 @@ Follows is a source code listing for all files that have been open sourced. This
       # The mouse needs to be inside the grid, because we only want to remove walls
       # the cursor is directly over
       # Recalculations should only occur when a wall is actually deleted
-      if mouse_over_grid? 
+      if mouse_over_grid?
         if state.walls.has_key?(cell_closest_to_mouse) or state.hills.has_key?(cell_closest_to_mouse)
-          state.walls.delete(cell_closest_to_mouse) 
-          state.hills.delete(cell_closest_to_mouse) 
-          reset_search 
+          state.walls.delete(cell_closest_to_mouse)
+          state.hills.delete(cell_closest_to_mouse)
+          reset_search
         end
       end
     end
@@ -19156,21 +19527,21 @@ Follows is a source code listing for all files that have been open sourced. This
       # The mouse needs to be inside the grid, because we only want to remove walls
       # the cursor is directly over
       # Recalculations should only occur when a wall is actually deleted
-      if mouse_over_grid2? 
+      if mouse_over_grid2?
         if state.walls.has_key?(cell_closest_to_mouse2) or state.hills.has_key?(cell_closest_to_mouse2)
-          state.walls.delete(cell_closest_to_mouse2) 
-          state.hills.delete(cell_closest_to_mouse2) 
-          reset_search 
+          state.walls.delete(cell_closest_to_mouse2)
+          state.hills.delete(cell_closest_to_mouse2)
+          reset_search
         end
       end
     end
   
     # Adds a hill in the first grid in the cell the mouse is over
     def input_add_hill
-      if mouse_over_grid? 
+      if mouse_over_grid?
         unless state.hills.has_key?(cell_closest_to_mouse)
-          state.hills[cell_closest_to_mouse] = true 
-          reset_search 
+          state.hills[cell_closest_to_mouse] = true
+          reset_search
         end
       end
     end
@@ -19178,32 +19549,32 @@ Follows is a source code listing for all files that have been open sourced. This
   
     # Adds a hill in the second grid in the cell the mouse is over
     def input_add_hill2
-      if mouse_over_grid2? 
+      if mouse_over_grid2?
         unless state.hills.has_key?(cell_closest_to_mouse2)
-          state.hills[cell_closest_to_mouse2] = true 
-          reset_search 
+          state.hills[cell_closest_to_mouse2] = true
+          reset_search
         end
       end
     end
   
     # Adds a wall in the first grid in the cell the mouse is over
     def input_add_wall
-      if mouse_over_grid? 
+      if mouse_over_grid?
         unless state.walls.has_key?(cell_closest_to_mouse)
-          state.hills.delete(cell_closest_to_mouse) 
-          state.walls[cell_closest_to_mouse] = true 
-          reset_search 
+          state.hills.delete(cell_closest_to_mouse)
+          state.walls[cell_closest_to_mouse] = true
+          reset_search
         end
       end
     end
   
     # Adds a wall in the second grid in the cell the mouse is over
     def input_add_wall2
-      if mouse_over_grid2? 
+      if mouse_over_grid2?
         unless state.walls.has_key?(cell_closest_to_mouse2)
-          state.hills.delete(cell_closest_to_mouse2) 
-          state.walls[cell_closest_to_mouse2] = true 
-          reset_search 
+          state.hills.delete(cell_closest_to_mouse2)
+          state.walls[cell_closest_to_mouse2] = true
+          reset_search
         end
       end
     end
@@ -19226,21 +19597,21 @@ Follows is a source code listing for all files that have been open sourced. This
     # Returns a list of adjacent cells
     # Used to determine what the next cells to be added to the frontier are
     def adjacent_neighbors(cell)
-      neighbors = [] 
+      neighbors = []
   
       # Gets all the valid neighbors into the array
       # From southern neighbor, clockwise
-      neighbors << [cell.x    , cell.y - 1] unless cell.y == 0 
-      neighbors << [cell.x - 1, cell.y    ] unless cell.x == 0 
-      neighbors << [cell.x    , cell.y + 1] unless cell.y == grid.height - 1 
-      neighbors << [cell.x + 1, cell.y    ] unless cell.x == grid.width - 1 
+      neighbors << [cell.x    , cell.y - 1] unless cell.y == 0
+      neighbors << [cell.x - 1, cell.y    ] unless cell.x == 0
+      neighbors << [cell.x    , cell.y + 1] unless cell.y == grid.height - 1
+      neighbors << [cell.x + 1, cell.y    ] unless cell.x == grid.width - 1
   
       # Sorts the neighbors so the rendered path is a zigzag path
       # Cells in a diagonal direction are given priority
       # Comment this line to see the difference
       neighbors = neighbors.sort_by { |neighbor_x, neighbor_y|  proximity_to_star(neighbor_x, neighbor_y) }
   
-      neighbors 
+      neighbors
     end
   
     # Finds the vertical and horizontal distance of a cell from the star
@@ -19265,13 +19636,13 @@ Follows is a source code listing for all files that have been open sourced. This
     # Finding the cell closest to the mouse helps with this
     def cell_closest_to_mouse
       # Closest cell to the mouse in the first grid
-      x = (inputs.mouse.point.x / grid.cell_size).to_i 
-      y = (inputs.mouse.point.y / grid.cell_size).to_i 
+      x = (inputs.mouse.point.x / grid.cell_size).to_i
+      y = (inputs.mouse.point.y / grid.cell_size).to_i
       # Bound x and y to the grid
-      x = grid.width - 1 if x > grid.width - 1 
-      y = grid.height - 1 if y > grid.height - 1 
+      x = grid.width - 1 if x > grid.width - 1
+      y = grid.height - 1 if y > grid.height - 1
       # Return closest cell
-      [x, y] 
+      [x, y]
     end
   
     # When the user grabs the star and puts their cursor to the far right
@@ -19279,17 +19650,17 @@ Follows is a source code listing for all files that have been open sourced. This
     # Finding the cell closest to the mouse in the second grid helps with this
     def cell_closest_to_mouse2
       # Closest cell grid to the mouse in the second
-      x = (inputs.mouse.point.x / grid.cell_size).to_i 
-      y = (inputs.mouse.point.y / grid.cell_size).to_i 
+      x = (inputs.mouse.point.x / grid.cell_size).to_i
+      y = (inputs.mouse.point.y / grid.cell_size).to_i
       # Translate the cell to the first grid
       x -= grid.width + 1
       # Bound x and y to the first grid
       x = 0 if x < 0
       y = 0 if y < 0
-      x = grid.width - 1 if x > grid.width - 1 
-      y = grid.height - 1 if y > grid.height - 1 
+      x = grid.width - 1 if x > grid.width - 1
+      y = grid.height - 1 if y > grid.height - 1
       # Return closest cell
-      [x, y] 
+      [x, y]
     end
   
     # Signal that the user is going to be moving the star from the first grid
@@ -19362,12 +19733,12 @@ Follows is a source code listing for all files that have been open sourced. This
   
     # Light brown
     def unvisited_color
-      [221, 212, 213] 
+      [221, 212, 213]
     end
   
     # Camo Green
     def wall_color
-      [134, 134, 120] 
+      [134, 134, 120]
     end
   
     # Pastel White
@@ -19410,7 +19781,7 @@ Follows is a source code listing for all files that have been open sourced. This
     end
   
     # Every tick, new args are passed, and the Dijkstra tick method is called
-    $movement_costs ||= Movement_Costs.new(args)
+    $movement_costs ||= Movement_Costs.new
     $movement_costs.args = args
     $movement_costs.tick
   end
@@ -20396,7 +20767,7 @@ Follows is a source code listing for all files that have been open sourced. This
     end
   
     # Every tick, new args are passed, and the Breadth First Search tick is called
-    $heuristic_with_walls ||= Heuristic_With_Walls.new(args)
+    $heuristic_with_walls ||= Heuristic_With_Walls.new
     $heuristic_with_walls.args = args
     $heuristic_with_walls.tick
   end
@@ -21415,7 +21786,7 @@ Follows is a source code listing for all files that have been open sourced. This
     end
   
     # Every tick, new args are passed, and the Breadth First Search tick is called
-    $heuristic ||= Heuristic.new(args)
+    $heuristic ||= Heuristic.new
     $heuristic.args = args
     $heuristic.tick
   end
@@ -21443,8 +21814,8 @@ Follows is a source code listing for all files that have been open sourced. This
   
     def tick
       defaults
-      render 
-      input  
+      render
+      input
   
       if dijkstra.came_from.empty?
         calc_searches
@@ -21497,7 +21868,7 @@ Follows is a source code listing for all files that have been open sourced. This
       # We store this value, because we want to remember the value even when
       # the user's cursor is no longer over what they're interacting with, but
       # they are still clicking down on the mouse.
-      state.user_input ||= :none 
+      state.user_input ||= :none
   
       # These variables allow the breadth first search to take place
       # Came_from is a hash with a key of a cell and a value of the cell that was expanded from to find the key.
@@ -21575,7 +21946,7 @@ Follows is a source code listing for all files that have been open sourced. This
       # If the mouse was clicked this tick
       if inputs.mouse.down
         # Determine what the user is editing and appropriately edit the state.user_input variable
-        determine_input          
+        determine_input
       end
   
       # Process user input based on user_input variable and current mouse position
@@ -21586,51 +21957,51 @@ Follows is a source code listing for all files that have been open sourced. This
     # This method is called when the mouse is clicked down
     def determine_input
       # If the mouse is over the star in the first grid
-      if dijkstra_mouse_over_star?                 
+      if dijkstra_mouse_over_star?
         # The user is editing the star from the first grid
-        state.user_input = :dijkstra_star          
+        state.user_input = :dijkstra_star
       # If the mouse is over the star in the second grid
-      elsif greedy_mouse_over_star?                 
+      elsif greedy_mouse_over_star?
         # The user is editing the star from the second grid
-        state.user_input = :greedy_star          
+        state.user_input = :greedy_star
       # If the mouse is over the star in the third grid
-      elsif a_star_mouse_over_star?                 
+      elsif a_star_mouse_over_star?
         # The user is editing the star from the third grid
-        state.user_input = :a_star_star          
+        state.user_input = :a_star_star
       # If the mouse is over the target in the first grid
-      elsif dijkstra_mouse_over_target?                 
+      elsif dijkstra_mouse_over_target?
         # The user is editing the target from the first grid
-        state.user_input = :dijkstra_target          
+        state.user_input = :dijkstra_target
       # If the mouse is over the target in the second grid
-      elsif greedy_mouse_over_target?                 
+      elsif greedy_mouse_over_target?
         # The user is editing the target from the second grid
-        state.user_input = :greedy_target 
+        state.user_input = :greedy_target
       # If the mouse is over the target in the third grid
-      elsif a_star_mouse_over_target?                 
+      elsif a_star_mouse_over_target?
         # The user is editing the target from the third grid
-        state.user_input = :a_star_target 
+        state.user_input = :a_star_target
       # If the mouse is over a wall in the first grid
-      elsif dijkstra_mouse_over_wall?                 
+      elsif dijkstra_mouse_over_wall?
         # The user is removing a wall from the first grid
-        state.user_input = :dijkstra_remove_wall   
+        state.user_input = :dijkstra_remove_wall
       # If the mouse is over a wall in the second grid
-      elsif greedy_mouse_over_wall?                 
+      elsif greedy_mouse_over_wall?
         # The user is removing a wall from the second grid
         state.user_input = :greedy_remove_wall
       # If the mouse is over a wall in the third grid
-      elsif a_star_mouse_over_wall?                 
+      elsif a_star_mouse_over_wall?
         # The user is removing a wall from the third grid
         state.user_input = :a_star_remove_wall
       # If the mouse is over the first grid
-      elsif dijkstra_mouse_over_grid?                 
+      elsif dijkstra_mouse_over_grid?
         # The user is adding a wall from the first grid
         state.user_input = :dijkstra_add_wall
       # If the mouse is over the second grid
-      elsif greedy_mouse_over_grid?                 
+      elsif greedy_mouse_over_grid?
         # The user is adding a wall from the second grid
         state.user_input = :greedy_add_wall
       # If the mouse is over the third grid
-      elsif a_star_mouse_over_grid?                 
+      elsif a_star_mouse_over_grid?
         # The user is adding a wall from the third grid
         state.user_input = :a_star_add_wall
       end
@@ -21638,30 +22009,30 @@ Follows is a source code listing for all files that have been open sourced. This
   
     # Processes click and drag based on what the user is currently dragging
     def process_input
-      if state.user_input == :dijkstra_star         
-        process_input_dijkstra_star                            
+      if state.user_input == :dijkstra_star
+        process_input_dijkstra_star
       elsif state.user_input == :greedy_star
-        process_input_greedy_star                            
+        process_input_greedy_star
       elsif state.user_input == :a_star_star
-        process_input_a_star_star                            
-      elsif state.user_input == :dijkstra_target         
-        process_input_dijkstra_target                            
-      elsif state.user_input == :greedy_target         
-        process_input_greedy_target                            
-      elsif state.user_input == :a_star_target         
-        process_input_a_star_target                            
-      elsif state.user_input == :dijkstra_remove_wall  
-        process_input_dijkstra_remove_wall                     
+        process_input_a_star_star
+      elsif state.user_input == :dijkstra_target
+        process_input_dijkstra_target
+      elsif state.user_input == :greedy_target
+        process_input_greedy_target
+      elsif state.user_input == :a_star_target
+        process_input_a_star_target
+      elsif state.user_input == :dijkstra_remove_wall
+        process_input_dijkstra_remove_wall
       elsif state.user_input == :greedy_remove_wall
-        process_input_greedy_remove_wall                     
+        process_input_greedy_remove_wall
       elsif state.user_input == :a_star_remove_wall
-        process_input_a_star_remove_wall                     
-      elsif state.user_input == :dijkstra_add_wall     
-        process_input_dijkstra_add_wall                        
-      elsif state.user_input == :greedy_add_wall     
-        process_input_greedy_add_wall                        
-      elsif state.user_input == :a_star_add_wall     
-        process_input_a_star_add_wall                        
+        process_input_a_star_remove_wall
+      elsif state.user_input == :dijkstra_add_wall
+        process_input_dijkstra_add_wall
+      elsif state.user_input == :greedy_add_wall
+        process_input_greedy_add_wall
+      elsif state.user_input == :a_star_add_wall
+        process_input_a_star_add_wall
       end
     end
   
@@ -21676,7 +22047,7 @@ Follows is a source code listing for all files that have been open sourced. This
   
       # The horizontal grid lines
       for y in 0..grid.height
-        outputs.lines << dijkstra_horizontal_line(y) 
+        outputs.lines << dijkstra_horizontal_line(y)
       end
     end
   
@@ -21691,7 +22062,7 @@ Follows is a source code listing for all files that have been open sourced. This
   
       # The horizontal grid lines
       for y in 0..grid.height
-        outputs.lines << greedy_horizontal_line(y) 
+        outputs.lines << greedy_horizontal_line(y)
       end
     end
   
@@ -21706,10 +22077,10 @@ Follows is a source code listing for all files that have been open sourced. This
   
       # The horizontal grid lines
       for y in 0..grid.height
-        outputs.lines << a_star_horizontal_line(y) 
+        outputs.lines << a_star_horizontal_line(y)
       end
     end
-      
+  
     # Returns a vertical line for a column of the first grid
     def dijkstra_vertical_line column
       dijkstra_scale_up([column, 0, column, grid.height])
@@ -21759,7 +22130,7 @@ Follows is a source code listing for all files that have been open sourced. This
     def render_dijkstra_target
       outputs.sprites << [dijkstra_scale_up(grid.target), 'target.png']
     end
-    
+  
     # Renders the target on the second grid
     def render_greedy_target
       outputs.sprites << [greedy_scale_up(grid.target), 'target.png']
@@ -21772,21 +22143,21 @@ Follows is a source code listing for all files that have been open sourced. This
   
     # Renders the walls on the first grid
     def render_dijkstra_walls
-      grid.walls.each_key do | wall | 
+      grid.walls.each_key do | wall |
         outputs.solids << [dijkstra_scale_up(wall), wall_color]
       end
     end
   
     # Renders the walls on the second grid
     def render_greedy_walls
-      grid.walls.each_key do | wall | 
+      grid.walls.each_key do | wall |
         outputs.solids << [greedy_scale_up(wall), wall_color]
       end
     end
   
     # Renders the walls on the third grid
     def render_a_star_walls
-      grid.walls.each_key do | wall | 
+      grid.walls.each_key do | wall |
         outputs.solids << [a_star_scale_up(wall), wall_color]
       end
     end
@@ -21986,12 +22357,12 @@ Follows is a source code listing for all files that have been open sourced. This
     # Only resets the search if the star changes position
     # Called whenever the user is editing the star (puts mouse down on star)
     def process_input_dijkstra_star
-      old_star = grid.star.clone 
+      old_star = grid.star.clone
       unless dijkstra_cell_closest_to_mouse == grid.target
-        grid.star = dijkstra_cell_closest_to_mouse 
+        grid.star = dijkstra_cell_closest_to_mouse
       end
-      unless old_star == grid.star 
-        reset_searches 
+      unless old_star == grid.star
+        reset_searches
       end
     end
   
@@ -21999,12 +22370,12 @@ Follows is a source code listing for all files that have been open sourced. This
     # Only resets the search if the star changes position
     # Called whenever the user is editing the star (puts mouse down on star)
     def process_input_greedy_star
-      old_star = grid.star.clone 
+      old_star = grid.star.clone
       unless greedy_cell_closest_to_mouse == grid.target
         grid.star = greedy_cell_closest_to_mouse
       end
-      unless old_star == grid.star 
-        reset_searches 
+      unless old_star == grid.star
+        reset_searches
       end
     end
   
@@ -22012,12 +22383,12 @@ Follows is a source code listing for all files that have been open sourced. This
     # Only resets the search if the star changes position
     # Called whenever the user is editing the star (puts mouse down on star)
     def process_input_a_star_star
-      old_star = grid.star.clone 
+      old_star = grid.star.clone
       unless a_star_cell_closest_to_mouse == grid.target
         grid.star = a_star_cell_closest_to_mouse
       end
-      unless old_star == grid.star 
-        reset_searches 
+      unless old_star == grid.star
+        reset_searches
       end
     end
   
@@ -22025,12 +22396,12 @@ Follows is a source code listing for all files that have been open sourced. This
     # Only reset_searchess the search if the target changes position
     # Called whenever the user is editing the target (puts mouse down on target)
     def process_input_dijkstra_target
-      old_target = grid.target.clone 
+      old_target = grid.target.clone
       unless dijkstra_cell_closest_to_mouse == grid.star
         grid.target = dijkstra_cell_closest_to_mouse
       end
-      unless old_target == grid.target 
-        reset_searches 
+      unless old_target == grid.target
+        reset_searches
       end
     end
   
@@ -22038,12 +22409,12 @@ Follows is a source code listing for all files that have been open sourced. This
     # Only reset_searchess the search if the target changes position
     # Called whenever the user is editing the target (puts mouse down on target)
     def process_input_greedy_target
-      old_target = grid.target.clone 
+      old_target = grid.target.clone
       unless greedy_cell_closest_to_mouse == grid.star
         grid.target = greedy_cell_closest_to_mouse
       end
-      unless old_target == grid.target 
-        reset_searches 
+      unless old_target == grid.target
+        reset_searches
       end
     end
   
@@ -22051,12 +22422,12 @@ Follows is a source code listing for all files that have been open sourced. This
     # Only reset_searchess the search if the target changes position
     # Called whenever the user is editing the target (puts mouse down on target)
     def process_input_a_star_target
-      old_target = grid.target.clone 
+      old_target = grid.target.clone
       unless a_star_cell_closest_to_mouse == grid.star
         grid.target = a_star_cell_closest_to_mouse
       end
-      unless old_target == grid.target 
-        reset_searches 
+      unless old_target == grid.target
+        reset_searches
       end
     end
   
@@ -22065,10 +22436,10 @@ Follows is a source code listing for all files that have been open sourced. This
       # The mouse needs to be inside the grid, because we only want to remove walls
       # the cursor is directly over
       # Recalculations should only occur when a wall is actually deleted
-      if dijkstra_mouse_over_grid? 
+      if dijkstra_mouse_over_grid?
         if grid.walls.has_key?(dijkstra_cell_closest_to_mouse)
-          grid.walls.delete(dijkstra_cell_closest_to_mouse) 
-          reset_searches 
+          grid.walls.delete(dijkstra_cell_closest_to_mouse)
+          reset_searches
         end
       end
     end
@@ -22078,10 +22449,10 @@ Follows is a source code listing for all files that have been open sourced. This
       # The mouse needs to be inside the grid, because we only want to remove walls
       # the cursor is directly over
       # Recalculations should only occur when a wall is actually deleted
-      if greedy_mouse_over_grid? 
+      if greedy_mouse_over_grid?
         if grid.walls.has_key?(greedy_cell_closest_to_mouse)
-          grid.walls.delete(greedy_cell_closest_to_mouse) 
-          reset_searches 
+          grid.walls.delete(greedy_cell_closest_to_mouse)
+          reset_searches
         end
       end
     end
@@ -22091,40 +22462,40 @@ Follows is a source code listing for all files that have been open sourced. This
       # The mouse needs to be inside the grid, because we only want to remove walls
       # the cursor is directly over
       # Recalculations should only occur when a wall is actually deleted
-      if a_star_mouse_over_grid? 
+      if a_star_mouse_over_grid?
         if grid.walls.has_key?(a_star_cell_closest_to_mouse)
-          grid.walls.delete(a_star_cell_closest_to_mouse) 
-          reset_searches 
+          grid.walls.delete(a_star_cell_closest_to_mouse)
+          reset_searches
         end
       end
     end
   
     # Adds a wall in the first grid in the cell the mouse is over
     def process_input_dijkstra_add_wall
-      if dijkstra_mouse_over_grid? 
+      if dijkstra_mouse_over_grid?
         unless grid.walls.has_key?(dijkstra_cell_closest_to_mouse)
-          grid.walls[dijkstra_cell_closest_to_mouse] = true 
-          reset_searches 
+          grid.walls[dijkstra_cell_closest_to_mouse] = true
+          reset_searches
         end
       end
     end
   
     # Adds a wall in the second grid in the cell the mouse is over
     def process_input_greedy_add_wall
-      if greedy_mouse_over_grid? 
+      if greedy_mouse_over_grid?
         unless grid.walls.has_key?(greedy_cell_closest_to_mouse)
-          grid.walls[greedy_cell_closest_to_mouse] = true 
-          reset_searches 
+          grid.walls[greedy_cell_closest_to_mouse] = true
+          reset_searches
         end
       end
     end
   
     # Adds a wall in the third grid in the cell the mouse is over
     def process_input_a_star_add_wall
-      if a_star_mouse_over_grid? 
+      if a_star_mouse_over_grid?
         unless grid.walls.has_key?(a_star_cell_closest_to_mouse)
-          grid.walls[a_star_cell_closest_to_mouse] = true 
-          reset_searches 
+          grid.walls[a_star_cell_closest_to_mouse] = true
+          reset_searches
         end
       end
     end
@@ -22134,13 +22505,13 @@ Follows is a source code listing for all files that have been open sourced. This
     # Finding the cell closest to the mouse helps with this
     def dijkstra_cell_closest_to_mouse
       # Closest cell to the mouse in the first grid
-      x = (inputs.mouse.point.x / grid.cell_size).to_i 
-      y = (inputs.mouse.point.y / grid.cell_size).to_i 
+      x = (inputs.mouse.point.x / grid.cell_size).to_i
+      y = (inputs.mouse.point.y / grid.cell_size).to_i
       # Bound x and y to the grid
-      x = grid.width - 1 if x > grid.width - 1 
-      y = grid.height - 1 if y > grid.height - 1 
+      x = grid.width - 1 if x > grid.width - 1
+      y = grid.height - 1 if y > grid.height - 1
       # Return closest cell
-      [x, y] 
+      [x, y]
     end
   
     # When the user grabs the star and puts their cursor to the far right
@@ -22148,17 +22519,17 @@ Follows is a source code listing for all files that have been open sourced. This
     # Finding the cell closest to the mouse in the second grid helps with this
     def greedy_cell_closest_to_mouse
       # Closest cell grid to the mouse in the second
-      x = (inputs.mouse.point.x / grid.cell_size).to_i 
-      y = (inputs.mouse.point.y / grid.cell_size).to_i 
+      x = (inputs.mouse.point.x / grid.cell_size).to_i
+      y = (inputs.mouse.point.y / grid.cell_size).to_i
       # Translate the cell to the first grid
       x -= grid.width + 1
       # Bound x and y to the first grid
       x = 0 if x < 0
       y = 0 if y < 0
-      x = grid.width - 1 if x > grid.width - 1 
-      y = grid.height - 1 if y > grid.height - 1 
+      x = grid.width - 1 if x > grid.width - 1
+      y = grid.height - 1 if y > grid.height - 1
       # Return closest cell
-      [x, y] 
+      [x, y]
     end
   
     # When the user grabs the star and puts their cursor to the far right
@@ -22166,17 +22537,17 @@ Follows is a source code listing for all files that have been open sourced. This
     # Finding the cell closest to the mouse in the third grid helps with this
     def a_star_cell_closest_to_mouse
       # Closest cell grid to the mouse in the second
-      x = (inputs.mouse.point.x / grid.cell_size).to_i 
-      y = (inputs.mouse.point.y / grid.cell_size).to_i 
+      x = (inputs.mouse.point.x / grid.cell_size).to_i
+      y = (inputs.mouse.point.y / grid.cell_size).to_i
       # Translate the cell to the first grid
       x -= (grid.width + 1) * 2
       # Bound x and y to the first grid
       x = 0 if x < 0
       y = 0 if y < 0
-      x = grid.width - 1 if x > grid.width - 1 
-      y = grid.height - 1 if y > grid.height - 1 
+      x = grid.width - 1 if x > grid.width - 1
+      y = grid.height - 1 if y > grid.height - 1
       # Return closest cell
-      [x, y] 
+      [x, y]
     end
   
     def reset_searches
@@ -22204,21 +22575,21 @@ Follows is a source code listing for all files that have been open sourced. This
   
     def calc_dijkstra
       # Sets up the search to begin from the star
-      dijkstra.frontier << grid.star                   
-      dijkstra.came_from[grid.star] = nil              
-      dijkstra.cost_so_far[grid.star] = 0              
+      dijkstra.frontier << grid.star
+      dijkstra.came_from[grid.star] = nil
+      dijkstra.cost_so_far[grid.star] = 0
   
       # Until the target is found or there are no more cells to explore from
       until dijkstra.came_from.has_key?(grid.target) or dijkstra.frontier.empty?
         # Take the next frontier cell. The first element is the cell, the second is the priority.
         new_frontier = dijkstra.frontier.shift#[0]
         # For each of its neighbors
-        adjacent_neighbors(new_frontier).each do | neighbor | 
+        adjacent_neighbors(new_frontier).each do | neighbor |
           # That have not been visited and are not walls
-          unless dijkstra.came_from.has_key?(neighbor) or grid.walls.has_key?(neighbor) 
+          unless dijkstra.came_from.has_key?(neighbor) or grid.walls.has_key?(neighbor)
             # Add them to the frontier and mark them as visited
             dijkstra.frontier << neighbor
-            dijkstra.came_from[neighbor] = new_frontier 
+            dijkstra.came_from[neighbor] = new_frontier
             dijkstra.cost_so_far[neighbor] = dijkstra.cost_so_far[new_frontier] + 1
           end
         end
@@ -22239,20 +22610,20 @@ Follows is a source code listing for all files that have been open sourced. This
   
     def calc_greedy
       # Sets up the search to begin from the star
-      greedy.frontier << grid.star                   
-      greedy.came_from[grid.star] = nil              
+      greedy.frontier << grid.star
+      greedy.came_from[grid.star] = nil
   
       # Until the target is found or there are no more cells to explore from
       until greedy.came_from.has_key?(grid.target) or greedy.frontier.empty?
         # Take the next frontier cell
-        new_frontier = greedy.frontier.shift 
+        new_frontier = greedy.frontier.shift
         # For each of its neighbors
-        adjacent_neighbors(new_frontier).each do | neighbor | 
+        adjacent_neighbors(new_frontier).each do | neighbor |
           # That have not been visited and are not walls
-          unless greedy.came_from.has_key?(neighbor) or grid.walls.has_key?(neighbor) 
+          unless greedy.came_from.has_key?(neighbor) or grid.walls.has_key?(neighbor)
             # Add them to the frontier and mark them as visited
-            greedy.frontier << neighbor 
-            greedy.came_from[neighbor] = new_frontier 
+            greedy.frontier << neighbor
+            greedy.came_from[neighbor] = new_frontier
           end
         end
         # Sort the frontier so that cells that are in a zigzag pattern are prioritized over those in an line
@@ -22282,12 +22653,12 @@ Follows is a source code listing for all files that have been open sourced. This
         current_frontier = a_star.frontier.shift
   
         # For each of that cells neighbors
-        adjacent_neighbors(current_frontier).each do | neighbor | 
+        adjacent_neighbors(current_frontier).each do | neighbor |
           # That have not been visited and are not walls
-          unless a_star.came_from.has_key?(neighbor) or grid.walls.has_key?(neighbor) 
+          unless a_star.came_from.has_key?(neighbor) or grid.walls.has_key?(neighbor)
             # Add them to the frontier and mark them as visited
-            a_star.frontier << neighbor 
-            a_star.came_from[neighbor] = current_frontier 
+            a_star.frontier << neighbor
+            a_star.came_from[neighbor] = current_frontier
             a_star.cost_so_far[neighbor] = a_star.cost_so_far[current_frontier] + 1
           end
         end
@@ -22369,16 +22740,16 @@ Follows is a source code listing for all files that have been open sourced. This
     # Returns a list of adjacent cells
     # Used to determine what the next cells to be added to the frontier are
     def adjacent_neighbors(cell)
-      neighbors = [] 
+      neighbors = []
   
       # Gets all the valid neighbors into the array
       # From southern neighbor, clockwise
-      neighbors << [cell.x    , cell.y - 1] unless cell.y == 0 
-      neighbors << [cell.x - 1, cell.y    ] unless cell.x == 0 
-      neighbors << [cell.x    , cell.y + 1] unless cell.y == grid.height - 1 
-      neighbors << [cell.x + 1, cell.y    ] unless cell.x == grid.width - 1 
+      neighbors << [cell.x    , cell.y - 1] unless cell.y == 0
+      neighbors << [cell.x - 1, cell.y    ] unless cell.x == 0
+      neighbors << [cell.x    , cell.y + 1] unless cell.y == grid.height - 1
+      neighbors << [cell.x + 1, cell.y    ] unless cell.x == grid.width - 1
   
-      neighbors 
+      neighbors
     end
   
     # Finds the vertical and horizontal distance of a cell from the star
@@ -22423,11 +22794,11 @@ Follows is a source code listing for all files that have been open sourced. This
     def wall_color
       [134, 134, 120] # Camo Green
     end
-    
+  
     def visited_color
       [204, 191, 179] # Dark Brown
     end
-    
+  
     def path_color
       [231, 230, 228] # Pastel White
     end
@@ -22450,7 +22821,7 @@ Follows is a source code listing for all files that have been open sourced. This
     end
   
     # Every tick, new args are passed, and the Breadth First Search tick is called
-    $a_star_algorithm ||= A_Star_Algorithm.new(args)
+    $a_star_algorithm ||= A_Star_Algorithm.new
     $a_star_algorithm.args = args
     $a_star_algorithm.tick
   end
@@ -22986,6 +23357,363 @@ Follows is a source code listing for all files that have been open sourced. This
   https://en.wikipedia.org/wiki/OFF_(file_format)
 #+end_src
 
+*** 3d - Yaw Pitch Roll - main.rb
+#+begin_src ruby
+  # ./samples/99_genre_3d/03_yaw_pitch_roll/app/main.rb
+  class Game
+    attr_gtk
+  
+    def tick
+      defaults
+      render
+      input
+    end
+  
+    def matrix_mul m, v
+      (hmap x: ((m.x.x * v.x) + (m.x.y * v.y) + (m.x.z * v.z) + (m.x.w * v.w)),
+            y: ((m.y.x * v.x) + (m.y.y * v.y) + (m.y.z * v.z) + (m.y.w * v.w)),
+            z: ((m.z.x * v.x) + (m.z.y * v.y) + (m.z.z * v.z) + (m.z.w * v.w)),
+            w: ((m.w.x * v.x) + (m.w.y * v.y) + (m.w.z * v.z) + (m.w.w * v.w)))
+    end
+  
+    def player_ship
+      [
+        # engine back
+        { x: -1, y: -1, z: 1, w: 0 },
+        { x: -1, y:  1, z: 1, w: 0 },
+  
+        { x: -1, y:  1, z: 1, w: 0 },
+        { x:  1, y:  1, z: 1, w: 0 },
+  
+        { x:  1, y:  1, z: 1, w: 0 },
+        { x:  1, y: -1, z: 1, w: 0 },
+  
+        { x:  1, y: -1, z: 1, w: 0 },
+        { x: -1, y: -1, z: 1, w: 0 },
+  
+        # engine front
+        { x: -1, y: -1, z: -1, w: 0 },
+        { x: -1, y:  1, z: -1, w: 0 },
+  
+        { x: -1, y:  1, z: -1, w: 0 },
+        { x:  1, y:  1, z: -1, w: 0 },
+  
+        { x:  1, y:  1, z: -1, w: 0 },
+        { x:  1, y: -1, z: -1, w: 0 },
+  
+        { x:  1, y: -1, z: -1, w: 0 },
+        { x: -1, y: -1, z: -1, w: 0 },
+  
+        # engine left
+        { x: -1, z:  -1, y: -1, w: 0 },
+        { x: -1, z:  -1, y:  1, w: 0 },
+  
+        { x: -1, z:  -1, y:  1, w: 0 },
+        { x: -1, z:   1, y:  1, w: 0 },
+  
+        { x: -1, z:   1, y:  1, w: 0 },
+        { x: -1, z:   1, y: -1, w: 0 },
+  
+        { x: -1, z:   1, y: -1, w: 0 },
+        { x: -1, z:  -1, y: -1, w: 0 },
+  
+        # engine right
+        { x:  1, z:  -1, y: -1, w: 0 },
+        { x:  1, z:  -1, y:  1, w: 0 },
+  
+        { x:  1, z:  -1, y:  1, w: 0 },
+        { x:  1, z:   1, y:  1, w: 0 },
+  
+        { x:  1, z:   1, y:  1, w: 0 },
+        { x:  1, z:   1, y: -1, w: 0 },
+  
+        { x:  1, z:   1, y: -1, w: 0 },
+        { x:  1, z:  -1, y: -1, w: 0 },
+  
+        # top front of engine to front of ship
+        { x:  1, y:   1, z: 1, w: 0 },
+        { x:  0, y:  -1, z: 9, w: 0 },
+  
+        { x:  0, y:  -1, z: 9, w: 0 },
+        { x: -1, y:   1, z: 1, w: 0 },
+  
+        # bottom front of engine
+        { x:  1, y:  -1, z: 1, w: 0 },
+        { x:  0, y:  -1, z: 9, w: 0 },
+  
+        { x: -1, y:  -1, z: 1, w: 0 },
+        { x:  0, y:  -1, z: 9, w: 0 },
+  
+        # right wing
+        # front of wing
+        { x: 1, y: 0.10, z:  1, w: 0 },
+        { x: 9, y: 0.10, z: -1, w: 0 },
+  
+        { x:  9, y: 0.10, z: -1, w: 0 },
+        { x: 10, y: 0.10, z: -2, w: 0 },
+  
+        # back of wing
+        { x: 1, y: 0.10, z: -1, w: 0 },
+        { x: 9, y: 0.10, z: -1, w: 0 },
+  
+        { x: 10, y: 0.10, z: -2, w: 0 },
+        { x:  8, y: 0.10, z: -1, w: 0 },
+  
+        # front of wing
+        { x: 1, y: -0.10, z:  1, w: 0 },
+        { x: 9, y: -0.10, z: -1, w: 0 },
+  
+        { x:  9, y: -0.10, z: -1, w: 0 },
+        { x: 10, y: -0.10, z: -2, w: 0 },
+  
+        # back of wing
+        { x: 1, y: -0.10, z: -1, w: 0 },
+        { x: 9, y: -0.10, z: -1, w: 0 },
+  
+        { x: 10, y: -0.10, z: -2, w: 0 },
+        { x:  8, y: -0.10, z: -1, w: 0 },
+  
+        # left wing
+        # front of wing
+        { x: -1, y: 0.10, z:  1, w: 0 },
+        { x: -9, y: 0.10, z: -1, w: 0 },
+  
+        { x: -9, y: 0.10, z: -1, w: 0 },
+        { x: -10, y: 0.10, z: -2, w: 0 },
+  
+        # back of wing
+        { x: -1, y: 0.10, z: -1, w: 0 },
+        { x: -9, y: 0.10, z: -1, w: 0 },
+  
+        { x: -10, y: 0.10, z: -2, w: 0 },
+        { x: -8, y: 0.10, z: -1, w: 0 },
+  
+        # front of wing
+        { x: -1, y: -0.10, z:  1, w: 0 },
+        { x: -9, y: -0.10, z: -1, w: 0 },
+  
+        { x: -9, y: -0.10, z: -1, w: 0 },
+        { x: -10, y: -0.10, z: -2, w: 0 },
+  
+        # back of wing
+        { x: -1, y: -0.10, z: -1, w: 0 },
+        { x: -9, y: -0.10, z: -1, w: 0 },
+  
+        { x: -10, y: -0.10, z: -2, w: 0 },
+        { x: -8, y: -0.10, z: -1, w: 0 },
+  
+        # left fin
+        # top
+        { x: -1, y: 0.10, z: 1, w: 0 },
+        { x: -1, y: 3, z: -3, w: 0 },
+  
+        { x: -1, y: 0.10, z: -1, w: 0 },
+        { x: -1, y: 3, z: -3, w: 0 },
+  
+        { x: -1.1, y: 0.10, z: 1, w: 0 },
+        { x: -1.1, y: 3, z: -3, w: 0 },
+  
+        { x: -1.1, y: 0.10, z: -1, w: 0 },
+        { x: -1.1, y: 3, z: -3, w: 0 },
+  
+        # bottom
+        { x: -1, y: -0.10, z: 1, w: 0 },
+        { x: -1, y: -2, z: -2, w: 0 },
+  
+        { x: -1, y: -0.10, z: -1, w: 0 },
+        { x: -1, y: -2, z: -2, w: 0 },
+  
+        { x: -1.1, y: -0.10, z: 1, w: 0 },
+        { x: -1.1, y: -2, z: -2, w: 0 },
+  
+        { x: -1.1, y: -0.10, z: -1, w: 0 },
+        { x: -1.1, y: -2, z: -2, w: 0 },
+  
+        # right fin
+        { x:  1, y: 0.10, z: 1, w: 0 },
+        { x:  1, y: 3, z: -3, w: 0 },
+  
+        { x:  1, y: 0.10, z: -1, w: 0 },
+        { x:  1, y: 3, z: -3, w: 0 },
+  
+        { x:  1.1, y: 0.10, z: 1, w: 0 },
+        { x:  1.1, y: 3, z: -3, w: 0 },
+  
+        { x:  1.1, y: 0.10, z: -1, w: 0 },
+        { x:  1.1, y: 3, z: -3, w: 0 },
+  
+        # bottom
+        { x:  1, y: -0.10, z: 1, w: 0 },
+        { x:  1, y: -2, z: -2, w: 0 },
+  
+        { x:  1, y: -0.10, z: -1, w: 0 },
+        { x:  1, y: -2, z: -2, w: 0 },
+  
+        { x:  1.1, y: -0.10, z: 1, w: 0 },
+        { x:  1.1, y: -2, z: -2, w: 0 },
+  
+        { x:  1.1, y: -0.10, z: -1, w: 0 },
+        { x:  1.1, y: -2, z: -2, w: 0 },
+      ]
+    end
+  
+    def defaults
+      state.points ||= player_ship
+      state.shifted_points ||= state.points.map { |point| point }
+  
+      state.scale   ||= 1
+      state.angle_x ||= 0
+      state.angle_y ||= 0
+      state.angle_z ||= 0
+    end
+  
+    def matrix_new x0, y0, z0, w0, x1, y1, z1, w1, x2, y2, z2, w2, x3, y3, z3, w3
+      (hmap x: (hmap x: x0, y: y0, z: z0, w: w0),
+            y: (hmap x: x1, y: y1, z: z1, w: w1),
+            z: (hmap x: x2, y: y2, z: z2, w: w2),
+            w: (hmap x: x3, y: y3, z: z3, w: w3))
+    end
+  
+    def angle_z_matrix degrees
+      cos_t = Math.cos degrees.to_radians
+      sin_t = Math.sin degrees.to_radians
+      (matrix_new cos_t, -sin_t, 0, 0,
+                  sin_t,  cos_t, 0, 0,
+                  0,      0,     1, 0,
+                  0,      0,     0, 1)
+    end
+  
+    def angle_y_matrix degrees
+      cos_t = Math.cos degrees.to_radians
+      sin_t = Math.sin degrees.to_radians
+      (matrix_new  cos_t,  0, sin_t, 0,
+                   0,      1, 0,     0,
+                   -sin_t, 0, cos_t, 0,
+                   0,      0, 0,     1)
+    end
+  
+    def angle_x_matrix degrees
+      cos_t = Math.cos degrees.to_radians
+      sin_t = Math.sin degrees.to_radians
+      (matrix_new  1,     0,      0, 0,
+                   0, cos_t, -sin_t, 0,
+                   0, sin_t,  cos_t, 0,
+                   0,     0,      0, 1)
+    end
+  
+    def scale_matrix factor
+      (matrix_new factor,      0,      0, 0,
+                  0,      factor,      0, 0,
+                  0,           0, factor, 0,
+                  0,           0,      0, 1)
+    end
+  
+    def input
+      if (inputs.keyboard.shift && inputs.keyboard.p)
+        state.scale -= 0.1
+      elsif  inputs.keyboard.p
+        state.scale += 0.1
+      end
+  
+      if inputs.mouse.wheel
+        state.scale += inputs.mouse.wheel.y
+      end
+  
+      state.scale = state.scale.clamp(0.1, 1000)
+  
+      if (inputs.keyboard.shift && inputs.keyboard.y) || inputs.keyboard.right
+        state.angle_y += 1
+      elsif (inputs.keyboard.y) || inputs.keyboard.left
+        state.angle_y -= 1
+      end
+  
+      if (inputs.keyboard.shift && inputs.keyboard.x) || inputs.keyboard.down
+        state.angle_x -= 1
+      elsif (inputs.keyboard.x || inputs.keyboard.up)
+        state.angle_x += 1
+      end
+  
+      if inputs.keyboard.shift && inputs.keyboard.z
+        state.angle_z += 1
+      elsif inputs.keyboard.z
+        state.angle_z -= 1
+      end
+  
+      if inputs.keyboard.zero
+        state.angle_x = 0
+        state.angle_y = 0
+        state.angle_z = 0
+      end
+  
+      angle_x = state.angle_x
+      angle_y = state.angle_y
+      angle_z = state.angle_z
+      scale   = state.scale
+  
+      s_matrix = scale_matrix state.scale
+      x_matrix = angle_z_matrix angle_z
+      y_matrix = angle_y_matrix angle_y
+      z_matrix = angle_x_matrix angle_x
+  
+      state.shifted_points = state.points.map do |point|
+        (matrix_mul s_matrix,
+                    (matrix_mul z_matrix,
+                                (matrix_mul x_matrix,
+                                            (matrix_mul y_matrix, point)))).merge(original: point)
+      end
+    end
+  
+    def thick_line line
+      [
+        line.merge(y: line.y - 1, y2: line.y2 - 1, r: 0, g: 0, b: 0),
+        line.merge(x: line.x - 1, x2: line.x2 - 1, r: 0, g: 0, b: 0),
+        line.merge(x: line.x - 0, x2: line.x2 - 0, r: 0, g: 0, b: 0),
+        line.merge(y: line.y + 1, y2: line.y2 + 1, r: 0, g: 0, b: 0),
+        line.merge(x: line.x + 1, x2: line.x2 + 1, r: 0, g: 0, b: 0)
+      ]
+    end
+  
+    def render
+      outputs.lines << state.shifted_points.each_slice(2).map do |(p1, p2)|
+        perc = 0
+        thick_line({ x:  p1.x.*(10) + 640, y:  p1.y.*(10) + 320,
+                     x2: p2.x.*(10) + 640, y2: p2.y.*(10) + 320,
+                     r: 255 * perc,
+                     g: 255 * perc,
+                     b: 255 * perc })
+      end
+  
+      outputs.labels << [ 10, 700, "angle_x: #{state.angle_x.to_sf}", 0]
+      outputs.labels << [ 10, 670, "x, shift+x", 0]
+  
+      outputs.labels << [210, 700, "angle_y: #{state.angle_y.to_sf}", 0]
+      outputs.labels << [210, 670, "y, shift+y", 0]
+  
+      outputs.labels << [410, 700, "angle_z: #{state.angle_z.to_sf}", 0]
+      outputs.labels << [410, 670, "z, shift+z", 0]
+  
+      outputs.labels << [610, 700, "scale: #{state.scale.to_sf}", 0]
+      outputs.labels << [610, 670, "p, shift+p", 0]
+    end
+  end
+  
+  $game = Game.new
+  
+  def tick args
+    $game.args = args
+    $game.tick
+  end
+  
+  def set_angles x, y, z
+    $game.state.angle_x = x
+    $game.state.angle_y = y
+    $game.state.angle_z = z
+  end
+  
+  $gtk.reset
+
+#+end_src
+
 *** Arcade - Bullet Hell - main.rb
 #+begin_src ruby
   # ./samples/99_genre_arcade/bullet_hell/app/main.rb
@@ -23604,31 +24332,36 @@ Follows is a source code listing for all files that have been open sourced. This
     end
   
     def render_score
-      outputs.primitives << [10, 710, "HI SCORE: #{state.hi_score}", large_white_typeset].label
-      outputs.primitives << [10, 680, "SCORE: #{state.score}", large_white_typeset].label
-      outputs.primitives << [10, 650, "DIFFICULTY: #{state.difficulty.upcase}", large_white_typeset].label
+      outputs.primitives << { x: 10, y: 710, text: "HI SCORE: #{state.hi_score}", **large_white_typeset }
+      outputs.primitives << { x: 10, y: 680, text: "SCORE: #{state.score}", **large_white_typeset }
+      outputs.primitives << { x: 10, y: 650, text: "DIFFICULTY: #{state.difficulty.upcase}", **large_white_typeset }
     end
   
     def render_menu
       return unless state.scene == :menu
       render_overlay
   
-      outputs.labels << [640, 700, "Flappy Dragon", 50, 1, 255, 255, 255]
-      outputs.labels << [640, 500, "Instructions: Press Spacebar to flap. Don't die.", 4, 1, 255, 255, 255]
-      outputs.labels << [430, 430, "[Tab]    Change difficulty", 4, 0, 255, 255, 255]
-      outputs.labels << [430, 400, "[Enter]  Start at New Difficulty ", 4, 0, 255, 255, 255]
-      outputs.labels << [430, 370, "[Escape] Cancel/Resume ", 4, 0, 255, 255, 255]
-      outputs.labels << [640, 300, "(mouse, touch, and game controllers work, too!) ", 4, 1, 255, 255, 255]
-      outputs.labels << [640, 200, "Difficulty: #{state.new_difficulty.capitalize}", 4, 1, 255, 255, 255]
+      outputs.labels << { x: 640, y: 700, text: "Flappy Dragon", size_enum: 50, alignment_enum: 1, **white }
+      outputs.labels << { x: 640, y: 500, text: "Instructions: Press Spacebar to flap. Don't die.", size_enum: 4, alignment_enum: 1, **white }
+      outputs.labels << { x: 430, y: 430, text: "[Tab]    Change difficulty", size_enum: 4, alignment_enum: 0, **white }
+      outputs.labels << { x: 430, y: 400, text: "[Enter]  Start at New Difficulty ", size_enum: 4, alignment_enum: 0, **white }
+      outputs.labels << { x: 430, y: 370, text: "[Escape] Cancel/Resume ", size_enum: 4, alignment_enum: 0, **white }
+      outputs.labels << { x: 640, y: 300, text: "(mouse, touch, and game controllers work, too!) ", size_enum: 4, alignment_enum: 1, **white }
+      outputs.labels << { x: 640, y: 200, text: "Difficulty: #{state.new_difficulty.capitalize}", size_enum: 4, alignment_enum: 1, **white }
   
-      outputs.labels << [10, 100, "Code:   @amirrajan",     255, 255, 255]
-      outputs.labels << [10,  80, "Art:    @mobypixel",     255, 255, 255]
-      outputs.labels << [10,  60, "Music:  @mobypixel",     255, 255, 255]
-      outputs.labels << [10,  40, "Engine: DragonRuby GTK", 255, 255, 255]
+      outputs.labels << { x: 10, y: 100, text: "Code:   @amirrajan",     **white }
+      outputs.labels << { x: 10, y:  80, text: "Art:    @mobypixel",     **white }
+      outputs.labels << { x: 10, y:  60, text: "Music:  @mobypixel",     **white }
+      outputs.labels << { x: 10, y:  40, text: "Engine: DragonRuby GTK", **white }
     end
   
     def render_overlay
-      outputs.primitives << [grid.rect.scale_rect(1.1, 0, 0), 0, 0, 0, 230].solid
+      overlay_rect = grid.rect.scale_rect(1.1, 0, 0)
+      outputs.primitives << { x: overlay_rect.x,
+                              y: overlay_rect.y,
+                              w: overlay_rect.w,
+                              h: overlay_rect.h,
+                              r: 0, g: 0, b: 0, a: 230 }.solid!
     end
   
     def render_game
@@ -23641,14 +24374,14 @@ Follows is a source code listing for all files that have been open sourced. This
   
     def render_game_over
       return unless state.scene == :game
-      outputs.labels << [638, 358, score_text, 20, 1]
-      outputs.labels << [635, 360, score_text, 20, 1, 255, 255, 255]
-      outputs.labels << [638, 428, countdown_text, 20, 1]
-      outputs.labels << [635, 430, countdown_text, 20, 1, 255, 255, 255]
+      outputs.labels << { x: 638, y: 358, text: score_text,     size_enum: 20, alignment_enum: 1 }
+      outputs.labels << { x: 635, y: 360, text: score_text,     size_enum: 20, alignment_enum: 1, r: 255, g: 255, b: 255 }
+      outputs.labels << { x: 638, y: 428, text: countdown_text, size_enum: 20, alignment_enum: 1 }
+      outputs.labels << { x: 635, y: 430, text: countdown_text, size_enum: 20, alignment_enum: 1, r: 255, g: 255, b: 255 }
     end
   
     def render_background
-      outputs.sprites << [0, 0, 1280, 720, 'sprites/background.png']
+      outputs.sprites << { x: 0, y: 0, w: 1280, h: 720, path: 'sprites/background.png' }
   
       scroll_point_at   = state.tick_count
       scroll_point_at   = state.scene_at if state.scene == :menu
@@ -23660,11 +24393,18 @@ Follows is a source code listing for all files that have been open sourced. This
       outputs.sprites << scrolling_background(scroll_point_at, 'sprites/parallax_front.png',  1.00, -80)
     end
   
+    def scrolling_background at, path, rate, y = 0
+      [
+        { x:    0 - at.*(rate) % 1440, y: y, w: 1440, h: 720, path: path },
+        { x: 1440 - at.*(rate) % 1440, y: y, w: 1440, h: 720, path: path }
+      ]
+    end
+  
     def render_walls
       state.walls.each do |w|
         w.sprites = [
-          [w.x, w.bottom_height - 720, 100, 720, 'sprites/wall.png', 180],
-          [w.x, w.top_y,               100, 720, 'sprites/wallbottom.png', 0]
+          { x: w.x, y: w.bottom_height - 720, w: 100, h: 720, path: 'sprites/wall.png',       angle: 180 },
+          { x: w.x, y: w.top_y,               w: 100, h: 720, path: 'sprites/wallbottom.png', angle: 0 }
         ]
       end
       outputs.sprites << state.walls.map(&:sprites)
@@ -23673,15 +24413,13 @@ Follows is a source code listing for all files that have been open sourced. This
     def render_dragon
       state.show_death = true if state.countdown == 3.seconds
   
-      render_debug_hitbox false
-  
       if state.show_death == false || !state.death_at
         animation_index = state.flapped_at.frame_index 6, 2, false if state.flapped_at
         sprite_name = "sprites/dragon_fly#{animation_index.or(0) + 1}.png"
-        state.dragon_sprite = [state.x, state.y, 100, 80, sprite_name, state.dy * 1.2]
+        state.dragon_sprite = { x: state.x, y: state.y, w: 100, h: 80, path: sprite_name, angle: state.dy * 1.2 }
       else
         sprite_name = "sprites/dragon_die.png"
-        state.dragon_sprite = [state.x, state.y, 100, 80, sprite_name, state.dy * 1.2]
+        state.dragon_sprite = { x: state.x, y: state.y, w: 100, h: 80, path: sprite_name, angle: state.dy * 1.2 }
         sprite_changed_elapsed    = state.death_at.elapsed_time - 1.seconds
         state.dragon_sprite.angle += (sprite_changed_elapsed ** 1.3) * state.death_fall_direction * -1
         state.dragon_sprite.x     += (sprite_changed_elapsed ** 1.2) * state.death_fall_direction
@@ -23691,20 +24429,12 @@ Follows is a source code listing for all files that have been open sourced. This
       outputs.sprites << state.dragon_sprite
     end
   
-    def render_debug_hitbox show
-      return unless show
-      outputs.borders << [dragon_collision_box.rect, 255, 0, 0] if state.dragon_sprite
-      outputs.borders << state.walls.flat_map do |w|
-         w.sprites.map { |s| [s.rect, 255, 0, 0] }
-      end
-    end
-  
     def render_flash
       return unless state.flash_at
   
-      outputs.primitives << [grid.rect,
-                             white,
-                             255 * state.flash_at.ease(20, :flip)].solid
+      outputs.primitives << { **grid.rect.to_hash,
+                              **white,
+                              a: 255 * state.flash_at.ease(20, :flip) }.solid!
   
       state.flash_at = 0 if state.flash_at.elapsed_time > 20
     end
@@ -23824,19 +24554,12 @@ Follows is a source code listing for all files that have been open sourced. This
       end
     end
   
-    def scrolling_background at, path, rate, y = 0
-      [
-        [   0 - at.*(rate) % 1440, y, 1440, 720, path],
-        [1440 - at.*(rate) % 1440, y, 1440, 720, path]
-      ]
-    end
-  
     def white
-      [255, 255, 255]
+      { r: 255, g: 255, b: 255 }
     end
   
     def large_white_typeset
-      [5, 0, 255, 255, 255]
+      { size_enum: 5, alignment_enum: 0, r: 255, g: 255, b: 255 }
     end
   
     def at_beginning?
@@ -23845,9 +24568,9 @@ Follows is a source code listing for all files that have been open sourced. This
   
     def dragon_collision_box
       state.dragon_sprite
-          .scale_rect(1.0 - collision_forgiveness, 0.5, 0.5)
-          .rect_shift_right(10)
-          .rect_shift_up(state.dy * 2)
+           .scale_rect(1.0 - collision_forgiveness, 0.5, 0.5)
+           .rect_shift_right(10)
+           .rect_shift_up(state.dy * 2)
     end
   
     def game_over?
@@ -23856,7 +24579,7 @@ Follows is a source code listing for all files that have been open sourced. This
       state.walls
           .flat_map { |w| w.sprites }
           .any? do |s|
-            s.intersect_rect?(dragon_collision_box)
+            s && s.intersect_rect?(dragon_collision_box)
           end
     end
   
@@ -25248,319 +25971,6 @@ Follows is a source code listing for all files that have been open sourced. This
 
 #+end_src
 
-*** Crafting - Farming Game Starting Point - repl.rb
-#+begin_src ruby
-  # ./samples/99_genre_crafting/farming_game_starting_point/app/repl.rb
-  # ===============================================================
-  # Welcome to repl.rb
-  # ===============================================================
-  # You can experiement with code within this file. Code in this
-  # file is only executed when you save (and only excecuted ONCE).
-  # ===============================================================
-  
-  # ===============================================================
-  # REMOVE the "x" from the word "xrepl" and save the file to RUN
-  # the code in between the do/end block delimiters.
-  # ===============================================================
-  
-  # ===============================================================
-  # ADD the "x" to the word "repl" (make it xrepl) and save the
-  # file to IGNORE the code in between the do/end block delimiters.
-  # ===============================================================
-  
-  # Remove the x from xrepl to run the code. Add the x back to ignore to code.
-  xrepl do
-    puts "The result of 1 + 2 is: #{1 + 2}"
-  end
-  
-  # ====================================================================================
-  # Ruby Crash Course:
-  # Strings, Numeric, Booleans, Conditionals, Looping, Enumerables, Arrays
-  # ====================================================================================
-  
-  # ====================================================================================
-  #  Strings
-  # ====================================================================================
-  # Remove the x from xrepl to run the code. Add the x back to ignore to code.
-  xrepl do
-    message = "Hello World"
-    puts "The value of message is: " + message
-    puts "Any value can be interpolated within a string using \#{}."
-    puts "Interpolated message: #{message}."
-    puts 'This #{message} is not interpolated because the string uses single quotes.'
-  end
-  
-  # ====================================================================================
-  #  Numerics
-  # ====================================================================================
-  # Remove the x from xrepl to run the code. Add the x back to ignore to code.
-  xrepl do
-    a = 10
-    puts "The value of a is: #{a}"
-    puts "a + 1 is: #{a + 1}"
-    puts "a / 3 is: #{a / 3}"
-  end
-  
-  # Remove the x from xrepl to run the code. Add the x back to ignore to code.
-  xrepl do
-    b = 10.12
-    puts "The value of b is: #{b}"
-    puts "b + 1 is: #{b + 1}"
-    puts "b as an integer is: #{b.to_i}"
-    puts ''
-  end
-  
-  # ====================================================================================
-  #  Booleans
-  # ====================================================================================
-  # Remove the x from xrepl to run the code. Add the x back to ignore to code.
-  xrepl do
-    c = 30
-    puts "The value of c is #{c}."
-  
-    if c
-      puts "This if statement ran because c is truthy."
-    end
-  end
-  
-  # Remove the x from xrepl to run the code. Add the x back to ignore to code.
-  xrepl do
-    d = false
-    puts "The value of d is #{d}."
-  
-    if !d
-      puts "This if statement ran because d is falsey, using the not operator (!) makes d evaluate to true."
-    end
-  
-    e = nil
-    puts "Nil is also considered falsey. The value of e is: #{e}."
-  
-    if !e
-      puts "This if statement ran because e is nil (a falsey value)."
-    end
-  end
-  
-  # ====================================================================================
-  #  Conditionals
-  # ====================================================================================
-  # Remove the x from xrepl to run the code. Add the x back to ignore to code.
-  xrepl do
-    i_am_true  = true
-    i_am_nil   = nil
-    i_am_false = false
-    i_am_hi    = "hi"
-  
-    puts "======== if statement"
-    i_am_one = 1
-    if i_am_one
-      puts "This was printed because i_am_one is truthy."
-    end
-  
-    puts "======== if/else statement"
-    if i_am_false
-      puts "This will NOT get printed because i_am_false is false."
-    else
-      puts "This was printed because i_am_false is false."
-    end
-  
-    puts "======== if/elsif/else statement"
-    if i_am_false
-      puts "This will NOT get printed because i_am_false is false."
-    elsif i_am_true
-      puts "This was printed because i_am_true is true."
-    else
-      puts "This will NOT get printed i_am_true was true."
-    end
-  
-    puts "======== case statement "
-    i_am_one = 1
-    case i_am_one
-    when 10
-      puts "case equaled: 10"
-    when 9
-      puts "case equaled: 9"
-    when 5
-      puts "case equaled: 5"
-    when 1
-      puts "case equaled: 1"
-    else
-      puts "Value wasn't cased."
-    end
-  
-    puts "======== different types of comparisons"
-    if 4 == 4
-      puts "equal (4 == 4)"
-    end
-  
-    if 4 != 3
-      puts "not equal (4 != 3)"
-    end
-  
-    if 3 < 4
-      puts "less than (3 < 4)"
-    end
-  
-    if 4 > 3
-      puts "greater than (4 > 3)"
-    end
-  
-    if ((4 > 3) || (3 < 4) || false)
-      puts "or statement ((4 > 3) || (3 < 4) || false)"
-    end
-  
-    if ((4 > 3) && (3 < 4))
-      puts "and statement ((4 > 3) && (3 < 4))"
-    end
-  end
-  
-  # ====================================================================================
-  # Looping
-  # ====================================================================================
-  # Remove the x from xrepl to run the code. Add the x back to ignore to code.
-  xrepl do
-    puts "======== times block"
-    3.times do |i|
-      puts i
-    end
-    puts "======== range block exclusive"
-    (0...3).each do |i|
-      puts i
-    end
-    puts "======== range block inclusive"
-    (0..3).each do |i|
-      puts i
-    end
-  end
-  
-  # ====================================================================================
-  #  Enumerables
-  # ====================================================================================
-  # Remove the x from xrepl to run the code. Add the x back to ignore to code.
-  xrepl do
-    puts "======== array each"
-    colors = ["red", "blue", "yellow"]
-    colors.each do |color|
-      puts color
-    end
-  
-    puts '======== array each_with_index'
-    colors = ["red", "blue", "yellow"]
-    colors.each_with_index do |color, i|
-      puts "#{color} at index #{i}"
-    end
-  end
-  
-  # Remove the x from xrepl to run the code. Add the x back to ignore to code.
-  xrepl do
-    puts "======== single parameter function"
-    def add_one_to n
-      n + 5
-    end
-  
-    puts add_one_to(3)
-  
-    puts "======== function with default value"
-    def function_with_default_value v = 10
-      v * 10
-    end
-  
-    puts "passing three: #{function_with_default_value(3)}"
-    puts "passing nil: #{function_with_default_value}"
-  
-    puts "======== Or Equal (||=) operator for nil values"
-    def function_with_nil_default_with_local a = nil
-      result   = a
-      result ||= "or equal operator was exected and set a default value"
-    end
-  
-    puts "passing 'hi': #{function_with_nil_default_with_local 'hi'}"
-    puts "passing nil: #{function_with_nil_default_with_local}"
-  end
-  
-  # ====================================================================================
-  #  Arrays
-  # ====================================================================================
-  # Remove the x from xrepl to run the code. Add the x back to ignore to code.
-  xrepl do
-    puts "======== Create an array with the numbers 1 to 10."
-    one_to_ten = (1..10).to_a
-    puts one_to_ten
-  
-    puts "======== Create a new array that only contains even numbers from the previous array."
-    one_to_ten = (1..10).to_a
-    evens = one_to_ten.find_all do |number|
-      number % 2 == 0
-    end
-    puts evens
-  
-    puts "======== Create a new array that rejects odd numbers."
-    one_to_ten = (1..10).to_a
-    also_even = one_to_ten.reject do |number|
-      number % 2 != 0
-    end
-    puts also_even
-  
-    puts "======== Create an array that doubles every number."
-    one_to_ten = (1..10).to_a
-    doubled = one_to_ten.map do |number|
-      number * 2
-    end
-    puts doubled
-  
-    puts "======== Create an array that selects only odd numbers and then multiply those by 10."
-    one_to_ten = (1..10).to_a
-    odd_doubled = one_to_ten.find_all do |number|
-      number % 2 != 0
-    end.map do |odd_number|
-      odd_number * 10
-    end
-    puts odd_doubled
-  
-    puts "======== All combination of numbers 1 to 10."
-    one_to_ten = (1..10).to_a
-    all_combinations = one_to_ten.product(one_to_ten)
-    puts all_combinations
-  
-    puts "======== All uniq combinations of numbers. For example: [1, 2] is the same as [2, 1]."
-    one_to_ten = (1..10).to_a
-    uniq_combinations =
-      one_to_ten.product(one_to_ten)
-        .map do |unsorted_number|
-      unsorted_number.sort
-    end.uniq
-    puts uniq_combinations
-  end
-  
-  # ====================================================================================
-  #  Advanced Arrays
-  # ====================================================================================
-  # Remove the x from xrepl to run the code. Add the x back to ignore to code.
-  xrepl do
-    puts "======== All unique Pythagorean Triples between 1 and 40 sorted by area of the triangle."
-  
-    one_to_hundred = (1..40).to_a
-    triples =
-      one_to_hundred.product(one_to_hundred).map do |width, height|
-      [width, height, Math.sqrt(width ** 2 + height ** 2)]
-    end.find_all do |_, _, hypotenuse|
-      hypotenuse.to_i == hypotenuse
-    end.map do |triangle|
-      triangle.map(&:to_i)
-    end.uniq do |triangle|
-      triangle.sort
-    end.map do |width, height, hypotenuse|
-      [width, height, hypotenuse, (width * height) / 2]
-    end.sort_by do |_, _, _, area|
-      area
-    end
-  
-    triples.each do |width, height, hypotenuse, area|
-      puts "(#{width}, #{height}, #{hypotenuse}) = #{area}"
-    end
-  end
-
-#+end_src
-
 *** Crafting - Farming Game Starting Point - tests.rb
 #+begin_src ruby
   # ./samples/99_genre_crafting/farming_game_starting_point/app/tests.rb
@@ -28721,10 +29131,381 @@ Follows is a source code listing for all files that have been open sourced. This
 
 #+end_src
 
+*** Mario - Jumping - main.rb
+#+begin_src ruby
+  # ./samples/99_genre_mario/01_jumping/app/main.rb
+  def tick args
+    defaults args
+    render args
+    input args
+    calc args
+  end
+  
+  def defaults args
+    args.state.player.x      ||= args.grid.w.half
+    args.state.player.y      ||= 0
+    args.state.player.size   ||= 100
+    args.state.player.dy     ||= 0
+    args.state.player.action ||= :jumping
+    args.state.jump.power           = 20
+    args.state.jump.increase_frames = 10
+    args.state.jump.increase_power  = 1
+    args.state.gravity              = -1
+  end
+  
+  def render args
+    args.outputs.sprites << {
+      x: args.state.player.x -
+         args.state.player.size.half,
+      y: args.state.player.y,
+      w: args.state.player.size,
+      h: args.state.player.size,
+      path: 'sprites/square/red.png'
+    }
+  end
+  
+  def input args
+    if args.inputs.keyboard.key_down.space
+      if args.state.player.action == :standing
+        args.state.player.action = :jumping
+        args.state.player.dy = args.state.jump.power
+  
+        # record when the action took place
+        current_frame = args.state.tick_count
+        args.state.player.action_at = current_frame
+      end
+    end
+  
+    # if the space bar is being held
+    if args.inputs.keyboard.key_held.space
+      # is the player jumping
+      is_jumping = args.state.player.action == :jumping
+  
+      # when was the jump performed
+      time_of_jump = args.state.player.action_at
+  
+      # how much time has passed since the jump
+      jump_elapsed_time = time_of_jump.elapsed_time
+  
+      # how much time is allowed for increasing power
+      time_allowed = args.state.jump.increase_frames
+  
+      # if the player is jumping
+      # and the elapsed time is less than
+      # the allowed time
+      if is_jumping && jump_elapsed_time < time_allowed
+         # increase the dy by the increase power
+         power_to_add = args.state.jump.increase_power
+         args.state.player.dy += power_to_add
+      end
+    end
+  end
+  
+  def calc args
+    if args.state.player.action == :jumping
+      args.state.player.y  += args.state.player.dy
+      args.state.player.dy += args.state.gravity
+    end
+  
+    if args.state.player.y < 0
+      args.state.player.y      = 0
+      args.state.player.action = :standing
+    end
+  end
+
+#+end_src
+
+*** Mario - Jumping And Collisions - main.rb
+#+begin_src ruby
+  # ./samples/99_genre_mario/02_jumping_and_collisions/app/main.rb
+  class Game
+    attr_gtk
+  
+    def tick
+      defaults
+      render
+      input
+      calc
+    end
+  
+    def defaults
+      return if state.tick_count != 0
+  
+      player.x                     = 64
+      player.y                     = 800
+      player.size                  = 50
+      player.dx                    = 0
+      player.dy                    = 0
+      player.action                = :falling
+  
+      player.max_speed             = 20
+      player.jump_power            = 15
+      player.jump_air_time         = 15
+      player.jump_increase_power   = 1
+  
+      state.gravity                = -1
+      state.drag                   = 0.001
+      state.tile_size              = 64
+      state.tiles                ||= [
+        { ordinal_x:  0, ordinal_y: 0 },
+        { ordinal_x:  1, ordinal_y: 0 },
+        { ordinal_x:  2, ordinal_y: 0 },
+        { ordinal_x:  3, ordinal_y: 0 },
+        { ordinal_x:  4, ordinal_y: 0 },
+        { ordinal_x:  5, ordinal_y: 0 },
+        { ordinal_x:  6, ordinal_y: 0 },
+        { ordinal_x:  7, ordinal_y: 0 },
+        { ordinal_x:  8, ordinal_y: 0 },
+        { ordinal_x:  9, ordinal_y: 0 },
+        { ordinal_x: 10, ordinal_y: 0 },
+        { ordinal_x: 11, ordinal_y: 0 },
+        { ordinal_x: 12, ordinal_y: 0 },
+  
+        { ordinal_x:  9, ordinal_y: 3 },
+        { ordinal_x: 10, ordinal_y: 3 },
+        { ordinal_x: 11, ordinal_y: 3 },
+      ]
+  
+      tiles.each do |t|
+        t.rect = { x: t.ordinal_x * 64,
+                   y: t.ordinal_y * 64,
+                   w: 64,
+                   h: 64 }
+      end
+    end
+  
+    def render
+      render_player
+      render_tiles
+      # render_grid
+    end
+  
+    def input
+      input_jump
+      input_move
+    end
+  
+    def calc
+      calc_player_rect
+      calc_left
+      calc_right
+      calc_below
+      calc_above
+      calc_player_dy
+      calc_player_dx
+      calc_game_over
+    end
+  
+    def render_player
+      outputs.sprites << {
+        x: player.x,
+        y: player.y,
+        w: player.size,
+        h: player.size,
+        path: 'sprites/square/red.png'
+      }
+    end
+  
+    def render_tiles
+      outputs.sprites << state.tiles.map do |t|
+        t.merge path: 'sprites/square/white.png',
+                x: t.ordinal_x * 64,
+                y: t.ordinal_y * 64,
+                w: 64,
+                h: 64
+      end
+    end
+  
+    def render_grid
+      if state.tick_count == 0
+        outputs[:grid].background_color = [0, 0, 0, 0]
+        outputs[:grid].borders << available_brick_locations
+        outputs[:grid].labels  << available_brick_locations.map do |b|
+          [
+            b.merge(text: "#{b.ordinal_x},#{b.ordinal_y}",
+                    x: b.x + 2,
+                    y: b.y + 2,
+                    size_enum: -3,
+                    vertical_alignment_enum: 0,
+                    blendmode_enum: 0),
+            b.merge(text: "#{b.x},#{b.y}",
+                    x: b.x + 2,
+                    y: b.y + 2 + 20,
+                    size_enum: -3,
+                    vertical_alignment_enum: 0,
+                    blendmode_enum: 0)
+          ]
+        end
+      end
+  
+      outputs.sprites << { x: 0, y: 0, w: 1280, h: 720, path: :grid }
+    end
+  
+    def input_jump
+      if inputs.keyboard.key_down.space
+        player_jump
+      end
+  
+      if inputs.keyboard.key_held.space
+        player_jump_increase_air_time
+      end
+    end
+  
+    def input_move
+      if player.dx.abs < 20
+        if inputs.keyboard.left
+          player.dx -= 2
+        elsif inputs.keyboard.right
+          player.dx += 2
+        end
+      end
+    end
+  
+    def calc_game_over
+      if player.y < -64
+        player.x = 64
+        player.y = 800
+        player.dx = 0
+        player.dy = 0
+      end
+    end
+  
+    def calc_player_rect
+      player.rect      = player_current_rect
+      player.next_rect = player_next_rect
+      player.prev_rect = player_prev_rect
+    end
+  
+    def calc_player_dx
+      player.dx  = player_next_dx
+      player.x  += player.dx
+    end
+  
+    def calc_player_dy
+      player.y  += player.dy
+      player.dy  = player_next_dy
+    end
+  
+    def calc_below
+      return unless player.dy < 0
+      tiles_below = tiles_find { |t| t.rect.top <= player.prev_rect.y }
+      collision = tiles_find_colliding tiles_below, (player.rect.merge y: player.next_rect.y)
+      if collision
+        player.y  = collision.rect.y + state.tile_size
+        player.dy = 0
+        player.action = :standing
+      else
+        player.action = :falling
+      end
+    end
+  
+    def calc_left
+      return unless player.dx < 0 && player_next_dx < 0
+      tiles_left = tiles_find { |t| t.rect.right <= player.prev_rect.left }
+      collision = tiles_find_colliding tiles_left, (player.rect.merge x: player.next_rect.x)
+      return unless collision
+      player.x  = collision.rect.right
+      player.dx = 0
+    end
+  
+    def calc_right
+      return unless player.dx > 0 && player_next_dx > 0
+      tiles_right = tiles_find { |t| t.rect.left >= player.prev_rect.right }
+      collision = tiles_find_colliding tiles_right, (player.rect.merge x: player.next_rect.x)
+      return unless collision
+      player.x  = collision.rect.left - player.rect.w
+      player.dx = 0
+    end
+  
+    def calc_above
+      return unless player.dy > 0
+      tiles_above = tiles_find { |t| t.rect.y >= player.prev_rect.y }
+      collision = tiles_find_colliding tiles_above, (player.rect.merge y: player.next_rect.y)
+      return unless collision
+      player.dy = 0
+      player.y  = collision.rect.bottom - player.rect.h
+    end
+  
+    def player_current_rect
+      { x: player.x, y: player.y, w: player.size, h: player.size }
+    end
+  
+    def available_brick_locations
+      (0..19).to_a
+        .product(0..11)
+        .map do |(ordinal_x, ordinal_y)|
+        { ordinal_x: ordinal_x,
+          ordinal_y: ordinal_y,
+          x: ordinal_x * 64,
+          y: ordinal_y * 64,
+          w: 64,
+          h: 64 }
+      end
+    end
+  
+    def player
+      state.player ||= args.state.new_entity :player
+    end
+  
+    def player_next_dy
+      player.dy + state.gravity + state.drag ** 2 * -1
+    end
+  
+    def player_next_dx
+      player.dx * 0.8
+    end
+  
+    def player_next_rect
+      player.rect.merge x: player.x + player_next_dx,
+                        y: player.y + player_next_dy
+    end
+  
+    def player_prev_rect
+      player.rect.merge x: player.x - player.dx,
+                        y: player.y - player.dy
+    end
+  
+    def player_jump
+      return if player.action != :standing
+      player.action = :jumping
+      player.dy = state.player.jump_power
+      current_frame = state.tick_count
+      player.action_at = current_frame
+    end
+  
+    def player_jump_increase_air_time
+      return if player.action != :jumping
+      return if player.action_at.elapsed_time >= player.jump_air_time
+      player.dy += player.jump_increase_power
+    end
+  
+    def tiles
+      state.tiles
+    end
+  
+    def tiles_find_colliding tiles, target
+      tiles.find { |t| t.rect.intersect_rect? target }
+    end
+  
+    def tiles_find &block
+      tiles.find_all(&block)
+    end
+  end
+  
+  def tick args
+    $game ||= Game.new
+    $game.args = args
+    $game.tick
+  end
+  
+  $gtk.reset
+
+#+end_src
+
 *** Platformer - Clepto Frog - main.rb
 #+begin_src ruby
   # ./samples/99_genre_platformer/clepto_frog/app/main.rb
-  MAP_FILE_PATH = 'app/map.txt'
+  MAP_FILE_PATH = 'map.txt'
   
   require 'app/map.rb'
   
@@ -28779,35 +29560,7 @@ Follows is a source code listing for all files that have been open sourced. This
   
     def render_intro
       outputs.labels << [640, 700, "Clepto Frog", 4, 1]
-      if state.tick_count >= 120
-        outputs.labels << [640, 620, "\"Uh... your office has a pet frog?\" - New Guy",
-                           4, 1, 0, 0, 0, 255 * 120.ease(60)]
-      end
-  
-      if state.tick_count >= 240
-        outputs.labels << [640, 580, "\"Yep! His name is Clepto.\" - Jim",
-                           4, 1, 0, 0, 0, 255 * 240.ease(60)]
-      end
-  
-      if state.tick_count >= 360
-        outputs.labels << [640, 540, "\"Uh...\" - New Guy",
-                           4, 1, 0, 0, 0, 255 * 360.ease(60)]
-      end
-  
-      if state.tick_count >= 480
-        outputs.labels << [640, 500, "\"He steals mugs while we're away...\" - Jim",
-                           4, 1, 0, 0, 0, 255 * 480.ease(60)]
-      end
-  
-      if state.tick_count >= 600
-        outputs.labels << [640, 460, "\"It's not a big deal, we take them back in the morning.\" - Jim",
-                           4, 1, 0, 0, 0, 255 * 600.ease(60)]
-      end
-  
-      outputs.sprites << [640 - 50, 360 - 50, 100, 100,
-                          "sprites/square-green.png"]
-  
-      if state.tick_count == 800
+      if state.tick_count == 120
         state.scene = :game
         state.game_start_at = state.tick_count
       end
@@ -28815,7 +29568,7 @@ Follows is a source code listing for all files that have been open sourced. This
   
     def tick
       defaults
-      if state.scene == :intro && state.tick_count <= 800
+      if state.scene == :intro && state.tick_count <= 120
         render_intro
       elsif state.scene == :ending
         render_ending
@@ -28918,15 +29671,15 @@ Follows is a source code listing for all files that have been open sourced. This
   
       if state.god_mode
         # SHOW HIDE COLLISIONS
-        outputs.sprites << state.world.map do |x, y, w, h|
-          x = vx(x)
-          y = vy(y)
+        outputs.sprites << state.world.map do |rect|
+          x = vx(rect.x)
+          y = vy(rect.y)
           if x > -80 && x < 1280 && y > -80 && y < 720
             {
               x: x,
               y: y,
-              w: vw(w || state.tile_size),
-              h: vh(h || state.tile_size),
+              w: vw(rect.w || state.tile_size),
+              h: vh(rect.h || state.tile_size),
               path: 'sprites/square-gray.png',
               a: 128
             }
@@ -28949,8 +29702,10 @@ Follows is a source code listing for all files that have been open sourced. This
   
   
         # Creates sprite following mouse to help indicate which sprite you have selected
-        outputs.primitives << [inputs.mouse.position.x, inputs.mouse.position.y,
-                               state.tile_size, state.tile_size, 'sprites/square-indigo.png', 0, 100].sprite
+        outputs.primitives << [inputs.mouse.position.x - 32 * state.camera_scale,
+                               inputs.mouse.position.y - 32 * state.camera_scale,
+                               state.tile_size * state.camera_scale,
+                               state.tile_size * state.camera_scale, 'sprites/square-indigo.png', 0, 100].sprite
       end
   
       render_mini_map
@@ -29031,6 +29786,29 @@ Follows is a source code listing for all files that have been open sourced. This
         set_camera_scale 1
       end
   
+      if inputs.mouse.click
+        state.id_seed += 1
+        id = state.id_seed
+        x = state.camera_x + (inputs.mouse.click.x.fdiv(state.camera_scale) - 32)
+        y = state.camera_y + (inputs.mouse.click.y.fdiv(state.camera_scale) - 32)
+        x = ((x + 2).idiv 4) * 4
+        y = ((y + 2).idiv 4) * 4
+        w = 64
+        h = 64
+        candidate_rect = { id: id, x: x, y: y, w: w, h: h }
+        scaled_candidate_rect = { x: x + 30, y: y + 30, w: w - 60, h: h - 60 }
+        to_remove = state.world.find { |r| r.intersect_rect? scaled_candidate_rect }
+        if to_remove && args.inputs.keyboard.x
+          state.world.reject! { |r| r.id == to_remove.id }
+        else
+          state.world << candidate_rect
+        end
+        export_map
+        state.world_lookup = {}
+        state.world_collision_rects = nil
+        calc_world_lookup
+      end
+  
       if input_up?
         state.y += 10
         state.dy = 0
@@ -29052,12 +29830,6 @@ Follows is a source code listing for all files that have been open sourced. This
       if state.scene == :game
         process_inputs_player_movement
         process_inputs_god_mode
-      elsif state.scene == :intro
-        if args.inputs.keyboard.key_down.enter || args.inputs.keyboard.key_down.space
-          if Kernel.tick_count < 600
-            Kernel.tick_count = 600
-          end
-        end
       end
     end
   
@@ -29155,17 +29927,6 @@ Follows is a source code listing for all files that have been open sourced. This
       end
     end
   
-    def add_floors
-      # floors
-      state.world += [
-        [0,       0, 10000, 40],
-        [0,    1670, 3250, 60],
-        [6691, 1653, 3290, 60],
-        [1521, 3792, 7370, 60],
-        [0, 5137, 3290, 60]
-      ]
-    end
-  
     def attempt_load_world_from_file
       return if state.world
       # exported_world = gtk.read_file(MAP_FILE_PATH)
@@ -29173,26 +29934,11 @@ Follows is a source code listing for all files that have been open sourced. This
       state.objects = []
   
       if $collisions
-        $collisions.map do |x, y, w, h|
-          state.world << [x, y, w, h]
+        state.id_seed ||= 0
+        $collisions.each do |x, y, w, h|
+          state.id_seed += 1
+          state.world << { id: state.id_seed, x: x, y: y, w: w, h: h }
         end
-  
-        add_floors
-      # elsif exported_world
-      #   exported_world.each_line.map do |l|
-      #     tokens = l.strip.split(',')
-      #     x    = tokens[0].to_i
-      #     y    = tokens[1].to_i
-      #     type = tokens[2].to_i
-      #     if type == 1
-      #       state.world << [x, y, state.tile_size, state.tile_size]
-      #     elsif type == 2
-      #       w, h, path = tokens[3..-1]
-      #       state.objects << [x, y, w.to_i, h.to_i, path]
-      #     end
-      #   end
-  
-      #   add_floors
       end
   
       if $mugs
@@ -29213,23 +29959,24 @@ Follows is a source code listing for all files that have been open sourced. This
   
       # Searches through the world and finds the cordinates that exist
       state.world_lookup = {}
-      state.world.each do |x, y, w, h|
-        state.world_lookup[[x, y, w || state.tile_size, h || state.tile_size]] = true
+      state.world.each do |rect|
+        state.world_lookup[rect.id] = rect
       end
   
       # Assigns collision rects for every sprite drawn
       state.world_collision_rects =
         state.world_lookup
              .keys
-             .map do |x, y, w, h|
+             .map do |key|
+               rect = state.world_lookup[key]
                s = state.tile_size
-               w ||= s
-               h ||= s
+               rect.w ||= s
+               rect.h ||= s
                {
-                 args:       [x, y, w, h],
-                 left_right: [x,     y + 4, w,     h - 6],
-                 top:        [x + 4, y + 6, w - 8, h - 6],
-                 bottom:     [x + 1, y - 1, w - 2, h - 8],
+                 args:       rect,
+                 left_right: { x: rect.x,     y: rect.y + 4, w: rect.w,     h: rect.h - 6 },
+                 top:        { x: rect.x + 4, y: rect.y + 6, w: rect.w - 8, h: rect.h - 6 },
+                 bottom:     { x: rect.x + 1, y: rect.y - 1, w: rect.w - 2, h: rect.h - 8 },
                }
              end
   
@@ -29285,12 +30032,21 @@ Follows is a source code listing for all files that have been open sourced. This
   
     def end_of_tongue
       p = state.tongue_angle.vector(state.tongue_length)
-      [start_of_tongue.x + p.x, start_of_tongue.y + p.y]
+      { x: start_of_tongue.x + p.x, y: start_of_tongue.y + p.y }
     end
   
     def calc_shooting
+      calc_shooting_increment
+      calc_shooting_increment
+      calc_shooting_increment
+      calc_shooting_increment
+      calc_shooting_increment
+      calc_shooting_increment
+    end
+  
+    def calc_shooting_increment
       return unless state.action == :shooting
-      state.tongue_length += 30
+      state.tongue_length += 5
       potential_anchor = end_of_tongue
       if potential_anchor.x <= 0
         state.anchor_point = potential_anchor
@@ -29309,9 +30065,9 @@ Follows is a source code listing for all files that have been open sourced. This
         state.action = :anchored
         outputs.sounds << 'sounds/attached.wav'
       else
-        anchor_rect = [potential_anchor.x - 5, potential_anchor.y - 5, 10, 10]
+        anchor_rect = { x: potential_anchor.x - 5, y: potential_anchor.y - 5, w: 10, h: 10 }
         collision = state.world_collision_rects.find_all do |v|
-          [v[:args].x, v[:args].y, v[:args].w, v[:args].h].intersect_rect?(anchor_rect)
+          v[:args].intersect_rect?(anchor_rect)
         end.first
         if collision
           state.anchor_point = potential_anchor
@@ -29407,7 +30163,7 @@ Follows is a source code listing for all files that have been open sourced. This
                                .first
   
       return unless left_side_collisions
-      state.x = left_side_collisions[:left_right].right
+      state.x = left_side_collisions[:left_right].right + 1
       state.dx = state.dy.abs * 0.8
       state.collision_on_x = true
     end
@@ -29422,7 +30178,7 @@ Follows is a source code listing for all files that have been open sourced. This
                                 .first
   
       return unless right_side_collisions
-      state.x = right_side_collisions[:left_right].left - state.tile_size
+      state.x = right_side_collisions[:left_right].left - state.tile_size - 1
       state.dx = state.dx.abs * 0.8 * -1
       state.collision_on_x = true
     end
@@ -29438,7 +30194,7 @@ Follows is a source code listing for all files that have been open sourced. This
                           .first
   
       return unless ceil_collisions
-      state.y = ceil_collisions[:bottom].y - state.tile_size
+      state.y = ceil_collisions[:bottom].y - state.tile_size - 1
       state.dy = state.dy.abs * 0.8 * -1
       state.collision_on_y = true
     end
@@ -29451,13 +30207,17 @@ Follows is a source code listing for all files that have been open sourced. This
     end
   
     def export_map
-      export_string = state.world.map do |x, y|
-        "#{x},#{y},1"
-      end
+      export_string = "$collisions = [\n"
+      export_string += state.world.map do |rect|
+        "[#{rect.x},#{rect.y},#{rect.w},#{rect.h}],"
+      end.join "\n"
+      export_string += "\n]\n\n"
+      export_string += "$mugs = [\n"
       export_string += state.objects.map do |x, y, w, h, path|
-        "#{x},#{y},2,#{w},#{h},#{path}"
-      end
-      gtk.write_file(MAP_FILE_PATH, export_string.join("\n"))
+        "[#{x},#{y},#{w},#{h},'#{path}'],"
+      end.join "\n"
+      export_string += "\n]\n\n"
+      gtk.write_file(MAP_FILE_PATH, export_string)
       state.map_saved_at = state.tick_count
     end
   
@@ -30585,6 +31345,11 @@ Follows is a source code listing for all files that have been open sourced. This
     [4459, 3997, 64, 64],
     [76, 5215, 64, 64],
     [39, 5217, 64, 64],
+    [0,       0, 10000, 40],
+    [0,    1670, 3250, 60],
+    [6691, 1653, 3290, 60],
+    [1521, 3792, 7370, 60],
+    [0, 5137, 3290, 60]
   ]
   
   $mugs = [
@@ -31440,6 +32205,7 @@ Follows is a source code listing for all files that have been open sourced. This
     end
   
     def load_lines file
+      return unless state.snaps
       data = gtk.read_file(file) || ""
       data.each_line
           .reject { |l| l.strip.length == 0 }
@@ -31498,10 +32264,10 @@ Follows is a source code listing for all files that have been open sourced. This
       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|
+      results[:impacts] = terrain.find_all { |t| t && (line_near_rect? results[:rect], t) }.map do |t|
         {
           terrain: t,
-          point: geometry.line_intersect(results[:trajectory], t),
+          point: geometry.line_intersect(results[:trajectory], t, replace_infinity: 1000),
           type: :terrain
         }
       end.reject { |t| !point_within_line? t[:point], t[:terrain] }
@@ -31509,10 +32275,10 @@ Follows is a source code listing for all files that have been open sourced. This
       results[:impacts] += lava.find_all { |t| line_near_rect? results[:rect], t }.map do |t|
         {
           terrain: t,
-          point: geometry.line_intersect(results[:trajectory], t),
+          point: geometry.line_intersect(results[:trajectory], t, replace_infinity: 1000),
           type: :lava
         }
-      end.reject { |t| !point_within_line? t[:point], t[:terrain] }
+      end.reject { |t| !t || (!point_within_line? t[:point], t[:terrain]) }
   
       results
     end
@@ -31525,6 +32291,7 @@ Follows is a source code listing for all files that have been open sourced. This
     end
   
     def calc_terrains_to_monitor
+      return unless circle.impacts
       circle.impact = nil
       circle.impacts.each do |i|
         circle.terrains_to_monitor[i[:terrain]] ||= {
@@ -37074,6 +37841,151 @@ Follows is a source code listing for all files that have been open sourced. This
 
 #+end_src
 
+*** Rpg Topdown - Topdown Casino - main.rb
+#+begin_src ruby
+  # ./samples/99_genre_rpg_topdown/topdown_casino/app/main.rb
+  $gtk.reset
+  
+  def coinflip
+    rand < 0.5
+  end
+  
+  class Game
+    attr_accessor :args
+  
+    def text_font
+      return nil #"rpg.ttf"
+    end
+  
+    def text_color
+      [ 255, 255, 255, 255 ]
+    end
+  
+    def set_gem_values
+      @args.state.gem0 = ((coinflip) ?  100 : 20)
+      @args.state.gem1 = ((coinflip) ? -10 : -50)
+      @args.state.gem2 = ((coinflip) ? -10 : -30)
+      if coinflip
+        tmp = @args.state.gem0
+        @args.state.gem0 = @args.state.gem1
+        @args.state.gem1 = tmp
+      end
+      if coinflip
+        tmp = @args.state.gem1
+        @args.state.gem1 = @args.state.gem2
+        @args.state.gem2 = tmp
+      end
+      if coinflip
+        tmp = @args.state.gem0
+        @args.state.gem0 = @args.state.gem2
+        @args.state.gem2 = tmp
+      end
+    end
+  
+    def initialize args
+      @args = args
+      @args.state.animticks = 0
+      @args.state.score = 0
+      @args.state.gem_chosen = false
+      @args.state.round_finished = false
+      @args.state.gem0_x = 197
+      @args.state.gem0_y = 720-274
+      @args.state.gem1_x = 623
+      @args.state.gem1_y = 720-274
+      @args.state.gem2_x = 1049
+      @args.state.gem2_y = 720-274
+      @args.state.hero_sprite = "sprites/herodown100.png"
+      @args.state.hero_x = 608
+      @args.state.hero_y = 720-656
+      set_gem_values
+    end
+  
+    def render_gem_value x, y, gem
+      if @args.state.gem_chosen
+        @args.outputs.labels << [ x, y + 96, gem.to_s, 1, 1, *text_color, text_font ]
+      end
+    end
+  
+    def render
+      gemsprite = ((@args.state.animticks % 400) < 200) ? 'sprites/gem200.png' : 'sprites/gem400.png'
+      @args.outputs.background_color = [ 0, 0, 0, 255 ]
+      @args.outputs.sprites << [608, 720-150, 64, 64, 'sprites/oldman.png']
+      @args.outputs.sprites << [300, 720-150, 64, 64, 'sprites/fire.png']
+      @args.outputs.sprites << [900, 720-150, 64, 64, 'sprites/fire.png']
+      @args.outputs.sprites << [@args.state.gem0_x, @args.state.gem0_y, 32, 64, gemsprite]
+      @args.outputs.sprites << [@args.state.gem1_x, @args.state.gem1_y, 32, 64, gemsprite]
+      @args.outputs.sprites << [@args.state.gem2_x, @args.state.gem2_y, 32, 64, gemsprite]
+      @args.outputs.sprites << [@args.state.hero_x, @args.state.hero_y, 64, 64, @args.state.hero_sprite]
+  
+      @args.outputs.labels << [ 630, 720-30, "IT'S A SECRET TO EVERYONE.", 1, 1, *text_color, text_font ]
+      @args.outputs.labels << [ 50, 720-85, @args.state.score.to_s, 1, 1, *text_color, text_font ]
+      render_gem_value @args.state.gem0_x, @args.state.gem0_y, @args.state.gem0
+      render_gem_value @args.state.gem1_x, @args.state.gem1_y, @args.state.gem1
+      render_gem_value @args.state.gem2_x, @args.state.gem2_y, @args.state.gem2
+    end
+  
+    def calc
+      @args.state.animticks += 16
+  
+      return unless @args.state.gem_chosen
+      @args.state.round_finished_debounce ||= 60 * 3
+      @args.state.round_finished_debounce -= 1
+      return if @args.state.round_finished_debounce > 0
+  
+      @args.state.gem_chosen = false
+      @args.state.hero.sprite[0] = 'sprites/herodown100.png'
+      @args.state.hero.sprite[1] = 608
+      @args.state.hero.sprite[2] = 656
+      @args.state.round_finished_debounce = nil
+      set_gem_values
+    end
+  
+    def walk xdir, ydir, anim
+      @args.state.hero_sprite = "sprites/#{anim}#{(((@args.state.animticks % 200) < 100) ? '100' : '200')}.png"
+      @args.state.hero_x += 5 * xdir
+      @args.state.hero_y += 5 * ydir
+    end
+  
+    def check_gem_touching gem_x, gem_y, gem
+      return if @args.state.gem_chosen
+      herorect = [ @args.state.hero_x, @args.state.hero_y, 64, 64 ]
+      return if !herorect.intersect_rect?([gem_x, gem_y, 32, 64])
+      @args.state.gem_chosen = true
+      @args.state.score += gem
+      @args.outputs.sounds << ((gem < 0) ? 'sounds/lose.wav' : 'sounds/win.wav')
+    end
+  
+    def input
+      if @args.inputs.keyboard.key_held.left
+        walk(-1.0, 0.0, 'heroleft')
+      elsif @args.inputs.keyboard.key_held.right
+        walk(1.0, 0.0, 'heroright')
+      elsif @args.inputs.keyboard.key_held.up
+        walk(0.0, 1.0, 'heroup')
+      elsif @args.inputs.keyboard.key_held.down
+        walk(0.0, -1.0, 'herodown')
+      end
+  
+      check_gem_touching(@args.state.gem0_x, @args.state.gem0_y, @args.state.gem0)
+      check_gem_touching(@args.state.gem1_x, @args.state.gem1_y, @args.state.gem1)
+      check_gem_touching(@args.state.gem2_x, @args.state.gem2_y, @args.state.gem2)
+    end
+  
+    def tick
+      input
+      calc
+      render
+    end
+  end
+  
+  def tick args
+      args.state.game ||= Game.new args
+      args.state.game.args = args
+      args.state.game.tick
+  end
+
+#+end_src
+
 *** Rpg Topdown - Topdown Starting Point - main.rb
 #+begin_src ruby
   # ./samples/99_genre_rpg_topdown/topdown_starting_point/app/main.rb
@@ -37188,6 +38100,189 @@ Follows is a source code listing for all files that have been open sourced. This
 
 #+end_src
 
+*** Teenytiny - Teenytiny Starting Point - main.rb
+#+begin_src ruby
+  # ./samples/99_genre_teenytiny/teenytiny_starting_point/app/main.rb
+  # full documenation is at http://docs.dragonruby.org
+  # be sure to come to the discord if you hit any snags: http://discord.dragonruby.org
+  def tick args
+    # ====================================================
+    # initialize default variables
+    # ====================================================
+  
+    # ruby has an operator called ||= which means "only initialize this if it's nil"
+    args.state.count_down   ||= 20 * 60 # set the count down to 20 seconds
+    # set the initial position of the target
+    args.state.target       ||= { x: args.grid.w.half,
+                                  y: args.grid.h.half,
+                                  w: 20,
+                                  h: 20 }
+  
+    # set the initial position of the player
+    args.state.player       ||= { x: 50,
+                                  y: 50,
+                                  w: 20,
+                                  h: 20 }
+  
+    # set the player movement speed
+    args.state.player_speed ||= 5
+  
+    # set the score
+    args.state.score        ||= 0
+    args.state.teleports    ||= 3
+  
+    # set the instructions
+    args.state.instructions ||= "Get to the red goal! Use arrow keys to move. Spacebar to teleport (use them carefully)!"
+  
+    # ====================================================
+    # render the game
+    # ====================================================
+    args.outputs.labels  << { x: args.grid.w.half, y: args.grid.h - 10,
+                              text: args.state.instructions,
+                              alignment_enum: 1 }
+  
+    # check if it's game over. if so, then render game over
+    # otherwise render the current time left
+    if game_over? args
+      args.outputs.labels  << { x: args.grid.w.half,
+                                y: args.grid.h - 40,
+                                text: "game over! (press r to start over)",
+                                alignment_enum: 1 }
+    else
+      args.outputs.labels  << { x: args.grid.w.half,
+                                y: args.grid.h - 40,
+                                text: "time left: #{(args.state.count_down.idiv 60) + 1}",
+                                alignment_enum: 1 }
+    end
+  
+    # render the score
+    args.outputs.labels  << { x: args.grid.w.half,
+                              y: args.grid.h - 70,
+                              text: "score: #{args.state.score}",
+                              alignment_enum: 1 }
+  
+    # render the player with teleport count
+    args.outputs.sprites << { x: args.state.player.x,
+                              y: args.state.player.y,
+                              w: args.state.player.w,
+                              h: args.state.player.h,
+                              path: 'sprites/square-green.png' }
+  
+    args.outputs.labels << { x: args.state.player.x + 10,
+                             y: args.state.player.y + 40,
+                             text: "teleports: #{args.state.teleports}",
+                             alignment_enum: 1, size_enum: -2 }
+  
+    # render the target
+    args.outputs.sprites << { x: args.state.target.x,
+                              y: args.state.target.y,
+                              w: args.state.target.w,
+                              h: args.state.target.h,
+                              path: 'sprites/square-red.png' }
+  
+    # ====================================================
+    # run simulation
+    # ====================================================
+  
+    # count down calculation
+    args.state.count_down -= 1
+    args.state.count_down = -1 if args.state.count_down < -1
+  
+    # ====================================================
+    # process player input
+    # ====================================================
+    # if it isn't game over let them move
+    if !game_over? args
+      dir_y = 0
+      dir_x = 0
+  
+      # determine the change horizontally
+      if args.inputs.keyboard.up
+        dir_y += args.state.player_speed
+      elsif args.inputs.keyboard.down
+        dir_y -= args.state.player_speed
+      end
+  
+      # determine the change vertically
+      if args.inputs.keyboard.left
+        dir_x -= args.state.player_speed
+      elsif args.inputs.keyboard.right
+        dir_x += args.state.player_speed
+      end
+  
+      # determine if teleport can be used
+      if args.inputs.keyboard.key_down.space && args.state.teleports > 0
+        args.state.teleports -= 1
+        dir_x *= 20
+        dir_y *= 20
+      end
+  
+      # apply change to player
+      args.state.player.x += dir_x
+      args.state.player.y += dir_y
+    else
+      # if r is pressed, reset the game
+      if args.inputs.keyboard.key_down.r
+        $gtk.reset
+        return
+      end
+    end
+  
+    # ====================================================
+    # determine score
+    # ====================================================
+  
+    # calculate new score if the player is at goal
+    if !game_over? args
+  
+      # if the player is at the goal, then move the goal
+      if args.state.player.intersect_rect? args.state.target
+        # increment the goal
+        args.state.score += 1
+  
+        # move the goal to a random location
+        args.state.target = { x: (rand args.grid.w), y: (rand args.grid.h), w: 20, h: 20 }
+  
+        # make sure the goal is inside the view area
+        if args.state.target.x < 0
+          args.state.target.x += 20
+        elsif args.state.target.x > 1280
+          args.state.target.x -= 20
+        end
+  
+        # make sure the goal is inside the view area
+        if args.state.target.y < 0
+          args.state.target.y += 20
+        elsif args.state.target.y > 720
+          args.state.target.y -= 20
+        end
+      end
+    end
+  end
+  
+  def game_over? args
+    args.state.count_down < 0
+  end
+  
+  $gtk.reset
+
+#+end_src
+
+*** Teenytiny - Teenytiny Starting Point - license.txt
+#+begin_src ruby
+  # ./samples/99_genre_teenytiny/teenytiny_starting_point/license.txt
+  Copyright 2019 DragonRuby LLC
+  
+  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.
+
+#+end_src
+
 ** OSS
 Follows is a source code listing for all files that have been open sourced. This code can be found online at [[https://github.com/DragonRuby/dragonruby-game-toolkit-contrib/]].
 *** args.rb
@@ -37205,6 +38300,7 @@ Follows is a source code listing for all files that have been open sourced. This
     class Args
       include ArgsDeprecated
       include Serialize
+      attr_accessor :cvars
       attr_accessor :inputs
       attr_accessor :outputs
       attr_accessor :audio
@@ -37225,6 +38321,7 @@ Follows is a source code listing for all files that have been open sourced. This
       def initialize runtime, recording
         @inputs = Inputs.new
         @outputs = Outputs.new args: self
+        @cvars = {}
         @audio = {}
         @passes = []
         @state = OpenEntity.new
@@ -37395,6 +38492,23 @@ Follows is a source code listing for all files that have been open sourced. This
       def autocomplete_methods
         [:inputs, :outputs, :gtk, :state, :geometry, :audio, :grid, :layout, :fn]
       end
+  
+      def method_missing name, *args, &block
+        if (args.length <= 1) && (@state.as_hash.key? name)
+          raise <<-S
+  * ERROR - :#{name} method missing on ~#{self.class.name}~.
+  The method
+    :#{name}
+  with args
+    #{args}
+  doesn't exist on #{inspect}.
+  ** POSSIBLE SOLUTION - ~args.state.#{name}~ exists.
+  Did you forget ~.state~ before ~.#{name}~?
+  S
+        end
+  
+        super
+      end
     end
   end
 
@@ -37690,14 +38804,17 @@ Follows is a source code listing for all files that have been open sourced. This
     class Console
       include ConsoleDeprecated
   
-      attr_accessor :show_reason, :log, :logo, :background_color,
-                    :text_color, :animation_duration,
+      attr_accessor :show_reason, :log, :logo,
+                    :animation_duration,
                     :max_log_lines, :max_history, :log,
-                    :last_command_errored, :last_command, :error_color, :shown_at,
-                    :header_color, :archived_log, :last_log_lines, :last_log_lines_count,
+                    :last_command_errored, :last_command, :shown_at,
+                    :archived_log, :last_log_lines, :last_log_lines_count,
                     :suppress_left_arrow_behavior, :command_set_at,
                     :toast_ids, :bottom,
-                    :font_style, :menu
+                    :font_style, :menu,
+                    :background_color, :spam_color, :text_color, :warn_color,
+                    :error_color, :header_color, :code_color, :comment_color,
+                    :debug_color, :unfiltered_color
   
       def initialize
         @font_style = FontStyle.new(font: 'font.ttf', size_enum: -1.5, line_height: 1.1)
@@ -37715,15 +38832,22 @@ Follows is a source code listing for all files that have been open sourced. This
         @command_history_index = -1
         @nonhistory_input = ''
         @logo = 'console-logo.png'
-        @history_fname = 'console_history.txt'
+        @history_fname = 'logs/console_history.txt'
         @background_color = Color.new [0, 0, 0, 224]
-        @text_color = Color.new [255, 255, 255]
-        @error_color = Color.new [200, 50, 50]
         @header_color = Color.new [100, 200, 220]
         @code_color = Color.new [210, 168, 255]
-        @comment_color    = Color.new [0, 200, 100]
+        @comment_color = Color.new [0, 200, 100]
         @animation_duration = 1.seconds
         @shown_at = -1
+  
+        # these are the colors for text at various log levels.
+        @spam_color = Color.new [160, 160, 160]
+        @debug_color = Color.new [0, 255, 0]
+        @text_color = Color.new [255, 255, 255]
+        @warn_color = Color.new [255, 255, 0]
+        @error_color = Color.new [200, 50, 50]
+        @unfiltered_color = Color.new [0, 255, 255]
+  
         load_history
       end
   
@@ -37789,7 +38913,13 @@ Follows is a source code listing for all files that have been open sourced. This
         nil
       end
   
-      def add_text obj
+      def add_text obj, loglevel=-1
+        # loglevel is one of the values of LogLevel in logging.h, or -1 to say "we don't care, colorize it with your special string parsing magic"
+        loglevel = -1 if loglevel < 0
+        loglevel = 5 if loglevel > 5  # 5 == unfiltered (it's 0x7FFFFFFE in C, clamp it down)
+        loglevel = 2 if (loglevel == -1) && obj.start_with?('!c!')  # oh well
+        colorstr = (loglevel != -1) ? "!c!#{loglevel}" : nil
+  
         @last_log_lines_count ||= 1
         @log_invocation_count += 1
   
@@ -37798,12 +38928,18 @@ Follows is a source code listing for all files that have been open sourced. This
         log_lines = []
   
         str.each_line do |s|
-          s.wrapped_lines(self.console_text_width).each do |l|
-            log_lines << l
+          if colorstr.nil?
+            s.wrapped_lines(self.console_text_width).each do |l|
+              log_lines << l
+            end
+          else
+            s.wrapped_lines(self.console_text_width).each do |l|
+              log_lines << "#{colorstr}#{l}"
+            end
           end
         end
   
-        if log_lines == @last_log_lines
+        if log_lines == @last_log_lines && log_lines.length != 0
           @last_log_lines_count += 1
           new_log_line_with_count = @last_log_lines.last + " (#{@last_log_lines_count})"
           if log_lines.length > 1
@@ -38078,10 +39214,12 @@ Follows is a source code listing for all files that have been open sourced. This
       def mouse_wheel_scroll args
         @inertia ||= 0
   
-        if args.inputs.mouse.wheel && args.inputs.mouse.wheel.y > 0
-          @inertia = 1
-        elsif args.inputs.mouse.wheel && args.inputs.mouse.wheel.y < 0
-          @inertia = -1
+        if args.inputs.mouse.wheel
+          if args.inputs.mouse.wheel.y > 0
+            @inertia = 1
+          elsif args.inputs.mouse.wheel.y < 0
+            @inertia = -1
+          end
         end
   
         if args.inputs.mouse.click
@@ -38090,13 +39228,11 @@ Follows is a source code listing for all files that have been open sourced. This
   
         return if @inertia == 0
   
-        if @inertia != 0
-          @inertia = (@inertia * 0.7)
-          if @inertia > 0
-            @log_offset -= 1
-          elsif @inertia < 0
-            @log_offset += 1
-          end
+        @inertia = (@inertia * 0.7)
+        if @inertia > 0
+          @log_offset += 1
+        elsif @inertia < 0
+          @log_offset -= 1
         end
   
         if @inertia.abs < 0.01
@@ -38114,6 +39250,7 @@ Follows is a source code listing for all files that have been open sourced. This
         if console_toggle_key_down? args
           args.inputs.text.clear
           toggle
+          args.inputs.keyboard.clear if !@visible
         end
   
         return unless visible?
@@ -38125,7 +39262,16 @@ Follows is a source code listing for all files that have been open sourced. This
         @log_offset = 0 if @log_offset < 0
   
         if args.inputs.keyboard.key_down.enter
-          eval_the_set_command
+          if slide_progress > 0.5
+            # in the event of an exception, the console window pops up
+            # and is pre-filled with $gtk.reset.
+            # there is an annoying scenario where the exception could be thrown
+            # by pressing enter (while playing the game). if you press enter again
+            # quickly, then the game is reset which closes the console.
+            # so enter in the console is only evaluated if the slide_progress
+            # is atleast half way down the page.
+            eval_the_set_command
+          end
         elsif args.inputs.keyboard.key_down.v
           if args.inputs.keyboard.key_down.control || args.inputs.keyboard.key_down.meta
             prompt << $gtk.ffi_misc.getclipboard
@@ -38202,7 +39348,7 @@ Follows is a source code listing for all files that have been open sourced. This
       def write_line(args, left, y, str, archived: false)
         color = color_for_log_entry(str)
         color = color.mult_alpha(0.5) if archived
-  
+        str = str[4..-1] if str.start_with?('!c!')  # chop off loglevel color
         args.outputs.reserved << font_style.label(x: left.shift_right(10), y: y, text: str, color: color)
       end
   
@@ -38438,7 +39584,9 @@ Follows is a source code listing for all files that have been open sourced. This
         return false
       end
   
-      def color_for_log_entry(log_entry)
+      def color_for_plain_text log_entry
+        log_entry = log_entry[4..-1] if log_entry.start_with? "!c!"
+  
         if code? log_entry
           @code_color
         elsif code_comment? log_entry
@@ -38458,6 +39606,29 @@ Follows is a source code listing for all files that have been open sourced. This
         end
       end
   
+      def color_for_log_entry(log_entry)
+        if log_entry.start_with?('!c!')  # loglevel color specified.
+          return case log_entry[3..3].to_i
+                 when 0  # spam
+                   @spam_color
+                 when 1  # debug
+                   @debug_color
+                 #when 2  # info (caught by the `else` block.)
+                 #  @text_color
+                 when 3  # warn
+                   @warn_color
+                 when 4  # error
+                   @error_color
+                 when 5  # unfiltered
+                   @unfiltered_color
+                 else
+                   color_for_plain_text log_entry
+                 end
+        end
+  
+        return color_for_plain_text log_entry
+      end
+  
       def prompt
         @prompt ||= Prompt.new(font_style: font_style, text_color: @text_color, console_text_width: console_text_width)
       end
@@ -38909,11 +40080,11 @@ Follows is a source code listing for all files that have been open sourced. This
   
             # partition the original list of items into a string to be printed
             items.each_slice(columns).each_with_index do |cells, i|
-              pretty_print_row_seperator string_width, cell_width, column_width, columns
+              pretty_print_row_separator string_width, cell_width, column_width, columns
               pretty_print_row cells, string_width, cell_width, column_width, columns
             end
   
-            pretty_print_row_seperator string_width, cell_width, column_width, columns
+            pretty_print_row_separator string_width, cell_width, column_width, columns
           end
         end
   
@@ -39750,8 +40921,8 @@ Follows is a source code listing for all files that have been open sourced. This
         ease_extended start_tick,
                       current_tick,
                       start_tick + duration,
-                      (initial_value *definitions),
-                      (final_value *definitions),
+                      initial_value(*definitions),
+                      final_value(*definitions),
                       *definitions
       end
   
@@ -39946,8 +41117,8 @@ Follows is a source code listing for all files that have been open sourced. This
   module GTK
     module Geometry
       def self.rotate_point point, angle, around = nil
-        s = Math.sin a.to_radians
-        c = Math.cos a.to_radians
+        s = Math.sin angle.to_radians
+        c = Math.cos angle.to_radians
         px = point.x
         py = point.y
         cx = 0
@@ -40128,8 +41299,16 @@ Follows is a source code listing for all files that have been open sourced. This
       end
   
       # @gtk
-      def self.line_y_intercept line
-        line.y - line_slope(line) * line.x
+      def self.line_y_intercept line, replace_infinity: nil
+        line.y - line_slope(line, replace_infinity: replace_infinity) * line.x
+      rescue Exception => e
+  raise <<-S
+  * ERROR: ~Geometry::line_y_intercept~
+  The following exception was thrown for line: #{line}
+  #{e}
+  
+  Consider passing in ~replace_infinity: VALUE~ to handle for vertical lines.
+  S
       end
   
       # @gtk
@@ -40205,14 +41384,22 @@ Follows is a source code listing for all files that have been open sourced. This
       end
   
       # @gtk
-      def self.line_intersect line_one, line_two
-        m1 = line_slope(line_one)
-        m2 = line_slope(line_two)
-        b1 = line_y_intercept(line_one)
-        b2 = line_y_intercept(line_two)
+      def self.line_intersect line_one, line_two, replace_infinity: nil
+        m1 = line_slope(line_one, replace_infinity: replace_infinity)
+        m2 = line_slope(line_two, replace_infinity: replace_infinity)
+        b1 = line_y_intercept(line_one, replace_infinity: replace_infinity)
+        b2 = line_y_intercept(line_two, replace_infinity: replace_infinity)
         x = (b1 - b2) / (m2 - m1)
         y = (-b2.fdiv(m2) + b1.fdiv(m1)).fdiv(1.fdiv(m1) - 1.fdiv(m2))
         [x, y]
+      rescue Exception => e
+  raise <<-S
+  * ERROR: ~Geometry::line_intersect~
+  The following exception was thrown for line_one: #{line_one}, line_two: #{line_two}
+  #{e}
+  
+  Consider passing in ~replace_infinity: VALUE~ to handle for vertical lines.
+  S
       end
   
       def self.contract_intersect_rect?
@@ -40897,7 +42084,8 @@ Follows is a source code listing for all files that have been open sourced. This
         value = Kernel.tick_count if value
   
         collection.each do |m|
-          self.instance_variable_set("@#{m.to_s}".to_sym, value)
+          m_to_s = m.to_s
+          self.instance_variable_set("@#{m_to_s}".to_sym, value) if m_to_s.strip.length > 0
         rescue Exception => e
           raise e, <<-S
   * ERROR:
@@ -41441,6 +42629,7 @@ Follows is a source code listing for all files that have been open sourced. This
         :check_for_dev_profile,
   
         *app_metadata_retrieval_steps,
+        :determine_devcert,
   
         :clear_tmp_directory,
         :stage_app,
@@ -41469,6 +42658,7 @@ Follows is a source code listing for all files that have been open sourced. This
         :determine_app_version,
   
         *app_metadata_retrieval_steps,
+        :determine_prodcert,
   
         :clear_tmp_directory,
         :stage_app,
@@ -41663,6 +42853,10 @@ Follows is a source code listing for all files that have been open sourced. This
   appid=
   # appname is the name you want to show up underneath the app icon on the device. Keep it under 10 characters.
   appname=
+  # devcert is the certificate to use for development/deploying to your local device
+  devcert=
+  # prodcert is the certificate to use for distribution to the app store
+  prodcert=
   S
     end
   
@@ -41698,7 +42892,7 @@ Follows is a source code listing for all files that have been open sourced. This
     def raise_ios_metadata_required
       raise WizardException.new(
               "* mygame/metadata/ios_metadata.txt needs to be filled out.",
-              "You need to update metadata/ios_metadata.txt with a valid teamid, appname, and appid.",
+              "You need to update metadata/ios_metadata.txt with a valid teamid, appname, appid, devcert, and prodcert.",
               "Instructions for where the values should come from are within metadata/ios_metadata.txt."
             )
     end
@@ -41738,7 +42932,19 @@ Follows is a source code listing for all files that have been open sourced. This
     def determine_app_id
       @app_id = ios_metadata.appid
       raise_ios_metadata_required if @app_id.strip.length == 0
-      log_info "App Identifier is set to : #{@app_id}"
+      log_info "App Identifier is set to: #{@app_id}"
+    end
+  
+    def determine_devcert
+      @certificate_name = ios_metadata.devcert
+      raise_ios_metadata_required if @certificate_name.strip.length == 0
+      log_info "Dev Certificate is set to: #{@certificate_name}"
+    end
+  
+    def determine_prodcert
+      @certificate_name = ios_metadata.prodcert
+      raise_ios_metadata_required if @certificate_name.strip.length == 0
+      log_info "Production (Distribution) Certificate is set to: #{@certificate_name}"
     end
   
     def set_app_name name
@@ -41760,12 +42966,6 @@ Follows is a source code listing for all files that have been open sourced. This
       sh "rm -rf #{tmp_directory}"
     end
   
-    def stage_app
-      log_info "Staging."
-      sh "mkdir -p #{tmp_directory}"
-      sh "cp -R #{relative_path}/dragonruby-ios.app \"#{tmp_directory}/#{@app_name}.app\""
-    end
-  
     def set_app_id id
       log_info = "App Id set to: #{id}"
       @app_id = id
@@ -41796,34 +42996,13 @@ Follows is a source code listing for all files that have been open sourced. This
     def check_for_certs
       log_info "Attempting to find certificates on your computer."
   
-      if !cli_app_exist?(security_cli_app)
-        raise WizardException.new(
-                "* It doesn't look like you have #{security_cli_app}.",
-                "** 1. Open Disk Utility and run First Aid.",
-                { w: 700, h: 148, path: get_reserved_sprite("disk-utility.png") },
-              )
-      end
-  
-      if valid_certs.length == 0
-        raise WizardException.new(
-                "* It doesn't look like you have any valid certs installed.",
-                "** 1. Open Xcode.",
-                "** 2. Log into your developer account. Xcode -> Preferences -> Accounts.",
-                { w: 700, h: 98, path: get_reserved_sprite("login-xcode.png") },
-                "** 3. After loggin in, select Manage Certificates...",
-                { w: 700, h: 115, path: get_reserved_sprite("manage-certificates.png") },
-                "** 4. Add a certificate for Apple Development.",
-                { w: 700, h: 217, path: get_reserved_sprite("add-cert.png") },
-        )
-        raise "You do not have any Apple development certs on this computer."
-      end
-  
       if @production_build
-        @certificate_name = valid_certs.find_all { |f| f[:name].include? "Distribution" }.first[:name]
+        @certificate_name = ios_metadata[:prodcert]
       else
-        @certificate_name = valid_certs.find_all { |f| f[:name].include? "Development" }.first[:name]
+        @certificate_name = ios_metadata[:devcert]
       end
-      log_info "I will be using Certificate: '#{@certificate_name}'."
+  
+      log_info "I will be using certificate: '#{@certificate_name}'."
     end
   
     def idevice_id_cli_app
@@ -41838,24 +43017,6 @@ Follows is a source code listing for all files that have been open sourced. This
       "xcodebuild"
     end
   
-    def valid_certs
-      certs = sh("#{security_cli_app} -q find-identity -p codesigning -v").each_line.map do |l|
-        if l.include?(")") && !l.include?("Developer ID") && (l.include?("Development") || l.include?("Distribution"))
-          l.strip
-        else
-          nil
-        end
-      end.reject_nil.map do |l|
-        number, id, name = l.split(' ', 3)
-        name = name.gsub("\"", "") if name
-        {
-          number: 1,
-          id: id,
-          name: name
-        }
-      end
-    end
-  
     def connected_devices
       sh("idevice_id -l").strip.each_line.map do |l|
         l.strip
@@ -42385,6 +43546,9 @@ Follows is a source code listing for all files that have been open sourced. This
     end
   
     def stage_app
+      log_info "Staging."
+      sh "mkdir -p #{tmp_directory}"
+      sh "cp -R #{relative_path}/dragonruby-ios.app \"#{tmp_directory}/#{@app_name}.app\""
       sh %Q[cp -r "#{root_folder}/app/" "#{app_path}/app/"]
       sh %Q[cp -r "#{root_folder}/sounds/" "#{app_path}/sounds/"]
       sh %Q[cp -r "#{root_folder}/sprites/" "#{app_path}/sprites/"]
@@ -44222,26 +45386,6 @@ Follows is a source code listing for all files that have been open sourced. This
       (0..self).to_a
     end
   
-    def >= other
-      return false if !other
-      return gte other
-    end
-  
-    def > other
-      return false if !other
-      return gt other
-    end
-  
-    def <= other
-      return false if !other
-      return lte other
-    end
-  
-    def < other
-      return false if !other
-      return gt other
-    end
-  
     # @gtk
     def map
       unless block_given?
@@ -44327,34 +45471,6 @@ Follows is a source code listing for all files that have been open sourced. This
   S
     end
   
-    def - other
-      return self unless other
-      self - other
-    rescue Exception => e
-      __raise_arithmetic_exception__ other, :-, e
-    end
-  
-    def + other
-      return self unless other
-      self + other
-    rescue Exception => e
-      __raise_arithmetic_exception__ other, :+, e
-    end
-  
-    def * other
-      return self unless other
-      self * other
-    rescue Exception => e
-      __raise_arithmetic_exception__ other, :*, e
-    end
-  
-    def / other
-      return self unless other
-      self / other
-    rescue Exception => e
-      __raise_arithmetic_exception__ other, :/, e
-    end
-  
     def serialize
       self
     end
@@ -44409,34 +45525,6 @@ Follows is a source code listing for all files that have been open sourced. This
       return !even?
     end
   
-    def + other
-      return self unless other
-      self + other
-    rescue Exception => e
-      __raise_arithmetic_exception__ other, :+, e
-    end
-  
-    def * other
-      return self unless other
-      self * other
-    rescue Exception => e
-      __raise_arithmetic_exception__ other, :*, e
-    end
-  
-    def / other
-      return self unless other
-      self / other
-    rescue Exception => e
-      __raise_arithmetic_exception__ other, :/, e
-    end
-  
-    def - other
-      return self unless other
-      self - other
-    rescue Exception => e
-      __raise_arithmetic_exception__ other, :-, e
-    end
-  
     # Returns `-1` if the number is less than `0`. `+1` if the number
     # is greater than `0`. Returns `0` if the number is equal to `0`.
     #
@@ -44492,34 +45580,6 @@ Follows is a source code listing for all files that have been open sourced. This
     alias_method :__original_multiply__, :* unless Float.instance_methods.include? :__original_multiply__
     alias_method :__original_divide__,   :- unless Float.instance_methods.include? :__original_divide__
   
-    def - other
-      return self unless other
-      super
-    rescue Exception => e
-      __raise_arithmetic_exception__ other, :-, e
-    end
-  
-    def + other
-      return self unless other
-      super
-    rescue Exception => e
-      __raise_arithmetic_exception__ other, :+, e
-    end
-  
-    def * other
-      return self unless other
-      super
-    rescue Exception => e
-      __raise_arithmetic_exception__ other, :*, e
-    end
-  
-    def / other
-      return self unless other
-      super
-    rescue Exception => e
-      __raise_arithmetic_exception__ other, :/, e
-    end
-  
     def serialize
       self
     end
@@ -44569,6 +45629,272 @@ Follows is a source code listing for all files that have been open sourced. This
 
 #+end_src
 
+*** recording.rb
+#+begin_src ruby
+  # ./dragon/recording.rb
+  # coding: utf-8
+  # Copyright 2019 DragonRuby LLC
+  # MIT License
+  # recording.rb has been released under MIT (*only this file*).
+  
+  module GTK
+    # FIXME: Gross
+    # @gtk
+    class Replay
+      # @gtk
+      def self.start file_name = nil
+        $recording.start_replay file_name
+      end
+  
+      # @gtk
+      def self.stop
+        $recording.stop_replay
+      end
+    end
+  
+    # @gtk
+    class Recording
+      def initialize runtime
+        @runtime = runtime
+        @tick_count = 0
+        @global_input_order = 1
+      end
+  
+      def tick
+        @tick_count += 1
+      end
+  
+      def start_recording seed_number = nil
+        if !seed_number
+          log <<-S
+  * ERROR:
+  To start recording, you must provide an integer value to
+  seed random number generation.
+  S
+          $console.set_command "$recording.start SEED_NUMBER"
+          return
+        end
+  
+        if @is_recording
+          log <<-S
+  * ERROR:
+  You are already recording, first cancel (or stop) the current recording.
+  S
+          $console.set_command "$recording.cancel"
+          return
+        end
+  
+        if @is_replaying
+          log <<-S
+  * ERROR:
+  You are currently replaying a recording, first stop the replay.
+  S
+          return
+        end
+  
+        log_info <<-S
+  Recording has begun with RNG seed value set to #{seed_number}.
+  To stop recording use stop_recording(filename).
+  The recording will stop without saving a file if a filename is nil.
+  S
+  
+        $console.set_command "$recording.stop 'replay.txt'"
+        @runtime.__reset__
+        @seed_number = seed_number
+        @runtime.set_rng seed_number
+  
+        @tick_count = 0
+        @global_input_order = 1
+        @is_recording = true
+        @input_history = []
+        @runtime.notify! "Recording started. When completed, open the console to save it using $recording.stop FILE_NAME (or cancel).", 300
+      end
+  
+      # @gtk
+      def start seed_number = nil
+        start_recording seed_number
+      end
+  
+      def is_replaying?
+        @is_replaying
+      end
+  
+      def is_recording?
+        @is_recording
+      end
+  
+      # @gtk
+      def stop file_name = nil
+        stop_recording file_name
+      end
+  
+      # @gtk
+      def cancel
+        stop_recording_core
+        @runtime.notify! "Recording cancelled."
+      end
+  
+      def stop_recording file_name = nil
+        if !file_name
+          log <<-S
+  * ERROR:
+  To please specify a file name when calling:
+  $recording.stop FILE_NAME
+  
+  If you do NOT want to save the recording, call:
+  $recording.cancel
+  S
+          $console.set_command "$recording.stop 'replay.txt'"
+          return
+        end
+  
+        if !@is_recording
+          log_info "You are not currently recording. Use start_recording(seed_number) to start recording."
+          $console.set_command "$recording.start"
+          return
+        end
+  
+        if file_name
+          text = "replay_version 2.0\n"
+          text << "stopped_at #{@tick_count}\n"
+          text << "seed #{@seed_number}\n"
+          text << "recorded_at #{Time.now.to_s}\n"
+          @input_history.each do |items|
+            text << "#{items}\n"
+          end
+          @runtime.write_file file_name, text
+          @runtime.write_file 'last_replay.txt', text
+          log_info "The recording has been saved successfully at #{file_name}. You can use start_replay(\"#{file_name}\") to replay the recording."
+        end
+  
+        $console.set_command "$replay.start '#{file_name}'"
+        stop_recording_core
+        @runtime.notify! "Recording saved to #{file_name}. To replay it: $replay.start \"#{file_name}\"."
+        log_info "You can run the replay later on startup using: ./dragonruby mygame --replay #{@replay_file_name}"
+        nil
+      end
+  
+      def stop_recording_core
+        @is_recording = false
+        @input_history = nil
+        @last_history = nil
+        @runtime.__reset__
+      end
+  
+      def start_replay file_name = nil
+        if !file_name
+          log <<-S
+  * ERROR:
+  Please provide a file name to $recording.start.
+  S
+          $console.set_command "$replay.start 'replay.txt'"
+          return
+        end
+  
+        text = @runtime.read_file file_name
+        return false unless text
+  
+        if text.each_line.first.strip != "replay_version 2.0"
+          raise "The replay file #{file_name} is not compatible with this version of DragonRuby Game Toolkit. Please recreate the replay (sorry)."
+        end
+  
+        @replay_file_name = file_name
+  
+        $replay_data = { input_history: { } }
+        text.each_line do |l|
+          if l.strip.length == 0
+            next
+          elsif l.start_with? 'replay_version'
+            next
+          elsif l.start_with? 'seed'
+            $replay_data[:seed] = l.split(' ').last.to_i
+          elsif l.start_with? 'stopped_at'
+            $replay_data[:stopped_at] = l.split(' ').last.to_i
+          elsif l.start_with? 'recorded_at'
+            $replay_data[:recorded_at] = l.split(' ')[1..-1].join(' ')
+          elsif l.start_with? '['
+            name, value_1, value_2, value_count, id, tick_count = l.strip.gsub('[', '').gsub(']', '').split(',')
+            $replay_data[:input_history][tick_count.to_i] ||= []
+            $replay_data[:input_history][tick_count.to_i] << {
+              id: id.to_i,
+              name: name.gsub(':', '').to_sym,
+              value_1: value_1.to_f,
+              value_2: value_2.to_f,
+              value_count: value_count.to_i
+            }
+          else
+            raise "Replay data seems corrupt. I don't know how to parse #{l}."
+          end
+        end
+  
+        $replay_data[:input_history].keys.each do |key|
+          $replay_data[:input_history][key] = $replay_data[:input_history][key].sort_by {|input| input[:id]}
+        end
+  
+        @runtime.__reset__
+        @runtime.set_rng $replay_data[:seed]
+        @tick_count = 0
+        @is_replaying = true
+        log_info "Replay has been started."
+        @runtime.notify! "Replay started [#{@replay_file_name}]."
+      end
+  
+      def stop_replay notification_message =  "Replay has been stopped."
+        if !is_replaying?
+          log <<-S
+  * ERROR:
+  No replay is currently running. Call $replay.start FILE_NAME to start a replay.
+  S
+  
+          $console.set_command "$replay.start 'replay.txt'"
+          return
+        end
+        log_info notification_message
+        @is_replaying = false
+        $replay_data = nil
+        @tick_count = 0
+        @global_input_order = 1
+        $console.set_command_silent "$replay.start '#{@replay_file_name}'"
+        @runtime.__reset__
+        @runtime.notify! notification_message
+      end
+  
+      def record_input_history name, value_1, value_2, value_count, clear_cache = false
+        return if @is_replaying
+        return unless @is_recording
+        @input_history << [name, value_1, value_2, value_count, @global_input_order, @tick_count]
+        @global_input_order += 1
+      end
+  
+      def stage_replay_values
+        return unless @is_replaying
+        return unless $replay_data
+  
+        if $replay_data[:stopped_at] <= @tick_count
+          stop_replay "Replay completed [#{@replay_file_name}]. To rerun, bring up the Console and press enter."
+          return
+        end
+  
+        inputs_this_tick = $replay_data[:input_history][@tick_count]
+  
+        if @tick_count.zmod? 60
+          log_info "Replay ends in #{($replay_data[:stopped_at] - @tick_count).idiv 60} second(s)."
+        end
+  
+        return unless inputs_this_tick
+        inputs_this_tick.each do |v|
+          args = []
+          args << v[:value_1] if v[:value_count] >= 1
+          args << v[:value_2] if v[:value_count] >= 2
+          args << :replay
+          $gtk.send v[:name], *args
+        end
+      end
+    end
+  end
+
+#+end_src
+
 *** remote_hotload_client.rb
 #+begin_src ruby
   # ./dragon/remote_hotload_client.rb
@@ -44940,14 +46266,13 @@ Follows is a source code listing for all files that have been open sourced. This
           log <<-S
   ** Invoking :#{name}...
   S
-          time_start = Time.now
           idx = 0
           r = nil
+          time_start = Time.now
           while idx < iterations
             r = proc.call
             idx += 1
           end
-  
           result = (Time.now - time_start).round 3
   
           { name: name,
@@ -45072,7 +46397,7 @@ Follows is a source code listing for all files that have been open sourced. This
           fn.each_send pass.borders,           self, :draw_border
           fn.each_send pass.static_borders,    self, :draw_border
   
-          if !$gtk.production
+          if !self.production
             fn.each_send pass.debug,           self, :draw_primitive
             fn.each_send pass.static_debug,    self, :draw_primitive
           end
@@ -45089,6 +46414,7 @@ Follows is a source code listing for all files that have been open sourced. This
           if s.respond_to? :draw_override
             s.draw_override @ffi_draw
           else
+            s = s.as_hash if s.is_a? OpenEntity
             @ffi_draw.draw_solid_2 s.x, s.y, s.w, s.h,
                                    s.r, s.g, s.b, s.a,
                                    (s.blendmode_enum || 1)
@@ -45102,6 +46428,7 @@ Follows is a source code listing for all files that have been open sourced. This
           if s.respond_to? :draw_override
             s.draw_override @ffi_draw
           else
+            s = s.as_hash if s.is_a? OpenEntity
             @ffi_draw.draw_sprite_4 s.x, s.y, s.w, s.h,
                                     (s.path || '').to_s,
                                     s.angle,
@@ -45121,6 +46448,7 @@ Follows is a source code listing for all files that have been open sourced. This
           if s.respond_to? :draw_override
             s.draw_override @ffi_draw
           else
+            s = s.as_hash if s.is_a? OpenEntity
             @ffi_draw.draw_screenshot (s.path || '').to_s,
                                       s.x, s.y, s.w, s.h,
                                       s.angle,
@@ -45139,6 +46467,7 @@ Follows is a source code listing for all files that have been open sourced. This
           if l.respond_to? :draw_override
             l.draw_override @ffi_draw
           else
+            l = l.as_hash if l.is_a? OpenEntity
             @ffi_draw.draw_label_3 l.x, l.y,
                                    (l.text || '').to_s,
                                    l.size_enum, l.alignment_enum,
@@ -45156,6 +46485,7 @@ Follows is a source code listing for all files that have been open sourced. This
           if l.respond_to? :draw_override
             l.draw_override @ffi_draw
           else
+            l = l.as_hash if l.is_a? OpenEntity
             if l.x2
               @ffi_draw.draw_line_2 l.x, l.y, l.x2, l.y2,
                                     l.r, l.g, l.b, l.a,
@@ -45181,6 +46511,7 @@ Follows is a source code listing for all files that have been open sourced. This
           if s.respond_to? :draw_override
             s.draw_override @ffi_draw
           else
+            s = s.as_hash if s.is_a? OpenEntity
             @ffi_draw.draw_border_2 s.x, s.y, s.w, s.h,
                                     s.r, s.g, s.b, s.a,
                                     (s.blendmode_enum || 1)
@@ -45248,13 +46579,8 @@ Follows is a source code listing for all files that have been open sourced. This
               if @tick_speed_count > 60 * 2
                 if framerate_below_threshold?
                   @last_framerate = current_framerate
-                  if !@console.visible?
-                    if !@framerate_important_notification_happened
-                      log_important framerate_warning_message
-                    else
-                      log framerate_warning_message
-                    end
-                    @framerate_important_notification_happened = true
+                  if !@console.visible? && !@recording.is_replaying?
+                    log framerate_warning_message
                   end
                 end
   
@@ -46130,6 +47456,114 @@ Follows is a source code listing for all files that have been open sourced. This
 
 #+end_src
 
+*** tweetcart.rb
+#+begin_src ruby
+  # ./dragon/tweetcart.rb
+  # coding: utf-8
+  # Copyright 2019 DragonRuby LLC
+  # MIT License
+  # tweetcart.rb has been released under MIT (*only this file*).
+  
+  def $top_level.TICK &block
+    $top_level.define_method(:tick) do |args|
+      args.outputs[:scene].w = 160
+      args.outputs[:scene].h = 90
+      args.outputs[:scene].background_color = [0, 0, 0, 0]
+      block.call args
+      args.outputs.sprites << { x: 0, y: 0, w: 1280, h: 720, path: :scene }
+    end
+  
+    def $top_level.bg! *rgb
+      r,g,b = rgb
+      r ||= 255
+      g ||= r
+      b ||= g
+      $args.outputs.background_color = [r, g, b]
+    end
+  
+    def $top_level.slds
+      $args.outputs[:scene].sprites
+    end
+  
+    def $top_level.slds! *os
+      if (os.first.is_a? Numeric)
+        sld!(*os)
+      else
+        os.each { |o| sld!(*o) }
+      end
+    end
+  
+    def $top_level.sld! *params
+      x, y, w, h, r, g, b, a = nil
+      if params.length == 2
+        x, y = params
+      elsif params.length == 3 && (params.last.is_a? Array)
+        x = params[0]
+        y = params[1]
+        r, g, b, a = params[2]
+        r ||= 255
+        g ||= r
+        b ||= g
+        a ||= 255
+      elsif params.length == 4
+        x, y, w, h = params
+      elsif params.length == 5 && (params.last.is_a? Array)
+        x = params[0]
+        y = params[1]
+        w = params[2]
+        h = params[3]
+        r,g,b,a = params[4]
+        r ||= 255
+        g ||= r
+        b ||= g
+        a ||= 255
+      elsif params.length >= 7
+        x, y, w, h, r, g, b = params
+      else
+        raise "I don't know how to render #{params} with reasonable defaults."
+      end
+  
+      w ||= 1
+      h ||= 1
+      r ||= 255
+      g ||= 255
+      b ||= 255
+      a ||= 255
+  
+      slds << { x: x, y: y,
+                w: w, h: h,
+                r: r, g: g, b: b, a: a,
+                path: :pixel }
+    end
+  end
+  
+  =begin
+  wht  = [255] * 3
+  red  = [255, 0, 0]
+  blu  = [0, 130, 255]
+  purp = [150, 80, 255]
+  
+  TICK {
+    bg! 0
+  
+    slds << [0, 0, 3, 3, 0, 255, 0, 255]
+  
+    sld!     10, 10
+    sld!     20, 20, 3, 2
+    sld!     30, 30, 2, 2, red
+    sld!     35, 35, blu
+  
+    slds!    40, 40
+  
+    slds!   [50, 50],
+            [60, 60, purp],
+            [70, 70, 10, 10, wht],
+            [80, 80, 4, 4, 255, 0, 255]
+  }
+  =end
+
+#+end_src
+
 *** wizards.rb
 #+begin_src ruby
   # ./dragon/wizards.rb
diff --git a/docs/parse_log.txt b/docs/parse_log.txt
index 07e163d..047852d 100644
--- a/docs/parse_log.txt
+++ b/docs/parse_log.txt
@@ -5269,11 +5269,18 @@ Shows the mouse cursor.
 *** True Line Result
 *** ~.hide_cursor~
 ** Processing line: ~Hides the mouse cursor.~
-** Processing line: ~*** ~.cursor_shown?~~
+** Processing line: ~*** ~.set_cursor path, dx, dy~~
 - Header detected.
 *** True Line Result
 Hides the mouse cursor.
 *** True Line Result
+*** ~.set_cursor path, dx, dy~
+** Processing line: ~Sets the system cursor to a sprite ~path~ with an offset of ~dx~ and ~dy~.~
+** Processing line: ~*** ~.cursor_shown?~~
+- Header detected.
+*** True Line Result
+Sets the system cursor to a sprite ~path~ with an offset of ~dx~ and ~dy~.
+*** True Line Result
 *** ~.cursor_shown?~
 ** Processing line: ~Returns ~true~ if the mouse cursor is shown.~
 ** Processing line: ~*** ~.set_window_fullscreen enabled~~
@@ -5407,6 +5414,119 @@ This function takes in two parameters. The first parameter is the file path and
 - End of paragraph detected.
 *** True Line Result
 
+** Processing line: ~* DOCS: ~GTK::Runtime#benchmark~~
+- Header detected.
+*** True Line Result
+
+*** True Line Result
+* DOCS: ~GTK::Runtime#benchmark~
+** Processing line: ~You can use this function to compare the relative performance of methods.~
+** Processing line: ~~
+- End of paragraph detected.
+*** True Line Result
+You can use this function to compare the relative performance of methods.
+** Processing line: ~#+begin_src ruby~
+- Line was identified as the beginning of a code block.
+*** True Line Result
+
+*** True Line Result
+#+begin_src ruby
+** Processing line: ~  def tick args~
+- Inside source: true
+*** True Line Result
+  def tick args
+** Processing line: ~    # press r to run benchmark~
+- Inside source: true
+*** True Line Result
+    # press r to run benchmark
+** Processing line: ~    if args.inputs.keyboard.key_down.r~
+- Inside source: true
+*** True Line Result
+    if args.inputs.keyboard.key_down.r
+** Processing line: ~      args.gtk.console.show~
+- Inside source: true
+*** True Line Result
+      args.gtk.console.show
+** Processing line: ~      args.gtk.benchmark iterations: 1000, # number of iterations~
+- Inside source: true
+*** True Line Result
+      args.gtk.benchmark iterations: 1000, # number of iterations
+** Processing line: ~                         # label for experiment~
+- Inside source: true
+*** True Line Result
+                         # label for experiment
+** Processing line: ~                         using_numeric_map: -> () {~
+- Inside source: true
+*** True Line Result
+                         using_numeric_map: -> () {
+** Processing line: ~                           # experiment body~
+- Inside source: true
+*** True Line Result
+                           # experiment body
+** Processing line: ~                           v = 100.map do |i|~
+- Inside source: true
+*** True Line Result
+                           v = 100.map do |i|
+** Processing line: ~                             i * 100~
+- Inside source: true
+*** True Line Result
+                             i * 100
+** Processing line: ~                           end~
+- Inside source: true
+*** True Line Result
+                           end
+** Processing line: ~                         },~
+- Inside source: true
+*** True Line Result
+                         },
+** Processing line: ~                         # label for experiment~
+- Inside source: true
+*** True Line Result
+                         # label for experiment
+** Processing line: ~                         using_numeric_times: -> () {~
+- Inside source: true
+*** True Line Result
+                         using_numeric_times: -> () {
+** Processing line: ~                           # experiment body~
+- Inside source: true
+*** True Line Result
+                           # experiment body
+** Processing line: ~                           v = []~
+- Inside source: true
+*** True Line Result
+                           v = []
+** Processing line: ~                           100.times do |i|~
+- Inside source: true
+*** True Line Result
+                           100.times do |i|
+** Processing line: ~                             v << i * 100~
+- Inside source: true
+*** True Line Result
+                             v << i * 100
+** Processing line: ~                           end~
+- Inside source: true
+*** True Line Result
+                           end
+** Processing line: ~                         }~
+- Inside source: true
+*** True Line Result
+                         }
+** Processing line: ~    end~
+- Inside source: true
+*** True Line Result
+    end
+** Processing line: ~  end~
+- Inside source: true
+*** True Line Result
+  end
+** Processing line: ~#+end_src~
+- Line was identified as the end of a code block.
+*** True Line Result
+#+end_src
+** Processing line: ~~
+- End of paragraph detected.
+*** True Line Result
+
 ** Processing line: ~* DOCS: ~Array~~
 - Header detected.
 *** True Line Result
@@ -15439,10 +15559,10 @@ Follows is a source code listing for all files that have been open sourced. This
 - Inside source: true
 *** True Line Result
   # To see how many frames its been since the click occurred
-** Processing line: ~  # Use args.inputs.mouse.click.creat_at_elapsed~
+** Processing line: ~  # Use args.inputs.mouse.click.created_at_elapsed~
 - Inside source: true
 *** True Line Result
-  # Use args.inputs.mouse.click.creat_at_elapsed
+  # Use args.inputs.mouse.click.created_at_elapsed
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
@@ -26059,18 +26179,18 @@ Follows is a source code listing for all files that have been open sourced. This
 - Inside source: true
 *** True Line Result
     def calc_player_dx
-** Processing line: ~      player.y  += player.dy~
+** Processing line: ~      player.dx  = player.dx.clamp(-5,  5)~
 - Inside source: true
 *** True Line Result
-      player.y  += player.dy
-** Processing line: ~      player.dy += state.gravity~
+      player.dx  = player.dx.clamp(-5,  5)
+** Processing line: ~      player.dx *= 0.9~
 - Inside source: true
 *** True Line Result
-      player.dy += state.gravity
-** Processing line: ~      player.dy += player.dy * state.drag ** 2 * -1~
+      player.dx *= 0.9
+** Processing line: ~      player.x  += player.dx~
 - Inside source: true
 *** True Line Result
-      player.dy += player.dy * state.drag ** 2 * -1
+      player.x  += player.dx
 ** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
@@ -26083,18 +26203,18 @@ Follows is a source code listing for all files that have been open sourced. This
 - Inside source: true
 *** True Line Result
     def calc_player_dy
-** Processing line: ~      player.dx  = player.dx.clamp(-5,  5)~
+** Processing line: ~      player.y  += player.dy~
 - Inside source: true
 *** True Line Result
-      player.dx  = player.dx.clamp(-5,  5)
-** Processing line: ~      player.dx *= 0.9~
+      player.y  += player.dy
+** Processing line: ~      player.dy += state.gravity~
 - Inside source: true
 *** True Line Result
-      player.dx *= 0.9
-** Processing line: ~      player.x  += player.dx~
+      player.dy += state.gravity
+** Processing line: ~      player.dy += player.dy * state.drag ** 2 * -1~
 - Inside source: true
 *** True Line Result
-      player.x  += player.dx
+      player.dy += player.dy * state.drag ** 2 * -1
 ** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
@@ -26679,14 +26799,10 @@ Follows is a source code listing for all files that have been open sourced. This
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~    # Sets default values~
-- Inside source: true
-*** True Line Result
-    # Sets default values
-** Processing line: ~    def defaults~
+** Processing line: ~    def init_game~
 - Inside source: true
 *** True Line Result
-    def defaults
+    def init_game
 ** Processing line: ~      s.platforms ||= [ # initializes platforms collection with two platforms using hashes~
 - Inside source: true
 *** True Line Result
@@ -26775,6 +26891,26 @@ Follows is a source code listing for all files that have been open sourced. This
 - Inside source: true
 *** True Line Result
 
+** Processing line: ~    # Sets default values~
+- Inside source: true
+*** True Line Result
+    # Sets default values
+** Processing line: ~    def defaults~
+- Inside source: true
+*** True Line Result
+    def defaults
+** Processing line: ~      init_game~
+- Inside source: true
+*** True Line Result
+      init_game
+** Processing line: ~    end~
+- Inside source: true
+*** True Line Result
+    end
+** Processing line: ~~
+- Inside source: true
+*** True Line Result
+
 ** Processing line: ~    # Outputs objects onto the screen~
 - Inside source: true
 *** True Line Result
@@ -27123,10 +27259,18 @@ Follows is a source code listing for all files that have been open sourced. This
 - Inside source: true
 *** True Line Result
       else
+** Processing line: ~        # game over~
+- Inside source: true
+*** True Line Result
+        # game over
 ** Processing line: ~        s.as_hash.clear # otherwise clear the hash (no new platform is necessary)~
 - Inside source: true
 *** True Line Result
         s.as_hash.clear # otherwise clear the hash (no new platform is necessary)
+** Processing line: ~        init_game~
+- Inside source: true
+*** True Line Result
+        init_game
 ** Processing line: ~      end~
 - Inside source: true
 *** True Line Result
@@ -38011,14 +38155,10 @@ Follows is a source code listing for all files that have been open sourced. This
 - Inside source: true
 *** True Line Result
     def tick
-** Processing line: ~      state.current_turn ||= :x~
+** Processing line: ~      init_new_game~
 - Inside source: true
 *** True Line Result
-      state.current_turn ||= :x
-** Processing line: ~      state.space_combinations = [-1, 0, 1].product([-1, 0, 1]).to_a~
-- Inside source: true
-*** True Line Result
-      state.space_combinations = [-1, 0, 1].product([-1, 0, 1]).to_a
+      init_new_game
 ** Processing line: ~      render_board~
 - Inside source: true
 *** True Line Result
@@ -38035,6 +38175,54 @@ Follows is a source code listing for all files that have been open sourced. This
 - Inside source: true
 *** True Line Result
 
+** Processing line: ~    def init_new_game~
+- Inside source: true
+*** True Line Result
+    def init_new_game
+** Processing line: ~      state.current_turn       ||= :x~
+- Inside source: true
+*** True Line Result
+      state.current_turn       ||= :x
+** Processing line: ~      state.space_combinations ||= [-1, 0, 1].product([-1, 0, 1]).to_a~
+- Inside source: true
+*** True Line Result
+      state.space_combinations ||= [-1, 0, 1].product([-1, 0, 1]).to_a
+** Processing line: ~~
+- Inside source: true
+*** True Line Result
+
+** Processing line: ~      state.spaces             ||= {}~
+- Inside source: true
+*** True Line Result
+      state.spaces             ||= {}
+** Processing line: ~~
+- Inside source: true
+*** True Line Result
+
+** Processing line: ~      state.space_combinations.each do |x, y|~
+- Inside source: true
+*** True Line Result
+      state.space_combinations.each do |x, y|
+** Processing line: ~        state.spaces[x]    ||= {}~
+- Inside source: true
+*** True Line Result
+        state.spaces[x]    ||= {}
+** Processing line: ~        state.spaces[x][y] ||= state.new_entity(:space)~
+- Inside source: true
+*** True Line Result
+        state.spaces[x][y] ||= state.new_entity(:space)
+** Processing line: ~      end~
+- Inside source: true
+*** True Line Result
+      end
+** Processing line: ~    end~
+- Inside source: true
+*** True Line Result
+    end
+** Processing line: ~~
+- Inside source: true
+*** True Line Result
+
 ** Processing line: ~    # Uses borders to create grid squares for the game's board. Also outputs the game pieces using labels.~
 - Inside source: true
 *** True Line Result
@@ -38335,6 +38523,10 @@ Follows is a source code listing for all files that have been open sourced. This
 - Inside source: true
 *** True Line Result
       gtk.reset
+** Processing line: ~      init_new_game~
+- Inside source: true
+*** True Line Result
+      init_new_game
 ** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
@@ -39603,10 +39795,10 @@ Follows is a source code listing for all files that have been open sourced. This
 - Inside source: true
 *** True Line Result
       # Find all zombies that intersect with the player. They are considered killed.
-** Processing line: ~      killed_this_frame = state.zombies.find_all { |z| z.sprite.intersect_rect? state.player_sprite }~
+** Processing line: ~      killed_this_frame = state.zombies.find_all { |z| z.sprite && (z.sprite.intersect_rect? state.player_sprite) }~
 - Inside source: true
 *** True Line Result
-      killed_this_frame = state.zombies.find_all { |z| z.sprite.intersect_rect? state.player_sprite }
+      killed_this_frame = state.zombies.find_all { |z| z.sprite && (z.sprite.intersect_rect? state.player_sprite) }
 ** Processing line: ~      state.zombies = state.zombies - killed_this_frame # remove newly killed zombies from zombies collection~
 - Inside source: true
 *** True Line Result
@@ -43235,6 +43427,10 @@ Follows is a source code listing for all files that have been open sourced. This
 - Inside source: true
 *** True Line Result
   def playtime_str t
+** Processing line: ~    return "" unless t~
+- Inside source: true
+*** True Line Result
+    return "" unless t
 ** Processing line: ~    minutes = (t / 60.0).floor~
 - Inside source: true
 *** True Line Result
@@ -43683,10 +43879,10 @@ Follows is a source code listing for all files that have been open sourced. This
 - Inside source: true
 *** True Line Result
                                                 col:  2,
-** Processing line: ~                                                percentage: audio_entry.playtime / audio_entry.length_,~
+** Processing line: ~                                                percentage: (audio_entry.playtime || 1) / (audio_entry.length_ || 1),~
 - Inside source: true
 *** True Line Result
-                                                percentage: audio_entry.playtime / audio_entry.length_,
+                                                percentage: (audio_entry.playtime || 1) / (audio_entry.length_ || 1),
 ** Processing line: ~                                                text: "#{playtime_str(audio_entry.playtime)} / #{playtime_str(audio_entry.length_)}")~
 - Inside source: true
 *** True Line Result
@@ -44231,10 +44427,10 @@ Follows is a source code listing for all files that have been open sourced. This
 - Inside source: true
 *** True Line Result
       { name: :splash, path: "sounds/splash.wav" },
-** Processing line: ~      { name: :drum,   path: "sounds/drum.wav"   },~
+** Processing line: ~      { name: :drum,   path: "sounds/drum.mp3"   },~
 - Inside source: true
 *** True Line Result
-      { name: :drum,   path: "sounds/drum.wav"   },
+      { name: :drum,   path: "sounds/drum.mp3"   },
 ** Processing line: ~      { name: :spring, path: "sounds/spring.wav" },~
 - Inside source: true
 *** True Line Result
@@ -44487,70 +44683,6 @@ Follows is a source code listing for all files that have been open sourced. This
 - End of paragraph detected.
 *** True Line Result
 
-** Processing line: ~*** Advanced Audio - Audio Mixer - Metadata - ios_metadata.txt~
-- Header detected.
-*** True Line Result
-
-*** True Line Result
-*** Advanced Audio - Audio Mixer - Metadata - ios_metadata.txt
-** Processing line: ~#+begin_src ruby~
-- Line was identified as the beginning of a code block.
-*** True Line Result
-
-*** True Line Result
-#+begin_src ruby
-** Processing line: ~  # ./samples/07_advanced_audio/01_audio_mixer/metadata/ios_metadata.txt~
-- Inside source: true
-*** True Line Result
-  # ./samples/07_advanced_audio/01_audio_mixer/metadata/ios_metadata.txt
-** Processing line: ~  # ios_metadata.txt is used by the Pro version of DragonRuby Game Toolkit to create iOS apps.~
-- Inside source: true
-*** True Line Result
-  # ios_metadata.txt is used by the Pro version of DragonRuby Game Toolkit to create iOS apps.
-** Processing line: ~  # Information about the Pro version can be found at: http://dragonruby.org/toolkit/game#purchase~
-- Inside source: true
-*** True Line Result
-  # Information about the Pro version can be found at: http://dragonruby.org/toolkit/game#purchase
-** Processing line: ~~
-- Inside source: true
-*** True Line Result
-
-** Processing line: ~  # teamid needs to be set to your assigned Team Id which can be found at https://developer.apple.com/account/#/membership/~
-- Inside source: true
-*** True Line Result
-  # teamid needs to be set to your assigned Team Id which can be found at https://developer.apple.com/account/#/membership/
-** Processing line: ~  teamid=~
-- Inside source: true
-*** True Line Result
-  teamid=
-** Processing line: ~  # appid needs to be set to your application identifier which can be found at https://developer.apple.com/account/resources/identifiers/list~
-- Inside source: true
-*** True Line Result
-  # appid needs to be set to your application identifier which can be found at https://developer.apple.com/account/resources/identifiers/list
-** Processing line: ~  appid=~
-- Inside source: true
-*** True Line Result
-  appid=
-** Processing line: ~  # appname is the name you want to show up underneath the app icon on the device. Keep it under 10 characters.~
-- Inside source: true
-*** True Line Result
-  # appname is the name you want to show up underneath the app icon on the device. Keep it under 10 characters.
-** Processing line: ~  appname=~
-- Inside source: true
-*** True Line Result
-  appname=
-** Processing line: ~~
-- Inside source: true
-*** True Line Result
-
-** Processing line: ~#+end_src~
-- Line was identified as the end of a code block.
-*** True Line Result
-#+end_src
-** Processing line: ~~
-- End of paragraph detected.
-*** True Line Result
-
 ** Processing line: ~*** Advanced Audio - Sound Synthesis - main.rb~
 - Header detected.
 *** True Line Result
@@ -46951,6 +47083,542 @@ Follows is a source code listing for all files that have been open sourced. This
 - End of paragraph detected.
 *** True Line Result
 
+** Processing line: ~*** Advanced Rendering - Labels With Wrapped Text - main.rb~
+- Header detected.
+*** True Line Result
+
+*** True Line Result
+*** Advanced Rendering - Labels With Wrapped Text - main.rb
+** Processing line: ~#+begin_src ruby~
+- Line was identified as the beginning of a code block.
+*** True Line Result
+
+*** True Line Result
+#+begin_src ruby
+** Processing line: ~  # ./samples/07_advanced_rendering/00_labels_with_wrapped_text/app/main.rb~
+- Inside source: true
+*** True Line Result
+  # ./samples/07_advanced_rendering/00_labels_with_wrapped_text/app/main.rb
+** Processing line: ~  def tick args~
+- Inside source: true
+*** True Line Result
+  def tick args
+** Processing line: ~    # defaults~
+- Inside source: true
+*** True Line Result
+    # defaults
+** Processing line: ~    args.state.scroll_location  ||= 0~
+- Inside source: true
+*** True Line Result
+    args.state.scroll_location  ||= 0
+** Processing line: ~    args.state.textbox.messages ||= []~
+- Inside source: true
+*** True Line Result
+    args.state.textbox.messages ||= []
+** Processing line: ~    args.state.textbox.scroll   ||= 0~
+- Inside source: true
+*** True Line Result
+    args.state.textbox.scroll   ||= 0
+** Processing line: ~~
+- Inside source: true
+*** True Line Result
+
+** Processing line: ~    # render~
+- Inside source: true
+*** True Line Result
+    # render
+** Processing line: ~    args.outputs.background_color = [0, 0, 0, 255]~
+- Inside source: true
+*** True Line Result
+    args.outputs.background_color = [0, 0, 0, 255]
+** Processing line: ~    render_messages args~
+- Inside source: true
+*** True Line Result
+    render_messages args
+** Processing line: ~    render_instructions args~
+- Inside source: true
+*** True Line Result
+    render_instructions args
+** Processing line: ~~
+- Inside source: true
+*** True Line Result
+
+** Processing line: ~    # inputs~
+- Inside source: true
+*** True Line Result
+    # inputs
+** Processing line: ~    if args.inputs.keyboard.key_down.one~
+- Inside source: true
+*** True Line Result
+    if args.inputs.keyboard.key_down.one
+** Processing line: ~      queue_message args, "Hello there neighbour! my name is mark, how is your day today?"~
+- Inside source: true
+*** True Line Result
+      queue_message args, "Hello there neighbour! my name is mark, how is your day today?"
+** Processing line: ~    end~
+- Inside source: true
+*** True Line Result
+    end
+** Processing line: ~~
+- Inside source: true
+*** True Line Result
+
+** Processing line: ~    if args.inputs.keyboard.key_down.two~
+- Inside source: true
+*** True Line Result
+    if args.inputs.keyboard.key_down.two
+** Processing line: ~      queue_message args, "I'm doing great sir, actually I'm having a picnic today"~
+- Inside source: true
+*** True Line Result
+      queue_message args, "I'm doing great sir, actually I'm having a picnic today"
+** Processing line: ~    end~
+- Inside source: true
+*** True Line Result
+    end
+** Processing line: ~~
+- Inside source: true
+*** True Line Result
+
+** Processing line: ~    if args.inputs.keyboard.key_down.three~
+- Inside source: true
+*** True Line Result
+    if args.inputs.keyboard.key_down.three
+** Processing line: ~      queue_message args, "Well that sounds wonderful!"~
+- Inside source: true
+*** True Line Result
+      queue_message args, "Well that sounds wonderful!"
+** Processing line: ~    end~
+- Inside source: true
+*** True Line Result
+    end
+** Processing line: ~~
+- Inside source: true
+*** True Line Result
+
+** Processing line: ~    if args.inputs.keyboard.key_down.home~
+- Inside source: true
+*** True Line Result
+    if args.inputs.keyboard.key_down.home
+** Processing line: ~      args.state.scroll_location = 1~
+- Inside source: true
+*** True Line Result
+      args.state.scroll_location = 1
+** Processing line: ~    end~
+- Inside source: true
+*** True Line Result
+    end
+** Processing line: ~~
+- Inside source: true
+*** True Line Result
+
+** Processing line: ~    if args.inputs.keyboard.key_down.delete~
+- Inside source: true
+*** True Line Result
+    if args.inputs.keyboard.key_down.delete
+** Processing line: ~      clear_message_queue args~
+- Inside source: true
+*** True Line Result
+      clear_message_queue args
+** Processing line: ~    end~
+- Inside source: true
+*** True Line Result
+    end
+** Processing line: ~  end~
+- Inside source: true
+*** True Line Result
+  end
+** Processing line: ~~
+- Inside source: true
+*** True Line Result
+
+** Processing line: ~  def queue_message args, msg~
+- Inside source: true
+*** True Line Result
+  def queue_message args, msg
+** Processing line: ~    args.state.textbox.messages.concat msg.wrapped_lines 50~
+- Inside source: true
+*** True Line Result
+    args.state.textbox.messages.concat msg.wrapped_lines 50
+** Processing line: ~  end~
+- Inside source: true
+*** True Line Result
+  end
+** Processing line: ~~
+- Inside source: true
+*** True Line Result
+
+** Processing line: ~  def clear_message_queue args~
+- Inside source: true
+*** True Line Result
+  def clear_message_queue args
+** Processing line: ~    args.state.textbox.messages = nil~
+- Inside source: true
+*** True Line Result
+    args.state.textbox.messages = nil
+** Processing line: ~    args.state.textbox.scroll = 0~
+- Inside source: true
+*** True Line Result
+    args.state.textbox.scroll = 0
+** Processing line: ~  end~
+- Inside source: true
+*** True Line Result
+  end
+** Processing line: ~~
+- Inside source: true
+*** True Line Result
+
+** Processing line: ~  def render_messages args~
+- Inside source: true
+*** True Line Result
+  def render_messages args
+** Processing line: ~    args.outputs[:textbox].w = 400~
+- Inside source: true
+*** True Line Result
+    args.outputs[:textbox].w = 400
+** Processing line: ~    args.outputs[:textbox].h = 720~
+- Inside source: true
+*** True Line Result
+    args.outputs[:textbox].h = 720
+** Processing line: ~~
+- Inside source: true
+*** True Line Result
+
+** Processing line: ~    args.outputs.primitives << args.state.textbox.messages.each_with_index.map do |s, idx|~
+- Inside source: true
+*** True Line Result
+    args.outputs.primitives << args.state.textbox.messages.each_with_index.map do |s, idx|
+** Processing line: ~      {~
+- Inside source: true
+*** True Line Result
+      {
+** Processing line: ~        x: 0,~
+- Inside source: true
+*** True Line Result
+        x: 0,
+** Processing line: ~        y: 20 * (args.state.textbox.messages.size - idx) + args.state.textbox.scroll * 20,~
+- Inside source: true
+*** True Line Result
+        y: 20 * (args.state.textbox.messages.size - idx) + args.state.textbox.scroll * 20,
+** Processing line: ~        text: s,~
+- Inside source: true
+*** True Line Result
+        text: s,
+** Processing line: ~        size_enum: -3,~
+- Inside source: true
+*** True Line Result
+        size_enum: -3,
+** Processing line: ~        alignment_enum: 0,~
+- Inside source: true
+*** True Line Result
+        alignment_enum: 0,
+** Processing line: ~        r: 255, g:255, b: 255, a: 255~
+- Inside source: true
+*** True Line Result
+        r: 255, g:255, b: 255, a: 255
+** Processing line: ~      }~
+- Inside source: true
+*** True Line Result
+      }
+** Processing line: ~    end~
+- Inside source: true
+*** True Line Result
+    end
+** Processing line: ~~
+- Inside source: true
+*** True Line Result
+
+** Processing line: ~    args.outputs[:textbox].labels << args.state.textbox.messages.each_with_index.map do |s, idx|~
+- Inside source: true
+*** True Line Result
+    args.outputs[:textbox].labels << args.state.textbox.messages.each_with_index.map do |s, idx|
+** Processing line: ~      {~
+- Inside source: true
+*** True Line Result
+      {
+** Processing line: ~        x: 0,~
+- Inside source: true
+*** True Line Result
+        x: 0,
+** Processing line: ~        y: 20 * (args.state.textbox.messages.size - idx) + args.state.textbox.scroll * 20,~
+- Inside source: true
+*** True Line Result
+        y: 20 * (args.state.textbox.messages.size - idx) + args.state.textbox.scroll * 20,
+** Processing line: ~        text: s,~
+- Inside source: true
+*** True Line Result
+        text: s,
+** Processing line: ~        size_enum: -3,~
+- Inside source: true
+*** True Line Result
+        size_enum: -3,
+** Processing line: ~        alignment_enum: 0,~
+- Inside source: true
+*** True Line Result
+        alignment_enum: 0,
+** Processing line: ~        r: 255, g:255, b: 255, a: 255~
+- Inside source: true
+*** True Line Result
+        r: 255, g:255, b: 255, a: 255
+** Processing line: ~      }~
+- Inside source: true
+*** True Line Result
+      }
+** Processing line: ~    end~
+- Inside source: true
+*** True Line Result
+    end
+** Processing line: ~~
+- Inside source: true
+*** True Line Result
+
+** Processing line: ~    args.outputs[:textbox].borders << [0, 0, args.outputs[:textbox].w, 720]~
+- Inside source: true
+*** True Line Result
+    args.outputs[:textbox].borders << [0, 0, args.outputs[:textbox].w, 720]
+** Processing line: ~~
+- Inside source: true
+*** True Line Result
+
+** Processing line: ~    args.state.textbox.scroll += args.inputs.mouse.wheel.y unless args.inputs.mouse.wheel.nil?~
+- Inside source: true
+*** True Line Result
+    args.state.textbox.scroll += args.inputs.mouse.wheel.y unless args.inputs.mouse.wheel.nil?
+** Processing line: ~~
+- Inside source: true
+*** True Line Result
+
+** Processing line: ~    if args.state.scroll_location > 0~
+- Inside source: true
+*** True Line Result
+    if args.state.scroll_location > 0
+** Processing line: ~      args.state.textbox.scroll = 0~
+- Inside source: true
+*** True Line Result
+      args.state.textbox.scroll = 0
+** Processing line: ~      args.state.scroll_location = 0~
+- Inside source: true
+*** True Line Result
+      args.state.scroll_location = 0
+** Processing line: ~    end~
+- Inside source: true
+*** True Line Result
+    end
+** Processing line: ~~
+- Inside source: true
+*** True Line Result
+
+** Processing line: ~    args.outputs.sprites << [900, 0, args.outputs[:textbox].w, 720, :textbox]~
+- Inside source: true
+*** True Line Result
+    args.outputs.sprites << [900, 0, args.outputs[:textbox].w, 720, :textbox]
+** Processing line: ~  end~
+- Inside source: true
+*** True Line Result
+  end
+** Processing line: ~~
+- Inside source: true
+*** True Line Result
+
+** Processing line: ~  def render_instructions args~
+- Inside source: true
+*** True Line Result
+  def render_instructions args
+** Processing line: ~    args.outputs.labels << [30,~
+- Inside source: true
+*** True Line Result
+    args.outputs.labels << [30,
+** Processing line: ~                            30.from_top,~
+- Inside source: true
+*** True Line Result
+                            30.from_top,
+** Processing line: ~                            "press 1, 2, 3 to display messages, MOUSE WHEEL to scroll, HOME to go to top, BACKSPACE to delete.",~
+- Inside source: true
+*** True Line Result
+                            "press 1, 2, 3 to display messages, MOUSE WHEEL to scroll, HOME to go to top, BACKSPACE to delete.",
+** Processing line: ~                            0, 255, 255]~
+- Inside source: true
+*** True Line Result
+                            0, 255, 255]
+** Processing line: ~~
+- Inside source: true
+*** True Line Result
+
+** Processing line: ~    args.outputs.primitives << [0, 55.from_top, 1280, 30, :pixel, 0, 255, 0, 0, 0].sprite~
+- Inside source: true
+*** True Line Result
+    args.outputs.primitives << [0, 55.from_top, 1280, 30, :pixel, 0, 255, 0, 0, 0].sprite
+** Processing line: ~  end~
+- Inside source: true
+*** True Line Result
+  end
+** Processing line: ~~
+- Inside source: true
+*** True Line Result
+
+** Processing line: ~#+end_src~
+- Line was identified as the end of a code block.
+*** True Line Result
+#+end_src
+** Processing line: ~~
+- End of paragraph detected.
+*** True Line Result
+
+** Processing line: ~*** Advanced Rendering - Rotating Label - main.rb~
+- Header detected.
+*** True Line Result
+
+*** True Line Result
+*** Advanced Rendering - Rotating Label - main.rb
+** Processing line: ~#+begin_src ruby~
+- Line was identified as the beginning of a code block.
+*** True Line Result
+
+*** True Line Result
+#+begin_src ruby
+** Processing line: ~  # ./samples/07_advanced_rendering/00_rotating_label/app/main.rb~
+- Inside source: true
+*** True Line Result
+  # ./samples/07_advanced_rendering/00_rotating_label/app/main.rb
+** Processing line: ~  def tick args~
+- Inside source: true
+*** True Line Result
+  def tick args
+** Processing line: ~    # set the render target width and height to match the label~
+- Inside source: true
+*** True Line Result
+    # set the render target width and height to match the label
+** Processing line: ~    args.outputs[:scene].w = 220~
+- Inside source: true
+*** True Line Result
+    args.outputs[:scene].w = 220
+** Processing line: ~    args.outputs[:scene].h = 30~
+- Inside source: true
+*** True Line Result
+    args.outputs[:scene].h = 30
+** Processing line: ~~
+- Inside source: true
+*** True Line Result
+
+** Processing line: ~~
+- Inside source: true
+*** True Line Result
+
+** Processing line: ~    # make the background transparent~
+- Inside source: true
+*** True Line Result
+    # make the background transparent
+** Processing line: ~    args.outputs[:scene].background_color = [255, 255, 255, 0]~
+- Inside source: true
+*** True Line Result
+    args.outputs[:scene].background_color = [255, 255, 255, 0]
+** Processing line: ~~
+- Inside source: true
+*** True Line Result
+
+** Processing line: ~    # set the blendmode of the label to 0 (no blending)~
+- Inside source: true
+*** True Line Result
+    # set the blendmode of the label to 0 (no blending)
+** Processing line: ~    # center it inside of the scene~
+- Inside source: true
+*** True Line Result
+    # center it inside of the scene
+** Processing line: ~    # set the vertical_alignment_enum to 1 (center)~
+- Inside source: true
+*** True Line Result
+    # set the vertical_alignment_enum to 1 (center)
+** Processing line: ~    args.outputs[:scene].labels  << { x: 0,~
+- Inside source: true
+*** True Line Result
+    args.outputs[:scene].labels  << { x: 0,
+** Processing line: ~                                      y: 15,~
+- Inside source: true
+*** True Line Result
+                                      y: 15,
+** Processing line: ~                                      text: "label in render target",~
+- Inside source: true
+*** True Line Result
+                                      text: "label in render target",
+** Processing line: ~                                      blendmode_enum: 0,~
+- Inside source: true
+*** True Line Result
+                                      blendmode_enum: 0,
+** Processing line: ~                                      vertical_alignment_enum: 1 }~
+- Inside source: true
+*** True Line Result
+                                      vertical_alignment_enum: 1 }
+** Processing line: ~~
+- Inside source: true
+*** True Line Result
+
+** Processing line: ~    # add a border to the render target~
+- Inside source: true
+*** True Line Result
+    # add a border to the render target
+** Processing line: ~    args.outputs[:scene].borders << { x: 0,~
+- Inside source: true
+*** True Line Result
+    args.outputs[:scene].borders << { x: 0,
+** Processing line: ~                                      y: 0,~
+- Inside source: true
+*** True Line Result
+                                      y: 0,
+** Processing line: ~                                      w: args.outputs[:scene].w,~
+- Inside source: true
+*** True Line Result
+                                      w: args.outputs[:scene].w,
+** Processing line: ~                                      h: args.outputs[:scene].h }~
+- Inside source: true
+*** True Line Result
+                                      h: args.outputs[:scene].h }
+** Processing line: ~~
+- Inside source: true
+*** True Line Result
+
+** Processing line: ~    # add the rendertarget to the main output as a sprite~
+- Inside source: true
+*** True Line Result
+    # add the rendertarget to the main output as a sprite
+** Processing line: ~    args.outputs.sprites << { x: 640 - args.outputs[:scene].w.half,~
+- Inside source: true
+*** True Line Result
+    args.outputs.sprites << { x: 640 - args.outputs[:scene].w.half,
+** Processing line: ~                              y: 360 - args.outputs[:scene].h.half,~
+- Inside source: true
+*** True Line Result
+                              y: 360 - args.outputs[:scene].h.half,
+** Processing line: ~                              w: args.outputs[:scene].w,~
+- Inside source: true
+*** True Line Result
+                              w: args.outputs[:scene].w,
+** Processing line: ~                              h: args.outputs[:scene].h,~
+- Inside source: true
+*** True Line Result
+                              h: args.outputs[:scene].h,
+** Processing line: ~                              angle: args.state.tick_count,~
+- Inside source: true
+*** True Line Result
+                              angle: args.state.tick_count,
+** Processing line: ~                              path: :scene }~
+- Inside source: true
+*** True Line Result
+                              path: :scene }
+** Processing line: ~  end~
+- Inside source: true
+*** True Line Result
+  end
+** Processing line: ~~
+- Inside source: true
+*** True Line Result
+
+** Processing line: ~#+end_src~
+- Line was identified as the end of a code block.
+*** True Line Result
+#+end_src
+** Processing line: ~~
+- End of paragraph detected.
+*** True Line Result
+
 ** Processing line: ~*** Advanced Rendering - Simple Render Targets - main.rb~
 - Header detected.
 *** True Line Result
@@ -51995,6 +52663,10 @@ Follows is a source code listing for all files that have been open sourced. This
 - Inside source: true
 *** True Line Result
 
+** Processing line: ~~
+- Inside source: true
+*** True Line Result
+
 ** Processing line: ~    def new_room~
 - Inside source: true
 *** True Line Result
@@ -56503,42 +57175,102 @@ Follows is a source code listing for all files that have been open sourced. This
 - End of paragraph detected.
 *** True Line Result
 
-** Processing line: ~*** Performance - Sprites As Strict Entities - main.rb~
+** Processing line: ~*** Performance - Sprites As Struct - main.rb~
 - Header detected.
 *** True Line Result
 
 *** True Line Result
-*** Performance - Sprites As Strict Entities - main.rb
+*** Performance - Sprites As Struct - main.rb
 ** Processing line: ~#+begin_src ruby~
 - Line was identified as the beginning of a code block.
 *** True Line Result
 
 *** True Line Result
 #+begin_src ruby
-** Processing line: ~  # ./samples/09_performance/03_sprites_as_strict_entities/app/main.rb~
+** Processing line: ~  # ./samples/09_performance/03_sprites_as_struct/app/main.rb~
 - Inside source: true
 *** True Line Result
-  # ./samples/09_performance/03_sprites_as_strict_entities/app/main.rb
-** Processing line: ~  # Sprites represented as StrictEntities using the queue ~args.outputs.sprites~~
+  # ./samples/09_performance/03_sprites_as_struct/app/main.rb
+** Processing line: ~  # create a Struct variant that allows for named parameters on construction.~
 - Inside source: true
 *** True Line Result
-  # Sprites represented as StrictEntities using the queue ~args.outputs.sprites~
-** Processing line: ~  # yields apis access similar to Entities, but all properties that can be set on the~
+  # create a Struct variant that allows for named parameters on construction.
+** Processing line: ~  class NamedStruct < Struct~
 - Inside source: true
 *** True Line Result
-  # yields apis access similar to Entities, but all properties that can be set on the
-** Processing line: ~  # entity must be predefined with a default value. Strict entities do not support the~
+  class NamedStruct < Struct
+** Processing line: ~    def initialize **opts~
 - Inside source: true
 *** True Line Result
-  # entity must be predefined with a default value. Strict entities do not support the
-** Processing line: ~  # addition of new properties after the fact. They are more performant than OpenEntities~
+    def initialize **opts
+** Processing line: ~      super(*members.map { |k| opts[k] })~
 - Inside source: true
 *** True Line Result
-  # addition of new properties after the fact. They are more performant than OpenEntities
-** Processing line: ~  # because of this constraint.~
+      super(*members.map { |k| opts[k] })
+** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
-  # because of this constraint.
+    end
+** Processing line: ~  end~
+- Inside source: true
+*** True Line Result
+  end
+** Processing line: ~~
+- Inside source: true
+*** True Line Result
+
+** Processing line: ~  # create a Star NamedStruct~
+- Inside source: true
+*** True Line Result
+  # create a Star NamedStruct
+** Processing line: ~  Star = NamedStruct.new(:x, :y, :w, :h, :path, :s,~
+- Inside source: true
+*** True Line Result
+  Star = NamedStruct.new(:x, :y, :w, :h, :path, :s,
+** Processing line: ~                         :angle, :angle_anchor_x, :angle_anchor_y,~
+- Inside source: true
+*** True Line Result
+                         :angle, :angle_anchor_x, :angle_anchor_y,
+** Processing line: ~                         :r, :g, :b, :a,~
+- Inside source: true
+*** True Line Result
+                         :r, :g, :b, :a,
+** Processing line: ~                         :tile_x, :tile_y,~
+- Inside source: true
+*** True Line Result
+                         :tile_x, :tile_y,
+** Processing line: ~                         :tile_w, :tile_h,~
+- Inside source: true
+*** True Line Result
+                         :tile_w, :tile_h,
+** Processing line: ~                         :source_x, :source_y,~
+- Inside source: true
+*** True Line Result
+                         :source_x, :source_y,
+** Processing line: ~                         :source_w, :source_h,~
+- Inside source: true
+*** True Line Result
+                         :source_w, :source_h,
+** Processing line: ~                         :flip_horizontally, :flip_vertically,~
+- Inside source: true
+*** True Line Result
+                         :flip_horizontally, :flip_vertically,
+** Processing line: ~                         :blendmode_enum)~
+- Inside source: true
+*** True Line Result
+                         :blendmode_enum)
+** Processing line: ~~
+- Inside source: true
+*** True Line Result
+
+** Processing line: ~  # Sprites represented as Structs. They require a little bit more code than Hashes,~
+- Inside source: true
+*** True Line Result
+  # Sprites represented as Structs. They require a little bit more code than Hashes,
+** Processing line: ~  # but are the a little faster to render too.~
+- Inside source: true
+*** True Line Result
+  # but are the a little faster to render too.
 ** Processing line: ~  def random_x args~
 - Inside source: true
 *** True Line Result
@@ -56591,46 +57323,26 @@ Follows is a source code listing for all files that have been open sourced. This
 - Inside source: true
 *** True Line Result
   def new_star args
-** Processing line: ~    args.state.new_entity_strict(:star,~
+** Processing line: ~    Star.new x: (random_x args),~
 - Inside source: true
 *** True Line Result
-    args.state.new_entity_strict(:star,
-** Processing line: ~                                 x: (random_x args),~
+    Star.new x: (random_x args),
+** Processing line: ~             y: (random_y args),~
 - Inside source: true
 *** True Line Result
-                                 x: (random_x args),
-** Processing line: ~                                 y: (random_y args),~
+             y: (random_y args),
+** Processing line: ~             w: 4, h: 4,~
 - Inside source: true
 *** True Line Result
-                                 y: (random_y args),
-** Processing line: ~                                 w: 4, h: 4,~
+             w: 4, h: 4,
+** Processing line: ~             path: 'sprites/tiny-star.png',~
 - Inside source: true
 *** True Line Result
-                                 w: 4, h: 4,
-** Processing line: ~                                 path: 'sprites/tiny-star.png',~
+             path: 'sprites/tiny-star.png',
+** Processing line: ~             s: random_speed~
 - Inside source: true
 *** True Line Result
-                                 path: 'sprites/tiny-star.png',
-** Processing line: ~                                 s: random_speed) do |entity|~
-- Inside source: true
-*** True Line Result
-                                 s: random_speed) do |entity|
-** Processing line: ~      # invoke attr_sprite so that it responds to~
-- Inside source: true
-*** True Line Result
-      # invoke attr_sprite so that it responds to
-** Processing line: ~      # all properties that are required to render a sprite~
-- Inside source: true
-*** True Line Result
-      # all properties that are required to render a sprite
-** Processing line: ~      entity.attr_sprite~
-- Inside source: true
-*** True Line Result
-      entity.attr_sprite
-** Processing line: ~    end~
-- Inside source: true
-*** True Line Result
-    end
+             s: random_speed
 ** Processing line: ~  end~
 - Inside source: true
 *** True Line Result
@@ -56643,14 +57355,14 @@ Follows is a source code listing for all files that have been open sourced. This
 - Inside source: true
 *** True Line Result
   def move_star args, star
-** Processing line: ~    star.x += star.s~
+** Processing line: ~    star.x += star[:s]~
 - Inside source: true
 *** True Line Result
-    star.x += star.s
-** Processing line: ~    star.y += star.s~
+    star.x += star[:s]
+** Processing line: ~    star.y += star[:s]~
 - Inside source: true
 *** True Line Result
-    star.y += star.s
+    star.y += star[:s]
 ** Processing line: ~    if star.x > args.grid.w || star.y > args.grid.h~
 - Inside source: true
 *** True Line Result
@@ -56663,10 +57375,10 @@ Follows is a source code listing for all files that have been open sourced. This
 - Inside source: true
 *** True Line Result
       star.y = (random_y args)
-** Processing line: ~      star.s = random_speed~
+** Processing line: ~      star[:s] = random_speed~
 - Inside source: true
 *** True Line Result
-      star.s = random_speed
+      star[:s] = random_speed
 ** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
@@ -56711,10 +57423,10 @@ Follows is a source code listing for all files that have been open sourced. This
 - Inside source: true
 *** True Line Result
       puts "========================================================="
-** Processing line: ~      puts "* INFO: Sprites, Strict Entities"~
+** Processing line: ~      puts "* INFO: Sprites, Structs"~
 - Inside source: true
 *** True Line Result
-      puts "* INFO: Sprites, Strict Entities"
+      puts "* INFO: Sprites, Structs"
 ** Processing line: ~      puts "* INFO: Please specify the number of sprites to render."~
 - Inside source: true
 *** True Line Result
@@ -56819,106 +57531,170 @@ Follows is a source code listing for all files that have been open sourced. This
 - End of paragraph detected.
 *** True Line Result
 
-** Processing line: ~*** Performance - Sprites As Classes - main.rb~
+** Processing line: ~*** Performance - Sprites As Strict Entities - main.rb~
 - Header detected.
 *** True Line Result
 
 *** True Line Result
-*** Performance - Sprites As Classes - main.rb
+*** Performance - Sprites As Strict Entities - main.rb
 ** Processing line: ~#+begin_src ruby~
 - Line was identified as the beginning of a code block.
 *** True Line Result
 
 *** True Line Result
 #+begin_src ruby
-** Processing line: ~  # ./samples/09_performance/04_sprites_as_classes/app/main.rb~
+** Processing line: ~  # ./samples/09_performance/04_sprites_as_strict_entities/app/main.rb~
 - Inside source: true
 *** True Line Result
-  # ./samples/09_performance/04_sprites_as_classes/app/main.rb
-** Processing line: ~  # Sprites represented as Classes using the queue ~args.outputs.sprites~.~
+  # ./samples/09_performance/04_sprites_as_strict_entities/app/main.rb
+** Processing line: ~  # Sprites represented as StrictEntities using the queue ~args.outputs.sprites~~
 - Inside source: true
 *** True Line Result
-  # Sprites represented as Classes using the queue ~args.outputs.sprites~.
-** Processing line: ~  # gives you full control of property declaration and method invocation.~
+  # Sprites represented as StrictEntities using the queue ~args.outputs.sprites~
+** Processing line: ~  # yields apis access similar to Entities, but all properties that can be set on the~
 - Inside source: true
 *** True Line Result
-  # gives you full control of property declaration and method invocation.
-** Processing line: ~  # They are more performant than OpenEntities and StrictEntities, but more code upfront.~
+  # yields apis access similar to Entities, but all properties that can be set on the
+** Processing line: ~  # entity must be predefined with a default value. Strict entities do not support the~
 - Inside source: true
 *** True Line Result
-  # They are more performant than OpenEntities and StrictEntities, but more code upfront.
-** Processing line: ~  class Star~
+  # entity must be predefined with a default value. Strict entities do not support the
+** Processing line: ~  # addition of new properties after the fact. They are more performant than OpenEntities~
 - Inside source: true
 *** True Line Result
-  class Star
-** Processing line: ~    attr_sprite~
+  # addition of new properties after the fact. They are more performant than OpenEntities
+** Processing line: ~  # because of this constraint.~
 - Inside source: true
 *** True Line Result
-    attr_sprite
+  # because of this constraint.
+** Processing line: ~  def random_x args~
+- Inside source: true
+*** True Line Result
+  def random_x args
+** Processing line: ~    (args.grid.w.randomize :ratio) * -1~
+- Inside source: true
+*** True Line Result
+    (args.grid.w.randomize :ratio) * -1
+** Processing line: ~  end~
+- Inside source: true
+*** True Line Result
+  end
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~    def initialize grid~
+** Processing line: ~  def random_y args~
 - Inside source: true
 *** True Line Result
-    def initialize grid
-** Processing line: ~      @grid = grid~
+  def random_y args
+** Processing line: ~    (args.grid.h.randomize :ratio) * -1~
 - Inside source: true
 *** True Line Result
-      @grid = grid
-** Processing line: ~      @x = (rand @grid.w) * -1~
+    (args.grid.h.randomize :ratio) * -1
+** Processing line: ~  end~
 - Inside source: true
 *** True Line Result
-      @x = (rand @grid.w) * -1
-** Processing line: ~      @y = (rand @grid.h) * -1~
+  end
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-      @y = (rand @grid.h) * -1
-** Processing line: ~      @w    = 4~
+
+** Processing line: ~  def random_speed~
 - Inside source: true
 *** True Line Result
-      @w    = 4
-** Processing line: ~      @h    = 4~
+  def random_speed
+** Processing line: ~    1 + (4.randomize :ratio)~
 - Inside source: true
 *** True Line Result
-      @h    = 4
-** Processing line: ~      @s    = 1 + (4.randomize :ratio)~
+    1 + (4.randomize :ratio)
+** Processing line: ~  end~
 - Inside source: true
 *** True Line Result
-      @s    = 1 + (4.randomize :ratio)
-** Processing line: ~      @path = 'sprites/tiny-star.png'~
+  end
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-      @path = 'sprites/tiny-star.png'
+
+** Processing line: ~  def new_star args~
+- Inside source: true
+*** True Line Result
+  def new_star args
+** Processing line: ~    args.state.new_entity_strict(:star,~
+- Inside source: true
+*** True Line Result
+    args.state.new_entity_strict(:star,
+** Processing line: ~                                 x: (random_x args),~
+- Inside source: true
+*** True Line Result
+                                 x: (random_x args),
+** Processing line: ~                                 y: (random_y args),~
+- Inside source: true
+*** True Line Result
+                                 y: (random_y args),
+** Processing line: ~                                 w: 4, h: 4,~
+- Inside source: true
+*** True Line Result
+                                 w: 4, h: 4,
+** Processing line: ~                                 path: 'sprites/tiny-star.png',~
+- Inside source: true
+*** True Line Result
+                                 path: 'sprites/tiny-star.png',
+** Processing line: ~                                 s: random_speed) do |entity|~
+- Inside source: true
+*** True Line Result
+                                 s: random_speed) do |entity|
+** Processing line: ~      # invoke attr_sprite so that it responds to~
+- Inside source: true
+*** True Line Result
+      # invoke attr_sprite so that it responds to
+** Processing line: ~      # all properties that are required to render a sprite~
+- Inside source: true
+*** True Line Result
+      # all properties that are required to render a sprite
+** Processing line: ~      entity.attr_sprite~
+- Inside source: true
+*** True Line Result
+      entity.attr_sprite
 ** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
     end
+** Processing line: ~  end~
+- Inside source: true
+*** True Line Result
+  end
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~    def move~
+** Processing line: ~  def move_star args, star~
 - Inside source: true
 *** True Line Result
-    def move
-** Processing line: ~      @x += @s~
+  def move_star args, star
+** Processing line: ~    star.x += star.s~
 - Inside source: true
 *** True Line Result
-      @x += @s
-** Processing line: ~      @y += @s~
+    star.x += star.s
+** Processing line: ~    star.y += star.s~
 - Inside source: true
 *** True Line Result
-      @y += @s
-** Processing line: ~      @x = (rand @grid.w) * -1 if @x > @grid.right~
+    star.y += star.s
+** Processing line: ~    if star.x > args.grid.w || star.y > args.grid.h~
 - Inside source: true
 *** True Line Result
-      @x = (rand @grid.w) * -1 if @x > @grid.right
-** Processing line: ~      @y = (rand @grid.h) * -1 if @y > @grid.top~
+    if star.x > args.grid.w || star.y > args.grid.h
+** Processing line: ~      star.x = (random_x args)~
 - Inside source: true
 *** True Line Result
-      @y = (rand @grid.h) * -1 if @y > @grid.top
+      star.x = (random_x args)
+** Processing line: ~      star.y = (random_y args)~
+- Inside source: true
+*** True Line Result
+      star.y = (random_y args)
+** Processing line: ~      star.s = random_speed~
+- Inside source: true
+*** True Line Result
+      star.s = random_speed
 ** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
@@ -56931,14 +57707,18 @@ Follows is a source code listing for all files that have been open sourced. This
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~  # calls methods needed for game to run properly~
-- Inside source: true
-*** True Line Result
-  # calls methods needed for game to run properly
 ** Processing line: ~  def tick args~
 - Inside source: true
 *** True Line Result
   def tick args
+** Processing line: ~    args.state.star_count ||= 0~
+- Inside source: true
+*** True Line Result
+    args.state.star_count ||= 0
+** Processing line: ~~
+- Inside source: true
+*** True Line Result
+
 ** Processing line: ~    # sets console command when sample app initially opens~
 - Inside source: true
 *** True Line Result
@@ -56959,10 +57739,10 @@ Follows is a source code listing for all files that have been open sourced. This
 - Inside source: true
 *** True Line Result
       puts "========================================================="
-** Processing line: ~      puts "* INFO: Sprites, Classes"~
+** Processing line: ~      puts "* INFO: Sprites, Strict Entities"~
 - Inside source: true
 *** True Line Result
-      puts "* INFO: Sprites, Classes"
+      puts "* INFO: Sprites, Strict Entities"
 ** Processing line: ~      puts "* INFO: Please specify the number of sprites to render."~
 - Inside source: true
 *** True Line Result
@@ -56987,10 +57767,10 @@ Follows is a source code listing for all files that have been open sourced. This
 - Inside source: true
 *** True Line Result
     if args.state.tick_count == 0
-** Processing line: ~      args.state.stars = args.state.star_count.map { |i| Star.new args.grid }~
+** Processing line: ~      args.state.stars = args.state.star_count.map { |i| new_star args }~
 - Inside source: true
 *** True Line Result
-      args.state.stars = args.state.star_count.map { |i| Star.new args.grid }
+      args.state.stars = args.state.star_count.map { |i| new_star args }
 ** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
@@ -57003,10 +57783,258 @@ Follows is a source code listing for all files that have been open sourced. This
 - Inside source: true
 *** True Line Result
     # update
-** Processing line: ~    args.state.stars.each(&:move)~
+** Processing line: ~    args.state.stars.each { |s| move_star args, s }~
 - Inside source: true
 *** True Line Result
-    args.state.stars.each(&:move)
+    args.state.stars.each { |s| move_star args, s }
+** Processing line: ~~
+- Inside source: true
+*** True Line Result
+
+** Processing line: ~    # render~
+- Inside source: true
+*** True Line Result
+    # render
+** Processing line: ~    args.outputs.sprites << args.state.stars~
+- Inside source: true
+*** True Line Result
+    args.outputs.sprites << args.state.stars
+** Processing line: ~    args.outputs.background_color = [0, 0, 0]~
+- Inside source: true
+*** True Line Result
+    args.outputs.background_color = [0, 0, 0]
+** Processing line: ~    args.outputs.primitives << args.gtk.current_framerate_primitives~
+- Inside source: true
+*** True Line Result
+    args.outputs.primitives << args.gtk.current_framerate_primitives
+** Processing line: ~  end~
+- Inside source: true
+*** True Line Result
+  end
+** Processing line: ~~
+- Inside source: true
+*** True Line Result
+
+** Processing line: ~  # resets game, and assigns star count given by user~
+- Inside source: true
+*** True Line Result
+  # resets game, and assigns star count given by user
+** Processing line: ~  def reset_with count: count~
+- Inside source: true
+*** True Line Result
+  def reset_with count: count
+** Processing line: ~    $gtk.reset~
+- Inside source: true
+*** True Line Result
+    $gtk.reset
+** Processing line: ~    $gtk.args.state.star_count = count~
+- Inside source: true
+*** True Line Result
+    $gtk.args.state.star_count = count
+** Processing line: ~  end~
+- Inside source: true
+*** True Line Result
+  end
+** Processing line: ~~
+- Inside source: true
+*** True Line Result
+
+** Processing line: ~#+end_src~
+- Line was identified as the end of a code block.
+*** True Line Result
+#+end_src
+** Processing line: ~~
+- End of paragraph detected.
+*** True Line Result
+
+** Processing line: ~*** Performance - Sprites As Classes - main.rb~
+- Header detected.
+*** True Line Result
+
+*** True Line Result
+*** Performance - Sprites As Classes - main.rb
+** Processing line: ~#+begin_src ruby~
+- Line was identified as the beginning of a code block.
+*** True Line Result
+
+*** True Line Result
+#+begin_src ruby
+** Processing line: ~  # ./samples/09_performance/05_sprites_as_classes/app/main.rb~
+- Inside source: true
+*** True Line Result
+  # ./samples/09_performance/05_sprites_as_classes/app/main.rb
+** Processing line: ~  # Sprites represented as Classes using the queue ~args.outputs.sprites~.~
+- Inside source: true
+*** True Line Result
+  # Sprites represented as Classes using the queue ~args.outputs.sprites~.
+** Processing line: ~  # gives you full control of property declaration and method invocation.~
+- Inside source: true
+*** True Line Result
+  # gives you full control of property declaration and method invocation.
+** Processing line: ~  # They are more performant than OpenEntities and StrictEntities, but more code upfront.~
+- Inside source: true
+*** True Line Result
+  # They are more performant than OpenEntities and StrictEntities, but more code upfront.
+** Processing line: ~  class Star~
+- Inside source: true
+*** True Line Result
+  class Star
+** Processing line: ~    attr_sprite~
+- Inside source: true
+*** True Line Result
+    attr_sprite
+** Processing line: ~~
+- Inside source: true
+*** True Line Result
+
+** Processing line: ~    def initialize grid~
+- Inside source: true
+*** True Line Result
+    def initialize grid
+** Processing line: ~      @grid = grid~
+- Inside source: true
+*** True Line Result
+      @grid = grid
+** Processing line: ~      @x = (rand @grid.w) * -1~
+- Inside source: true
+*** True Line Result
+      @x = (rand @grid.w) * -1
+** Processing line: ~      @y = (rand @grid.h) * -1~
+- Inside source: true
+*** True Line Result
+      @y = (rand @grid.h) * -1
+** Processing line: ~      @w    = 4~
+- Inside source: true
+*** True Line Result
+      @w    = 4
+** Processing line: ~      @h    = 4~
+- Inside source: true
+*** True Line Result
+      @h    = 4
+** Processing line: ~      @s    = 1 + (4.randomize :ratio)~
+- Inside source: true
+*** True Line Result
+      @s    = 1 + (4.randomize :ratio)
+** Processing line: ~      @path = 'sprites/tiny-star.png'~
+- Inside source: true
+*** True Line Result
+      @path = 'sprites/tiny-star.png'
+** Processing line: ~    end~
+- Inside source: true
+*** True Line Result
+    end
+** Processing line: ~~
+- Inside source: true
+*** True Line Result
+
+** Processing line: ~    def move~
+- Inside source: true
+*** True Line Result
+    def move
+** Processing line: ~      @x += @s~
+- Inside source: true
+*** True Line Result
+      @x += @s
+** Processing line: ~      @y += @s~
+- Inside source: true
+*** True Line Result
+      @y += @s
+** Processing line: ~      @x = (rand @grid.w) * -1 if @x > @grid.right~
+- Inside source: true
+*** True Line Result
+      @x = (rand @grid.w) * -1 if @x > @grid.right
+** Processing line: ~      @y = (rand @grid.h) * -1 if @y > @grid.top~
+- Inside source: true
+*** True Line Result
+      @y = (rand @grid.h) * -1 if @y > @grid.top
+** Processing line: ~    end~
+- Inside source: true
+*** True Line Result
+    end
+** Processing line: ~  end~
+- Inside source: true
+*** True Line Result
+  end
+** Processing line: ~~
+- Inside source: true
+*** True Line Result
+
+** Processing line: ~  # calls methods needed for game to run properly~
+- Inside source: true
+*** True Line Result
+  # calls methods needed for game to run properly
+** Processing line: ~  def tick args~
+- Inside source: true
+*** True Line Result
+  def tick args
+** Processing line: ~    # sets console command when sample app initially opens~
+- Inside source: true
+*** True Line Result
+    # sets console command when sample app initially opens
+** Processing line: ~    if Kernel.global_tick_count == 0~
+- Inside source: true
+*** True Line Result
+    if Kernel.global_tick_count == 0
+** Processing line: ~      puts ""~
+- Inside source: true
+*** True Line Result
+      puts ""
+** Processing line: ~      puts ""~
+- Inside source: true
+*** True Line Result
+      puts ""
+** Processing line: ~      puts "========================================================="~
+- Inside source: true
+*** True Line Result
+      puts "========================================================="
+** Processing line: ~      puts "* INFO: Sprites, Classes"~
+- Inside source: true
+*** True Line Result
+      puts "* INFO: Sprites, Classes"
+** Processing line: ~      puts "* INFO: Please specify the number of sprites to render."~
+- Inside source: true
+*** True Line Result
+      puts "* INFO: Please specify the number of sprites to render."
+** Processing line: ~      args.gtk.console.set_command "reset_with count: 100"~
+- Inside source: true
+*** True Line Result
+      args.gtk.console.set_command "reset_with count: 100"
+** Processing line: ~    end~
+- Inside source: true
+*** True Line Result
+    end
+** Processing line: ~~
+- Inside source: true
+*** True Line Result
+
+** Processing line: ~    # init~
+- Inside source: true
+*** True Line Result
+    # init
+** Processing line: ~    if args.state.tick_count == 0~
+- Inside source: true
+*** True Line Result
+    if args.state.tick_count == 0
+** Processing line: ~      args.state.stars = args.state.star_count.map { |i| Star.new args.grid }~
+- Inside source: true
+*** True Line Result
+      args.state.stars = args.state.star_count.map { |i| Star.new args.grid }
+** Processing line: ~    end~
+- Inside source: true
+*** True Line Result
+    end
+** Processing line: ~~
+- Inside source: true
+*** True Line Result
+
+** Processing line: ~    # update~
+- Inside source: true
+*** True Line Result
+    # update
+** Processing line: ~    args.state.stars.each(&:move)~
+- Inside source: true
+*** True Line Result
+    args.state.stars.each(&:move)
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
@@ -57079,10 +58107,10 @@ Follows is a source code listing for all files that have been open sourced. This
 
 *** True Line Result
 #+begin_src ruby
-** Processing line: ~  # ./samples/09_performance/05_static_sprites_as_classes/app/main.rb~
+** Processing line: ~  # ./samples/09_performance/06_static_sprites_as_classes/app/main.rb~
 - Inside source: true
 *** True Line Result
-  # ./samples/09_performance/05_static_sprites_as_classes/app/main.rb
+  # ./samples/09_performance/06_static_sprites_as_classes/app/main.rb
 ** Processing line: ~  # Sprites represented as Classes using the queue ~args.outputs.static_sprites~.~
 - Inside source: true
 *** True Line Result
@@ -57331,10 +58359,10 @@ Follows is a source code listing for all files that have been open sourced. This
 
 *** True Line Result
 #+begin_src ruby
-** Processing line: ~  # ./samples/09_performance/06_static_sprites_as_classes_with_custom_drawing/app/main.rb~
+** Processing line: ~  # ./samples/09_performance/07_static_sprites_as_classes_with_custom_drawing/app/main.rb~
 - Inside source: true
 *** True Line Result
-  # ./samples/09_performance/06_static_sprites_as_classes_with_custom_drawing/app/main.rb
+  # ./samples/09_performance/07_static_sprites_as_classes_with_custom_drawing/app/main.rb
 ** Processing line: ~  # Sprites represented as Classes, with a draw_override method, and using the queue ~args.outputs.static_sprites~.~
 - Inside source: true
 *** True Line Result
@@ -57711,10 +58739,10 @@ Follows is a source code listing for all files that have been open sourced. This
 
 *** True Line Result
 #+begin_src ruby
-** Processing line: ~  # ./samples/09_performance/07_collision_limits/app/main.rb~
+** Processing line: ~  # ./samples/09_performance/08_collision_limits/app/main.rb~
 - Inside source: true
 *** True Line Result
-  # ./samples/09_performance/07_collision_limits/app/main.rb
+  # ./samples/09_performance/08_collision_limits/app/main.rb
 ** Processing line: ~  =begin~
 - Inside source: true
 *** True Line Result
@@ -57947,6 +58975,110 @@ Follows is a source code listing for all files that have been open sourced. This
 - End of paragraph detected.
 *** True Line Result
 
+** Processing line: ~*** Advanced Debugging - Logging - main.rb~
+- Header detected.
+*** True Line Result
+
+*** True Line Result
+*** Advanced Debugging - Logging - main.rb
+** Processing line: ~#+begin_src ruby~
+- Line was identified as the beginning of a code block.
+*** True Line Result
+
+*** True Line Result
+#+begin_src ruby
+** Processing line: ~  # ./samples/10_advanced_debugging/00_logging/app/main.rb~
+- Inside source: true
+*** True Line Result
+  # ./samples/10_advanced_debugging/00_logging/app/main.rb
+** Processing line: ~  def tick args~
+- Inside source: true
+*** True Line Result
+  def tick args
+** Processing line: ~    args.outputs.background_color = [255, 255, 255, 0]~
+- Inside source: true
+*** True Line Result
+    args.outputs.background_color = [255, 255, 255, 0]
+** Processing line: ~    if args.state.tick_count == 0~
+- Inside source: true
+*** True Line Result
+    if args.state.tick_count == 0
+** Processing line: ~      args.gtk.log_spam "log level spam"~
+- Inside source: true
+*** True Line Result
+      args.gtk.log_spam "log level spam"
+** Processing line: ~      args.gtk.log_debug "log level debug"~
+- Inside source: true
+*** True Line Result
+      args.gtk.log_debug "log level debug"
+** Processing line: ~      args.gtk.log_info "log level info"~
+- Inside source: true
+*** True Line Result
+      args.gtk.log_info "log level info"
+** Processing line: ~      args.gtk.log_warn "log level warn"~
+- Inside source: true
+*** True Line Result
+      args.gtk.log_warn "log level warn"
+** Processing line: ~      args.gtk.log_error "log level error"~
+- Inside source: true
+*** True Line Result
+      args.gtk.log_error "log level error"
+** Processing line: ~      args.gtk.log_unfiltered "log level unfiltered"~
+- Inside source: true
+*** True Line Result
+      args.gtk.log_unfiltered "log level unfiltered"
+** Processing line: ~      puts "This is a puts call"~
+- Inside source: true
+*** True Line Result
+      puts "This is a puts call"
+** Processing line: ~      args.gtk.console.show~
+- Inside source: true
+*** True Line Result
+      args.gtk.console.show
+** Processing line: ~    end~
+- Inside source: true
+*** True Line Result
+    end
+** Processing line: ~~
+- Inside source: true
+*** True Line Result
+
+** Processing line: ~    if args.state.tick_count == 60~
+- Inside source: true
+*** True Line Result
+    if args.state.tick_count == 60
+** Processing line: ~      puts "This is a puts call on tick 60"~
+- Inside source: true
+*** True Line Result
+      puts "This is a puts call on tick 60"
+** Processing line: ~    elsif args.state.tick_count == 120~
+- Inside source: true
+*** True Line Result
+    elsif args.state.tick_count == 120
+** Processing line: ~      puts "This is a puts call on tick 120"~
+- Inside source: true
+*** True Line Result
+      puts "This is a puts call on tick 120"
+** Processing line: ~    end~
+- Inside source: true
+*** True Line Result
+    end
+** Processing line: ~  end~
+- Inside source: true
+*** True Line Result
+  end
+** Processing line: ~~
+- Inside source: true
+*** True Line Result
+
+** Processing line: ~#+end_src~
+- Line was identified as the end of a code block.
+*** True Line Result
+#+end_src
+** Processing line: ~~
+- End of paragraph detected.
+*** True Line Result
+
 ** Processing line: ~*** Advanced Debugging - Trace Debugging - main.rb~
 - Header detected.
 *** True Line Result
@@ -62527,6 +63659,14 @@ Follows is a source code listing for all files that have been open sourced. This
 - Inside source: true
 *** True Line Result
   # ./samples/11_http/01_retrieve_images/app/main.rb
+** Processing line: ~  $gtk.register_cvar 'app.warn_seconds', "seconds to wait before starting", :uint, 11~
+- Inside source: true
+*** True Line Result
+  $gtk.register_cvar 'app.warn_seconds', "seconds to wait before starting", :uint, 11
+** Processing line: ~~
+- Inside source: true
+*** True Line Result
+
 ** Processing line: ~  def tick args~
 - Inside source: true
 *** True Line Result
@@ -62543,10 +63683,10 @@ Follows is a source code listing for all files that have been open sourced. This
 - Inside source: true
 *** True Line Result
     # Show a warning at the start.
-** Processing line: ~    args.state.warning_debounce ||= 11 * 60~
+** Processing line: ~    args.state.warning_debounce ||= args.cvars['app.warn_seconds'].value * 60~
 - Inside source: true
 *** True Line Result
-    args.state.warning_debounce ||= 11 * 60
+    args.state.warning_debounce ||= args.cvars['app.warn_seconds'].value * 60
 ** Processing line: ~    if args.state.warning_debounce > 0~
 - Inside source: true
 *** True Line Result
@@ -62751,22 +63891,22 @@ Follows is a source code listing for all files that have been open sourced. This
 - End of paragraph detected.
 *** True Line Result
 
-** Processing line: ~*** Http - Web Server - main.rb~
+** Processing line: ~*** Http - In Game Web Server Http Get - main.rb~
 - Header detected.
 *** True Line Result
 
 *** True Line Result
-*** Http - Web Server - main.rb
+*** Http - In Game Web Server Http Get - main.rb
 ** Processing line: ~#+begin_src ruby~
 - Line was identified as the beginning of a code block.
 *** True Line Result
 
 *** True Line Result
 #+begin_src ruby
-** Processing line: ~  # ./samples/11_http/02_web_server/app/main.rb~
+** Processing line: ~  # ./samples/11_http/02_in_game_web_server_http_get/app/main.rb~
 - Inside source: true
 *** True Line Result
-  # ./samples/11_http/02_web_server/app/main.rb
+  # ./samples/11_http/02_in_game_web_server_http_get/app/main.rb
 ** Processing line: ~  def tick args~
 - Inside source: true
 *** True Line Result
@@ -62775,6 +63915,10 @@ Follows is a source code listing for all files that have been open sourced. This
 - Inside source: true
 *** True Line Result
     args.state.port ||= 3000
+** Processing line: ~    args.state.reqnum ||= 0~
+- Inside source: true
+*** True Line Result
+    args.state.reqnum ||= 0
 ** Processing line: ~    # by default the embedded webserver runs on port 9001 (the port number is over 9000) and is disabled in a production build~
 - Inside source: true
 *** True Line Result
@@ -62887,6 +64031,322 @@ Follows is a source code listing for all files that have been open sourced. This
 - End of paragraph detected.
 *** True Line Result
 
+** Processing line: ~*** Http - In Game Web Server Http Post - main.rb~
+- Header detected.
+*** True Line Result
+
+*** True Line Result
+*** Http - In Game Web Server Http Post - main.rb
+** Processing line: ~#+begin_src ruby~
+- Line was identified as the beginning of a code block.
+*** True Line Result
+
+*** True Line Result
+#+begin_src ruby
+** Processing line: ~  # ./samples/11_http/03_in_game_web_server_http_post/app/main.rb~
+- Inside source: true
+*** True Line Result
+  # ./samples/11_http/03_in_game_web_server_http_post/app/main.rb
+** Processing line: ~  def tick args~
+- Inside source: true
+*** True Line Result
+  def tick args
+** Processing line: ~    # defaults~
+- Inside source: true
+*** True Line Result
+    # defaults
+** Processing line: ~    args.state.post_button      = args.layout.rect(row: 0, col: 0, w: 5, h: 1).merge(text: "execute http_post")~
+- Inside source: true
+*** True Line Result
+    args.state.post_button      = args.layout.rect(row: 0, col: 0, w: 5, h: 1).merge(text: "execute http_post")
+** Processing line: ~    args.state.post_body_button = args.layout.rect(row: 1, col: 0, w: 5, h: 1).merge(text: "execute http_post_body")~
+- Inside source: true
+*** True Line Result
+    args.state.post_body_button = args.layout.rect(row: 1, col: 0, w: 5, h: 1).merge(text: "execute http_post_body")
+** Processing line: ~    args.state.request_to_s ||= ""~
+- Inside source: true
+*** True Line Result
+    args.state.request_to_s ||= ""
+** Processing line: ~    args.state.request_body ||= ""~
+- Inside source: true
+*** True Line Result
+    args.state.request_body ||= ""
+** Processing line: ~~
+- Inside source: true
+*** True Line Result
+
+** Processing line: ~    # render~
+- Inside source: true
+*** True Line Result
+    # render
+** Processing line: ~    args.state.post_button.yield_self do |b|~
+- Inside source: true
+*** True Line Result
+    args.state.post_button.yield_self do |b|
+** Processing line: ~      args.outputs.borders << b~
+- Inside source: true
+*** True Line Result
+      args.outputs.borders << b
+** Processing line: ~      args.outputs.labels  << b.merge(text: b.text,~
+- Inside source: true
+*** True Line Result
+      args.outputs.labels  << b.merge(text: b.text,
+** Processing line: ~                                      y:    b.y + 30,~
+- Inside source: true
+*** True Line Result
+                                      y:    b.y + 30,
+** Processing line: ~                                      x:    b.x + 10)~
+- Inside source: true
+*** True Line Result
+                                      x:    b.x + 10)
+** Processing line: ~    end~
+- Inside source: true
+*** True Line Result
+    end
+** Processing line: ~~
+- Inside source: true
+*** True Line Result
+
+** Processing line: ~    args.state.post_body_button.yield_self do |b|~
+- Inside source: true
+*** True Line Result
+    args.state.post_body_button.yield_self do |b|
+** Processing line: ~      args.outputs.borders << b~
+- Inside source: true
+*** True Line Result
+      args.outputs.borders << b
+** Processing line: ~      args.outputs.labels  << b.merge(text: b.text,~
+- Inside source: true
+*** True Line Result
+      args.outputs.labels  << b.merge(text: b.text,
+** Processing line: ~                                      y:    b.y + 30,~
+- Inside source: true
+*** True Line Result
+                                      y:    b.y + 30,
+** Processing line: ~                                      x:    b.x + 10)~
+- Inside source: true
+*** True Line Result
+                                      x:    b.x + 10)
+** Processing line: ~    end~
+- Inside source: true
+*** True Line Result
+    end
+** Processing line: ~~
+- Inside source: true
+*** True Line Result
+
+** Processing line: ~    draw_label args, 0,  6, "Request:", args.state.request_to_s~
+- Inside source: true
+*** True Line Result
+    draw_label args, 0,  6, "Request:", args.state.request_to_s
+** Processing line: ~    draw_label args, 0, 14, "Request Body Unaltered:", args.state.request_body~
+- Inside source: true
+*** True Line Result
+    draw_label args, 0, 14, "Request Body Unaltered:", args.state.request_body
+** Processing line: ~~
+- Inside source: true
+*** True Line Result
+
+** Processing line: ~    # input~
+- Inside source: true
+*** True Line Result
+    # input
+** Processing line: ~    if args.inputs.mouse.click~
+- Inside source: true
+*** True Line Result
+    if args.inputs.mouse.click
+** Processing line: ~      # ============= HTTP_POST =============~
+- Inside source: true
+*** True Line Result
+      # ============= HTTP_POST =============
+** Processing line: ~      if (args.inputs.mouse.inside_rect? args.state.post_button)~
+- Inside source: true
+*** True Line Result
+      if (args.inputs.mouse.inside_rect? args.state.post_button)
+** Processing line: ~        # ========= DATA TO SEND ===========~
+- Inside source: true
+*** True Line Result
+        # ========= DATA TO SEND ===========
+** Processing line: ~        form_fields = { "userId" => "#{Time.now.to_i}" }~
+- Inside source: true
+*** True Line Result
+        form_fields = { "userId" => "#{Time.now.to_i}" }
+** Processing line: ~        # ==================================~
+- Inside source: true
+*** True Line Result
+        # ==================================
+** Processing line: ~~
+- Inside source: true
+*** True Line Result
+
+** Processing line: ~        args.gtk.http_post "http://localhost:9001/testing",~
+- Inside source: true
+*** True Line Result
+        args.gtk.http_post "http://localhost:9001/testing",
+** Processing line: ~                           form_fields,~
+- Inside source: true
+*** True Line Result
+                           form_fields,
+** Processing line: ~                           ["Content-Type: application/x-www-form-urlencoded"]~
+- Inside source: true
+*** True Line Result
+                           ["Content-Type: application/x-www-form-urlencoded"]
+** Processing line: ~~
+- Inside source: true
+*** True Line Result
+
+** Processing line: ~        args.gtk.notify! "http_post"~
+- Inside source: true
+*** True Line Result
+        args.gtk.notify! "http_post"
+** Processing line: ~      end~
+- Inside source: true
+*** True Line Result
+      end
+** Processing line: ~~
+- Inside source: true
+*** True Line Result
+
+** Processing line: ~      # ============= HTTP_POST_BODY =============~
+- Inside source: true
+*** True Line Result
+      # ============= HTTP_POST_BODY =============
+** Processing line: ~      if (args.inputs.mouse.inside_rect? args.state.post_body_button)~
+- Inside source: true
+*** True Line Result
+      if (args.inputs.mouse.inside_rect? args.state.post_body_button)
+** Processing line: ~        # =========== DATA TO SEND ==============~
+- Inside source: true
+*** True Line Result
+        # =========== DATA TO SEND ==============
+** Processing line: ~        json = "{ \"userId\": \"#{Time.now.to_i}\"}"~
+- Inside source: true
+*** True Line Result
+        json = "{ \"userId\": \"#{Time.now.to_i}\"}"
+** Processing line: ~        # ==================================~
+- Inside source: true
+*** True Line Result
+        # ==================================
+** Processing line: ~~
+- Inside source: true
+*** True Line Result
+
+** Processing line: ~        args.gtk.http_post_body "http://localhost:9001/testing",~
+- Inside source: true
+*** True Line Result
+        args.gtk.http_post_body "http://localhost:9001/testing",
+** Processing line: ~                                json,~
+- Inside source: true
+*** True Line Result
+                                json,
+** Processing line: ~                                ["Content-Type: application/json", "Content-Length: #{json.length}"]~
+- Inside source: true
+*** True Line Result
+                                ["Content-Type: application/json", "Content-Length: #{json.length}"]
+** Processing line: ~~
+- Inside source: true
+*** True Line Result
+
+** Processing line: ~        args.gtk.notify! "http_post_body"~
+- Inside source: true
+*** True Line Result
+        args.gtk.notify! "http_post_body"
+** Processing line: ~      end~
+- Inside source: true
+*** True Line Result
+      end
+** Processing line: ~    end~
+- Inside source: true
+*** True Line Result
+    end
+** Processing line: ~~
+- Inside source: true
+*** True Line Result
+
+** Processing line: ~    # calc~
+- Inside source: true
+*** True Line Result
+    # calc
+** Processing line: ~    args.inputs.http_requests.each do |r|~
+- Inside source: true
+*** True Line Result
+    args.inputs.http_requests.each do |r|
+** Processing line: ~      puts "#{r}"~
+- Inside source: true
+*** True Line Result
+      puts "#{r}"
+** Processing line: ~      if r.uri == "/testing"~
+- Inside source: true
+*** True Line Result
+      if r.uri == "/testing"
+** Processing line: ~        puts r~
+- Inside source: true
+*** True Line Result
+        puts r
+** Processing line: ~        args.state.request_to_s = "#{r}"~
+- Inside source: true
+*** True Line Result
+        args.state.request_to_s = "#{r}"
+** Processing line: ~        args.state.request_body = r.raw_body~
+- Inside source: true
+*** True Line Result
+        args.state.request_body = r.raw_body
+** Processing line: ~        r.respond 200, "ok"~
+- Inside source: true
+*** True Line Result
+        r.respond 200, "ok"
+** Processing line: ~      end~
+- Inside source: true
+*** True Line Result
+      end
+** Processing line: ~    end~
+- Inside source: true
+*** True Line Result
+    end
+** Processing line: ~  end~
+- Inside source: true
+*** True Line Result
+  end
+** Processing line: ~~
+- Inside source: true
+*** True Line Result
+
+** Processing line: ~  def draw_label args, row, col, header, text~
+- Inside source: true
+*** True Line Result
+  def draw_label args, row, col, header, text
+** Processing line: ~    label_pos = args.layout.rect(row: row, col: col, w: 0, h: 0)~
+- Inside source: true
+*** True Line Result
+    label_pos = args.layout.rect(row: row, col: col, w: 0, h: 0)
+** Processing line: ~    args.outputs.labels << "#{header}\n\n#{text}".wrapped_lines(80).map_with_index do |l, i|~
+- Inside source: true
+*** True Line Result
+    args.outputs.labels << "#{header}\n\n#{text}".wrapped_lines(80).map_with_index do |l, i|
+** Processing line: ~      { x: label_pos.x, y: label_pos.y - (i * 15), text: l, size_enum: -2 }~
+- Inside source: true
+*** True Line Result
+      { x: label_pos.x, y: label_pos.y - (i * 15), text: l, size_enum: -2 }
+** Processing line: ~    end~
+- Inside source: true
+*** True Line Result
+    end
+** Processing line: ~  end~
+- Inside source: true
+*** True Line Result
+  end
+** Processing line: ~~
+- Inside source: true
+*** True Line Result
+
+** Processing line: ~#+end_src~
+- Line was identified as the end of a code block.
+*** True Line Result
+#+end_src
+** Processing line: ~~
+- End of paragraph detected.
+*** True Line Result
+
 ** Processing line: ~*** C Extensions - Basics - main.rb~
 - Header detected.
 *** True Line Result
@@ -70687,10 +72147,10 @@ Follows is a source code listing for all files that have been open sourced. This
 - Inside source: true
 *** True Line Result
     # Every tick, new args are passed, and the Breadth First Search tick is called
-** Processing line: ~    $breadcrumbs ||= Breadcrumbs.new(args)~
+** Processing line: ~    $breadcrumbs ||= Breadcrumbs.new~
 - Inside source: true
 *** True Line Result
-    $breadcrumbs ||= Breadcrumbs.new(args)
+    $breadcrumbs ||= Breadcrumbs.new
 ** Processing line: ~    $breadcrumbs.args = args~
 - Inside source: true
 *** True Line Result
@@ -73295,10 +74755,10 @@ Follows is a source code listing for all files that have been open sourced. This
 - Inside source: true
 *** True Line Result
     # Every tick, new args are passed, and the Breadth First Search tick is called
-** Processing line: ~    $early_exit_breadth_first_search ||= EarlyExitBreadthFirstSearch.new(args)~
+** Processing line: ~    $early_exit_breadth_first_search ||= EarlyExitBreadthFirstSearch.new~
 - Inside source: true
 *** True Line Result
-    $early_exit_breadth_first_search ||= EarlyExitBreadthFirstSearch.new(args)
+    $early_exit_breadth_first_search ||= EarlyExitBreadthFirstSearch.new
 ** Processing line: ~    $early_exit_breadth_first_search.args = args~
 - Inside source: true
 *** True Line Result
@@ -76699,10 +78159,10 @@ Follows is a source code listing for all files that have been open sourced. This
 - Inside source: true
 *** True Line Result
     # Every tick, new args are passed, and the Dijkstra tick method is called
-** Processing line: ~    $movement_costs ||= Movement_Costs.new(args)~
+** Processing line: ~    $movement_costs ||= Movement_Costs.new~
 - Inside source: true
 *** True Line Result
-    $movement_costs ||= Movement_Costs.new(args)
+    $movement_costs ||= Movement_Costs.new
 ** Processing line: ~    $movement_costs.args = args~
 - Inside source: true
 *** True Line Result
@@ -80647,10 +82107,10 @@ Follows is a source code listing for all files that have been open sourced. This
 - Inside source: true
 *** True Line Result
     # Every tick, new args are passed, and the Breadth First Search tick is called
-** Processing line: ~    $heuristic_with_walls ||= Heuristic_With_Walls.new(args)~
+** Processing line: ~    $heuristic_with_walls ||= Heuristic_With_Walls.new~
 - Inside source: true
 *** True Line Result
-    $heuristic_with_walls ||= Heuristic_With_Walls.new(args)
+    $heuristic_with_walls ||= Heuristic_With_Walls.new
 ** Processing line: ~    $heuristic_with_walls.args = args~
 - Inside source: true
 *** True Line Result
@@ -84727,10 +86187,10 @@ Follows is a source code listing for all files that have been open sourced. This
 - Inside source: true
 *** True Line Result
     # Every tick, new args are passed, and the Breadth First Search tick is called
-** Processing line: ~    $heuristic ||= Heuristic.new(args)~
+** Processing line: ~    $heuristic ||= Heuristic.new~
 - Inside source: true
 *** True Line Result
-    $heuristic ||= Heuristic.new(args)
+    $heuristic ||= Heuristic.new
 ** Processing line: ~    $heuristic.args = args~
 - Inside source: true
 *** True Line Result
@@ -88871,10 +90331,10 @@ Follows is a source code listing for all files that have been open sourced. This
 - Inside source: true
 *** True Line Result
     # Every tick, new args are passed, and the Breadth First Search tick is called
-** Processing line: ~    $a_star_algorithm ||= A_Star_Algorithm.new(args)~
+** Processing line: ~    $a_star_algorithm ||= A_Star_Algorithm.new~
 - Inside source: true
 *** True Line Result
-    $a_star_algorithm ||= A_Star_Algorithm.new(args)
+    $a_star_algorithm ||= A_Star_Algorithm.new
 ** Processing line: ~    $a_star_algorithm.args = args~
 - Inside source: true
 *** True Line Result
@@ -91031,838 +92491,802 @@ Follows is a source code listing for all files that have been open sourced. This
 - End of paragraph detected.
 *** True Line Result
 
-** Processing line: ~*** Arcade - Bullet Hell - main.rb~
+** Processing line: ~*** 3d - Yaw Pitch Roll - main.rb~
 - Header detected.
 *** True Line Result
 
 *** True Line Result
-*** Arcade - Bullet Hell - main.rb
+*** 3d - Yaw Pitch Roll - main.rb
 ** Processing line: ~#+begin_src ruby~
 - Line was identified as the beginning of a code block.
 *** True Line Result
 
 *** True Line Result
 #+begin_src ruby
-** Processing line: ~  # ./samples/99_genre_arcade/bullet_hell/app/main.rb~
-- Inside source: true
-*** True Line Result
-  # ./samples/99_genre_arcade/bullet_hell/app/main.rb
-** Processing line: ~  def tick args~
+** Processing line: ~  # ./samples/99_genre_3d/03_yaw_pitch_roll/app/main.rb~
 - Inside source: true
 *** True Line Result
-  def tick args
-** Processing line: ~    args.state.base_columns   ||= 10.times.map { |n| 50 * n + 1280 / 2 - 5 * 50 + 5 }~
+  # ./samples/99_genre_3d/03_yaw_pitch_roll/app/main.rb
+** Processing line: ~  class Game~
 - Inside source: true
 *** True Line Result
-    args.state.base_columns   ||= 10.times.map { |n| 50 * n + 1280 / 2 - 5 * 50 + 5 }
-** Processing line: ~    args.state.base_rows      ||= 5.times.map { |n| 50 * n + 720 - 5 * 50 }~
+  class Game
+** Processing line: ~    attr_gtk~
 - Inside source: true
 *** True Line Result
-    args.state.base_rows      ||= 5.times.map { |n| 50 * n + 720 - 5 * 50 }
-** Processing line: ~    args.state.offset_columns = 10.times.map { |n| (n - 4.5) * Math.sin(Kernel.tick_count.to_radians) * 12 }~
+    attr_gtk
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-    args.state.offset_columns = 10.times.map { |n| (n - 4.5) * Math.sin(Kernel.tick_count.to_radians) * 12 }
-** Processing line: ~    args.state.offset_rows    = 5.map { 0 }~
+
+** Processing line: ~    def tick~
 - Inside source: true
 *** True Line Result
-    args.state.offset_rows    = 5.map { 0 }
-** Processing line: ~    args.state.columns        = 10.times.map { |i| args.state.base_columns[i] + args.state.offset_columns[i] }~
+    def tick
+** Processing line: ~      defaults~
 - Inside source: true
 *** True Line Result
-    args.state.columns        = 10.times.map { |i| args.state.base_columns[i] + args.state.offset_columns[i] }
-** Processing line: ~    args.state.rows           = 5.times.map { |i| args.state.base_rows[i] + args.state.offset_rows[i] }~
+      defaults
+** Processing line: ~      render~
 - Inside source: true
 *** True Line Result
-    args.state.rows           = 5.times.map { |i| args.state.base_rows[i] + args.state.offset_rows[i] }
-** Processing line: ~    args.state.explosions     ||= []~
+      render
+** Processing line: ~      input~
 - Inside source: true
 *** True Line Result
-    args.state.explosions     ||= []
-** Processing line: ~    args.state.enemies        ||= []~
+      input
+** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
-    args.state.enemies        ||= []
-** Processing line: ~    args.state.score          ||= 0~
+    end
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-    args.state.score          ||= 0
-** Processing line: ~    args.state.wave           ||= 0~
+
+** Processing line: ~    def matrix_mul m, v~
 - Inside source: true
 *** True Line Result
-    args.state.wave           ||= 0
-** Processing line: ~    if args.state.enemies.empty?~
+    def matrix_mul m, v
+** Processing line: ~      (hmap x: ((m.x.x * v.x) + (m.x.y * v.y) + (m.x.z * v.z) + (m.x.w * v.w)),~
 - Inside source: true
 *** True Line Result
-    if args.state.enemies.empty?
-** Processing line: ~      args.state.wave      += 1~
+      (hmap x: ((m.x.x * v.x) + (m.x.y * v.y) + (m.x.z * v.z) + (m.x.w * v.w)),
+** Processing line: ~            y: ((m.y.x * v.x) + (m.y.y * v.y) + (m.y.z * v.z) + (m.y.w * v.w)),~
 - Inside source: true
 *** True Line Result
-      args.state.wave      += 1
-** Processing line: ~      args.state.wave_root = Math.sqrt(args.state.wave)~
+            y: ((m.y.x * v.x) + (m.y.y * v.y) + (m.y.z * v.z) + (m.y.w * v.w)),
+** Processing line: ~            z: ((m.z.x * v.x) + (m.z.y * v.y) + (m.z.z * v.z) + (m.z.w * v.w)),~
 - Inside source: true
 *** True Line Result
-      args.state.wave_root = Math.sqrt(args.state.wave)
-** Processing line: ~      args.state.enemies   = make_enemies~
+            z: ((m.z.x * v.x) + (m.z.y * v.y) + (m.z.z * v.z) + (m.z.w * v.w)),
+** Processing line: ~            w: ((m.w.x * v.x) + (m.w.y * v.y) + (m.w.z * v.z) + (m.w.w * v.w)))~
 - Inside source: true
 *** True Line Result
-      args.state.enemies   = make_enemies
+            w: ((m.w.x * v.x) + (m.w.y * v.y) + (m.w.z * v.z) + (m.w.w * v.w)))
 ** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
     end
-** Processing line: ~    args.state.player         ||= {x: 620, y: 80, w: 40, h: 40, path: 'sprites/circle-gray.png', angle: 90, cooldown: 0, alive: true}~
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-    args.state.player         ||= {x: 620, y: 80, w: 40, h: 40, path: 'sprites/circle-gray.png', angle: 90, cooldown: 0, alive: true}
-** Processing line: ~    args.state.enemy_bullets  ||= []~
+
+** Processing line: ~    def player_ship~
 - Inside source: true
 *** True Line Result
-    args.state.enemy_bullets  ||= []
-** Processing line: ~    args.state.player_bullets ||= []~
+    def player_ship
+** Processing line: ~      [~
 - Inside source: true
 *** True Line Result
-    args.state.player_bullets ||= []
-** Processing line: ~    args.state.lives          ||= 3~
+      [
+** Processing line: ~        # engine back~
 - Inside source: true
 *** True Line Result
-    args.state.lives          ||= 3
-** Processing line: ~    args.state.missed_shots   ||= 0~
+        # engine back
+** Processing line: ~        { x: -1, y: -1, z: 1, w: 0 },~
 - Inside source: true
 *** True Line Result
-    args.state.missed_shots   ||= 0
-** Processing line: ~    args.state.fired_shots    ||= 0~
+        { x: -1, y: -1, z: 1, w: 0 },
+** Processing line: ~        { x: -1, y:  1, z: 1, w: 0 },~
 - Inside source: true
 *** True Line Result
-    args.state.fired_shots    ||= 0
+        { x: -1, y:  1, z: 1, w: 0 },
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~    update_explosions args~
+** Processing line: ~        { x: -1, y:  1, z: 1, w: 0 },~
 - Inside source: true
 *** True Line Result
-    update_explosions args
-** Processing line: ~    update_enemy_positions args~
+        { x: -1, y:  1, z: 1, w: 0 },
+** Processing line: ~        { x:  1, y:  1, z: 1, w: 0 },~
 - Inside source: true
 *** True Line Result
-    update_enemy_positions args
+        { x:  1, y:  1, z: 1, w: 0 },
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~    if args.inputs.left && args.state.player[:x] > (300 + 5)~
-- Inside source: true
-*** True Line Result
-    if args.inputs.left && args.state.player[:x] > (300 + 5)
-** Processing line: ~      args.state.player[:x] -= 5~
+** Processing line: ~        { x:  1, y:  1, z: 1, w: 0 },~
 - Inside source: true
 *** True Line Result
-      args.state.player[:x] -= 5
-** Processing line: ~    end~
+        { x:  1, y:  1, z: 1, w: 0 },
+** Processing line: ~        { x:  1, y: -1, z: 1, w: 0 },~
 - Inside source: true
 *** True Line Result
-    end
-** Processing line: ~    if args.inputs.right && args.state.player[:x] < (1280 - args.state.player[:w] - 300 - 5)~
+        { x:  1, y: -1, z: 1, w: 0 },
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-    if args.inputs.right && args.state.player[:x] < (1280 - args.state.player[:w] - 300 - 5)
-** Processing line: ~      args.state.player[:x] += 5~
+
+** Processing line: ~        { x:  1, y: -1, z: 1, w: 0 },~
 - Inside source: true
 *** True Line Result
-      args.state.player[:x] += 5
-** Processing line: ~    end~
+        { x:  1, y: -1, z: 1, w: 0 },
+** Processing line: ~        { x: -1, y: -1, z: 1, w: 0 },~
 - Inside source: true
 *** True Line Result
-    end
+        { x: -1, y: -1, z: 1, w: 0 },
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~    args.state.enemy_bullets.each do |bullet|~
+** Processing line: ~        # engine front~
 - Inside source: true
 *** True Line Result
-    args.state.enemy_bullets.each do |bullet|
-** Processing line: ~      bullet[:x] += bullet[:dx]~
+        # engine front
+** Processing line: ~        { x: -1, y: -1, z: -1, w: 0 },~
 - Inside source: true
 *** True Line Result
-      bullet[:x] += bullet[:dx]
-** Processing line: ~      bullet[:y] += bullet[:dy]~
+        { x: -1, y: -1, z: -1, w: 0 },
+** Processing line: ~        { x: -1, y:  1, z: -1, w: 0 },~
 - Inside source: true
 *** True Line Result
-      bullet[:y] += bullet[:dy]
-** Processing line: ~    end~
+        { x: -1, y:  1, z: -1, w: 0 },
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-    end
-** Processing line: ~    args.state.player_bullets.each do |bullet|~
+
+** Processing line: ~        { x: -1, y:  1, z: -1, w: 0 },~
 - Inside source: true
 *** True Line Result
-    args.state.player_bullets.each do |bullet|
-** Processing line: ~      bullet[:x] += bullet[:dx]~
+        { x: -1, y:  1, z: -1, w: 0 },
+** Processing line: ~        { x:  1, y:  1, z: -1, w: 0 },~
 - Inside source: true
 *** True Line Result
-      bullet[:x] += bullet[:dx]
-** Processing line: ~      bullet[:y] += bullet[:dy]~
+        { x:  1, y:  1, z: -1, w: 0 },
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-      bullet[:y] += bullet[:dy]
-** Processing line: ~    end~
+
+** Processing line: ~        { x:  1, y:  1, z: -1, w: 0 },~
 - Inside source: true
 *** True Line Result
-    end
+        { x:  1, y:  1, z: -1, w: 0 },
+** Processing line: ~        { x:  1, y: -1, z: -1, w: 0 },~
+- Inside source: true
+*** True Line Result
+        { x:  1, y: -1, z: -1, w: 0 },
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~    args.state.enemy_bullets  = args.state.enemy_bullets.find_all { |bullet| bullet[:y].between?(-16, 736) }~
+** Processing line: ~        { x:  1, y: -1, z: -1, w: 0 },~
 - Inside source: true
 *** True Line Result
-    args.state.enemy_bullets  = args.state.enemy_bullets.find_all { |bullet| bullet[:y].between?(-16, 736) }
-** Processing line: ~    args.state.player_bullets = args.state.player_bullets.find_all do |bullet|~
+        { x:  1, y: -1, z: -1, w: 0 },
+** Processing line: ~        { x: -1, y: -1, z: -1, w: 0 },~
 - Inside source: true
 *** True Line Result
-    args.state.player_bullets = args.state.player_bullets.find_all do |bullet|
-** Processing line: ~      if bullet[:y].between?(-16, 736)~
+        { x: -1, y: -1, z: -1, w: 0 },
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-      if bullet[:y].between?(-16, 736)
-** Processing line: ~        true~
+
+** Processing line: ~        # engine left~
 - Inside source: true
 *** True Line Result
-        true
-** Processing line: ~      else~
+        # engine left
+** Processing line: ~        { x: -1, z:  -1, y: -1, w: 0 },~
 - Inside source: true
 *** True Line Result
-      else
-** Processing line: ~        args.state.missed_shots += 1~
+        { x: -1, z:  -1, y: -1, w: 0 },
+** Processing line: ~        { x: -1, z:  -1, y:  1, w: 0 },~
 - Inside source: true
 *** True Line Result
-        args.state.missed_shots += 1
-** Processing line: ~        false~
+        { x: -1, z:  -1, y:  1, w: 0 },
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-        false
-** Processing line: ~      end~
+
+** Processing line: ~        { x: -1, z:  -1, y:  1, w: 0 },~
 - Inside source: true
 *** True Line Result
-      end
-** Processing line: ~    end~
+        { x: -1, z:  -1, y:  1, w: 0 },
+** Processing line: ~        { x: -1, z:   1, y:  1, w: 0 },~
 - Inside source: true
 *** True Line Result
-    end
+        { x: -1, z:   1, y:  1, w: 0 },
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~    args.state.enemies = args.state.enemies.reject do |enemy|~
+** Processing line: ~        { x: -1, z:   1, y:  1, w: 0 },~
 - Inside source: true
 *** True Line Result
-    args.state.enemies = args.state.enemies.reject do |enemy|
-** Processing line: ~      if args.state.player[:alive] && 1500 > (args.state.player[:x] - enemy[:x]) ** 2 + (args.state.player[:y] - enemy[:y]) ** 2~
+        { x: -1, z:   1, y:  1, w: 0 },
+** Processing line: ~        { x: -1, z:   1, y: -1, w: 0 },~
 - Inside source: true
 *** True Line Result
-      if args.state.player[:alive] && 1500 > (args.state.player[:x] - enemy[:x]) ** 2 + (args.state.player[:y] - enemy[:y]) ** 2
-** Processing line: ~        args.state.explosions << {x: enemy[:x] + 4, y: enemy[:y] + 4, w: 32, h: 32, path: 'sprites/explosion-0.png', age: 0}~
+        { x: -1, z:   1, y: -1, w: 0 },
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-        args.state.explosions << {x: enemy[:x] + 4, y: enemy[:y] + 4, w: 32, h: 32, path: 'sprites/explosion-0.png', age: 0}
-** Processing line: ~        args.state.explosions << {x: args.state.player[:x] + 4, y: args.state.player[:y] + 4, w: 32, h: 32, path: 'sprites/explosion-0.png', age: 0}~
+
+** Processing line: ~        { x: -1, z:   1, y: -1, w: 0 },~
 - Inside source: true
 *** True Line Result
-        args.state.explosions << {x: args.state.player[:x] + 4, y: args.state.player[:y] + 4, w: 32, h: 32, path: 'sprites/explosion-0.png', age: 0}
-** Processing line: ~        args.state.player[:alive] = false~
+        { x: -1, z:   1, y: -1, w: 0 },
+** Processing line: ~        { x: -1, z:  -1, y: -1, w: 0 },~
 - Inside source: true
 *** True Line Result
-        args.state.player[:alive] = false
-** Processing line: ~        true~
+        { x: -1, z:  -1, y: -1, w: 0 },
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-        true
-** Processing line: ~      else~
+
+** Processing line: ~        # engine right~
 - Inside source: true
 *** True Line Result
-      else
-** Processing line: ~        false~
+        # engine right
+** Processing line: ~        { x:  1, z:  -1, y: -1, w: 0 },~
 - Inside source: true
 *** True Line Result
-        false
-** Processing line: ~      end~
+        { x:  1, z:  -1, y: -1, w: 0 },
+** Processing line: ~        { x:  1, z:  -1, y:  1, w: 0 },~
 - Inside source: true
 *** True Line Result
-      end
-** Processing line: ~    end~
+        { x:  1, z:  -1, y:  1, w: 0 },
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-    end
-** Processing line: ~    args.state.enemy_bullets.each do |bullet|~
+
+** Processing line: ~        { x:  1, z:  -1, y:  1, w: 0 },~
 - Inside source: true
 *** True Line Result
-    args.state.enemy_bullets.each do |bullet|
-** Processing line: ~      if args.state.player[:alive] && 400 > (args.state.player[:x] - bullet[:x] + 12) ** 2 + (args.state.player[:y] - bullet[:y] + 12) ** 2~
+        { x:  1, z:  -1, y:  1, w: 0 },
+** Processing line: ~        { x:  1, z:   1, y:  1, w: 0 },~
 - Inside source: true
 *** True Line Result
-      if args.state.player[:alive] && 400 > (args.state.player[:x] - bullet[:x] + 12) ** 2 + (args.state.player[:y] - bullet[:y] + 12) ** 2
-** Processing line: ~        args.state.explosions << {x: args.state.player[:x] + 4, y: args.state.player[:y] + 4, w: 32, h: 32, path: 'sprites/explosion-0.png', age: 0}~
+        { x:  1, z:   1, y:  1, w: 0 },
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-        args.state.explosions << {x: args.state.player[:x] + 4, y: args.state.player[:y] + 4, w: 32, h: 32, path: 'sprites/explosion-0.png', age: 0}
-** Processing line: ~        args.state.player[:alive] = false~
+
+** Processing line: ~        { x:  1, z:   1, y:  1, w: 0 },~
 - Inside source: true
 *** True Line Result
-        args.state.player[:alive] = false
-** Processing line: ~        bullet[:despawn]          = true~
+        { x:  1, z:   1, y:  1, w: 0 },
+** Processing line: ~        { x:  1, z:   1, y: -1, w: 0 },~
 - Inside source: true
 *** True Line Result
-        bullet[:despawn]          = true
-** Processing line: ~      end~
+        { x:  1, z:   1, y: -1, w: 0 },
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-      end
-** Processing line: ~    end~
+
+** Processing line: ~        { x:  1, z:   1, y: -1, w: 0 },~
 - Inside source: true
 *** True Line Result
-    end
-** Processing line: ~    args.state.enemies = args.state.enemies.reject do |enemy|~
+        { x:  1, z:   1, y: -1, w: 0 },
+** Processing line: ~        { x:  1, z:  -1, y: -1, w: 0 },~
 - Inside source: true
 *** True Line Result
-    args.state.enemies = args.state.enemies.reject do |enemy|
-** Processing line: ~      args.state.player_bullets.any? do |bullet|~
+        { x:  1, z:  -1, y: -1, w: 0 },
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-      args.state.player_bullets.any? do |bullet|
-** Processing line: ~        if 400 > (enemy[:x] - bullet[:x] + 12) ** 2 + (enemy[:y] - bullet[:y] + 12) ** 2~
+
+** Processing line: ~        # top front of engine to front of ship~
 - Inside source: true
 *** True Line Result
-        if 400 > (enemy[:x] - bullet[:x] + 12) ** 2 + (enemy[:y] - bullet[:y] + 12) ** 2
-** Processing line: ~          args.state.explosions << {x: enemy[:x] + 4, y: enemy[:y] + 4, w: 32, h: 32, path: 'sprites/explosion-0.png', age: 0}~
+        # top front of engine to front of ship
+** Processing line: ~        { x:  1, y:   1, z: 1, w: 0 },~
 - Inside source: true
 *** True Line Result
-          args.state.explosions << {x: enemy[:x] + 4, y: enemy[:y] + 4, w: 32, h: 32, path: 'sprites/explosion-0.png', age: 0}
-** Processing line: ~          bullet[:despawn] = true~
+        { x:  1, y:   1, z: 1, w: 0 },
+** Processing line: ~        { x:  0, y:  -1, z: 9, w: 0 },~
 - Inside source: true
 *** True Line Result
-          bullet[:despawn] = true
-** Processing line: ~          args.state.score += 1000 * args.state.wave~
+        { x:  0, y:  -1, z: 9, w: 0 },
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-          args.state.score += 1000 * args.state.wave
-** Processing line: ~          true~
+
+** Processing line: ~        { x:  0, y:  -1, z: 9, w: 0 },~
 - Inside source: true
 *** True Line Result
-          true
-** Processing line: ~        else~
+        { x:  0, y:  -1, z: 9, w: 0 },
+** Processing line: ~        { x: -1, y:   1, z: 1, w: 0 },~
 - Inside source: true
 *** True Line Result
-        else
-** Processing line: ~          false~
+        { x: -1, y:   1, z: 1, w: 0 },
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-          false
-** Processing line: ~        end~
+
+** Processing line: ~        # bottom front of engine~
 - Inside source: true
 *** True Line Result
-        end
-** Processing line: ~      end~
+        # bottom front of engine
+** Processing line: ~        { x:  1, y:  -1, z: 1, w: 0 },~
 - Inside source: true
 *** True Line Result
-      end
-** Processing line: ~    end~
+        { x:  1, y:  -1, z: 1, w: 0 },
+** Processing line: ~        { x:  0, y:  -1, z: 9, w: 0 },~
 - Inside source: true
 *** True Line Result
-    end
+        { x:  0, y:  -1, z: 9, w: 0 },
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~    args.state.player_bullets = args.state.player_bullets.reject { |bullet| bullet[:despawn] }~
+** Processing line: ~        { x: -1, y:  -1, z: 1, w: 0 },~
 - Inside source: true
 *** True Line Result
-    args.state.player_bullets = args.state.player_bullets.reject { |bullet| bullet[:despawn] }
-** Processing line: ~    args.state.enemy_bullets  = args.state.enemy_bullets.reject { |bullet| bullet[:despawn] }~
+        { x: -1, y:  -1, z: 1, w: 0 },
+** Processing line: ~        { x:  0, y:  -1, z: 9, w: 0 },~
 - Inside source: true
 *** True Line Result
-    args.state.enemy_bullets  = args.state.enemy_bullets.reject { |bullet| bullet[:despawn] }
+        { x:  0, y:  -1, z: 9, w: 0 },
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~    args.state.player[:cooldown] -= 1~
+** Processing line: ~        # right wing~
 - Inside source: true
 *** True Line Result
-    args.state.player[:cooldown] -= 1
-** Processing line: ~    if args.inputs.keyboard.key_held.space && args.state.player[:cooldown] <= 0 && args.state.player[:alive]~
+        # right wing
+** Processing line: ~        # front of wing~
 - Inside source: true
 *** True Line Result
-    if args.inputs.keyboard.key_held.space && args.state.player[:cooldown] <= 0 && args.state.player[:alive]
-** Processing line: ~      args.state.player_bullets << {x: args.state.player[:x] + 12, y: args.state.player[:y] + 28, w: 16, h: 16, path: 'sprites/star.png', dx: 0, dy: 8}.sprite~
+        # front of wing
+** Processing line: ~        { x: 1, y: 0.10, z:  1, w: 0 },~
 - Inside source: true
 *** True Line Result
-      args.state.player_bullets << {x: args.state.player[:x] + 12, y: args.state.player[:y] + 28, w: 16, h: 16, path: 'sprites/star.png', dx: 0, dy: 8}.sprite
-** Processing line: ~      args.state.fired_shots       += 1~
+        { x: 1, y: 0.10, z:  1, w: 0 },
+** Processing line: ~        { x: 9, y: 0.10, z: -1, w: 0 },~
 - Inside source: true
 *** True Line Result
-      args.state.fired_shots       += 1
-** Processing line: ~      args.state.player[:cooldown] = 10 + 20 / args.state.wave~
+        { x: 9, y: 0.10, z: -1, w: 0 },
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-      args.state.player[:cooldown] = 10 + 20 / args.state.wave
-** Processing line: ~    end~
+
+** Processing line: ~        { x:  9, y: 0.10, z: -1, w: 0 },~
 - Inside source: true
 *** True Line Result
-    end
-** Processing line: ~    args.state.enemies.each do |enemy|~
+        { x:  9, y: 0.10, z: -1, w: 0 },
+** Processing line: ~        { x: 10, y: 0.10, z: -2, w: 0 },~
 - Inside source: true
 *** True Line Result
-    args.state.enemies.each do |enemy|
-** Processing line: ~      if Math.rand < 0.0005 + 0.0005 * args.state.wave && args.state.player[:alive] && enemy[:move_state] == :normal~
+        { x: 10, y: 0.10, z: -2, w: 0 },
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-      if Math.rand < 0.0005 + 0.0005 * args.state.wave && args.state.player[:alive] && enemy[:move_state] == :normal
-** Processing line: ~        args.state.enemy_bullets << {x: enemy[:x] + 12, y: enemy[:y] - 8, w: 16, h: 16, path: 'sprites/star.png', dx: 0, dy: -3 - args.state.wave_root}.sprite~
+
+** Processing line: ~        # back of wing~
 - Inside source: true
 *** True Line Result
-        args.state.enemy_bullets << {x: enemy[:x] + 12, y: enemy[:y] - 8, w: 16, h: 16, path: 'sprites/star.png', dx: 0, dy: -3 - args.state.wave_root}.sprite
-** Processing line: ~      end~
+        # back of wing
+** Processing line: ~        { x: 1, y: 0.10, z: -1, w: 0 },~
 - Inside source: true
 *** True Line Result
-      end
-** Processing line: ~    end~
+        { x: 1, y: 0.10, z: -1, w: 0 },
+** Processing line: ~        { x: 9, y: 0.10, z: -1, w: 0 },~
 - Inside source: true
 *** True Line Result
-    end
+        { x: 9, y: 0.10, z: -1, w: 0 },
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~    args.outputs.background_color = [0, 0, 0]~
+** Processing line: ~        { x: 10, y: 0.10, z: -2, w: 0 },~
 - Inside source: true
 *** True Line Result
-    args.outputs.background_color = [0, 0, 0]
-** Processing line: ~    args.outputs.primitives << args.state.enemies.map do |enemy|~
+        { x: 10, y: 0.10, z: -2, w: 0 },
+** Processing line: ~        { x:  8, y: 0.10, z: -1, w: 0 },~
 - Inside source: true
 *** True Line Result
-    args.outputs.primitives << args.state.enemies.map do |enemy|
-** Processing line: ~      [enemy[:x], enemy[:y], 40, 40, enemy[:path], -90].sprite~
+        { x:  8, y: 0.10, z: -1, w: 0 },
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-      [enemy[:x], enemy[:y], 40, 40, enemy[:path], -90].sprite
-** Processing line: ~    end~
+
+** Processing line: ~        # front of wing~
 - Inside source: true
 *** True Line Result
-    end
-** Processing line: ~    args.outputs.primitives << args.state.player if args.state.player[:alive]~
+        # front of wing
+** Processing line: ~        { x: 1, y: -0.10, z:  1, w: 0 },~
 - Inside source: true
 *** True Line Result
-    args.outputs.primitives << args.state.player if args.state.player[:alive]
-** Processing line: ~    args.outputs.primitives << args.state.explosions~
+        { x: 1, y: -0.10, z:  1, w: 0 },
+** Processing line: ~        { x: 9, y: -0.10, z: -1, w: 0 },~
 - Inside source: true
 *** True Line Result
-    args.outputs.primitives << args.state.explosions
-** Processing line: ~    args.outputs.primitives << args.state.player_bullets~
+        { x: 9, y: -0.10, z: -1, w: 0 },
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-    args.outputs.primitives << args.state.player_bullets
-** Processing line: ~    args.outputs.primitives << args.state.enemy_bullets~
+
+** Processing line: ~        { x:  9, y: -0.10, z: -1, w: 0 },~
 - Inside source: true
 *** True Line Result
-    args.outputs.primitives << args.state.enemy_bullets
-** Processing line: ~    accuracy = args.state.fired_shots.zero? ? 1 : (args.state.fired_shots - args.state.missed_shots) / args.state.fired_shots~
+        { x:  9, y: -0.10, z: -1, w: 0 },
+** Processing line: ~        { x: 10, y: -0.10, z: -2, w: 0 },~
 - Inside source: true
 *** True Line Result
-    accuracy = args.state.fired_shots.zero? ? 1 : (args.state.fired_shots - args.state.missed_shots) / args.state.fired_shots
-** Processing line: ~    args.outputs.primitives << [~
+        { x: 10, y: -0.10, z: -2, w: 0 },
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-    args.outputs.primitives << [
-** Processing line: ~      [0, 0, 300, 720, 96, 0, 0].solid,~
+
+** Processing line: ~        # back of wing~
 - Inside source: true
 *** True Line Result
-      [0, 0, 300, 720, 96, 0, 0].solid,
-** Processing line: ~      [1280 - 300, 0, 300, 720, 96, 0, 0].solid,~
+        # back of wing
+** Processing line: ~        { x: 1, y: -0.10, z: -1, w: 0 },~
 - Inside source: true
 *** True Line Result
-      [1280 - 300, 0, 300, 720, 96, 0, 0].solid,
-** Processing line: ~      [1280 - 290, 60, "Wave     #{args.state.wave}", 255, 255, 255].label,~
+        { x: 1, y: -0.10, z: -1, w: 0 },
+** Processing line: ~        { x: 9, y: -0.10, z: -1, w: 0 },~
 - Inside source: true
 *** True Line Result
-      [1280 - 290, 60, "Wave     #{args.state.wave}", 255, 255, 255].label,
-** Processing line: ~      [1280 - 290, 40, "Accuracy #{(accuracy * 100).floor}%", 255, 255, 255].label,~
+        { x: 9, y: -0.10, z: -1, w: 0 },
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-      [1280 - 290, 40, "Accuracy #{(accuracy * 100).floor}%", 255, 255, 255].label,
-** Processing line: ~      [1280 - 290, 20, "Score    #{(args.state.score * accuracy).floor}", 255, 255, 255].label,~
+
+** Processing line: ~        { x: 10, y: -0.10, z: -2, w: 0 },~
 - Inside source: true
 *** True Line Result
-      [1280 - 290, 20, "Score    #{(args.state.score * accuracy).floor}", 255, 255, 255].label,
-** Processing line: ~    ]~
+        { x: 10, y: -0.10, z: -2, w: 0 },
+** Processing line: ~        { x:  8, y: -0.10, z: -1, w: 0 },~
 - Inside source: true
 *** True Line Result
-    ]
-** Processing line: ~    args.outputs.primitives << args.state.lives.times.map do |n|~
+        { x:  8, y: -0.10, z: -1, w: 0 },
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-    args.outputs.primitives << args.state.lives.times.map do |n|
-** Processing line: ~      [1280 - 290 + 50 * n, 80, 40, 40, 'sprites/circle-gray.png', 90].sprite~
+
+** Processing line: ~        # left wing~
 - Inside source: true
 *** True Line Result
-      [1280 - 290 + 50 * n, 80, 40, 40, 'sprites/circle-gray.png', 90].sprite
-** Processing line: ~    end~
+        # left wing
+** Processing line: ~        # front of wing~
 - Inside source: true
 *** True Line Result
-    end
-** Processing line: ~    #args.outputs.debug << args.gtk.framerate_diagnostics_primitives~
+        # front of wing
+** Processing line: ~        { x: -1, y: 0.10, z:  1, w: 0 },~
 - Inside source: true
 *** True Line Result
-    #args.outputs.debug << args.gtk.framerate_diagnostics_primitives
-** Processing line: ~~
+        { x: -1, y: 0.10, z:  1, w: 0 },
+** Processing line: ~        { x: -9, y: 0.10, z: -1, w: 0 },~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~    if (!args.state.player[:alive]) && args.state.enemy_bullets.empty? && args.state.explosions.empty? && args.state.enemies.all? { |enemy| enemy[:move_state] == :normal }~
+        { x: -9, y: 0.10, z: -1, w: 0 },
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-    if (!args.state.player[:alive]) && args.state.enemy_bullets.empty? && args.state.explosions.empty? && args.state.enemies.all? { |enemy| enemy[:move_state] == :normal }
-** Processing line: ~      args.state.player[:alive] = true~
+
+** Processing line: ~        { x: -9, y: 0.10, z: -1, w: 0 },~
 - Inside source: true
 *** True Line Result
-      args.state.player[:alive] = true
-** Processing line: ~      args.state.player[:x]     = 624~
+        { x: -9, y: 0.10, z: -1, w: 0 },
+** Processing line: ~        { x: -10, y: 0.10, z: -2, w: 0 },~
 - Inside source: true
 *** True Line Result
-      args.state.player[:x]     = 624
-** Processing line: ~      args.state.player[:y]     = 80~
+        { x: -10, y: 0.10, z: -2, w: 0 },
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-      args.state.player[:y]     = 80
-** Processing line: ~      args.state.lives          -= 1~
+
+** Processing line: ~        # back of wing~
 - Inside source: true
 *** True Line Result
-      args.state.lives          -= 1
-** Processing line: ~      if args.state.lives == -1~
+        # back of wing
+** Processing line: ~        { x: -1, y: 0.10, z: -1, w: 0 },~
 - Inside source: true
 *** True Line Result
-      if args.state.lives == -1
-** Processing line: ~        args.state.clear!~
+        { x: -1, y: 0.10, z: -1, w: 0 },
+** Processing line: ~        { x: -9, y: 0.10, z: -1, w: 0 },~
 - Inside source: true
 *** True Line Result
-        args.state.clear!
-** Processing line: ~      end~
+        { x: -9, y: 0.10, z: -1, w: 0 },
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-      end
-** Processing line: ~    end~
+
+** Processing line: ~        { x: -10, y: 0.10, z: -2, w: 0 },~
 - Inside source: true
 *** True Line Result
-    end
-** Processing line: ~  end~
+        { x: -10, y: 0.10, z: -2, w: 0 },
+** Processing line: ~        { x: -8, y: 0.10, z: -1, w: 0 },~
 - Inside source: true
 *** True Line Result
-  end
+        { x: -8, y: 0.10, z: -1, w: 0 },
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~  def make_enemies~
+** Processing line: ~        # front of wing~
 - Inside source: true
 *** True Line Result
-  def make_enemies
-** Processing line: ~    enemies = []~
+        # front of wing
+** Processing line: ~        { x: -1, y: -0.10, z:  1, w: 0 },~
 - Inside source: true
 *** True Line Result
-    enemies = []
-** Processing line: ~    enemies += 10.times.map { |n| {x: Math.rand * 1280 * 2 - 640, y: Math.rand * 720 * 2 + 720, row: 0, col: n, path: 'sprites/circle-orange.png', move_state: :retreat} }~
+        { x: -1, y: -0.10, z:  1, w: 0 },
+** Processing line: ~        { x: -9, y: -0.10, z: -1, w: 0 },~
 - Inside source: true
 *** True Line Result
-    enemies += 10.times.map { |n| {x: Math.rand * 1280 * 2 - 640, y: Math.rand * 720 * 2 + 720, row: 0, col: n, path: 'sprites/circle-orange.png', move_state: :retreat} }
-** Processing line: ~    enemies += 10.times.map { |n| {x: Math.rand * 1280 * 2 - 640, y: Math.rand * 720 * 2 + 720, row: 1, col: n, path: 'sprites/circle-orange.png', move_state: :retreat} }~
+        { x: -9, y: -0.10, z: -1, w: 0 },
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-    enemies += 10.times.map { |n| {x: Math.rand * 1280 * 2 - 640, y: Math.rand * 720 * 2 + 720, row: 1, col: n, path: 'sprites/circle-orange.png', move_state: :retreat} }
-** Processing line: ~    enemies += 8.times.map { |n| {x: Math.rand * 1280 * 2 - 640, y: Math.rand * 720 * 2 + 720, row: 2, col: n + 1, path: 'sprites/circle-blue.png', move_state: :retreat} }~
+
+** Processing line: ~        { x: -9, y: -0.10, z: -1, w: 0 },~
 - Inside source: true
 *** True Line Result
-    enemies += 8.times.map { |n| {x: Math.rand * 1280 * 2 - 640, y: Math.rand * 720 * 2 + 720, row: 2, col: n + 1, path: 'sprites/circle-blue.png', move_state: :retreat} }
-** Processing line: ~    enemies += 8.times.map { |n| {x: Math.rand * 1280 * 2 - 640, y: Math.rand * 720 * 2 + 720, row: 3, col: n + 1, path: 'sprites/circle-blue.png', move_state: :retreat} }~
+        { x: -9, y: -0.10, z: -1, w: 0 },
+** Processing line: ~        { x: -10, y: -0.10, z: -2, w: 0 },~
 - Inside source: true
 *** True Line Result
-    enemies += 8.times.map { |n| {x: Math.rand * 1280 * 2 - 640, y: Math.rand * 720 * 2 + 720, row: 3, col: n + 1, path: 'sprites/circle-blue.png', move_state: :retreat} }
-** Processing line: ~    enemies += 4.times.map { |n| {x: Math.rand * 1280 * 2 - 640, y: Math.rand * 720 * 2 + 720, row: 4, col: n + 3, path: 'sprites/circle-green.png', move_state: :retreat} }~
+        { x: -10, y: -0.10, z: -2, w: 0 },
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-    enemies += 4.times.map { |n| {x: Math.rand * 1280 * 2 - 640, y: Math.rand * 720 * 2 + 720, row: 4, col: n + 3, path: 'sprites/circle-green.png', move_state: :retreat} }
-** Processing line: ~    enemies~
+
+** Processing line: ~        # back of wing~
 - Inside source: true
 *** True Line Result
-    enemies
-** Processing line: ~  end~
+        # back of wing
+** Processing line: ~        { x: -1, y: -0.10, z: -1, w: 0 },~
 - Inside source: true
 *** True Line Result
-  end
+        { x: -1, y: -0.10, z: -1, w: 0 },
+** Processing line: ~        { x: -9, y: -0.10, z: -1, w: 0 },~
+- Inside source: true
+*** True Line Result
+        { x: -9, y: -0.10, z: -1, w: 0 },
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~  def update_explosions args~
+** Processing line: ~        { x: -10, y: -0.10, z: -2, w: 0 },~
 - Inside source: true
 *** True Line Result
-  def update_explosions args
-** Processing line: ~    args.state.explosions.each do |explosion|~
+        { x: -10, y: -0.10, z: -2, w: 0 },
+** Processing line: ~        { x: -8, y: -0.10, z: -1, w: 0 },~
 - Inside source: true
 *** True Line Result
-    args.state.explosions.each do |explosion|
-** Processing line: ~      explosion[:age]  += 0.5~
+        { x: -8, y: -0.10, z: -1, w: 0 },
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-      explosion[:age]  += 0.5
-** Processing line: ~      explosion[:path] = "sprites/explosion-#{explosion[:age].floor}.png"~
+
+** Processing line: ~        # left fin~
 - Inside source: true
 *** True Line Result
-      explosion[:path] = "sprites/explosion-#{explosion[:age].floor}.png"
-** Processing line: ~    end~
+        # left fin
+** Processing line: ~        # top~
 - Inside source: true
 *** True Line Result
-    end
-** Processing line: ~    args.state.explosions = args.state.explosions.reject { |explosion| explosion[:age] >= 7 }~
+        # top
+** Processing line: ~        { x: -1, y: 0.10, z: 1, w: 0 },~
 - Inside source: true
 *** True Line Result
-    args.state.explosions = args.state.explosions.reject { |explosion| explosion[:age] >= 7 }
-** Processing line: ~  end~
+        { x: -1, y: 0.10, z: 1, w: 0 },
+** Processing line: ~        { x: -1, y: 3, z: -3, w: 0 },~
 - Inside source: true
 *** True Line Result
-  end
+        { x: -1, y: 3, z: -3, w: 0 },
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~  def update_enemy_positions args~
-- Inside source: true
-*** True Line Result
-  def update_enemy_positions args
-** Processing line: ~    args.state.enemies.each do |enemy|~
+** Processing line: ~        { x: -1, y: 0.10, z: -1, w: 0 },~
 - Inside source: true
 *** True Line Result
-    args.state.enemies.each do |enemy|
-** Processing line: ~      if enemy[:move_state] == :normal~
+        { x: -1, y: 0.10, z: -1, w: 0 },
+** Processing line: ~        { x: -1, y: 3, z: -3, w: 0 },~
 - Inside source: true
 *** True Line Result
-      if enemy[:move_state] == :normal
-** Processing line: ~        enemy[:x]          = args.state.columns[enemy[:col]]~
+        { x: -1, y: 3, z: -3, w: 0 },
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-        enemy[:x]          = args.state.columns[enemy[:col]]
-** Processing line: ~        enemy[:y]          = args.state.rows[enemy[:row]]~
+
+** Processing line: ~        { x: -1.1, y: 0.10, z: 1, w: 0 },~
 - Inside source: true
 *** True Line Result
-        enemy[:y]          = args.state.rows[enemy[:row]]
-** Processing line: ~        enemy[:move_state] = :dive if Math.rand < 0.0002 + 0.00005 * args.state.wave && args.state.player[:alive]~
+        { x: -1.1, y: 0.10, z: 1, w: 0 },
+** Processing line: ~        { x: -1.1, y: 3, z: -3, w: 0 },~
 - Inside source: true
 *** True Line Result
-        enemy[:move_state] = :dive if Math.rand < 0.0002 + 0.00005 * args.state.wave && args.state.player[:alive]
-** Processing line: ~      elsif enemy[:move_state] == :dive~
+        { x: -1.1, y: 3, z: -3, w: 0 },
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-      elsif enemy[:move_state] == :dive
-** Processing line: ~        enemy[:target_x] ||= args.state.player[:x]~
+
+** Processing line: ~        { x: -1.1, y: 0.10, z: -1, w: 0 },~
 - Inside source: true
 *** True Line Result
-        enemy[:target_x] ||= args.state.player[:x]
-** Processing line: ~        enemy[:target_y] ||= args.state.player[:y]~
+        { x: -1.1, y: 0.10, z: -1, w: 0 },
+** Processing line: ~        { x: -1.1, y: 3, z: -3, w: 0 },~
 - Inside source: true
 *** True Line Result
-        enemy[:target_y] ||= args.state.player[:y]
-** Processing line: ~        dx               = enemy[:target_x] - enemy[:x]~
+        { x: -1.1, y: 3, z: -3, w: 0 },
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-        dx               = enemy[:target_x] - enemy[:x]
-** Processing line: ~        dy               = enemy[:target_y] - enemy[:y]~
+
+** Processing line: ~        # bottom~
 - Inside source: true
 *** True Line Result
-        dy               = enemy[:target_y] - enemy[:y]
-** Processing line: ~        vel              = Math.sqrt(dx * dx + dy * dy)~
+        # bottom
+** Processing line: ~        { x: -1, y: -0.10, z: 1, w: 0 },~
 - Inside source: true
 *** True Line Result
-        vel              = Math.sqrt(dx * dx + dy * dy)
-** Processing line: ~        speed_limit      = 2 + args.state.wave_root~
+        { x: -1, y: -0.10, z: 1, w: 0 },
+** Processing line: ~        { x: -1, y: -2, z: -2, w: 0 },~
 - Inside source: true
 *** True Line Result
-        speed_limit      = 2 + args.state.wave_root
-** Processing line: ~        if vel > speed_limit~
+        { x: -1, y: -2, z: -2, w: 0 },
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-        if vel > speed_limit
-** Processing line: ~          dx /= vel / speed_limit~
+
+** Processing line: ~        { x: -1, y: -0.10, z: -1, w: 0 },~
 - Inside source: true
 *** True Line Result
-          dx /= vel / speed_limit
-** Processing line: ~          dy /= vel / speed_limit~
+        { x: -1, y: -0.10, z: -1, w: 0 },
+** Processing line: ~        { x: -1, y: -2, z: -2, w: 0 },~
 - Inside source: true
 *** True Line Result
-          dy /= vel / speed_limit
-** Processing line: ~        end~
+        { x: -1, y: -2, z: -2, w: 0 },
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-        end
-** Processing line: ~        if vel < 1 || !args.state.player[:alive]~
+
+** Processing line: ~        { x: -1.1, y: -0.10, z: 1, w: 0 },~
 - Inside source: true
 *** True Line Result
-        if vel < 1 || !args.state.player[:alive]
-** Processing line: ~          enemy[:move_state] = :retreat~
+        { x: -1.1, y: -0.10, z: 1, w: 0 },
+** Processing line: ~        { x: -1.1, y: -2, z: -2, w: 0 },~
 - Inside source: true
 *** True Line Result
-          enemy[:move_state] = :retreat
-** Processing line: ~        end~
+        { x: -1.1, y: -2, z: -2, w: 0 },
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-        end
-** Processing line: ~        enemy[:x] += dx~
+
+** Processing line: ~        { x: -1.1, y: -0.10, z: -1, w: 0 },~
 - Inside source: true
 *** True Line Result
-        enemy[:x] += dx
-** Processing line: ~        enemy[:y] += dy~
+        { x: -1.1, y: -0.10, z: -1, w: 0 },
+** Processing line: ~        { x: -1.1, y: -2, z: -2, w: 0 },~
 - Inside source: true
 *** True Line Result
-        enemy[:y] += dy
-** Processing line: ~      elsif enemy[:move_state] == :retreat~
+        { x: -1.1, y: -2, z: -2, w: 0 },
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-      elsif enemy[:move_state] == :retreat
-** Processing line: ~        enemy[:target_x] = args.state.columns[enemy[:col]]~
+
+** Processing line: ~        # right fin~
 - Inside source: true
 *** True Line Result
-        enemy[:target_x] = args.state.columns[enemy[:col]]
-** Processing line: ~        enemy[:target_y] = args.state.rows[enemy[:row]]~
+        # right fin
+** Processing line: ~        { x:  1, y: 0.10, z: 1, w: 0 },~
 - Inside source: true
 *** True Line Result
-        enemy[:target_y] = args.state.rows[enemy[:row]]
-** Processing line: ~        dx               = enemy[:target_x] - enemy[:x]~
+        { x:  1, y: 0.10, z: 1, w: 0 },
+** Processing line: ~        { x:  1, y: 3, z: -3, w: 0 },~
 - Inside source: true
 *** True Line Result
-        dx               = enemy[:target_x] - enemy[:x]
-** Processing line: ~        dy               = enemy[:target_y] - enemy[:y]~
+        { x:  1, y: 3, z: -3, w: 0 },
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-        dy               = enemy[:target_y] - enemy[:y]
-** Processing line: ~        vel              = Math.sqrt(dx * dx + dy * dy)~
+
+** Processing line: ~        { x:  1, y: 0.10, z: -1, w: 0 },~
 - Inside source: true
 *** True Line Result
-        vel              = Math.sqrt(dx * dx + dy * dy)
-** Processing line: ~        speed_limit      = 2 + args.state.wave_root~
+        { x:  1, y: 0.10, z: -1, w: 0 },
+** Processing line: ~        { x:  1, y: 3, z: -3, w: 0 },~
 - Inside source: true
 *** True Line Result
-        speed_limit      = 2 + args.state.wave_root
-** Processing line: ~        if vel > speed_limit~
+        { x:  1, y: 3, z: -3, w: 0 },
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-        if vel > speed_limit
-** Processing line: ~          dx /= vel / speed_limit~
+
+** Processing line: ~        { x:  1.1, y: 0.10, z: 1, w: 0 },~
 - Inside source: true
 *** True Line Result
-          dx /= vel / speed_limit
-** Processing line: ~          dy /= vel / speed_limit~
+        { x:  1.1, y: 0.10, z: 1, w: 0 },
+** Processing line: ~        { x:  1.1, y: 3, z: -3, w: 0 },~
 - Inside source: true
 *** True Line Result
-          dy /= vel / speed_limit
-** Processing line: ~        elsif vel < 1~
+        { x:  1.1, y: 3, z: -3, w: 0 },
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-        elsif vel < 1
-** Processing line: ~          enemy[:move_state] = :normal~
+
+** Processing line: ~        { x:  1.1, y: 0.10, z: -1, w: 0 },~
 - Inside source: true
 *** True Line Result
-          enemy[:move_state] = :normal
-** Processing line: ~          enemy[:target_x]   = nil~
+        { x:  1.1, y: 0.10, z: -1, w: 0 },
+** Processing line: ~        { x:  1.1, y: 3, z: -3, w: 0 },~
 - Inside source: true
 *** True Line Result
-          enemy[:target_x]   = nil
-** Processing line: ~          enemy[:target_y]   = nil~
+        { x:  1.1, y: 3, z: -3, w: 0 },
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-          enemy[:target_y]   = nil
-** Processing line: ~        end~
+
+** Processing line: ~        # bottom~
 - Inside source: true
 *** True Line Result
-        end
-** Processing line: ~        enemy[:x] += dx~
+        # bottom
+** Processing line: ~        { x:  1, y: -0.10, z: 1, w: 0 },~
 - Inside source: true
 *** True Line Result
-        enemy[:x] += dx
-** Processing line: ~        enemy[:y] += dy~
+        { x:  1, y: -0.10, z: 1, w: 0 },
+** Processing line: ~        { x:  1, y: -2, z: -2, w: 0 },~
 - Inside source: true
 *** True Line Result
-        enemy[:y] += dy
-** Processing line: ~      end~
+        { x:  1, y: -2, z: -2, w: 0 },
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-      end
-** Processing line: ~    end~
+
+** Processing line: ~        { x:  1, y: -0.10, z: -1, w: 0 },~
 - Inside source: true
 *** True Line Result
-    end
-** Processing line: ~  end~
+        { x:  1, y: -0.10, z: -1, w: 0 },
+** Processing line: ~        { x:  1, y: -2, z: -2, w: 0 },~
 - Inside source: true
 *** True Line Result
-  end
+        { x:  1, y: -2, z: -2, w: 0 },
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~#+end_src~
-- Line was identified as the end of a code block.
-*** True Line Result
-#+end_src
-** Processing line: ~~
-- End of paragraph detected.
-*** True Line Result
-
-** Processing line: ~*** Arcade - Dueling Starships - main.rb~
-- Header detected.
-*** True Line Result
-
-*** True Line Result
-*** Arcade - Dueling Starships - main.rb
-** Processing line: ~#+begin_src ruby~
-- Line was identified as the beginning of a code block.
-*** True Line Result
-
-*** True Line Result
-#+begin_src ruby
-** Processing line: ~  # ./samples/99_genre_arcade/dueling_starships/app/main.rb~
-- Inside source: true
-*** True Line Result
-  # ./samples/99_genre_arcade/dueling_starships/app/main.rb
-** Processing line: ~  class DuelingSpaceships~
+** Processing line: ~        { x:  1.1, y: -0.10, z: 1, w: 0 },~
 - Inside source: true
 *** True Line Result
-  class DuelingSpaceships
-** Processing line: ~    attr_accessor :state, :inputs, :outputs, :grid~
+        { x:  1.1, y: -0.10, z: 1, w: 0 },
+** Processing line: ~        { x:  1.1, y: -2, z: -2, w: 0 },~
 - Inside source: true
 *** True Line Result
-    attr_accessor :state, :inputs, :outputs, :grid
+        { x:  1.1, y: -2, z: -2, w: 0 },
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~    def tick~
-- Inside source: true
-*** True Line Result
-    def tick
-** Processing line: ~      defaults~
-- Inside source: true
-*** True Line Result
-      defaults
-** Processing line: ~      render~
+** Processing line: ~        { x:  1.1, y: -0.10, z: -1, w: 0 },~
 - Inside source: true
 *** True Line Result
-      render
-** Processing line: ~      calc~
+        { x:  1.1, y: -0.10, z: -1, w: 0 },
+** Processing line: ~        { x:  1.1, y: -2, z: -2, w: 0 },~
 - Inside source: true
 *** True Line Result
-      calc
-** Processing line: ~      input~
+        { x:  1.1, y: -2, z: -2, w: 0 },
+** Processing line: ~      ]~
 - Inside source: true
 *** True Line Result
-      input
+      ]
 ** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
@@ -91875,54 +93299,62 @@ Follows is a source code listing for all files that have been open sourced. This
 - Inside source: true
 *** True Line Result
     def defaults
-** Processing line: ~      outputs.background_color = [0, 0, 0]~
+** Processing line: ~      state.points ||= player_ship~
 - Inside source: true
 *** True Line Result
-      outputs.background_color = [0, 0, 0]
-** Processing line: ~      state.ship_blue       ||= new_blue_ship~
+      state.points ||= player_ship
+** Processing line: ~      state.shifted_points ||= state.points.map { |point| point }~
 - Inside source: true
 *** True Line Result
-      state.ship_blue       ||= new_blue_ship
-** Processing line: ~      state.ship_red        ||= new_red_ship~
+      state.shifted_points ||= state.points.map { |point| point }
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-      state.ship_red        ||= new_red_ship
-** Processing line: ~      state.flames          ||= []~
+
+** Processing line: ~      state.scale   ||= 1~
 - Inside source: true
 *** True Line Result
-      state.flames          ||= []
-** Processing line: ~      state.bullets         ||= []~
+      state.scale   ||= 1
+** Processing line: ~      state.angle_x ||= 0~
 - Inside source: true
 *** True Line Result
-      state.bullets         ||= []
-** Processing line: ~      state.ship_blue_score ||= 0~
+      state.angle_x ||= 0
+** Processing line: ~      state.angle_y ||= 0~
 - Inside source: true
 *** True Line Result
-      state.ship_blue_score ||= 0
-** Processing line: ~      state.ship_red_score  ||= 0~
+      state.angle_y ||= 0
+** Processing line: ~      state.angle_z ||= 0~
 - Inside source: true
 *** True Line Result
-      state.ship_red_score  ||= 0
-** Processing line: ~      state.stars           ||= 100.map do~
+      state.angle_z ||= 0
+** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
-      state.stars           ||= 100.map do
-** Processing line: ~        [rand.add(2).to_square(grid.w_half.randomize(:sign, :ratio),~
+    end
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-        [rand.add(2).to_square(grid.w_half.randomize(:sign, :ratio),
-** Processing line: ~                               grid.h_half.randomize(:sign, :ratio)),~
+
+** Processing line: ~    def matrix_new x0, y0, z0, w0, x1, y1, z1, w1, x2, y2, z2, w2, x3, y3, z3, w3~
 - Inside source: true
 *** True Line Result
-                               grid.h_half.randomize(:sign, :ratio)),
-** Processing line: ~         128 + 128.randomize(:ratio), 255, 255]~
+    def matrix_new x0, y0, z0, w0, x1, y1, z1, w1, x2, y2, z2, w2, x3, y3, z3, w3
+** Processing line: ~      (hmap x: (hmap x: x0, y: y0, z: z0, w: w0),~
 - Inside source: true
 *** True Line Result
-         128 + 128.randomize(:ratio), 255, 255]
-** Processing line: ~      end~
+      (hmap x: (hmap x: x0, y: y0, z: z0, w: w0),
+** Processing line: ~            y: (hmap x: x1, y: y1, z: z1, w: w1),~
 - Inside source: true
 *** True Line Result
-      end
+            y: (hmap x: x1, y: y1, z: z1, w: w1),
+** Processing line: ~            z: (hmap x: x2, y: y2, z: z2, w: w2),~
+- Inside source: true
+*** True Line Result
+            z: (hmap x: x2, y: y2, z: z2, w: w2),
+** Processing line: ~            w: (hmap x: x3, y: y3, z: z3, w: w3))~
+- Inside source: true
+*** True Line Result
+            w: (hmap x: x3, y: y3, z: z3, w: w3))
 ** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
@@ -91931,106 +93363,106 @@ Follows is a source code listing for all files that have been open sourced. This
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~    def default_ship x, y, angle, sprite_path, bullet_sprite_path, color~
+** Processing line: ~    def angle_z_matrix degrees~
 - Inside source: true
 *** True Line Result
-    def default_ship x, y, angle, sprite_path, bullet_sprite_path, color
-** Processing line: ~      state.new_entity(:ship,~
+    def angle_z_matrix degrees
+** Processing line: ~      cos_t = Math.cos degrees.to_radians~
 - Inside source: true
 *** True Line Result
-      state.new_entity(:ship,
-** Processing line: ~                      { x: x,~
+      cos_t = Math.cos degrees.to_radians
+** Processing line: ~      sin_t = Math.sin degrees.to_radians~
 - Inside source: true
 *** True Line Result
-                      { x: x,
-** Processing line: ~                        y: y,~
+      sin_t = Math.sin degrees.to_radians
+** Processing line: ~      (matrix_new cos_t, -sin_t, 0, 0,~
 - Inside source: true
 *** True Line Result
-                        y: y,
-** Processing line: ~                        dy: 0,~
+      (matrix_new cos_t, -sin_t, 0, 0,
+** Processing line: ~                  sin_t,  cos_t, 0, 0,~
 - Inside source: true
 *** True Line Result
-                        dy: 0,
-** Processing line: ~                        dx: 0,~
+                  sin_t,  cos_t, 0, 0,
+** Processing line: ~                  0,      0,     1, 0,~
 - Inside source: true
 *** True Line Result
-                        dx: 0,
-** Processing line: ~                        damage: 0,~
+                  0,      0,     1, 0,
+** Processing line: ~                  0,      0,     0, 1)~
 - Inside source: true
 *** True Line Result
-                        damage: 0,
-** Processing line: ~                        dead: false,~
+                  0,      0,     0, 1)
+** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
-                        dead: false,
-** Processing line: ~                        angle: angle,~
+    end
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-                        angle: angle,
-** Processing line: ~                        max_alpha: 255,~
+
+** Processing line: ~    def angle_y_matrix degrees~
 - Inside source: true
 *** True Line Result
-                        max_alpha: 255,
-** Processing line: ~                        sprite_path: sprite_path,~
+    def angle_y_matrix degrees
+** Processing line: ~      cos_t = Math.cos degrees.to_radians~
 - Inside source: true
 *** True Line Result
-                        sprite_path: sprite_path,
-** Processing line: ~                        bullet_sprite_path: bullet_sprite_path,~
+      cos_t = Math.cos degrees.to_radians
+** Processing line: ~      sin_t = Math.sin degrees.to_radians~
 - Inside source: true
 *** True Line Result
-                        bullet_sprite_path: bullet_sprite_path,
-** Processing line: ~                        color: color })~
+      sin_t = Math.sin degrees.to_radians
+** Processing line: ~      (matrix_new  cos_t,  0, sin_t, 0,~
 - Inside source: true
 *** True Line Result
-                        color: color })
-** Processing line: ~    end~
+      (matrix_new  cos_t,  0, sin_t, 0,
+** Processing line: ~                   0,      1, 0,     0,~
 - Inside source: true
 *** True Line Result
-    end
-** Processing line: ~~
+                   0,      1, 0,     0,
+** Processing line: ~                   -sin_t, 0, cos_t, 0,~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~    def new_red_ship~
+                   -sin_t, 0, cos_t, 0,
+** Processing line: ~                   0,      0, 0,     1)~
 - Inside source: true
 *** True Line Result
-    def new_red_ship
-** Processing line: ~      default_ship(400, 250.randomize(:sign, :ratio),~
+                   0,      0, 0,     1)
+** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
-      default_ship(400, 250.randomize(:sign, :ratio),
-** Processing line: ~                   180, 'sprites/ship_red.png', 'sprites/red_bullet.png',~
+    end
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-                   180, 'sprites/ship_red.png', 'sprites/red_bullet.png',
-** Processing line: ~                   [255, 90, 90])~
+
+** Processing line: ~    def angle_x_matrix degrees~
 - Inside source: true
 *** True Line Result
-                   [255, 90, 90])
-** Processing line: ~    end~
+    def angle_x_matrix degrees
+** Processing line: ~      cos_t = Math.cos degrees.to_radians~
 - Inside source: true
 *** True Line Result
-    end
-** Processing line: ~~
+      cos_t = Math.cos degrees.to_radians
+** Processing line: ~      sin_t = Math.sin degrees.to_radians~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~    def new_blue_ship~
+      sin_t = Math.sin degrees.to_radians
+** Processing line: ~      (matrix_new  1,     0,      0, 0,~
 - Inside source: true
 *** True Line Result
-    def new_blue_ship
-** Processing line: ~      default_ship(-400, 250.randomize(:sign, :ratio),~
+      (matrix_new  1,     0,      0, 0,
+** Processing line: ~                   0, cos_t, -sin_t, 0,~
 - Inside source: true
 *** True Line Result
-      default_ship(-400, 250.randomize(:sign, :ratio),
-** Processing line: ~                   0, 'sprites/ship_blue.png', 'sprites/blue_bullet.png',~
+                   0, cos_t, -sin_t, 0,
+** Processing line: ~                   0, sin_t,  cos_t, 0,~
 - Inside source: true
 *** True Line Result
-                   0, 'sprites/ship_blue.png', 'sprites/blue_bullet.png',
-** Processing line: ~                   [110, 140, 255])~
+                   0, sin_t,  cos_t, 0,
+** Processing line: ~                   0,     0,      0, 1)~
 - Inside source: true
 *** True Line Result
-                   [110, 140, 255])
+                   0,     0,      0, 1)
 ** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
@@ -92039,34 +93471,26 @@ Follows is a source code listing for all files that have been open sourced. This
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~    def render~
-- Inside source: true
-*** True Line Result
-    def render
-** Processing line: ~      render_instructions~
-- Inside source: true
-*** True Line Result
-      render_instructions
-** Processing line: ~      render_score~
+** Processing line: ~    def scale_matrix factor~
 - Inside source: true
 *** True Line Result
-      render_score
-** Processing line: ~      render_universe~
+    def scale_matrix factor
+** Processing line: ~      (matrix_new factor,      0,      0, 0,~
 - Inside source: true
 *** True Line Result
-      render_universe
-** Processing line: ~      render_flames~
+      (matrix_new factor,      0,      0, 0,
+** Processing line: ~                  0,      factor,      0, 0,~
 - Inside source: true
 *** True Line Result
-      render_flames
-** Processing line: ~      render_ships~
+                  0,      factor,      0, 0,
+** Processing line: ~                  0,           0, factor, 0,~
 - Inside source: true
 *** True Line Result
-      render_ships
-** Processing line: ~      render_bullets~
+                  0,           0, factor, 0,
+** Processing line: ~                  0,           0,      0, 1)~
 - Inside source: true
 *** True Line Result
-      render_bullets
+                  0,           0,      0, 1)
 ** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
@@ -92075,258 +93499,258 @@ Follows is a source code listing for all files that have been open sourced. This
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~    def render_ships~
+** Processing line: ~    def input~
 - Inside source: true
 *** True Line Result
-    def render_ships
-** Processing line: ~      update_ship_outputs(state.ship_blue)~
+    def input
+** Processing line: ~      if (inputs.keyboard.shift && inputs.keyboard.p)~
 - Inside source: true
 *** True Line Result
-      update_ship_outputs(state.ship_blue)
-** Processing line: ~      update_ship_outputs(state.ship_red)~
+      if (inputs.keyboard.shift && inputs.keyboard.p)
+** Processing line: ~        state.scale -= 0.1~
 - Inside source: true
 *** True Line Result
-      update_ship_outputs(state.ship_red)
-** Processing line: ~      outputs.sprites << [state.ship_blue.sprite, state.ship_red.sprite]~
+        state.scale -= 0.1
+** Processing line: ~      elsif  inputs.keyboard.p~
 - Inside source: true
 *** True Line Result
-      outputs.sprites << [state.ship_blue.sprite, state.ship_red.sprite]
-** Processing line: ~      outputs.labels  << [state.ship_blue.label, state.ship_red.label]~
+      elsif  inputs.keyboard.p
+** Processing line: ~        state.scale += 0.1~
 - Inside source: true
 *** True Line Result
-      outputs.labels  << [state.ship_blue.label, state.ship_red.label]
-** Processing line: ~    end~
+        state.scale += 0.1
+** Processing line: ~      end~
 - Inside source: true
 *** True Line Result
-    end
+      end
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~    def render_instructions~
+** Processing line: ~      if inputs.mouse.wheel~
 - Inside source: true
 *** True Line Result
-    def render_instructions
-** Processing line: ~      return if state.ship_blue.dx  > 0  || state.ship_blue.dy > 0  ||~
+      if inputs.mouse.wheel
+** Processing line: ~        state.scale += inputs.mouse.wheel.y~
 - Inside source: true
 *** True Line Result
-      return if state.ship_blue.dx  > 0  || state.ship_blue.dy > 0  ||
-** Processing line: ~                state.ship_red.dx   > 0  || state.ship_red.dy  > 0  ||~
+        state.scale += inputs.mouse.wheel.y
+** Processing line: ~      end~
 - Inside source: true
 *** True Line Result
-                state.ship_red.dx   > 0  || state.ship_red.dy  > 0  ||
-** Processing line: ~                state.flames.length > 0~
+      end
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-                state.flames.length > 0
+
+** Processing line: ~      state.scale = state.scale.clamp(0.1, 1000)~
+- Inside source: true
+*** True Line Result
+      state.scale = state.scale.clamp(0.1, 1000)
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~      outputs.labels << [grid.left.shift_right(30),~
+** Processing line: ~      if (inputs.keyboard.shift && inputs.keyboard.y) || inputs.keyboard.right~
 - Inside source: true
 *** True Line Result
-      outputs.labels << [grid.left.shift_right(30),
-** Processing line: ~                         grid.bottom.shift_up(30),~
+      if (inputs.keyboard.shift && inputs.keyboard.y) || inputs.keyboard.right
+** Processing line: ~        state.angle_y += 1~
 - Inside source: true
 *** True Line Result
-                         grid.bottom.shift_up(30),
-** Processing line: ~                         "Two gamepads needed to play. R1 to accelerate. Left and right on D-PAD to turn ship. Hold A to shoot. Press B to drop mines.",~
+        state.angle_y += 1
+** Processing line: ~      elsif (inputs.keyboard.y) || inputs.keyboard.left~
 - Inside source: true
 *** True Line Result
-                         "Two gamepads needed to play. R1 to accelerate. Left and right on D-PAD to turn ship. Hold A to shoot. Press B to drop mines.",
-** Processing line: ~                         0, 0, 255, 255, 255]~
+      elsif (inputs.keyboard.y) || inputs.keyboard.left
+** Processing line: ~        state.angle_y -= 1~
 - Inside source: true
 *** True Line Result
-                         0, 0, 255, 255, 255]
-** Processing line: ~    end~
+        state.angle_y -= 1
+** Processing line: ~      end~
 - Inside source: true
 *** True Line Result
-    end
+      end
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~    def calc~
-- Inside source: true
-*** True Line Result
-    def calc
-** Processing line: ~      calc_thrusts~
+** Processing line: ~      if (inputs.keyboard.shift && inputs.keyboard.x) || inputs.keyboard.down~
 - Inside source: true
 *** True Line Result
-      calc_thrusts
-** Processing line: ~      calc_ships~
+      if (inputs.keyboard.shift && inputs.keyboard.x) || inputs.keyboard.down
+** Processing line: ~        state.angle_x -= 1~
 - Inside source: true
 *** True Line Result
-      calc_ships
-** Processing line: ~      calc_bullets~
+        state.angle_x -= 1
+** Processing line: ~      elsif (inputs.keyboard.x || inputs.keyboard.up)~
 - Inside source: true
 *** True Line Result
-      calc_bullets
-** Processing line: ~      calc_winner~
+      elsif (inputs.keyboard.x || inputs.keyboard.up)
+** Processing line: ~        state.angle_x += 1~
 - Inside source: true
 *** True Line Result
-      calc_winner
-** Processing line: ~    end~
+        state.angle_x += 1
+** Processing line: ~      end~
 - Inside source: true
 *** True Line Result
-    end
+      end
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~    def input~
+** Processing line: ~      if inputs.keyboard.shift && inputs.keyboard.z~
 - Inside source: true
 *** True Line Result
-    def input
-** Processing line: ~      input_accelerate~
+      if inputs.keyboard.shift && inputs.keyboard.z
+** Processing line: ~        state.angle_z += 1~
 - Inside source: true
 *** True Line Result
-      input_accelerate
-** Processing line: ~      input_turn~
+        state.angle_z += 1
+** Processing line: ~      elsif inputs.keyboard.z~
 - Inside source: true
 *** True Line Result
-      input_turn
-** Processing line: ~      input_bullets_and_mines~
+      elsif inputs.keyboard.z
+** Processing line: ~        state.angle_z -= 1~
 - Inside source: true
 *** True Line Result
-      input_bullets_and_mines
-** Processing line: ~    end~
+        state.angle_z -= 1
+** Processing line: ~      end~
 - Inside source: true
 *** True Line Result
-    end
+      end
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~    def render_score~
+** Processing line: ~      if inputs.keyboard.zero~
 - Inside source: true
 *** True Line Result
-    def render_score
-** Processing line: ~      outputs.labels << [grid.left.shift_right(80),~
+      if inputs.keyboard.zero
+** Processing line: ~        state.angle_x = 0~
 - Inside source: true
 *** True Line Result
-      outputs.labels << [grid.left.shift_right(80),
-** Processing line: ~                         grid.top.shift_down(40),~
+        state.angle_x = 0
+** Processing line: ~        state.angle_y = 0~
 - Inside source: true
 *** True Line Result
-                         grid.top.shift_down(40),
-** Processing line: ~                         state.ship_blue_score, 30, 1, state.ship_blue.color]~
+        state.angle_y = 0
+** Processing line: ~        state.angle_z = 0~
 - Inside source: true
 *** True Line Result
-                         state.ship_blue_score, 30, 1, state.ship_blue.color]
+        state.angle_z = 0
+** Processing line: ~      end~
+- Inside source: true
+*** True Line Result
+      end
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~      outputs.labels << [grid.right.shift_left(80),~
+** Processing line: ~      angle_x = state.angle_x~
 - Inside source: true
 *** True Line Result
-      outputs.labels << [grid.right.shift_left(80),
-** Processing line: ~                         grid.top.shift_down(40),~
+      angle_x = state.angle_x
+** Processing line: ~      angle_y = state.angle_y~
 - Inside source: true
 *** True Line Result
-                         grid.top.shift_down(40),
-** Processing line: ~                         state.ship_red_score,  30, 1, state.ship_red.color]~
+      angle_y = state.angle_y
+** Processing line: ~      angle_z = state.angle_z~
 - Inside source: true
 *** True Line Result
-                         state.ship_red_score,  30, 1, state.ship_red.color]
-** Processing line: ~    end~
+      angle_z = state.angle_z
+** Processing line: ~      scale   = state.scale~
 - Inside source: true
 *** True Line Result
-    end
+      scale   = state.scale
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~    def render_universe~
-- Inside source: true
-*** True Line Result
-    def render_universe
-** Processing line: ~      return if outputs.static_solids.any?~
+** Processing line: ~      s_matrix = scale_matrix state.scale~
 - Inside source: true
 *** True Line Result
-      return if outputs.static_solids.any?
-** Processing line: ~      outputs.static_solids << grid.rect~
+      s_matrix = scale_matrix state.scale
+** Processing line: ~      x_matrix = angle_z_matrix angle_z~
 - Inside source: true
 *** True Line Result
-      outputs.static_solids << grid.rect
-** Processing line: ~      outputs.static_solids << state.stars~
+      x_matrix = angle_z_matrix angle_z
+** Processing line: ~      y_matrix = angle_y_matrix angle_y~
 - Inside source: true
 *** True Line Result
-      outputs.static_solids << state.stars
-** Processing line: ~    end~
+      y_matrix = angle_y_matrix angle_y
+** Processing line: ~      z_matrix = angle_x_matrix angle_x~
 - Inside source: true
 *** True Line Result
-    end
+      z_matrix = angle_x_matrix angle_x
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~    def apply_round_finished_alpha entity~
+** Processing line: ~      state.shifted_points = state.points.map do |point|~
 - Inside source: true
 *** True Line Result
-    def apply_round_finished_alpha entity
-** Processing line: ~      return entity unless state.round_finished_debounce~
+      state.shifted_points = state.points.map do |point|
+** Processing line: ~        (matrix_mul s_matrix,~
 - Inside source: true
 *** True Line Result
-      return entity unless state.round_finished_debounce
-** Processing line: ~      entity.a *= state.round_finished_debounce.percentage_of(2.seconds)~
+        (matrix_mul s_matrix,
+** Processing line: ~                    (matrix_mul z_matrix,~
 - Inside source: true
 *** True Line Result
-      entity.a *= state.round_finished_debounce.percentage_of(2.seconds)
-** Processing line: ~      return entity~
+                    (matrix_mul z_matrix,
+** Processing line: ~                                (matrix_mul x_matrix,~
 - Inside source: true
 *** True Line Result
-      return entity
-** Processing line: ~    end~
+                                (matrix_mul x_matrix,
+** Processing line: ~                                            (matrix_mul y_matrix, point)))).merge(original: point)~
 - Inside source: true
 *** True Line Result
-    end
-** Processing line: ~~
+                                            (matrix_mul y_matrix, point)))).merge(original: point)
+** Processing line: ~      end~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~    def update_ship_outputs ship, sprite_size = 66~
+      end
+** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
-    def update_ship_outputs ship, sprite_size = 66
-** Processing line: ~      ship.sprite =~
+    end
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-      ship.sprite =
-** Processing line: ~        apply_round_finished_alpha [sprite_size.to_square(ship.x, ship.y),~
+
+** Processing line: ~    def thick_line line~
 - Inside source: true
 *** True Line Result
-        apply_round_finished_alpha [sprite_size.to_square(ship.x, ship.y),
-** Processing line: ~                                    ship.sprite_path,~
+    def thick_line line
+** Processing line: ~      [~
 - Inside source: true
 *** True Line Result
-                                    ship.sprite_path,
-** Processing line: ~                                    ship.angle,~
+      [
+** Processing line: ~        line.merge(y: line.y - 1, y2: line.y2 - 1, r: 0, g: 0, b: 0),~
 - Inside source: true
 *** True Line Result
-                                    ship.angle,
-** Processing line: ~                                    ship.dead ? 0 : 255 * ship.created_at.ease(2.seconds)].sprite~
+        line.merge(y: line.y - 1, y2: line.y2 - 1, r: 0, g: 0, b: 0),
+** Processing line: ~        line.merge(x: line.x - 1, x2: line.x2 - 1, r: 0, g: 0, b: 0),~
 - Inside source: true
 *** True Line Result
-                                    ship.dead ? 0 : 255 * ship.created_at.ease(2.seconds)].sprite
-** Processing line: ~      ship.label =~
+        line.merge(x: line.x - 1, x2: line.x2 - 1, r: 0, g: 0, b: 0),
+** Processing line: ~        line.merge(x: line.x - 0, x2: line.x2 - 0, r: 0, g: 0, b: 0),~
 - Inside source: true
 *** True Line Result
-      ship.label =
-** Processing line: ~        apply_round_finished_alpha [ship.x,~
+        line.merge(x: line.x - 0, x2: line.x2 - 0, r: 0, g: 0, b: 0),
+** Processing line: ~        line.merge(y: line.y + 1, y2: line.y2 + 1, r: 0, g: 0, b: 0),~
 - Inside source: true
 *** True Line Result
-        apply_round_finished_alpha [ship.x,
-** Processing line: ~                                    ship.y + 100,~
+        line.merge(y: line.y + 1, y2: line.y2 + 1, r: 0, g: 0, b: 0),
+** Processing line: ~        line.merge(x: line.x + 1, x2: line.x2 + 1, r: 0, g: 0, b: 0)~
 - Inside source: true
 *** True Line Result
-                                    ship.y + 100,
-** Processing line: ~                                    "." * 5.minus(ship.damage).greater(0), 20, 1, ship.color, 255].label~
+        line.merge(x: line.x + 1, x2: line.x2 + 1, r: 0, g: 0, b: 0)
+** Processing line: ~      ]~
 - Inside source: true
 *** True Line Result
-                                    "." * 5.minus(ship.damage).greater(0), 20, 1, ship.color, 255].label
+      ]
 ** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
@@ -92335,306 +93759,310 @@ Follows is a source code listing for all files that have been open sourced. This
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~    def render_flames sprite_size = 6~
+** Processing line: ~    def render~
 - Inside source: true
 *** True Line Result
-    def render_flames sprite_size = 6
-** Processing line: ~      outputs.sprites << state.flames.map do |p|~
+    def render
+** Processing line: ~      outputs.lines << state.shifted_points.each_slice(2).map do |(p1, p2)|~
 - Inside source: true
 *** True Line Result
-      outputs.sprites << state.flames.map do |p|
-** Processing line: ~        apply_round_finished_alpha [sprite_size.to_square(p.x, p.y),~
+      outputs.lines << state.shifted_points.each_slice(2).map do |(p1, p2)|
+** Processing line: ~        perc = 0~
 - Inside source: true
 *** True Line Result
-        apply_round_finished_alpha [sprite_size.to_square(p.x, p.y),
-** Processing line: ~                                    'sprites/flame.png', 0,~
+        perc = 0
+** Processing line: ~        thick_line({ x:  p1.x.*(10) + 640, y:  p1.y.*(10) + 320,~
 - Inside source: true
 *** True Line Result
-                                    'sprites/flame.png', 0,
-** Processing line: ~                                    p.max_alpha * p.created_at.ease(p.lifetime, :flip)].sprite~
+        thick_line({ x:  p1.x.*(10) + 640, y:  p1.y.*(10) + 320,
+** Processing line: ~                     x2: p2.x.*(10) + 640, y2: p2.y.*(10) + 320,~
 - Inside source: true
 *** True Line Result
-                                    p.max_alpha * p.created_at.ease(p.lifetime, :flip)].sprite
-** Processing line: ~      end~
+                     x2: p2.x.*(10) + 640, y2: p2.y.*(10) + 320,
+** Processing line: ~                     r: 255 * perc,~
 - Inside source: true
 *** True Line Result
-      end
-** Processing line: ~    end~
+                     r: 255 * perc,
+** Processing line: ~                     g: 255 * perc,~
 - Inside source: true
 *** True Line Result
-    end
+                     g: 255 * perc,
+** Processing line: ~                     b: 255 * perc })~
+- Inside source: true
+*** True Line Result
+                     b: 255 * perc })
+** Processing line: ~      end~
+- Inside source: true
+*** True Line Result
+      end
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~    def render_bullets sprite_size = 10~
+** Processing line: ~      outputs.labels << [ 10, 700, "angle_x: #{state.angle_x.to_sf}", 0]~
 - Inside source: true
 *** True Line Result
-    def render_bullets sprite_size = 10
-** Processing line: ~      outputs.sprites << state.bullets.map do |b|~
+      outputs.labels << [ 10, 700, "angle_x: #{state.angle_x.to_sf}", 0]
+** Processing line: ~      outputs.labels << [ 10, 670, "x, shift+x", 0]~
 - Inside source: true
 *** True Line Result
-      outputs.sprites << state.bullets.map do |b|
-** Processing line: ~        apply_round_finished_alpha [b.sprite_size.to_square(b.x, b.y),~
+      outputs.labels << [ 10, 670, "x, shift+x", 0]
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-        apply_round_finished_alpha [b.sprite_size.to_square(b.x, b.y),
-** Processing line: ~                                    b.owner.bullet_sprite_path,~
+
+** Processing line: ~      outputs.labels << [210, 700, "angle_y: #{state.angle_y.to_sf}", 0]~
 - Inside source: true
 *** True Line Result
-                                    b.owner.bullet_sprite_path,
-** Processing line: ~                                    0, b.max_alpha].sprite~
+      outputs.labels << [210, 700, "angle_y: #{state.angle_y.to_sf}", 0]
+** Processing line: ~      outputs.labels << [210, 670, "y, shift+y", 0]~
 - Inside source: true
 *** True Line Result
-                                    0, b.max_alpha].sprite
-** Processing line: ~      end~
+      outputs.labels << [210, 670, "y, shift+y", 0]
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-      end
-** Processing line: ~    end~
+
+** Processing line: ~      outputs.labels << [410, 700, "angle_z: #{state.angle_z.to_sf}", 0]~
 - Inside source: true
 *** True Line Result
-    end
-** Processing line: ~~
+      outputs.labels << [410, 700, "angle_z: #{state.angle_z.to_sf}", 0]
+** Processing line: ~      outputs.labels << [410, 670, "z, shift+z", 0]~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~    def wrap_location! location~
+      outputs.labels << [410, 670, "z, shift+z", 0]
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-    def wrap_location! location
-** Processing line: ~      location.x = grid.left    if location.x > grid.right~
+
+** Processing line: ~      outputs.labels << [610, 700, "scale: #{state.scale.to_sf}", 0]~
 - Inside source: true
 *** True Line Result
-      location.x = grid.left    if location.x > grid.right
-** Processing line: ~      location.x = grid.right   if location.x < grid.left~
+      outputs.labels << [610, 700, "scale: #{state.scale.to_sf}", 0]
+** Processing line: ~      outputs.labels << [610, 670, "p, shift+p", 0]~
 - Inside source: true
 *** True Line Result
-      location.x = grid.right   if location.x < grid.left
-** Processing line: ~      location.y = grid.top     if location.y < grid.bottom~
+      outputs.labels << [610, 670, "p, shift+p", 0]
+** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
-      location.y = grid.top     if location.y < grid.bottom
-** Processing line: ~      location.y = grid.bottom  if location.y > grid.top~
+    end
+** Processing line: ~  end~
 - Inside source: true
 *** True Line Result
-      location.y = grid.bottom  if location.y > grid.top
-** Processing line: ~      location~
+  end
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-      location
-** Processing line: ~    end~
+
+** Processing line: ~  $game = Game.new~
 - Inside source: true
 *** True Line Result
-    end
+  $game = Game.new
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~    def calc_thrusts~
-- Inside source: true
-*** True Line Result
-    def calc_thrusts
-** Processing line: ~      state.flames =~
+** Processing line: ~  def tick args~
 - Inside source: true
 *** True Line Result
-      state.flames =
-** Processing line: ~        state.flames~
+  def tick args
+** Processing line: ~    $game.args = args~
 - Inside source: true
 *** True Line Result
-        state.flames
-** Processing line: ~          .reject(&:old?)~
+    $game.args = args
+** Processing line: ~    $game.tick~
 - Inside source: true
 *** True Line Result
-          .reject(&:old?)
-** Processing line: ~          .map do |p|~
+    $game.tick
+** Processing line: ~  end~
 - Inside source: true
 *** True Line Result
-          .map do |p|
-** Processing line: ~            p.speed *= 0.9~
+  end
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-            p.speed *= 0.9
-** Processing line: ~            p.y += p.angle.vector_y(p.speed)~
+
+** Processing line: ~  def set_angles x, y, z~
 - Inside source: true
 *** True Line Result
-            p.y += p.angle.vector_y(p.speed)
-** Processing line: ~            p.x += p.angle.vector_x(p.speed)~
+  def set_angles x, y, z
+** Processing line: ~    $game.state.angle_x = x~
 - Inside source: true
 *** True Line Result
-            p.x += p.angle.vector_x(p.speed)
-** Processing line: ~            wrap_location! p~
+    $game.state.angle_x = x
+** Processing line: ~    $game.state.angle_y = y~
 - Inside source: true
 *** True Line Result
-            wrap_location! p
-** Processing line: ~        end~
+    $game.state.angle_y = y
+** Processing line: ~    $game.state.angle_z = z~
 - Inside source: true
 *** True Line Result
-        end
-** Processing line: ~    end~
+    $game.state.angle_z = z
+** Processing line: ~  end~
 - Inside source: true
 *** True Line Result
-    end
+  end
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~    def all_ships~
+** Processing line: ~  $gtk.reset~
 - Inside source: true
 *** True Line Result
-    def all_ships
-** Processing line: ~      [state.ship_blue, state.ship_red]~
+  $gtk.reset
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-      [state.ship_blue, state.ship_red]
-** Processing line: ~    end~
-- Inside source: true
+
+** Processing line: ~#+end_src~
+- Line was identified as the end of a code block.
 *** True Line Result
-    end
+#+end_src
 ** Processing line: ~~
-- Inside source: true
+- End of paragraph detected.
 *** True Line Result
 
-** Processing line: ~    def alive_ships~
-- Inside source: true
+** Processing line: ~*** Arcade - Bullet Hell - main.rb~
+- Header detected.
 *** True Line Result
-    def alive_ships
-** Processing line: ~      all_ships.reject { |s| s.dead }~
-- Inside source: true
+
 *** True Line Result
-      all_ships.reject { |s| s.dead }
-** Processing line: ~    end~
+*** Arcade - Bullet Hell - main.rb
+** Processing line: ~#+begin_src ruby~
+- Line was identified as the beginning of a code block.
+*** True Line Result
+
+*** True Line Result
+#+begin_src ruby
+** Processing line: ~  # ./samples/99_genre_arcade/bullet_hell/app/main.rb~
 - Inside source: true
 *** True Line Result
-    end
-** Processing line: ~~
+  # ./samples/99_genre_arcade/bullet_hell/app/main.rb
+** Processing line: ~  def tick args~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~    def calc_bullet bullet~
+  def tick args
+** Processing line: ~    args.state.base_columns   ||= 10.times.map { |n| 50 * n + 1280 / 2 - 5 * 50 + 5 }~
 - Inside source: true
 *** True Line Result
-    def calc_bullet bullet
-** Processing line: ~      bullet.y += bullet.angle.vector_y(bullet.speed)~
+    args.state.base_columns   ||= 10.times.map { |n| 50 * n + 1280 / 2 - 5 * 50 + 5 }
+** Processing line: ~    args.state.base_rows      ||= 5.times.map { |n| 50 * n + 720 - 5 * 50 }~
 - Inside source: true
 *** True Line Result
-      bullet.y += bullet.angle.vector_y(bullet.speed)
-** Processing line: ~      bullet.x += bullet.angle.vector_x(bullet.speed)~
+    args.state.base_rows      ||= 5.times.map { |n| 50 * n + 720 - 5 * 50 }
+** Processing line: ~    args.state.offset_columns = 10.times.map { |n| (n - 4.5) * Math.sin(Kernel.tick_count.to_radians) * 12 }~
 - Inside source: true
 *** True Line Result
-      bullet.x += bullet.angle.vector_x(bullet.speed)
-** Processing line: ~      wrap_location! bullet~
+    args.state.offset_columns = 10.times.map { |n| (n - 4.5) * Math.sin(Kernel.tick_count.to_radians) * 12 }
+** Processing line: ~    args.state.offset_rows    = 5.map { 0 }~
 - Inside source: true
 *** True Line Result
-      wrap_location! bullet
-** Processing line: ~      explode_bullet! bullet if bullet.old?~
+    args.state.offset_rows    = 5.map { 0 }
+** Processing line: ~    args.state.columns        = 10.times.map { |i| args.state.base_columns[i] + args.state.offset_columns[i] }~
 - Inside source: true
 *** True Line Result
-      explode_bullet! bullet if bullet.old?
-** Processing line: ~      return if bullet.exploded~
+    args.state.columns        = 10.times.map { |i| args.state.base_columns[i] + args.state.offset_columns[i] }
+** Processing line: ~    args.state.rows           = 5.times.map { |i| args.state.base_rows[i] + args.state.offset_rows[i] }~
 - Inside source: true
 *** True Line Result
-      return if bullet.exploded
-** Processing line: ~      return if state.round_finished~
+    args.state.rows           = 5.times.map { |i| args.state.base_rows[i] + args.state.offset_rows[i] }
+** Processing line: ~    args.state.explosions     ||= []~
 - Inside source: true
 *** True Line Result
-      return if state.round_finished
-** Processing line: ~      alive_ships.each do |s|~
+    args.state.explosions     ||= []
+** Processing line: ~    args.state.enemies        ||= []~
 - Inside source: true
 *** True Line Result
-      alive_ships.each do |s|
-** Processing line: ~        if s != bullet.owner &&~
+    args.state.enemies        ||= []
+** Processing line: ~    args.state.score          ||= 0~
 - Inside source: true
 *** True Line Result
-        if s != bullet.owner &&
-** Processing line: ~           s.sprite.intersect_rect?(bullet.sprite_size.to_square(bullet.x, bullet.y))~
+    args.state.score          ||= 0
+** Processing line: ~    args.state.wave           ||= 0~
 - Inside source: true
 *** True Line Result
-           s.sprite.intersect_rect?(bullet.sprite_size.to_square(bullet.x, bullet.y))
-** Processing line: ~          explode_bullet! bullet, 10, 5, 30~
+    args.state.wave           ||= 0
+** Processing line: ~    if args.state.enemies.empty?~
 - Inside source: true
 *** True Line Result
-          explode_bullet! bullet, 10, 5, 30
-** Processing line: ~          s.damage += 1~
+    if args.state.enemies.empty?
+** Processing line: ~      args.state.wave      += 1~
 - Inside source: true
 *** True Line Result
-          s.damage += 1
-** Processing line: ~        end~
+      args.state.wave      += 1
+** Processing line: ~      args.state.wave_root = Math.sqrt(args.state.wave)~
 - Inside source: true
 *** True Line Result
-        end
-** Processing line: ~      end~
+      args.state.wave_root = Math.sqrt(args.state.wave)
+** Processing line: ~      args.state.enemies   = make_enemies~
 - Inside source: true
 *** True Line Result
-      end
+      args.state.enemies   = make_enemies
 ** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
     end
-** Processing line: ~~
-- Inside source: true
-*** True Line Result
-
-** Processing line: ~    def calc_bullets~
+** Processing line: ~    args.state.player         ||= {x: 620, y: 80, w: 40, h: 40, path: 'sprites/circle-gray.png', angle: 90, cooldown: 0, alive: true}~
 - Inside source: true
 *** True Line Result
-    def calc_bullets
-** Processing line: ~      state.bullets.each    { |b| calc_bullet b }~
+    args.state.player         ||= {x: 620, y: 80, w: 40, h: 40, path: 'sprites/circle-gray.png', angle: 90, cooldown: 0, alive: true}
+** Processing line: ~    args.state.enemy_bullets  ||= []~
 - Inside source: true
 *** True Line Result
-      state.bullets.each    { |b| calc_bullet b }
-** Processing line: ~      state.bullets.reject! { |b| b.exploded }~
+    args.state.enemy_bullets  ||= []
+** Processing line: ~    args.state.player_bullets ||= []~
 - Inside source: true
 *** True Line Result
-      state.bullets.reject! { |b| b.exploded }
-** Processing line: ~    end~
+    args.state.player_bullets ||= []
+** Processing line: ~    args.state.lives          ||= 3~
 - Inside source: true
 *** True Line Result
-    end
-** Processing line: ~~
+    args.state.lives          ||= 3
+** Processing line: ~    args.state.missed_shots   ||= 0~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~    def create_explosion! type, entity, flame_count, max_speed, lifetime, max_alpha = 255~
+    args.state.missed_shots   ||= 0
+** Processing line: ~    args.state.fired_shots    ||= 0~
 - Inside source: true
 *** True Line Result
-    def create_explosion! type, entity, flame_count, max_speed, lifetime, max_alpha = 255
-** Processing line: ~      flame_count.times do~
+    args.state.fired_shots    ||= 0
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-      flame_count.times do
-** Processing line: ~        state.flames << state.new_entity(type,~
+
+** Processing line: ~    update_explosions args~
 - Inside source: true
 *** True Line Result
-        state.flames << state.new_entity(type,
-** Processing line: ~                                       { angle: 360.randomize(:ratio),~
+    update_explosions args
+** Processing line: ~    update_enemy_positions args~
 - Inside source: true
 *** True Line Result
-                                       { angle: 360.randomize(:ratio),
-** Processing line: ~                                         speed: max_speed.randomize(:ratio),~
+    update_enemy_positions args
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-                                         speed: max_speed.randomize(:ratio),
-** Processing line: ~                                         lifetime: lifetime,~
+
+** Processing line: ~    if args.inputs.left && args.state.player[:x] > (300 + 5)~
 - Inside source: true
 *** True Line Result
-                                         lifetime: lifetime,
-** Processing line: ~                                         x: entity.x,~
+    if args.inputs.left && args.state.player[:x] > (300 + 5)
+** Processing line: ~      args.state.player[:x] -= 5~
 - Inside source: true
 *** True Line Result
-                                         x: entity.x,
-** Processing line: ~                                         y: entity.y,~
+      args.state.player[:x] -= 5
+** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
-                                         y: entity.y,
-** Processing line: ~                                         max_alpha: max_alpha })~
+    end
+** Processing line: ~    if args.inputs.right && args.state.player[:x] < (1280 - args.state.player[:w] - 300 - 5)~
 - Inside source: true
 *** True Line Result
-                                         max_alpha: max_alpha })
-** Processing line: ~      end~
+    if args.inputs.right && args.state.player[:x] < (1280 - args.state.player[:w] - 300 - 5)
+** Processing line: ~      args.state.player[:x] += 5~
 - Inside source: true
 *** True Line Result
-      end
+      args.state.player[:x] += 5
 ** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
@@ -92643,62 +94071,34 @@ Follows is a source code listing for all files that have been open sourced. This
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~    def explode_bullet! bullet, flame_override = 5, max_speed = 5, lifetime = 10~
-- Inside source: true
-*** True Line Result
-    def explode_bullet! bullet, flame_override = 5, max_speed = 5, lifetime = 10
-** Processing line: ~      bullet.exploded = true~
-- Inside source: true
-*** True Line Result
-      bullet.exploded = true
-** Processing line: ~      create_explosion! :bullet_explosion,~
-- Inside source: true
-*** True Line Result
-      create_explosion! :bullet_explosion,
-** Processing line: ~                        bullet,~
-- Inside source: true
-*** True Line Result
-                        bullet,
-** Processing line: ~                        flame_override,~
-- Inside source: true
-*** True Line Result
-                        flame_override,
-** Processing line: ~                        max_speed,~
+** Processing line: ~    args.state.enemy_bullets.each do |bullet|~
 - Inside source: true
 *** True Line Result
-                        max_speed,
-** Processing line: ~                        lifetime,~
+    args.state.enemy_bullets.each do |bullet|
+** Processing line: ~      bullet[:x] += bullet[:dx]~
 - Inside source: true
 *** True Line Result
-                        lifetime,
-** Processing line: ~                        bullet.max_alpha~
+      bullet[:x] += bullet[:dx]
+** Processing line: ~      bullet[:y] += bullet[:dy]~
 - Inside source: true
 *** True Line Result
-                        bullet.max_alpha
+      bullet[:y] += bullet[:dy]
 ** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
     end
-** Processing line: ~~
-- Inside source: true
-*** True Line Result
-
-** Processing line: ~    def calc_ship ship~
-- Inside source: true
-*** True Line Result
-    def calc_ship ship
-** Processing line: ~      ship.x += ship.dx~
+** Processing line: ~    args.state.player_bullets.each do |bullet|~
 - Inside source: true
 *** True Line Result
-      ship.x += ship.dx
-** Processing line: ~      ship.y += ship.dy~
+    args.state.player_bullets.each do |bullet|
+** Processing line: ~      bullet[:x] += bullet[:dx]~
 - Inside source: true
 *** True Line Result
-      ship.y += ship.dy
-** Processing line: ~      wrap_location! ship~
+      bullet[:x] += bullet[:dx]
+** Processing line: ~      bullet[:y] += bullet[:dy]~
 - Inside source: true
 *** True Line Result
-      wrap_location! ship
+      bullet[:y] += bullet[:dy]
 ** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
@@ -92707,34 +94107,38 @@ Follows is a source code listing for all files that have been open sourced. This
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~    def calc_ships~
+** Processing line: ~    args.state.enemy_bullets  = args.state.enemy_bullets.find_all { |bullet| bullet[:y].between?(-16, 736) }~
 - Inside source: true
 *** True Line Result
-    def calc_ships
-** Processing line: ~      all_ships.each { |s| calc_ship s }~
+    args.state.enemy_bullets  = args.state.enemy_bullets.find_all { |bullet| bullet[:y].between?(-16, 736) }
+** Processing line: ~    args.state.player_bullets = args.state.player_bullets.find_all do |bullet|~
 - Inside source: true
 *** True Line Result
-      all_ships.each { |s| calc_ship s }
-** Processing line: ~      return if all_ships.any? { |s| s.dead }~
+    args.state.player_bullets = args.state.player_bullets.find_all do |bullet|
+** Processing line: ~      if bullet[:y].between?(-16, 736)~
 - Inside source: true
 *** True Line Result
-      return if all_ships.any? { |s| s.dead }
-** Processing line: ~      return if state.round_finished~
+      if bullet[:y].between?(-16, 736)
+** Processing line: ~        true~
 - Inside source: true
 *** True Line Result
-      return if state.round_finished
-** Processing line: ~      return unless state.ship_blue.sprite.intersect_rect?(state.ship_red.sprite)~
+        true
+** Processing line: ~      else~
 - Inside source: true
 *** True Line Result
-      return unless state.ship_blue.sprite.intersect_rect?(state.ship_red.sprite)
-** Processing line: ~      state.ship_blue.damage = 5~
+      else
+** Processing line: ~        args.state.missed_shots += 1~
 - Inside source: true
 *** True Line Result
-      state.ship_blue.damage = 5
-** Processing line: ~      state.ship_red.damage  = 5~
+        args.state.missed_shots += 1
+** Processing line: ~        false~
 - Inside source: true
 *** True Line Result
-      state.ship_red.damage  = 5
+        false
+** Processing line: ~      end~
+- Inside source: true
+*** True Line Result
+      end
 ** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
@@ -92743,118 +94147,118 @@ Follows is a source code listing for all files that have been open sourced. This
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~    def create_thruster_flames! ship~
+** Processing line: ~    args.state.enemies = args.state.enemies.reject do |enemy|~
 - Inside source: true
 *** True Line Result
-    def create_thruster_flames! ship
-** Processing line: ~      state.flames << state.new_entity(:ship_thruster,~
+    args.state.enemies = args.state.enemies.reject do |enemy|
+** Processing line: ~      if args.state.player[:alive] && 1500 > (args.state.player[:x] - enemy[:x]) ** 2 + (args.state.player[:y] - enemy[:y]) ** 2~
 - Inside source: true
 *** True Line Result
-      state.flames << state.new_entity(:ship_thruster,
-** Processing line: ~                                     { angle: ship.angle + 180 + 60.randomize(:sign, :ratio),~
+      if args.state.player[:alive] && 1500 > (args.state.player[:x] - enemy[:x]) ** 2 + (args.state.player[:y] - enemy[:y]) ** 2
+** Processing line: ~        args.state.explosions << {x: enemy[:x] + 4, y: enemy[:y] + 4, w: 32, h: 32, path: 'sprites/explosion-0.png', age: 0}~
 - Inside source: true
 *** True Line Result
-                                     { angle: ship.angle + 180 + 60.randomize(:sign, :ratio),
-** Processing line: ~                                       speed: 5.randomize(:ratio),~
+        args.state.explosions << {x: enemy[:x] + 4, y: enemy[:y] + 4, w: 32, h: 32, path: 'sprites/explosion-0.png', age: 0}
+** Processing line: ~        args.state.explosions << {x: args.state.player[:x] + 4, y: args.state.player[:y] + 4, w: 32, h: 32, path: 'sprites/explosion-0.png', age: 0}~
 - Inside source: true
 *** True Line Result
-                                       speed: 5.randomize(:ratio),
-** Processing line: ~                                       max_alpha: 255 * ship.created_at_elapsed.percentage_of(2.seconds),~
+        args.state.explosions << {x: args.state.player[:x] + 4, y: args.state.player[:y] + 4, w: 32, h: 32, path: 'sprites/explosion-0.png', age: 0}
+** Processing line: ~        args.state.player[:alive] = false~
 - Inside source: true
 *** True Line Result
-                                       max_alpha: 255 * ship.created_at_elapsed.percentage_of(2.seconds),
-** Processing line: ~                                       lifetime: 30,~
+        args.state.player[:alive] = false
+** Processing line: ~        true~
 - Inside source: true
 *** True Line Result
-                                       lifetime: 30,
-** Processing line: ~                                       x: ship.x - ship.angle.vector_x(40) + 5.randomize(:sign, :ratio),~
+        true
+** Processing line: ~      else~
 - Inside source: true
 *** True Line Result
-                                       x: ship.x - ship.angle.vector_x(40) + 5.randomize(:sign, :ratio),
-** Processing line: ~                                       y: ship.y - ship.angle.vector_y(40) + 5.randomize(:sign, :ratio) })~
+      else
+** Processing line: ~        false~
 - Inside source: true
 *** True Line Result
-                                       y: ship.y - ship.angle.vector_y(40) + 5.randomize(:sign, :ratio) })
-** Processing line: ~    end~
+        false
+** Processing line: ~      end~
 - Inside source: true
 *** True Line Result
-    end
-** Processing line: ~~
+      end
+** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~    def input_accelerate_ship should_move_ship, ship~
+    end
+** Processing line: ~    args.state.enemy_bullets.each do |bullet|~
 - Inside source: true
 *** True Line Result
-    def input_accelerate_ship should_move_ship, ship
-** Processing line: ~      return if ship.dead~
+    args.state.enemy_bullets.each do |bullet|
+** Processing line: ~      if args.state.player[:alive] && 400 > (args.state.player[:x] - bullet[:x] + 12) ** 2 + (args.state.player[:y] - bullet[:y] + 12) ** 2~
 - Inside source: true
 *** True Line Result
-      return if ship.dead
-** Processing line: ~~
+      if args.state.player[:alive] && 400 > (args.state.player[:x] - bullet[:x] + 12) ** 2 + (args.state.player[:y] - bullet[:y] + 12) ** 2
+** Processing line: ~        args.state.explosions << {x: args.state.player[:x] + 4, y: args.state.player[:y] + 4, w: 32, h: 32, path: 'sprites/explosion-0.png', age: 0}~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~      should_move_ship &&= (ship.dx + ship.dy).abs < 5~
+        args.state.explosions << {x: args.state.player[:x] + 4, y: args.state.player[:y] + 4, w: 32, h: 32, path: 'sprites/explosion-0.png', age: 0}
+** Processing line: ~        args.state.player[:alive] = false~
 - Inside source: true
 *** True Line Result
-      should_move_ship &&= (ship.dx + ship.dy).abs < 5
-** Processing line: ~~
+        args.state.player[:alive] = false
+** Processing line: ~        bullet[:despawn]          = true~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~      if should_move_ship~
+        bullet[:despawn]          = true
+** Processing line: ~      end~
 - Inside source: true
 *** True Line Result
-      if should_move_ship
-** Processing line: ~        create_thruster_flames! ship~
+      end
+** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
-        create_thruster_flames! ship
-** Processing line: ~        ship.dx += ship.angle.vector_x 0.050~
+    end
+** Processing line: ~    args.state.enemies = args.state.enemies.reject do |enemy|~
 - Inside source: true
 *** True Line Result
-        ship.dx += ship.angle.vector_x 0.050
-** Processing line: ~        ship.dy += ship.angle.vector_y 0.050~
+    args.state.enemies = args.state.enemies.reject do |enemy|
+** Processing line: ~      args.state.player_bullets.any? do |bullet|~
 - Inside source: true
 *** True Line Result
-        ship.dy += ship.angle.vector_y 0.050
-** Processing line: ~      else~
+      args.state.player_bullets.any? do |bullet|
+** Processing line: ~        if 400 > (enemy[:x] - bullet[:x] + 12) ** 2 + (enemy[:y] - bullet[:y] + 12) ** 2~
 - Inside source: true
 *** True Line Result
-      else
-** Processing line: ~        ship.dx *= 0.99~
+        if 400 > (enemy[:x] - bullet[:x] + 12) ** 2 + (enemy[:y] - bullet[:y] + 12) ** 2
+** Processing line: ~          args.state.explosions << {x: enemy[:x] + 4, y: enemy[:y] + 4, w: 32, h: 32, path: 'sprites/explosion-0.png', age: 0}~
 - Inside source: true
 *** True Line Result
-        ship.dx *= 0.99
-** Processing line: ~        ship.dy *= 0.99~
+          args.state.explosions << {x: enemy[:x] + 4, y: enemy[:y] + 4, w: 32, h: 32, path: 'sprites/explosion-0.png', age: 0}
+** Processing line: ~          bullet[:despawn] = true~
 - Inside source: true
 *** True Line Result
-        ship.dy *= 0.99
-** Processing line: ~      end~
+          bullet[:despawn] = true
+** Processing line: ~          args.state.score += 1000 * args.state.wave~
 - Inside source: true
 *** True Line Result
-      end
-** Processing line: ~    end~
+          args.state.score += 1000 * args.state.wave
+** Processing line: ~          true~
 - Inside source: true
 *** True Line Result
-    end
-** Processing line: ~~
+          true
+** Processing line: ~        else~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~    def input_accelerate~
+        else
+** Processing line: ~          false~
 - Inside source: true
 *** True Line Result
-    def input_accelerate
-** Processing line: ~      input_accelerate_ship inputs.controller_one.key_held.r1 || inputs.keyboard.up, state.ship_blue~
+          false
+** Processing line: ~        end~
 - Inside source: true
 *** True Line Result
-      input_accelerate_ship inputs.controller_one.key_held.r1 || inputs.keyboard.up, state.ship_blue
-** Processing line: ~      input_accelerate_ship inputs.controller_two.key_held.r1, state.ship_red~
+        end
+** Processing line: ~      end~
 - Inside source: true
 *** True Line Result
-      input_accelerate_ship inputs.controller_two.key_held.r1, state.ship_red
+      end
 ** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
@@ -92863,206 +94267,178 @@ Follows is a source code listing for all files that have been open sourced. This
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~    def input_turn_ship direction, ship~
-- Inside source: true
-*** True Line Result
-    def input_turn_ship direction, ship
-** Processing line: ~      ship.angle -= 3 * direction~
+** Processing line: ~    args.state.player_bullets = args.state.player_bullets.reject { |bullet| bullet[:despawn] }~
 - Inside source: true
 *** True Line Result
-      ship.angle -= 3 * direction
-** Processing line: ~    end~
+    args.state.player_bullets = args.state.player_bullets.reject { |bullet| bullet[:despawn] }
+** Processing line: ~    args.state.enemy_bullets  = args.state.enemy_bullets.reject { |bullet| bullet[:despawn] }~
 - Inside source: true
 *** True Line Result
-    end
+    args.state.enemy_bullets  = args.state.enemy_bullets.reject { |bullet| bullet[:despawn] }
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~    def input_turn~
-- Inside source: true
-*** True Line Result
-    def input_turn
-** Processing line: ~      input_turn_ship inputs.controller_one.left_right + inputs.keyboard.left_right, state.ship_blue~
-- Inside source: true
-*** True Line Result
-      input_turn_ship inputs.controller_one.left_right + inputs.keyboard.left_right, state.ship_blue
-** Processing line: ~      input_turn_ship inputs.controller_two.left_right, state.ship_red~
-- Inside source: true
-*** True Line Result
-      input_turn_ship inputs.controller_two.left_right, state.ship_red
-** Processing line: ~    end~
+** Processing line: ~    args.state.player[:cooldown] -= 1~
 - Inside source: true
 *** True Line Result
-    end
-** Processing line: ~~
+    args.state.player[:cooldown] -= 1
+** Processing line: ~    if args.inputs.keyboard.key_held.space && args.state.player[:cooldown] <= 0 && args.state.player[:alive]~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~    def input_bullet create_bullet, ship~
+    if args.inputs.keyboard.key_held.space && args.state.player[:cooldown] <= 0 && args.state.player[:alive]
+** Processing line: ~      args.state.player_bullets << {x: args.state.player[:x] + 12, y: args.state.player[:y] + 28, w: 16, h: 16, path: 'sprites/star.png', dx: 0, dy: 8}.sprite~
 - Inside source: true
 *** True Line Result
-    def input_bullet create_bullet, ship
-** Processing line: ~      return unless create_bullet~
+      args.state.player_bullets << {x: args.state.player[:x] + 12, y: args.state.player[:y] + 28, w: 16, h: 16, path: 'sprites/star.png', dx: 0, dy: 8}.sprite
+** Processing line: ~      args.state.fired_shots       += 1~
 - Inside source: true
 *** True Line Result
-      return unless create_bullet
-** Processing line: ~      return if ship.dead~
+      args.state.fired_shots       += 1
+** Processing line: ~      args.state.player[:cooldown] = 10 + 20 / args.state.wave~
 - Inside source: true
 *** True Line Result
-      return if ship.dead
-** Processing line: ~~
+      args.state.player[:cooldown] = 10 + 20 / args.state.wave
+** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~      state.bullets << state.new_entity(:ship_bullet,~
+    end
+** Processing line: ~    args.state.enemies.each do |enemy|~
 - Inside source: true
 *** True Line Result
-      state.bullets << state.new_entity(:ship_bullet,
-** Processing line: ~                                      { owner: ship,~
+    args.state.enemies.each do |enemy|
+** Processing line: ~      if Math.rand < 0.0005 + 0.0005 * args.state.wave && args.state.player[:alive] && enemy[:move_state] == :normal~
 - Inside source: true
 *** True Line Result
-                                      { owner: ship,
-** Processing line: ~                                        angle: ship.angle,~
+      if Math.rand < 0.0005 + 0.0005 * args.state.wave && args.state.player[:alive] && enemy[:move_state] == :normal
+** Processing line: ~        args.state.enemy_bullets << {x: enemy[:x] + 12, y: enemy[:y] - 8, w: 16, h: 16, path: 'sprites/star.png', dx: 0, dy: -3 - args.state.wave_root}.sprite~
 - Inside source: true
 *** True Line Result
-                                        angle: ship.angle,
-** Processing line: ~                                        max_alpha: 255 * ship.created_at_elapsed.percentage_of(2.seconds),~
+        args.state.enemy_bullets << {x: enemy[:x] + 12, y: enemy[:y] - 8, w: 16, h: 16, path: 'sprites/star.png', dx: 0, dy: -3 - args.state.wave_root}.sprite
+** Processing line: ~      end~
 - Inside source: true
 *** True Line Result
-                                        max_alpha: 255 * ship.created_at_elapsed.percentage_of(2.seconds),
-** Processing line: ~                                        speed: 5 + ship.dx.mult(ship.angle.vector_x) + ship.dy.mult(ship.angle.vector_y),~
+      end
+** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
-                                        speed: 5 + ship.dx.mult(ship.angle.vector_x) + ship.dy.mult(ship.angle.vector_y),
-** Processing line: ~                                        lifetime: 120,~
+    end
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-                                        lifetime: 120,
-** Processing line: ~                                        sprite_size: 10,~
+
+** Processing line: ~    args.outputs.background_color = [0, 0, 0]~
 - Inside source: true
 *** True Line Result
-                                        sprite_size: 10,
-** Processing line: ~                                        x: ship.x + ship.angle.vector_x * 32,~
+    args.outputs.background_color = [0, 0, 0]
+** Processing line: ~    args.outputs.primitives << args.state.enemies.map do |enemy|~
 - Inside source: true
 *** True Line Result
-                                        x: ship.x + ship.angle.vector_x * 32,
-** Processing line: ~                                        y: ship.y + ship.angle.vector_y * 32 })~
+    args.outputs.primitives << args.state.enemies.map do |enemy|
+** Processing line: ~      [enemy[:x], enemy[:y], 40, 40, enemy[:path], -90].sprite~
 - Inside source: true
 *** True Line Result
-                                        y: ship.y + ship.angle.vector_y * 32 })
+      [enemy[:x], enemy[:y], 40, 40, enemy[:path], -90].sprite
 ** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
     end
-** Processing line: ~~
+** Processing line: ~    args.outputs.primitives << args.state.player if args.state.player[:alive]~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~    def input_mine create_mine, ship~
+    args.outputs.primitives << args.state.player if args.state.player[:alive]
+** Processing line: ~    args.outputs.primitives << args.state.explosions~
 - Inside source: true
 *** True Line Result
-    def input_mine create_mine, ship
-** Processing line: ~      return unless create_mine~
+    args.outputs.primitives << args.state.explosions
+** Processing line: ~    args.outputs.primitives << args.state.player_bullets~
 - Inside source: true
 *** True Line Result
-      return unless create_mine
-** Processing line: ~      return if ship.dead~
+    args.outputs.primitives << args.state.player_bullets
+** Processing line: ~    args.outputs.primitives << args.state.enemy_bullets~
 - Inside source: true
 *** True Line Result
-      return if ship.dead
-** Processing line: ~~
+    args.outputs.primitives << args.state.enemy_bullets
+** Processing line: ~    accuracy = args.state.fired_shots.zero? ? 1 : (args.state.fired_shots - args.state.missed_shots) / args.state.fired_shots~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~      state.bullets << state.new_entity(:ship_bullet,~
+    accuracy = args.state.fired_shots.zero? ? 1 : (args.state.fired_shots - args.state.missed_shots) / args.state.fired_shots
+** Processing line: ~    args.outputs.primitives << [~
 - Inside source: true
 *** True Line Result
-      state.bullets << state.new_entity(:ship_bullet,
-** Processing line: ~                                      { owner: ship,~
+    args.outputs.primitives << [
+** Processing line: ~      [0, 0, 300, 720, 96, 0, 0].solid,~
 - Inside source: true
 *** True Line Result
-                                      { owner: ship,
-** Processing line: ~                                        angle: 360.randomize(:sign, :ratio),~
+      [0, 0, 300, 720, 96, 0, 0].solid,
+** Processing line: ~      [1280 - 300, 0, 300, 720, 96, 0, 0].solid,~
 - Inside source: true
 *** True Line Result
-                                        angle: 360.randomize(:sign, :ratio),
-** Processing line: ~                                        max_alpha: 255 * ship.created_at_elapsed.percentage_of(2.seconds),~
+      [1280 - 300, 0, 300, 720, 96, 0, 0].solid,
+** Processing line: ~      [1280 - 290, 60, "Wave     #{args.state.wave}", 255, 255, 255].label,~
 - Inside source: true
 *** True Line Result
-                                        max_alpha: 255 * ship.created_at_elapsed.percentage_of(2.seconds),
-** Processing line: ~                                        speed: 0.02,~
+      [1280 - 290, 60, "Wave     #{args.state.wave}", 255, 255, 255].label,
+** Processing line: ~      [1280 - 290, 40, "Accuracy #{(accuracy * 100).floor}%", 255, 255, 255].label,~
 - Inside source: true
 *** True Line Result
-                                        speed: 0.02,
-** Processing line: ~                                        sprite_size: 10,~
+      [1280 - 290, 40, "Accuracy #{(accuracy * 100).floor}%", 255, 255, 255].label,
+** Processing line: ~      [1280 - 290, 20, "Score    #{(args.state.score * accuracy).floor}", 255, 255, 255].label,~
 - Inside source: true
 *** True Line Result
-                                        sprite_size: 10,
-** Processing line: ~                                        lifetime: 600,~
+      [1280 - 290, 20, "Score    #{(args.state.score * accuracy).floor}", 255, 255, 255].label,
+** Processing line: ~    ]~
 - Inside source: true
 *** True Line Result
-                                        lifetime: 600,
-** Processing line: ~                                        x: ship.x + ship.angle.vector_x * -50,~
+    ]
+** Processing line: ~    args.outputs.primitives << args.state.lives.times.map do |n|~
 - Inside source: true
 *** True Line Result
-                                        x: ship.x + ship.angle.vector_x * -50,
-** Processing line: ~                                        y: ship.y + ship.angle.vector_y * -50 })~
+    args.outputs.primitives << args.state.lives.times.map do |n|
+** Processing line: ~      [1280 - 290 + 50 * n, 80, 40, 40, 'sprites/circle-gray.png', 90].sprite~
 - Inside source: true
 *** True Line Result
-                                        y: ship.y + ship.angle.vector_y * -50 })
+      [1280 - 290 + 50 * n, 80, 40, 40, 'sprites/circle-gray.png', 90].sprite
 ** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
     end
-** Processing line: ~~
-- Inside source: true
-*** True Line Result
-
-** Processing line: ~    def input_bullets_and_mines~
-- Inside source: true
-*** True Line Result
-    def input_bullets_and_mines
-** Processing line: ~      return if state.bullets.length > 100~
+** Processing line: ~    #args.outputs.debug << args.gtk.framerate_diagnostics_primitives~
 - Inside source: true
 *** True Line Result
-      return if state.bullets.length > 100
+    #args.outputs.debug << args.gtk.framerate_diagnostics_primitives
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~      [~
-- Inside source: true
-*** True Line Result
-      [
-** Processing line: ~        [inputs.controller_one.key_held.a || inputs.keyboard.key_held.space,~
+** Processing line: ~    if (!args.state.player[:alive]) && args.state.enemy_bullets.empty? && args.state.explosions.empty? && args.state.enemies.all? { |enemy| enemy[:move_state] == :normal }~
 - Inside source: true
 *** True Line Result
-        [inputs.controller_one.key_held.a || inputs.keyboard.key_held.space,
-** Processing line: ~         inputs.controller_one.key_down.b || inputs.keyboard.key_down.down,~
+    if (!args.state.player[:alive]) && args.state.enemy_bullets.empty? && args.state.explosions.empty? && args.state.enemies.all? { |enemy| enemy[:move_state] == :normal }
+** Processing line: ~      args.state.player[:alive] = true~
 - Inside source: true
 *** True Line Result
-         inputs.controller_one.key_down.b || inputs.keyboard.key_down.down,
-** Processing line: ~         state.ship_blue],~
+      args.state.player[:alive] = true
+** Processing line: ~      args.state.player[:x]     = 624~
 - Inside source: true
 *** True Line Result
-         state.ship_blue],
-** Processing line: ~        [inputs.controller_two.key_held.a, inputs.controller_two.key_down.b, state.ship_red]~
+      args.state.player[:x]     = 624
+** Processing line: ~      args.state.player[:y]     = 80~
 - Inside source: true
 *** True Line Result
-        [inputs.controller_two.key_held.a, inputs.controller_two.key_down.b, state.ship_red]
-** Processing line: ~      ].each do |a_held, b_down, ship|~
+      args.state.player[:y]     = 80
+** Processing line: ~      args.state.lives          -= 1~
 - Inside source: true
 *** True Line Result
-      ].each do |a_held, b_down, ship|
-** Processing line: ~        input_bullet(a_held && state.tick_count.mod_zero?(10).or(a_held == 0), ship)~
+      args.state.lives          -= 1
+** Processing line: ~      if args.state.lives == -1~
 - Inside source: true
 *** True Line Result
-        input_bullet(a_held && state.tick_count.mod_zero?(10).or(a_held == 0), ship)
-** Processing line: ~        input_mine(b_down, ship)~
+      if args.state.lives == -1
+** Processing line: ~        args.state.clear!~
 - Inside source: true
 *** True Line Result
-        input_mine(b_down, ship)
+        args.state.clear!
 ** Processing line: ~      end~
 - Inside source: true
 *** True Line Result
@@ -93071,266 +94447,254 @@ Follows is a source code listing for all files that have been open sourced. This
 - Inside source: true
 *** True Line Result
     end
-** Processing line: ~~
+** Processing line: ~  end~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~    def calc_kill_ships~
+  end
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-    def calc_kill_ships
-** Processing line: ~      alive_ships.find_all { |s| s.damage >= 5 }.each do |s|~
+
+** Processing line: ~  def make_enemies~
 - Inside source: true
 *** True Line Result
-      alive_ships.find_all { |s| s.damage >= 5 }.each do |s|
-** Processing line: ~        s.dead = true~
+  def make_enemies
+** Processing line: ~    enemies = []~
 - Inside source: true
 *** True Line Result
-        s.dead = true
-** Processing line: ~        create_explosion! :ship_explosion, s, 20, 20, 30, s.max_alpha~
+    enemies = []
+** Processing line: ~    enemies += 10.times.map { |n| {x: Math.rand * 1280 * 2 - 640, y: Math.rand * 720 * 2 + 720, row: 0, col: n, path: 'sprites/circle-orange.png', move_state: :retreat} }~
 - Inside source: true
 *** True Line Result
-        create_explosion! :ship_explosion, s, 20, 20, 30, s.max_alpha
-** Processing line: ~      end~
+    enemies += 10.times.map { |n| {x: Math.rand * 1280 * 2 - 640, y: Math.rand * 720 * 2 + 720, row: 0, col: n, path: 'sprites/circle-orange.png', move_state: :retreat} }
+** Processing line: ~    enemies += 10.times.map { |n| {x: Math.rand * 1280 * 2 - 640, y: Math.rand * 720 * 2 + 720, row: 1, col: n, path: 'sprites/circle-orange.png', move_state: :retreat} }~
 - Inside source: true
 *** True Line Result
-      end
-** Processing line: ~    end~
+    enemies += 10.times.map { |n| {x: Math.rand * 1280 * 2 - 640, y: Math.rand * 720 * 2 + 720, row: 1, col: n, path: 'sprites/circle-orange.png', move_state: :retreat} }
+** Processing line: ~    enemies += 8.times.map { |n| {x: Math.rand * 1280 * 2 - 640, y: Math.rand * 720 * 2 + 720, row: 2, col: n + 1, path: 'sprites/circle-blue.png', move_state: :retreat} }~
 - Inside source: true
 *** True Line Result
-    end
-** Processing line: ~~
+    enemies += 8.times.map { |n| {x: Math.rand * 1280 * 2 - 640, y: Math.rand * 720 * 2 + 720, row: 2, col: n + 1, path: 'sprites/circle-blue.png', move_state: :retreat} }
+** Processing line: ~    enemies += 8.times.map { |n| {x: Math.rand * 1280 * 2 - 640, y: Math.rand * 720 * 2 + 720, row: 3, col: n + 1, path: 'sprites/circle-blue.png', move_state: :retreat} }~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~    def calc_score~
+    enemies += 8.times.map { |n| {x: Math.rand * 1280 * 2 - 640, y: Math.rand * 720 * 2 + 720, row: 3, col: n + 1, path: 'sprites/circle-blue.png', move_state: :retreat} }
+** Processing line: ~    enemies += 4.times.map { |n| {x: Math.rand * 1280 * 2 - 640, y: Math.rand * 720 * 2 + 720, row: 4, col: n + 3, path: 'sprites/circle-green.png', move_state: :retreat} }~
 - Inside source: true
 *** True Line Result
-    def calc_score
-** Processing line: ~      return if state.round_finished~
+    enemies += 4.times.map { |n| {x: Math.rand * 1280 * 2 - 640, y: Math.rand * 720 * 2 + 720, row: 4, col: n + 3, path: 'sprites/circle-green.png', move_state: :retreat} }
+** Processing line: ~    enemies~
 - Inside source: true
 *** True Line Result
-      return if state.round_finished
-** Processing line: ~      return if alive_ships.length > 1~
+    enemies
+** Processing line: ~  end~
 - Inside source: true
 *** True Line Result
-      return if alive_ships.length > 1
+  end
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~      if alive_ships.first == state.ship_red~
-- Inside source: true
-*** True Line Result
-      if alive_ships.first == state.ship_red
-** Processing line: ~        state.ship_red_score += 1~
+** Processing line: ~  def update_explosions args~
 - Inside source: true
 *** True Line Result
-        state.ship_red_score += 1
-** Processing line: ~      elsif alive_ships.first == state.ship_blue~
+  def update_explosions args
+** Processing line: ~    args.state.explosions.each do |explosion|~
 - Inside source: true
 *** True Line Result
-      elsif alive_ships.first == state.ship_blue
-** Processing line: ~        state.ship_blue_score += 1~
+    args.state.explosions.each do |explosion|
+** Processing line: ~      explosion[:age]  += 0.5~
 - Inside source: true
 *** True Line Result
-        state.ship_blue_score += 1
-** Processing line: ~      end~
+      explosion[:age]  += 0.5
+** Processing line: ~      explosion[:path] = "sprites/explosion-#{explosion[:age].floor}.png"~
 - Inside source: true
 *** True Line Result
-      end
-** Processing line: ~~
+      explosion[:path] = "sprites/explosion-#{explosion[:age].floor}.png"
+** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~      state.round_finished = true~
+    end
+** Processing line: ~    args.state.explosions = args.state.explosions.reject { |explosion| explosion[:age] >= 7 }~
 - Inside source: true
 *** True Line Result
-      state.round_finished = true
-** Processing line: ~    end~
+    args.state.explosions = args.state.explosions.reject { |explosion| explosion[:age] >= 7 }
+** Processing line: ~  end~
 - Inside source: true
 *** True Line Result
-    end
+  end
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~    def calc_reset_ships~
+** Processing line: ~  def update_enemy_positions args~
 - Inside source: true
 *** True Line Result
-    def calc_reset_ships
-** Processing line: ~      return unless state.round_finished~
+  def update_enemy_positions args
+** Processing line: ~    args.state.enemies.each do |enemy|~
 - Inside source: true
 *** True Line Result
-      return unless state.round_finished
-** Processing line: ~      state.round_finished_debounce ||= 2.seconds~
+    args.state.enemies.each do |enemy|
+** Processing line: ~      if enemy[:move_state] == :normal~
 - Inside source: true
 *** True Line Result
-      state.round_finished_debounce ||= 2.seconds
-** Processing line: ~      state.round_finished_debounce -= 1~
+      if enemy[:move_state] == :normal
+** Processing line: ~        enemy[:x]          = args.state.columns[enemy[:col]]~
 - Inside source: true
 *** True Line Result
-      state.round_finished_debounce -= 1
-** Processing line: ~      return if state.round_finished_debounce > 0~
+        enemy[:x]          = args.state.columns[enemy[:col]]
+** Processing line: ~        enemy[:y]          = args.state.rows[enemy[:row]]~
 - Inside source: true
 *** True Line Result
-      return if state.round_finished_debounce > 0
-** Processing line: ~      start_new_round!~
+        enemy[:y]          = args.state.rows[enemy[:row]]
+** Processing line: ~        enemy[:move_state] = :dive if Math.rand < 0.0002 + 0.00005 * args.state.wave && args.state.player[:alive]~
 - Inside source: true
 *** True Line Result
-      start_new_round!
-** Processing line: ~    end~
+        enemy[:move_state] = :dive if Math.rand < 0.0002 + 0.00005 * args.state.wave && args.state.player[:alive]
+** Processing line: ~      elsif enemy[:move_state] == :dive~
 - Inside source: true
 *** True Line Result
-    end
-** Processing line: ~~
+      elsif enemy[:move_state] == :dive
+** Processing line: ~        enemy[:target_x] ||= args.state.player[:x]~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~    def start_new_round!~
+        enemy[:target_x] ||= args.state.player[:x]
+** Processing line: ~        enemy[:target_y] ||= args.state.player[:y]~
 - Inside source: true
 *** True Line Result
-    def start_new_round!
-** Processing line: ~      state.ship_blue = new_blue_ship~
+        enemy[:target_y] ||= args.state.player[:y]
+** Processing line: ~        dx               = enemy[:target_x] - enemy[:x]~
 - Inside source: true
 *** True Line Result
-      state.ship_blue = new_blue_ship
-** Processing line: ~      state.ship_red  = new_red_ship~
+        dx               = enemy[:target_x] - enemy[:x]
+** Processing line: ~        dy               = enemy[:target_y] - enemy[:y]~
 - Inside source: true
 *** True Line Result
-      state.ship_red  = new_red_ship
-** Processing line: ~      state.round_finished = false~
+        dy               = enemy[:target_y] - enemy[:y]
+** Processing line: ~        vel              = Math.sqrt(dx * dx + dy * dy)~
 - Inside source: true
 *** True Line Result
-      state.round_finished = false
-** Processing line: ~      state.round_finished_debounce = nil~
+        vel              = Math.sqrt(dx * dx + dy * dy)
+** Processing line: ~        speed_limit      = 2 + args.state.wave_root~
 - Inside source: true
 *** True Line Result
-      state.round_finished_debounce = nil
-** Processing line: ~      state.flames.clear~
+        speed_limit      = 2 + args.state.wave_root
+** Processing line: ~        if vel > speed_limit~
 - Inside source: true
 *** True Line Result
-      state.flames.clear
-** Processing line: ~      state.bullets.clear~
+        if vel > speed_limit
+** Processing line: ~          dx /= vel / speed_limit~
 - Inside source: true
 *** True Line Result
-      state.bullets.clear
-** Processing line: ~    end~
+          dx /= vel / speed_limit
+** Processing line: ~          dy /= vel / speed_limit~
 - Inside source: true
 *** True Line Result
-    end
-** Processing line: ~~
+          dy /= vel / speed_limit
+** Processing line: ~        end~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~    def calc_winner~
+        end
+** Processing line: ~        if vel < 1 || !args.state.player[:alive]~
 - Inside source: true
 *** True Line Result
-    def calc_winner
-** Processing line: ~      calc_kill_ships~
+        if vel < 1 || !args.state.player[:alive]
+** Processing line: ~          enemy[:move_state] = :retreat~
 - Inside source: true
 *** True Line Result
-      calc_kill_ships
-** Processing line: ~      calc_score~
+          enemy[:move_state] = :retreat
+** Processing line: ~        end~
 - Inside source: true
 *** True Line Result
-      calc_score
-** Processing line: ~      calc_reset_ships~
+        end
+** Processing line: ~        enemy[:x] += dx~
 - Inside source: true
 *** True Line Result
-      calc_reset_ships
-** Processing line: ~    end~
+        enemy[:x] += dx
+** Processing line: ~        enemy[:y] += dy~
 - Inside source: true
 *** True Line Result
-    end
-** Processing line: ~  end~
+        enemy[:y] += dy
+** Processing line: ~      elsif enemy[:move_state] == :retreat~
 - Inside source: true
 *** True Line Result
-  end
-** Processing line: ~~
+      elsif enemy[:move_state] == :retreat
+** Processing line: ~        enemy[:target_x] = args.state.columns[enemy[:col]]~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~  $dueling_spaceship = DuelingSpaceships.new~
+        enemy[:target_x] = args.state.columns[enemy[:col]]
+** Processing line: ~        enemy[:target_y] = args.state.rows[enemy[:row]]~
 - Inside source: true
 *** True Line Result
-  $dueling_spaceship = DuelingSpaceships.new
-** Processing line: ~~
+        enemy[:target_y] = args.state.rows[enemy[:row]]
+** Processing line: ~        dx               = enemy[:target_x] - enemy[:x]~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~  def tick args~
+        dx               = enemy[:target_x] - enemy[:x]
+** Processing line: ~        dy               = enemy[:target_y] - enemy[:y]~
 - Inside source: true
 *** True Line Result
-  def tick args
-** Processing line: ~    args.grid.origin_center!~
+        dy               = enemy[:target_y] - enemy[:y]
+** Processing line: ~        vel              = Math.sqrt(dx * dx + dy * dy)~
 - Inside source: true
 *** True Line Result
-    args.grid.origin_center!
-** Processing line: ~    $dueling_spaceship.inputs  = args.inputs~
+        vel              = Math.sqrt(dx * dx + dy * dy)
+** Processing line: ~        speed_limit      = 2 + args.state.wave_root~
 - Inside source: true
 *** True Line Result
-    $dueling_spaceship.inputs  = args.inputs
-** Processing line: ~    $dueling_spaceship.outputs = args.outputs~
+        speed_limit      = 2 + args.state.wave_root
+** Processing line: ~        if vel > speed_limit~
 - Inside source: true
 *** True Line Result
-    $dueling_spaceship.outputs = args.outputs
-** Processing line: ~    $dueling_spaceship.state    = args.state~
+        if vel > speed_limit
+** Processing line: ~          dx /= vel / speed_limit~
 - Inside source: true
 *** True Line Result
-    $dueling_spaceship.state    = args.state
-** Processing line: ~    $dueling_spaceship.grid    = args.grid~
+          dx /= vel / speed_limit
+** Processing line: ~          dy /= vel / speed_limit~
 - Inside source: true
 *** True Line Result
-    $dueling_spaceship.grid    = args.grid
-** Processing line: ~    $dueling_spaceship.tick~
+          dy /= vel / speed_limit
+** Processing line: ~        elsif vel < 1~
 - Inside source: true
 *** True Line Result
-    $dueling_spaceship.tick
-** Processing line: ~  end~
+        elsif vel < 1
+** Processing line: ~          enemy[:move_state] = :normal~
 - Inside source: true
 *** True Line Result
-  end
-** Processing line: ~~
+          enemy[:move_state] = :normal
+** Processing line: ~          enemy[:target_x]   = nil~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~#+end_src~
-- Line was identified as the end of a code block.
-*** True Line Result
-#+end_src
-** Processing line: ~~
-- End of paragraph detected.
-*** True Line Result
-
-** Processing line: ~*** arcade/flappy dragon/credits.txt~
-- Header detected.
-*** True Line Result
-
+          enemy[:target_x]   = nil
+** Processing line: ~          enemy[:target_y]   = nil~
+- Inside source: true
 *** True Line Result
-*** arcade/flappy dragon/credits.txt
-** Processing line: ~#+begin_src ruby~
-- Line was identified as the beginning of a code block.
+          enemy[:target_y]   = nil
+** Processing line: ~        end~
+- Inside source: true
 *** True Line Result
-
+        end
+** Processing line: ~        enemy[:x] += dx~
+- Inside source: true
 *** True Line Result
-#+begin_src ruby
-** Processing line: ~  # ./samples/99_genre_arcade/flappy_dragon/CREDITS.txt~
+        enemy[:x] += dx
+** Processing line: ~        enemy[:y] += dy~
 - Inside source: true
 *** True Line Result
-  # ./samples/99_genre_arcade/flappy_dragon/CREDITS.txt
-** Processing line: ~  code: Amir Rajan, https://twitter.com/amirrajan~
+        enemy[:y] += dy
+** Processing line: ~      end~
 - Inside source: true
 *** True Line Result
-  code: Amir Rajan, https://twitter.com/amirrajan
-** Processing line: ~  graphics and audio: Nick Culbertson, https://twitter.com/MobyPixel~
+      end
+** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
-  graphics and audio: Nick Culbertson, https://twitter.com/MobyPixel
-** Processing line: ~~
+    end
+** Processing line: ~  end~
 - Inside source: true
 *** True Line Result
-
+  end
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
@@ -93343,30 +94707,30 @@ Follows is a source code listing for all files that have been open sourced. This
 - End of paragraph detected.
 *** True Line Result
 
-** Processing line: ~*** arcade/flappy dragon/main.rb~
+** Processing line: ~*** Arcade - Dueling Starships - main.rb~
 - Header detected.
 *** True Line Result
 
 *** True Line Result
-*** arcade/flappy dragon/main.rb
+*** Arcade - Dueling Starships - main.rb
 ** Processing line: ~#+begin_src ruby~
 - Line was identified as the beginning of a code block.
 *** True Line Result
 
 *** True Line Result
 #+begin_src ruby
-** Processing line: ~  # ./samples/99_genre_arcade/flappy_dragon/app/main.rb~
+** Processing line: ~  # ./samples/99_genre_arcade/dueling_starships/app/main.rb~
 - Inside source: true
 *** True Line Result
-  # ./samples/99_genre_arcade/flappy_dragon/app/main.rb
-** Processing line: ~  class FlappyDragon~
+  # ./samples/99_genre_arcade/dueling_starships/app/main.rb
+** Processing line: ~  class DuelingSpaceships~
 - Inside source: true
 *** True Line Result
-  class FlappyDragon
-** Processing line: ~    attr_accessor :grid, :inputs, :state, :outputs~
+  class DuelingSpaceships
+** Processing line: ~    attr_accessor :state, :inputs, :outputs, :grid~
 - Inside source: true
 *** True Line Result
-    attr_accessor :grid, :inputs, :state, :outputs
+    attr_accessor :state, :inputs, :outputs, :grid
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
@@ -93387,10 +94751,10 @@ Follows is a source code listing for all files that have been open sourced. This
 - Inside source: true
 *** True Line Result
       calc
-** Processing line: ~      process_inputs~
+** Processing line: ~      input~
 - Inside source: true
 *** True Line Result
-      process_inputs
+      input
 ** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
@@ -93403,110 +94767,114 @@ Follows is a source code listing for all files that have been open sourced. This
 - Inside source: true
 *** True Line Result
     def defaults
-** Processing line: ~      state.flap_power              = 11~
+** Processing line: ~      outputs.background_color = [0, 0, 0]~
 - Inside source: true
 *** True Line Result
-      state.flap_power              = 11
-** Processing line: ~      state.gravity                 = 0.9~
+      outputs.background_color = [0, 0, 0]
+** Processing line: ~      state.ship_blue       ||= new_blue_ship~
 - Inside source: true
 *** True Line Result
-      state.gravity                 = 0.9
-** Processing line: ~      state.ceiling                 = 600~
+      state.ship_blue       ||= new_blue_ship
+** Processing line: ~      state.ship_red        ||= new_red_ship~
 - Inside source: true
 *** True Line Result
-      state.ceiling                 = 600
-** Processing line: ~      state.ceiling_flap_power      = 6~
+      state.ship_red        ||= new_red_ship
+** Processing line: ~      state.flames          ||= []~
 - Inside source: true
 *** True Line Result
-      state.ceiling_flap_power      = 6
-** Processing line: ~      state.wall_countdown_length   = 100~
+      state.flames          ||= []
+** Processing line: ~      state.bullets         ||= []~
 - Inside source: true
 *** True Line Result
-      state.wall_countdown_length   = 100
-** Processing line: ~      state.wall_gap_size           = 100~
+      state.bullets         ||= []
+** Processing line: ~      state.ship_blue_score ||= 0~
 - Inside source: true
 *** True Line Result
-      state.wall_gap_size           = 100
-** Processing line: ~      state.wall_countdown        ||= 0~
+      state.ship_blue_score ||= 0
+** Processing line: ~      state.ship_red_score  ||= 0~
 - Inside source: true
 *** True Line Result
-      state.wall_countdown        ||= 0
-** Processing line: ~      state.hi_score              ||= 0~
+      state.ship_red_score  ||= 0
+** Processing line: ~      state.stars           ||= 100.map do~
 - Inside source: true
 *** True Line Result
-      state.hi_score              ||= 0
-** Processing line: ~      state.score                 ||= 0~
+      state.stars           ||= 100.map do
+** Processing line: ~        [rand.add(2).to_square(grid.w_half.randomize(:sign, :ratio),~
 - Inside source: true
 *** True Line Result
-      state.score                 ||= 0
-** Processing line: ~      state.walls                 ||= []~
+        [rand.add(2).to_square(grid.w_half.randomize(:sign, :ratio),
+** Processing line: ~                               grid.h_half.randomize(:sign, :ratio)),~
 - Inside source: true
 *** True Line Result
-      state.walls                 ||= []
-** Processing line: ~      state.x                     ||= 50~
+                               grid.h_half.randomize(:sign, :ratio)),
+** Processing line: ~         128 + 128.randomize(:ratio), 255, 255]~
 - Inside source: true
 *** True Line Result
-      state.x                     ||= 50
-** Processing line: ~      state.y                     ||= 500~
+         128 + 128.randomize(:ratio), 255, 255]
+** Processing line: ~      end~
 - Inside source: true
 *** True Line Result
-      state.y                     ||= 500
-** Processing line: ~      state.dy                    ||= 0~
+      end
+** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
-      state.dy                    ||= 0
-** Processing line: ~      state.scene                 ||= :menu~
+    end
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-      state.scene                 ||= :menu
-** Processing line: ~      state.scene_at              ||= 0~
+
+** Processing line: ~    def default_ship x, y, angle, sprite_path, bullet_sprite_path, color~
 - Inside source: true
 *** True Line Result
-      state.scene_at              ||= 0
-** Processing line: ~      state.difficulty            ||= :normal~
+    def default_ship x, y, angle, sprite_path, bullet_sprite_path, color
+** Processing line: ~      state.new_entity(:ship,~
 - Inside source: true
 *** True Line Result
-      state.difficulty            ||= :normal
-** Processing line: ~      state.new_difficulty        ||= :normal~
+      state.new_entity(:ship,
+** Processing line: ~                      { x: x,~
 - Inside source: true
 *** True Line Result
-      state.new_difficulty        ||= :normal
-** Processing line: ~      state.countdown             ||= 4.seconds~
+                      { x: x,
+** Processing line: ~                        y: y,~
 - Inside source: true
 *** True Line Result
-      state.countdown             ||= 4.seconds
-** Processing line: ~      state.flash_at              ||= 0~
+                        y: y,
+** Processing line: ~                        dy: 0,~
 - Inside source: true
 *** True Line Result
-      state.flash_at              ||= 0
-** Processing line: ~    end~
+                        dy: 0,
+** Processing line: ~                        dx: 0,~
 - Inside source: true
 *** True Line Result
-    end
-** Processing line: ~~
+                        dx: 0,
+** Processing line: ~                        damage: 0,~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~    def render~
+                        damage: 0,
+** Processing line: ~                        dead: false,~
 - Inside source: true
 *** True Line Result
-    def render
-** Processing line: ~      outputs.sounds << "sounds/flappy-song.ogg" if state.tick_count == 1~
+                        dead: false,
+** Processing line: ~                        angle: angle,~
 - Inside source: true
 *** True Line Result
-      outputs.sounds << "sounds/flappy-song.ogg" if state.tick_count == 1
-** Processing line: ~      render_score~
+                        angle: angle,
+** Processing line: ~                        max_alpha: 255,~
 - Inside source: true
 *** True Line Result
-      render_score
-** Processing line: ~      render_menu~
+                        max_alpha: 255,
+** Processing line: ~                        sprite_path: sprite_path,~
 - Inside source: true
 *** True Line Result
-      render_menu
-** Processing line: ~      render_game~
+                        sprite_path: sprite_path,
+** Processing line: ~                        bullet_sprite_path: bullet_sprite_path,~
 - Inside source: true
 *** True Line Result
-      render_game
+                        bullet_sprite_path: bullet_sprite_path,
+** Processing line: ~                        color: color })~
+- Inside source: true
+*** True Line Result
+                        color: color })
 ** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
@@ -93515,22 +94883,22 @@ Follows is a source code listing for all files that have been open sourced. This
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~    def render_score~
+** Processing line: ~    def new_red_ship~
 - Inside source: true
 *** True Line Result
-    def render_score
-** Processing line: ~      outputs.primitives << [10, 710, "HI SCORE: #{state.hi_score}", large_white_typeset].label~
+    def new_red_ship
+** Processing line: ~      default_ship(400, 250.randomize(:sign, :ratio),~
 - Inside source: true
 *** True Line Result
-      outputs.primitives << [10, 710, "HI SCORE: #{state.hi_score}", large_white_typeset].label
-** Processing line: ~      outputs.primitives << [10, 680, "SCORE: #{state.score}", large_white_typeset].label~
+      default_ship(400, 250.randomize(:sign, :ratio),
+** Processing line: ~                   180, 'sprites/ship_red.png', 'sprites/red_bullet.png',~
 - Inside source: true
 *** True Line Result
-      outputs.primitives << [10, 680, "SCORE: #{state.score}", large_white_typeset].label
-** Processing line: ~      outputs.primitives << [10, 650, "DIFFICULTY: #{state.difficulty.upcase}", large_white_typeset].label~
+                   180, 'sprites/ship_red.png', 'sprites/red_bullet.png',
+** Processing line: ~                   [255, 90, 90])~
 - Inside source: true
 *** True Line Result
-      outputs.primitives << [10, 650, "DIFFICULTY: #{state.difficulty.upcase}", large_white_typeset].label
+                   [255, 90, 90])
 ** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
@@ -93539,86 +94907,86 @@ Follows is a source code listing for all files that have been open sourced. This
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~    def render_menu~
+** Processing line: ~    def new_blue_ship~
 - Inside source: true
 *** True Line Result
-    def render_menu
-** Processing line: ~      return unless state.scene == :menu~
+    def new_blue_ship
+** Processing line: ~      default_ship(-400, 250.randomize(:sign, :ratio),~
 - Inside source: true
 *** True Line Result
-      return unless state.scene == :menu
-** Processing line: ~      render_overlay~
+      default_ship(-400, 250.randomize(:sign, :ratio),
+** Processing line: ~                   0, 'sprites/ship_blue.png', 'sprites/blue_bullet.png',~
 - Inside source: true
 *** True Line Result
-      render_overlay
-** Processing line: ~~
+                   0, 'sprites/ship_blue.png', 'sprites/blue_bullet.png',
+** Processing line: ~                   [110, 140, 255])~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~      outputs.labels << [640, 700, "Flappy Dragon", 50, 1, 255, 255, 255]~
+                   [110, 140, 255])
+** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
-      outputs.labels << [640, 700, "Flappy Dragon", 50, 1, 255, 255, 255]
-** Processing line: ~      outputs.labels << [640, 500, "Instructions: Press Spacebar to flap. Don't die.", 4, 1, 255, 255, 255]~
+    end
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-      outputs.labels << [640, 500, "Instructions: Press Spacebar to flap. Don't die.", 4, 1, 255, 255, 255]
-** Processing line: ~      outputs.labels << [430, 430, "[Tab]    Change difficulty", 4, 0, 255, 255, 255]~
+
+** Processing line: ~    def render~
 - Inside source: true
 *** True Line Result
-      outputs.labels << [430, 430, "[Tab]    Change difficulty", 4, 0, 255, 255, 255]
-** Processing line: ~      outputs.labels << [430, 400, "[Enter]  Start at New Difficulty ", 4, 0, 255, 255, 255]~
-- Inside source: true
+    def render
+** Processing line: ~      render_instructions~
+- Inside source: true
 *** True Line Result
-      outputs.labels << [430, 400, "[Enter]  Start at New Difficulty ", 4, 0, 255, 255, 255]
-** Processing line: ~      outputs.labels << [430, 370, "[Escape] Cancel/Resume ", 4, 0, 255, 255, 255]~
+      render_instructions
+** Processing line: ~      render_score~
 - Inside source: true
 *** True Line Result
-      outputs.labels << [430, 370, "[Escape] Cancel/Resume ", 4, 0, 255, 255, 255]
-** Processing line: ~      outputs.labels << [640, 300, "(mouse, touch, and game controllers work, too!) ", 4, 1, 255, 255, 255]~
+      render_score
+** Processing line: ~      render_universe~
 - Inside source: true
 *** True Line Result
-      outputs.labels << [640, 300, "(mouse, touch, and game controllers work, too!) ", 4, 1, 255, 255, 255]
-** Processing line: ~      outputs.labels << [640, 200, "Difficulty: #{state.new_difficulty.capitalize}", 4, 1, 255, 255, 255]~
+      render_universe
+** Processing line: ~      render_flames~
 - Inside source: true
 *** True Line Result
-      outputs.labels << [640, 200, "Difficulty: #{state.new_difficulty.capitalize}", 4, 1, 255, 255, 255]
-** Processing line: ~~
+      render_flames
+** Processing line: ~      render_ships~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~      outputs.labels << [10, 100, "Code:   @amirrajan",     255, 255, 255]~
+      render_ships
+** Processing line: ~      render_bullets~
 - Inside source: true
 *** True Line Result
-      outputs.labels << [10, 100, "Code:   @amirrajan",     255, 255, 255]
-** Processing line: ~      outputs.labels << [10,  80, "Art:    @mobypixel",     255, 255, 255]~
+      render_bullets
+** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
-      outputs.labels << [10,  80, "Art:    @mobypixel",     255, 255, 255]
-** Processing line: ~      outputs.labels << [10,  60, "Music:  @mobypixel",     255, 255, 255]~
+    end
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-      outputs.labels << [10,  60, "Music:  @mobypixel",     255, 255, 255]
-** Processing line: ~      outputs.labels << [10,  40, "Engine: DragonRuby GTK", 255, 255, 255]~
+
+** Processing line: ~    def render_ships~
 - Inside source: true
 *** True Line Result
-      outputs.labels << [10,  40, "Engine: DragonRuby GTK", 255, 255, 255]
-** Processing line: ~    end~
+    def render_ships
+** Processing line: ~      update_ship_outputs(state.ship_blue)~
 - Inside source: true
 *** True Line Result
-    end
-** Processing line: ~~
+      update_ship_outputs(state.ship_blue)
+** Processing line: ~      update_ship_outputs(state.ship_red)~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~    def render_overlay~
+      update_ship_outputs(state.ship_red)
+** Processing line: ~      outputs.sprites << [state.ship_blue.sprite, state.ship_red.sprite]~
 - Inside source: true
 *** True Line Result
-    def render_overlay
-** Processing line: ~      outputs.primitives << [grid.rect.scale_rect(1.1, 0, 0), 0, 0, 0, 230].solid~
+      outputs.sprites << [state.ship_blue.sprite, state.ship_red.sprite]
+** Processing line: ~      outputs.labels  << [state.ship_blue.label, state.ship_red.label]~
 - Inside source: true
 *** True Line Result
-      outputs.primitives << [grid.rect.scale_rect(1.1, 0, 0), 0, 0, 0, 230].solid
+      outputs.labels  << [state.ship_blue.label, state.ship_red.label]
 ** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
@@ -93627,30 +94995,42 @@ Follows is a source code listing for all files that have been open sourced. This
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~    def render_game~
+** Processing line: ~    def render_instructions~
 - Inside source: true
 *** True Line Result
-    def render_game
-** Processing line: ~      render_game_over~
+    def render_instructions
+** Processing line: ~      return if state.ship_blue.dx  > 0  || state.ship_blue.dy > 0  ||~
 - Inside source: true
 *** True Line Result
-      render_game_over
-** Processing line: ~      render_background~
+      return if state.ship_blue.dx  > 0  || state.ship_blue.dy > 0  ||
+** Processing line: ~                state.ship_red.dx   > 0  || state.ship_red.dy  > 0  ||~
 - Inside source: true
 *** True Line Result
-      render_background
-** Processing line: ~      render_walls~
+                state.ship_red.dx   > 0  || state.ship_red.dy  > 0  ||
+** Processing line: ~                state.flames.length > 0~
 - Inside source: true
 *** True Line Result
-      render_walls
-** Processing line: ~      render_dragon~
+                state.flames.length > 0
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-      render_dragon
-** Processing line: ~      render_flash~
+
+** Processing line: ~      outputs.labels << [grid.left.shift_right(30),~
 - Inside source: true
 *** True Line Result
-      render_flash
+      outputs.labels << [grid.left.shift_right(30),
+** Processing line: ~                         grid.bottom.shift_up(30),~
+- Inside source: true
+*** True Line Result
+                         grid.bottom.shift_up(30),
+** Processing line: ~                         "Two gamepads needed to play. R1 to accelerate. Left and right on D-PAD to turn ship. Hold A to shoot. Press B to drop mines.",~
+- Inside source: true
+*** True Line Result
+                         "Two gamepads needed to play. R1 to accelerate. Left and right on D-PAD to turn ship. Hold A to shoot. Press B to drop mines.",
+** Processing line: ~                         0, 0, 255, 255, 255]~
+- Inside source: true
+*** True Line Result
+                         0, 0, 255, 255, 255]
 ** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
@@ -93659,30 +95039,26 @@ Follows is a source code listing for all files that have been open sourced. This
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~    def render_game_over~
-- Inside source: true
-*** True Line Result
-    def render_game_over
-** Processing line: ~      return unless state.scene == :game~
+** Processing line: ~    def calc~
 - Inside source: true
 *** True Line Result
-      return unless state.scene == :game
-** Processing line: ~      outputs.labels << [638, 358, score_text, 20, 1]~
+    def calc
+** Processing line: ~      calc_thrusts~
 - Inside source: true
 *** True Line Result
-      outputs.labels << [638, 358, score_text, 20, 1]
-** Processing line: ~      outputs.labels << [635, 360, score_text, 20, 1, 255, 255, 255]~
+      calc_thrusts
+** Processing line: ~      calc_ships~
 - Inside source: true
 *** True Line Result
-      outputs.labels << [635, 360, score_text, 20, 1, 255, 255, 255]
-** Processing line: ~      outputs.labels << [638, 428, countdown_text, 20, 1]~
+      calc_ships
+** Processing line: ~      calc_bullets~
 - Inside source: true
 *** True Line Result
-      outputs.labels << [638, 428, countdown_text, 20, 1]
-** Processing line: ~      outputs.labels << [635, 430, countdown_text, 20, 1, 255, 255, 255]~
+      calc_bullets
+** Processing line: ~      calc_winner~
 - Inside source: true
 *** True Line Result
-      outputs.labels << [635, 430, countdown_text, 20, 1, 255, 255, 255]
+      calc_winner
 ** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
@@ -93691,50 +95067,62 @@ Follows is a source code listing for all files that have been open sourced. This
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~    def render_background~
+** Processing line: ~    def input~
 - Inside source: true
 *** True Line Result
-    def render_background
-** Processing line: ~      outputs.sprites << [0, 0, 1280, 720, 'sprites/background.png']~
+    def input
+** Processing line: ~      input_accelerate~
+- Inside source: true
+*** True Line Result
+      input_accelerate
+** Processing line: ~      input_turn~
+- Inside source: true
+*** True Line Result
+      input_turn
+** Processing line: ~      input_bullets_and_mines~
+- Inside source: true
+*** True Line Result
+      input_bullets_and_mines
+** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
-      outputs.sprites << [0, 0, 1280, 720, 'sprites/background.png']
+    end
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~      scroll_point_at   = state.tick_count~
+** Processing line: ~    def render_score~
 - Inside source: true
 *** True Line Result
-      scroll_point_at   = state.tick_count
-** Processing line: ~      scroll_point_at   = state.scene_at if state.scene == :menu~
+    def render_score
+** Processing line: ~      outputs.labels << [grid.left.shift_right(80),~
 - Inside source: true
 *** True Line Result
-      scroll_point_at   = state.scene_at if state.scene == :menu
-** Processing line: ~      scroll_point_at   = state.death_at if state.countdown > 0~
+      outputs.labels << [grid.left.shift_right(80),
+** Processing line: ~                         grid.top.shift_down(40),~
 - Inside source: true
 *** True Line Result
-      scroll_point_at   = state.death_at if state.countdown > 0
-** Processing line: ~      scroll_point_at ||= 0~
+                         grid.top.shift_down(40),
+** Processing line: ~                         state.ship_blue_score, 30, 1, state.ship_blue.color]~
 - Inside source: true
 *** True Line Result
-      scroll_point_at ||= 0
+                         state.ship_blue_score, 30, 1, state.ship_blue.color]
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~      outputs.sprites << scrolling_background(scroll_point_at, 'sprites/parallax_back.png',   0.25)~
+** Processing line: ~      outputs.labels << [grid.right.shift_left(80),~
 - Inside source: true
 *** True Line Result
-      outputs.sprites << scrolling_background(scroll_point_at, 'sprites/parallax_back.png',   0.25)
-** Processing line: ~      outputs.sprites << scrolling_background(scroll_point_at, 'sprites/parallax_middle.png', 0.50)~
+      outputs.labels << [grid.right.shift_left(80),
+** Processing line: ~                         grid.top.shift_down(40),~
 - Inside source: true
 *** True Line Result
-      outputs.sprites << scrolling_background(scroll_point_at, 'sprites/parallax_middle.png', 0.50)
-** Processing line: ~      outputs.sprites << scrolling_background(scroll_point_at, 'sprites/parallax_front.png',  1.00, -80)~
+                         grid.top.shift_down(40),
+** Processing line: ~                         state.ship_red_score,  30, 1, state.ship_red.color]~
 - Inside source: true
 *** True Line Result
-      outputs.sprites << scrolling_background(scroll_point_at, 'sprites/parallax_front.png',  1.00, -80)
+                         state.ship_red_score,  30, 1, state.ship_red.color]
 ** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
@@ -93743,38 +95131,46 @@ Follows is a source code listing for all files that have been open sourced. This
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~    def render_walls~
+** Processing line: ~    def render_universe~
 - Inside source: true
 *** True Line Result
-    def render_walls
-** Processing line: ~      state.walls.each do |w|~
+    def render_universe
+** Processing line: ~      return if outputs.static_solids.any?~
 - Inside source: true
 *** True Line Result
-      state.walls.each do |w|
-** Processing line: ~        w.sprites = [~
+      return if outputs.static_solids.any?
+** Processing line: ~      outputs.static_solids << grid.rect~
 - Inside source: true
 *** True Line Result
-        w.sprites = [
-** Processing line: ~          [w.x, w.bottom_height - 720, 100, 720, 'sprites/wall.png', 180],~
+      outputs.static_solids << grid.rect
+** Processing line: ~      outputs.static_solids << state.stars~
 - Inside source: true
 *** True Line Result
-          [w.x, w.bottom_height - 720, 100, 720, 'sprites/wall.png', 180],
-** Processing line: ~          [w.x, w.top_y,               100, 720, 'sprites/wallbottom.png', 0]~
+      outputs.static_solids << state.stars
+** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
-          [w.x, w.top_y,               100, 720, 'sprites/wallbottom.png', 0]
-** Processing line: ~        ]~
+    end
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-        ]
-** Processing line: ~      end~
+
+** Processing line: ~    def apply_round_finished_alpha entity~
 - Inside source: true
 *** True Line Result
-      end
-** Processing line: ~      outputs.sprites << state.walls.map(&:sprites)~
+    def apply_round_finished_alpha entity
+** Processing line: ~      return entity unless state.round_finished_debounce~
 - Inside source: true
 *** True Line Result
-      outputs.sprites << state.walls.map(&:sprites)
+      return entity unless state.round_finished_debounce
+** Processing line: ~      entity.a *= state.round_finished_debounce.percentage_of(2.seconds)~
+- Inside source: true
+*** True Line Result
+      entity.a *= state.round_finished_debounce.percentage_of(2.seconds)
+** Processing line: ~      return entity~
+- Inside source: true
+*** True Line Result
+      return entity
 ** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
@@ -93783,82 +95179,78 @@ Follows is a source code listing for all files that have been open sourced. This
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~    def render_dragon~
-- Inside source: true
-*** True Line Result
-    def render_dragon
-** Processing line: ~      state.show_death = true if state.countdown == 3.seconds~
+** Processing line: ~    def update_ship_outputs ship, sprite_size = 66~
 - Inside source: true
 *** True Line Result
-      state.show_death = true if state.countdown == 3.seconds
-** Processing line: ~~
+    def update_ship_outputs ship, sprite_size = 66
+** Processing line: ~      ship.sprite =~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~      render_debug_hitbox false~
+      ship.sprite =
+** Processing line: ~        apply_round_finished_alpha [sprite_size.to_square(ship.x, ship.y),~
 - Inside source: true
 *** True Line Result
-      render_debug_hitbox false
-** Processing line: ~~
+        apply_round_finished_alpha [sprite_size.to_square(ship.x, ship.y),
+** Processing line: ~                                    ship.sprite_path,~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~      if state.show_death == false || !state.death_at~
+                                    ship.sprite_path,
+** Processing line: ~                                    ship.angle,~
 - Inside source: true
 *** True Line Result
-      if state.show_death == false || !state.death_at
-** Processing line: ~        animation_index = state.flapped_at.frame_index 6, 2, false if state.flapped_at~
+                                    ship.angle,
+** Processing line: ~                                    ship.dead ? 0 : 255 * ship.created_at.ease(2.seconds)].sprite~
 - Inside source: true
 *** True Line Result
-        animation_index = state.flapped_at.frame_index 6, 2, false if state.flapped_at
-** Processing line: ~        sprite_name = "sprites/dragon_fly#{animation_index.or(0) + 1}.png"~
+                                    ship.dead ? 0 : 255 * ship.created_at.ease(2.seconds)].sprite
+** Processing line: ~      ship.label =~
 - Inside source: true
 *** True Line Result
-        sprite_name = "sprites/dragon_fly#{animation_index.or(0) + 1}.png"
-** Processing line: ~        state.dragon_sprite = [state.x, state.y, 100, 80, sprite_name, state.dy * 1.2]~
+      ship.label =
+** Processing line: ~        apply_round_finished_alpha [ship.x,~
 - Inside source: true
 *** True Line Result
-        state.dragon_sprite = [state.x, state.y, 100, 80, sprite_name, state.dy * 1.2]
-** Processing line: ~      else~
+        apply_round_finished_alpha [ship.x,
+** Processing line: ~                                    ship.y + 100,~
 - Inside source: true
 *** True Line Result
-      else
-** Processing line: ~        sprite_name = "sprites/dragon_die.png"~
+                                    ship.y + 100,
+** Processing line: ~                                    "." * 5.minus(ship.damage).greater(0), 20, 1, ship.color, 255].label~
 - Inside source: true
 *** True Line Result
-        sprite_name = "sprites/dragon_die.png"
-** Processing line: ~        state.dragon_sprite = [state.x, state.y, 100, 80, sprite_name, state.dy * 1.2]~
+                                    "." * 5.minus(ship.damage).greater(0), 20, 1, ship.color, 255].label
+** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
-        state.dragon_sprite = [state.x, state.y, 100, 80, sprite_name, state.dy * 1.2]
-** Processing line: ~        sprite_changed_elapsed    = state.death_at.elapsed_time - 1.seconds~
+    end
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-        sprite_changed_elapsed    = state.death_at.elapsed_time - 1.seconds
-** Processing line: ~        state.dragon_sprite.angle += (sprite_changed_elapsed ** 1.3) * state.death_fall_direction * -1~
+
+** Processing line: ~    def render_flames sprite_size = 6~
 - Inside source: true
 *** True Line Result
-        state.dragon_sprite.angle += (sprite_changed_elapsed ** 1.3) * state.death_fall_direction * -1
-** Processing line: ~        state.dragon_sprite.x     += (sprite_changed_elapsed ** 1.2) * state.death_fall_direction~
+    def render_flames sprite_size = 6
+** Processing line: ~      outputs.sprites << state.flames.map do |p|~
 - Inside source: true
 *** True Line Result
-        state.dragon_sprite.x     += (sprite_changed_elapsed ** 1.2) * state.death_fall_direction
-** Processing line: ~        state.dragon_sprite.y     += (sprite_changed_elapsed * 14 - sprite_changed_elapsed ** 1.6)~
+      outputs.sprites << state.flames.map do |p|
+** Processing line: ~        apply_round_finished_alpha [sprite_size.to_square(p.x, p.y),~
 - Inside source: true
 *** True Line Result
-        state.dragon_sprite.y     += (sprite_changed_elapsed * 14 - sprite_changed_elapsed ** 1.6)
-** Processing line: ~      end~
+        apply_round_finished_alpha [sprite_size.to_square(p.x, p.y),
+** Processing line: ~                                    'sprites/flame.png', 0,~
 - Inside source: true
 *** True Line Result
-      end
-** Processing line: ~~
+                                    'sprites/flame.png', 0,
+** Processing line: ~                                    p.max_alpha * p.created_at.ease(p.lifetime, :flip)].sprite~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~      outputs.sprites << state.dragon_sprite~
+                                    p.max_alpha * p.created_at.ease(p.lifetime, :flip)].sprite
+** Processing line: ~      end~
 - Inside source: true
 *** True Line Result
-      outputs.sprites << state.dragon_sprite
+      end
 ** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
@@ -93867,26 +95259,26 @@ Follows is a source code listing for all files that have been open sourced. This
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~    def render_debug_hitbox show~
+** Processing line: ~    def render_bullets sprite_size = 10~
 - Inside source: true
 *** True Line Result
-    def render_debug_hitbox show
-** Processing line: ~      return unless show~
+    def render_bullets sprite_size = 10
+** Processing line: ~      outputs.sprites << state.bullets.map do |b|~
 - Inside source: true
 *** True Line Result
-      return unless show
-** Processing line: ~      outputs.borders << [dragon_collision_box.rect, 255, 0, 0] if state.dragon_sprite~
+      outputs.sprites << state.bullets.map do |b|
+** Processing line: ~        apply_round_finished_alpha [b.sprite_size.to_square(b.x, b.y),~
 - Inside source: true
 *** True Line Result
-      outputs.borders << [dragon_collision_box.rect, 255, 0, 0] if state.dragon_sprite
-** Processing line: ~      outputs.borders << state.walls.flat_map do |w|~
+        apply_round_finished_alpha [b.sprite_size.to_square(b.x, b.y),
+** Processing line: ~                                    b.owner.bullet_sprite_path,~
 - Inside source: true
 *** True Line Result
-      outputs.borders << state.walls.flat_map do |w|
-** Processing line: ~         w.sprites.map { |s| [s.rect, 255, 0, 0] }~
+                                    b.owner.bullet_sprite_path,
+** Processing line: ~                                    0, b.max_alpha].sprite~
 - Inside source: true
 *** True Line Result
-         w.sprites.map { |s| [s.rect, 255, 0, 0] }
+                                    0, b.max_alpha].sprite
 ** Processing line: ~      end~
 - Inside source: true
 *** True Line Result
@@ -93899,74 +95291,78 @@ Follows is a source code listing for all files that have been open sourced. This
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~    def render_flash~
+** Processing line: ~    def wrap_location! location~
 - Inside source: true
 *** True Line Result
-    def render_flash
-** Processing line: ~      return unless state.flash_at~
+    def wrap_location! location
+** Processing line: ~      location.x = grid.left    if location.x > grid.right~
 - Inside source: true
 *** True Line Result
-      return unless state.flash_at
-** Processing line: ~~
+      location.x = grid.left    if location.x > grid.right
+** Processing line: ~      location.x = grid.right   if location.x < grid.left~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~      outputs.primitives << [grid.rect,~
+      location.x = grid.right   if location.x < grid.left
+** Processing line: ~      location.y = grid.top     if location.y < grid.bottom~
+- Inside source: true
+*** True Line Result
+      location.y = grid.top     if location.y < grid.bottom
+** Processing line: ~      location.y = grid.bottom  if location.y > grid.top~
 - Inside source: true
 *** True Line Result
-      outputs.primitives << [grid.rect,
-** Processing line: ~                             white,~
+      location.y = grid.bottom  if location.y > grid.top
+** Processing line: ~      location~
 - Inside source: true
 *** True Line Result
-                             white,
-** Processing line: ~                             255 * state.flash_at.ease(20, :flip)].solid~
+      location
+** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
-                             255 * state.flash_at.ease(20, :flip)].solid
+    end
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~      state.flash_at = 0 if state.flash_at.elapsed_time > 20~
+** Processing line: ~    def calc_thrusts~
 - Inside source: true
 *** True Line Result
-      state.flash_at = 0 if state.flash_at.elapsed_time > 20
-** Processing line: ~    end~
+    def calc_thrusts
+** Processing line: ~      state.flames =~
 - Inside source: true
 *** True Line Result
-    end
-** Processing line: ~~
+      state.flames =
+** Processing line: ~        state.flames~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~    def calc~
+        state.flames
+** Processing line: ~          .reject(&:old?)~
 - Inside source: true
 *** True Line Result
-    def calc
-** Processing line: ~      return unless state.scene == :game~
+          .reject(&:old?)
+** Processing line: ~          .map do |p|~
 - Inside source: true
 *** True Line Result
-      return unless state.scene == :game
-** Processing line: ~      reset_game if state.countdown == 1~
+          .map do |p|
+** Processing line: ~            p.speed *= 0.9~
 - Inside source: true
 *** True Line Result
-      reset_game if state.countdown == 1
-** Processing line: ~      state.countdown -= 1 and return if state.countdown > 0~
+            p.speed *= 0.9
+** Processing line: ~            p.y += p.angle.vector_y(p.speed)~
 - Inside source: true
 *** True Line Result
-      state.countdown -= 1 and return if state.countdown > 0
-** Processing line: ~      calc_walls~
+            p.y += p.angle.vector_y(p.speed)
+** Processing line: ~            p.x += p.angle.vector_x(p.speed)~
 - Inside source: true
 *** True Line Result
-      calc_walls
-** Processing line: ~      calc_flap~
+            p.x += p.angle.vector_x(p.speed)
+** Processing line: ~            wrap_location! p~
 - Inside source: true
 *** True Line Result
-      calc_flap
-** Processing line: ~      calc_game_over~
+            wrap_location! p
+** Processing line: ~        end~
 - Inside source: true
 *** True Line Result
-      calc_game_over
+        end
 ** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
@@ -93975,94 +95371,114 @@ Follows is a source code listing for all files that have been open sourced. This
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~    def calc_walls~
+** Processing line: ~    def all_ships~
 - Inside source: true
 *** True Line Result
-    def calc_walls
-** Processing line: ~      state.walls.each { |w| w.x -= 8 }~
+    def all_ships
+** Processing line: ~      [state.ship_blue, state.ship_red]~
 - Inside source: true
 *** True Line Result
-      state.walls.each { |w| w.x -= 8 }
+      [state.ship_blue, state.ship_red]
+** Processing line: ~    end~
+- Inside source: true
+*** True Line Result
+    end
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~      walls_count_before_removal = state.walls.length~
+** Processing line: ~    def alive_ships~
 - Inside source: true
 *** True Line Result
-      walls_count_before_removal = state.walls.length
-** Processing line: ~~
+    def alive_ships
+** Processing line: ~      all_ships.reject { |s| s.dead }~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~      state.walls.reject! { |w| w.x < -100 }~
+      all_ships.reject { |s| s.dead }
+** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
-      state.walls.reject! { |w| w.x < -100 }
+    end
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~      state.score += 1 if state.walls.count < walls_count_before_removal~
+** Processing line: ~    def calc_bullet bullet~
 - Inside source: true
 *** True Line Result
-      state.score += 1 if state.walls.count < walls_count_before_removal
-** Processing line: ~~
+    def calc_bullet bullet
+** Processing line: ~      bullet.y += bullet.angle.vector_y(bullet.speed)~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~      state.wall_countdown -= 1 and return if state.wall_countdown > 0~
+      bullet.y += bullet.angle.vector_y(bullet.speed)
+** Processing line: ~      bullet.x += bullet.angle.vector_x(bullet.speed)~
 - Inside source: true
 *** True Line Result
-      state.wall_countdown -= 1 and return if state.wall_countdown > 0
-** Processing line: ~~
+      bullet.x += bullet.angle.vector_x(bullet.speed)
+** Processing line: ~      wrap_location! bullet~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~      state.walls << state.new_entity(:wall) do |w|~
+      wrap_location! bullet
+** Processing line: ~      explode_bullet! bullet if bullet.old?~
 - Inside source: true
 *** True Line Result
-      state.walls << state.new_entity(:wall) do |w|
-** Processing line: ~        w.x             = grid.right~
+      explode_bullet! bullet if bullet.old?
+** Processing line: ~      return if bullet.exploded~
 - Inside source: true
 *** True Line Result
-        w.x             = grid.right
-** Processing line: ~        w.opening       = grid.top~
+      return if bullet.exploded
+** Processing line: ~      return if state.round_finished~
 - Inside source: true
 *** True Line Result
-        w.opening       = grid.top
-** Processing line: ~                              .randomize(:ratio)~
+      return if state.round_finished
+** Processing line: ~      alive_ships.each do |s|~
 - Inside source: true
 *** True Line Result
-                              .randomize(:ratio)
-** Processing line: ~                              .greater(200)~
+      alive_ships.each do |s|
+** Processing line: ~        if s != bullet.owner &&~
 - Inside source: true
 *** True Line Result
-                              .greater(200)
-** Processing line: ~                              .lesser(520)~
+        if s != bullet.owner &&
+** Processing line: ~           s.sprite.intersect_rect?(bullet.sprite_size.to_square(bullet.x, bullet.y))~
 - Inside source: true
 *** True Line Result
-                              .lesser(520)
-** Processing line: ~        w.bottom_height = w.opening - state.wall_gap_size~
+           s.sprite.intersect_rect?(bullet.sprite_size.to_square(bullet.x, bullet.y))
+** Processing line: ~          explode_bullet! bullet, 10, 5, 30~
 - Inside source: true
 *** True Line Result
-        w.bottom_height = w.opening - state.wall_gap_size
-** Processing line: ~        w.top_y         = w.opening + state.wall_gap_size~
+          explode_bullet! bullet, 10, 5, 30
+** Processing line: ~          s.damage += 1~
 - Inside source: true
 *** True Line Result
-        w.top_y         = w.opening + state.wall_gap_size
+          s.damage += 1
+** Processing line: ~        end~
+- Inside source: true
+*** True Line Result
+        end
 ** Processing line: ~      end~
 - Inside source: true
 *** True Line Result
       end
+** Processing line: ~    end~
+- Inside source: true
+*** True Line Result
+    end
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~      state.wall_countdown = state.wall_countdown_length~
+** Processing line: ~    def calc_bullets~
 - Inside source: true
 *** True Line Result
-      state.wall_countdown = state.wall_countdown_length
+    def calc_bullets
+** Processing line: ~      state.bullets.each    { |b| calc_bullet b }~
+- Inside source: true
+*** True Line Result
+      state.bullets.each    { |b| calc_bullet b }
+** Processing line: ~      state.bullets.reject! { |b| b.exploded }~
+- Inside source: true
+*** True Line Result
+      state.bullets.reject! { |b| b.exploded }
 ** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
@@ -94071,78 +95487,86 @@ Follows is a source code listing for all files that have been open sourced. This
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~    def calc_flap~
+** Processing line: ~    def create_explosion! type, entity, flame_count, max_speed, lifetime, max_alpha = 255~
 - Inside source: true
 *** True Line Result
-    def calc_flap
-** Processing line: ~      state.y += state.dy~
+    def create_explosion! type, entity, flame_count, max_speed, lifetime, max_alpha = 255
+** Processing line: ~      flame_count.times do~
 - Inside source: true
 *** True Line Result
-      state.y += state.dy
-** Processing line: ~      state.dy = state.dy.lesser state.flap_power~
+      flame_count.times do
+** Processing line: ~        state.flames << state.new_entity(type,~
 - Inside source: true
 *** True Line Result
-      state.dy = state.dy.lesser state.flap_power
-** Processing line: ~      state.dy -= state.gravity~
+        state.flames << state.new_entity(type,
+** Processing line: ~                                       { angle: 360.randomize(:ratio),~
 - Inside source: true
 *** True Line Result
-      state.dy -= state.gravity
-** Processing line: ~      return if state.y < state.ceiling~
+                                       { angle: 360.randomize(:ratio),
+** Processing line: ~                                         speed: max_speed.randomize(:ratio),~
 - Inside source: true
 *** True Line Result
-      return if state.y < state.ceiling
-** Processing line: ~      state.y  = state.ceiling~
+                                         speed: max_speed.randomize(:ratio),
+** Processing line: ~                                         lifetime: lifetime,~
 - Inside source: true
 *** True Line Result
-      state.y  = state.ceiling
-** Processing line: ~      state.dy = state.dy.lesser state.ceiling_flap_power~
+                                         lifetime: lifetime,
+** Processing line: ~                                         x: entity.x,~
 - Inside source: true
 *** True Line Result
-      state.dy = state.dy.lesser state.ceiling_flap_power
-** Processing line: ~    end~
+                                         x: entity.x,
+** Processing line: ~                                         y: entity.y,~
 - Inside source: true
 *** True Line Result
-    end
-** Processing line: ~~
+                                         y: entity.y,
+** Processing line: ~                                         max_alpha: max_alpha })~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~    def calc_game_over~
+                                         max_alpha: max_alpha })
+** Processing line: ~      end~
 - Inside source: true
 *** True Line Result
-    def calc_game_over
-** Processing line: ~      return unless game_over?~
+      end
+** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
-      return unless game_over?
+    end
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~      state.death_at = state.tick_count~
+** Processing line: ~    def explode_bullet! bullet, flame_override = 5, max_speed = 5, lifetime = 10~
 - Inside source: true
 *** True Line Result
-      state.death_at = state.tick_count
-** Processing line: ~      state.death_from = state.walls.first~
+    def explode_bullet! bullet, flame_override = 5, max_speed = 5, lifetime = 10
+** Processing line: ~      bullet.exploded = true~
 - Inside source: true
 *** True Line Result
-      state.death_from = state.walls.first
-** Processing line: ~      state.death_fall_direction = -1~
+      bullet.exploded = true
+** Processing line: ~      create_explosion! :bullet_explosion,~
 - Inside source: true
 *** True Line Result
-      state.death_fall_direction = -1
-** Processing line: ~      state.death_fall_direction =  1 if state.x > state.death_from.x~
+      create_explosion! :bullet_explosion,
+** Processing line: ~                        bullet,~
 - Inside source: true
 *** True Line Result
-      state.death_fall_direction =  1 if state.x > state.death_from.x
-** Processing line: ~      outputs.sounds << "sounds/hit-sound.wav"~
+                        bullet,
+** Processing line: ~                        flame_override,~
 - Inside source: true
 *** True Line Result
-      outputs.sounds << "sounds/hit-sound.wav"
-** Processing line: ~      begin_countdown~
+                        flame_override,
+** Processing line: ~                        max_speed,~
 - Inside source: true
 *** True Line Result
-      begin_countdown
+                        max_speed,
+** Processing line: ~                        lifetime,~
+- Inside source: true
+*** True Line Result
+                        lifetime,
+** Processing line: ~                        bullet.max_alpha~
+- Inside source: true
+*** True Line Result
+                        bullet.max_alpha
 ** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
@@ -94151,18 +95575,22 @@ Follows is a source code listing for all files that have been open sourced. This
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~    def process_inputs~
+** Processing line: ~    def calc_ship ship~
 - Inside source: true
 *** True Line Result
-    def process_inputs
-** Processing line: ~      process_inputs_menu~
+    def calc_ship ship
+** Processing line: ~      ship.x += ship.dx~
 - Inside source: true
 *** True Line Result
-      process_inputs_menu
-** Processing line: ~      process_inputs_game~
+      ship.x += ship.dx
+** Processing line: ~      ship.y += ship.dy~
 - Inside source: true
 *** True Line Result
-      process_inputs_game
+      ship.y += ship.dy
+** Processing line: ~      wrap_location! ship~
+- Inside source: true
+*** True Line Result
+      wrap_location! ship
 ** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
@@ -94171,146 +95599,130 @@ Follows is a source code listing for all files that have been open sourced. This
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~    def process_inputs_menu~
-- Inside source: true
-*** True Line Result
-    def process_inputs_menu
-** Processing line: ~      return unless state.scene == :menu~
-- Inside source: true
-*** True Line Result
-      return unless state.scene == :menu
-** Processing line: ~~
+** Processing line: ~    def calc_ships~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~      changediff = inputs.keyboard.key_down.tab || inputs.controller_one.key_down.select~
+    def calc_ships
+** Processing line: ~      all_ships.each { |s| calc_ship s }~
 - Inside source: true
 *** True Line Result
-      changediff = inputs.keyboard.key_down.tab || inputs.controller_one.key_down.select
-** Processing line: ~      if inputs.mouse.click~
+      all_ships.each { |s| calc_ship s }
+** Processing line: ~      return if all_ships.any? { |s| s.dead }~
 - Inside source: true
 *** True Line Result
-      if inputs.mouse.click
-** Processing line: ~        p = inputs.mouse.click.point~
+      return if all_ships.any? { |s| s.dead }
+** Processing line: ~      return if state.round_finished~
 - Inside source: true
 *** True Line Result
-        p = inputs.mouse.click.point
-** Processing line: ~        if (p.y >= 165) && (p.y < 200) && (p.x >= 500) && (p.x < 800)~
+      return if state.round_finished
+** Processing line: ~      return unless state.ship_blue.sprite.intersect_rect?(state.ship_red.sprite)~
 - Inside source: true
 *** True Line Result
-        if (p.y >= 165) && (p.y < 200) && (p.x >= 500) && (p.x < 800)
-** Processing line: ~          changediff = true~
+      return unless state.ship_blue.sprite.intersect_rect?(state.ship_red.sprite)
+** Processing line: ~      state.ship_blue.damage = 5~
 - Inside source: true
 *** True Line Result
-          changediff = true
-** Processing line: ~        end~
+      state.ship_blue.damage = 5
+** Processing line: ~      state.ship_red.damage  = 5~
 - Inside source: true
 *** True Line Result
-        end
-** Processing line: ~      end~
+      state.ship_red.damage  = 5
+** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
-      end
+    end
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~      if changediff~
+** Processing line: ~    def create_thruster_flames! ship~
 - Inside source: true
 *** True Line Result
-      if changediff
-** Processing line: ~        case state.new_difficulty~
+    def create_thruster_flames! ship
+** Processing line: ~      state.flames << state.new_entity(:ship_thruster,~
 - Inside source: true
 *** True Line Result
-        case state.new_difficulty
-** Processing line: ~        when :easy~
+      state.flames << state.new_entity(:ship_thruster,
+** Processing line: ~                                     { angle: ship.angle + 180 + 60.randomize(:sign, :ratio),~
 - Inside source: true
 *** True Line Result
-        when :easy
-** Processing line: ~          state.new_difficulty = :normal~
+                                     { angle: ship.angle + 180 + 60.randomize(:sign, :ratio),
+** Processing line: ~                                       speed: 5.randomize(:ratio),~
 - Inside source: true
 *** True Line Result
-          state.new_difficulty = :normal
-** Processing line: ~        when :normal~
+                                       speed: 5.randomize(:ratio),
+** Processing line: ~                                       max_alpha: 255 * ship.created_at_elapsed.percentage_of(2.seconds),~
 - Inside source: true
 *** True Line Result
-        when :normal
-** Processing line: ~          state.new_difficulty = :hard~
+                                       max_alpha: 255 * ship.created_at_elapsed.percentage_of(2.seconds),
+** Processing line: ~                                       lifetime: 30,~
 - Inside source: true
 *** True Line Result
-          state.new_difficulty = :hard
-** Processing line: ~        when :hard~
+                                       lifetime: 30,
+** Processing line: ~                                       x: ship.x - ship.angle.vector_x(40) + 5.randomize(:sign, :ratio),~
 - Inside source: true
 *** True Line Result
-        when :hard
-** Processing line: ~          state.new_difficulty = :flappy~
+                                       x: ship.x - ship.angle.vector_x(40) + 5.randomize(:sign, :ratio),
+** Processing line: ~                                       y: ship.y - ship.angle.vector_y(40) + 5.randomize(:sign, :ratio) })~
 - Inside source: true
 *** True Line Result
-          state.new_difficulty = :flappy
-** Processing line: ~        when :flappy~
+                                       y: ship.y - ship.angle.vector_y(40) + 5.randomize(:sign, :ratio) })
+** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
-        when :flappy
-** Processing line: ~          state.new_difficulty = :easy~
+    end
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-          state.new_difficulty = :easy
-** Processing line: ~        end~
+
+** Processing line: ~    def input_accelerate_ship should_move_ship, ship~
 - Inside source: true
 *** True Line Result
-        end
-** Processing line: ~      end~
+    def input_accelerate_ship should_move_ship, ship
+** Processing line: ~      return if ship.dead~
 - Inside source: true
 *** True Line Result
-      end
+      return if ship.dead
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~      if inputs.keyboard.key_down.enter || inputs.controller_one.key_down.start || inputs.controller_one.key_down.a~
-- Inside source: true
-*** True Line Result
-      if inputs.keyboard.key_down.enter || inputs.controller_one.key_down.start || inputs.controller_one.key_down.a
-** Processing line: ~        state.difficulty = state.new_difficulty~
-- Inside source: true
-*** True Line Result
-        state.difficulty = state.new_difficulty
-** Processing line: ~        change_to_scene :game~
+** Processing line: ~      should_move_ship &&= (ship.dx + ship.dy).abs < 5~
 - Inside source: true
 *** True Line Result
-        change_to_scene :game
-** Processing line: ~        reset_game false~
+      should_move_ship &&= (ship.dx + ship.dy).abs < 5
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-        reset_game false
-** Processing line: ~        state.hi_score = 0~
+
+** Processing line: ~      if should_move_ship~
 - Inside source: true
 *** True Line Result
-        state.hi_score = 0
-** Processing line: ~        begin_countdown~
+      if should_move_ship
+** Processing line: ~        create_thruster_flames! ship~
 - Inside source: true
 *** True Line Result
-        begin_countdown
-** Processing line: ~      end~
+        create_thruster_flames! ship
+** Processing line: ~        ship.dx += ship.angle.vector_x 0.050~
 - Inside source: true
 *** True Line Result
-      end
-** Processing line: ~~
+        ship.dx += ship.angle.vector_x 0.050
+** Processing line: ~        ship.dy += ship.angle.vector_y 0.050~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~      if inputs.keyboard.key_down.escape || (inputs.mouse.click && !changediff) || inputs.controller_one.key_down.b~
+        ship.dy += ship.angle.vector_y 0.050
+** Processing line: ~      else~
 - Inside source: true
 *** True Line Result
-      if inputs.keyboard.key_down.escape || (inputs.mouse.click && !changediff) || inputs.controller_one.key_down.b
-** Processing line: ~        state.new_difficulty = state.difficulty~
+      else
+** Processing line: ~        ship.dx *= 0.99~
 - Inside source: true
 *** True Line Result
-        state.new_difficulty = state.difficulty
-** Processing line: ~        change_to_scene :game~
+        ship.dx *= 0.99
+** Processing line: ~        ship.dy *= 0.99~
 - Inside source: true
 *** True Line Result
-        change_to_scene :game
+        ship.dy *= 0.99
 ** Processing line: ~      end~
 - Inside source: true
 *** True Line Result
@@ -94323,118 +95735,114 @@ Follows is a source code listing for all files that have been open sourced. This
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~    def process_inputs_game~
+** Processing line: ~    def input_accelerate~
 - Inside source: true
 *** True Line Result
-    def process_inputs_game
-** Processing line: ~      return unless state.scene == :game~
+    def input_accelerate
+** Processing line: ~      input_accelerate_ship inputs.controller_one.key_held.r1 || inputs.keyboard.up, state.ship_blue~
 - Inside source: true
 *** True Line Result
-      return unless state.scene == :game
-** Processing line: ~~
+      input_accelerate_ship inputs.controller_one.key_held.r1 || inputs.keyboard.up, state.ship_blue
+** Processing line: ~      input_accelerate_ship inputs.controller_two.key_held.r1, state.ship_red~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~      clicked_menu = false~
+      input_accelerate_ship inputs.controller_two.key_held.r1, state.ship_red
+** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
-      clicked_menu = false
-** Processing line: ~      if inputs.mouse.click~
+    end
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-      if inputs.mouse.click
-** Processing line: ~        p = inputs.mouse.click.point~
+
+** Processing line: ~    def input_turn_ship direction, ship~
 - Inside source: true
 *** True Line Result
-        p = inputs.mouse.click.point
-** Processing line: ~        clicked_menu = (p.y >= 620) && (p.x < 275)~
+    def input_turn_ship direction, ship
+** Processing line: ~      ship.angle -= 3 * direction~
 - Inside source: true
 *** True Line Result
-        clicked_menu = (p.y >= 620) && (p.x < 275)
-** Processing line: ~      end~
+      ship.angle -= 3 * direction
+** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
-      end
+    end
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~      if clicked_menu || inputs.keyboard.key_down.escape || inputs.keyboard.key_down.enter || inputs.controller_one.key_down.start~
-- Inside source: true
-*** True Line Result
-      if clicked_menu || inputs.keyboard.key_down.escape || inputs.keyboard.key_down.enter || inputs.controller_one.key_down.start
-** Processing line: ~        change_to_scene :menu~
+** Processing line: ~    def input_turn~
 - Inside source: true
 *** True Line Result
-        change_to_scene :menu
-** Processing line: ~      elsif (inputs.mouse.down || inputs.mouse.click || inputs.keyboard.key_down.space || inputs.controller_one.key_down.a) && state.countdown == 0~
+    def input_turn
+** Processing line: ~      input_turn_ship inputs.controller_one.left_right + inputs.keyboard.left_right, state.ship_blue~
 - Inside source: true
 *** True Line Result
-      elsif (inputs.mouse.down || inputs.mouse.click || inputs.keyboard.key_down.space || inputs.controller_one.key_down.a) && state.countdown == 0
-** Processing line: ~        state.dy = 0~
+      input_turn_ship inputs.controller_one.left_right + inputs.keyboard.left_right, state.ship_blue
+** Processing line: ~      input_turn_ship inputs.controller_two.left_right, state.ship_red~
 - Inside source: true
 *** True Line Result
-        state.dy = 0
-** Processing line: ~        state.dy += state.flap_power~
+      input_turn_ship inputs.controller_two.left_right, state.ship_red
+** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
-        state.dy += state.flap_power
-** Processing line: ~        state.flapped_at = state.tick_count~
+    end
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-        state.flapped_at = state.tick_count
-** Processing line: ~        outputs.sounds << "sounds/fly-sound.wav"~
+
+** Processing line: ~    def input_bullet create_bullet, ship~
 - Inside source: true
 *** True Line Result
-        outputs.sounds << "sounds/fly-sound.wav"
-** Processing line: ~      end~
+    def input_bullet create_bullet, ship
+** Processing line: ~      return unless create_bullet~
 - Inside source: true
 *** True Line Result
-      end
-** Processing line: ~    end~
+      return unless create_bullet
+** Processing line: ~      return if ship.dead~
 - Inside source: true
 *** True Line Result
-    end
+      return if ship.dead
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~    def scrolling_background at, path, rate, y = 0~
+** Processing line: ~      state.bullets << state.new_entity(:ship_bullet,~
 - Inside source: true
 *** True Line Result
-    def scrolling_background at, path, rate, y = 0
-** Processing line: ~      [~
+      state.bullets << state.new_entity(:ship_bullet,
+** Processing line: ~                                      { owner: ship,~
 - Inside source: true
 *** True Line Result
-      [
-** Processing line: ~        [   0 - at.*(rate) % 1440, y, 1440, 720, path],~
+                                      { owner: ship,
+** Processing line: ~                                        angle: ship.angle,~
 - Inside source: true
 *** True Line Result
-        [   0 - at.*(rate) % 1440, y, 1440, 720, path],
-** Processing line: ~        [1440 - at.*(rate) % 1440, y, 1440, 720, path]~
+                                        angle: ship.angle,
+** Processing line: ~                                        max_alpha: 255 * ship.created_at_elapsed.percentage_of(2.seconds),~
 - Inside source: true
 *** True Line Result
-        [1440 - at.*(rate) % 1440, y, 1440, 720, path]
-** Processing line: ~      ]~
+                                        max_alpha: 255 * ship.created_at_elapsed.percentage_of(2.seconds),
+** Processing line: ~                                        speed: 5 + ship.dx.mult(ship.angle.vector_x) + ship.dy.mult(ship.angle.vector_y),~
 - Inside source: true
 *** True Line Result
-      ]
-** Processing line: ~    end~
+                                        speed: 5 + ship.dx.mult(ship.angle.vector_x) + ship.dy.mult(ship.angle.vector_y),
+** Processing line: ~                                        lifetime: 120,~
 - Inside source: true
 *** True Line Result
-    end
-** Processing line: ~~
+                                        lifetime: 120,
+** Processing line: ~                                        sprite_size: 10,~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~    def white~
+                                        sprite_size: 10,
+** Processing line: ~                                        x: ship.x + ship.angle.vector_x * 32,~
 - Inside source: true
 *** True Line Result
-    def white
-** Processing line: ~      [255, 255, 255]~
+                                        x: ship.x + ship.angle.vector_x * 32,
+** Processing line: ~                                        y: ship.y + ship.angle.vector_y * 32 })~
 - Inside source: true
 *** True Line Result
-      [255, 255, 255]
+                                        y: ship.y + ship.angle.vector_y * 32 })
 ** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
@@ -94443,58 +95851,58 @@ Follows is a source code listing for all files that have been open sourced. This
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~    def large_white_typeset~
+** Processing line: ~    def input_mine create_mine, ship~
 - Inside source: true
 *** True Line Result
-    def large_white_typeset
-** Processing line: ~      [5, 0, 255, 255, 255]~
+    def input_mine create_mine, ship
+** Processing line: ~      return unless create_mine~
 - Inside source: true
 *** True Line Result
-      [5, 0, 255, 255, 255]
-** Processing line: ~    end~
+      return unless create_mine
+** Processing line: ~      return if ship.dead~
 - Inside source: true
 *** True Line Result
-    end
+      return if ship.dead
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~    def at_beginning?~
+** Processing line: ~      state.bullets << state.new_entity(:ship_bullet,~
 - Inside source: true
 *** True Line Result
-    def at_beginning?
-** Processing line: ~      state.walls.count == 0~
+      state.bullets << state.new_entity(:ship_bullet,
+** Processing line: ~                                      { owner: ship,~
 - Inside source: true
 *** True Line Result
-      state.walls.count == 0
-** Processing line: ~    end~
+                                      { owner: ship,
+** Processing line: ~                                        angle: 360.randomize(:sign, :ratio),~
 - Inside source: true
 *** True Line Result
-    end
-** Processing line: ~~
+                                        angle: 360.randomize(:sign, :ratio),
+** Processing line: ~                                        max_alpha: 255 * ship.created_at_elapsed.percentage_of(2.seconds),~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~    def dragon_collision_box~
+                                        max_alpha: 255 * ship.created_at_elapsed.percentage_of(2.seconds),
+** Processing line: ~                                        speed: 0.02,~
 - Inside source: true
 *** True Line Result
-    def dragon_collision_box
-** Processing line: ~      state.dragon_sprite~
+                                        speed: 0.02,
+** Processing line: ~                                        sprite_size: 10,~
 - Inside source: true
 *** True Line Result
-      state.dragon_sprite
-** Processing line: ~          .scale_rect(1.0 - collision_forgiveness, 0.5, 0.5)~
+                                        sprite_size: 10,
+** Processing line: ~                                        lifetime: 600,~
 - Inside source: true
 *** True Line Result
-          .scale_rect(1.0 - collision_forgiveness, 0.5, 0.5)
-** Processing line: ~          .rect_shift_right(10)~
+                                        lifetime: 600,
+** Processing line: ~                                        x: ship.x + ship.angle.vector_x * -50,~
 - Inside source: true
 *** True Line Result
-          .rect_shift_right(10)
-** Processing line: ~          .rect_shift_up(state.dy * 2)~
+                                        x: ship.x + ship.angle.vector_x * -50,
+** Processing line: ~                                        y: ship.y + ship.angle.vector_y * -50 })~
 - Inside source: true
 *** True Line Result
-          .rect_shift_up(state.dy * 2)
+                                        y: ship.y + ship.angle.vector_y * -50 })
 ** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
@@ -94503,94 +95911,78 @@ Follows is a source code listing for all files that have been open sourced. This
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~    def game_over?~
+** Processing line: ~    def input_bullets_and_mines~
 - Inside source: true
 *** True Line Result
-    def game_over?
-** Processing line: ~      return true if state.y <= 0.-(500 * collision_forgiveness) && !at_beginning?~
+    def input_bullets_and_mines
+** Processing line: ~      return if state.bullets.length > 100~
 - Inside source: true
 *** True Line Result
-      return true if state.y <= 0.-(500 * collision_forgiveness) && !at_beginning?
+      return if state.bullets.length > 100
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~      state.walls~
-- Inside source: true
-*** True Line Result
-      state.walls
-** Processing line: ~          .flat_map { |w| w.sprites }~
-- Inside source: true
-*** True Line Result
-          .flat_map { |w| w.sprites }
-** Processing line: ~          .any? do |s|~
-- Inside source: true
-*** True Line Result
-          .any? do |s|
-** Processing line: ~            s.intersect_rect?(dragon_collision_box)~
-- Inside source: true
-*** True Line Result
-            s.intersect_rect?(dragon_collision_box)
-** Processing line: ~          end~
+** Processing line: ~      [~
 - Inside source: true
 *** True Line Result
-          end
-** Processing line: ~    end~
+      [
+** Processing line: ~        [inputs.controller_one.key_held.a || inputs.keyboard.key_held.space,~
 - Inside source: true
 *** True Line Result
-    end
-** Processing line: ~~
+        [inputs.controller_one.key_held.a || inputs.keyboard.key_held.space,
+** Processing line: ~         inputs.controller_one.key_down.b || inputs.keyboard.key_down.down,~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~    def collision_forgiveness~
+         inputs.controller_one.key_down.b || inputs.keyboard.key_down.down,
+** Processing line: ~         state.ship_blue],~
 - Inside source: true
 *** True Line Result
-    def collision_forgiveness
-** Processing line: ~      case state.difficulty~
+         state.ship_blue],
+** Processing line: ~        [inputs.controller_two.key_held.a, inputs.controller_two.key_down.b, state.ship_red]~
 - Inside source: true
 *** True Line Result
-      case state.difficulty
-** Processing line: ~      when :easy~
+        [inputs.controller_two.key_held.a, inputs.controller_two.key_down.b, state.ship_red]
+** Processing line: ~      ].each do |a_held, b_down, ship|~
 - Inside source: true
 *** True Line Result
-      when :easy
-** Processing line: ~        0.9~
+      ].each do |a_held, b_down, ship|
+** Processing line: ~        input_bullet(a_held && state.tick_count.mod_zero?(10).or(a_held == 0), ship)~
 - Inside source: true
 *** True Line Result
-        0.9
-** Processing line: ~      when :normal~
+        input_bullet(a_held && state.tick_count.mod_zero?(10).or(a_held == 0), ship)
+** Processing line: ~        input_mine(b_down, ship)~
 - Inside source: true
 *** True Line Result
-      when :normal
-** Processing line: ~        0.7~
+        input_mine(b_down, ship)
+** Processing line: ~      end~
 - Inside source: true
 *** True Line Result
-        0.7
-** Processing line: ~      when :hard~
+      end
+** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
-      when :hard
-** Processing line: ~        0.5~
+    end
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-        0.5
-** Processing line: ~      when :flappy~
+
+** Processing line: ~    def calc_kill_ships~
 - Inside source: true
 *** True Line Result
-      when :flappy
-** Processing line: ~        0.3~
+    def calc_kill_ships
+** Processing line: ~      alive_ships.find_all { |s| s.damage >= 5 }.each do |s|~
 - Inside source: true
 *** True Line Result
-        0.3
-** Processing line: ~      else~
+      alive_ships.find_all { |s| s.damage >= 5 }.each do |s|
+** Processing line: ~        s.dead = true~
 - Inside source: true
 *** True Line Result
-      else
-** Processing line: ~        0.9~
+        s.dead = true
+** Processing line: ~        create_explosion! :ship_explosion, s, 20, 20, 30, s.max_alpha~
 - Inside source: true
 *** True Line Result
-        0.9
+        create_explosion! :ship_explosion, s, 20, 20, 30, s.max_alpha
 ** Processing line: ~      end~
 - Inside source: true
 *** True Line Result
@@ -94603,46 +95995,50 @@ Follows is a source code listing for all files that have been open sourced. This
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~    def countdown_text~
+** Processing line: ~    def calc_score~
 - Inside source: true
 *** True Line Result
-    def countdown_text
-** Processing line: ~      state.countdown ||= -1~
+    def calc_score
+** Processing line: ~      return if state.round_finished~
 - Inside source: true
 *** True Line Result
-      state.countdown ||= -1
-** Processing line: ~      return ""          if state.countdown == 0~
+      return if state.round_finished
+** Processing line: ~      return if alive_ships.length > 1~
 - Inside source: true
 *** True Line Result
-      return ""          if state.countdown == 0
-** Processing line: ~      return "GO!"       if state.countdown.idiv(60) == 0~
+      return if alive_ships.length > 1
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-      return "GO!"       if state.countdown.idiv(60) == 0
-** Processing line: ~      return "GAME OVER" if state.death_at~
+
+** Processing line: ~      if alive_ships.first == state.ship_red~
 - Inside source: true
 *** True Line Result
-      return "GAME OVER" if state.death_at
-** Processing line: ~      return "READY?"~
+      if alive_ships.first == state.ship_red
+** Processing line: ~        state.ship_red_score += 1~
 - Inside source: true
 *** True Line Result
-      return "READY?"
-** Processing line: ~    end~
+        state.ship_red_score += 1
+** Processing line: ~      elsif alive_ships.first == state.ship_blue~
 - Inside source: true
 *** True Line Result
-    end
-** Processing line: ~~
+      elsif alive_ships.first == state.ship_blue
+** Processing line: ~        state.ship_blue_score += 1~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~    def begin_countdown~
+        state.ship_blue_score += 1
+** Processing line: ~      end~
 - Inside source: true
 *** True Line Result
-    def begin_countdown
-** Processing line: ~      state.countdown = 4.seconds~
+      end
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-      state.countdown = 4.seconds
+
+** Processing line: ~      state.round_finished = true~
+- Inside source: true
+*** True Line Result
+      state.round_finished = true
 ** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
@@ -94651,30 +96047,30 @@ Follows is a source code listing for all files that have been open sourced. This
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~    def score_text~
+** Processing line: ~    def calc_reset_ships~
 - Inside source: true
 *** True Line Result
-    def score_text
-** Processing line: ~      return ""                        unless state.countdown > 1.seconds~
+    def calc_reset_ships
+** Processing line: ~      return unless state.round_finished~
 - Inside source: true
 *** True Line Result
-      return ""                        unless state.countdown > 1.seconds
-** Processing line: ~      return ""                        unless state.death_at~
+      return unless state.round_finished
+** Processing line: ~      state.round_finished_debounce ||= 2.seconds~
 - Inside source: true
 *** True Line Result
-      return ""                        unless state.death_at
-** Processing line: ~      return "SCORE: 0 (LOL)"          if state.score == 0~
+      state.round_finished_debounce ||= 2.seconds
+** Processing line: ~      state.round_finished_debounce -= 1~
 - Inside source: true
 *** True Line Result
-      return "SCORE: 0 (LOL)"          if state.score == 0
-** Processing line: ~      return "HI SCORE: #{state.score}" if state.score == state.hi_score~
+      state.round_finished_debounce -= 1
+** Processing line: ~      return if state.round_finished_debounce > 0~
 - Inside source: true
 *** True Line Result
-      return "HI SCORE: #{state.score}" if state.score == state.hi_score
-** Processing line: ~      return "SCORE: #{state.score}"~
+      return if state.round_finished_debounce > 0
+** Processing line: ~      start_new_round!~
 - Inside source: true
 *** True Line Result
-      return "SCORE: #{state.score}"
+      start_new_round!
 ** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
@@ -94683,46 +96079,34 @@ Follows is a source code listing for all files that have been open sourced. This
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~    def reset_game set_flash = true~
-- Inside source: true
-*** True Line Result
-    def reset_game set_flash = true
-** Processing line: ~      state.flash_at = state.tick_count if set_flash~
-- Inside source: true
-*** True Line Result
-      state.flash_at = state.tick_count if set_flash
-** Processing line: ~      state.walls = []~
-- Inside source: true
-*** True Line Result
-      state.walls = []
-** Processing line: ~      state.y = 500~
+** Processing line: ~    def start_new_round!~
 - Inside source: true
 *** True Line Result
-      state.y = 500
-** Processing line: ~      state.dy = 0~
+    def start_new_round!
+** Processing line: ~      state.ship_blue = new_blue_ship~
 - Inside source: true
 *** True Line Result
-      state.dy = 0
-** Processing line: ~      state.hi_score = state.hi_score.greater(state.score)~
+      state.ship_blue = new_blue_ship
+** Processing line: ~      state.ship_red  = new_red_ship~
 - Inside source: true
 *** True Line Result
-      state.hi_score = state.hi_score.greater(state.score)
-** Processing line: ~      state.score = 0~
+      state.ship_red  = new_red_ship
+** Processing line: ~      state.round_finished = false~
 - Inside source: true
 *** True Line Result
-      state.score = 0
-** Processing line: ~      state.wall_countdown = state.wall_countdown_length.fdiv(2)~
+      state.round_finished = false
+** Processing line: ~      state.round_finished_debounce = nil~
 - Inside source: true
 *** True Line Result
-      state.wall_countdown = state.wall_countdown_length.fdiv(2)
-** Processing line: ~      state.show_death = false~
+      state.round_finished_debounce = nil
+** Processing line: ~      state.flames.clear~
 - Inside source: true
 *** True Line Result
-      state.show_death = false
-** Processing line: ~      state.death_at = nil~
+      state.flames.clear
+** Processing line: ~      state.bullets.clear~
 - Inside source: true
 *** True Line Result
-      state.death_at = nil
+      state.bullets.clear
 ** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
@@ -94731,26 +96115,22 @@ Follows is a source code listing for all files that have been open sourced. This
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~    def change_to_scene scene~
-- Inside source: true
-*** True Line Result
-    def change_to_scene scene
-** Processing line: ~      state.scene = scene~
+** Processing line: ~    def calc_winner~
 - Inside source: true
 *** True Line Result
-      state.scene = scene
-** Processing line: ~      state.scene_at = state.tick_count~
+    def calc_winner
+** Processing line: ~      calc_kill_ships~
 - Inside source: true
 *** True Line Result
-      state.scene_at = state.tick_count
-** Processing line: ~      inputs.keyboard.clear~
+      calc_kill_ships
+** Processing line: ~      calc_score~
 - Inside source: true
 *** True Line Result
-      inputs.keyboard.clear
-** Processing line: ~      inputs.controller_one.clear~
+      calc_score
+** Processing line: ~      calc_reset_ships~
 - Inside source: true
 *** True Line Result
-      inputs.controller_one.clear
+      calc_reset_ships
 ** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
@@ -94763,10 +96143,10 @@ Follows is a source code listing for all files that have been open sourced. This
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~  $flappy_dragon = FlappyDragon.new~
+** Processing line: ~  $dueling_spaceship = DuelingSpaceships.new~
 - Inside source: true
 *** True Line Result
-  $flappy_dragon = FlappyDragon.new
+  $dueling_spaceship = DuelingSpaceships.new
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
@@ -94775,26 +96155,30 @@ Follows is a source code listing for all files that have been open sourced. This
 - Inside source: true
 *** True Line Result
   def tick args
-** Processing line: ~    $flappy_dragon.grid = args.grid~
+** Processing line: ~    args.grid.origin_center!~
 - Inside source: true
 *** True Line Result
-    $flappy_dragon.grid = args.grid
-** Processing line: ~    $flappy_dragon.inputs = args.inputs~
+    args.grid.origin_center!
+** Processing line: ~    $dueling_spaceship.inputs  = args.inputs~
 - Inside source: true
 *** True Line Result
-    $flappy_dragon.inputs = args.inputs
-** Processing line: ~    $flappy_dragon.state = args.state~
+    $dueling_spaceship.inputs  = args.inputs
+** Processing line: ~    $dueling_spaceship.outputs = args.outputs~
 - Inside source: true
 *** True Line Result
-    $flappy_dragon.state = args.state
-** Processing line: ~    $flappy_dragon.outputs = args.outputs~
+    $dueling_spaceship.outputs = args.outputs
+** Processing line: ~    $dueling_spaceship.state    = args.state~
 - Inside source: true
 *** True Line Result
-    $flappy_dragon.outputs = args.outputs
-** Processing line: ~    $flappy_dragon.tick~
+    $dueling_spaceship.state    = args.state
+** Processing line: ~    $dueling_spaceship.grid    = args.grid~
 - Inside source: true
 *** True Line Result
-    $flappy_dragon.tick
+    $dueling_spaceship.grid    = args.grid
+** Processing line: ~    $dueling_spaceship.tick~
+- Inside source: true
+*** True Line Result
+    $dueling_spaceship.tick
 ** Processing line: ~  end~
 - Inside source: true
 *** True Line Result
@@ -94811,162 +96195,182 @@ Follows is a source code listing for all files that have been open sourced. This
 - End of paragraph detected.
 *** True Line Result
 
-** Processing line: ~*** Arcade - Pong - main.rb~
+** Processing line: ~*** arcade/flappy dragon/credits.txt~
 - Header detected.
 *** True Line Result
 
 *** True Line Result
-*** Arcade - Pong - main.rb
+*** arcade/flappy dragon/credits.txt
 ** Processing line: ~#+begin_src ruby~
 - Line was identified as the beginning of a code block.
 *** True Line Result
 
 *** True Line Result
 #+begin_src ruby
-** Processing line: ~  # ./samples/99_genre_arcade/pong/app/main.rb~
+** Processing line: ~  # ./samples/99_genre_arcade/flappy_dragon/CREDITS.txt~
 - Inside source: true
 *** True Line Result
-  # ./samples/99_genre_arcade/pong/app/main.rb
-** Processing line: ~  def tick args~
+  # ./samples/99_genre_arcade/flappy_dragon/CREDITS.txt
+** Processing line: ~  code: Amir Rajan, https://twitter.com/amirrajan~
 - Inside source: true
 *** True Line Result
-  def tick args
-** Processing line: ~    defaults args~
+  code: Amir Rajan, https://twitter.com/amirrajan
+** Processing line: ~  graphics and audio: Nick Culbertson, https://twitter.com/MobyPixel~
 - Inside source: true
 *** True Line Result
-    defaults args
-** Processing line: ~    render args~
+  graphics and audio: Nick Culbertson, https://twitter.com/MobyPixel
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-    render args
-** Processing line: ~    calc args~
+
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-    calc args
-** Processing line: ~    input args~
+
+** Processing line: ~#+end_src~
+- Line was identified as the end of a code block.
+*** True Line Result
+#+end_src
+** Processing line: ~~
+- End of paragraph detected.
+*** True Line Result
+
+** Processing line: ~*** arcade/flappy dragon/main.rb~
+- Header detected.
+*** True Line Result
+
+*** True Line Result
+*** arcade/flappy dragon/main.rb
+** Processing line: ~#+begin_src ruby~
+- Line was identified as the beginning of a code block.
+*** True Line Result
+
+*** True Line Result
+#+begin_src ruby
+** Processing line: ~  # ./samples/99_genre_arcade/flappy_dragon/app/main.rb~
 - Inside source: true
 *** True Line Result
-    input args
-** Processing line: ~  end~
+  # ./samples/99_genre_arcade/flappy_dragon/app/main.rb
+** Processing line: ~  class FlappyDragon~
 - Inside source: true
 *** True Line Result
-  end
-** Processing line: ~~
+  class FlappyDragon
+** Processing line: ~    attr_accessor :grid, :inputs, :state, :outputs~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~  def defaults args~
+    attr_accessor :grid, :inputs, :state, :outputs
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-  def defaults args
-** Processing line: ~    args.state.ball.debounce       ||= 3 * 60~
+
+** Processing line: ~    def tick~
 - Inside source: true
 *** True Line Result
-    args.state.ball.debounce       ||= 3 * 60
-** Processing line: ~    args.state.ball.size           ||= 10~
+    def tick
+** Processing line: ~      defaults~
 - Inside source: true
 *** True Line Result
-    args.state.ball.size           ||= 10
-** Processing line: ~    args.state.ball.size_half      ||= args.state.ball.size / 2~
+      defaults
+** Processing line: ~      render~
 - Inside source: true
 *** True Line Result
-    args.state.ball.size_half      ||= args.state.ball.size / 2
-** Processing line: ~    args.state.ball.x              ||= 640~
+      render
+** Processing line: ~      calc~
 - Inside source: true
 *** True Line Result
-    args.state.ball.x              ||= 640
-** Processing line: ~    args.state.ball.y              ||= 360~
+      calc
+** Processing line: ~      process_inputs~
 - Inside source: true
 *** True Line Result
-    args.state.ball.y              ||= 360
-** Processing line: ~    args.state.ball.dx             ||= 5.randomize(:sign)~
+      process_inputs
+** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
-    args.state.ball.dx             ||= 5.randomize(:sign)
-** Processing line: ~    args.state.ball.dy             ||= 5.randomize(:sign)~
+    end
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-    args.state.ball.dy             ||= 5.randomize(:sign)
-** Processing line: ~    args.state.left_paddle.y       ||= 360~
+
+** Processing line: ~    def defaults~
 - Inside source: true
 *** True Line Result
-    args.state.left_paddle.y       ||= 360
-** Processing line: ~    args.state.right_paddle.y      ||= 360~
+    def defaults
+** Processing line: ~      state.flap_power              = 11~
 - Inside source: true
 *** True Line Result
-    args.state.right_paddle.y      ||= 360
-** Processing line: ~    args.state.paddle.h            ||= 120~
+      state.flap_power              = 11
+** Processing line: ~      state.gravity                 = 0.9~
 - Inside source: true
 *** True Line Result
-    args.state.paddle.h            ||= 120
-** Processing line: ~    args.state.paddle.w            ||= 10~
+      state.gravity                 = 0.9
+** Processing line: ~      state.ceiling                 = 600~
 - Inside source: true
 *** True Line Result
-    args.state.paddle.w            ||= 10
-** Processing line: ~    args.state.left_paddle.score   ||= 0~
+      state.ceiling                 = 600
+** Processing line: ~      state.ceiling_flap_power      = 6~
 - Inside source: true
 *** True Line Result
-    args.state.left_paddle.score   ||= 0
-** Processing line: ~    args.state.right_paddle.score  ||= 0~
+      state.ceiling_flap_power      = 6
+** Processing line: ~      state.wall_countdown_length   = 100~
 - Inside source: true
 *** True Line Result
-    args.state.right_paddle.score  ||= 0
-** Processing line: ~  end~
+      state.wall_countdown_length   = 100
+** Processing line: ~      state.wall_gap_size           = 100~
 - Inside source: true
 *** True Line Result
-  end
-** Processing line: ~~
+      state.wall_gap_size           = 100
+** Processing line: ~      state.wall_countdown        ||= 0~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~  def render args~
+      state.wall_countdown        ||= 0
+** Processing line: ~      state.hi_score              ||= 0~
 - Inside source: true
 *** True Line Result
-  def render args
-** Processing line: ~    render_center_line args~
+      state.hi_score              ||= 0
+** Processing line: ~      state.score                 ||= 0~
 - Inside source: true
 *** True Line Result
-    render_center_line args
-** Processing line: ~    render_scores args~
+      state.score                 ||= 0
+** Processing line: ~      state.walls                 ||= []~
 - Inside source: true
 *** True Line Result
-    render_scores args
-** Processing line: ~    render_countdown args~
+      state.walls                 ||= []
+** Processing line: ~      state.x                     ||= 50~
 - Inside source: true
 *** True Line Result
-    render_countdown args
-** Processing line: ~    render_ball args~
+      state.x                     ||= 50
+** Processing line: ~      state.y                     ||= 500~
 - Inside source: true
 *** True Line Result
-    render_ball args
-** Processing line: ~    render_paddles args~
+      state.y                     ||= 500
+** Processing line: ~      state.dy                    ||= 0~
 - Inside source: true
 *** True Line Result
-    render_paddles args
-** Processing line: ~    render_instructions args~
+      state.dy                    ||= 0
+** Processing line: ~      state.scene                 ||= :menu~
 - Inside source: true
 *** True Line Result
-    render_instructions args
-** Processing line: ~  end~
+      state.scene                 ||= :menu
+** Processing line: ~      state.scene_at              ||= 0~
 - Inside source: true
 *** True Line Result
-  end
-** Processing line: ~~
+      state.scene_at              ||= 0
+** Processing line: ~      state.difficulty            ||= :normal~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~  begin :render_methods~
+      state.difficulty            ||= :normal
+** Processing line: ~      state.new_difficulty        ||= :normal~
 - Inside source: true
 *** True Line Result
-  begin :render_methods
-** Processing line: ~    def render_center_line args~
+      state.new_difficulty        ||= :normal
+** Processing line: ~      state.countdown             ||= 4.seconds~
 - Inside source: true
 *** True Line Result
-    def render_center_line args
-** Processing line: ~      args.outputs.lines  << [640, 0, 640, 720]~
+      state.countdown             ||= 4.seconds
+** Processing line: ~      state.flash_at              ||= 0~
 - Inside source: true
 *** True Line Result
-      args.outputs.lines  << [640, 0, 640, 720]
+      state.flash_at              ||= 0
 ** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
@@ -94975,26 +96379,26 @@ Follows is a source code listing for all files that have been open sourced. This
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~    def render_scores args~
+** Processing line: ~    def render~
 - Inside source: true
 *** True Line Result
-    def render_scores args
-** Processing line: ~      args.outputs.labels << [~
+    def render
+** Processing line: ~      outputs.sounds << "sounds/flappy-song.ogg" if state.tick_count == 1~
 - Inside source: true
 *** True Line Result
-      args.outputs.labels << [
-** Processing line: ~        [320, 650, args.state.left_paddle.score, 10, 1],~
+      outputs.sounds << "sounds/flappy-song.ogg" if state.tick_count == 1
+** Processing line: ~      render_score~
 - Inside source: true
 *** True Line Result
-        [320, 650, args.state.left_paddle.score, 10, 1],
-** Processing line: ~        [960, 650, args.state.right_paddle.score, 10, 1]~
+      render_score
+** Processing line: ~      render_menu~
 - Inside source: true
 *** True Line Result
-        [960, 650, args.state.right_paddle.score, 10, 1]
-** Processing line: ~      ]~
+      render_menu
+** Processing line: ~      render_game~
 - Inside source: true
 *** True Line Result
-      ]
+      render_game
 ** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
@@ -95003,18 +96407,22 @@ Follows is a source code listing for all files that have been open sourced. This
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~    def render_countdown args~
+** Processing line: ~    def render_score~
 - Inside source: true
 *** True Line Result
-    def render_countdown args
-** Processing line: ~      return unless args.state.ball.debounce > 0~
+    def render_score
+** Processing line: ~      outputs.primitives << { x: 10, y: 710, text: "HI SCORE: #{state.hi_score}", **large_white_typeset }~
 - Inside source: true
 *** True Line Result
-      return unless args.state.ball.debounce > 0
-** Processing line: ~      args.outputs.labels << [640, 360, "%.2f" % args.state.ball.debounce.fdiv(60), 10, 1]~
+      outputs.primitives << { x: 10, y: 710, text: "HI SCORE: #{state.hi_score}", **large_white_typeset }
+** Processing line: ~      outputs.primitives << { x: 10, y: 680, text: "SCORE: #{state.score}", **large_white_typeset }~
 - Inside source: true
 *** True Line Result
-      args.outputs.labels << [640, 360, "%.2f" % args.state.ball.debounce.fdiv(60), 10, 1]
+      outputs.primitives << { x: 10, y: 680, text: "SCORE: #{state.score}", **large_white_typeset }
+** Processing line: ~      outputs.primitives << { x: 10, y: 650, text: "DIFFICULTY: #{state.difficulty.upcase}", **large_white_typeset }~
+- Inside source: true
+*** True Line Result
+      outputs.primitives << { x: 10, y: 650, text: "DIFFICULTY: #{state.difficulty.upcase}", **large_white_typeset }
 ** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
@@ -95023,114 +96431,138 @@ Follows is a source code listing for all files that have been open sourced. This
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~    def render_ball args~
+** Processing line: ~    def render_menu~
 - Inside source: true
 *** True Line Result
-    def render_ball args
-** Processing line: ~      args.outputs.solids << solid_ball(args)~
+    def render_menu
+** Processing line: ~      return unless state.scene == :menu~
 - Inside source: true
 *** True Line Result
-      args.outputs.solids << solid_ball(args)
-** Processing line: ~    end~
+      return unless state.scene == :menu
+** Processing line: ~      render_overlay~
 - Inside source: true
 *** True Line Result
-    end
+      render_overlay
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~    def render_paddles args~
+** Processing line: ~      outputs.labels << { x: 640, y: 700, text: "Flappy Dragon", size_enum: 50, alignment_enum: 1, **white }~
 - Inside source: true
 *** True Line Result
-    def render_paddles args
-** Processing line: ~      args.outputs.solids << solid_left_paddle(args)~
+      outputs.labels << { x: 640, y: 700, text: "Flappy Dragon", size_enum: 50, alignment_enum: 1, **white }
+** Processing line: ~      outputs.labels << { x: 640, y: 500, text: "Instructions: Press Spacebar to flap. Don't die.", size_enum: 4, alignment_enum: 1, **white }~
 - Inside source: true
 *** True Line Result
-      args.outputs.solids << solid_left_paddle(args)
-** Processing line: ~      args.outputs.solids << solid_right_paddle(args)~
+      outputs.labels << { x: 640, y: 500, text: "Instructions: Press Spacebar to flap. Don't die.", size_enum: 4, alignment_enum: 1, **white }
+** Processing line: ~      outputs.labels << { x: 430, y: 430, text: "[Tab]    Change difficulty", size_enum: 4, alignment_enum: 0, **white }~
 - Inside source: true
 *** True Line Result
-      args.outputs.solids << solid_right_paddle(args)
-** Processing line: ~    end~
+      outputs.labels << { x: 430, y: 430, text: "[Tab]    Change difficulty", size_enum: 4, alignment_enum: 0, **white }
+** Processing line: ~      outputs.labels << { x: 430, y: 400, text: "[Enter]  Start at New Difficulty ", size_enum: 4, alignment_enum: 0, **white }~
 - Inside source: true
 *** True Line Result
-    end
+      outputs.labels << { x: 430, y: 400, text: "[Enter]  Start at New Difficulty ", size_enum: 4, alignment_enum: 0, **white }
+** Processing line: ~      outputs.labels << { x: 430, y: 370, text: "[Escape] Cancel/Resume ", size_enum: 4, alignment_enum: 0, **white }~
+- Inside source: true
+*** True Line Result
+      outputs.labels << { x: 430, y: 370, text: "[Escape] Cancel/Resume ", size_enum: 4, alignment_enum: 0, **white }
+** Processing line: ~      outputs.labels << { x: 640, y: 300, text: "(mouse, touch, and game controllers work, too!) ", size_enum: 4, alignment_enum: 1, **white }~
+- Inside source: true
+*** True Line Result
+      outputs.labels << { x: 640, y: 300, text: "(mouse, touch, and game controllers work, too!) ", size_enum: 4, alignment_enum: 1, **white }
+** Processing line: ~      outputs.labels << { x: 640, y: 200, text: "Difficulty: #{state.new_difficulty.capitalize}", size_enum: 4, alignment_enum: 1, **white }~
+- Inside source: true
+*** True Line Result
+      outputs.labels << { x: 640, y: 200, text: "Difficulty: #{state.new_difficulty.capitalize}", size_enum: 4, alignment_enum: 1, **white }
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~    def render_instructions args~
+** Processing line: ~      outputs.labels << { x: 10, y: 100, text: "Code:   @amirrajan",     **white }~
 - Inside source: true
 *** True Line Result
-    def render_instructions args
-** Processing line: ~      args.outputs.labels << [320, 30, "W and S keys to move left paddle.",  0, 1]~
+      outputs.labels << { x: 10, y: 100, text: "Code:   @amirrajan",     **white }
+** Processing line: ~      outputs.labels << { x: 10, y:  80, text: "Art:    @mobypixel",     **white }~
 - Inside source: true
 *** True Line Result
-      args.outputs.labels << [320, 30, "W and S keys to move left paddle.",  0, 1]
-** Processing line: ~      args.outputs.labels << [920, 30, "O and L keys to move right paddle.", 0, 1]~
+      outputs.labels << { x: 10, y:  80, text: "Art:    @mobypixel",     **white }
+** Processing line: ~      outputs.labels << { x: 10, y:  60, text: "Music:  @mobypixel",     **white }~
 - Inside source: true
 *** True Line Result
-      args.outputs.labels << [920, 30, "O and L keys to move right paddle.", 0, 1]
-** Processing line: ~    end~
+      outputs.labels << { x: 10, y:  60, text: "Music:  @mobypixel",     **white }
+** Processing line: ~      outputs.labels << { x: 10, y:  40, text: "Engine: DragonRuby GTK", **white }~
 - Inside source: true
 *** True Line Result
-    end
-** Processing line: ~  end~
+      outputs.labels << { x: 10, y:  40, text: "Engine: DragonRuby GTK", **white }
+** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
-  end
+    end
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~  def calc args~
+** Processing line: ~    def render_overlay~
 - Inside source: true
 *** True Line Result
-  def calc args
-** Processing line: ~    args.state.ball.debounce -= 1 and return if args.state.ball.debounce > 0~
+    def render_overlay
+** Processing line: ~      overlay_rect = grid.rect.scale_rect(1.1, 0, 0)~
 - Inside source: true
 *** True Line Result
-    args.state.ball.debounce -= 1 and return if args.state.ball.debounce > 0
-** Processing line: ~    calc_move_ball args~
+      overlay_rect = grid.rect.scale_rect(1.1, 0, 0)
+** Processing line: ~      outputs.primitives << { x: overlay_rect.x,~
 - Inside source: true
 *** True Line Result
-    calc_move_ball args
-** Processing line: ~    calc_collision_with_left_paddle args~
+      outputs.primitives << { x: overlay_rect.x,
+** Processing line: ~                              y: overlay_rect.y,~
 - Inside source: true
 *** True Line Result
-    calc_collision_with_left_paddle args
-** Processing line: ~    calc_collision_with_right_paddle args~
+                              y: overlay_rect.y,
+** Processing line: ~                              w: overlay_rect.w,~
 - Inside source: true
 *** True Line Result
-    calc_collision_with_right_paddle args
-** Processing line: ~    calc_collision_with_walls args~
+                              w: overlay_rect.w,
+** Processing line: ~                              h: overlay_rect.h,~
 - Inside source: true
 *** True Line Result
-    calc_collision_with_walls args
-** Processing line: ~  end~
+                              h: overlay_rect.h,
+** Processing line: ~                              r: 0, g: 0, b: 0, a: 230 }.solid!~
 - Inside source: true
 *** True Line Result
-  end
+                              r: 0, g: 0, b: 0, a: 230 }.solid!
+** Processing line: ~    end~
+- Inside source: true
+*** True Line Result
+    end
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~  begin :calc_methods~
+** Processing line: ~    def render_game~
 - Inside source: true
 *** True Line Result
-  begin :calc_methods
-** Processing line: ~    def calc_move_ball args~
+    def render_game
+** Processing line: ~      render_game_over~
 - Inside source: true
 *** True Line Result
-    def calc_move_ball args
-** Processing line: ~      args.state.ball.x += args.state.ball.dx~
+      render_game_over
+** Processing line: ~      render_background~
 - Inside source: true
 *** True Line Result
-      args.state.ball.x += args.state.ball.dx
-** Processing line: ~      args.state.ball.y += args.state.ball.dy~
+      render_background
+** Processing line: ~      render_walls~
 - Inside source: true
 *** True Line Result
-      args.state.ball.y += args.state.ball.dy
+      render_walls
+** Processing line: ~      render_dragon~
+- Inside source: true
+*** True Line Result
+      render_dragon
+** Processing line: ~      render_flash~
+- Inside source: true
+*** True Line Result
+      render_flash
 ** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
@@ -95139,34 +96571,30 @@ Follows is a source code listing for all files that have been open sourced. This
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~    def calc_collision_with_left_paddle args~
-- Inside source: true
-*** True Line Result
-    def calc_collision_with_left_paddle args
-** Processing line: ~      if solid_left_paddle(args).intersect_rect? solid_ball(args)~
+** Processing line: ~    def render_game_over~
 - Inside source: true
 *** True Line Result
-      if solid_left_paddle(args).intersect_rect? solid_ball(args)
-** Processing line: ~        args.state.ball.dx *= -1~
+    def render_game_over
+** Processing line: ~      return unless state.scene == :game~
 - Inside source: true
 *** True Line Result
-        args.state.ball.dx *= -1
-** Processing line: ~      elsif args.state.ball.x < 0~
+      return unless state.scene == :game
+** Processing line: ~      outputs.labels << { x: 638, y: 358, text: score_text,     size_enum: 20, alignment_enum: 1 }~
 - Inside source: true
 *** True Line Result
-      elsif args.state.ball.x < 0
-** Processing line: ~        args.state.right_paddle.score += 1~
+      outputs.labels << { x: 638, y: 358, text: score_text,     size_enum: 20, alignment_enum: 1 }
+** Processing line: ~      outputs.labels << { x: 635, y: 360, text: score_text,     size_enum: 20, alignment_enum: 1, r: 255, g: 255, b: 255 }~
 - Inside source: true
 *** True Line Result
-        args.state.right_paddle.score += 1
-** Processing line: ~        calc_reset_round args~
+      outputs.labels << { x: 635, y: 360, text: score_text,     size_enum: 20, alignment_enum: 1, r: 255, g: 255, b: 255 }
+** Processing line: ~      outputs.labels << { x: 638, y: 428, text: countdown_text, size_enum: 20, alignment_enum: 1 }~
 - Inside source: true
 *** True Line Result
-        calc_reset_round args
-** Processing line: ~      end~
+      outputs.labels << { x: 638, y: 428, text: countdown_text, size_enum: 20, alignment_enum: 1 }
+** Processing line: ~      outputs.labels << { x: 635, y: 430, text: countdown_text, size_enum: 20, alignment_enum: 1, r: 255, g: 255, b: 255 }~
 - Inside source: true
 *** True Line Result
-      end
+      outputs.labels << { x: 635, y: 430, text: countdown_text, size_enum: 20, alignment_enum: 1, r: 255, g: 255, b: 255 }
 ** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
@@ -95175,74 +96603,78 @@ Follows is a source code listing for all files that have been open sourced. This
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~    def calc_collision_with_right_paddle args~
-- Inside source: true
-*** True Line Result
-    def calc_collision_with_right_paddle args
-** Processing line: ~      if solid_right_paddle(args).intersect_rect? solid_ball(args)~
+** Processing line: ~    def render_background~
 - Inside source: true
 *** True Line Result
-      if solid_right_paddle(args).intersect_rect? solid_ball(args)
-** Processing line: ~        args.state.ball.dx *= -1~
+    def render_background
+** Processing line: ~      outputs.sprites << { x: 0, y: 0, w: 1280, h: 720, path: 'sprites/background.png' }~
 - Inside source: true
 *** True Line Result
-        args.state.ball.dx *= -1
-** Processing line: ~      elsif args.state.ball.x > 1280~
+      outputs.sprites << { x: 0, y: 0, w: 1280, h: 720, path: 'sprites/background.png' }
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-      elsif args.state.ball.x > 1280
-** Processing line: ~        args.state.left_paddle.score += 1~
+
+** Processing line: ~      scroll_point_at   = state.tick_count~
 - Inside source: true
 *** True Line Result
-        args.state.left_paddle.score += 1
-** Processing line: ~        calc_reset_round args~
+      scroll_point_at   = state.tick_count
+** Processing line: ~      scroll_point_at   = state.scene_at if state.scene == :menu~
 - Inside source: true
 *** True Line Result
-        calc_reset_round args
-** Processing line: ~      end~
+      scroll_point_at   = state.scene_at if state.scene == :menu
+** Processing line: ~      scroll_point_at   = state.death_at if state.countdown > 0~
 - Inside source: true
 *** True Line Result
-      end
-** Processing line: ~    end~
+      scroll_point_at   = state.death_at if state.countdown > 0
+** Processing line: ~      scroll_point_at ||= 0~
 - Inside source: true
 *** True Line Result
-    end
+      scroll_point_at ||= 0
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~    def calc_collision_with_walls args~
+** Processing line: ~      outputs.sprites << scrolling_background(scroll_point_at, 'sprites/parallax_back.png',   0.25)~
 - Inside source: true
 *** True Line Result
-    def calc_collision_with_walls args
-** Processing line: ~      if args.state.ball.y + args.state.ball.size_half > 720~
+      outputs.sprites << scrolling_background(scroll_point_at, 'sprites/parallax_back.png',   0.25)
+** Processing line: ~      outputs.sprites << scrolling_background(scroll_point_at, 'sprites/parallax_middle.png', 0.50)~
 - Inside source: true
 *** True Line Result
-      if args.state.ball.y + args.state.ball.size_half > 720
-** Processing line: ~        args.state.ball.y = 720 - args.state.ball.size_half~
+      outputs.sprites << scrolling_background(scroll_point_at, 'sprites/parallax_middle.png', 0.50)
+** Processing line: ~      outputs.sprites << scrolling_background(scroll_point_at, 'sprites/parallax_front.png',  1.00, -80)~
 - Inside source: true
 *** True Line Result
-        args.state.ball.y = 720 - args.state.ball.size_half
-** Processing line: ~        args.state.ball.dy *= -1~
+      outputs.sprites << scrolling_background(scroll_point_at, 'sprites/parallax_front.png',  1.00, -80)
+** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
-        args.state.ball.dy *= -1
-** Processing line: ~      elsif args.state.ball.y - args.state.ball.size_half < 0~
+    end
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-      elsif args.state.ball.y - args.state.ball.size_half < 0
-** Processing line: ~        args.state.ball.y = args.state.ball.size_half~
+
+** Processing line: ~    def scrolling_background at, path, rate, y = 0~
 - Inside source: true
 *** True Line Result
-        args.state.ball.y = args.state.ball.size_half
-** Processing line: ~        args.state.ball.dy *= -1~
+    def scrolling_background at, path, rate, y = 0
+** Processing line: ~      [~
 - Inside source: true
 *** True Line Result
-        args.state.ball.dy *= -1
-** Processing line: ~      end~
+      [
+** Processing line: ~        { x:    0 - at.*(rate) % 1440, y: y, w: 1440, h: 720, path: path },~
 - Inside source: true
 *** True Line Result
-      end
+        { x:    0 - at.*(rate) % 1440, y: y, w: 1440, h: 720, path: path },
+** Processing line: ~        { x: 1440 - at.*(rate) % 1440, y: y, w: 1440, h: 720, path: path }~
+- Inside source: true
+*** True Line Result
+        { x: 1440 - at.*(rate) % 1440, y: y, w: 1440, h: 720, path: path }
+** Processing line: ~      ]~
+- Inside source: true
+*** True Line Result
+      ]
 ** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
@@ -95251,146 +96683,154 @@ Follows is a source code listing for all files that have been open sourced. This
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~    def calc_reset_round args~
+** Processing line: ~    def render_walls~
 - Inside source: true
 *** True Line Result
-    def calc_reset_round args
-** Processing line: ~      args.state.ball.x = 640~
+    def render_walls
+** Processing line: ~      state.walls.each do |w|~
 - Inside source: true
 *** True Line Result
-      args.state.ball.x = 640
-** Processing line: ~      args.state.ball.y = 360~
+      state.walls.each do |w|
+** Processing line: ~        w.sprites = [~
 - Inside source: true
 *** True Line Result
-      args.state.ball.y = 360
-** Processing line: ~      args.state.ball.dx = 5.randomize(:sign)~
+        w.sprites = [
+** Processing line: ~          { x: w.x, y: w.bottom_height - 720, w: 100, h: 720, path: 'sprites/wall.png',       angle: 180 },~
 - Inside source: true
 *** True Line Result
-      args.state.ball.dx = 5.randomize(:sign)
-** Processing line: ~      args.state.ball.dy = 5.randomize(:sign)~
+          { x: w.x, y: w.bottom_height - 720, w: 100, h: 720, path: 'sprites/wall.png',       angle: 180 },
+** Processing line: ~          { x: w.x, y: w.top_y,               w: 100, h: 720, path: 'sprites/wallbottom.png', angle: 0 }~
 - Inside source: true
 *** True Line Result
-      args.state.ball.dy = 5.randomize(:sign)
-** Processing line: ~      args.state.ball.debounce = 3 * 60~
+          { x: w.x, y: w.top_y,               w: 100, h: 720, path: 'sprites/wallbottom.png', angle: 0 }
+** Processing line: ~        ]~
 - Inside source: true
 *** True Line Result
-      args.state.ball.debounce = 3 * 60
+        ]
+** Processing line: ~      end~
+- Inside source: true
+*** True Line Result
+      end
+** Processing line: ~      outputs.sprites << state.walls.map(&:sprites)~
+- Inside source: true
+*** True Line Result
+      outputs.sprites << state.walls.map(&:sprites)
 ** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
     end
-** Processing line: ~  end~
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-  end
+
+** Processing line: ~    def render_dragon~
+- Inside source: true
+*** True Line Result
+    def render_dragon
+** Processing line: ~      state.show_death = true if state.countdown == 3.seconds~
+- Inside source: true
+*** True Line Result
+      state.show_death = true if state.countdown == 3.seconds
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~  def input args~
+** Processing line: ~      if state.show_death == false || !state.death_at~
 - Inside source: true
 *** True Line Result
-  def input args
-** Processing line: ~    input_left_paddle args~
+      if state.show_death == false || !state.death_at
+** Processing line: ~        animation_index = state.flapped_at.frame_index 6, 2, false if state.flapped_at~
 - Inside source: true
 *** True Line Result
-    input_left_paddle args
-** Processing line: ~    input_right_paddle args~
+        animation_index = state.flapped_at.frame_index 6, 2, false if state.flapped_at
+** Processing line: ~        sprite_name = "sprites/dragon_fly#{animation_index.or(0) + 1}.png"~
 - Inside source: true
 *** True Line Result
-    input_right_paddle args
-** Processing line: ~  end~
+        sprite_name = "sprites/dragon_fly#{animation_index.or(0) + 1}.png"
+** Processing line: ~        state.dragon_sprite = { x: state.x, y: state.y, w: 100, h: 80, path: sprite_name, angle: state.dy * 1.2 }~
 - Inside source: true
 *** True Line Result
-  end
-** Processing line: ~~
+        state.dragon_sprite = { x: state.x, y: state.y, w: 100, h: 80, path: sprite_name, angle: state.dy * 1.2 }
+** Processing line: ~      else~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~  begin :input_methods~
+      else
+** Processing line: ~        sprite_name = "sprites/dragon_die.png"~
 - Inside source: true
 *** True Line Result
-  begin :input_methods
-** Processing line: ~    def input_left_paddle args~
+        sprite_name = "sprites/dragon_die.png"
+** Processing line: ~        state.dragon_sprite = { x: state.x, y: state.y, w: 100, h: 80, path: sprite_name, angle: state.dy * 1.2 }~
 - Inside source: true
 *** True Line Result
-    def input_left_paddle args
-** Processing line: ~      if args.inputs.controller_one.key_down.down  || args.inputs.keyboard.key_down.s~
+        state.dragon_sprite = { x: state.x, y: state.y, w: 100, h: 80, path: sprite_name, angle: state.dy * 1.2 }
+** Processing line: ~        sprite_changed_elapsed    = state.death_at.elapsed_time - 1.seconds~
 - Inside source: true
 *** True Line Result
-      if args.inputs.controller_one.key_down.down  || args.inputs.keyboard.key_down.s
-** Processing line: ~        args.state.left_paddle.y -= 40~
+        sprite_changed_elapsed    = state.death_at.elapsed_time - 1.seconds
+** Processing line: ~        state.dragon_sprite.angle += (sprite_changed_elapsed ** 1.3) * state.death_fall_direction * -1~
 - Inside source: true
 *** True Line Result
-        args.state.left_paddle.y -= 40
-** Processing line: ~      elsif args.inputs.controller_one.key_down.up || args.inputs.keyboard.key_down.w~
+        state.dragon_sprite.angle += (sprite_changed_elapsed ** 1.3) * state.death_fall_direction * -1
+** Processing line: ~        state.dragon_sprite.x     += (sprite_changed_elapsed ** 1.2) * state.death_fall_direction~
 - Inside source: true
 *** True Line Result
-      elsif args.inputs.controller_one.key_down.up || args.inputs.keyboard.key_down.w
-** Processing line: ~        args.state.left_paddle.y += 40~
+        state.dragon_sprite.x     += (sprite_changed_elapsed ** 1.2) * state.death_fall_direction
+** Processing line: ~        state.dragon_sprite.y     += (sprite_changed_elapsed * 14 - sprite_changed_elapsed ** 1.6)~
 - Inside source: true
 *** True Line Result
-        args.state.left_paddle.y += 40
+        state.dragon_sprite.y     += (sprite_changed_elapsed * 14 - sprite_changed_elapsed ** 1.6)
 ** Processing line: ~      end~
 - Inside source: true
 *** True Line Result
       end
-** Processing line: ~    end~
-- Inside source: true
-*** True Line Result
-    end
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~    def input_right_paddle args~
-- Inside source: true
-*** True Line Result
-    def input_right_paddle args
-** Processing line: ~      if args.inputs.controller_two.key_down.down  || args.inputs.keyboard.key_down.l~
+** Processing line: ~      outputs.sprites << state.dragon_sprite~
 - Inside source: true
 *** True Line Result
-      if args.inputs.controller_two.key_down.down  || args.inputs.keyboard.key_down.l
-** Processing line: ~        args.state.right_paddle.y -= 40~
+      outputs.sprites << state.dragon_sprite
+** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
-        args.state.right_paddle.y -= 40
-** Processing line: ~      elsif args.inputs.controller_two.key_down.up || args.inputs.keyboard.key_down.o~
+    end
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-      elsif args.inputs.controller_two.key_down.up || args.inputs.keyboard.key_down.o
-** Processing line: ~        args.state.right_paddle.y += 40~
+
+** Processing line: ~    def render_flash~
 - Inside source: true
 *** True Line Result
-        args.state.right_paddle.y += 40
-** Processing line: ~      end~
+    def render_flash
+** Processing line: ~      return unless state.flash_at~
 - Inside source: true
 *** True Line Result
-      end
-** Processing line: ~    end~
+      return unless state.flash_at
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-    end
-** Processing line: ~  end~
+
+** Processing line: ~      outputs.primitives << { **grid.rect.to_hash,~
 - Inside source: true
 *** True Line Result
-  end
-** Processing line: ~~
+      outputs.primitives << { **grid.rect.to_hash,
+** Processing line: ~                              **white,~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~  begin :assets~
+                              **white,
+** Processing line: ~                              a: 255 * state.flash_at.ease(20, :flip) }.solid!~
 - Inside source: true
 *** True Line Result
-  begin :assets
-** Processing line: ~    def solid_ball args~
+                              a: 255 * state.flash_at.ease(20, :flip) }.solid!
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-    def solid_ball args
-** Processing line: ~      centered_rect args.state.ball.x, args.state.ball.y, args.state.ball.size, args.state.ball.size~
+
+** Processing line: ~      state.flash_at = 0 if state.flash_at.elapsed_time > 20~
 - Inside source: true
 *** True Line Result
-      centered_rect args.state.ball.x, args.state.ball.y, args.state.ball.size, args.state.ball.size
+      state.flash_at = 0 if state.flash_at.elapsed_time > 20
 ** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
@@ -95399,30 +96839,34 @@ Follows is a source code listing for all files that have been open sourced. This
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~    def solid_left_paddle args~
+** Processing line: ~    def calc~
 - Inside source: true
 *** True Line Result
-    def solid_left_paddle args
-** Processing line: ~      centered_rect_vertically 0, args.state.left_paddle.y, args.state.paddle.w, args.state.paddle.h~
+    def calc
+** Processing line: ~      return unless state.scene == :game~
 - Inside source: true
 *** True Line Result
-      centered_rect_vertically 0, args.state.left_paddle.y, args.state.paddle.w, args.state.paddle.h
-** Processing line: ~    end~
+      return unless state.scene == :game
+** Processing line: ~      reset_game if state.countdown == 1~
 - Inside source: true
 *** True Line Result
-    end
-** Processing line: ~~
+      reset_game if state.countdown == 1
+** Processing line: ~      state.countdown -= 1 and return if state.countdown > 0~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~    def solid_right_paddle args~
+      state.countdown -= 1 and return if state.countdown > 0
+** Processing line: ~      calc_walls~
 - Inside source: true
 *** True Line Result
-    def solid_right_paddle args
-** Processing line: ~      centered_rect_vertically 1280 - args.state.paddle.w, args.state.right_paddle.y, args.state.paddle.w, args.state.paddle.h~
+      calc_walls
+** Processing line: ~      calc_flap~
 - Inside source: true
 *** True Line Result
-      centered_rect_vertically 1280 - args.state.paddle.w, args.state.right_paddle.y, args.state.paddle.w, args.state.paddle.h
+      calc_flap
+** Processing line: ~      calc_game_over~
+- Inside source: true
+*** True Line Result
+      calc_game_over
 ** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
@@ -95431,162 +96875,174 @@ Follows is a source code listing for all files that have been open sourced. This
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~    def centered_rect x, y, w, h~
-- Inside source: true
-*** True Line Result
-    def centered_rect x, y, w, h
-** Processing line: ~      [x - w / 2, y - h / 2, w, h]~
+** Processing line: ~    def calc_walls~
 - Inside source: true
 *** True Line Result
-      [x - w / 2, y - h / 2, w, h]
-** Processing line: ~    end~
+    def calc_walls
+** Processing line: ~      state.walls.each { |w| w.x -= 8 }~
 - Inside source: true
 *** True Line Result
-    end
+      state.walls.each { |w| w.x -= 8 }
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~    def centered_rect_vertically x, y, w, h~
+** Processing line: ~      walls_count_before_removal = state.walls.length~
 - Inside source: true
 *** True Line Result
-    def centered_rect_vertically x, y, w, h
-** Processing line: ~      [x, y - h / 2, w, h]~
+      walls_count_before_removal = state.walls.length
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-      [x, y - h / 2, w, h]
-** Processing line: ~    end~
+
+** Processing line: ~      state.walls.reject! { |w| w.x < -100 }~
 - Inside source: true
 *** True Line Result
-    end
-** Processing line: ~  end~
+      state.walls.reject! { |w| w.x < -100 }
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-  end
+
+** Processing line: ~      state.score += 1 if state.walls.count < walls_count_before_removal~
+- Inside source: true
+*** True Line Result
+      state.score += 1 if state.walls.count < walls_count_before_removal
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~#+end_src~
-- Line was identified as the end of a code block.
+** Processing line: ~      state.wall_countdown -= 1 and return if state.wall_countdown > 0~
+- Inside source: true
 *** True Line Result
-#+end_src
+      state.wall_countdown -= 1 and return if state.wall_countdown > 0
 ** Processing line: ~~
-- End of paragraph detected.
+- Inside source: true
 *** True Line Result
 
-** Processing line: ~*** Arcade - Snakemoji - main.rb~
-- Header detected.
+** Processing line: ~      state.walls << state.new_entity(:wall) do |w|~
+- Inside source: true
 *** True Line Result
-
+      state.walls << state.new_entity(:wall) do |w|
+** Processing line: ~        w.x             = grid.right~
+- Inside source: true
 *** True Line Result
-*** Arcade - Snakemoji - main.rb
-** Processing line: ~#+begin_src ruby~
-- Line was identified as the beginning of a code block.
+        w.x             = grid.right
+** Processing line: ~        w.opening       = grid.top~
+- Inside source: true
 *** True Line Result
-
+        w.opening       = grid.top
+** Processing line: ~                              .randomize(:ratio)~
+- Inside source: true
 *** True Line Result
-#+begin_src ruby
-** Processing line: ~  # ./samples/99_genre_arcade/snakemoji/app/main.rb~
+                              .randomize(:ratio)
+** Processing line: ~                              .greater(200)~
 - Inside source: true
 *** True Line Result
-  # ./samples/99_genre_arcade/snakemoji/app/main.rb
-** Processing line: ~  # coding: utf-8~
+                              .greater(200)
+** Processing line: ~                              .lesser(520)~
 - Inside source: true
 *** True Line Result
-  # coding: utf-8
-** Processing line: ~  ################################~
+                              .lesser(520)
+** Processing line: ~        w.bottom_height = w.opening - state.wall_gap_size~
 - Inside source: true
 *** True Line Result
-  ################################
-** Processing line: ~  #  So I was working on a snake game while~
+        w.bottom_height = w.opening - state.wall_gap_size
+** Processing line: ~        w.top_y         = w.opening + state.wall_gap_size~
 - Inside source: true
 *** True Line Result
-  #  So I was working on a snake game while
-** Processing line: ~  #  learning DragonRuby, and at some point I had a thought~
+        w.top_y         = w.opening + state.wall_gap_size
+** Processing line: ~      end~
 - Inside source: true
 *** True Line Result
-  #  learning DragonRuby, and at some point I had a thought
-** Processing line: ~  #  what if I use "😀" as a function name, surely it wont work right...?~
+      end
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-  #  what if I use "😀" as a function name, surely it wont work right...?
-** Processing line: ~  #  RIGHT....?~
+
+** Processing line: ~      state.wall_countdown = state.wall_countdown_length~
 - Inside source: true
 *** True Line Result
-  #  RIGHT....?
-** Processing line: ~  #  BUT IT DID, IT WORKED~
+      state.wall_countdown = state.wall_countdown_length
+** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
-  #  BUT IT DID, IT WORKED
-** Processing line: ~  #  it all went downhill from then~
+    end
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-  #  it all went downhill from then
-** Processing line: ~  #  Created by Anton K. (ai Doge)~
+
+** Processing line: ~    def calc_flap~
 - Inside source: true
 *** True Line Result
-  #  Created by Anton K. (ai Doge)
-** Processing line: ~  #  https://gist.github.com/scorp200~
+    def calc_flap
+** Processing line: ~      state.y += state.dy~
 - Inside source: true
 *** True Line Result
-  #  https://gist.github.com/scorp200
-** Processing line: ~  #############LICENSE############~
+      state.y += state.dy
+** Processing line: ~      state.dy = state.dy.lesser state.flap_power~
 - Inside source: true
 *** True Line Result
-  #############LICENSE############
-** Processing line: ~  #  Feel free to use this anywhere and however you want~
+      state.dy = state.dy.lesser state.flap_power
+** Processing line: ~      state.dy -= state.gravity~
 - Inside source: true
 *** True Line Result
-  #  Feel free to use this anywhere and however you want
-** Processing line: ~  #  You can sell this to EA for $1,000,000 if you want, its completely free.~
+      state.dy -= state.gravity
+** Processing line: ~      return if state.y < state.ceiling~
 - Inside source: true
 *** True Line Result
-  #  You can sell this to EA for $1,000,000 if you want, its completely free.
-** Processing line: ~  #  Just rememeber you are helping this... thing... to spread...~
+      return if state.y < state.ceiling
+** Processing line: ~      state.y  = state.ceiling~
 - Inside source: true
 *** True Line Result
-  #  Just rememeber you are helping this... thing... to spread...
-** Processing line: ~  #  ALSO! I am not liable for any mental, physical or financial damage caused.~
+      state.y  = state.ceiling
+** Processing line: ~      state.dy = state.dy.lesser state.ceiling_flap_power~
 - Inside source: true
 *** True Line Result
-  #  ALSO! I am not liable for any mental, physical or financial damage caused.
-** Processing line: ~  #############LICENSE############~
+      state.dy = state.dy.lesser state.ceiling_flap_power
+** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
-  #############LICENSE############
+    end
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
+** Processing line: ~    def calc_game_over~
+- Inside source: true
+*** True Line Result
+    def calc_game_over
+** Processing line: ~      return unless game_over?~
+- Inside source: true
+*** True Line Result
+      return unless game_over?
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~  class Array~
+** Processing line: ~      state.death_at = state.tick_count~
 - Inside source: true
 *** True Line Result
-  class Array
-** Processing line: ~    #Helper function~
+      state.death_at = state.tick_count
+** Processing line: ~      state.death_from = state.walls.first~
 - Inside source: true
 *** True Line Result
-    #Helper function
-** Processing line: ~    def move! vector~
+      state.death_from = state.walls.first
+** Processing line: ~      state.death_fall_direction = -1~
 - Inside source: true
 *** True Line Result
-    def move! vector
-** Processing line: ~      self.x += vector.x~
+      state.death_fall_direction = -1
+** Processing line: ~      state.death_fall_direction =  1 if state.x > state.death_from.x~
 - Inside source: true
 *** True Line Result
-      self.x += vector.x
-** Processing line: ~      self.y += vector.y~
+      state.death_fall_direction =  1 if state.x > state.death_from.x
+** Processing line: ~      outputs.sounds << "sounds/hit-sound.wav"~
 - Inside source: true
 *** True Line Result
-      self.y += vector.y
-** Processing line: ~      return self~
+      outputs.sounds << "sounds/hit-sound.wav"
+** Processing line: ~      begin_countdown~
 - Inside source: true
 *** True Line Result
-      return self
+      begin_countdown
 ** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
@@ -95595,18 +97051,18 @@ Follows is a source code listing for all files that have been open sourced. This
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~    #Helper function to draw snake body~
+** Processing line: ~    def process_inputs~
 - Inside source: true
 *** True Line Result
-    #Helper function to draw snake body
-** Processing line: ~    def draw! 🎮, 📺, color~
+    def process_inputs
+** Processing line: ~      process_inputs_menu~
 - Inside source: true
 *** True Line Result
-    def draw! 🎮, 📺, color
-** Processing line: ~      translate 📺.solids, 🎮.⛓, [self.x * 🎮.⚖️ + 🎮.🛶 / 2, self.y * 🎮.⚖️ + 🎮.🛶 / 2, 🎮.⚖️ - 🎮.🛶, 🎮.⚖️ - 🎮.🛶, color]~
+      process_inputs_menu
+** Processing line: ~      process_inputs_game~
 - Inside source: true
 *** True Line Result
-      translate 📺.solids, 🎮.⛓, [self.x * 🎮.⚖️ + 🎮.🛶 / 2, self.y * 🎮.⚖️ + 🎮.🛶 / 2, 🎮.⚖️ - 🎮.🛶, 🎮.⚖️ - 🎮.🛶, color]
+      process_inputs_game
 ** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
@@ -95615,194 +97071,186 @@ Follows is a source code listing for all files that have been open sourced. This
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~    #This is where it all started, I was trying to find  good way to multiply a map by a number, * is already used so is **~
-- Inside source: true
-*** True Line Result
-    #This is where it all started, I was trying to find  good way to multiply a map by a number, * is already used so is **
-** Processing line: ~    #I kept trying different combinations of symbols, when suddenly...~
-- Inside source: true
-*** True Line Result
-    #I kept trying different combinations of symbols, when suddenly...
-** Processing line: ~    def 😀 value~
-- Inside source: true
-*** True Line Result
-    def 😀 value
-** Processing line: ~      self.map {|d| d * value}~
-- Inside source: true
-*** True Line Result
-      self.map {|d| d * value}
-** Processing line: ~    end~
+** Processing line: ~    def process_inputs_menu~
 - Inside source: true
 *** True Line Result
-    end
-** Processing line: ~  end~
+    def process_inputs_menu
+** Processing line: ~      return unless state.scene == :menu~
 - Inside source: true
 *** True Line Result
-  end
+      return unless state.scene == :menu
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~  #Draw stuff with an offset~
+** Processing line: ~      changediff = inputs.keyboard.key_down.tab || inputs.controller_one.key_down.select~
 - Inside source: true
 *** True Line Result
-  #Draw stuff with an offset
-** Processing line: ~  def translate output_collection, ⛓, what~
+      changediff = inputs.keyboard.key_down.tab || inputs.controller_one.key_down.select
+** Processing line: ~      if inputs.mouse.click~
 - Inside source: true
 *** True Line Result
-  def translate output_collection, ⛓, what
-** Processing line: ~    what.x += ⛓.x~
+      if inputs.mouse.click
+** Processing line: ~        p = inputs.mouse.click.point~
 - Inside source: true
 *** True Line Result
-    what.x += ⛓.x
-** Processing line: ~    what.y += ⛓.y~
+        p = inputs.mouse.click.point
+** Processing line: ~        if (p.y >= 165) && (p.y < 200) && (p.x >= 500) && (p.x < 800)~
 - Inside source: true
 *** True Line Result
-    what.y += ⛓.y
-** Processing line: ~    output_collection << what~
+        if (p.y >= 165) && (p.y < 200) && (p.x >= 500) && (p.x < 800)
+** Processing line: ~          changediff = true~
 - Inside source: true
 *** True Line Result
-    output_collection << what
-** Processing line: ~  end~
+          changediff = true
+** Processing line: ~        end~
 - Inside source: true
 *** True Line Result
-  end
+        end
+** Processing line: ~      end~
+- Inside source: true
+*** True Line Result
+      end
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~  BLUE = [33, 150, 243]~
+** Processing line: ~      if changediff~
 - Inside source: true
 *** True Line Result
-  BLUE = [33, 150, 243]
-** Processing line: ~  RED = [244, 67, 54]~
+      if changediff
+** Processing line: ~        case state.new_difficulty~
 - Inside source: true
 *** True Line Result
-  RED = [244, 67, 54]
-** Processing line: ~  GOLD = [255, 193, 7]~
+        case state.new_difficulty
+** Processing line: ~        when :easy~
 - Inside source: true
 *** True Line Result
-  GOLD = [255, 193, 7]
-** Processing line: ~  LAST = 0~
+        when :easy
+** Processing line: ~          state.new_difficulty = :normal~
 - Inside source: true
 *** True Line Result
-  LAST = 0
-** Processing line: ~~
+          state.new_difficulty = :normal
+** Processing line: ~        when :normal~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~  def tick args~
+        when :normal
+** Processing line: ~          state.new_difficulty = :hard~
 - Inside source: true
 *** True Line Result
-  def tick args
-** Processing line: ~    defaults args.state~
+          state.new_difficulty = :hard
+** Processing line: ~        when :hard~
 - Inside source: true
 *** True Line Result
-    defaults args.state
-** Processing line: ~    render args.state, args.outputs~
+        when :hard
+** Processing line: ~          state.new_difficulty = :flappy~
 - Inside source: true
 *** True Line Result
-    render args.state, args.outputs
-** Processing line: ~    input args.state, args.inputs~
+          state.new_difficulty = :flappy
+** Processing line: ~        when :flappy~
 - Inside source: true
 *** True Line Result
-    input args.state, args.inputs
-** Processing line: ~    update args.state~
+        when :flappy
+** Processing line: ~          state.new_difficulty = :easy~
 - Inside source: true
 *** True Line Result
-    update args.state
-** Processing line: ~  end~
+          state.new_difficulty = :easy
+** Processing line: ~        end~
 - Inside source: true
 *** True Line Result
-  end
+        end
+** Processing line: ~      end~
+- Inside source: true
+*** True Line Result
+      end
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~  def update 🎮~
+** Processing line: ~      if inputs.keyboard.key_down.enter || inputs.controller_one.key_down.start || inputs.controller_one.key_down.a~
 - Inside source: true
 *** True Line Result
-  def update 🎮
-** Processing line: ~    #Update every 10 frames~
+      if inputs.keyboard.key_down.enter || inputs.controller_one.key_down.start || inputs.controller_one.key_down.a
+** Processing line: ~        state.difficulty = state.new_difficulty~
 - Inside source: true
 *** True Line Result
-    #Update every 10 frames
-** Processing line: ~    if 🎮.tick_count.mod_zero? 10~
+        state.difficulty = state.new_difficulty
+** Processing line: ~        change_to_scene :game~
 - Inside source: true
 *** True Line Result
-    if 🎮.tick_count.mod_zero? 10
-** Processing line: ~      #Add new snake body piece at head's location~
+        change_to_scene :game
+** Processing line: ~        reset_game false~
 - Inside source: true
 *** True Line Result
-      #Add new snake body piece at head's location
-** Processing line: ~      🎮.🐍 << [*🎮.🤖]~
+        reset_game false
+** Processing line: ~        state.hi_score = 0~
 - Inside source: true
 *** True Line Result
-      🎮.🐍 << [*🎮.🤖]
-** Processing line: ~      #Assign Next Direction to Direction~
+        state.hi_score = 0
+** Processing line: ~        begin_countdown~
 - Inside source: true
 *** True Line Result
-      #Assign Next Direction to Direction
-** Processing line: ~      🎮.🚗 = *🎮.🚦~
+        begin_countdown
+** Processing line: ~      end~
 - Inside source: true
 *** True Line Result
-      🎮.🚗 = *🎮.🚦
+      end
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~      #Trim the snake a bit if its longer than current size~
+** Processing line: ~      if inputs.keyboard.key_down.escape || (inputs.mouse.click && !changediff) || inputs.controller_one.key_down.b~
 - Inside source: true
 *** True Line Result
-      #Trim the snake a bit if its longer than current size
-** Processing line: ~      if 🎮.🐍.length > 🎮.🛒~
+      if inputs.keyboard.key_down.escape || (inputs.mouse.click && !changediff) || inputs.controller_one.key_down.b
+** Processing line: ~        state.new_difficulty = state.difficulty~
 - Inside source: true
 *** True Line Result
-      if 🎮.🐍.length > 🎮.🛒
-** Processing line: ~        🎮.🐍 = 🎮.🐍[-🎮.🛒..-1]~
+        state.new_difficulty = state.difficulty
+** Processing line: ~        change_to_scene :game~
 - Inside source: true
 *** True Line Result
-        🎮.🐍 = 🎮.🐍[-🎮.🛒..-1]
+        change_to_scene :game
 ** Processing line: ~      end~
 - Inside source: true
 *** True Line Result
       end
+** Processing line: ~    end~
+- Inside source: true
+*** True Line Result
+    end
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~      #Move the head in the Direction~
+** Processing line: ~    def process_inputs_game~
 - Inside source: true
 *** True Line Result
-      #Move the head in the Direction
-** Processing line: ~      🎮.🤖.move! 🎮.🚗~
+    def process_inputs_game
+** Processing line: ~      return unless state.scene == :game~
 - Inside source: true
 *** True Line Result
-      🎮.🤖.move! 🎮.🚗
+      return unless state.scene == :game
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~      #If Head is outside the playing field, or inside snake's body restart game~
-- Inside source: true
-*** True Line Result
-      #If Head is outside the playing field, or inside snake's body restart game
-** Processing line: ~      if 🎮.🤖.x < 0 || 🎮.🤖.x >= 🎮.🗺.x || 🎮.🤖.y < 0 || 🎮.🤖.y >= 🎮.🗺.y || 🎮.🚗 != [0, 0] && 🎮.🐍.any? {|s| s == 🎮.🤖}~
+** Processing line: ~      clicked_menu = false~
 - Inside source: true
 *** True Line Result
-      if 🎮.🤖.x < 0 || 🎮.🤖.x >= 🎮.🗺.x || 🎮.🤖.y < 0 || 🎮.🤖.y >= 🎮.🗺.y || 🎮.🚗 != [0, 0] && 🎮.🐍.any? {|s| s == 🎮.🤖}
-** Processing line: ~        LAST = 🎮.💰~
+      clicked_menu = false
+** Processing line: ~      if inputs.mouse.click~
 - Inside source: true
 *** True Line Result
-        LAST = 🎮.💰
-** Processing line: ~        🎮.as_hash.clear~
+      if inputs.mouse.click
+** Processing line: ~        p = inputs.mouse.click.point~
 - Inside source: true
 *** True Line Result
-        🎮.as_hash.clear
-** Processing line: ~        return~
+        p = inputs.mouse.click.point
+** Processing line: ~        clicked_menu = (p.y >= 620) && (p.x < 275)~
 - Inside source: true
 *** True Line Result
-        return
+        clicked_menu = (p.y >= 620) && (p.x < 275)
 ** Processing line: ~      end~
 - Inside source: true
 *** True Line Result
@@ -95811,30 +97259,34 @@ Follows is a source code listing for all files that have been open sourced. This
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~      #If head lands on food add size and score~
+** Processing line: ~      if clicked_menu || inputs.keyboard.key_down.escape || inputs.keyboard.key_down.enter || inputs.controller_one.key_down.start~
 - Inside source: true
 *** True Line Result
-      #If head lands on food add size and score
-** Processing line: ~      if 🎮.🤖 == 🎮.🍎~
+      if clicked_menu || inputs.keyboard.key_down.escape || inputs.keyboard.key_down.enter || inputs.controller_one.key_down.start
+** Processing line: ~        change_to_scene :menu~
 - Inside source: true
 *** True Line Result
-      if 🎮.🤖 == 🎮.🍎
-** Processing line: ~        🎮.🛒 += 1~
+        change_to_scene :menu
+** Processing line: ~      elsif (inputs.mouse.down || inputs.mouse.click || inputs.keyboard.key_down.space || inputs.controller_one.key_down.a) && state.countdown == 0~
 - Inside source: true
 *** True Line Result
-        🎮.🛒 += 1
-** Processing line: ~        🎮.💰 += (🎮.🛒 * 0.8).floor.to_i + 5~
+      elsif (inputs.mouse.down || inputs.mouse.click || inputs.keyboard.key_down.space || inputs.controller_one.key_down.a) && state.countdown == 0
+** Processing line: ~        state.dy = 0~
 - Inside source: true
 *** True Line Result
-        🎮.💰 += (🎮.🛒 * 0.8).floor.to_i + 5
-** Processing line: ~        spawn_🍎 🎮~
+        state.dy = 0
+** Processing line: ~        state.dy += state.flap_power~
 - Inside source: true
 *** True Line Result
-        spawn_🍎 🎮
-** Processing line: ~        puts 🎮.🍎~
+        state.dy += state.flap_power
+** Processing line: ~        state.flapped_at = state.tick_count~
 - Inside source: true
 *** True Line Result
-        puts 🎮.🍎
+        state.flapped_at = state.tick_count
+** Processing line: ~        outputs.sounds << "sounds/fly-sound.wav"~
+- Inside source: true
+*** True Line Result
+        outputs.sounds << "sounds/fly-sound.wav"
 ** Processing line: ~      end~
 - Inside source: true
 *** True Line Result
@@ -95847,174 +97299,174 @@ Follows is a source code listing for all files that have been open sourced. This
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~    #Every second remove 1 point~
-- Inside source: true
-*** True Line Result
-    #Every second remove 1 point
-** Processing line: ~    if 🎮.💰 > 0 && 🎮.tick_count.mod_zero?(60)~
+** Processing line: ~    def white~
 - Inside source: true
 *** True Line Result
-    if 🎮.💰 > 0 && 🎮.tick_count.mod_zero?(60)
-** Processing line: ~      🎮.💰 -= 1~
+    def white
+** Processing line: ~      { r: 255, g: 255, b: 255 }~
 - Inside source: true
 *** True Line Result
-      🎮.💰 -= 1
+      { r: 255, g: 255, b: 255 }
 ** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
     end
-** Processing line: ~  end~
-- Inside source: true
-*** True Line Result
-  end
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~  def spawn_🍎 🎮~
+** Processing line: ~    def large_white_typeset~
 - Inside source: true
 *** True Line Result
-  def spawn_🍎 🎮
-** Processing line: ~    #Food~
+    def large_white_typeset
+** Processing line: ~      { size_enum: 5, alignment_enum: 0, r: 255, g: 255, b: 255 }~
 - Inside source: true
 *** True Line Result
-    #Food
-** Processing line: ~    🎮.🍎 ||= [*🎮.🤖]~
+      { size_enum: 5, alignment_enum: 0, r: 255, g: 255, b: 255 }
+** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
-    🎮.🍎 ||= [*🎮.🤖]
-** Processing line: ~    #Randomly spawns food inside the playing field, keep doing this if the food keeps landing on the snake's body~
+    end
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-    #Randomly spawns food inside the playing field, keep doing this if the food keeps landing on the snake's body
-** Processing line: ~    while 🎮.🐍.any? {|s| s == 🎮.🍎} || 🎮.🍎 == 🎮.🤖 do~
+
+** Processing line: ~    def at_beginning?~
 - Inside source: true
 *** True Line Result
-    while 🎮.🐍.any? {|s| s == 🎮.🍎} || 🎮.🍎 == 🎮.🤖 do
-** Processing line: ~      🎮.🍎 = [rand(🎮.🗺.x), rand(🎮.🗺.y)]~
+    def at_beginning?
+** Processing line: ~      state.walls.count == 0~
 - Inside source: true
 *** True Line Result
-      🎮.🍎 = [rand(🎮.🗺.x), rand(🎮.🗺.y)]
+      state.walls.count == 0
 ** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
     end
-** Processing line: ~  end~
-- Inside source: true
-*** True Line Result
-  end
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~  def render 🎮, 📺~
+** Processing line: ~    def dragon_collision_box~
 - Inside source: true
 *** True Line Result
-  def render 🎮, 📺
-** Processing line: ~    #Paint the background black~
+    def dragon_collision_box
+** Processing line: ~      state.dragon_sprite~
 - Inside source: true
 *** True Line Result
-    #Paint the background black
-** Processing line: ~    📺.solids << [0, 0, 1280, 720, 0, 0, 0, 255]~
+      state.dragon_sprite
+** Processing line: ~           .scale_rect(1.0 - collision_forgiveness, 0.5, 0.5)~
 - Inside source: true
 *** True Line Result
-    📺.solids << [0, 0, 1280, 720, 0, 0, 0, 255]
-** Processing line: ~    #Draw a border for the playing field~
+           .scale_rect(1.0 - collision_forgiveness, 0.5, 0.5)
+** Processing line: ~           .rect_shift_right(10)~
 - Inside source: true
 *** True Line Result
-    #Draw a border for the playing field
-** Processing line: ~    translate 📺.borders, 🎮.⛓, [0, 0, 🎮.🗺.x * 🎮.⚖️, 🎮.🗺.y * 🎮.⚖️, 255, 255, 255]~
+           .rect_shift_right(10)
+** Processing line: ~           .rect_shift_up(state.dy * 2)~
 - Inside source: true
 *** True Line Result
-    translate 📺.borders, 🎮.⛓, [0, 0, 🎮.🗺.x * 🎮.⚖️, 🎮.🗺.y * 🎮.⚖️, 255, 255, 255]
+           .rect_shift_up(state.dy * 2)
+** Processing line: ~    end~
+- Inside source: true
+*** True Line Result
+    end
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~    #Draw the snake's body~
+** Processing line: ~    def game_over?~
 - Inside source: true
 *** True Line Result
-    #Draw the snake's body
-** Processing line: ~    🎮.🐍.map do |🐍| 🐍.draw! 🎮, 📺, BLUE end~
+    def game_over?
+** Processing line: ~      return true if state.y <= 0.-(500 * collision_forgiveness) && !at_beginning?~
 - Inside source: true
 *** True Line Result
-    🎮.🐍.map do |🐍| 🐍.draw! 🎮, 📺, BLUE end
-** Processing line: ~    #Draw the head~
+      return true if state.y <= 0.-(500 * collision_forgiveness) && !at_beginning?
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-    #Draw the head
-** Processing line: ~    🎮.🤖.draw! 🎮, 📺, BLUE~
+
+** Processing line: ~      state.walls~
 - Inside source: true
 *** True Line Result
-    🎮.🤖.draw! 🎮, 📺, BLUE
-** Processing line: ~    #Draw the food~
+      state.walls
+** Processing line: ~          .flat_map { |w| w.sprites }~
 - Inside source: true
 *** True Line Result
-    #Draw the food
-** Processing line: ~    🎮.🍎.draw! 🎮, 📺, RED~
+          .flat_map { |w| w.sprites }
+** Processing line: ~          .any? do |s|~
 - Inside source: true
 *** True Line Result
-    🎮.🍎.draw! 🎮, 📺, RED
-** Processing line: ~~
+          .any? do |s|
+** Processing line: ~            s && s.intersect_rect?(dragon_collision_box)~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~    #Draw current score~
+            s && s.intersect_rect?(dragon_collision_box)
+** Processing line: ~          end~
 - Inside source: true
 *** True Line Result
-    #Draw current score
-** Processing line: ~    translate 📺.labels, 🎮.⛓, [5, 715, "Score: #{🎮.💰}", GOLD]~
+          end
+** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
-    translate 📺.labels, 🎮.⛓, [5, 715, "Score: #{🎮.💰}", GOLD]
-** Processing line: ~    #Draw your last score, if any~
+    end
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-    #Draw your last score, if any
-** Processing line: ~    translate 📺.labels, 🎮.⛓, [[*🎮.🤖.😀(🎮.⚖️)].move!([0, 🎮.⚖️ * 2]), "Your Last score is #{LAST}", 0, 1, GOLD] unless LAST == 0 || 🎮.🚗 != [0, 0]~
+
+** Processing line: ~    def collision_forgiveness~
 - Inside source: true
 *** True Line Result
-    translate 📺.labels, 🎮.⛓, [[*🎮.🤖.😀(🎮.⚖️)].move!([0, 🎮.⚖️ * 2]), "Your Last score is #{LAST}", 0, 1, GOLD] unless LAST == 0 || 🎮.🚗 != [0, 0]
-** Processing line: ~    #Draw starting message, only if Direction is 0~
+    def collision_forgiveness
+** Processing line: ~      case state.difficulty~
 - Inside source: true
 *** True Line Result
-    #Draw starting message, only if Direction is 0
-** Processing line: ~    translate 📺.labels, 🎮.⛓, [🎮.🤖.😀(🎮.⚖️), "Press any Arrow key to start", 0, 1, GOLD] unless 🎮.🚗 != [0, 0]~
+      case state.difficulty
+** Processing line: ~      when :easy~
 - Inside source: true
 *** True Line Result
-    translate 📺.labels, 🎮.⛓, [🎮.🤖.😀(🎮.⚖️), "Press any Arrow key to start", 0, 1, GOLD] unless 🎮.🚗 != [0, 0]
-** Processing line: ~  end~
+      when :easy
+** Processing line: ~        0.9~
 - Inside source: true
 *** True Line Result
-  end
-** Processing line: ~~
+        0.9
+** Processing line: ~      when :normal~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~  def input 🎮, 🕹~
+      when :normal
+** Processing line: ~        0.7~
 - Inside source: true
 *** True Line Result
-  def input 🎮, 🕹
-** Processing line: ~    #Left and Right keyboard input, only change if X direction is 0~
+        0.7
+** Processing line: ~      when :hard~
 - Inside source: true
 *** True Line Result
-    #Left and Right keyboard input, only change if X direction is 0
-** Processing line: ~    if 🕹.keyboard.key_held.left && 🎮.🚗.x == 0~
+      when :hard
+** Processing line: ~        0.5~
 - Inside source: true
 *** True Line Result
-    if 🕹.keyboard.key_held.left && 🎮.🚗.x == 0
-** Processing line: ~      🎮.🚦 = [-1, 0]~
+        0.5
+** Processing line: ~      when :flappy~
 - Inside source: true
 *** True Line Result
-      🎮.🚦 = [-1, 0]
-** Processing line: ~    elsif 🕹.keyboard.key_held.right && 🎮.🚗.x == 0~
+      when :flappy
+** Processing line: ~        0.3~
 - Inside source: true
 *** True Line Result
-    elsif 🕹.keyboard.key_held.right && 🎮.🚗.x == 0
-** Processing line: ~      🎮.🚦 = [1, 0]~
+        0.3
+** Processing line: ~      else~
 - Inside source: true
 *** True Line Result
-      🎮.🚦 = [1, 0]
+      else
+** Processing line: ~        0.9~
+- Inside source: true
+*** True Line Result
+        0.9
+** Processing line: ~      end~
+- Inside source: true
+*** True Line Result
+      end
 ** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
@@ -96023,322 +97475,314 @@ Follows is a source code listing for all files that have been open sourced. This
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~    #Up and Down keyboard input, only change if Y direction is 0~
+** Processing line: ~    def countdown_text~
 - Inside source: true
 *** True Line Result
-    #Up and Down keyboard input, only change if Y direction is 0
-** Processing line: ~    if 🕹.keyboard.key_held.up && 🎮.🚗.y == 0~
+    def countdown_text
+** Processing line: ~      state.countdown ||= -1~
 - Inside source: true
 *** True Line Result
-    if 🕹.keyboard.key_held.up && 🎮.🚗.y == 0
-** Processing line: ~      🎮.🚦 = [0, 1]~
+      state.countdown ||= -1
+** Processing line: ~      return ""          if state.countdown == 0~
 - Inside source: true
 *** True Line Result
-      🎮.🚦 = [0, 1]
-** Processing line: ~    elsif 🕹.keyboard.key_held.down && 🎮.🚗.y == 0~
+      return ""          if state.countdown == 0
+** Processing line: ~      return "GO!"       if state.countdown.idiv(60) == 0~
 - Inside source: true
 *** True Line Result
-    elsif 🕹.keyboard.key_held.down && 🎮.🚗.y == 0
-** Processing line: ~      🎮.🚦 = [0, -1]~
+      return "GO!"       if state.countdown.idiv(60) == 0
+** Processing line: ~      return "GAME OVER" if state.death_at~
 - Inside source: true
 *** True Line Result
-      🎮.🚦 = [0, -1]
-** Processing line: ~    end~
+      return "GAME OVER" if state.death_at
+** Processing line: ~      return "READY?"~
 - Inside source: true
 *** True Line Result
-    end
-** Processing line: ~  end~
+      return "READY?"
+** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
-  end
+    end
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~  def defaults 🎮~
-- Inside source: true
-*** True Line Result
-  def defaults 🎮
-** Processing line: ~    #Playing field size~
+** Processing line: ~    def begin_countdown~
 - Inside source: true
 *** True Line Result
-    #Playing field size
-** Processing line: ~    🎮.🗺 ||= [20, 20]~
+    def begin_countdown
+** Processing line: ~      state.countdown = 4.seconds~
 - Inside source: true
 *** True Line Result
-    🎮.🗺 ||= [20, 20]
-** Processing line: ~    #Scale for drawing, screen height / Field height~
+      state.countdown = 4.seconds
+** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
-    #Scale for drawing, screen height / Field height
-** Processing line: ~    🎮.⚖️ ||= 720 / 🎮.🗺.y~
+    end
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-    🎮.⚖️ ||= 720 / 🎮.🗺.y
-** Processing line: ~    #Offset, offset all rendering to the center of the screen~
+
+** Processing line: ~    def score_text~
 - Inside source: true
 *** True Line Result
-    #Offset, offset all rendering to the center of the screen
-** Processing line: ~    🎮.⛓ ||= [(1280 - 720).fdiv(2), 0]~
+    def score_text
+** Processing line: ~      return ""                        unless state.countdown > 1.seconds~
 - Inside source: true
 *** True Line Result
-    🎮.⛓ ||= [(1280 - 720).fdiv(2), 0]
-** Processing line: ~    #Padding, make the snake body slightly smaller than the scale~
+      return ""                        unless state.countdown > 1.seconds
+** Processing line: ~      return ""                        unless state.death_at~
 - Inside source: true
 *** True Line Result
-    #Padding, make the snake body slightly smaller than the scale
-** Processing line: ~    🎮.🛶 ||= (🎮.⚖️ * 0.2).to_i~
+      return ""                        unless state.death_at
+** Processing line: ~      return "SCORE: 0 (LOL)"          if state.score == 0~
 - Inside source: true
 *** True Line Result
-    🎮.🛶 ||= (🎮.⚖️ * 0.2).to_i
-** Processing line: ~    #Snake Size~
+      return "SCORE: 0 (LOL)"          if state.score == 0
+** Processing line: ~      return "HI SCORE: #{state.score}" if state.score == state.hi_score~
 - Inside source: true
 *** True Line Result
-    #Snake Size
-** Processing line: ~    🎮.🛒 ||= 3~
+      return "HI SCORE: #{state.score}" if state.score == state.hi_score
+** Processing line: ~      return "SCORE: #{state.score}"~
 - Inside source: true
 *** True Line Result
-    🎮.🛒 ||= 3
-** Processing line: ~    #Snake head, the only part we are actually controlling~
+      return "SCORE: #{state.score}"
+** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
-    #Snake head, the only part we are actually controlling
-** Processing line: ~    🎮.🤖 ||= [🎮.🗺.x / 2, 🎮.🗺.y / 2]~
+    end
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-    🎮.🤖 ||= [🎮.🗺.x / 2, 🎮.🗺.y / 2]
-** Processing line: ~    #Snake body map, follows the head~
+
+** Processing line: ~    def reset_game set_flash = true~
 - Inside source: true
 *** True Line Result
-    #Snake body map, follows the head
-** Processing line: ~    🎮.🐍 ||= []~
+    def reset_game set_flash = true
+** Processing line: ~      state.flash_at = state.tick_count if set_flash~
 - Inside source: true
 *** True Line Result
-    🎮.🐍 ||= []
-** Processing line: ~    #Direction the head moves to~
+      state.flash_at = state.tick_count if set_flash
+** Processing line: ~      state.walls = []~
 - Inside source: true
 *** True Line Result
-    #Direction the head moves to
-** Processing line: ~    🎮.🚗 ||= [0, 0]~
+      state.walls = []
+** Processing line: ~      state.y = 500~
 - Inside source: true
 *** True Line Result
-    🎮.🚗 ||= [0, 0]
-** Processing line: ~    #Next_Direction, during input check only change this variable and then when game updates asign this to Direction~
+      state.y = 500
+** Processing line: ~      state.dy = 0~
 - Inside source: true
 *** True Line Result
-    #Next_Direction, during input check only change this variable and then when game updates asign this to Direction
-** Processing line: ~    🎮.🚦 ||= [*🎮.🚗]~
+      state.dy = 0
+** Processing line: ~      state.hi_score = state.hi_score.greater(state.score)~
 - Inside source: true
 *** True Line Result
-    🎮.🚦 ||= [*🎮.🚗]
-** Processing line: ~    #Your score~
+      state.hi_score = state.hi_score.greater(state.score)
+** Processing line: ~      state.score = 0~
 - Inside source: true
 *** True Line Result
-    #Your score
-** Processing line: ~    🎮.💰 ||= 0~
+      state.score = 0
+** Processing line: ~      state.wall_countdown = state.wall_countdown_length.fdiv(2)~
 - Inside source: true
 *** True Line Result
-    🎮.💰 ||= 0
-** Processing line: ~    #Spawns Food randomly~
+      state.wall_countdown = state.wall_countdown_length.fdiv(2)
+** Processing line: ~      state.show_death = false~
 - Inside source: true
 *** True Line Result
-    #Spawns Food randomly
-** Processing line: ~    spawn_🍎(🎮) unless 🎮.🍎?~
+      state.show_death = false
+** Processing line: ~      state.death_at = nil~
 - Inside source: true
 *** True Line Result
-    spawn_🍎(🎮) unless 🎮.🍎?
-** Processing line: ~  end~
+      state.death_at = nil
+** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
-  end
+    end
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~#+end_src~
-- Line was identified as the end of a code block.
+** Processing line: ~    def change_to_scene scene~
+- Inside source: true
 *** True Line Result
-#+end_src
-** Processing line: ~~
-- End of paragraph detected.
+    def change_to_scene scene
+** Processing line: ~      state.scene = scene~
+- Inside source: true
 *** True Line Result
-
-** Processing line: ~*** Arcade - Solar System - main.rb~
-- Header detected.
+      state.scene = scene
+** Processing line: ~      state.scene_at = state.tick_count~
+- Inside source: true
 *** True Line Result
-
+      state.scene_at = state.tick_count
+** Processing line: ~      inputs.keyboard.clear~
+- Inside source: true
 *** True Line Result
-*** Arcade - Solar System - main.rb
-** Processing line: ~#+begin_src ruby~
-- Line was identified as the beginning of a code block.
+      inputs.keyboard.clear
+** Processing line: ~      inputs.controller_one.clear~
+- Inside source: true
 *** True Line Result
-
+      inputs.controller_one.clear
+** Processing line: ~    end~
+- Inside source: true
 *** True Line Result
-#+begin_src ruby
-** Processing line: ~  # ./samples/99_genre_arcade/solar_system/app/main.rb~
+    end
+** Processing line: ~  end~
 - Inside source: true
 *** True Line Result
-  # ./samples/99_genre_arcade/solar_system/app/main.rb
-** Processing line: ~  # Focused tutorial video: https://s3.amazonaws.com/s3.dragonruby.org/dragonruby-nddnug-workshop.mp4~
+  end
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-  # Focused tutorial video: https://s3.amazonaws.com/s3.dragonruby.org/dragonruby-nddnug-workshop.mp4
-** Processing line: ~  # Workshop/Presentation which provides motivation for creating a game engine: https://www.youtube.com/watch?v=S3CFce1arC8~
+
+** Processing line: ~  $flappy_dragon = FlappyDragon.new~
 - Inside source: true
 *** True Line Result
-  # Workshop/Presentation which provides motivation for creating a game engine: https://www.youtube.com/watch?v=S3CFce1arC8
+  $flappy_dragon = FlappyDragon.new
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~  def defaults args~
+** Processing line: ~  def tick args~
 - Inside source: true
 *** True Line Result
-  def defaults args
-** Processing line: ~    args.outputs.background_color = [0, 0, 0]~
+  def tick args
+** Processing line: ~    $flappy_dragon.grid = args.grid~
 - Inside source: true
 *** True Line Result
-    args.outputs.background_color = [0, 0, 0]
-** Processing line: ~    args.state.x ||= 640~
+    $flappy_dragon.grid = args.grid
+** Processing line: ~    $flappy_dragon.inputs = args.inputs~
 - Inside source: true
 *** True Line Result
-    args.state.x ||= 640
-** Processing line: ~    args.state.y ||= 360~
+    $flappy_dragon.inputs = args.inputs
+** Processing line: ~    $flappy_dragon.state = args.state~
 - Inside source: true
 *** True Line Result
-    args.state.y ||= 360
-** Processing line: ~    args.state.stars ||= 100.map do~
+    $flappy_dragon.state = args.state
+** Processing line: ~    $flappy_dragon.outputs = args.outputs~
 - Inside source: true
 *** True Line Result
-    args.state.stars ||= 100.map do
-** Processing line: ~      [1280 * rand, 720 * rand, rand.fdiv(10), 255 * rand, 255 * rand, 255 * rand]~
+    $flappy_dragon.outputs = args.outputs
+** Processing line: ~    $flappy_dragon.tick~
 - Inside source: true
 *** True Line Result
-      [1280 * rand, 720 * rand, rand.fdiv(10), 255 * rand, 255 * rand, 255 * rand]
-** Processing line: ~    end~
+    $flappy_dragon.tick
+** Processing line: ~  end~
 - Inside source: true
 *** True Line Result
-    end
+  end
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~    args.state.sun ||= args.state.new_entity(:sun) do |s|~
-- Inside source: true
+** Processing line: ~#+end_src~
+- Line was identified as the end of a code block.
 *** True Line Result
-    args.state.sun ||= args.state.new_entity(:sun) do |s|
-** Processing line: ~      s.s = 100~
-- Inside source: true
+#+end_src
+** Processing line: ~~
+- End of paragraph detected.
 *** True Line Result
-      s.s = 100
-** Processing line: ~      s.path = 'sprites/sun.png'~
-- Inside source: true
+
+** Processing line: ~*** Arcade - Pong - main.rb~
+- Header detected.
 *** True Line Result
-      s.path = 'sprites/sun.png'
-** Processing line: ~    end~
-- Inside source: true
+
 *** True Line Result
-    end
-** Processing line: ~~
-- Inside source: true
+*** Arcade - Pong - main.rb
+** Processing line: ~#+begin_src ruby~
+- Line was identified as the beginning of a code block.
 *** True Line Result
 
-** Processing line: ~    args.state.planets = [~
-- Inside source: true
-*** True Line Result
-    args.state.planets = [
-** Processing line: ~      [:mercury,   65,  5,          88],~
-- Inside source: true
 *** True Line Result
-      [:mercury,   65,  5,          88],
-** Processing line: ~      [:venus,    100, 10,         225],~
+#+begin_src ruby
+** Processing line: ~  # ./samples/99_genre_arcade/pong/app/main.rb~
 - Inside source: true
 *** True Line Result
-      [:venus,    100, 10,         225],
-** Processing line: ~      [:earth,    120, 10,         365],~
+  # ./samples/99_genre_arcade/pong/app/main.rb
+** Processing line: ~  def tick args~
 - Inside source: true
 *** True Line Result
-      [:earth,    120, 10,         365],
-** Processing line: ~      [:mars,     140,  8,         687],~
+  def tick args
+** Processing line: ~    defaults args~
 - Inside source: true
 *** True Line Result
-      [:mars,     140,  8,         687],
-** Processing line: ~      [:jupiter,  280, 30, 365 *  11.8],~
+    defaults args
+** Processing line: ~    render args~
 - Inside source: true
 *** True Line Result
-      [:jupiter,  280, 30, 365 *  11.8],
-** Processing line: ~      [:saturn,   350, 20, 365 *  29.5],~
+    render args
+** Processing line: ~    calc args~
 - Inside source: true
 *** True Line Result
-      [:saturn,   350, 20, 365 *  29.5],
-** Processing line: ~      [:uranus,   400, 15, 365 *    84],~
+    calc args
+** Processing line: ~    input args~
 - Inside source: true
 *** True Line Result
-      [:uranus,   400, 15, 365 *    84],
-** Processing line: ~      [:neptune,  440, 15, 365 * 164.8],~
+    input args
+** Processing line: ~  end~
 - Inside source: true
 *** True Line Result
-      [:neptune,  440, 15, 365 * 164.8],
-** Processing line: ~      [:pluto,    480,  5, 365 * 247.8],~
+  end
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-      [:pluto,    480,  5, 365 * 247.8],
-** Processing line: ~    ].map do |name, distance, size, year_in_days|~
+
+** Processing line: ~  def defaults args~
 - Inside source: true
 *** True Line Result
-    ].map do |name, distance, size, year_in_days|
-** Processing line: ~      args.state.new_entity(name) do |p|~
+  def defaults args
+** Processing line: ~    args.state.ball.debounce       ||= 3 * 60~
 - Inside source: true
 *** True Line Result
-      args.state.new_entity(name) do |p|
-** Processing line: ~        p.path = "sprites/#{name}.png"~
+    args.state.ball.debounce       ||= 3 * 60
+** Processing line: ~    args.state.ball.size           ||= 10~
 - Inside source: true
 *** True Line Result
-        p.path = "sprites/#{name}.png"
-** Processing line: ~        p.distance = distance * 0.7~
+    args.state.ball.size           ||= 10
+** Processing line: ~    args.state.ball.size_half      ||= args.state.ball.size / 2~
 - Inside source: true
 *** True Line Result
-        p.distance = distance * 0.7
-** Processing line: ~        p.s = size * 0.7~
+    args.state.ball.size_half      ||= args.state.ball.size / 2
+** Processing line: ~    args.state.ball.x              ||= 640~
 - Inside source: true
 *** True Line Result
-        p.s = size * 0.7
-** Processing line: ~        p.year_in_days = year_in_days~
+    args.state.ball.x              ||= 640
+** Processing line: ~    args.state.ball.y              ||= 360~
 - Inside source: true
 *** True Line Result
-        p.year_in_days = year_in_days
-** Processing line: ~      end~
+    args.state.ball.y              ||= 360
+** Processing line: ~    args.state.ball.dx             ||= 5.randomize(:sign)~
 - Inside source: true
 *** True Line Result
-      end
-** Processing line: ~    end~
+    args.state.ball.dx             ||= 5.randomize(:sign)
+** Processing line: ~    args.state.ball.dy             ||= 5.randomize(:sign)~
 - Inside source: true
 *** True Line Result
-    end
-** Processing line: ~~
+    args.state.ball.dy             ||= 5.randomize(:sign)
+** Processing line: ~    args.state.left_paddle.y       ||= 360~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~    args.state.ship ||= args.state.new_entity(:ship) do |s|~
+    args.state.left_paddle.y       ||= 360
+** Processing line: ~    args.state.right_paddle.y      ||= 360~
 - Inside source: true
 *** True Line Result
-    args.state.ship ||= args.state.new_entity(:ship) do |s|
-** Processing line: ~      s.x = 1280 * rand~
+    args.state.right_paddle.y      ||= 360
+** Processing line: ~    args.state.paddle.h            ||= 120~
 - Inside source: true
 *** True Line Result
-      s.x = 1280 * rand
-** Processing line: ~      s.y = 720 * rand~
+    args.state.paddle.h            ||= 120
+** Processing line: ~    args.state.paddle.w            ||= 10~
 - Inside source: true
 *** True Line Result
-      s.y = 720 * rand
-** Processing line: ~      s.angle = 0~
+    args.state.paddle.w            ||= 10
+** Processing line: ~    args.state.left_paddle.score   ||= 0~
 - Inside source: true
 *** True Line Result
-      s.angle = 0
-** Processing line: ~    end~
+    args.state.left_paddle.score   ||= 0
+** Processing line: ~    args.state.right_paddle.score  ||= 0~
 - Inside source: true
 *** True Line Result
-    end
+    args.state.right_paddle.score  ||= 0
 ** Processing line: ~  end~
 - Inside source: true
 *** True Line Result
@@ -96347,54 +97791,54 @@ Follows is a source code listing for all files that have been open sourced. This
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~  def to_sprite args, entity~
+** Processing line: ~  def render args~
 - Inside source: true
 *** True Line Result
-  def to_sprite args, entity
-** Processing line: ~    x = 0~
+  def render args
+** Processing line: ~    render_center_line args~
 - Inside source: true
 *** True Line Result
-    x = 0
-** Processing line: ~    y = 0~
+    render_center_line args
+** Processing line: ~    render_scores args~
 - Inside source: true
 *** True Line Result
-    y = 0
-** Processing line: ~~
+    render_scores args
+** Processing line: ~    render_countdown args~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~    if entity.year_in_days~
+    render_countdown args
+** Processing line: ~    render_ball args~
 - Inside source: true
 *** True Line Result
-    if entity.year_in_days
-** Processing line: ~      day = args.state.tick_count~
+    render_ball args
+** Processing line: ~    render_paddles args~
 - Inside source: true
 *** True Line Result
-      day = args.state.tick_count
-** Processing line: ~      day_in_year = day % entity.year_in_days~
+    render_paddles args
+** Processing line: ~    render_instructions args~
 - Inside source: true
 *** True Line Result
-      day_in_year = day % entity.year_in_days
-** Processing line: ~      entity.random_start_day ||= day_in_year * rand~
+    render_instructions args
+** Processing line: ~  end~
 - Inside source: true
 *** True Line Result
-      entity.random_start_day ||= day_in_year * rand
-** Processing line: ~      percentage_of_year = day_in_year.fdiv(entity.year_in_days)~
+  end
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-      percentage_of_year = day_in_year.fdiv(entity.year_in_days)
-** Processing line: ~      angle = 365 * percentage_of_year~
+
+** Processing line: ~  begin :render_methods~
 - Inside source: true
 *** True Line Result
-      angle = 365 * percentage_of_year
-** Processing line: ~      x = angle.vector_x(entity.distance)~
+  begin :render_methods
+** Processing line: ~    def render_center_line args~
 - Inside source: true
 *** True Line Result
-      x = angle.vector_x(entity.distance)
-** Processing line: ~      y = angle.vector_y(entity.distance)~
+    def render_center_line args
+** Processing line: ~      args.outputs.lines  << [640, 0, 640, 720]~
 - Inside source: true
 *** True Line Result
-      y = angle.vector_y(entity.distance)
+      args.outputs.lines  << [640, 0, 640, 720]
 ** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
@@ -96403,38 +97847,26 @@ Follows is a source code listing for all files that have been open sourced. This
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~    [640 + x - entity.s.half, 360 + y - entity.s.half, entity.s, entity.s, entity.path]~
-- Inside source: true
-*** True Line Result
-    [640 + x - entity.s.half, 360 + y - entity.s.half, entity.s, entity.s, entity.path]
-** Processing line: ~  end~
-- Inside source: true
-*** True Line Result
-  end
-** Processing line: ~~
-- Inside source: true
-*** True Line Result
-
-** Processing line: ~  def render args~
+** Processing line: ~    def render_scores args~
 - Inside source: true
 *** True Line Result
-  def render args
-** Processing line: ~    args.outputs.solids << [0, 0, 1280, 720]~
+    def render_scores args
+** Processing line: ~      args.outputs.labels << [~
 - Inside source: true
 *** True Line Result
-    args.outputs.solids << [0, 0, 1280, 720]
-** Processing line: ~~
+      args.outputs.labels << [
+** Processing line: ~        [320, 650, args.state.left_paddle.score, 10, 1],~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~    args.outputs.sprites << args.state.stars.map do |x, y, _, r, g, b|~
+        [320, 650, args.state.left_paddle.score, 10, 1],
+** Processing line: ~        [960, 650, args.state.right_paddle.score, 10, 1]~
 - Inside source: true
 *** True Line Result
-    args.outputs.sprites << args.state.stars.map do |x, y, _, r, g, b|
-** Processing line: ~      [x, y, 10, 10, 'sprites/star.png', 0, 100, r, g, b]~
+        [960, 650, args.state.right_paddle.score, 10, 1]
+** Processing line: ~      ]~
 - Inside source: true
 *** True Line Result
-      [x, y, 10, 10, 'sprites/star.png', 0, 100, r, g, b]
+      ]
 ** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
@@ -96443,54 +97875,54 @@ Follows is a source code listing for all files that have been open sourced. This
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~    args.outputs.sprites << to_sprite(args, args.state.sun)~
+** Processing line: ~    def render_countdown args~
 - Inside source: true
 *** True Line Result
-    args.outputs.sprites << to_sprite(args, args.state.sun)
-** Processing line: ~    args.outputs.sprites << args.state.planets.map { |p| to_sprite args, p }~
+    def render_countdown args
+** Processing line: ~      return unless args.state.ball.debounce > 0~
 - Inside source: true
 *** True Line Result
-    args.outputs.sprites << args.state.planets.map { |p| to_sprite args, p }
-** Processing line: ~    args.outputs.sprites << [args.state.ship.x, args.state.ship.y, 20, 20, 'sprites/ship.png', args.state.ship.angle]~
+      return unless args.state.ball.debounce > 0
+** Processing line: ~      args.outputs.labels << [640, 360, "%.2f" % args.state.ball.debounce.fdiv(60), 10, 1]~
 - Inside source: true
 *** True Line Result
-    args.outputs.sprites << [args.state.ship.x, args.state.ship.y, 20, 20, 'sprites/ship.png', args.state.ship.angle]
-** Processing line: ~  end~
+      args.outputs.labels << [640, 360, "%.2f" % args.state.ball.debounce.fdiv(60), 10, 1]
+** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
-  end
+    end
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~  def calc args~
+** Processing line: ~    def render_ball args~
 - Inside source: true
 *** True Line Result
-  def calc args
-** Processing line: ~    args.state.stars = args.state.stars.map do |x, y, speed, r, g, b|~
+    def render_ball args
+** Processing line: ~      args.outputs.solids << solid_ball(args)~
 - Inside source: true
 *** True Line Result
-    args.state.stars = args.state.stars.map do |x, y, speed, r, g, b|
-** Processing line: ~      x += speed~
+      args.outputs.solids << solid_ball(args)
+** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
-      x += speed
-** Processing line: ~      y += speed~
+    end
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-      y += speed
-** Processing line: ~      x = 0 if x > 1280~
+
+** Processing line: ~    def render_paddles args~
 - Inside source: true
 *** True Line Result
-      x = 0 if x > 1280
-** Processing line: ~      y = 0 if y > 720~
+    def render_paddles args
+** Processing line: ~      args.outputs.solids << solid_left_paddle(args)~
 - Inside source: true
 *** True Line Result
-      y = 0 if y > 720
-** Processing line: ~      [x, y, speed, r, g, b]~
+      args.outputs.solids << solid_left_paddle(args)
+** Processing line: ~      args.outputs.solids << solid_right_paddle(args)~
 - Inside source: true
 *** True Line Result
-      [x, y, speed, r, g, b]
+      args.outputs.solids << solid_right_paddle(args)
 ** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
@@ -96499,14 +97931,18 @@ Follows is a source code listing for all files that have been open sourced. This
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~    if args.state.tick_count == 0~
+** Processing line: ~    def render_instructions args~
 - Inside source: true
 *** True Line Result
-    if args.state.tick_count == 0
-** Processing line: ~      args.outputs.sounds << 'sounds/bg.ogg'~
+    def render_instructions args
+** Processing line: ~      args.outputs.labels << [320, 30, "W and S keys to move left paddle.",  0, 1]~
 - Inside source: true
 *** True Line Result
-      args.outputs.sounds << 'sounds/bg.ogg'
+      args.outputs.labels << [320, 30, "W and S keys to move left paddle.",  0, 1]
+** Processing line: ~      args.outputs.labels << [920, 30, "O and L keys to move right paddle.", 0, 1]~
+- Inside source: true
+*** True Line Result
+      args.outputs.labels << [920, 30, "O and L keys to move right paddle.", 0, 1]
 ** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
@@ -96519,302 +97955,294 @@ Follows is a source code listing for all files that have been open sourced. This
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~  def process_inputs args~
+** Processing line: ~  def calc args~
 - Inside source: true
 *** True Line Result
-  def process_inputs args
-** Processing line: ~    if args.inputs.keyboard.left || args.inputs.controller_one.key_held.left~
+  def calc args
+** Processing line: ~    args.state.ball.debounce -= 1 and return if args.state.ball.debounce > 0~
 - Inside source: true
 *** True Line Result
-    if args.inputs.keyboard.left || args.inputs.controller_one.key_held.left
-** Processing line: ~      args.state.ship.angle += 1~
+    args.state.ball.debounce -= 1 and return if args.state.ball.debounce > 0
+** Processing line: ~    calc_move_ball args~
 - Inside source: true
 *** True Line Result
-      args.state.ship.angle += 1
-** Processing line: ~    elsif args.inputs.keyboard.right || args.inputs.controller_one.key_held.right~
+    calc_move_ball args
+** Processing line: ~    calc_collision_with_left_paddle args~
 - Inside source: true
 *** True Line Result
-    elsif args.inputs.keyboard.right || args.inputs.controller_one.key_held.right
-** Processing line: ~      args.state.ship.angle -= 1~
+    calc_collision_with_left_paddle args
+** Processing line: ~    calc_collision_with_right_paddle args~
 - Inside source: true
 *** True Line Result
-      args.state.ship.angle -= 1
-** Processing line: ~    end~
+    calc_collision_with_right_paddle args
+** Processing line: ~    calc_collision_with_walls args~
 - Inside source: true
 *** True Line Result
-    end
+    calc_collision_with_walls args
+** Processing line: ~  end~
+- Inside source: true
+*** True Line Result
+  end
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~    if args.inputs.keyboard.up || args.inputs.controller_one.key_held.a~
+** Processing line: ~  begin :calc_methods~
 - Inside source: true
 *** True Line Result
-    if args.inputs.keyboard.up || args.inputs.controller_one.key_held.a
-** Processing line: ~      args.state.ship.x += args.state.ship.angle.x_vector~
+  begin :calc_methods
+** Processing line: ~    def calc_move_ball args~
 - Inside source: true
 *** True Line Result
-      args.state.ship.x += args.state.ship.angle.x_vector
-** Processing line: ~      args.state.ship.y += args.state.ship.angle.y_vector~
+    def calc_move_ball args
+** Processing line: ~      args.state.ball.x += args.state.ball.dx~
 - Inside source: true
 *** True Line Result
-      args.state.ship.y += args.state.ship.angle.y_vector
-** Processing line: ~    end~
+      args.state.ball.x += args.state.ball.dx
+** Processing line: ~      args.state.ball.y += args.state.ball.dy~
 - Inside source: true
 *** True Line Result
-    end
-** Processing line: ~  end~
+      args.state.ball.y += args.state.ball.dy
+** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
-  end
+    end
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~  def tick args~
-- Inside source: true
-*** True Line Result
-  def tick args
-** Processing line: ~    defaults args~
-- Inside source: true
-*** True Line Result
-    defaults args
-** Processing line: ~    render args~
+** Processing line: ~    def calc_collision_with_left_paddle args~
 - Inside source: true
 *** True Line Result
-    render args
-** Processing line: ~    calc args~
+    def calc_collision_with_left_paddle args
+** Processing line: ~      if solid_left_paddle(args).intersect_rect? solid_ball(args)~
 - Inside source: true
 *** True Line Result
-    calc args
-** Processing line: ~    process_inputs args~
+      if solid_left_paddle(args).intersect_rect? solid_ball(args)
+** Processing line: ~        args.state.ball.dx *= -1~
 - Inside source: true
 *** True Line Result
-    process_inputs args
-** Processing line: ~  end~
+        args.state.ball.dx *= -1
+** Processing line: ~      elsif args.state.ball.x < 0~
 - Inside source: true
 *** True Line Result
-  end
-** Processing line: ~~
+      elsif args.state.ball.x < 0
+** Processing line: ~        args.state.right_paddle.score += 1~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~  def r~
+        args.state.right_paddle.score += 1
+** Processing line: ~        calc_reset_round args~
 - Inside source: true
 *** True Line Result
-  def r
-** Processing line: ~    $gtk.reset~
+        calc_reset_round args
+** Processing line: ~      end~
 - Inside source: true
 *** True Line Result
-    $gtk.reset
-** Processing line: ~  end~
+      end
+** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
-  end
+    end
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~#+end_src~
-- Line was identified as the end of a code block.
-*** True Line Result
-#+end_src
-** Processing line: ~~
-- End of paragraph detected.
-*** True Line Result
-
-** Processing line: ~*** Arcade - Sound Golf - main.rb~
-- Header detected.
-*** True Line Result
-
-*** True Line Result
-*** Arcade - Sound Golf - main.rb
-** Processing line: ~#+begin_src ruby~
-- Line was identified as the beginning of a code block.
-*** True Line Result
-
-*** True Line Result
-#+begin_src ruby
-** Processing line: ~  # ./samples/99_genre_arcade/sound_golf/app/main.rb~
+** Processing line: ~    def calc_collision_with_right_paddle args~
 - Inside source: true
 *** True Line Result
-  # ./samples/99_genre_arcade/sound_golf/app/main.rb
-** Processing line: ~  =begin~
+    def calc_collision_with_right_paddle args
+** Processing line: ~      if solid_right_paddle(args).intersect_rect? solid_ball(args)~
 - Inside source: true
 *** True Line Result
-  =begin
-** Processing line: ~~
+      if solid_right_paddle(args).intersect_rect? solid_ball(args)
+** Processing line: ~        args.state.ball.dx *= -1~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~   APIs Listing that haven't been encountered in previous sample apps:~
+        args.state.ball.dx *= -1
+** Processing line: ~      elsif args.state.ball.x > 1280~
 - Inside source: true
 *** True Line Result
-   APIs Listing that haven't been encountered in previous sample apps:
-** Processing line: ~~
+      elsif args.state.ball.x > 1280
+** Processing line: ~        args.state.left_paddle.score += 1~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~   - sample: Chooses random element from array.~
+        args.state.left_paddle.score += 1
+** Processing line: ~        calc_reset_round args~
 - Inside source: true
 *** True Line Result
-   - sample: Chooses random element from array.
-** Processing line: ~     In this sample app, the target note is set by taking a sample from the collection~
+        calc_reset_round args
+** Processing line: ~      end~
 - Inside source: true
 *** True Line Result
-     In this sample app, the target note is set by taking a sample from the collection
-** Processing line: ~     of available notes.~
+      end
+** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
-     of available notes.
+    end
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~   Reminders:~
+** Processing line: ~    def calc_collision_with_walls args~
 - Inside source: true
 *** True Line Result
-   Reminders:
-** Processing line: ~   - args.grid.(left|right|top|bottom): Pixel value for the boundaries of the virtual~
+    def calc_collision_with_walls args
+** Processing line: ~      if args.state.ball.y + args.state.ball.size_half > 720~
 - Inside source: true
 *** True Line Result
-   - args.grid.(left|right|top|bottom): Pixel value for the boundaries of the virtual
-** Processing line: ~     720 p screen (Dragon Ruby Game Toolkits's virtual resolution is always 1280x720).~
+      if args.state.ball.y + args.state.ball.size_half > 720
+** Processing line: ~        args.state.ball.y = 720 - args.state.ball.size_half~
 - Inside source: true
 *** True Line Result
-     720 p screen (Dragon Ruby Game Toolkits's virtual resolution is always 1280x720).
-** Processing line: ~~
+        args.state.ball.y = 720 - args.state.ball.size_half
+** Processing line: ~        args.state.ball.dy *= -1~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~   - args.state.new_entity: Used when we want to create a new object, like a sprite or button.~
+        args.state.ball.dy *= -1
+** Processing line: ~      elsif args.state.ball.y - args.state.ball.size_half < 0~
 - Inside source: true
 *** True Line Result
-   - args.state.new_entity: Used when we want to create a new object, like a sprite or button.
-** Processing line: ~     For example, if we want to create a new button, we would declare it as a new entity and~
+      elsif args.state.ball.y - args.state.ball.size_half < 0
+** Processing line: ~        args.state.ball.y = args.state.ball.size_half~
 - Inside source: true
 *** True Line Result
-     For example, if we want to create a new button, we would declare it as a new entity and
-** Processing line: ~     then define its properties.~
+        args.state.ball.y = args.state.ball.size_half
+** Processing line: ~        args.state.ball.dy *= -1~
 - Inside source: true
 *** True Line Result
-     then define its properties.
+        args.state.ball.dy *= -1
+** Processing line: ~      end~
+- Inside source: true
+*** True Line Result
+      end
+** Processing line: ~    end~
+- Inside source: true
+*** True Line Result
+    end
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~   - String interpolation: Uses #{} syntax; everything between the #{ and the } is evaluated~
+** Processing line: ~    def calc_reset_round args~
 - Inside source: true
 *** True Line Result
-   - String interpolation: Uses #{} syntax; everything between the #{ and the } is evaluated
-** Processing line: ~     as Ruby code, and the placeholder is replaced with its corresponding value or result.~
+    def calc_reset_round args
+** Processing line: ~      args.state.ball.x = 640~
 - Inside source: true
 *** True Line Result
-     as Ruby code, and the placeholder is replaced with its corresponding value or result.
-** Processing line: ~~
+      args.state.ball.x = 640
+** Processing line: ~      args.state.ball.y = 360~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~   - args.outputs.labels: An array. The values generate a label.~
+      args.state.ball.y = 360
+** Processing line: ~      args.state.ball.dx = 5.randomize(:sign)~
 - Inside source: true
 *** True Line Result
-   - args.outputs.labels: An array. The values generate a label.
-** Processing line: ~     The parameters are [X, Y, TEXT, SIZE, ALIGNMENT, RED, GREEN, BLUE, ALPHA, FONT STYLE]~
+      args.state.ball.dx = 5.randomize(:sign)
+** Processing line: ~      args.state.ball.dy = 5.randomize(:sign)~
 - Inside source: true
 *** True Line Result
-     The parameters are [X, Y, TEXT, SIZE, ALIGNMENT, RED, GREEN, BLUE, ALPHA, FONT STYLE]
-** Processing line: ~     For more information about labels, go to mygame/documentation/02-labels.md.~
+      args.state.ball.dy = 5.randomize(:sign)
+** Processing line: ~      args.state.ball.debounce = 3 * 60~
 - Inside source: true
 *** True Line Result
-     For more information about labels, go to mygame/documentation/02-labels.md.
-** Processing line: ~~
+      args.state.ball.debounce = 3 * 60
+** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~   - find_all: Finds all elements from a collection that meet a certain requirements (and excludes the ones that don't).~
+    end
+** Processing line: ~  end~
 - Inside source: true
 *** True Line Result
-   - find_all: Finds all elements from a collection that meet a certain requirements (and excludes the ones that don't).
+  end
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~   - first: Returns the first element of an array.~
+** Processing line: ~  def input args~
 - Inside source: true
 *** True Line Result
-   - first: Returns the first element of an array.
-** Processing line: ~~
+  def input args
+** Processing line: ~    input_left_paddle args~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~   - inside_rect: Returns true or false depending on if the point is inside the rect.~
+    input_left_paddle args
+** Processing line: ~    input_right_paddle args~
 - Inside source: true
 *** True Line Result
-   - inside_rect: Returns true or false depending on if the point is inside the rect.
+    input_right_paddle args
+** Processing line: ~  end~
+- Inside source: true
+*** True Line Result
+  end
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~   - to_sym: Returns symbol corresponding to string. Will create a symbol if it does~
+** Processing line: ~  begin :input_methods~
 - Inside source: true
 *** True Line Result
-   - to_sym: Returns symbol corresponding to string. Will create a symbol if it does
-** Processing line: ~     not already exist.~
+  begin :input_methods
+** Processing line: ~    def input_left_paddle args~
 - Inside source: true
 *** True Line Result
-     not already exist.
-** Processing line: ~~
+    def input_left_paddle args
+** Processing line: ~      if args.inputs.controller_one.key_down.down  || args.inputs.keyboard.key_down.s~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~  =end~
+      if args.inputs.controller_one.key_down.down  || args.inputs.keyboard.key_down.s
+** Processing line: ~        args.state.left_paddle.y -= 40~
 - Inside source: true
 *** True Line Result
-  =end
-** Processing line: ~~
+        args.state.left_paddle.y -= 40
+** Processing line: ~      elsif args.inputs.controller_one.key_down.up || args.inputs.keyboard.key_down.w~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~  # This sample app allows users to test their musical skills by matching the piano sound that plays in each~
+      elsif args.inputs.controller_one.key_down.up || args.inputs.keyboard.key_down.w
+** Processing line: ~        args.state.left_paddle.y += 40~
 - Inside source: true
 *** True Line Result
-  # This sample app allows users to test their musical skills by matching the piano sound that plays in each
-** Processing line: ~  # level to the correct note.~
+        args.state.left_paddle.y += 40
+** Processing line: ~      end~
 - Inside source: true
 *** True Line Result
-  # level to the correct note.
+      end
+** Processing line: ~    end~
+- Inside source: true
+*** True Line Result
+    end
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~  # Runs all the methods necessary for the game to function properly.~
+** Processing line: ~    def input_right_paddle args~
 - Inside source: true
 *** True Line Result
-  # Runs all the methods necessary for the game to function properly.
-** Processing line: ~  def tick args~
+    def input_right_paddle args
+** Processing line: ~      if args.inputs.controller_two.key_down.down  || args.inputs.keyboard.key_down.l~
 - Inside source: true
 *** True Line Result
-  def tick args
-** Processing line: ~    defaults args~
+      if args.inputs.controller_two.key_down.down  || args.inputs.keyboard.key_down.l
+** Processing line: ~        args.state.right_paddle.y -= 40~
 - Inside source: true
 *** True Line Result
-    defaults args
-** Processing line: ~    render args~
+        args.state.right_paddle.y -= 40
+** Processing line: ~      elsif args.inputs.controller_two.key_down.up || args.inputs.keyboard.key_down.o~
 - Inside source: true
 *** True Line Result
-    render args
-** Processing line: ~    calc args~
+      elsif args.inputs.controller_two.key_down.up || args.inputs.keyboard.key_down.o
+** Processing line: ~        args.state.right_paddle.y += 40~
 - Inside source: true
 *** True Line Result
-    calc args
-** Processing line: ~    input_mouse args~
+        args.state.right_paddle.y += 40
+** Processing line: ~      end~
 - Inside source: true
 *** True Line Result
-    input_mouse args
-** Processing line: ~    tick_instructions args, "Sample app shows how to play sounds. args.outputs.sounds << \"path_to_wav.wav\""~
+      end
+** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
-    tick_instructions args, "Sample app shows how to play sounds. args.outputs.sounds << \"path_to_wav.wav\""
+    end
 ** Processing line: ~  end~
 - Inside source: true
 *** True Line Result
@@ -96823,170 +98251,214 @@ Follows is a source code listing for all files that have been open sourced. This
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~  # Sets default values and creates empty collections~
+** Processing line: ~  begin :assets~
 - Inside source: true
 *** True Line Result
-  # Sets default values and creates empty collections
-** Processing line: ~  # Initialization happens in the first frame only~
+  begin :assets
+** Processing line: ~    def solid_ball args~
 - Inside source: true
 *** True Line Result
-  # Initialization happens in the first frame only
-** Processing line: ~  def defaults args~
+    def solid_ball args
+** Processing line: ~      centered_rect args.state.ball.x, args.state.ball.y, args.state.ball.size, args.state.ball.size~
 - Inside source: true
 *** True Line Result
-  def defaults args
-** Processing line: ~    args.state.notes ||= []~
+      centered_rect args.state.ball.x, args.state.ball.y, args.state.ball.size, args.state.ball.size
+** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
-    args.state.notes ||= []
-** Processing line: ~    args.state.click_feedbacks ||= []~
+    end
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-    args.state.click_feedbacks ||= []
-** Processing line: ~    args.state.current_level ||= 1~
+
+** Processing line: ~    def solid_left_paddle args~
 - Inside source: true
 *** True Line Result
-    args.state.current_level ||= 1
-** Processing line: ~    args.state.times_wrong ||= 0 # when game starts, user hasn't guessed wrong yet~
+    def solid_left_paddle args
+** Processing line: ~      centered_rect_vertically 0, args.state.left_paddle.y, args.state.paddle.w, args.state.paddle.h~
 - Inside source: true
 *** True Line Result
-    args.state.times_wrong ||= 0 # when game starts, user hasn't guessed wrong yet
-** Processing line: ~  end~
+      centered_rect_vertically 0, args.state.left_paddle.y, args.state.paddle.w, args.state.paddle.h
+** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
-  end
+    end
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~  # Uses a label to display current level, and shows the score~
+** Processing line: ~    def solid_right_paddle args~
 - Inside source: true
 *** True Line Result
-  # Uses a label to display current level, and shows the score
-** Processing line: ~  # Creates a button to play the sample note, and displays the available notes that could be a potential match~
+    def solid_right_paddle args
+** Processing line: ~      centered_rect_vertically 1280 - args.state.paddle.w, args.state.right_paddle.y, args.state.paddle.w, args.state.paddle.h~
 - Inside source: true
 *** True Line Result
-  # Creates a button to play the sample note, and displays the available notes that could be a potential match
-** Processing line: ~  def render args~
+      centered_rect_vertically 1280 - args.state.paddle.w, args.state.right_paddle.y, args.state.paddle.w, args.state.paddle.h
+** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
-  def render args
+    end
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~    # grid.w_half positions the label in the horizontal center of the screen.~
+** Processing line: ~    def centered_rect x, y, w, h~
 - Inside source: true
 *** True Line Result
-    # grid.w_half positions the label in the horizontal center of the screen.
-** Processing line: ~    args.outputs.labels << [args.grid.w_half, args.grid.top.shift_down(40), "Hole #{args.state.current_level} of 9", 0, 1, 0, 0, 0]~
+    def centered_rect x, y, w, h
+** Processing line: ~      [x - w / 2, y - h / 2, w, h]~
 - Inside source: true
 *** True Line Result
-    args.outputs.labels << [args.grid.w_half, args.grid.top.shift_down(40), "Hole #{args.state.current_level} of 9", 0, 1, 0, 0, 0]
+      [x - w / 2, y - h / 2, w, h]
+** Processing line: ~    end~
+- Inside source: true
+*** True Line Result
+    end
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~    render_score args # shows score on screen~
+** Processing line: ~    def centered_rect_vertically x, y, w, h~
 - Inside source: true
 *** True Line Result
-    render_score args # shows score on screen
-** Processing line: ~~
+    def centered_rect_vertically x, y, w, h
+** Processing line: ~      [x, y - h / 2, w, h]~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~    args.state.play_again_button ||= { x: 560, y: args.grid.h * 3 / 4 - 40, w: 160, h: 60, label: 'again' } # array definition, text/title~
+      [x, y - h / 2, w, h]
+** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
-    args.state.play_again_button ||= { x: 560, y: args.grid.h * 3 / 4 - 40, w: 160, h: 60, label: 'again' } # array definition, text/title
-** Processing line: ~    args.state.play_note_button ||= { x: 560, y: args.grid.h * 3 / 4 - 40, w: 160, h: 60, label: 'play' }~
+    end
+** Processing line: ~  end~
 - Inside source: true
 *** True Line Result
-    args.state.play_note_button ||= { x: 560, y: args.grid.h * 3 / 4 - 40, w: 160, h: 60, label: 'play' }
+  end
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~    if args.state.game_over # if game is over, a "play again" button is shown~
+** Processing line: ~#+end_src~
+- Line was identified as the end of a code block.
+*** True Line Result
+#+end_src
+** Processing line: ~~
+- End of paragraph detected.
+*** True Line Result
+
+** Processing line: ~*** Arcade - Snakemoji - main.rb~
+- Header detected.
+*** True Line Result
+
+*** True Line Result
+*** Arcade - Snakemoji - main.rb
+** Processing line: ~#+begin_src ruby~
+- Line was identified as the beginning of a code block.
+*** True Line Result
+
+*** True Line Result
+#+begin_src ruby
+** Processing line: ~  # ./samples/99_genre_arcade/snakemoji/app/main.rb~
 - Inside source: true
 *** True Line Result
-    if args.state.game_over # if game is over, a "play again" button is shown
-** Processing line: ~      # Calculations ensure that Play Again label is displayed in center of border~
+  # ./samples/99_genre_arcade/snakemoji/app/main.rb
+** Processing line: ~  # coding: utf-8~
 - Inside source: true
 *** True Line Result
-      # Calculations ensure that Play Again label is displayed in center of border
-** Processing line: ~      # Remove calculations from y parameters and see what happens to border and label placement~
+  # coding: utf-8
+** Processing line: ~  ################################~
 - Inside source: true
 *** True Line Result
-      # Remove calculations from y parameters and see what happens to border and label placement
-** Processing line: ~      args.outputs.labels <<  [args.grid.w_half, args.grid.h * 3 / 4, "Play Again", 0, 1, 0, 0, 0] # outputs label~
+  ################################
+** Processing line: ~  #  So I was working on a snake game while~
 - Inside source: true
 *** True Line Result
-      args.outputs.labels <<  [args.grid.w_half, args.grid.h * 3 / 4, "Play Again", 0, 1, 0, 0, 0] # outputs label
-** Processing line: ~      args.outputs.borders << args.state.play_again_button # outputs border~
+  #  So I was working on a snake game while
+** Processing line: ~  #  learning DragonRuby, and at some point I had a thought~
 - Inside source: true
 *** True Line Result
-      args.outputs.borders << args.state.play_again_button # outputs border
-** Processing line: ~    else # otherwise, if game is not over~
+  #  learning DragonRuby, and at some point I had a thought
+** Processing line: ~  #  what if I use "😀" as a function name, surely it wont work right...?~
 - Inside source: true
 *** True Line Result
-    else # otherwise, if game is not over
-** Processing line: ~      # Calculations ensure that label appears in center of border~
+  #  what if I use "😀" as a function name, surely it wont work right...?
+** Processing line: ~  #  RIGHT....?~
 - Inside source: true
 *** True Line Result
-      # Calculations ensure that label appears in center of border
-** Processing line: ~      args.outputs.labels <<  [args.grid.w_half, args.grid.h * 3 / 4, "Play Note ##{args.state.current_level}", 0, 1, 0, 0, 0] # outputs label~
+  #  RIGHT....?
+** Processing line: ~  #  BUT IT DID, IT WORKED~
 - Inside source: true
 *** True Line Result
-      args.outputs.labels <<  [args.grid.w_half, args.grid.h * 3 / 4, "Play Note ##{args.state.current_level}", 0, 1, 0, 0, 0] # outputs label
-** Processing line: ~      args.outputs.borders << args.state.play_note_button # outputs border~
+  #  BUT IT DID, IT WORKED
+** Processing line: ~  #  it all went downhill from then~
 - Inside source: true
 *** True Line Result
-      args.outputs.borders << args.state.play_note_button # outputs border
-** Processing line: ~    end~
+  #  it all went downhill from then
+** Processing line: ~  #  Created by Anton K. (ai Doge)~
 - Inside source: true
 *** True Line Result
-    end
-** Processing line: ~~
+  #  Created by Anton K. (ai Doge)
+** Processing line: ~  #  https://gist.github.com/scorp200~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~    return if args.state.game_over # return if game is over~
+  #  https://gist.github.com/scorp200
+** Processing line: ~  #############LICENSE############~
 - Inside source: true
 *** True Line Result
-    return if args.state.game_over # return if game is over
-** Processing line: ~~
+  #############LICENSE############
+** Processing line: ~  #  Feel free to use this anywhere and however you want~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~    args.outputs.labels <<   [args.grid.w_half, 400, "I think the note is a(n)...",  0, 1, 0, 0, 0] # outputs label~
+  #  Feel free to use this anywhere and however you want
+** Processing line: ~  #  You can sell this to EA for $1,000,000 if you want, its completely free.~
 - Inside source: true
 *** True Line Result
-    args.outputs.labels <<   [args.grid.w_half, 400, "I think the note is a(n)...",  0, 1, 0, 0, 0] # outputs label
+  #  You can sell this to EA for $1,000,000 if you want, its completely free.
+** Processing line: ~  #  Just rememeber you are helping this... thing... to spread...~
+- Inside source: true
+*** True Line Result
+  #  Just rememeber you are helping this... thing... to spread...
+** Processing line: ~  #  ALSO! I am not liable for any mental, physical or financial damage caused.~
+- Inside source: true
+*** True Line Result
+  #  ALSO! I am not liable for any mental, physical or financial damage caused.
+** Processing line: ~  #############LICENSE############~
+- Inside source: true
+*** True Line Result
+  #############LICENSE############
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~    # Shows all of the available notes that can be potential matches.~
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-    # Shows all of the available notes that can be potential matches.
-** Processing line: ~    available_notes.each_with_index do |note, i|~
+
+** Processing line: ~  class Array~
 - Inside source: true
 *** True Line Result
-    available_notes.each_with_index do |note, i|
-** Processing line: ~      args.state.notes[i] ||= piano_button(args, note, i + 1) # calls piano_button method on each note (creates label and border)~
+  class Array
+** Processing line: ~    #Helper function~
 - Inside source: true
 *** True Line Result
-      args.state.notes[i] ||= piano_button(args, note, i + 1) # calls piano_button method on each note (creates label and border)
-** Processing line: ~      args.outputs.labels <<   args.state.notes[i].label # outputs note on screen with a label and a border~
+    #Helper function
+** Processing line: ~    def move! vector~
 - Inside source: true
 *** True Line Result
-      args.outputs.labels <<   args.state.notes[i].label # outputs note on screen with a label and a border
-** Processing line: ~      args.outputs.borders <<  args.state.notes[i].border~
+    def move! vector
+** Processing line: ~      self.x += vector.x~
 - Inside source: true
 *** True Line Result
-      args.outputs.borders <<  args.state.notes[i].border
+      self.x += vector.x
+** Processing line: ~      self.y += vector.y~
+- Inside source: true
+*** True Line Result
+      self.y += vector.y
+** Processing line: ~      return self~
+- Inside source: true
+*** True Line Result
+      return self
 ** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
@@ -96995,46 +98467,42 @@ Follows is a source code listing for all files that have been open sourced. This
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~    # Shows whether or not the user is correct by filling the screen with either red or green~
-- Inside source: true
-*** True Line Result
-    # Shows whether or not the user is correct by filling the screen with either red or green
-** Processing line: ~    args.outputs.solids << args.state.click_feedbacks.map { |c| c.solid }~
+** Processing line: ~    #Helper function to draw snake body~
 - Inside source: true
 *** True Line Result
-    args.outputs.solids << args.state.click_feedbacks.map { |c| c.solid }
-** Processing line: ~  end~
+    #Helper function to draw snake body
+** Processing line: ~    def draw! 🎮, 📺, color~
 - Inside source: true
 *** True Line Result
-  end
-** Processing line: ~~
+    def draw! 🎮, 📺, color
+** Processing line: ~      translate 📺.solids, 🎮.⛓, [self.x * 🎮.⚖️ + 🎮.🛶 / 2, self.y * 🎮.⚖️ + 🎮.🛶 / 2, 🎮.⚖️ - 🎮.🛶, 🎮.⚖️ - 🎮.🛶, color]~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~  # Shows the score (number of times the user guesses wrong) onto the screen using labels.~
+      translate 📺.solids, 🎮.⛓, [self.x * 🎮.⚖️ + 🎮.🛶 / 2, self.y * 🎮.⚖️ + 🎮.🛶 / 2, 🎮.⚖️ - 🎮.🛶, 🎮.⚖️ - 🎮.🛶, color]
+** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
-  # Shows the score (number of times the user guesses wrong) onto the screen using labels.
-** Processing line: ~  def render_score args~
+    end
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-  def render_score args
-** Processing line: ~    if args.state.times_wrong == 0 # if the user has guessed wrong zero times, the score is par~
+
+** Processing line: ~    #This is where it all started, I was trying to find  good way to multiply a map by a number, * is already used so is **~
 - Inside source: true
 *** True Line Result
-    if args.state.times_wrong == 0 # if the user has guessed wrong zero times, the score is par
-** Processing line: ~      args.outputs.labels << [args.grid.w_half, args.grid.top.shift_down(80), "Score: PAR", 0, 1, 0, 0, 0]~
+    #This is where it all started, I was trying to find  good way to multiply a map by a number, * is already used so is **
+** Processing line: ~    #I kept trying different combinations of symbols, when suddenly...~
 - Inside source: true
 *** True Line Result
-      args.outputs.labels << [args.grid.w_half, args.grid.top.shift_down(80), "Score: PAR", 0, 1, 0, 0, 0]
-** Processing line: ~    else # otherwise, number of times the user has guessed wrong is shown~
+    #I kept trying different combinations of symbols, when suddenly...
+** Processing line: ~    def 😀 value~
 - Inside source: true
 *** True Line Result
-    else # otherwise, number of times the user has guessed wrong is shown
-** Processing line: ~      args.outputs.labels << [args.grid.w_half, args.grid.top.shift_down(80), "Score: +#{args.state.times_wrong}", 0, 1, 0, 0, 0] # shows score using string interpolation~
+    def 😀 value
+** Processing line: ~      self.map {|d| d * value}~
 - Inside source: true
 *** True Line Result
-      args.outputs.labels << [args.grid.w_half, args.grid.top.shift_down(80), "Score: +#{args.state.times_wrong}", 0, 1, 0, 0, 0] # shows score using string interpolation
+      self.map {|d| d * value}
 ** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
@@ -97047,30 +98515,26 @@ Follows is a source code listing for all files that have been open sourced. This
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~  # Sets the target note for the level and performs calculations on click_feedbacks.~
-- Inside source: true
-*** True Line Result
-  # Sets the target note for the level and performs calculations on click_feedbacks.
-** Processing line: ~  def calc args~
+** Processing line: ~  #Draw stuff with an offset~
 - Inside source: true
 *** True Line Result
-  def calc args
-** Processing line: ~    args.state.target_note ||= available_notes.sample # chooses a note from available_notes collection as target note~
+  #Draw stuff with an offset
+** Processing line: ~  def translate output_collection, ⛓, what~
 - Inside source: true
 *** True Line Result
-    args.state.target_note ||= available_notes.sample # chooses a note from available_notes collection as target note
-** Processing line: ~    args.state.click_feedbacks.each    { |c| c.solid[-1] -= 5 } # remove this line and solid color will remain on screen indefinitely~
+  def translate output_collection, ⛓, what
+** Processing line: ~    what.x += ⛓.x~
 - Inside source: true
 *** True Line Result
-    args.state.click_feedbacks.each    { |c| c.solid[-1] -= 5 } # remove this line and solid color will remain on screen indefinitely
-** Processing line: ~    # comment this line out and the solid color will keep flashing on screen instead of being removed from click_feedbacks collection~
+    what.x += ⛓.x
+** Processing line: ~    what.y += ⛓.y~
 - Inside source: true
 *** True Line Result
-    # comment this line out and the solid color will keep flashing on screen instead of being removed from click_feedbacks collection
-** Processing line: ~    args.state.click_feedbacks.reject! { |c| c.solid[-1] <= 0 }~
+    what.y += ⛓.y
+** Processing line: ~    output_collection << what~
 - Inside source: true
 *** True Line Result
-    args.state.click_feedbacks.reject! { |c| c.solid[-1] <= 0 }
+    output_collection << what
 ** Processing line: ~  end~
 - Inside source: true
 *** True Line Result
@@ -97079,166 +98543,170 @@ Follows is a source code listing for all files that have been open sourced. This
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~  # Uses input from the user to play the target note, as well as the other notes that could be a potential match.~
+** Processing line: ~  BLUE = [33, 150, 243]~
 - Inside source: true
 *** True Line Result
-  # Uses input from the user to play the target note, as well as the other notes that could be a potential match.
-** Processing line: ~  def input_mouse args~
+  BLUE = [33, 150, 243]
+** Processing line: ~  RED = [244, 67, 54]~
 - Inside source: true
 *** True Line Result
-  def input_mouse args
-** Processing line: ~    return unless args.inputs.mouse.click # return unless the mouse is clicked~
+  RED = [244, 67, 54]
+** Processing line: ~  GOLD = [255, 193, 7]~
 - Inside source: true
 *** True Line Result
-    return unless args.inputs.mouse.click # return unless the mouse is clicked
+  GOLD = [255, 193, 7]
+** Processing line: ~  LAST = 0~
+- Inside source: true
+*** True Line Result
+  LAST = 0
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~    # finds button that was clicked by user~
+** Processing line: ~  def tick args~
 - Inside source: true
 *** True Line Result
-    # finds button that was clicked by user
-** Processing line: ~    button_clicked = args.outputs.borders.find_all do |b| # go through borders collection to find all borders that meet requirements~
+  def tick args
+** Processing line: ~    defaults args.state~
 - Inside source: true
 *** True Line Result
-    button_clicked = args.outputs.borders.find_all do |b| # go through borders collection to find all borders that meet requirements
-** Processing line: ~      args.inputs.mouse.click.point.inside_rect? b # find button border that mouse was clicked inside of~
+    defaults args.state
+** Processing line: ~    render args.state, args.outputs~
 - Inside source: true
 *** True Line Result
-      args.inputs.mouse.click.point.inside_rect? b # find button border that mouse was clicked inside of
-** Processing line: ~    end.find_all { |b| b.is_a? Hash }.first # reject, return first element~
+    render args.state, args.outputs
+** Processing line: ~    input args.state, args.inputs~
 - Inside source: true
 *** True Line Result
-    end.find_all { |b| b.is_a? Hash }.first # reject, return first element
-** Processing line: ~~
+    input args.state, args.inputs
+** Processing line: ~    update args.state~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~    return unless button_clicked # return unless button_clicked as a value (a button was clicked)~
+    update args.state
+** Processing line: ~  end~
 - Inside source: true
 *** True Line Result
-    return unless button_clicked # return unless button_clicked as a value (a button was clicked)
+  end
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~    queue_click_feedback args, # calls queue_click_feedback method on the button that was clicked~
+** Processing line: ~  def update 🎮~
 - Inside source: true
 *** True Line Result
-    queue_click_feedback args, # calls queue_click_feedback method on the button that was clicked
-** Processing line: ~                         button_clicked.x,~
+  def update 🎮
+** Processing line: ~    #Update every 10 frames~
 - Inside source: true
 *** True Line Result
-                         button_clicked.x,
-** Processing line: ~                         button_clicked.y,~
+    #Update every 10 frames
+** Processing line: ~    if 🎮.tick_count.mod_zero? 10~
 - Inside source: true
 *** True Line Result
-                         button_clicked.y,
-** Processing line: ~                         button_clicked.w,~
+    if 🎮.tick_count.mod_zero? 10
+** Processing line: ~      #Add new snake body piece at head's location~
 - Inside source: true
 *** True Line Result
-                         button_clicked.w,
-** Processing line: ~                         button_clicked.h,~
+      #Add new snake body piece at head's location
+** Processing line: ~      🎮.🐍 << [*🎮.🤖]~
 - Inside source: true
 *** True Line Result
-                         button_clicked.h,
-** Processing line: ~                         150, 100, 200 # sets color of button to shade of purple~
+      🎮.🐍 << [*🎮.🤖]
+** Processing line: ~      #Assign Next Direction to Direction~
 - Inside source: true
 *** True Line Result
-                         150, 100, 200 # sets color of button to shade of purple
-** Processing line: ~~
+      #Assign Next Direction to Direction
+** Processing line: ~      🎮.🚗 = *🎮.🚦~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~    if button_clicked[:label] == 'play' # if "play note" button is pressed~
+      🎮.🚗 = *🎮.🚦
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-    if button_clicked[:label] == 'play' # if "play note" button is pressed
-** Processing line: ~      args.outputs.sounds << "sounds/#{args.state.target_note}.wav" # sound of target note is output~
+
+** Processing line: ~      #Trim the snake a bit if its longer than current size~
 - Inside source: true
 *** True Line Result
-      args.outputs.sounds << "sounds/#{args.state.target_note}.wav" # sound of target note is output
-** Processing line: ~    elsif button_clicked[:label] == 'again' # if "play game again" button is pressed~
+      #Trim the snake a bit if its longer than current size
+** Processing line: ~      if 🎮.🐍.length > 🎮.🛒~
 - Inside source: true
 *** True Line Result
-    elsif button_clicked[:label] == 'again' # if "play game again" button is pressed
-** Processing line: ~      args.state.target_note = nil # no target note~
+      if 🎮.🐍.length > 🎮.🛒
+** Processing line: ~        🎮.🐍 = 🎮.🐍[-🎮.🛒..-1]~
 - Inside source: true
 *** True Line Result
-      args.state.target_note = nil # no target note
-** Processing line: ~      args.state.current_level = 1 # starts at level 1 again~
+        🎮.🐍 = 🎮.🐍[-🎮.🛒..-1]
+** Processing line: ~      end~
 - Inside source: true
 *** True Line Result
-      args.state.current_level = 1 # starts at level 1 again
-** Processing line: ~      args.state.times_wrong = 0 # starts off with 0 wrong guesses~
+      end
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-      args.state.times_wrong = 0 # starts off with 0 wrong guesses
-** Processing line: ~      args.state.game_over = false # the game is not over (because it has just been restarted)~
+
+** Processing line: ~      #Move the head in the Direction~
 - Inside source: true
 *** True Line Result
-      args.state.game_over = false # the game is not over (because it has just been restarted)
-** Processing line: ~    else # otherwise if neither of those buttons were pressed~
+      #Move the head in the Direction
+** Processing line: ~      🎮.🤖.move! 🎮.🚗~
 - Inside source: true
 *** True Line Result
-    else # otherwise if neither of those buttons were pressed
-** Processing line: ~      args.outputs.sounds << "sounds/#{button_clicked[:label]}.wav" # sound of clicked note is played~
+      🎮.🤖.move! 🎮.🚗
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-      args.outputs.sounds << "sounds/#{button_clicked[:label]}.wav" # sound of clicked note is played
-** Processing line: ~      if button_clicked[:label] == args.state.target_note # if clicked note is target note~
+
+** Processing line: ~      #If Head is outside the playing field, or inside snake's body restart game~
 - Inside source: true
 *** True Line Result
-      if button_clicked[:label] == args.state.target_note # if clicked note is target note
-** Processing line: ~        args.state.target_note = nil # target note is emptied~
+      #If Head is outside the playing field, or inside snake's body restart game
+** Processing line: ~      if 🎮.🤖.x < 0 || 🎮.🤖.x >= 🎮.🗺.x || 🎮.🤖.y < 0 || 🎮.🤖.y >= 🎮.🗺.y || 🎮.🚗 != [0, 0] && 🎮.🐍.any? {|s| s == 🎮.🤖}~
 - Inside source: true
 *** True Line Result
-        args.state.target_note = nil # target note is emptied
-** Processing line: ~~
+      if 🎮.🤖.x < 0 || 🎮.🤖.x >= 🎮.🗺.x || 🎮.🤖.y < 0 || 🎮.🤖.y >= 🎮.🗺.y || 🎮.🚗 != [0, 0] && 🎮.🐍.any? {|s| s == 🎮.🤖}
+** Processing line: ~        LAST = 🎮.💰~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~        if args.state.current_level < 9 # if game hasn't reached level 9~
+        LAST = 🎮.💰
+** Processing line: ~        🎮.as_hash.clear~
 - Inside source: true
 *** True Line Result
-        if args.state.current_level < 9 # if game hasn't reached level 9
-** Processing line: ~          args.state.current_level += 1 # game goes to next level~
+        🎮.as_hash.clear
+** Processing line: ~        return~
 - Inside source: true
 *** True Line Result
-          args.state.current_level += 1 # game goes to next level
-** Processing line: ~        else # otherwise, if game has reached level 9~
+        return
+** Processing line: ~      end~
 - Inside source: true
 *** True Line Result
-        else # otherwise, if game has reached level 9
-** Processing line: ~          args.state.game_over = true # the game is over~
+      end
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-          args.state.game_over = true # the game is over
-** Processing line: ~        end~
+
+** Processing line: ~      #If head lands on food add size and score~
 - Inside source: true
 *** True Line Result
-        end
-** Processing line: ~~
+      #If head lands on food add size and score
+** Processing line: ~      if 🎮.🤖 == 🎮.🍎~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~        queue_click_feedback args, 0, 0, args.grid.w, args.grid.h, 100, 200, 100 # green shown if user guesses correctly~
+      if 🎮.🤖 == 🎮.🍎
+** Processing line: ~        🎮.🛒 += 1~
 - Inside source: true
 *** True Line Result
-        queue_click_feedback args, 0, 0, args.grid.w, args.grid.h, 100, 200, 100 # green shown if user guesses correctly
-** Processing line: ~      else # otherwise, if clicked note is not target note~
+        🎮.🛒 += 1
+** Processing line: ~        🎮.💰 += (🎮.🛒 * 0.8).floor.to_i + 5~
 - Inside source: true
 *** True Line Result
-      else # otherwise, if clicked note is not target note
-** Processing line: ~        args.state.times_wrong += 1 # increments times user guessed wrong~
+        🎮.💰 += (🎮.🛒 * 0.8).floor.to_i + 5
+** Processing line: ~        spawn_🍎 🎮~
 - Inside source: true
 *** True Line Result
-        args.state.times_wrong += 1 # increments times user guessed wrong
-** Processing line: ~        queue_click_feedback args, 0, 0, args.grid.w, args.grid.h, 200, 100, 100 # red shown is user guesses wrong~
+        spawn_🍎 🎮
+** Processing line: ~        puts 🎮.🍎~
 - Inside source: true
 *** True Line Result
-        queue_click_feedback args, 0, 0, args.grid.w, args.grid.h, 200, 100, 100 # red shown is user guesses wrong
+        puts 🎮.🍎
 ** Processing line: ~      end~
 - Inside source: true
 *** True Line Result
@@ -97247,26 +98715,26 @@ Follows is a source code listing for all files that have been open sourced. This
 - Inside source: true
 *** True Line Result
     end
-** Processing line: ~  end~
-- Inside source: true
-*** True Line Result
-  end
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~  # Creates a collection of all of the available notes as symbols~
+** Processing line: ~    #Every second remove 1 point~
 - Inside source: true
 *** True Line Result
-  # Creates a collection of all of the available notes as symbols
-** Processing line: ~  def available_notes~
+    #Every second remove 1 point
+** Processing line: ~    if 🎮.💰 > 0 && 🎮.tick_count.mod_zero?(60)~
 - Inside source: true
 *** True Line Result
-  def available_notes
-** Processing line: ~    [:C3, :D3, :E3, :F3, :G3, :A3, :B3, :C4]~
+    if 🎮.💰 > 0 && 🎮.tick_count.mod_zero?(60)
+** Processing line: ~      🎮.💰 -= 1~
 - Inside source: true
 *** True Line Result
-    [:C3, :D3, :E3, :F3, :G3, :A3, :B3, :C4]
+      🎮.💰 -= 1
+** Processing line: ~    end~
+- Inside source: true
+*** True Line Result
+    end
 ** Processing line: ~  end~
 - Inside source: true
 *** True Line Result
@@ -97275,26 +98743,30 @@ Follows is a source code listing for all files that have been open sourced. This
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~  # Creates buttons for each note, and sets a label (the note's name) and border for each note's button.~
+** Processing line: ~  def spawn_🍎 🎮~
 - Inside source: true
 *** True Line Result
-  # Creates buttons for each note, and sets a label (the note's name) and border for each note's button.
-** Processing line: ~  def piano_button args, note, position~
+  def spawn_🍎 🎮
+** Processing line: ~    #Food~
 - Inside source: true
 *** True Line Result
-  def piano_button args, note, position
-** Processing line: ~    args.state.new_entity(:button) do |b| # declares button as new entity~
+    #Food
+** Processing line: ~    🎮.🍎 ||= [*🎮.🤖]~
 - Inside source: true
 *** True Line Result
-    args.state.new_entity(:button) do |b| # declares button as new entity
-** Processing line: ~      b.label  =  [460 + 40.mult(position), args.grid.h * 0.4, "#{note}", 0, 1, 0, 0, 0] # label definition~
+    🎮.🍎 ||= [*🎮.🤖]
+** Processing line: ~    #Randomly spawns food inside the playing field, keep doing this if the food keeps landing on the snake's body~
 - Inside source: true
 *** True Line Result
-      b.label  =  [460 + 40.mult(position), args.grid.h * 0.4, "#{note}", 0, 1, 0, 0, 0] # label definition
-** Processing line: ~      b.border =  { x: 460 + 40.mult(position) - 20, y: args.grid.h * 0.4 - 32, w: 40, h: 40, label: note } # border definition, text/title; 20 subtracted so label is in center of border~
+    #Randomly spawns food inside the playing field, keep doing this if the food keeps landing on the snake's body
+** Processing line: ~    while 🎮.🐍.any? {|s| s == 🎮.🍎} || 🎮.🍎 == 🎮.🤖 do~
 - Inside source: true
 *** True Line Result
-      b.border =  { x: 460 + 40.mult(position) - 20, y: args.grid.h * 0.4 - 32, w: 40, h: 40, label: note } # border definition, text/title; 20 subtracted so label is in center of border
+    while 🎮.🐍.any? {|s| s == 🎮.🍎} || 🎮.🍎 == 🎮.🤖 do
+** Processing line: ~      🎮.🍎 = [rand(🎮.🗺.x), rand(🎮.🗺.y)]~
+- Inside source: true
+*** True Line Result
+      🎮.🍎 = [rand(🎮.🗺.x), rand(🎮.🗺.y)]
 ** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
@@ -97307,94 +98779,82 @@ Follows is a source code listing for all files that have been open sourced. This
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~  # Color of click feedback changes depending on what button was clicked, and whether the guess is right or wrong~
-- Inside source: true
-*** True Line Result
-  # Color of click feedback changes depending on what button was clicked, and whether the guess is right or wrong
-** Processing line: ~  # If a button is clicked, the inside of button is purple (see input_mouse method)~
-- Inside source: true
-*** True Line Result
-  # If a button is clicked, the inside of button is purple (see input_mouse method)
-** Processing line: ~  # If correct note is clicked, screen turns green~
-- Inside source: true
-*** True Line Result
-  # If correct note is clicked, screen turns green
-** Processing line: ~  # If incorrect note is clicked, screen turns red (again, see input_mouse method)~
-- Inside source: true
-*** True Line Result
-  # If incorrect note is clicked, screen turns red (again, see input_mouse method)
-** Processing line: ~  def queue_click_feedback args, x, y, w, h, *color~
+** Processing line: ~  def render 🎮, 📺~
 - Inside source: true
 *** True Line Result
-  def queue_click_feedback args, x, y, w, h, *color
-** Processing line: ~    args.state.click_feedbacks << args.state.new_entity(:click_feedback) do |c| # declares feedback as new entity~
+  def render 🎮, 📺
+** Processing line: ~    #Paint the background black~
 - Inside source: true
 *** True Line Result
-    args.state.click_feedbacks << args.state.new_entity(:click_feedback) do |c| # declares feedback as new entity
-** Processing line: ~      c.solid =  [x, y, w, h, *color, 255] # sets color~
+    #Paint the background black
+** Processing line: ~    📺.solids << [0, 0, 1280, 720, 0, 0, 0, 255]~
 - Inside source: true
 *** True Line Result
-      c.solid =  [x, y, w, h, *color, 255] # sets color
-** Processing line: ~    end~
+    📺.solids << [0, 0, 1280, 720, 0, 0, 0, 255]
+** Processing line: ~    #Draw a border for the playing field~
 - Inside source: true
 *** True Line Result
-    end
-** Processing line: ~  end~
+    #Draw a border for the playing field
+** Processing line: ~    translate 📺.borders, 🎮.⛓, [0, 0, 🎮.🗺.x * 🎮.⚖️, 🎮.🗺.y * 🎮.⚖️, 255, 255, 255]~
 - Inside source: true
 *** True Line Result
-  end
+    translate 📺.borders, 🎮.⛓, [0, 0, 🎮.🗺.x * 🎮.⚖️, 🎮.🗺.y * 🎮.⚖️, 255, 255, 255]
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~  def tick_instructions args, text, y = 715~
+** Processing line: ~    #Draw the snake's body~
 - Inside source: true
 *** True Line Result
-  def tick_instructions args, text, y = 715
-** Processing line: ~    return if args.state.key_event_occurred~
+    #Draw the snake's body
+** Processing line: ~    🎮.🐍.map do |🐍| 🐍.draw! 🎮, 📺, BLUE end~
 - Inside source: true
 *** True Line Result
-    return if args.state.key_event_occurred
-** Processing line: ~    if args.inputs.mouse.click ||~
+    🎮.🐍.map do |🐍| 🐍.draw! 🎮, 📺, BLUE end
+** Processing line: ~    #Draw the head~
 - Inside source: true
 *** True Line Result
-    if args.inputs.mouse.click ||
-** Processing line: ~       args.inputs.keyboard.directional_vector ||~
+    #Draw the head
+** Processing line: ~    🎮.🤖.draw! 🎮, 📺, BLUE~
 - Inside source: true
 *** True Line Result
-       args.inputs.keyboard.directional_vector ||
-** Processing line: ~       args.inputs.keyboard.key_down.enter ||~
+    🎮.🤖.draw! 🎮, 📺, BLUE
+** Processing line: ~    #Draw the food~
 - Inside source: true
 *** True Line Result
-       args.inputs.keyboard.key_down.enter ||
-** Processing line: ~       args.inputs.keyboard.key_down.escape~
+    #Draw the food
+** Processing line: ~    🎮.🍎.draw! 🎮, 📺, RED~
 - Inside source: true
 *** True Line Result
-       args.inputs.keyboard.key_down.escape
-** Processing line: ~      args.state.key_event_occurred = true~
+    🎮.🍎.draw! 🎮, 📺, RED
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-      args.state.key_event_occurred = true
-** Processing line: ~    end~
+
+** Processing line: ~    #Draw current score~
 - Inside source: true
 *** True Line Result
-    end
-** Processing line: ~~
+    #Draw current score
+** Processing line: ~    translate 📺.labels, 🎮.⛓, [5, 715, "Score: #{🎮.💰}", GOLD]~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~    args.outputs.debug << [0, y - 50, 1280, 60].solid~
+    translate 📺.labels, 🎮.⛓, [5, 715, "Score: #{🎮.💰}", GOLD]
+** Processing line: ~    #Draw your last score, if any~
 - Inside source: true
 *** True Line Result
-    args.outputs.debug << [0, y - 50, 1280, 60].solid
-** Processing line: ~    args.outputs.debug << [640, y, text, 1, 1, 255, 255, 255].label~
+    #Draw your last score, if any
+** Processing line: ~    translate 📺.labels, 🎮.⛓, [[*🎮.🤖.😀(🎮.⚖️)].move!([0, 🎮.⚖️ * 2]), "Your Last score is #{LAST}", 0, 1, GOLD] unless LAST == 0 || 🎮.🚗 != [0, 0]~
 - Inside source: true
 *** True Line Result
-    args.outputs.debug << [640, y, text, 1, 1, 255, 255, 255].label
-** Processing line: ~    args.outputs.debug << [640, y - 25, "(click to dismiss instructions)" , -2, 1, 255, 255, 255].label~
+    translate 📺.labels, 🎮.⛓, [[*🎮.🤖.😀(🎮.⚖️)].move!([0, 🎮.⚖️ * 2]), "Your Last score is #{LAST}", 0, 1, GOLD] unless LAST == 0 || 🎮.🚗 != [0, 0]
+** Processing line: ~    #Draw starting message, only if Direction is 0~
 - Inside source: true
 *** True Line Result
-    args.outputs.debug << [640, y - 25, "(click to dismiss instructions)" , -2, 1, 255, 255, 255].label
+    #Draw starting message, only if Direction is 0
+** Processing line: ~    translate 📺.labels, 🎮.⛓, [🎮.🤖.😀(🎮.⚖️), "Press any Arrow key to start", 0, 1, GOLD] unless 🎮.🚗 != [0, 0]~
+- Inside source: true
+*** True Line Result
+    translate 📺.labels, 🎮.⛓, [🎮.🤖.😀(🎮.⚖️), "Press any Arrow key to start", 0, 1, GOLD] unless 🎮.🚗 != [0, 0]
 ** Processing line: ~  end~
 - Inside source: true
 *** True Line Result
@@ -97403,174 +98863,162 @@ Follows is a source code listing for all files that have been open sourced. This
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~#+end_src~
-- Line was identified as the end of a code block.
-*** True Line Result
-#+end_src
-** Processing line: ~~
-- End of paragraph detected.
-*** True Line Result
-
-** Processing line: ~*** Arcade - Twinstick - main.rb~
-- Header detected.
-*** True Line Result
-
-*** True Line Result
-*** Arcade - Twinstick - main.rb
-** Processing line: ~#+begin_src ruby~
-- Line was identified as the beginning of a code block.
+** Processing line: ~  def input 🎮, 🕹~
+- Inside source: true
 *** True Line Result
-
+  def input 🎮, 🕹
+** Processing line: ~    #Left and Right keyboard input, only change if X direction is 0~
+- Inside source: true
 *** True Line Result
-#+begin_src ruby
-** Processing line: ~  # ./samples/99_genre_arcade/twinstick/app/main.rb~
+    #Left and Right keyboard input, only change if X direction is 0
+** Processing line: ~    if 🕹.keyboard.key_held.left && 🎮.🚗.x == 0~
 - Inside source: true
 *** True Line Result
-  # ./samples/99_genre_arcade/twinstick/app/main.rb
-** Processing line: ~  def tick args~
+    if 🕹.keyboard.key_held.left && 🎮.🚗.x == 0
+** Processing line: ~      🎮.🚦 = [-1, 0]~
 - Inside source: true
 *** True Line Result
-  def tick args
-** Processing line: ~    args.state.player         ||= {x: 600, y: 320, w: 80, h: 80, path: 'sprites/circle-white.png', vx: 0, vy: 0, health: 10, cooldown: 0, score: 0}~
+      🎮.🚦 = [-1, 0]
+** Processing line: ~    elsif 🕹.keyboard.key_held.right && 🎮.🚗.x == 0~
 - Inside source: true
 *** True Line Result
-    args.state.player         ||= {x: 600, y: 320, w: 80, h: 80, path: 'sprites/circle-white.png', vx: 0, vy: 0, health: 10, cooldown: 0, score: 0}
-** Processing line: ~    args.state.enemies        ||= []~
+    elsif 🕹.keyboard.key_held.right && 🎮.🚗.x == 0
+** Processing line: ~      🎮.🚦 = [1, 0]~
 - Inside source: true
 *** True Line Result
-    args.state.enemies        ||= []
-** Processing line: ~    args.state.player_bullets ||= []~
+      🎮.🚦 = [1, 0]
+** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
-    args.state.player_bullets ||= []
-** Processing line: ~    args.state.tick_count     ||= -1~
+    end
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-    args.state.tick_count     ||= -1
-** Processing line: ~    args.state.tick_count     += 1~
+
+** Processing line: ~    #Up and Down keyboard input, only change if Y direction is 0~
 - Inside source: true
 *** True Line Result
-    args.state.tick_count     += 1
-** Processing line: ~    spawn_enemies args~
+    #Up and Down keyboard input, only change if Y direction is 0
+** Processing line: ~    if 🕹.keyboard.key_held.up && 🎮.🚗.y == 0~
 - Inside source: true
 *** True Line Result
-    spawn_enemies args
-** Processing line: ~    kill_enemies args~
+    if 🕹.keyboard.key_held.up && 🎮.🚗.y == 0
+** Processing line: ~      🎮.🚦 = [0, 1]~
 - Inside source: true
 *** True Line Result
-    kill_enemies args
-** Processing line: ~    move_enemies args~
+      🎮.🚦 = [0, 1]
+** Processing line: ~    elsif 🕹.keyboard.key_held.down && 🎮.🚗.y == 0~
 - Inside source: true
 *** True Line Result
-    move_enemies args
-** Processing line: ~    move_bullets args~
+    elsif 🕹.keyboard.key_held.down && 🎮.🚗.y == 0
+** Processing line: ~      🎮.🚦 = [0, -1]~
 - Inside source: true
 *** True Line Result
-    move_bullets args
-** Processing line: ~    move_player args~
+      🎮.🚦 = [0, -1]
+** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
-    move_player args
-** Processing line: ~    fire_player args~
+    end
+** Processing line: ~  end~
 - Inside source: true
 *** True Line Result
-    fire_player args
-** Processing line: ~    args.state.player[:r] = args.state.player[:g] = args.state.player[:b] = (args.state.player[:health] * 25.5).clamp(0, 255)~
+  end
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-    args.state.player[:r] = args.state.player[:g] = args.state.player[:b] = (args.state.player[:health] * 25.5).clamp(0, 255)
-** Processing line: ~    label_color           = args.state.player[:health] <= 5 ? 255 : 0~
+
+** Processing line: ~  def defaults 🎮~
 - Inside source: true
 *** True Line Result
-    label_color           = args.state.player[:health] <= 5 ? 255 : 0
-** Processing line: ~    args.outputs.labels << [~
+  def defaults 🎮
+** Processing line: ~    #Playing field size~
 - Inside source: true
 *** True Line Result
-    args.outputs.labels << [
-** Processing line: ~        {~
+    #Playing field size
+** Processing line: ~    🎮.🗺 ||= [20, 20]~
 - Inside source: true
 *** True Line Result
-        {
-** Processing line: ~            x: args.state.player.x + 40, y: args.state.player.y + 60, alignment_enum: 1, text: "#{args.state.player[:health]} HP",~
+    🎮.🗺 ||= [20, 20]
+** Processing line: ~    #Scale for drawing, screen height / Field height~
 - Inside source: true
 *** True Line Result
-            x: args.state.player.x + 40, y: args.state.player.y + 60, alignment_enum: 1, text: "#{args.state.player[:health]} HP",
-** Processing line: ~            r: label_color, g: label_color, b: label_color~
+    #Scale for drawing, screen height / Field height
+** Processing line: ~    🎮.⚖️ ||= 720 / 🎮.🗺.y~
 - Inside source: true
 *** True Line Result
-            r: label_color, g: label_color, b: label_color
-** Processing line: ~        }, {~
+    🎮.⚖️ ||= 720 / 🎮.🗺.y
+** Processing line: ~    #Offset, offset all rendering to the center of the screen~
 - Inside source: true
 *** True Line Result
-        }, {
-** Processing line: ~            x: args.state.player.x + 40, y: args.state.player.y + 40, alignment_enum: 1, text: "#{args.state.player[:score]} PTS",~
+    #Offset, offset all rendering to the center of the screen
+** Processing line: ~    🎮.⛓ ||= [(1280 - 720).fdiv(2), 0]~
 - Inside source: true
 *** True Line Result
-            x: args.state.player.x + 40, y: args.state.player.y + 40, alignment_enum: 1, text: "#{args.state.player[:score]} PTS",
-** Processing line: ~            r: label_color, g: label_color, b: label_color, size_enum: 2 - args.state.player[:score].to_s.length,~
+    🎮.⛓ ||= [(1280 - 720).fdiv(2), 0]
+** Processing line: ~    #Padding, make the snake body slightly smaller than the scale~
 - Inside source: true
 *** True Line Result
-            r: label_color, g: label_color, b: label_color, size_enum: 2 - args.state.player[:score].to_s.length,
-** Processing line: ~        }~
+    #Padding, make the snake body slightly smaller than the scale
+** Processing line: ~    🎮.🛶 ||= (🎮.⚖️ * 0.2).to_i~
 - Inside source: true
 *** True Line Result
-        }
-** Processing line: ~    ]~
+    🎮.🛶 ||= (🎮.⚖️ * 0.2).to_i
+** Processing line: ~    #Snake Size~
 - Inside source: true
 *** True Line Result
-    ]
-** Processing line: ~    args.outputs.sprites << [args.state.player, args.state.enemies, args.state.player_bullets]~
+    #Snake Size
+** Processing line: ~    🎮.🛒 ||= 3~
 - Inside source: true
 *** True Line Result
-    args.outputs.sprites << [args.state.player, args.state.enemies, args.state.player_bullets]
-** Processing line: ~    args.state.clear! if args.state.player[:health] < 0 # Reset the game if the player's health drops below zero~
+    🎮.🛒 ||= 3
+** Processing line: ~    #Snake head, the only part we are actually controlling~
 - Inside source: true
 *** True Line Result
-    args.state.clear! if args.state.player[:health] < 0 # Reset the game if the player's health drops below zero
-** Processing line: ~  end~
+    #Snake head, the only part we are actually controlling
+** Processing line: ~    🎮.🤖 ||= [🎮.🗺.x / 2, 🎮.🗺.y / 2]~
 - Inside source: true
 *** True Line Result
-  end
-** Processing line: ~~
+    🎮.🤖 ||= [🎮.🗺.x / 2, 🎮.🗺.y / 2]
+** Processing line: ~    #Snake body map, follows the head~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~  def spawn_enemies args~
+    #Snake body map, follows the head
+** Processing line: ~    🎮.🐍 ||= []~
 - Inside source: true
 *** True Line Result
-  def spawn_enemies args
-** Processing line: ~    # Spawn enemies more frequently as the player's score increases.~
+    🎮.🐍 ||= []
+** Processing line: ~    #Direction the head moves to~
 - Inside source: true
 *** True Line Result
-    # Spawn enemies more frequently as the player's score increases.
-** Processing line: ~    if rand < (100+args.state.player[:score])/(10000 + args.state.player[:score]) || args.state.tick_count.zero?~
+    #Direction the head moves to
+** Processing line: ~    🎮.🚗 ||= [0, 0]~
 - Inside source: true
 *** True Line Result
-    if rand < (100+args.state.player[:score])/(10000 + args.state.player[:score]) || args.state.tick_count.zero?
-** Processing line: ~      theta = rand * Math::PI * 2~
+    🎮.🚗 ||= [0, 0]
+** Processing line: ~    #Next_Direction, during input check only change this variable and then when game updates asign this to Direction~
 - Inside source: true
 *** True Line Result
-      theta = rand * Math::PI * 2
-** Processing line: ~      args.state.enemies << {~
+    #Next_Direction, during input check only change this variable and then when game updates asign this to Direction
+** Processing line: ~    🎮.🚦 ||= [*🎮.🚗]~
 - Inside source: true
 *** True Line Result
-      args.state.enemies << {
-** Processing line: ~          x: 600 + Math.cos(theta) * 800, y: 320 + Math.sin(theta) * 800, w: 80, h: 80, path: 'sprites/circle-white.png',~
+    🎮.🚦 ||= [*🎮.🚗]
+** Processing line: ~    #Your score~
 - Inside source: true
 *** True Line Result
-          x: 600 + Math.cos(theta) * 800, y: 320 + Math.sin(theta) * 800, w: 80, h: 80, path: 'sprites/circle-white.png',
-** Processing line: ~          r: (256 * rand).floor, g: (256 * rand).floor, b: (256 * rand).floor~
+    #Your score
+** Processing line: ~    🎮.💰 ||= 0~
 - Inside source: true
 *** True Line Result
-          r: (256 * rand).floor, g: (256 * rand).floor, b: (256 * rand).floor
-** Processing line: ~      }~
+    🎮.💰 ||= 0
+** Processing line: ~    #Spawns Food randomly~
 - Inside source: true
 *** True Line Result
-      }
-** Processing line: ~    end~
+    #Spawns Food randomly
+** Processing line: ~    spawn_🍎(🎮) unless 🎮.🍎?~
 - Inside source: true
 *** True Line Result
-    end
+    spawn_🍎(🎮) unless 🎮.🍎?
 ** Processing line: ~  end~
 - Inside source: true
 *** True Line Result
@@ -97579,178 +99027,186 @@ Follows is a source code listing for all files that have been open sourced. This
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~  def kill_enemies args~
-- Inside source: true
+** Processing line: ~#+end_src~
+- Line was identified as the end of a code block.
 *** True Line Result
-  def kill_enemies args
-** Processing line: ~    args.state.enemies.reject! do |enemy|~
-- Inside source: true
+#+end_src
+** Processing line: ~~
+- End of paragraph detected.
 *** True Line Result
-    args.state.enemies.reject! do |enemy|
-** Processing line: ~      # Check if enemy and player are within 80 pixels of each other (i.e. overlapping)~
-- Inside source: true
+
+** Processing line: ~*** Arcade - Solar System - main.rb~
+- Header detected.
 *** True Line Result
-      # Check if enemy and player are within 80 pixels of each other (i.e. overlapping)
-** Processing line: ~      if 6400 > (enemy.x - args.state.player.x) ** 2 + (enemy.y - args.state.player.y) ** 2~
-- Inside source: true
+
 *** True Line Result
-      if 6400 > (enemy.x - args.state.player.x) ** 2 + (enemy.y - args.state.player.y) ** 2
-** Processing line: ~        # Enemy is touching player. Kill enemy, and reduce player HP by 1.~
+*** Arcade - Solar System - main.rb
+** Processing line: ~#+begin_src ruby~
+- Line was identified as the beginning of a code block.
+*** True Line Result
+
+*** True Line Result
+#+begin_src ruby
+** Processing line: ~  # ./samples/99_genre_arcade/solar_system/app/main.rb~
 - Inside source: true
 *** True Line Result
-        # Enemy is touching player. Kill enemy, and reduce player HP by 1.
-** Processing line: ~        args.state.player[:health] -= 1~
+  # ./samples/99_genre_arcade/solar_system/app/main.rb
+** Processing line: ~  # Focused tutorial video: https://s3.amazonaws.com/s3.dragonruby.org/dragonruby-nddnug-workshop.mp4~
 - Inside source: true
 *** True Line Result
-        args.state.player[:health] -= 1
-** Processing line: ~      else~
+  # Focused tutorial video: https://s3.amazonaws.com/s3.dragonruby.org/dragonruby-nddnug-workshop.mp4
+** Processing line: ~  # Workshop/Presentation which provides motivation for creating a game engine: https://www.youtube.com/watch?v=S3CFce1arC8~
 - Inside source: true
 *** True Line Result
-      else
-** Processing line: ~        args.state.player_bullets.any? do |bullet|~
+  # Workshop/Presentation which provides motivation for creating a game engine: https://www.youtube.com/watch?v=S3CFce1arC8
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-        args.state.player_bullets.any? do |bullet|
-** Processing line: ~          # Check if enemy and bullet are within 50 pixels of each other (i.e. overlapping)~
+
+** Processing line: ~  def defaults args~
 - Inside source: true
 *** True Line Result
-          # Check if enemy and bullet are within 50 pixels of each other (i.e. overlapping)
-** Processing line: ~          if 2500 > (enemy.x - bullet.x + 30) ** 2 + (enemy.y - bullet.y + 30) ** 2~
+  def defaults args
+** Processing line: ~    args.outputs.background_color = [0, 0, 0]~
 - Inside source: true
 *** True Line Result
-          if 2500 > (enemy.x - bullet.x + 30) ** 2 + (enemy.y - bullet.y + 30) ** 2
-** Processing line: ~            # Increase player health by one for each enemy killed by a bullet after the first enemy, up to a maximum of 10 HP~
+    args.outputs.background_color = [0, 0, 0]
+** Processing line: ~    args.state.x ||= 640~
 - Inside source: true
 *** True Line Result
-            # Increase player health by one for each enemy killed by a bullet after the first enemy, up to a maximum of 10 HP
-** Processing line: ~            args.state.player[:health] += 1 if args.state.player[:health] < 10 && bullet[:kills] > 0~
+    args.state.x ||= 640
+** Processing line: ~    args.state.y ||= 360~
 - Inside source: true
 *** True Line Result
-            args.state.player[:health] += 1 if args.state.player[:health] < 10 && bullet[:kills] > 0
-** Processing line: ~            # Keep track of how many enemies have been killed by this particular bullet~
+    args.state.y ||= 360
+** Processing line: ~    args.state.stars ||= 100.map do~
 - Inside source: true
 *** True Line Result
-            # Keep track of how many enemies have been killed by this particular bullet
-** Processing line: ~            bullet[:kills]             += 1~
+    args.state.stars ||= 100.map do
+** Processing line: ~      [1280 * rand, 720 * rand, rand.fdiv(10), 255 * rand, 255 * rand, 255 * rand]~
 - Inside source: true
 *** True Line Result
-            bullet[:kills]             += 1
-** Processing line: ~            # Earn more points by killing multiple enemies with one shot.~
+      [1280 * rand, 720 * rand, rand.fdiv(10), 255 * rand, 255 * rand, 255 * rand]
+** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
-            # Earn more points by killing multiple enemies with one shot.
-** Processing line: ~            args.state.player[:score]  += bullet[:kills]~
+    end
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-            args.state.player[:score]  += bullet[:kills]
-** Processing line: ~          end~
+
+** Processing line: ~    args.state.sun ||= args.state.new_entity(:sun) do |s|~
 - Inside source: true
 *** True Line Result
-          end
-** Processing line: ~        end~
+    args.state.sun ||= args.state.new_entity(:sun) do |s|
+** Processing line: ~      s.s = 100~
 - Inside source: true
 *** True Line Result
-        end
-** Processing line: ~      end~
+      s.s = 100
+** Processing line: ~      s.path = 'sprites/sun.png'~
 - Inside source: true
 *** True Line Result
-      end
+      s.path = 'sprites/sun.png'
 ** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
     end
-** Processing line: ~  end~
-- Inside source: true
-*** True Line Result
-  end
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~  def move_enemies args~
+** Processing line: ~    args.state.planets = [~
 - Inside source: true
 *** True Line Result
-  def move_enemies args
-** Processing line: ~    args.state.enemies.each do |enemy|~
+    args.state.planets = [
+** Processing line: ~      [:mercury,   65,  5,          88],~
 - Inside source: true
 *** True Line Result
-    args.state.enemies.each do |enemy|
-** Processing line: ~      # Get the angle from the enemy to the player~
+      [:mercury,   65,  5,          88],
+** Processing line: ~      [:venus,    100, 10,         225],~
 - Inside source: true
 *** True Line Result
-      # Get the angle from the enemy to the player
-** Processing line: ~      theta   = Math.atan2(enemy.y - args.state.player.y, enemy.x - args.state.player.x)~
+      [:venus,    100, 10,         225],
+** Processing line: ~      [:earth,    120, 10,         365],~
 - Inside source: true
 *** True Line Result
-      theta   = Math.atan2(enemy.y - args.state.player.y, enemy.x - args.state.player.x)
-** Processing line: ~      # Convert the angle to a vector pointing at the player~
+      [:earth,    120, 10,         365],
+** Processing line: ~      [:mars,     140,  8,         687],~
 - Inside source: true
 *** True Line Result
-      # Convert the angle to a vector pointing at the player
-** Processing line: ~      dx, dy  = theta.to_degrees.vector 5~
+      [:mars,     140,  8,         687],
+** Processing line: ~      [:jupiter,  280, 30, 365 *  11.8],~
 - Inside source: true
 *** True Line Result
-      dx, dy  = theta.to_degrees.vector 5
-** Processing line: ~      # Move the enemy towards thr player~
+      [:jupiter,  280, 30, 365 *  11.8],
+** Processing line: ~      [:saturn,   350, 20, 365 *  29.5],~
 - Inside source: true
 *** True Line Result
-      # Move the enemy towards thr player
-** Processing line: ~      enemy.x -= dx~
+      [:saturn,   350, 20, 365 *  29.5],
+** Processing line: ~      [:uranus,   400, 15, 365 *    84],~
 - Inside source: true
 *** True Line Result
-      enemy.x -= dx
-** Processing line: ~      enemy.y -= dy~
+      [:uranus,   400, 15, 365 *    84],
+** Processing line: ~      [:neptune,  440, 15, 365 * 164.8],~
 - Inside source: true
 *** True Line Result
-      enemy.y -= dy
-** Processing line: ~    end~
+      [:neptune,  440, 15, 365 * 164.8],
+** Processing line: ~      [:pluto,    480,  5, 365 * 247.8],~
 - Inside source: true
 *** True Line Result
-    end
-** Processing line: ~  end~
+      [:pluto,    480,  5, 365 * 247.8],
+** Processing line: ~    ].map do |name, distance, size, year_in_days|~
 - Inside source: true
 *** True Line Result
-  end
-** Processing line: ~~
+    ].map do |name, distance, size, year_in_days|
+** Processing line: ~      args.state.new_entity(name) do |p|~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~  def move_bullets args~
+      args.state.new_entity(name) do |p|
+** Processing line: ~        p.path = "sprites/#{name}.png"~
 - Inside source: true
 *** True Line Result
-  def move_bullets args
-** Processing line: ~    args.state.player_bullets.each do |bullet|~
+        p.path = "sprites/#{name}.png"
+** Processing line: ~        p.distance = distance * 0.7~
 - Inside source: true
 *** True Line Result
-    args.state.player_bullets.each do |bullet|
-** Processing line: ~      # Move the bullets according to the bullet's velocity~
+        p.distance = distance * 0.7
+** Processing line: ~        p.s = size * 0.7~
 - Inside source: true
 *** True Line Result
-      # Move the bullets according to the bullet's velocity
-** Processing line: ~      bullet.x += bullet[:vx]~
+        p.s = size * 0.7
+** Processing line: ~        p.year_in_days = year_in_days~
 - Inside source: true
 *** True Line Result
-      bullet.x += bullet[:vx]
-** Processing line: ~      bullet.y += bullet[:vy]~
+        p.year_in_days = year_in_days
+** Processing line: ~      end~
 - Inside source: true
 *** True Line Result
-      bullet.y += bullet[:vy]
+      end
 ** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
     end
-** Processing line: ~    args.state.player_bullets.reject! do |bullet|~
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-    args.state.player_bullets.reject! do |bullet|
-** Processing line: ~      # Despawn bullets that are outside the screen area~
+
+** Processing line: ~    args.state.ship ||= args.state.new_entity(:ship) do |s|~
 - Inside source: true
 *** True Line Result
-      # Despawn bullets that are outside the screen area
-** Processing line: ~      bullet.x < -20 || bullet.y < -20 || bullet.x > 1300 || bullet.y > 740~
+    args.state.ship ||= args.state.new_entity(:ship) do |s|
+** Processing line: ~      s.x = 1280 * rand~
 - Inside source: true
 *** True Line Result
-      bullet.x < -20 || bullet.y < -20 || bullet.x > 1300 || bullet.y > 740
+      s.x = 1280 * rand
+** Processing line: ~      s.y = 720 * rand~
+- Inside source: true
+*** True Line Result
+      s.y = 720 * rand
+** Processing line: ~      s.angle = 0~
+- Inside source: true
+*** True Line Result
+      s.angle = 0
 ** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
@@ -97763,62 +99219,66 @@ Follows is a source code listing for all files that have been open sourced. This
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~  def move_player args~
+** Processing line: ~  def to_sprite args, entity~
 - Inside source: true
 *** True Line Result
-  def move_player args
-** Processing line: ~    # Get the currently held direction.~
+  def to_sprite args, entity
+** Processing line: ~    x = 0~
 - Inside source: true
 *** True Line Result
-    # Get the currently held direction.
-** Processing line: ~    dx, dy                 = move_directional_vector args~
+    x = 0
+** Processing line: ~    y = 0~
 - Inside source: true
 *** True Line Result
-    dx, dy                 = move_directional_vector args
-** Processing line: ~    # Take the weighted average of the old velocities and the desired velocities.~
+    y = 0
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-    # Take the weighted average of the old velocities and the desired velocities.
-** Processing line: ~    # Since move_directional_vector returns values between -1 and 1,~
+
+** Processing line: ~    if entity.year_in_days~
 - Inside source: true
 *** True Line Result
-    # Since move_directional_vector returns values between -1 and 1,
-** Processing line: ~    #   and we want to limit the speed to 7.5, we multiply dx and dy by 7.5*0.1 to get 0.75~
+    if entity.year_in_days
+** Processing line: ~      day = args.state.tick_count~
 - Inside source: true
 *** True Line Result
-    #   and we want to limit the speed to 7.5, we multiply dx and dy by 7.5*0.1 to get 0.75
-** Processing line: ~    args.state.player[:vx] = args.state.player[:vx] * 0.9 + dx * 0.75~
+      day = args.state.tick_count
+** Processing line: ~      day_in_year = day % entity.year_in_days~
 - Inside source: true
 *** True Line Result
-    args.state.player[:vx] = args.state.player[:vx] * 0.9 + dx * 0.75
-** Processing line: ~    args.state.player[:vy] = args.state.player[:vy] * 0.9 + dy * 0.75~
+      day_in_year = day % entity.year_in_days
+** Processing line: ~      entity.random_start_day ||= day_in_year * rand~
 - Inside source: true
 *** True Line Result
-    args.state.player[:vy] = args.state.player[:vy] * 0.9 + dy * 0.75
-** Processing line: ~    # Move the player~
+      entity.random_start_day ||= day_in_year * rand
+** Processing line: ~      percentage_of_year = day_in_year.fdiv(entity.year_in_days)~
 - Inside source: true
 *** True Line Result
-    # Move the player
-** Processing line: ~    args.state.player.x    += args.state.player[:vx]~
+      percentage_of_year = day_in_year.fdiv(entity.year_in_days)
+** Processing line: ~      angle = 365 * percentage_of_year~
 - Inside source: true
 *** True Line Result
-    args.state.player.x    += args.state.player[:vx]
-** Processing line: ~    args.state.player.y    += args.state.player[:vy]~
+      angle = 365 * percentage_of_year
+** Processing line: ~      x = angle.vector_x(entity.distance)~
 - Inside source: true
 *** True Line Result
-    args.state.player.y    += args.state.player[:vy]
-** Processing line: ~    # If the player is about to go out of bounds, put them back in bounds.~
+      x = angle.vector_x(entity.distance)
+** Processing line: ~      y = angle.vector_y(entity.distance)~
 - Inside source: true
 *** True Line Result
-    # If the player is about to go out of bounds, put them back in bounds.
-** Processing line: ~    args.state.player.x    = args.state.player.x.clamp(0, 1201)~
+      y = angle.vector_y(entity.distance)
+** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
-    args.state.player.x    = args.state.player.x.clamp(0, 1201)
-** Processing line: ~    args.state.player.y    = args.state.player.y.clamp(0, 640)~
+    end
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-    args.state.player.y    = args.state.player.y.clamp(0, 640)
+
+** Processing line: ~    [640 + x - entity.s.half, 360 + y - entity.s.half, entity.s, entity.s, entity.path]~
+- Inside source: true
+*** True Line Result
+    [640 + x - entity.s.half, 360 + y - entity.s.half, entity.s, entity.s, entity.path]
 ** Processing line: ~  end~
 - Inside source: true
 *** True Line Result
@@ -97827,210 +99287,206 @@ Follows is a source code listing for all files that have been open sourced. This
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~~
+** Processing line: ~  def render args~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~  def fire_player args~
+  def render args
+** Processing line: ~    args.outputs.solids << [0, 0, 1280, 720]~
 - Inside source: true
 *** True Line Result
-  def fire_player args
-** Processing line: ~    # Reduce the firing cooldown each tick~
+    args.outputs.solids << [0, 0, 1280, 720]
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-    # Reduce the firing cooldown each tick
-** Processing line: ~    args.state.player[:cooldown] -= 1~
+
+** Processing line: ~    args.outputs.sprites << args.state.stars.map do |x, y, _, r, g, b|~
 - Inside source: true
 *** True Line Result
-    args.state.player[:cooldown] -= 1
-** Processing line: ~    # If the player is allowed to fire~
+    args.outputs.sprites << args.state.stars.map do |x, y, _, r, g, b|
+** Processing line: ~      [x, y, 10, 10, 'sprites/star.png', 0, 100, r, g, b]~
 - Inside source: true
 *** True Line Result
-    # If the player is allowed to fire
-** Processing line: ~    if args.state.player[:cooldown] <= 0~
+      [x, y, 10, 10, 'sprites/star.png', 0, 100, r, g, b]
+** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
-    if args.state.player[:cooldown] <= 0
-** Processing line: ~      dx, dy = shoot_directional_vector args # Get the bullet velocity~
+    end
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-      dx, dy = shoot_directional_vector args # Get the bullet velocity
-** Processing line: ~      return if dx == 0 && dy == 0 # If the velocity is zero, the player doesn't want to fire. Therefore, we just return early.~
+
+** Processing line: ~    args.outputs.sprites << to_sprite(args, args.state.sun)~
 - Inside source: true
 *** True Line Result
-      return if dx == 0 && dy == 0 # If the velocity is zero, the player doesn't want to fire. Therefore, we just return early.
-** Processing line: ~      # Add a new bullet to the list of player bullets.~
+    args.outputs.sprites << to_sprite(args, args.state.sun)
+** Processing line: ~    args.outputs.sprites << args.state.planets.map { |p| to_sprite args, p }~
 - Inside source: true
 *** True Line Result
-      # Add a new bullet to the list of player bullets.
-** Processing line: ~      args.state.player_bullets << {~
+    args.outputs.sprites << args.state.planets.map { |p| to_sprite args, p }
+** Processing line: ~    args.outputs.sprites << [args.state.ship.x, args.state.ship.y, 20, 20, 'sprites/ship.png', args.state.ship.angle]~
 - Inside source: true
 *** True Line Result
-      args.state.player_bullets << {
-** Processing line: ~          x:     args.state.player.x + 30 + 40 * dx,~
+    args.outputs.sprites << [args.state.ship.x, args.state.ship.y, 20, 20, 'sprites/ship.png', args.state.ship.angle]
+** Processing line: ~  end~
 - Inside source: true
 *** True Line Result
-          x:     args.state.player.x + 30 + 40 * dx,
-** Processing line: ~          y:     args.state.player.y + 30 + 40 * dy,~
+  end
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-          y:     args.state.player.y + 30 + 40 * dy,
-** Processing line: ~          w:     20, h: 20,~
+
+** Processing line: ~  def calc args~
 - Inside source: true
 *** True Line Result
-          w:     20, h: 20,
-** Processing line: ~          path:  'sprites/circle-white.png',~
+  def calc args
+** Processing line: ~    args.state.stars = args.state.stars.map do |x, y, speed, r, g, b|~
 - Inside source: true
 *** True Line Result
-          path:  'sprites/circle-white.png',
-** Processing line: ~          r:     0, g: 0, b: 0,~
+    args.state.stars = args.state.stars.map do |x, y, speed, r, g, b|
+** Processing line: ~      x += speed~
 - Inside source: true
 *** True Line Result
-          r:     0, g: 0, b: 0,
-** Processing line: ~          vx:    10 * dx + args.state.player[:vx] / 7.5, vy: 10 * dy + args.state.player[:vy] / 7.5, # Factor in a bit of the player's velocity~
+      x += speed
+** Processing line: ~      y += speed~
 - Inside source: true
 *** True Line Result
-          vx:    10 * dx + args.state.player[:vx] / 7.5, vy: 10 * dy + args.state.player[:vy] / 7.5, # Factor in a bit of the player's velocity
-** Processing line: ~          kills: 0~
+      y += speed
+** Processing line: ~      x = 0 if x > 1280~
 - Inside source: true
 *** True Line Result
-          kills: 0
-** Processing line: ~      }~
+      x = 0 if x > 1280
+** Processing line: ~      y = 0 if y > 720~
 - Inside source: true
 *** True Line Result
-      }
-** Processing line: ~      args.state.player[:cooldown] = 30 # Reset the cooldown~
+      y = 0 if y > 720
+** Processing line: ~      [x, y, speed, r, g, b]~
 - Inside source: true
 *** True Line Result
-      args.state.player[:cooldown] = 30 # Reset the cooldown
+      [x, y, speed, r, g, b]
 ** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
     end
-** Processing line: ~  end~
-- Inside source: true
-*** True Line Result
-  end
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~  # Custom function for getting a directional vector just for movement using WASD~
-- Inside source: true
-*** True Line Result
-  # Custom function for getting a directional vector just for movement using WASD
-** Processing line: ~  def move_directional_vector args~
+** Processing line: ~    if args.state.tick_count == 0~
 - Inside source: true
 *** True Line Result
-  def move_directional_vector args
-** Processing line: ~    dx = 0~
+    if args.state.tick_count == 0
+** Processing line: ~      args.outputs.sounds << 'sounds/bg.ogg'~
 - Inside source: true
 *** True Line Result
-    dx = 0
-** Processing line: ~    dx += 1 if args.inputs.keyboard.d~
+      args.outputs.sounds << 'sounds/bg.ogg'
+** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
-    dx += 1 if args.inputs.keyboard.d
-** Processing line: ~    dx -= 1 if args.inputs.keyboard.a~
+    end
+** Processing line: ~  end~
 - Inside source: true
 *** True Line Result
-    dx -= 1 if args.inputs.keyboard.a
-** Processing line: ~    dy = 0~
+  end
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-    dy = 0
-** Processing line: ~    dy += 1 if args.inputs.keyboard.w~
+
+** Processing line: ~  def process_inputs args~
 - Inside source: true
 *** True Line Result
-    dy += 1 if args.inputs.keyboard.w
-** Processing line: ~    dy -= 1 if args.inputs.keyboard.s~
+  def process_inputs args
+** Processing line: ~    if args.inputs.keyboard.left || args.inputs.controller_one.key_held.left~
 - Inside source: true
 *** True Line Result
-    dy -= 1 if args.inputs.keyboard.s
-** Processing line: ~    if dx != 0 && dy != 0~
+    if args.inputs.keyboard.left || args.inputs.controller_one.key_held.left
+** Processing line: ~      args.state.ship.angle += 1~
 - Inside source: true
 *** True Line Result
-    if dx != 0 && dy != 0
-** Processing line: ~      dx *= 0.7071~
+      args.state.ship.angle += 1
+** Processing line: ~    elsif args.inputs.keyboard.right || args.inputs.controller_one.key_held.right~
 - Inside source: true
 *** True Line Result
-      dx *= 0.7071
-** Processing line: ~      dy *= 0.7071~
+    elsif args.inputs.keyboard.right || args.inputs.controller_one.key_held.right
+** Processing line: ~      args.state.ship.angle -= 1~
 - Inside source: true
 *** True Line Result
-      dy *= 0.7071
+      args.state.ship.angle -= 1
 ** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
     end
-** Processing line: ~    [dx, dy]~
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-    [dx, dy]
-** Processing line: ~  end~
+
+** Processing line: ~    if args.inputs.keyboard.up || args.inputs.controller_one.key_held.a~
 - Inside source: true
 *** True Line Result
-  end
-** Processing line: ~~
+    if args.inputs.keyboard.up || args.inputs.controller_one.key_held.a
+** Processing line: ~      args.state.ship.x += args.state.ship.angle.x_vector~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~  # Custom function for getting a directional vector just for shooting using the arrow keys~
+      args.state.ship.x += args.state.ship.angle.x_vector
+** Processing line: ~      args.state.ship.y += args.state.ship.angle.y_vector~
 - Inside source: true
 *** True Line Result
-  # Custom function for getting a directional vector just for shooting using the arrow keys
-** Processing line: ~  def shoot_directional_vector args~
+      args.state.ship.y += args.state.ship.angle.y_vector
+** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
-  def shoot_directional_vector args
-** Processing line: ~    dx = 0~
+    end
+** Processing line: ~  end~
 - Inside source: true
 *** True Line Result
-    dx = 0
-** Processing line: ~    dx += 1 if args.inputs.keyboard.key_down.right || args.inputs.keyboard.key_held.right~
+  end
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-    dx += 1 if args.inputs.keyboard.key_down.right || args.inputs.keyboard.key_held.right
-** Processing line: ~    dx -= 1 if args.inputs.keyboard.key_down.left || args.inputs.keyboard.key_held.left~
+
+** Processing line: ~  def tick args~
 - Inside source: true
 *** True Line Result
-    dx -= 1 if args.inputs.keyboard.key_down.left || args.inputs.keyboard.key_held.left
-** Processing line: ~    dy = 0~
+  def tick args
+** Processing line: ~    defaults args~
 - Inside source: true
 *** True Line Result
-    dy = 0
-** Processing line: ~    dy += 1 if args.inputs.keyboard.key_down.up || args.inputs.keyboard.key_held.up~
+    defaults args
+** Processing line: ~    render args~
 - Inside source: true
 *** True Line Result
-    dy += 1 if args.inputs.keyboard.key_down.up || args.inputs.keyboard.key_held.up
-** Processing line: ~    dy -= 1 if args.inputs.keyboard.key_down.down || args.inputs.keyboard.key_held.down~
+    render args
+** Processing line: ~    calc args~
 - Inside source: true
 *** True Line Result
-    dy -= 1 if args.inputs.keyboard.key_down.down || args.inputs.keyboard.key_held.down
-** Processing line: ~    if dx != 0 && dy != 0~
+    calc args
+** Processing line: ~    process_inputs args~
 - Inside source: true
 *** True Line Result
-    if dx != 0 && dy != 0
-** Processing line: ~      dx *= 0.7071~
+    process_inputs args
+** Processing line: ~  end~
 - Inside source: true
 *** True Line Result
-      dx *= 0.7071
-** Processing line: ~      dy *= 0.7071~
+  end
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-      dy *= 0.7071
-** Processing line: ~    end~
+
+** Processing line: ~  def r~
 - Inside source: true
 *** True Line Result
-    end
-** Processing line: ~    [dx, dy]~
+  def r
+** Processing line: ~    $gtk.reset~
 - Inside source: true
 *** True Line Result
-    [dx, dy]
+    $gtk.reset
 ** Processing line: ~  end~
 - Inside source: true
 *** True Line Result
   end
+** Processing line: ~~
+- Inside source: true
+*** True Line Result
+
 ** Processing line: ~#+end_src~
 - Line was identified as the end of a code block.
 *** True Line Result
@@ -98039,674 +99495,718 @@ Follows is a source code listing for all files that have been open sourced. This
 - End of paragraph detected.
 *** True Line Result
 
-** Processing line: ~*** Crafting - Craft Game Starting Point - main.rb~
+** Processing line: ~*** Arcade - Sound Golf - main.rb~
 - Header detected.
 *** True Line Result
 
 *** True Line Result
-*** Crafting - Craft Game Starting Point - main.rb
+*** Arcade - Sound Golf - main.rb
 ** Processing line: ~#+begin_src ruby~
 - Line was identified as the beginning of a code block.
 *** True Line Result
 
 *** True Line Result
 #+begin_src ruby
-** Processing line: ~  # ./samples/99_genre_crafting/craft_game_starting_point/app/main.rb~
+** Processing line: ~  # ./samples/99_genre_arcade/sound_golf/app/main.rb~
 - Inside source: true
 *** True Line Result
-  # ./samples/99_genre_crafting/craft_game_starting_point/app/main.rb
-** Processing line: ~  # ==================================================~
+  # ./samples/99_genre_arcade/sound_golf/app/main.rb
+** Processing line: ~  =begin~
 - Inside source: true
 *** True Line Result
-  # ==================================================
-** Processing line: ~  # A NOTE TO JAM CRAFT PARTICIPANTS:~
+  =begin
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-  # A NOTE TO JAM CRAFT PARTICIPANTS:
-** Processing line: ~  # The comments and code in here are just as small piece of DragonRuby's capabilities.~
+
+** Processing line: ~   APIs Listing that haven't been encountered in previous sample apps:~
 - Inside source: true
 *** True Line Result
-  # The comments and code in here are just as small piece of DragonRuby's capabilities.
-** Processing line: ~  # Be sure to check out the rest of the sample apps. Start with README.txt and go from there!~
+   APIs Listing that haven't been encountered in previous sample apps:
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-  # Be sure to check out the rest of the sample apps. Start with README.txt and go from there!
-** Processing line: ~  # ==================================================~
+
+** Processing line: ~   - sample: Chooses random element from array.~
 - Inside source: true
 *** True Line Result
-  # ==================================================
-** Processing line: ~~
+   - sample: Chooses random element from array.
+** Processing line: ~     In this sample app, the target note is set by taking a sample from the collection~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~  # def tick args is the entry point into your game. This function is called at~
+     In this sample app, the target note is set by taking a sample from the collection
+** Processing line: ~     of available notes.~
 - Inside source: true
 *** True Line Result
-  # def tick args is the entry point into your game. This function is called at
-** Processing line: ~  # a fixed update time of 60hz (60 fps).~
+     of available notes.
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-  # a fixed update time of 60hz (60 fps).
-** Processing line: ~  def tick args~
+
+** Processing line: ~   Reminders:~
 - Inside source: true
 *** True Line Result
-  def tick args
-** Processing line: ~    # The defaults function intitializes the game.~
+   Reminders:
+** Processing line: ~   - args.grid.(left|right|top|bottom): Pixel value for the boundaries of the virtual~
 - Inside source: true
 *** True Line Result
-    # The defaults function intitializes the game.
-** Processing line: ~    defaults args~
+   - args.grid.(left|right|top|bottom): Pixel value for the boundaries of the virtual
+** Processing line: ~     720 p screen (Dragon Ruby Game Toolkits's virtual resolution is always 1280x720).~
 - Inside source: true
 *** True Line Result
-    defaults args
+     720 p screen (Dragon Ruby Game Toolkits's virtual resolution is always 1280x720).
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~    # After the game is initialized, render it.~
+** Processing line: ~   - args.state.new_entity: Used when we want to create a new object, like a sprite or button.~
 - Inside source: true
 *** True Line Result
-    # After the game is initialized, render it.
-** Processing line: ~    render args~
+   - args.state.new_entity: Used when we want to create a new object, like a sprite or button.
+** Processing line: ~     For example, if we want to create a new button, we would declare it as a new entity and~
 - Inside source: true
 *** True Line Result
-    render args
+     For example, if we want to create a new button, we would declare it as a new entity and
+** Processing line: ~     then define its properties.~
+- Inside source: true
+*** True Line Result
+     then define its properties.
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~    # After rendering the player should be able to respond to input.~
+** Processing line: ~   - String interpolation: Uses #{} syntax; everything between the #{ and the } is evaluated~
 - Inside source: true
 *** True Line Result
-    # After rendering the player should be able to respond to input.
-** Processing line: ~    input args~
+   - String interpolation: Uses #{} syntax; everything between the #{ and the } is evaluated
+** Processing line: ~     as Ruby code, and the placeholder is replaced with its corresponding value or result.~
 - Inside source: true
 *** True Line Result
-    input args
+     as Ruby code, and the placeholder is replaced with its corresponding value or result.
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~    # After responding to input, the game performs any additional calculations.~
+** Processing line: ~   - args.outputs.labels: An array. The values generate a label.~
 - Inside source: true
 *** True Line Result
-    # After responding to input, the game performs any additional calculations.
-** Processing line: ~    calc args~
+   - args.outputs.labels: An array. The values generate a label.
+** Processing line: ~     The parameters are [X, Y, TEXT, SIZE, ALIGNMENT, RED, GREEN, BLUE, ALPHA, FONT STYLE]~
 - Inside source: true
 *** True Line Result
-    calc args
-** Processing line: ~  end~
+     The parameters are [X, Y, TEXT, SIZE, ALIGNMENT, RED, GREEN, BLUE, ALPHA, FONT STYLE]
+** Processing line: ~     For more information about labels, go to mygame/documentation/02-labels.md.~
 - Inside source: true
 *** True Line Result
-  end
+     For more information about labels, go to mygame/documentation/02-labels.md.
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~  def defaults args~
-- Inside source: true
-*** True Line Result
-  def defaults args
-** Processing line: ~    # hide the mouse cursor for this game, we are going to render our own cursor~
-- Inside source: true
-*** True Line Result
-    # hide the mouse cursor for this game, we are going to render our own cursor
-** Processing line: ~    if args.state.tick_count == 0~
+** Processing line: ~   - find_all: Finds all elements from a collection that meet a certain requirements (and excludes the ones that don't).~
 - Inside source: true
 *** True Line Result
-    if args.state.tick_count == 0
-** Processing line: ~      args.gtk.hide_cursor~
+   - find_all: Finds all elements from a collection that meet a certain requirements (and excludes the ones that don't).
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-      args.gtk.hide_cursor
-** Processing line: ~    end~
+
+** Processing line: ~   - first: Returns the first element of an array.~
 - Inside source: true
 *** True Line Result
-    end
+   - first: Returns the first element of an array.
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~    args.state.click_ripples ||= []~
+** Processing line: ~   - inside_rect: Returns true or false depending on if the point is inside the rect.~
 - Inside source: true
 *** True Line Result
-    args.state.click_ripples ||= []
+   - inside_rect: Returns true or false depending on if the point is inside the rect.
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~    # everything is on a 1280x720 virtual canvas, so you can~
+** Processing line: ~   - to_sym: Returns symbol corresponding to string. Will create a symbol if it does~
 - Inside source: true
 *** True Line Result
-    # everything is on a 1280x720 virtual canvas, so you can
-** Processing line: ~    # hardcode locations~
+   - to_sym: Returns symbol corresponding to string. Will create a symbol if it does
+** Processing line: ~     not already exist.~
 - Inside source: true
 *** True Line Result
-    # hardcode locations
+     not already exist.
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~    # define the borders for where the inventory is located~
+** Processing line: ~  =end~
 - Inside source: true
 *** True Line Result
-    # define the borders for where the inventory is located
-** Processing line: ~    # args.state is a data structure that accepts any arbitrary parameters~
+  =end
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-    # args.state is a data structure that accepts any arbitrary parameters
-** Processing line: ~    # so you can create an object graph without having to create any classes.~
+
+** Processing line: ~  # This sample app allows users to test their musical skills by matching the piano sound that plays in each~
 - Inside source: true
 *** True Line Result
-    # so you can create an object graph without having to create any classes.
+  # This sample app allows users to test their musical skills by matching the piano sound that plays in each
+** Processing line: ~  # level to the correct note.~
+- Inside source: true
+*** True Line Result
+  # level to the correct note.
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~    # Bottom left is 0, 0. Top right is 1280, 720.~
+** Processing line: ~  # Runs all the methods necessary for the game to function properly.~
 - Inside source: true
 *** True Line Result
-    # Bottom left is 0, 0. Top right is 1280, 720.
-** Processing line: ~    # The inventory area is at the top of the screen~
+  # Runs all the methods necessary for the game to function properly.
+** Processing line: ~  def tick args~
 - Inside source: true
 *** True Line Result
-    # The inventory area is at the top of the screen
-** Processing line: ~    # the number 80 is the size of all the sprites, so that is what is being~
+  def tick args
+** Processing line: ~    defaults args~
 - Inside source: true
 *** True Line Result
-    # the number 80 is the size of all the sprites, so that is what is being
-** Processing line: ~    # used to decide the with and height~
+    defaults args
+** Processing line: ~    render args~
 - Inside source: true
 *** True Line Result
-    # used to decide the with and height
-** Processing line: ~    args.state.sprite_size = 80~
+    render args
+** Processing line: ~    calc args~
 - Inside source: true
 *** True Line Result
-    args.state.sprite_size = 80
-** Processing line: ~~
+    calc args
+** Processing line: ~    input_mouse args~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~    args.state.inventory_border.w  = args.state.sprite_size * 10~
+    input_mouse args
+** Processing line: ~    tick_instructions args, "Sample app shows how to play sounds. args.outputs.sounds << \"path_to_wav.wav\""~
 - Inside source: true
 *** True Line Result
-    args.state.inventory_border.w  = args.state.sprite_size * 10
-** Processing line: ~    args.state.inventory_border.h  = args.state.sprite_size * 3~
+    tick_instructions args, "Sample app shows how to play sounds. args.outputs.sounds << \"path_to_wav.wav\""
+** Processing line: ~  end~
 - Inside source: true
 *** True Line Result
-    args.state.inventory_border.h  = args.state.sprite_size * 3
-** Processing line: ~    args.state.inventory_border.x  = 10~
-- Inside source: true
-*** True Line Result
-    args.state.inventory_border.x  = 10
-** Processing line: ~    args.state.inventory_border.y  = 710 - args.state.inventory_border.h~
-- Inside source: true
-*** True Line Result
-    args.state.inventory_border.y  = 710 - args.state.inventory_border.h
-** Processing line: ~~
+  end
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~    # define the borders for where the crafting area is located~
+** Processing line: ~  # Sets default values and creates empty collections~
 - Inside source: true
 *** True Line Result
-    # define the borders for where the crafting area is located
-** Processing line: ~    # the crafting area is below the inventory area~
+  # Sets default values and creates empty collections
+** Processing line: ~  # Initialization happens in the first frame only~
 - Inside source: true
 *** True Line Result
-    # the crafting area is below the inventory area
-** Processing line: ~    # the number 80 is the size of all the sprites, so that is what is being~
+  # Initialization happens in the first frame only
+** Processing line: ~  def defaults args~
 - Inside source: true
 *** True Line Result
-    # the number 80 is the size of all the sprites, so that is what is being
-** Processing line: ~    # used to decide the with and height~
+  def defaults args
+** Processing line: ~    args.state.notes ||= []~
 - Inside source: true
 *** True Line Result
-    # used to decide the with and height
-** Processing line: ~    args.state.craft_border.x =  10~
+    args.state.notes ||= []
+** Processing line: ~    args.state.click_feedbacks ||= []~
 - Inside source: true
 *** True Line Result
-    args.state.craft_border.x =  10
-** Processing line: ~    args.state.craft_border.y = 220~
+    args.state.click_feedbacks ||= []
+** Processing line: ~    args.state.current_level ||= 1~
 - Inside source: true
 *** True Line Result
-    args.state.craft_border.y = 220
-** Processing line: ~    args.state.craft_border.w = args.state.sprite_size * 3~
+    args.state.current_level ||= 1
+** Processing line: ~    args.state.times_wrong ||= 0 # when game starts, user hasn't guessed wrong yet~
 - Inside source: true
 *** True Line Result
-    args.state.craft_border.w = args.state.sprite_size * 3
-** Processing line: ~    args.state.craft_border.h = args.state.sprite_size * 3~
+    args.state.times_wrong ||= 0 # when game starts, user hasn't guessed wrong yet
+** Processing line: ~  end~
 - Inside source: true
 *** True Line Result
-    args.state.craft_border.h = args.state.sprite_size * 3
+  end
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~    # define the area where results are located~
+** Processing line: ~  # Uses a label to display current level, and shows the score~
 - Inside source: true
 *** True Line Result
-    # define the area where results are located
-** Processing line: ~    # the crafting result is to the right of the craft area~
+  # Uses a label to display current level, and shows the score
+** Processing line: ~  # Creates a button to play the sample note, and displays the available notes that could be a potential match~
 - Inside source: true
 *** True Line Result
-    # the crafting result is to the right of the craft area
-** Processing line: ~    args.state.result_border.x =  10 + args.state.sprite_size * 3 + args.state.sprite_size~
+  # Creates a button to play the sample note, and displays the available notes that could be a potential match
+** Processing line: ~  def render args~
 - Inside source: true
 *** True Line Result
-    args.state.result_border.x =  10 + args.state.sprite_size * 3 + args.state.sprite_size
-** Processing line: ~    args.state.result_border.y = 220 + args.state.sprite_size~
+  def render args
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-    args.state.result_border.y = 220 + args.state.sprite_size
-** Processing line: ~    args.state.result_border.w = args.state.sprite_size~
+
+** Processing line: ~    # grid.w_half positions the label in the horizontal center of the screen.~
 - Inside source: true
 *** True Line Result
-    args.state.result_border.w = args.state.sprite_size
-** Processing line: ~    args.state.result_border.h = args.state.sprite_size~
+    # grid.w_half positions the label in the horizontal center of the screen.
+** Processing line: ~    args.outputs.labels << [args.grid.w_half, args.grid.top.shift_down(40), "Hole #{args.state.current_level} of 9", 0, 1, 0, 0, 0]~
 - Inside source: true
 *** True Line Result
-    args.state.result_border.h = args.state.sprite_size
+    args.outputs.labels << [args.grid.w_half, args.grid.top.shift_down(40), "Hole #{args.state.current_level} of 9", 0, 1, 0, 0, 0]
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~    # initialize items for the first time if they are nil~
+** Processing line: ~    render_score args # shows score on screen~
 - Inside source: true
 *** True Line Result
-    # initialize items for the first time if they are nil
-** Processing line: ~    # you start with 15 wood, 1 chest, and 5 plank~
+    render_score args # shows score on screen
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-    # you start with 15 wood, 1 chest, and 5 plank
-** Processing line: ~    # Ruby has built in syntax for dictionaries (they look a lot like json objects).~
+
+** Processing line: ~    args.state.play_again_button ||= { x: 560, y: args.grid.h * 3 / 4 - 40, w: 160, h: 60, label: 'again' } # array definition, text/title~
 - Inside source: true
 *** True Line Result
-    # Ruby has built in syntax for dictionaries (they look a lot like json objects).
-** Processing line: ~    # Ruby also has a special type called a Symbol denoted with a : followed by a word.~
+    args.state.play_again_button ||= { x: 560, y: args.grid.h * 3 / 4 - 40, w: 160, h: 60, label: 'again' } # array definition, text/title
+** Processing line: ~    args.state.play_note_button ||= { x: 560, y: args.grid.h * 3 / 4 - 40, w: 160, h: 60, label: 'play' }~
 - Inside source: true
 *** True Line Result
-    # Ruby also has a special type called a Symbol denoted with a : followed by a word.
-** Processing line: ~    # Symbols are nice because they remove the need for magic strings.~
+    args.state.play_note_button ||= { x: 560, y: args.grid.h * 3 / 4 - 40, w: 160, h: 60, label: 'play' }
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-    # Symbols are nice because they remove the need for magic strings.
-** Processing line: ~    if !args.state.items~
+
+** Processing line: ~    if args.state.game_over # if game is over, a "play again" button is shown~
 - Inside source: true
 *** True Line Result
-    if !args.state.items
-** Processing line: ~      args.state.items = [~
+    if args.state.game_over # if game is over, a "play again" button is shown
+** Processing line: ~      # Calculations ensure that Play Again label is displayed in center of border~
 - Inside source: true
 *** True Line Result
-      args.state.items = [
-** Processing line: ~        {~
+      # Calculations ensure that Play Again label is displayed in center of border
+** Processing line: ~      # Remove calculations from y parameters and see what happens to border and label placement~
 - Inside source: true
 *** True Line Result
-        {
-** Processing line: ~          id: :wood, # :wood is a Symbol, this is better than using "wood" for the id~
+      # Remove calculations from y parameters and see what happens to border and label placement
+** Processing line: ~      args.outputs.labels <<  [args.grid.w_half, args.grid.h * 3 / 4, "Play Again", 0, 1, 0, 0, 0] # outputs label~
 - Inside source: true
 *** True Line Result
-          id: :wood, # :wood is a Symbol, this is better than using "wood" for the id
-** Processing line: ~          quantity: 15,~
+      args.outputs.labels <<  [args.grid.w_half, args.grid.h * 3 / 4, "Play Again", 0, 1, 0, 0, 0] # outputs label
+** Processing line: ~      args.outputs.borders << args.state.play_again_button # outputs border~
 - Inside source: true
 *** True Line Result
-          quantity: 15,
-** Processing line: ~          path: 'sprites/wood.png',~
+      args.outputs.borders << args.state.play_again_button # outputs border
+** Processing line: ~    else # otherwise, if game is not over~
 - Inside source: true
 *** True Line Result
-          path: 'sprites/wood.png',
-** Processing line: ~          location: :inventory,~
+    else # otherwise, if game is not over
+** Processing line: ~      # Calculations ensure that label appears in center of border~
 - Inside source: true
 *** True Line Result
-          location: :inventory,
-** Processing line: ~          ordinal_x: 0, ordinal_y: 0~
+      # Calculations ensure that label appears in center of border
+** Processing line: ~      args.outputs.labels <<  [args.grid.w_half, args.grid.h * 3 / 4, "Play Note ##{args.state.current_level}", 0, 1, 0, 0, 0] # outputs label~
 - Inside source: true
 *** True Line Result
-          ordinal_x: 0, ordinal_y: 0
-** Processing line: ~        },~
+      args.outputs.labels <<  [args.grid.w_half, args.grid.h * 3 / 4, "Play Note ##{args.state.current_level}", 0, 1, 0, 0, 0] # outputs label
+** Processing line: ~      args.outputs.borders << args.state.play_note_button # outputs border~
 - Inside source: true
 *** True Line Result
-        },
-** Processing line: ~        {~
+      args.outputs.borders << args.state.play_note_button # outputs border
+** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
-        {
-** Processing line: ~          id: :chest,~
+    end
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-          id: :chest,
-** Processing line: ~          quantity: 1,~
+
+** Processing line: ~    return if args.state.game_over # return if game is over~
 - Inside source: true
 *** True Line Result
-          quantity: 1,
-** Processing line: ~          path: 'sprites/chest.png',~
+    return if args.state.game_over # return if game is over
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-          path: 'sprites/chest.png',
-** Processing line: ~          location: :inventory,~
+
+** Processing line: ~    args.outputs.labels <<   [args.grid.w_half, 400, "I think the note is a(n)...",  0, 1, 0, 0, 0] # outputs label~
 - Inside source: true
 *** True Line Result
-          location: :inventory,
-** Processing line: ~          ordinal_x: 1, ordinal_y: 0~
+    args.outputs.labels <<   [args.grid.w_half, 400, "I think the note is a(n)...",  0, 1, 0, 0, 0] # outputs label
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-          ordinal_x: 1, ordinal_y: 0
-** Processing line: ~        },~
+
+** Processing line: ~    # Shows all of the available notes that can be potential matches.~
 - Inside source: true
 *** True Line Result
-        },
-** Processing line: ~        {~
+    # Shows all of the available notes that can be potential matches.
+** Processing line: ~    available_notes.each_with_index do |note, i|~
 - Inside source: true
 *** True Line Result
-        {
-** Processing line: ~          id: :plank,~
+    available_notes.each_with_index do |note, i|
+** Processing line: ~      args.state.notes[i] ||= piano_button(args, note, i + 1) # calls piano_button method on each note (creates label and border)~
 - Inside source: true
 *** True Line Result
-          id: :plank,
-** Processing line: ~          quantity: 5,~
+      args.state.notes[i] ||= piano_button(args, note, i + 1) # calls piano_button method on each note (creates label and border)
+** Processing line: ~      args.outputs.labels <<   args.state.notes[i].label # outputs note on screen with a label and a border~
 - Inside source: true
 *** True Line Result
-          quantity: 5,
-** Processing line: ~          path: 'sprites/plank.png',~
+      args.outputs.labels <<   args.state.notes[i].label # outputs note on screen with a label and a border
+** Processing line: ~      args.outputs.borders <<  args.state.notes[i].border~
 - Inside source: true
 *** True Line Result
-          path: 'sprites/plank.png',
-** Processing line: ~          location: :inventory,~
+      args.outputs.borders <<  args.state.notes[i].border
+** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
-          location: :inventory,
-** Processing line: ~          ordinal_x: 2, ordinal_y: 0~
+    end
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-          ordinal_x: 2, ordinal_y: 0
-** Processing line: ~        },~
+
+** Processing line: ~    # Shows whether or not the user is correct by filling the screen with either red or green~
 - Inside source: true
 *** True Line Result
-        },
-** Processing line: ~      ]~
+    # Shows whether or not the user is correct by filling the screen with either red or green
+** Processing line: ~    args.outputs.solids << args.state.click_feedbacks.map { |c| c.solid }~
 - Inside source: true
 *** True Line Result
-      ]
+    args.outputs.solids << args.state.click_feedbacks.map { |c| c.solid }
+** Processing line: ~  end~
+- Inside source: true
+*** True Line Result
+  end
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~      # after initializing the oridinal positions, derive the pixel~
+** Processing line: ~  # Shows the score (number of times the user guesses wrong) onto the screen using labels.~
 - Inside source: true
 *** True Line Result
-      # after initializing the oridinal positions, derive the pixel
-** Processing line: ~      # locations assuming that the width and height are 80~
+  # Shows the score (number of times the user guesses wrong) onto the screen using labels.
+** Processing line: ~  def render_score args~
 - Inside source: true
 *** True Line Result
-      # locations assuming that the width and height are 80
-** Processing line: ~      args.state.items.each { |item| set_inventory_position args, item }~
+  def render_score args
+** Processing line: ~    if args.state.times_wrong == 0 # if the user has guessed wrong zero times, the score is par~
 - Inside source: true
 *** True Line Result
-      args.state.items.each { |item| set_inventory_position args, item }
+    if args.state.times_wrong == 0 # if the user has guessed wrong zero times, the score is par
+** Processing line: ~      args.outputs.labels << [args.grid.w_half, args.grid.top.shift_down(80), "Score: PAR", 0, 1, 0, 0, 0]~
+- Inside source: true
+*** True Line Result
+      args.outputs.labels << [args.grid.w_half, args.grid.top.shift_down(80), "Score: PAR", 0, 1, 0, 0, 0]
+** Processing line: ~    else # otherwise, number of times the user has guessed wrong is shown~
+- Inside source: true
+*** True Line Result
+    else # otherwise, number of times the user has guessed wrong is shown
+** Processing line: ~      args.outputs.labels << [args.grid.w_half, args.grid.top.shift_down(80), "Score: +#{args.state.times_wrong}", 0, 1, 0, 0, 0] # shows score using string interpolation~
+- Inside source: true
+*** True Line Result
+      args.outputs.labels << [args.grid.w_half, args.grid.top.shift_down(80), "Score: +#{args.state.times_wrong}", 0, 1, 0, 0, 0] # shows score using string interpolation
 ** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
     end
-** Processing line: ~~
+** Processing line: ~  end~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~    # define all the oridinal positions of the inventory slots~
+  end
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-    # define all the oridinal positions of the inventory slots
-** Processing line: ~    if !args.state.inventory_area~
+
+** Processing line: ~  # Sets the target note for the level and performs calculations on click_feedbacks.~
 - Inside source: true
 *** True Line Result
-    if !args.state.inventory_area
-** Processing line: ~      args.state.inventory_area = [~
+  # Sets the target note for the level and performs calculations on click_feedbacks.
+** Processing line: ~  def calc args~
 - Inside source: true
 *** True Line Result
-      args.state.inventory_area = [
-** Processing line: ~        { ordinal_x: 0,  ordinal_y: 0 },~
+  def calc args
+** Processing line: ~    args.state.target_note ||= available_notes.sample # chooses a note from available_notes collection as target note~
 - Inside source: true
 *** True Line Result
-        { ordinal_x: 0,  ordinal_y: 0 },
-** Processing line: ~        { ordinal_x: 1,  ordinal_y: 0 },~
+    args.state.target_note ||= available_notes.sample # chooses a note from available_notes collection as target note
+** Processing line: ~    args.state.click_feedbacks.each    { |c| c.solid[-1] -= 5 } # remove this line and solid color will remain on screen indefinitely~
 - Inside source: true
 *** True Line Result
-        { ordinal_x: 1,  ordinal_y: 0 },
-** Processing line: ~        { ordinal_x: 2,  ordinal_y: 0 },~
+    args.state.click_feedbacks.each    { |c| c.solid[-1] -= 5 } # remove this line and solid color will remain on screen indefinitely
+** Processing line: ~    # comment this line out and the solid color will keep flashing on screen instead of being removed from click_feedbacks collection~
 - Inside source: true
 *** True Line Result
-        { ordinal_x: 2,  ordinal_y: 0 },
-** Processing line: ~        { ordinal_x: 3,  ordinal_y: 0 },~
+    # comment this line out and the solid color will keep flashing on screen instead of being removed from click_feedbacks collection
+** Processing line: ~    args.state.click_feedbacks.reject! { |c| c.solid[-1] <= 0 }~
 - Inside source: true
 *** True Line Result
-        { ordinal_x: 3,  ordinal_y: 0 },
-** Processing line: ~        { ordinal_x: 4,  ordinal_y: 0 },~
+    args.state.click_feedbacks.reject! { |c| c.solid[-1] <= 0 }
+** Processing line: ~  end~
 - Inside source: true
 *** True Line Result
-        { ordinal_x: 4,  ordinal_y: 0 },
-** Processing line: ~        { ordinal_x: 5,  ordinal_y: 0 },~
+  end
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-        { ordinal_x: 5,  ordinal_y: 0 },
-** Processing line: ~        { ordinal_x: 6,  ordinal_y: 0 },~
+
+** Processing line: ~  # Uses input from the user to play the target note, as well as the other notes that could be a potential match.~
 - Inside source: true
 *** True Line Result
-        { ordinal_x: 6,  ordinal_y: 0 },
-** Processing line: ~        { ordinal_x: 7,  ordinal_y: 0 },~
+  # Uses input from the user to play the target note, as well as the other notes that could be a potential match.
+** Processing line: ~  def input_mouse args~
 - Inside source: true
 *** True Line Result
-        { ordinal_x: 7,  ordinal_y: 0 },
-** Processing line: ~        { ordinal_x: 8,  ordinal_y: 0 },~
+  def input_mouse args
+** Processing line: ~    return unless args.inputs.mouse.click # return unless the mouse is clicked~
 - Inside source: true
 *** True Line Result
-        { ordinal_x: 8,  ordinal_y: 0 },
-** Processing line: ~        { ordinal_x: 9,  ordinal_y: 0 },~
+    return unless args.inputs.mouse.click # return unless the mouse is clicked
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-        { ordinal_x: 9,  ordinal_y: 0 },
-** Processing line: ~        { ordinal_x: 0,  ordinal_y: 1 },~
+
+** Processing line: ~    # finds button that was clicked by user~
 - Inside source: true
 *** True Line Result
-        { ordinal_x: 0,  ordinal_y: 1 },
-** Processing line: ~        { ordinal_x: 1,  ordinal_y: 1 },~
+    # finds button that was clicked by user
+** Processing line: ~    button_clicked = args.outputs.borders.find_all do |b| # go through borders collection to find all borders that meet requirements~
 - Inside source: true
 *** True Line Result
-        { ordinal_x: 1,  ordinal_y: 1 },
-** Processing line: ~        { ordinal_x: 2,  ordinal_y: 1 },~
+    button_clicked = args.outputs.borders.find_all do |b| # go through borders collection to find all borders that meet requirements
+** Processing line: ~      args.inputs.mouse.click.point.inside_rect? b # find button border that mouse was clicked inside of~
 - Inside source: true
 *** True Line Result
-        { ordinal_x: 2,  ordinal_y: 1 },
-** Processing line: ~        { ordinal_x: 3,  ordinal_y: 1 },~
+      args.inputs.mouse.click.point.inside_rect? b # find button border that mouse was clicked inside of
+** Processing line: ~    end.find_all { |b| b.is_a? Hash }.first # reject, return first element~
 - Inside source: true
 *** True Line Result
-        { ordinal_x: 3,  ordinal_y: 1 },
-** Processing line: ~        { ordinal_x: 4,  ordinal_y: 1 },~
+    end.find_all { |b| b.is_a? Hash }.first # reject, return first element
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-        { ordinal_x: 4,  ordinal_y: 1 },
-** Processing line: ~        { ordinal_x: 5,  ordinal_y: 1 },~
+
+** Processing line: ~    return unless button_clicked # return unless button_clicked as a value (a button was clicked)~
 - Inside source: true
 *** True Line Result
-        { ordinal_x: 5,  ordinal_y: 1 },
-** Processing line: ~        { ordinal_x: 6,  ordinal_y: 1 },~
+    return unless button_clicked # return unless button_clicked as a value (a button was clicked)
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-        { ordinal_x: 6,  ordinal_y: 1 },
-** Processing line: ~        { ordinal_x: 7,  ordinal_y: 1 },~
+
+** Processing line: ~    queue_click_feedback args, # calls queue_click_feedback method on the button that was clicked~
 - Inside source: true
 *** True Line Result
-        { ordinal_x: 7,  ordinal_y: 1 },
-** Processing line: ~        { ordinal_x: 8,  ordinal_y: 1 },~
+    queue_click_feedback args, # calls queue_click_feedback method on the button that was clicked
+** Processing line: ~                         button_clicked.x,~
 - Inside source: true
 *** True Line Result
-        { ordinal_x: 8,  ordinal_y: 1 },
-** Processing line: ~        { ordinal_x: 9,  ordinal_y: 1 },~
+                         button_clicked.x,
+** Processing line: ~                         button_clicked.y,~
 - Inside source: true
 *** True Line Result
-        { ordinal_x: 9,  ordinal_y: 1 },
-** Processing line: ~        { ordinal_x: 0,  ordinal_y: 2 },~
+                         button_clicked.y,
+** Processing line: ~                         button_clicked.w,~
 - Inside source: true
 *** True Line Result
-        { ordinal_x: 0,  ordinal_y: 2 },
-** Processing line: ~        { ordinal_x: 1,  ordinal_y: 2 },~
+                         button_clicked.w,
+** Processing line: ~                         button_clicked.h,~
 - Inside source: true
 *** True Line Result
-        { ordinal_x: 1,  ordinal_y: 2 },
-** Processing line: ~        { ordinal_x: 2,  ordinal_y: 2 },~
+                         button_clicked.h,
+** Processing line: ~                         150, 100, 200 # sets color of button to shade of purple~
 - Inside source: true
 *** True Line Result
-        { ordinal_x: 2,  ordinal_y: 2 },
-** Processing line: ~        { ordinal_x: 3,  ordinal_y: 2 },~
+                         150, 100, 200 # sets color of button to shade of purple
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-        { ordinal_x: 3,  ordinal_y: 2 },
-** Processing line: ~        { ordinal_x: 4,  ordinal_y: 2 },~
+
+** Processing line: ~    if button_clicked[:label] == 'play' # if "play note" button is pressed~
 - Inside source: true
 *** True Line Result
-        { ordinal_x: 4,  ordinal_y: 2 },
-** Processing line: ~        { ordinal_x: 5,  ordinal_y: 2 },~
+    if button_clicked[:label] == 'play' # if "play note" button is pressed
+** Processing line: ~      args.outputs.sounds << "sounds/#{args.state.target_note}.wav" # sound of target note is output~
 - Inside source: true
 *** True Line Result
-        { ordinal_x: 5,  ordinal_y: 2 },
-** Processing line: ~        { ordinal_x: 6,  ordinal_y: 2 },~
+      args.outputs.sounds << "sounds/#{args.state.target_note}.wav" # sound of target note is output
+** Processing line: ~    elsif button_clicked[:label] == 'again' # if "play game again" button is pressed~
 - Inside source: true
 *** True Line Result
-        { ordinal_x: 6,  ordinal_y: 2 },
-** Processing line: ~        { ordinal_x: 7,  ordinal_y: 2 },~
+    elsif button_clicked[:label] == 'again' # if "play game again" button is pressed
+** Processing line: ~      args.state.target_note = nil # no target note~
 - Inside source: true
 *** True Line Result
-        { ordinal_x: 7,  ordinal_y: 2 },
-** Processing line: ~        { ordinal_x: 8,  ordinal_y: 2 },~
+      args.state.target_note = nil # no target note
+** Processing line: ~      args.state.current_level = 1 # starts at level 1 again~
 - Inside source: true
 *** True Line Result
-        { ordinal_x: 8,  ordinal_y: 2 },
-** Processing line: ~        { ordinal_x: 9,  ordinal_y: 2 },~
+      args.state.current_level = 1 # starts at level 1 again
+** Processing line: ~      args.state.times_wrong = 0 # starts off with 0 wrong guesses~
 - Inside source: true
 *** True Line Result
-        { ordinal_x: 9,  ordinal_y: 2 },
-** Processing line: ~      ]~
+      args.state.times_wrong = 0 # starts off with 0 wrong guesses
+** Processing line: ~      args.state.game_over = false # the game is not over (because it has just been restarted)~
 - Inside source: true
 *** True Line Result
-      ]
-** Processing line: ~~
+      args.state.game_over = false # the game is not over (because it has just been restarted)
+** Processing line: ~    else # otherwise if neither of those buttons were pressed~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~      # after initializing the oridinal positions, derive the pixel~
+    else # otherwise if neither of those buttons were pressed
+** Processing line: ~      args.outputs.sounds << "sounds/#{button_clicked[:label]}.wav" # sound of clicked note is played~
 - Inside source: true
 *** True Line Result
-      # after initializing the oridinal positions, derive the pixel
-** Processing line: ~      # locations assuming that the width and height are 80~
+      args.outputs.sounds << "sounds/#{button_clicked[:label]}.wav" # sound of clicked note is played
+** Processing line: ~      if button_clicked[:label] == args.state.target_note # if clicked note is target note~
 - Inside source: true
 *** True Line Result
-      # locations assuming that the width and height are 80
-** Processing line: ~      args.state.inventory_area.each { |i| set_inventory_position args, i }~
+      if button_clicked[:label] == args.state.target_note # if clicked note is target note
+** Processing line: ~        args.state.target_note = nil # target note is emptied~
 - Inside source: true
 *** True Line Result
-      args.state.inventory_area.each { |i| set_inventory_position args, i }
+        args.state.target_note = nil # target note is emptied
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~      # if you want to see the result you can use the Ruby function called "puts".~
+** Processing line: ~        if args.state.current_level < 9 # if game hasn't reached level 9~
 - Inside source: true
 *** True Line Result
-      # if you want to see the result you can use the Ruby function called "puts".
-** Processing line: ~      # Uncomment this line to see the value.~
+        if args.state.current_level < 9 # if game hasn't reached level 9
+** Processing line: ~          args.state.current_level += 1 # game goes to next level~
 - Inside source: true
 *** True Line Result
-      # Uncomment this line to see the value.
-** Processing line: ~      # puts args.state.inventory_area~
+          args.state.current_level += 1 # game goes to next level
+** Processing line: ~        else # otherwise, if game has reached level 9~
 - Inside source: true
 *** True Line Result
-      # puts args.state.inventory_area
+        else # otherwise, if game has reached level 9
+** Processing line: ~          args.state.game_over = true # the game is over~
+- Inside source: true
+*** True Line Result
+          args.state.game_over = true # the game is over
+** Processing line: ~        end~
+- Inside source: true
+*** True Line Result
+        end
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~      # You can see all things written via puts in DragonRuby's Console, or under logs/log.txt.~
+** Processing line: ~        queue_click_feedback args, 0, 0, args.grid.w, args.grid.h, 100, 200, 100 # green shown if user guesses correctly~
 - Inside source: true
 *** True Line Result
-      # You can see all things written via puts in DragonRuby's Console, or under logs/log.txt.
-** Processing line: ~      # To bring up DragonRuby's Console, press the ~ key within the game.~
+        queue_click_feedback args, 0, 0, args.grid.w, args.grid.h, 100, 200, 100 # green shown if user guesses correctly
+** Processing line: ~      else # otherwise, if clicked note is not target note~
 - Inside source: true
 *** True Line Result
-      # To bring up DragonRuby's Console, press the ~ key within the game.
+      else # otherwise, if clicked note is not target note
+** Processing line: ~        args.state.times_wrong += 1 # increments times user guessed wrong~
+- Inside source: true
+*** True Line Result
+        args.state.times_wrong += 1 # increments times user guessed wrong
+** Processing line: ~        queue_click_feedback args, 0, 0, args.grid.w, args.grid.h, 200, 100, 100 # red shown is user guesses wrong~
+- Inside source: true
+*** True Line Result
+        queue_click_feedback args, 0, 0, args.grid.w, args.grid.h, 200, 100, 100 # red shown is user guesses wrong
+** Processing line: ~      end~
+- Inside source: true
+*** True Line Result
+      end
 ** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
     end
-** Processing line: ~~
+** Processing line: ~  end~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~    # define all the oridinal positions of the craft slots~
+  end
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-    # define all the oridinal positions of the craft slots
-** Processing line: ~    if !args.state.craft_area~
+
+** Processing line: ~  # Creates a collection of all of the available notes as symbols~
 - Inside source: true
 *** True Line Result
-    if !args.state.craft_area
-** Processing line: ~      args.state.craft_area = [~
+  # Creates a collection of all of the available notes as symbols
+** Processing line: ~  def available_notes~
 - Inside source: true
 *** True Line Result
-      args.state.craft_area = [
-** Processing line: ~        { ordinal_x: 0, ordinal_y: 0 },~
+  def available_notes
+** Processing line: ~    [:C3, :D3, :E3, :F3, :G3, :A3, :B3, :C4]~
 - Inside source: true
 *** True Line Result
-        { ordinal_x: 0, ordinal_y: 0 },
-** Processing line: ~        { ordinal_x: 0, ordinal_y: 1 },~
+    [:C3, :D3, :E3, :F3, :G3, :A3, :B3, :C4]
+** Processing line: ~  end~
 - Inside source: true
 *** True Line Result
-        { ordinal_x: 0, ordinal_y: 1 },
-** Processing line: ~        { ordinal_x: 0, ordinal_y: 2 },~
+  end
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-        { ordinal_x: 0, ordinal_y: 2 },
-** Processing line: ~        { ordinal_x: 1, ordinal_y: 0 },~
+
+** Processing line: ~  # Creates buttons for each note, and sets a label (the note's name) and border for each note's button.~
 - Inside source: true
 *** True Line Result
-        { ordinal_x: 1, ordinal_y: 0 },
-** Processing line: ~        { ordinal_x: 1, ordinal_y: 1 },~
+  # Creates buttons for each note, and sets a label (the note's name) and border for each note's button.
+** Processing line: ~  def piano_button args, note, position~
 - Inside source: true
 *** True Line Result
-        { ordinal_x: 1, ordinal_y: 1 },
-** Processing line: ~        { ordinal_x: 1, ordinal_y: 2 },~
+  def piano_button args, note, position
+** Processing line: ~    args.state.new_entity(:button) do |b| # declares button as new entity~
 - Inside source: true
 *** True Line Result
-        { ordinal_x: 1, ordinal_y: 2 },
-** Processing line: ~        { ordinal_x: 2, ordinal_y: 0 },~
+    args.state.new_entity(:button) do |b| # declares button as new entity
+** Processing line: ~      b.label  =  [460 + 40.mult(position), args.grid.h * 0.4, "#{note}", 0, 1, 0, 0, 0] # label definition~
 - Inside source: true
 *** True Line Result
-        { ordinal_x: 2, ordinal_y: 0 },
-** Processing line: ~        { ordinal_x: 2, ordinal_y: 1 },~
+      b.label  =  [460 + 40.mult(position), args.grid.h * 0.4, "#{note}", 0, 1, 0, 0, 0] # label definition
+** Processing line: ~      b.border =  { x: 460 + 40.mult(position) - 20, y: args.grid.h * 0.4 - 32, w: 40, h: 40, label: note } # border definition, text/title; 20 subtracted so label is in center of border~
 - Inside source: true
 *** True Line Result
-        { ordinal_x: 2, ordinal_y: 1 },
-** Processing line: ~        { ordinal_x: 2, ordinal_y: 2 },~
+      b.border =  { x: 460 + 40.mult(position) - 20, y: args.grid.h * 0.4 - 32, w: 40, h: 40, label: note } # border definition, text/title; 20 subtracted so label is in center of border
+** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
-        { ordinal_x: 2, ordinal_y: 2 },
-** Processing line: ~      ]~
+    end
+** Processing line: ~  end~
 - Inside source: true
 *** True Line Result
-      ]
+  end
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~      # after initializing the oridinal positions, derive the pixel~
+** Processing line: ~  # Color of click feedback changes depending on what button was clicked, and whether the guess is right or wrong~
 - Inside source: true
 *** True Line Result
-      # after initializing the oridinal positions, derive the pixel
-** Processing line: ~      # locations assuming that the width and height are 80~
+  # Color of click feedback changes depending on what button was clicked, and whether the guess is right or wrong
+** Processing line: ~  # If a button is clicked, the inside of button is purple (see input_mouse method)~
 - Inside source: true
 *** True Line Result
-      # locations assuming that the width and height are 80
-** Processing line: ~      args.state.craft_area.each { |c| set_craft_position args, c }~
+  # If a button is clicked, the inside of button is purple (see input_mouse method)
+** Processing line: ~  # If correct note is clicked, screen turns green~
 - Inside source: true
 *** True Line Result
-      args.state.craft_area.each { |c| set_craft_position args, c }
+  # If correct note is clicked, screen turns green
+** Processing line: ~  # If incorrect note is clicked, screen turns red (again, see input_mouse method)~
+- Inside source: true
+*** True Line Result
+  # If incorrect note is clicked, screen turns red (again, see input_mouse method)
+** Processing line: ~  def queue_click_feedback args, x, y, w, h, *color~
+- Inside source: true
+*** True Line Result
+  def queue_click_feedback args, x, y, w, h, *color
+** Processing line: ~    args.state.click_feedbacks << args.state.new_entity(:click_feedback) do |c| # declares feedback as new entity~
+- Inside source: true
+*** True Line Result
+    args.state.click_feedbacks << args.state.new_entity(:click_feedback) do |c| # declares feedback as new entity
+** Processing line: ~      c.solid =  [x, y, w, h, *color, 255] # sets color~
+- Inside source: true
+*** True Line Result
+      c.solid =  [x, y, w, h, *color, 255] # sets color
 ** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
@@ -98719,202 +100219,230 @@ Follows is a source code listing for all files that have been open sourced. This
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~~
+** Processing line: ~  def tick_instructions args, text, y = 715~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~  def render args~
+  def tick_instructions args, text, y = 715
+** Processing line: ~    return if args.state.key_event_occurred~
 - Inside source: true
 *** True Line Result
-  def render args
-** Processing line: ~    # for the results area, create a sprite that show its boundaries~
+    return if args.state.key_event_occurred
+** Processing line: ~    if args.inputs.mouse.click ||~
 - Inside source: true
 *** True Line Result
-    # for the results area, create a sprite that show its boundaries
-** Processing line: ~    args.outputs.primitives << { x: args.state.result_border.x,~
+    if args.inputs.mouse.click ||
+** Processing line: ~       args.inputs.keyboard.directional_vector ||~
 - Inside source: true
 *** True Line Result
-    args.outputs.primitives << { x: args.state.result_border.x,
-** Processing line: ~                                 y: args.state.result_border.y,~
+       args.inputs.keyboard.directional_vector ||
+** Processing line: ~       args.inputs.keyboard.key_down.enter ||~
 - Inside source: true
 *** True Line Result
-                                 y: args.state.result_border.y,
-** Processing line: ~                                 w: args.state.result_border.w,~
+       args.inputs.keyboard.key_down.enter ||
+** Processing line: ~       args.inputs.keyboard.key_down.escape~
 - Inside source: true
 *** True Line Result
-                                 w: args.state.result_border.w,
-** Processing line: ~                                 h: args.state.result_border.h,~
+       args.inputs.keyboard.key_down.escape
+** Processing line: ~      args.state.key_event_occurred = true~
 - Inside source: true
 *** True Line Result
-                                 h: args.state.result_border.h,
-** Processing line: ~                                 path: 'sprites/border-black.png' }~
+      args.state.key_event_occurred = true
+** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
-                                 path: 'sprites/border-black.png' }
+    end
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~    # for each inventory spot, create a sprite~
+** Processing line: ~    args.outputs.debug << [0, y - 50, 1280, 60].solid~
 - Inside source: true
 *** True Line Result
-    # for each inventory spot, create a sprite
-** Processing line: ~    # args.outputs.primitives is how DragonRuby performs a render.~
+    args.outputs.debug << [0, y - 50, 1280, 60].solid
+** Processing line: ~    args.outputs.debug << [640, y, text, 1, 1, 255, 255, 255].label~
 - Inside source: true
 *** True Line Result
-    # args.outputs.primitives is how DragonRuby performs a render.
-** Processing line: ~    # Adding a single hash or multiple hashes to this array will tell~
+    args.outputs.debug << [640, y, text, 1, 1, 255, 255, 255].label
+** Processing line: ~    args.outputs.debug << [640, y - 25, "(click to dismiss instructions)" , -2, 1, 255, 255, 255].label~
 - Inside source: true
 *** True Line Result
-    # Adding a single hash or multiple hashes to this array will tell
-** Processing line: ~    # DragonRuby to render those primitives on that frame.~
+    args.outputs.debug << [640, y - 25, "(click to dismiss instructions)" , -2, 1, 255, 255, 255].label
+** Processing line: ~  end~
 - Inside source: true
 *** True Line Result
-    # DragonRuby to render those primitives on that frame.
+  end
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~    # The .map function on Array is used instead of any kind of looping.~
+** Processing line: ~#+end_src~
+- Line was identified as the end of a code block.
+*** True Line Result
+#+end_src
+** Processing line: ~~
+- End of paragraph detected.
+*** True Line Result
+
+** Processing line: ~*** Arcade - Twinstick - main.rb~
+- Header detected.
+*** True Line Result
+
+*** True Line Result
+*** Arcade - Twinstick - main.rb
+** Processing line: ~#+begin_src ruby~
+- Line was identified as the beginning of a code block.
+*** True Line Result
+
+*** True Line Result
+#+begin_src ruby
+** Processing line: ~  # ./samples/99_genre_arcade/twinstick/app/main.rb~
 - Inside source: true
 *** True Line Result
-    # The .map function on Array is used instead of any kind of looping.
-** Processing line: ~    # .map returns a new object for every object within an Array.~
+  # ./samples/99_genre_arcade/twinstick/app/main.rb
+** Processing line: ~  def tick args~
 - Inside source: true
 *** True Line Result
-    # .map returns a new object for every object within an Array.
-** Processing line: ~    args.outputs.primitives << args.state.inventory_area.map do |a|~
+  def tick args
+** Processing line: ~    args.state.player         ||= {x: 600, y: 320, w: 80, h: 80, path: 'sprites/circle-white.png', vx: 0, vy: 0, health: 10, cooldown: 0, score: 0}~
 - Inside source: true
 *** True Line Result
-    args.outputs.primitives << args.state.inventory_area.map do |a|
-** Processing line: ~      { x: a.x, y: a.y, w: a.w, h: a.h, path: 'sprites/border-black.png' }~
+    args.state.player         ||= {x: 600, y: 320, w: 80, h: 80, path: 'sprites/circle-white.png', vx: 0, vy: 0, health: 10, cooldown: 0, score: 0}
+** Processing line: ~    args.state.enemies        ||= []~
 - Inside source: true
 *** True Line Result
-      { x: a.x, y: a.y, w: a.w, h: a.h, path: 'sprites/border-black.png' }
-** Processing line: ~    end~
+    args.state.enemies        ||= []
+** Processing line: ~    args.state.player_bullets ||= []~
 - Inside source: true
 *** True Line Result
-    end
-** Processing line: ~~
+    args.state.player_bullets ||= []
+** Processing line: ~    args.state.tick_count     ||= -1~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~    # for each craft spot, create a sprite~
+    args.state.tick_count     ||= -1
+** Processing line: ~    args.state.tick_count     += 1~
 - Inside source: true
 *** True Line Result
-    # for each craft spot, create a sprite
-** Processing line: ~    args.outputs.primitives << args.state.craft_area.map do |a|~
+    args.state.tick_count     += 1
+** Processing line: ~    spawn_enemies args~
 - Inside source: true
 *** True Line Result
-    args.outputs.primitives << args.state.craft_area.map do |a|
-** Processing line: ~      { x: a.x, y: a.y, w: a.w, h: a.h, path: 'sprites/border-black.png' }~
+    spawn_enemies args
+** Processing line: ~    kill_enemies args~
 - Inside source: true
 *** True Line Result
-      { x: a.x, y: a.y, w: a.w, h: a.h, path: 'sprites/border-black.png' }
-** Processing line: ~    end~
+    kill_enemies args
+** Processing line: ~    move_enemies args~
 - Inside source: true
 *** True Line Result
-    end
-** Processing line: ~~
+    move_enemies args
+** Processing line: ~    move_bullets args~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~    # after the borders have been rendered, render the~
+    move_bullets args
+** Processing line: ~    move_player args~
 - Inside source: true
 *** True Line Result
-    # after the borders have been rendered, render the
-** Processing line: ~    # items within those slots (and allow for highlighting)~
+    move_player args
+** Processing line: ~    fire_player args~
 - Inside source: true
 *** True Line Result
-    # items within those slots (and allow for highlighting)
-** Processing line: ~    # if an item isn't currently being held~
+    fire_player args
+** Processing line: ~    args.state.player[:r] = args.state.player[:g] = args.state.player[:b] = (args.state.player[:health] * 25.5).clamp(0, 255)~
 - Inside source: true
 *** True Line Result
-    # if an item isn't currently being held
-** Processing line: ~    allow_inventory_highlighting = !args.state.held_item~
+    args.state.player[:r] = args.state.player[:g] = args.state.player[:b] = (args.state.player[:health] * 25.5).clamp(0, 255)
+** Processing line: ~    label_color           = args.state.player[:health] <= 5 ? 255 : 0~
 - Inside source: true
 *** True Line Result
-    allow_inventory_highlighting = !args.state.held_item
-** Processing line: ~~
+    label_color           = args.state.player[:health] <= 5 ? 255 : 0
+** Processing line: ~    args.outputs.labels << [~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~    # go through each item and render them~
+    args.outputs.labels << [
+** Processing line: ~        {~
 - Inside source: true
 *** True Line Result
-    # go through each item and render them
-** Processing line: ~    # use Array's find_all method to remove any items that are currently being held~
+        {
+** Processing line: ~            x: args.state.player.x + 40, y: args.state.player.y + 60, alignment_enum: 1, text: "#{args.state.player[:health]} HP",~
 - Inside source: true
 *** True Line Result
-    # use Array's find_all method to remove any items that are currently being held
-** Processing line: ~    args.state.items.find_all { |item| item[:location] != :held }.map do |item|~
+            x: args.state.player.x + 40, y: args.state.player.y + 60, alignment_enum: 1, text: "#{args.state.player[:health]} HP",
+** Processing line: ~            r: label_color, g: label_color, b: label_color~
 - Inside source: true
 *** True Line Result
-    args.state.items.find_all { |item| item[:location] != :held }.map do |item|
-** Processing line: ~      # if an item is currently being held, don't render it in it's spot within the~
+            r: label_color, g: label_color, b: label_color
+** Processing line: ~        }, {~
 - Inside source: true
 *** True Line Result
-      # if an item is currently being held, don't render it in it's spot within the
-** Processing line: ~      # inventory or craft area (this is handled via the find_all method).~
+        }, {
+** Processing line: ~            x: args.state.player.x + 40, y: args.state.player.y + 40, alignment_enum: 1, text: "#{args.state.player[:score]} PTS",~
 - Inside source: true
 *** True Line Result
-      # inventory or craft area (this is handled via the find_all method).
-** Processing line: ~~
+            x: args.state.player.x + 40, y: args.state.player.y + 40, alignment_enum: 1, text: "#{args.state.player[:score]} PTS",
+** Processing line: ~            r: label_color, g: label_color, b: label_color, size_enum: 2 - args.state.player[:score].to_s.length,~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~      # the item_prefab returns a hash containing all the visual components of an item.~
+            r: label_color, g: label_color, b: label_color, size_enum: 2 - args.state.player[:score].to_s.length,
+** Processing line: ~        }~
 - Inside source: true
 *** True Line Result
-      # the item_prefab returns a hash containing all the visual components of an item.
-** Processing line: ~      # the main sprite, the black background, the quantity text, and a hover indication~
+        }
+** Processing line: ~    ]~
 - Inside source: true
 *** True Line Result
-      # the main sprite, the black background, the quantity text, and a hover indication
-** Processing line: ~      # if the mouse is currently hovering over the item.~
+    ]
+** Processing line: ~    args.outputs.sprites << [args.state.player, args.state.enemies, args.state.player_bullets]~
 - Inside source: true
 *** True Line Result
-      # if the mouse is currently hovering over the item.
-** Processing line: ~      args.outputs.primitives << item_prefab(args, item, allow_inventory_highlighting, args.inputs.mouse)~
+    args.outputs.sprites << [args.state.player, args.state.enemies, args.state.player_bullets]
+** Processing line: ~    args.state.clear! if args.state.player[:health] < 0 # Reset the game if the player's health drops below zero~
 - Inside source: true
 *** True Line Result
-      args.outputs.primitives << item_prefab(args, item, allow_inventory_highlighting, args.inputs.mouse)
-** Processing line: ~    end~
+    args.state.clear! if args.state.player[:health] < 0 # Reset the game if the player's health drops below zero
+** Processing line: ~  end~
 - Inside source: true
 *** True Line Result
-    end
+  end
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~    # The last thing we want to render is the item currently being held.~
+** Processing line: ~  def spawn_enemies args~
 - Inside source: true
 *** True Line Result
-    # The last thing we want to render is the item currently being held.
-** Processing line: ~    args.outputs.primitives << item_prefab(args, args.state.held_item, allow_inventory_highlighting, args.inputs.mouse)~
+  def spawn_enemies args
+** Processing line: ~    # Spawn enemies more frequently as the player's score increases.~
 - Inside source: true
 *** True Line Result
-    args.outputs.primitives << item_prefab(args, args.state.held_item, allow_inventory_highlighting, args.inputs.mouse)
-** Processing line: ~~
+    # Spawn enemies more frequently as the player's score increases.
+** Processing line: ~    if rand < (100+args.state.player[:score])/(10000 + args.state.player[:score]) || args.state.tick_count.zero?~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~    args.outputs.primitives << args.state.click_ripples~
+    if rand < (100+args.state.player[:score])/(10000 + args.state.player[:score]) || args.state.tick_count.zero?
+** Processing line: ~      theta = rand * Math::PI * 2~
 - Inside source: true
 *** True Line Result
-    args.outputs.primitives << args.state.click_ripples
-** Processing line: ~~
+      theta = rand * Math::PI * 2
+** Processing line: ~      args.state.enemies << {~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~    # render a mouse cursor since we have the OS cursor hidden~
+      args.state.enemies << {
+** Processing line: ~          x: 600 + Math.cos(theta) * 800, y: 320 + Math.sin(theta) * 800, w: 80, h: 80, path: 'sprites/circle-white.png',~
 - Inside source: true
 *** True Line Result
-    # render a mouse cursor since we have the OS cursor hidden
-** Processing line: ~    args.outputs.primitives << { x: args.inputs.mouse.x - 5, y: args.inputs.mouse.y - 5, w: 10, h: 10, path: 'sprites/circle-gray.png', a: 128 }~
+          x: 600 + Math.cos(theta) * 800, y: 320 + Math.sin(theta) * 800, w: 80, h: 80, path: 'sprites/circle-white.png',
+** Processing line: ~          r: (256 * rand).floor, g: (256 * rand).floor, b: (256 * rand).floor~
 - Inside source: true
 *** True Line Result
-    args.outputs.primitives << { x: args.inputs.mouse.x - 5, y: args.inputs.mouse.y - 5, w: 10, h: 10, path: 'sprites/circle-gray.png', a: 128 }
+          r: (256 * rand).floor, g: (256 * rand).floor, b: (256 * rand).floor
+** Processing line: ~      }~
+- Inside source: true
+*** True Line Result
+      }
+** Processing line: ~    end~
+- Inside source: true
+*** True Line Result
+    end
 ** Processing line: ~  end~
 - Inside source: true
 *** True Line Result
@@ -98923,554 +100451,586 @@ Follows is a source code listing for all files that have been open sourced. This
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~  # Alrighty! This is where all the fun happens~
+** Processing line: ~  def kill_enemies args~
 - Inside source: true
 *** True Line Result
-  # Alrighty! This is where all the fun happens
-** Processing line: ~  def input args~
+  def kill_enemies args
+** Processing line: ~    args.state.enemies.reject! do |enemy|~
 - Inside source: true
 *** True Line Result
-  def input args
-** Processing line: ~    # if the mouse is clicked and not item is currently being held~
+    args.state.enemies.reject! do |enemy|
+** Processing line: ~      # Check if enemy and player are within 80 pixels of each other (i.e. overlapping)~
 - Inside source: true
 *** True Line Result
-    # if the mouse is clicked and not item is currently being held
-** Processing line: ~    # args.state.held_item is nil when the game starts.~
+      # Check if enemy and player are within 80 pixels of each other (i.e. overlapping)
+** Processing line: ~      if 6400 > (enemy.x - args.state.player.x) ** 2 + (enemy.y - args.state.player.y) ** 2~
 - Inside source: true
 *** True Line Result
-    # args.state.held_item is nil when the game starts.
-** Processing line: ~    # If the player clicks, the property args.inputs.mouse.click will~
+      if 6400 > (enemy.x - args.state.player.x) ** 2 + (enemy.y - args.state.player.y) ** 2
+** Processing line: ~        # Enemy is touching player. Kill enemy, and reduce player HP by 1.~
 - Inside source: true
 *** True Line Result
-    # If the player clicks, the property args.inputs.mouse.click will
-** Processing line: ~    # be a non nil value, we don't want to process any of the code here~
+        # Enemy is touching player. Kill enemy, and reduce player HP by 1.
+** Processing line: ~        args.state.player[:health] -= 1~
 - Inside source: true
 *** True Line Result
-    # be a non nil value, we don't want to process any of the code here
-** Processing line: ~    # if the mouse hasn't been clicked~
+        args.state.player[:health] -= 1
+** Processing line: ~      else~
 - Inside source: true
 *** True Line Result
-    # if the mouse hasn't been clicked
-** Processing line: ~    return if !args.inputs.mouse.click~
+      else
+** Processing line: ~        args.state.player_bullets.any? do |bullet|~
 - Inside source: true
 *** True Line Result
-    return if !args.inputs.mouse.click
-** Processing line: ~~
+        args.state.player_bullets.any? do |bullet|
+** Processing line: ~          # Check if enemy and bullet are within 50 pixels of each other (i.e. overlapping)~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~    # if a click occurred, add a ripple to the ripple queue~
+          # Check if enemy and bullet are within 50 pixels of each other (i.e. overlapping)
+** Processing line: ~          if 2500 > (enemy.x - bullet.x + 30) ** 2 + (enemy.y - bullet.y + 30) ** 2~
 - Inside source: true
 *** True Line Result
-    # if a click occurred, add a ripple to the ripple queue
-** Processing line: ~    args.state.click_ripples << { x: args.inputs.mouse.x - 5, y: args.inputs.mouse.y - 5, w: 10, h: 10, path: 'sprites/circle-gray.png', a: 128 }~
+          if 2500 > (enemy.x - bullet.x + 30) ** 2 + (enemy.y - bullet.y + 30) ** 2
+** Processing line: ~            # Increase player health by one for each enemy killed by a bullet after the first enemy, up to a maximum of 10 HP~
 - Inside source: true
 *** True Line Result
-    args.state.click_ripples << { x: args.inputs.mouse.x - 5, y: args.inputs.mouse.y - 5, w: 10, h: 10, path: 'sprites/circle-gray.png', a: 128 }
-** Processing line: ~~
+            # Increase player health by one for each enemy killed by a bullet after the first enemy, up to a maximum of 10 HP
+** Processing line: ~            args.state.player[:health] += 1 if args.state.player[:health] < 10 && bullet[:kills] > 0~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~    # if the mouse has been clicked, and no item is currently held...~
+            args.state.player[:health] += 1 if args.state.player[:health] < 10 && bullet[:kills] > 0
+** Processing line: ~            # Keep track of how many enemies have been killed by this particular bullet~
 - Inside source: true
 *** True Line Result
-    # if the mouse has been clicked, and no item is currently held...
-** Processing line: ~    if !args.state.held_item~
+            # Keep track of how many enemies have been killed by this particular bullet
+** Processing line: ~            bullet[:kills]             += 1~
 - Inside source: true
 *** True Line Result
-    if !args.state.held_item
-** Processing line: ~      # see if any of the items intersect the pointer using the inside_rect? method~
+            bullet[:kills]             += 1
+** Processing line: ~            # Earn more points by killing multiple enemies with one shot.~
 - Inside source: true
 *** True Line Result
-      # see if any of the items intersect the pointer using the inside_rect? method
-** Processing line: ~      # the find method will either return the first object that returns true~
+            # Earn more points by killing multiple enemies with one shot.
+** Processing line: ~            args.state.player[:score]  += bullet[:kills]~
 - Inside source: true
 *** True Line Result
-      # the find method will either return the first object that returns true
-** Processing line: ~      # for the match clause, or it'll return nil if nothing matches the match clause~
+            args.state.player[:score]  += bullet[:kills]
+** Processing line: ~          end~
 - Inside source: true
 *** True Line Result
-      # for the match clause, or it'll return nil if nothing matches the match clause
-** Processing line: ~      found = args.state.items.find do |item|~
+          end
+** Processing line: ~        end~
 - Inside source: true
 *** True Line Result
-      found = args.state.items.find do |item|
-** Processing line: ~        # for each item in args.state.items, run the following boolean check~
+        end
+** Processing line: ~      end~
 - Inside source: true
 *** True Line Result
-        # for each item in args.state.items, run the following boolean check
-** Processing line: ~        args.inputs.mouse.click.point.inside_rect?(item)~
+      end
+** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
-        args.inputs.mouse.click.point.inside_rect?(item)
-** Processing line: ~      end~
+    end
+** Processing line: ~  end~
 - Inside source: true
 *** True Line Result
-      end
+  end
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~      # if an item intersects the mouse pointer, then set the item's location to :held and~
+** Processing line: ~  def move_enemies args~
 - Inside source: true
 *** True Line Result
-      # if an item intersects the mouse pointer, then set the item's location to :held and
-** Processing line: ~      # set args.state.held_item to the item for later reference~
+  def move_enemies args
+** Processing line: ~    args.state.enemies.each do |enemy|~
 - Inside source: true
 *** True Line Result
-      # set args.state.held_item to the item for later reference
-** Processing line: ~      if found~
+    args.state.enemies.each do |enemy|
+** Processing line: ~      # Get the angle from the enemy to the player~
 - Inside source: true
 *** True Line Result
-      if found
-** Processing line: ~        args.state.held_item = found~
+      # Get the angle from the enemy to the player
+** Processing line: ~      theta   = Math.atan2(enemy.y - args.state.player.y, enemy.x - args.state.player.x)~
 - Inside source: true
 *** True Line Result
-        args.state.held_item = found
-** Processing line: ~        found[:location] = :held~
+      theta   = Math.atan2(enemy.y - args.state.player.y, enemy.x - args.state.player.x)
+** Processing line: ~      # Convert the angle to a vector pointing at the player~
 - Inside source: true
 *** True Line Result
-        found[:location] = :held
-** Processing line: ~      end~
+      # Convert the angle to a vector pointing at the player
+** Processing line: ~      dx, dy  = theta.to_degrees.vector 5~
 - Inside source: true
 *** True Line Result
-      end
-** Processing line: ~~
+      dx, dy  = theta.to_degrees.vector 5
+** Processing line: ~      # Move the enemy towards thr player~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~    # if the mouse is clicked and an item is currently beign held....~
+      # Move the enemy towards thr player
+** Processing line: ~      enemy.x -= dx~
 - Inside source: true
 *** True Line Result
-    # if the mouse is clicked and an item is currently beign held....
-** Processing line: ~    elsif args.state.held_item~
+      enemy.x -= dx
+** Processing line: ~      enemy.y -= dy~
 - Inside source: true
 *** True Line Result
-    elsif args.state.held_item
-** Processing line: ~      # determine if a slot within the craft area was clicked~
+      enemy.y -= dy
+** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
-      # determine if a slot within the craft area was clicked
-** Processing line: ~      craft_area = args.state.craft_area.find { |a| args.inputs.mouse.click.point.inside_rect? a }~
+    end
+** Processing line: ~  end~
 - Inside source: true
 *** True Line Result
-      craft_area = args.state.craft_area.find { |a| args.inputs.mouse.click.point.inside_rect? a }
+  end
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~      # also determine if a slot within the inventory area was clicked~
+** Processing line: ~  def move_bullets args~
 - Inside source: true
 *** True Line Result
-      # also determine if a slot within the inventory area was clicked
-** Processing line: ~      inventory_area = args.state.inventory_area.find { |a| args.inputs.mouse.click.point.inside_rect? a }~
+  def move_bullets args
+** Processing line: ~    args.state.player_bullets.each do |bullet|~
 - Inside source: true
 *** True Line Result
-      inventory_area = args.state.inventory_area.find { |a| args.inputs.mouse.click.point.inside_rect? a }
-** Processing line: ~~
+    args.state.player_bullets.each do |bullet|
+** Processing line: ~      # Move the bullets according to the bullet's velocity~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~      # if the click was within a craft area~
+      # Move the bullets according to the bullet's velocity
+** Processing line: ~      bullet.x += bullet[:vx]~
 - Inside source: true
 *** True Line Result
-      # if the click was within a craft area
-** Processing line: ~      if craft_area~
+      bullet.x += bullet[:vx]
+** Processing line: ~      bullet.y += bullet[:vy]~
 - Inside source: true
 *** True Line Result
-      if craft_area
-** Processing line: ~        # check to see if an item is already there and ignore the click if an item is found~
+      bullet.y += bullet[:vy]
+** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
-        # check to see if an item is already there and ignore the click if an item is found
-** Processing line: ~        # item_at_craft_slot is a helper method that returns an item or nil for a given oridinal~
+    end
+** Processing line: ~    args.state.player_bullets.reject! do |bullet|~
 - Inside source: true
 *** True Line Result
-        # item_at_craft_slot is a helper method that returns an item or nil for a given oridinal
-** Processing line: ~        # position~
+    args.state.player_bullets.reject! do |bullet|
+** Processing line: ~      # Despawn bullets that are outside the screen area~
 - Inside source: true
 *** True Line Result
-        # position
-** Processing line: ~        item_already_there = item_at_craft_slot args, craft_area[:ordinal_x], craft_area[:ordinal_y]~
+      # Despawn bullets that are outside the screen area
+** Processing line: ~      bullet.x < -20 || bullet.y < -20 || bullet.x > 1300 || bullet.y > 740~
 - Inside source: true
 *** True Line Result
-        item_already_there = item_at_craft_slot args, craft_area[:ordinal_x], craft_area[:ordinal_y]
+      bullet.x < -20 || bullet.y < -20 || bullet.x > 1300 || bullet.y > 740
+** Processing line: ~    end~
+- Inside source: true
+*** True Line Result
+    end
+** Processing line: ~  end~
+- Inside source: true
+*** True Line Result
+  end
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~        # if an item *doesn't* exist in the craft area~
+** Processing line: ~  def move_player args~
 - Inside source: true
 *** True Line Result
-        # if an item *doesn't* exist in the craft area
-** Processing line: ~        if !item_already_there~
+  def move_player args
+** Processing line: ~    # Get the currently held direction.~
 - Inside source: true
 *** True Line Result
-        if !item_already_there
-** Processing line: ~          # if the quantity they are currently holding is greater than 1~
+    # Get the currently held direction.
+** Processing line: ~    dx, dy                 = move_directional_vector args~
 - Inside source: true
 *** True Line Result
-          # if the quantity they are currently holding is greater than 1
-** Processing line: ~          if args.state.held_item[:quantity] > 1~
+    dx, dy                 = move_directional_vector args
+** Processing line: ~    # Take the weighted average of the old velocities and the desired velocities.~
 - Inside source: true
 *** True Line Result
-          if args.state.held_item[:quantity] > 1
-** Processing line: ~            # remove one item (creating a seperate item of the same type), and place it~
+    # Take the weighted average of the old velocities and the desired velocities.
+** Processing line: ~    # Since move_directional_vector returns values between -1 and 1,~
 - Inside source: true
 *** True Line Result
-            # remove one item (creating a seperate item of the same type), and place it
-** Processing line: ~            # at the oridinal position and location of the craft area~
+    # Since move_directional_vector returns values between -1 and 1,
+** Processing line: ~    #   and we want to limit the speed to 7.5, we multiply dx and dy by 7.5*0.1 to get 0.75~
 - Inside source: true
 *** True Line Result
-            # at the oridinal position and location of the craft area
-** Processing line: ~            # the .merge method on Hash creates a new Hash, but updates any values~
+    #   and we want to limit the speed to 7.5, we multiply dx and dy by 7.5*0.1 to get 0.75
+** Processing line: ~    args.state.player[:vx] = args.state.player[:vx] * 0.9 + dx * 0.75~
 - Inside source: true
 *** True Line Result
-            # the .merge method on Hash creates a new Hash, but updates any values
-** Processing line: ~            # passed as arguments to merge~
+    args.state.player[:vx] = args.state.player[:vx] * 0.9 + dx * 0.75
+** Processing line: ~    args.state.player[:vy] = args.state.player[:vy] * 0.9 + dy * 0.75~
 - Inside source: true
 *** True Line Result
-            # passed as arguments to merge
-** Processing line: ~            new_item = args.state.held_item.merge(quantity: 1,~
+    args.state.player[:vy] = args.state.player[:vy] * 0.9 + dy * 0.75
+** Processing line: ~    # Move the player~
 - Inside source: true
 *** True Line Result
-            new_item = args.state.held_item.merge(quantity: 1,
-** Processing line: ~                                                  location: :craft,~
+    # Move the player
+** Processing line: ~    args.state.player.x    += args.state.player[:vx]~
 - Inside source: true
 *** True Line Result
-                                                  location: :craft,
-** Processing line: ~                                                  ordinal_x: craft_area[:ordinal_x],~
+    args.state.player.x    += args.state.player[:vx]
+** Processing line: ~    args.state.player.y    += args.state.player[:vy]~
 - Inside source: true
 *** True Line Result
-                                                  ordinal_x: craft_area[:ordinal_x],
-** Processing line: ~                                                  ordinal_y: craft_area[:ordinal_y])~
+    args.state.player.y    += args.state.player[:vy]
+** Processing line: ~    # If the player is about to go out of bounds, put them back in bounds.~
 - Inside source: true
 *** True Line Result
-                                                  ordinal_y: craft_area[:ordinal_y])
-** Processing line: ~~
+    # If the player is about to go out of bounds, put them back in bounds.
+** Processing line: ~    args.state.player.x    = args.state.player.x.clamp(0, 1201)~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~            # after the item is crated, place it into the args.state.items collection~
+    args.state.player.x    = args.state.player.x.clamp(0, 1201)
+** Processing line: ~    args.state.player.y    = args.state.player.y.clamp(0, 640)~
 - Inside source: true
 *** True Line Result
-            # after the item is crated, place it into the args.state.items collection
-** Processing line: ~            args.state.items << new_item~
+    args.state.player.y    = args.state.player.y.clamp(0, 640)
+** Processing line: ~  end~
 - Inside source: true
 *** True Line Result
-            args.state.items << new_item
+  end
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~            # then subtract one from the held item~
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-            # then subtract one from the held item
-** Processing line: ~            args.state.held_item[:quantity] -= 1~
+
+** Processing line: ~  def fire_player args~
 - Inside source: true
 *** True Line Result
-            args.state.held_item[:quantity] -= 1
-** Processing line: ~~
+  def fire_player args
+** Processing line: ~    # Reduce the firing cooldown each tick~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~          # if the craft area is available and there is only one item being held~
+    # Reduce the firing cooldown each tick
+** Processing line: ~    args.state.player[:cooldown] -= 1~
 - Inside source: true
 *** True Line Result
-          # if the craft area is available and there is only one item being held
-** Processing line: ~          elsif args.state.held_item[:quantity] == 1~
+    args.state.player[:cooldown] -= 1
+** Processing line: ~    # If the player is allowed to fire~
 - Inside source: true
 *** True Line Result
-          elsif args.state.held_item[:quantity] == 1
-** Processing line: ~            # instead of creating any new items just set the location of the held item~
+    # If the player is allowed to fire
+** Processing line: ~    if args.state.player[:cooldown] <= 0~
 - Inside source: true
 *** True Line Result
-            # instead of creating any new items just set the location of the held item
-** Processing line: ~            # to the oridinal position of the craft area, and then nil out the~
+    if args.state.player[:cooldown] <= 0
+** Processing line: ~      dx, dy = shoot_directional_vector args # Get the bullet velocity~
 - Inside source: true
 *** True Line Result
-            # to the oridinal position of the craft area, and then nil out the
-** Processing line: ~            # held item state so that a new item can be picked up~
+      dx, dy = shoot_directional_vector args # Get the bullet velocity
+** Processing line: ~      return if dx == 0 && dy == 0 # If the velocity is zero, the player doesn't want to fire. Therefore, we just return early.~
 - Inside source: true
 *** True Line Result
-            # held item state so that a new item can be picked up
-** Processing line: ~            args.state.held_item[:location] = :craft~
+      return if dx == 0 && dy == 0 # If the velocity is zero, the player doesn't want to fire. Therefore, we just return early.
+** Processing line: ~      # Add a new bullet to the list of player bullets.~
 - Inside source: true
 *** True Line Result
-            args.state.held_item[:location] = :craft
-** Processing line: ~            args.state.held_item[:ordinal_x] = craft_area[:ordinal_x]~
+      # Add a new bullet to the list of player bullets.
+** Processing line: ~      args.state.player_bullets << {~
 - Inside source: true
 *** True Line Result
-            args.state.held_item[:ordinal_x] = craft_area[:ordinal_x]
-** Processing line: ~            args.state.held_item[:ordinal_y] = craft_area[:ordinal_y]~
+      args.state.player_bullets << {
+** Processing line: ~          x:     args.state.player.x + 30 + 40 * dx,~
 - Inside source: true
 *** True Line Result
-            args.state.held_item[:ordinal_y] = craft_area[:ordinal_y]
-** Processing line: ~            args.state.held_item = nil~
+          x:     args.state.player.x + 30 + 40 * dx,
+** Processing line: ~          y:     args.state.player.y + 30 + 40 * dy,~
 - Inside source: true
 *** True Line Result
-            args.state.held_item = nil
-** Processing line: ~          end~
+          y:     args.state.player.y + 30 + 40 * dy,
+** Processing line: ~          w:     20, h: 20,~
 - Inside source: true
 *** True Line Result
-          end
-** Processing line: ~        end~
+          w:     20, h: 20,
+** Processing line: ~          path:  'sprites/circle-white.png',~
 - Inside source: true
 *** True Line Result
-        end
-** Processing line: ~~
+          path:  'sprites/circle-white.png',
+** Processing line: ~          r:     0, g: 0, b: 0,~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~      # if the selected area is an inventory area (as opposed to within the craft area)~
+          r:     0, g: 0, b: 0,
+** Processing line: ~          vx:    10 * dx + args.state.player[:vx] / 7.5, vy: 10 * dy + args.state.player[:vy] / 7.5, # Factor in a bit of the player's velocity~
 - Inside source: true
 *** True Line Result
-      # if the selected area is an inventory area (as opposed to within the craft area)
-** Processing line: ~      elsif inventory_area~
+          vx:    10 * dx + args.state.player[:vx] / 7.5, vy: 10 * dy + args.state.player[:vy] / 7.5, # Factor in a bit of the player's velocity
+** Processing line: ~          kills: 0~
 - Inside source: true
 *** True Line Result
-      elsif inventory_area
-** Processing line: ~~
+          kills: 0
+** Processing line: ~      }~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~        # check to see if there is already an item in that inventory slot~
+      }
+** Processing line: ~      args.state.player[:cooldown] = 30 # Reset the cooldown~
 - Inside source: true
 *** True Line Result
-        # check to see if there is already an item in that inventory slot
-** Processing line: ~        # the item_at_inventory_slot helper method returns an item or nil~
+      args.state.player[:cooldown] = 30 # Reset the cooldown
+** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
-        # the item_at_inventory_slot helper method returns an item or nil
-** Processing line: ~        item_already_there = item_at_inventory_slot args, inventory_area[:ordinal_x], inventory_area[:ordinal_y]~
+    end
+** Processing line: ~  end~
 - Inside source: true
 *** True Line Result
-        item_already_there = item_at_inventory_slot args, inventory_area[:ordinal_x], inventory_area[:ordinal_y]
+  end
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~        # if there is already an item there, and the item types/id match~
+** Processing line: ~  # Custom function for getting a directional vector just for movement using WASD~
 - Inside source: true
 *** True Line Result
-        # if there is already an item there, and the item types/id match
-** Processing line: ~        if item_already_there && item_already_there[:id] == args.state.held_item[:id]~
+  # Custom function for getting a directional vector just for movement using WASD
+** Processing line: ~  def move_directional_vector args~
 - Inside source: true
 *** True Line Result
-        if item_already_there && item_already_there[:id] == args.state.held_item[:id]
-** Processing line: ~          # then merge the item quantities~
+  def move_directional_vector args
+** Processing line: ~    dx = 0~
 - Inside source: true
 *** True Line Result
-          # then merge the item quantities
-** Processing line: ~          held_quantity = args.state.held_item[:quantity]~
+    dx = 0
+** Processing line: ~    dx += 1 if args.inputs.keyboard.d~
 - Inside source: true
 *** True Line Result
-          held_quantity = args.state.held_item[:quantity]
-** Processing line: ~          item_already_there[:quantity] += held_quantity~
+    dx += 1 if args.inputs.keyboard.d
+** Processing line: ~    dx -= 1 if args.inputs.keyboard.a~
 - Inside source: true
 *** True Line Result
-          item_already_there[:quantity] += held_quantity
-** Processing line: ~~
+    dx -= 1 if args.inputs.keyboard.a
+** Processing line: ~    dy = 0~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~          # remove the item being held from the items collection (since it's quantity is now 0)~
+    dy = 0
+** Processing line: ~    dy += 1 if args.inputs.keyboard.w~
 - Inside source: true
 *** True Line Result
-          # remove the item being held from the items collection (since it's quantity is now 0)
-** Processing line: ~          args.state.items.reject! { |i| i[:location] == :held }~
+    dy += 1 if args.inputs.keyboard.w
+** Processing line: ~    dy -= 1 if args.inputs.keyboard.s~
 - Inside source: true
 *** True Line Result
-          args.state.items.reject! { |i| i[:location] == :held }
-** Processing line: ~~
+    dy -= 1 if args.inputs.keyboard.s
+** Processing line: ~    if dx != 0 && dy != 0~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~          # nil out the held_item so a new item can be picked up~
+    if dx != 0 && dy != 0
+** Processing line: ~      dx *= 0.7071~
 - Inside source: true
 *** True Line Result
-          # nil out the held_item so a new item can be picked up
-** Processing line: ~          args.state.held_item = nil~
+      dx *= 0.7071
+** Processing line: ~      dy *= 0.7071~
 - Inside source: true
 *** True Line Result
-          args.state.held_item = nil
+      dy *= 0.7071
+** Processing line: ~    end~
+- Inside source: true
+*** True Line Result
+    end
+** Processing line: ~    [dx, dy]~
+- Inside source: true
+*** True Line Result
+    [dx, dy]
+** Processing line: ~  end~
+- Inside source: true
+*** True Line Result
+  end
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~        # if there currently isn't an item there, then put the held item in the slot~
+** Processing line: ~  # Custom function for getting a directional vector just for shooting using the arrow keys~
 - Inside source: true
 *** True Line Result
-        # if there currently isn't an item there, then put the held item in the slot
-** Processing line: ~        elsif !item_already_there~
+  # Custom function for getting a directional vector just for shooting using the arrow keys
+** Processing line: ~  def shoot_directional_vector args~
 - Inside source: true
 *** True Line Result
-        elsif !item_already_there
-** Processing line: ~          args.state.held_item[:location] = :inventory~
+  def shoot_directional_vector args
+** Processing line: ~    dx = 0~
 - Inside source: true
 *** True Line Result
-          args.state.held_item[:location] = :inventory
-** Processing line: ~          args.state.held_item[:ordinal_x] = inventory_area[:ordinal_x]~
+    dx = 0
+** Processing line: ~    dx += 1 if args.inputs.keyboard.key_down.right || args.inputs.keyboard.key_held.right~
 - Inside source: true
 *** True Line Result
-          args.state.held_item[:ordinal_x] = inventory_area[:ordinal_x]
-** Processing line: ~          args.state.held_item[:ordinal_y] = inventory_area[:ordinal_y]~
+    dx += 1 if args.inputs.keyboard.key_down.right || args.inputs.keyboard.key_held.right
+** Processing line: ~    dx -= 1 if args.inputs.keyboard.key_down.left || args.inputs.keyboard.key_held.left~
 - Inside source: true
 *** True Line Result
-          args.state.held_item[:ordinal_y] = inventory_area[:ordinal_y]
-** Processing line: ~~
+    dx -= 1 if args.inputs.keyboard.key_down.left || args.inputs.keyboard.key_held.left
+** Processing line: ~    dy = 0~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~          # nil out the held_item so a new item can be picked up~
+    dy = 0
+** Processing line: ~    dy += 1 if args.inputs.keyboard.key_down.up || args.inputs.keyboard.key_held.up~
 - Inside source: true
 *** True Line Result
-          # nil out the held_item so a new item can be picked up
-** Processing line: ~          args.state.held_item = nil~
+    dy += 1 if args.inputs.keyboard.key_down.up || args.inputs.keyboard.key_held.up
+** Processing line: ~    dy -= 1 if args.inputs.keyboard.key_down.down || args.inputs.keyboard.key_held.down~
 - Inside source: true
 *** True Line Result
-          args.state.held_item = nil
-** Processing line: ~        end~
+    dy -= 1 if args.inputs.keyboard.key_down.down || args.inputs.keyboard.key_held.down
+** Processing line: ~    if dx != 0 && dy != 0~
 - Inside source: true
 *** True Line Result
-        end
-** Processing line: ~      end~
+    if dx != 0 && dy != 0
+** Processing line: ~      dx *= 0.7071~
 - Inside source: true
 *** True Line Result
-      end
+      dx *= 0.7071
+** Processing line: ~      dy *= 0.7071~
+- Inside source: true
+*** True Line Result
+      dy *= 0.7071
 ** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
     end
+** Processing line: ~    [dx, dy]~
+- Inside source: true
+*** True Line Result
+    [dx, dy]
 ** Processing line: ~  end~
 - Inside source: true
 *** True Line Result
   end
+** Processing line: ~#+end_src~
+- Line was identified as the end of a code block.
+*** True Line Result
+#+end_src
 ** Processing line: ~~
-- Inside source: true
+- End of paragraph detected.
 *** True Line Result
 
-** Processing line: ~  # the calc method is executed after input~
-- Inside source: true
+** Processing line: ~*** Crafting - Craft Game Starting Point - main.rb~
+- Header detected.
 *** True Line Result
-  # the calc method is executed after input
-** Processing line: ~  def calc args~
-- Inside source: true
+
 *** True Line Result
-  def calc args
-** Processing line: ~    # make sure that the real position of the inventory~
-- Inside source: true
+*** Crafting - Craft Game Starting Point - main.rb
+** Processing line: ~#+begin_src ruby~
+- Line was identified as the beginning of a code block.
 *** True Line Result
-    # make sure that the real position of the inventory
-** Processing line: ~    # items are updated every frame to ensure that they~
+
+*** True Line Result
+#+begin_src ruby
+** Processing line: ~  # ./samples/99_genre_crafting/craft_game_starting_point/app/main.rb~
 - Inside source: true
 *** True Line Result
-    # items are updated every frame to ensure that they
-** Processing line: ~    # are placed correctly given their location and oridinal positions~
+  # ./samples/99_genre_crafting/craft_game_starting_point/app/main.rb
+** Processing line: ~  # ==================================================~
 - Inside source: true
 *** True Line Result
-    # are placed correctly given their location and oridinal positions
-** Processing line: ~    # instead of using .map, here we use .each (since we are not returning a new item and just updating the items in place)~
+  # ==================================================
+** Processing line: ~  # A NOTE TO JAM CRAFT PARTICIPANTS:~
 - Inside source: true
 *** True Line Result
-    # instead of using .map, here we use .each (since we are not returning a new item and just updating the items in place)
-** Processing line: ~    args.state.items.each do |item|~
+  # A NOTE TO JAM CRAFT PARTICIPANTS:
+** Processing line: ~  # The comments and code in here are just as small piece of DragonRuby's capabilities.~
 - Inside source: true
 *** True Line Result
-    args.state.items.each do |item|
-** Processing line: ~      # based on the location of the item, invoke the correct pixel conversion method~
+  # The comments and code in here are just as small piece of DragonRuby's capabilities.
+** Processing line: ~  # Be sure to check out the rest of the sample apps. Start with README.txt and go from there!~
 - Inside source: true
 *** True Line Result
-      # based on the location of the item, invoke the correct pixel conversion method
-** Processing line: ~      if item[:location] == :inventory~
+  # Be sure to check out the rest of the sample apps. Start with README.txt and go from there!
+** Processing line: ~  # ==================================================~
 - Inside source: true
 *** True Line Result
-      if item[:location] == :inventory
-** Processing line: ~        set_inventory_position args, item~
+  # ==================================================
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-        set_inventory_position args, item
-** Processing line: ~      elsif item[:location] == :craft~
+
+** Processing line: ~  # def tick args is the entry point into your game. This function is called at~
 - Inside source: true
 *** True Line Result
-      elsif item[:location] == :craft
-** Processing line: ~        set_craft_position args, item~
+  # def tick args is the entry point into your game. This function is called at
+** Processing line: ~  # a fixed update time of 60hz (60 fps).~
 - Inside source: true
 *** True Line Result
-        set_craft_position args, item
-** Processing line: ~      elsif item[:location] == :held~
+  # a fixed update time of 60hz (60 fps).
+** Processing line: ~  def tick args~
 - Inside source: true
 *** True Line Result
-      elsif item[:location] == :held
-** Processing line: ~        # if the item is held, center the item around the mouse pointer~
+  def tick args
+** Processing line: ~    # The defaults function intitializes the game.~
 - Inside source: true
 *** True Line Result
-        # if the item is held, center the item around the mouse pointer
-** Processing line: ~        args.state.held_item.x = args.inputs.mouse.x - args.state.held_item.w.half~
+    # The defaults function intitializes the game.
+** Processing line: ~    defaults args~
 - Inside source: true
 *** True Line Result
-        args.state.held_item.x = args.inputs.mouse.x - args.state.held_item.w.half
-** Processing line: ~        args.state.held_item.y = args.inputs.mouse.y - args.state.held_item.h.half~
+    defaults args
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-        args.state.held_item.y = args.inputs.mouse.y - args.state.held_item.h.half
-** Processing line: ~      end~
+
+** Processing line: ~    # After the game is initialized, render it.~
 - Inside source: true
 *** True Line Result
-      end
-** Processing line: ~    end~
+    # After the game is initialized, render it.
+** Processing line: ~    render args~
 - Inside source: true
 *** True Line Result
-    end
+    render args
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~    # for each hash/sprite in the click ripples queue,~
+** Processing line: ~    # After rendering the player should be able to respond to input.~
 - Inside source: true
 *** True Line Result
-    # for each hash/sprite in the click ripples queue,
-** Processing line: ~    # expand its size by 20 percent and decrease its alpha~
+    # After rendering the player should be able to respond to input.
+** Processing line: ~    input args~
 - Inside source: true
 *** True Line Result
-    # expand its size by 20 percent and decrease its alpha
-** Processing line: ~    # by 10.~
+    input args
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-    # by 10.
-** Processing line: ~    args.state.click_ripples.each do |ripple|~
+
+** Processing line: ~    # After responding to input, the game performs any additional calculations.~
 - Inside source: true
 *** True Line Result
-    args.state.click_ripples.each do |ripple|
-** Processing line: ~      delta_w = ripple.w * 1.2 - ripple.w~
+    # After responding to input, the game performs any additional calculations.
+** Processing line: ~    calc args~
 - Inside source: true
 *** True Line Result
-      delta_w = ripple.w * 1.2 - ripple.w
-** Processing line: ~      delta_h = ripple.h * 1.2 - ripple.h~
+    calc args
+** Processing line: ~  end~
 - Inside source: true
 *** True Line Result
-      delta_h = ripple.h * 1.2 - ripple.h
-** Processing line: ~      ripple.x -= delta_w.half~
+  end
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-      ripple.x -= delta_w.half
-** Processing line: ~      ripple.y -= delta_h.half~
+
+** Processing line: ~  def defaults args~
 - Inside source: true
 *** True Line Result
-      ripple.y -= delta_h.half
-** Processing line: ~      ripple.w += delta_w~
+  def defaults args
+** Processing line: ~    # hide the mouse cursor for this game, we are going to render our own cursor~
 - Inside source: true
 *** True Line Result
-      ripple.w += delta_w
-** Processing line: ~      ripple.h += delta_h~
+    # hide the mouse cursor for this game, we are going to render our own cursor
+** Processing line: ~    if args.state.tick_count == 0~
 - Inside source: true
 *** True Line Result
-      ripple.h += delta_h
-** Processing line: ~      ripple.a -= 10~
+    if args.state.tick_count == 0
+** Processing line: ~      args.gtk.hide_cursor~
 - Inside source: true
 *** True Line Result
-      ripple.a -= 10
+      args.gtk.hide_cursor
 ** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
@@ -99479,570 +101039,546 @@ Follows is a source code listing for all files that have been open sourced. This
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~    # remove any items from the collection where the alpha value is less than equal to~
-- Inside source: true
-*** True Line Result
-    # remove any items from the collection where the alpha value is less than equal to
-** Processing line: ~    # zero using the reject! method (reject with an exclamation point at the end changes the~
+** Processing line: ~    args.state.click_ripples ||= []~
 - Inside source: true
 *** True Line Result
-    # zero using the reject! method (reject with an exclamation point at the end changes the
-** Processing line: ~    # array value in place, while reject without the exclamation point returns a new array).~
+    args.state.click_ripples ||= []
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-    # array value in place, while reject without the exclamation point returns a new array).
-** Processing line: ~    args.state.click_ripples.reject! { |ripple| ripple.a <= 0 }~
+
+** Processing line: ~    # everything is on a 1280x720 virtual canvas, so you can~
 - Inside source: true
 *** True Line Result
-    args.state.click_ripples.reject! { |ripple| ripple.a <= 0 }
-** Processing line: ~  end~
+    # everything is on a 1280x720 virtual canvas, so you can
+** Processing line: ~    # hardcode locations~
 - Inside source: true
 *** True Line Result
-  end
+    # hardcode locations
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~  # helper function for finding an item at a craft slot~
-- Inside source: true
-*** True Line Result
-  # helper function for finding an item at a craft slot
-** Processing line: ~  def item_at_craft_slot args, ordinal_x, ordinal_y~
+** Processing line: ~    # define the borders for where the inventory is located~
 - Inside source: true
 *** True Line Result
-  def item_at_craft_slot args, ordinal_x, ordinal_y
-** Processing line: ~    args.state.items.find { |i| i[:location] == :craft && i[:ordinal_x] == ordinal_x && i[:ordinal_y] == ordinal_y }~
+    # define the borders for where the inventory is located
+** Processing line: ~    # args.state is a data structure that accepts any arbitrary parameters~
 - Inside source: true
 *** True Line Result
-    args.state.items.find { |i| i[:location] == :craft && i[:ordinal_x] == ordinal_x && i[:ordinal_y] == ordinal_y }
-** Processing line: ~  end~
+    # args.state is a data structure that accepts any arbitrary parameters
+** Processing line: ~    # so you can create an object graph without having to create any classes.~
 - Inside source: true
 *** True Line Result
-  end
+    # so you can create an object graph without having to create any classes.
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~  # helper function for finding an item at an inventory slot~
+** Processing line: ~    # Bottom left is 0, 0. Top right is 1280, 720.~
 - Inside source: true
 *** True Line Result
-  # helper function for finding an item at an inventory slot
-** Processing line: ~  def item_at_inventory_slot args, ordinal_x, ordinal_y~
+    # Bottom left is 0, 0. Top right is 1280, 720.
+** Processing line: ~    # The inventory area is at the top of the screen~
 - Inside source: true
 *** True Line Result
-  def item_at_inventory_slot args, ordinal_x, ordinal_y
-** Processing line: ~    args.state.items.find { |i| i[:location] == :inventory && i[:ordinal_x] == ordinal_x && i[:ordinal_y] == ordinal_y }~
+    # The inventory area is at the top of the screen
+** Processing line: ~    # the number 80 is the size of all the sprites, so that is what is being~
 - Inside source: true
 *** True Line Result
-    args.state.items.find { |i| i[:location] == :inventory && i[:ordinal_x] == ordinal_x && i[:ordinal_y] == ordinal_y }
-** Processing line: ~  end~
+    # the number 80 is the size of all the sprites, so that is what is being
+** Processing line: ~    # used to decide the with and height~
 - Inside source: true
 *** True Line Result
-  end
-** Processing line: ~~
+    # used to decide the with and height
+** Processing line: ~    args.state.sprite_size = 80~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~  # helper function that creates a visual representation of an item~
+    args.state.sprite_size = 80
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-  # helper function that creates a visual representation of an item
-** Processing line: ~  def item_prefab args, item, should_highlight, mouse~
+
+** Processing line: ~    args.state.inventory_border.w  = args.state.sprite_size * 10~
 - Inside source: true
 *** True Line Result
-  def item_prefab args, item, should_highlight, mouse
-** Processing line: ~    return nil unless item~
+    args.state.inventory_border.w  = args.state.sprite_size * 10
+** Processing line: ~    args.state.inventory_border.h  = args.state.sprite_size * 3~
 - Inside source: true
 *** True Line Result
-    return nil unless item
-** Processing line: ~~
+    args.state.inventory_border.h  = args.state.sprite_size * 3
+** Processing line: ~    args.state.inventory_border.x  = 10~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~    overlay = nil~
+    args.state.inventory_border.x  = 10
+** Processing line: ~    args.state.inventory_border.y  = 710 - args.state.inventory_border.h~
 - Inside source: true
 *** True Line Result
-    overlay = nil
+    args.state.inventory_border.y  = 710 - args.state.inventory_border.h
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~    x = item.x~
+** Processing line: ~    # define the borders for where the crafting area is located~
 - Inside source: true
 *** True Line Result
-    x = item.x
-** Processing line: ~    y = item.y~
+    # define the borders for where the crafting area is located
+** Processing line: ~    # the crafting area is below the inventory area~
 - Inside source: true
 *** True Line Result
-    y = item.y
-** Processing line: ~    w = item.w~
+    # the crafting area is below the inventory area
+** Processing line: ~    # the number 80 is the size of all the sprites, so that is what is being~
 - Inside source: true
 *** True Line Result
-    w = item.w
-** Processing line: ~    h = item.h~
+    # the number 80 is the size of all the sprites, so that is what is being
+** Processing line: ~    # used to decide the with and height~
 - Inside source: true
 *** True Line Result
-    h = item.h
-** Processing line: ~~
+    # used to decide the with and height
+** Processing line: ~    args.state.craft_border.x =  10~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~    if should_highlight && mouse.point.inside_rect?(item)~
+    args.state.craft_border.x =  10
+** Processing line: ~    args.state.craft_border.y = 220~
 - Inside source: true
 *** True Line Result
-    if should_highlight && mouse.point.inside_rect?(item)
-** Processing line: ~      overlay = { x: x, y: y, w: w, h: h, path: "sprites/square-blue.png", a: 130, }~
+    args.state.craft_border.y = 220
+** Processing line: ~    args.state.craft_border.w = args.state.sprite_size * 3~
 - Inside source: true
 *** True Line Result
-      overlay = { x: x, y: y, w: w, h: h, path: "sprites/square-blue.png", a: 130, }
-** Processing line: ~    end~
+    args.state.craft_border.w = args.state.sprite_size * 3
+** Processing line: ~    args.state.craft_border.h = args.state.sprite_size * 3~
 - Inside source: true
 *** True Line Result
-    end
+    args.state.craft_border.h = args.state.sprite_size * 3
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~    [~
-- Inside source: true
-*** True Line Result
-    [
-** Processing line: ~      # sprites are hashes with a path property, this is the main sprite~
+** Processing line: ~    # define the area where results are located~
 - Inside source: true
 *** True Line Result
-      # sprites are hashes with a path property, this is the main sprite
-** Processing line: ~      { x: x,      y: y, w: args.state.sprite_size, h: args.state.sprite_size, path: item[:path], },~
+    # define the area where results are located
+** Processing line: ~    # the crafting result is to the right of the craft area~
 - Inside source: true
 *** True Line Result
-      { x: x,      y: y, w: args.state.sprite_size, h: args.state.sprite_size, path: item[:path], },
-** Processing line: ~~
+    # the crafting result is to the right of the craft area
+** Processing line: ~    args.state.result_border.x =  10 + args.state.sprite_size * 3 + args.state.sprite_size~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~      # this represents the black area in the bottom right corner of the main sprite so that the~
+    args.state.result_border.x =  10 + args.state.sprite_size * 3 + args.state.sprite_size
+** Processing line: ~    args.state.result_border.y = 220 + args.state.sprite_size~
 - Inside source: true
 *** True Line Result
-      # this represents the black area in the bottom right corner of the main sprite so that the
-** Processing line: ~      # quantity is visible~
+    args.state.result_border.y = 220 + args.state.sprite_size
+** Processing line: ~    args.state.result_border.w = args.state.sprite_size~
 - Inside source: true
 *** True Line Result
-      # quantity is visible
-** Processing line: ~      { x: x + 55, y: y, w: 25, h: 25, path: "sprites/square-black.png", }, # sprites are hashes with a path property~
+    args.state.result_border.w = args.state.sprite_size
+** Processing line: ~    args.state.result_border.h = args.state.sprite_size~
 - Inside source: true
 *** True Line Result
-      { x: x + 55, y: y, w: 25, h: 25, path: "sprites/square-black.png", }, # sprites are hashes with a path property
+    args.state.result_border.h = args.state.sprite_size
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~      # labels are hashes with a text property~
+** Processing line: ~    # initialize items for the first time if they are nil~
 - Inside source: true
 *** True Line Result
-      # labels are hashes with a text property
-** Processing line: ~      { x: x + 56, y: y + 22, text: "#{item[:quantity]}", r: 255, g: 255, b: 255, },~
+    # initialize items for the first time if they are nil
+** Processing line: ~    # you start with 15 wood, 1 chest, and 5 plank~
 - Inside source: true
 *** True Line Result
-      { x: x + 56, y: y + 22, text: "#{item[:quantity]}", r: 255, g: 255, b: 255, },
-** Processing line: ~~
+    # you start with 15 wood, 1 chest, and 5 plank
+** Processing line: ~    # Ruby has built in syntax for dictionaries (they look a lot like json objects).~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~      # this is the mouse overlay, if the overlay isn't applicable, then this value will be nil (nil values will not be rendered)~
+    # Ruby has built in syntax for dictionaries (they look a lot like json objects).
+** Processing line: ~    # Ruby also has a special type called a Symbol denoted with a : followed by a word.~
 - Inside source: true
 *** True Line Result
-      # this is the mouse overlay, if the overlay isn't applicable, then this value will be nil (nil values will not be rendered)
-** Processing line: ~      overlay~
+    # Ruby also has a special type called a Symbol denoted with a : followed by a word.
+** Processing line: ~    # Symbols are nice because they remove the need for magic strings.~
 - Inside source: true
 *** True Line Result
-      overlay
-** Processing line: ~    ]~
+    # Symbols are nice because they remove the need for magic strings.
+** Processing line: ~    if !args.state.items~
 - Inside source: true
 *** True Line Result
-    ]
-** Processing line: ~  end~
+    if !args.state.items
+** Processing line: ~      args.state.items = [~
 - Inside source: true
 *** True Line Result
-  end
-** Processing line: ~~
+      args.state.items = [
+** Processing line: ~        {~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~  # helper function for deriving the position of an item within inventory~
+        {
+** Processing line: ~          id: :wood, # :wood is a Symbol, this is better than using "wood" for the id~
 - Inside source: true
 *** True Line Result
-  # helper function for deriving the position of an item within inventory
-** Processing line: ~  def set_inventory_position args, item~
+          id: :wood, # :wood is a Symbol, this is better than using "wood" for the id
+** Processing line: ~          quantity: 15,~
 - Inside source: true
 *** True Line Result
-  def set_inventory_position args, item
-** Processing line: ~    item.x = args.state.inventory_border.x + item[:ordinal_x] * 80~
+          quantity: 15,
+** Processing line: ~          path: 'sprites/wood.png',~
 - Inside source: true
 *** True Line Result
-    item.x = args.state.inventory_border.x + item[:ordinal_x] * 80
-** Processing line: ~    item.y = (args.state.inventory_border.y + args.state.inventory_border.h - 80) - item[:ordinal_y] * 80~
+          path: 'sprites/wood.png',
+** Processing line: ~          location: :inventory,~
 - Inside source: true
 *** True Line Result
-    item.y = (args.state.inventory_border.y + args.state.inventory_border.h - 80) - item[:ordinal_y] * 80
-** Processing line: ~    item.w = 80~
+          location: :inventory,
+** Processing line: ~          ordinal_x: 0, ordinal_y: 0~
 - Inside source: true
 *** True Line Result
-    item.w = 80
-** Processing line: ~    item.h = 80~
+          ordinal_x: 0, ordinal_y: 0
+** Processing line: ~        },~
 - Inside source: true
 *** True Line Result
-    item.h = 80
-** Processing line: ~  end~
+        },
+** Processing line: ~        {~
 - Inside source: true
 *** True Line Result
-  end
-** Processing line: ~~
+        {
+** Processing line: ~          id: :chest,~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~  # helper function for deriving the position of an item within the craft area~
+          id: :chest,
+** Processing line: ~          quantity: 1,~
 - Inside source: true
 *** True Line Result
-  # helper function for deriving the position of an item within the craft area
-** Processing line: ~  def set_craft_position args, item~
+          quantity: 1,
+** Processing line: ~          path: 'sprites/chest.png',~
 - Inside source: true
 *** True Line Result
-  def set_craft_position args, item
-** Processing line: ~    item.x = args.state.craft_border.x + item[:ordinal_x] * 80~
+          path: 'sprites/chest.png',
+** Processing line: ~          location: :inventory,~
 - Inside source: true
 *** True Line Result
-    item.x = args.state.craft_border.x + item[:ordinal_x] * 80
-** Processing line: ~    item.y = (args.state.craft_border.y + args.state.inventory_border.h - 80) - item[:ordinal_y] * 80~
+          location: :inventory,
+** Processing line: ~          ordinal_x: 1, ordinal_y: 0~
 - Inside source: true
 *** True Line Result
-    item.y = (args.state.craft_border.y + args.state.inventory_border.h - 80) - item[:ordinal_y] * 80
-** Processing line: ~    item.w = 80~
+          ordinal_x: 1, ordinal_y: 0
+** Processing line: ~        },~
 - Inside source: true
 *** True Line Result
-    item.w = 80
-** Processing line: ~    item.h = 80~
+        },
+** Processing line: ~        {~
 - Inside source: true
 *** True Line Result
-    item.h = 80
-** Processing line: ~  end~
+        {
+** Processing line: ~          id: :plank,~
 - Inside source: true
 *** True Line Result
-  end
-** Processing line: ~~
+          id: :plank,
+** Processing line: ~          quantity: 5,~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~  # Any lines outside of a function will be executed when the file is reloaded.~
+          quantity: 5,
+** Processing line: ~          path: 'sprites/plank.png',~
 - Inside source: true
 *** True Line Result
-  # Any lines outside of a function will be executed when the file is reloaded.
-** Processing line: ~  # So every time you save main.rb, the game will be reset.~
+          path: 'sprites/plank.png',
+** Processing line: ~          location: :inventory,~
 - Inside source: true
 *** True Line Result
-  # So every time you save main.rb, the game will be reset.
-** Processing line: ~  # Comment out the line below if you don't want this to happen.~
+          location: :inventory,
+** Processing line: ~          ordinal_x: 2, ordinal_y: 0~
 - Inside source: true
 *** True Line Result
-  # Comment out the line below if you don't want this to happen.
-** Processing line: ~  $gtk.reset~
+          ordinal_x: 2, ordinal_y: 0
+** Processing line: ~        },~
 - Inside source: true
 *** True Line Result
-  $gtk.reset
-** Processing line: ~~
+        },
+** Processing line: ~      ]~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~#+end_src~
-- Line was identified as the end of a code block.
-*** True Line Result
-#+end_src
+      ]
 ** Processing line: ~~
-- End of paragraph detected.
-*** True Line Result
-
-** Processing line: ~*** Crafting - Farming Game Starting Point - main.rb~
-- Header detected.
-*** True Line Result
-
-*** True Line Result
-*** Crafting - Farming Game Starting Point - main.rb
-** Processing line: ~#+begin_src ruby~
-- Line was identified as the beginning of a code block.
+- Inside source: true
 *** True Line Result
 
+** Processing line: ~      # after initializing the oridinal positions, derive the pixel~
+- Inside source: true
 *** True Line Result
-#+begin_src ruby
-** Processing line: ~  # ./samples/99_genre_crafting/farming_game_starting_point/app/main.rb~
+      # after initializing the oridinal positions, derive the pixel
+** Processing line: ~      # locations assuming that the width and height are 80~
 - Inside source: true
 *** True Line Result
-  # ./samples/99_genre_crafting/farming_game_starting_point/app/main.rb
-** Processing line: ~  def tick args~
+      # locations assuming that the width and height are 80
+** Processing line: ~      args.state.items.each { |item| set_inventory_position args, item }~
 - Inside source: true
 *** True Line Result
-  def tick args
-** Processing line: ~    args.state.tile_size     = 80~
+      args.state.items.each { |item| set_inventory_position args, item }
+** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
-    args.state.tile_size     = 80
-** Processing line: ~    args.state.player_speed  = 4~
+    end
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-    args.state.player_speed  = 4
-** Processing line: ~    args.state.player      ||= tile(args, 7, 3, 0, 128, 180)~
+
+** Processing line: ~    # define all the oridinal positions of the inventory slots~
 - Inside source: true
 *** True Line Result
-    args.state.player      ||= tile(args, 7, 3, 0, 128, 180)
-** Processing line: ~    generate_map args~
+    # define all the oridinal positions of the inventory slots
+** Processing line: ~    if !args.state.inventory_area~
 - Inside source: true
 *** True Line Result
-    generate_map args
-** Processing line: ~    #press j to plant a green onion~
+    if !args.state.inventory_area
+** Processing line: ~      args.state.inventory_area = [~
 - Inside source: true
 *** True Line Result
-    #press j to plant a green onion
-** Processing line: ~    if args.inputs.keyboard.j~
+      args.state.inventory_area = [
+** Processing line: ~        { ordinal_x: 0,  ordinal_y: 0 },~
 - Inside source: true
 *** True Line Result
-    if args.inputs.keyboard.j
-** Processing line: ~    #change this part you can change what you want to plant~
+        { ordinal_x: 0,  ordinal_y: 0 },
+** Processing line: ~        { ordinal_x: 1,  ordinal_y: 0 },~
 - Inside source: true
 *** True Line Result
-    #change this part you can change what you want to plant
-** Processing line: ~     args.state.walls << tile(args, ((args.state.player.x+80)/args.state.tile_size), ((args.state.player.y)/args.state.tile_size), 255, 255, 255)~
+        { ordinal_x: 1,  ordinal_y: 0 },
+** Processing line: ~        { ordinal_x: 2,  ordinal_y: 0 },~
 - Inside source: true
 *** True Line Result
-     args.state.walls << tile(args, ((args.state.player.x+80)/args.state.tile_size), ((args.state.player.y)/args.state.tile_size), 255, 255, 255)
-** Processing line: ~     args.state.plants << tile(args, ((args.state.player.x+80)/args.state.tile_size), ((args.state.player.y+80)/args.state.tile_size), 0, 160, 0)~
+        { ordinal_x: 2,  ordinal_y: 0 },
+** Processing line: ~        { ordinal_x: 3,  ordinal_y: 0 },~
 - Inside source: true
 *** True Line Result
-     args.state.plants << tile(args, ((args.state.player.x+80)/args.state.tile_size), ((args.state.player.y+80)/args.state.tile_size), 0, 160, 0)
-** Processing line: ~    end~
+        { ordinal_x: 3,  ordinal_y: 0 },
+** Processing line: ~        { ordinal_x: 4,  ordinal_y: 0 },~
 - Inside source: true
 *** True Line Result
-    end
-** Processing line: ~    # Adds walls, background, and player to args.outputs.solids so they appear on screen~
+        { ordinal_x: 4,  ordinal_y: 0 },
+** Processing line: ~        { ordinal_x: 5,  ordinal_y: 0 },~
 - Inside source: true
 *** True Line Result
-    # Adds walls, background, and player to args.outputs.solids so they appear on screen
-** Processing line: ~    args.outputs.solids << [0,0,1280,720, 237,189,101]~
+        { ordinal_x: 5,  ordinal_y: 0 },
+** Processing line: ~        { ordinal_x: 6,  ordinal_y: 0 },~
 - Inside source: true
 *** True Line Result
-    args.outputs.solids << [0,0,1280,720, 237,189,101]
-** Processing line: ~    args.outputs.sprites << [0, 0, 1280, 720, 'sprites/background.png']~
+        { ordinal_x: 6,  ordinal_y: 0 },
+** Processing line: ~        { ordinal_x: 7,  ordinal_y: 0 },~
 - Inside source: true
 *** True Line Result
-    args.outputs.sprites << [0, 0, 1280, 720, 'sprites/background.png']
-** Processing line: ~    args.outputs.solids << args.state.walls~
+        { ordinal_x: 7,  ordinal_y: 0 },
+** Processing line: ~        { ordinal_x: 8,  ordinal_y: 0 },~
 - Inside source: true
 *** True Line Result
-    args.outputs.solids << args.state.walls
-** Processing line: ~    args.outputs.solids << args.state.player~
+        { ordinal_x: 8,  ordinal_y: 0 },
+** Processing line: ~        { ordinal_x: 9,  ordinal_y: 0 },~
 - Inside source: true
 *** True Line Result
-    args.outputs.solids << args.state.player
-** Processing line: ~    args.outputs.solids << args.state.plants~
+        { ordinal_x: 9,  ordinal_y: 0 },
+** Processing line: ~        { ordinal_x: 0,  ordinal_y: 1 },~
 - Inside source: true
 *** True Line Result
-    args.outputs.solids << args.state.plants
-** Processing line: ~    args.outputs.labels << [320, 640, "press J to plant", 3, 1, 255, 0, 0, 200]~
+        { ordinal_x: 0,  ordinal_y: 1 },
+** Processing line: ~        { ordinal_x: 1,  ordinal_y: 1 },~
 - Inside source: true
 *** True Line Result
-    args.outputs.labels << [320, 640, "press J to plant", 3, 1, 255, 0, 0, 200]
-** Processing line: ~~
+        { ordinal_x: 1,  ordinal_y: 1 },
+** Processing line: ~        { ordinal_x: 2,  ordinal_y: 1 },~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~    move_player args, -1,  0 if args.inputs.keyboard.left # x position decreases by 1 if left key is pressed~
+        { ordinal_x: 2,  ordinal_y: 1 },
+** Processing line: ~        { ordinal_x: 3,  ordinal_y: 1 },~
 - Inside source: true
 *** True Line Result
-    move_player args, -1,  0 if args.inputs.keyboard.left # x position decreases by 1 if left key is pressed
-** Processing line: ~    move_player args,  1,  0 if args.inputs.keyboard.right # x position increases by 1 if right key is pressed~
+        { ordinal_x: 3,  ordinal_y: 1 },
+** Processing line: ~        { ordinal_x: 4,  ordinal_y: 1 },~
 - Inside source: true
 *** True Line Result
-    move_player args,  1,  0 if args.inputs.keyboard.right # x position increases by 1 if right key is pressed
-** Processing line: ~    move_player args,  0,  1 if args.inputs.keyboard.up # y position increases by 1 if up is pressed~
+        { ordinal_x: 4,  ordinal_y: 1 },
+** Processing line: ~        { ordinal_x: 5,  ordinal_y: 1 },~
 - Inside source: true
 *** True Line Result
-    move_player args,  0,  1 if args.inputs.keyboard.up # y position increases by 1 if up is pressed
-** Processing line: ~    move_player args,  0, -1 if args.inputs.keyboard.down # y position decreases by 1 if down is pressed~
+        { ordinal_x: 5,  ordinal_y: 1 },
+** Processing line: ~        { ordinal_x: 6,  ordinal_y: 1 },~
 - Inside source: true
 *** True Line Result
-    move_player args,  0, -1 if args.inputs.keyboard.down # y position decreases by 1 if down is pressed
-** Processing line: ~  end~
+        { ordinal_x: 6,  ordinal_y: 1 },
+** Processing line: ~        { ordinal_x: 7,  ordinal_y: 1 },~
 - Inside source: true
 *** True Line Result
-  end
-** Processing line: ~~
+        { ordinal_x: 7,  ordinal_y: 1 },
+** Processing line: ~        { ordinal_x: 8,  ordinal_y: 1 },~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~  # Sets position, size, and color of the tile~
+        { ordinal_x: 8,  ordinal_y: 1 },
+** Processing line: ~        { ordinal_x: 9,  ordinal_y: 1 },~
 - Inside source: true
 *** True Line Result
-  # Sets position, size, and color of the tile
-** Processing line: ~  def tile args, x, y, *color~
+        { ordinal_x: 9,  ordinal_y: 1 },
+** Processing line: ~        { ordinal_x: 0,  ordinal_y: 2 },~
 - Inside source: true
 *** True Line Result
-  def tile args, x, y, *color
-** Processing line: ~    [x * args.state.tile_size, # sets definition for array using method parameters~
+        { ordinal_x: 0,  ordinal_y: 2 },
+** Processing line: ~        { ordinal_x: 1,  ordinal_y: 2 },~
 - Inside source: true
 *** True Line Result
-    [x * args.state.tile_size, # sets definition for array using method parameters
-** Processing line: ~     y * args.state.tile_size, # multiplying by tile_size sets x and y to correct position using pixel values~
+        { ordinal_x: 1,  ordinal_y: 2 },
+** Processing line: ~        { ordinal_x: 2,  ordinal_y: 2 },~
 - Inside source: true
 *** True Line Result
-     y * args.state.tile_size, # multiplying by tile_size sets x and y to correct position using pixel values
-** Processing line: ~     args.state.tile_size,~
+        { ordinal_x: 2,  ordinal_y: 2 },
+** Processing line: ~        { ordinal_x: 3,  ordinal_y: 2 },~
 - Inside source: true
 *** True Line Result
-     args.state.tile_size,
-** Processing line: ~     args.state.tile_size,~
+        { ordinal_x: 3,  ordinal_y: 2 },
+** Processing line: ~        { ordinal_x: 4,  ordinal_y: 2 },~
 - Inside source: true
 *** True Line Result
-     args.state.tile_size,
-** Processing line: ~     *color]~
+        { ordinal_x: 4,  ordinal_y: 2 },
+** Processing line: ~        { ordinal_x: 5,  ordinal_y: 2 },~
 - Inside source: true
 *** True Line Result
-     *color]
-** Processing line: ~  end~
+        { ordinal_x: 5,  ordinal_y: 2 },
+** Processing line: ~        { ordinal_x: 6,  ordinal_y: 2 },~
 - Inside source: true
 *** True Line Result
-  end
-** Processing line: ~~
+        { ordinal_x: 6,  ordinal_y: 2 },
+** Processing line: ~        { ordinal_x: 7,  ordinal_y: 2 },~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~  # Creates map by adding tiles to the wall, as well as a goal (that the player needs to reach)~
+        { ordinal_x: 7,  ordinal_y: 2 },
+** Processing line: ~        { ordinal_x: 8,  ordinal_y: 2 },~
 - Inside source: true
 *** True Line Result
-  # Creates map by adding tiles to the wall, as well as a goal (that the player needs to reach)
-** Processing line: ~  def generate_map args~
+        { ordinal_x: 8,  ordinal_y: 2 },
+** Processing line: ~        { ordinal_x: 9,  ordinal_y: 2 },~
 - Inside source: true
 *** True Line Result
-  def generate_map args
-** Processing line: ~    return if args.state.area~
+        { ordinal_x: 9,  ordinal_y: 2 },
+** Processing line: ~      ]~
 - Inside source: true
 *** True Line Result
-    return if args.state.area
+      ]
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~    # Creates the area of the map. There are 9 rows running horizontally across the screen~
+** Processing line: ~      # after initializing the oridinal positions, derive the pixel~
 - Inside source: true
 *** True Line Result
-    # Creates the area of the map. There are 9 rows running horizontally across the screen
-** Processing line: ~    # and 16 columns running vertically on the screen. Any spot with a "1" is not~
+      # after initializing the oridinal positions, derive the pixel
+** Processing line: ~      # locations assuming that the width and height are 80~
 - Inside source: true
 *** True Line Result
-    # and 16 columns running vertically on the screen. Any spot with a "1" is not
-** Processing line: ~    # open for the player to move into (and is green), and any spot with a "0" is available~
+      # locations assuming that the width and height are 80
+** Processing line: ~      args.state.inventory_area.each { |i| set_inventory_position args, i }~
 - Inside source: true
 *** True Line Result
-    # open for the player to move into (and is green), and any spot with a "0" is available
-** Processing line: ~    # for the player to move in.~
+      args.state.inventory_area.each { |i| set_inventory_position args, i }
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-    # for the player to move in.
-** Processing line: ~    args.state.area = [~
+
+** Processing line: ~      # if you want to see the result you can use the Ruby function called "puts".~
 - Inside source: true
 *** True Line Result
-    args.state.area = [
-** Processing line: ~      [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,],~
+      # if you want to see the result you can use the Ruby function called "puts".
+** Processing line: ~      # Uncomment this line to see the value.~
 - Inside source: true
 *** True Line Result
-      [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,],
-** Processing line: ~      [1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1,],~
+      # Uncomment this line to see the value.
+** Processing line: ~      # puts args.state.inventory_area~
 - Inside source: true
 *** True Line Result
-      [1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1,],
-** Processing line: ~      [1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1,],~
+      # puts args.state.inventory_area
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-      [1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1,],
-** Processing line: ~      [1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1,],~
+
+** Processing line: ~      # You can see all things written via puts in DragonRuby's Console, or under logs/log.txt.~
 - Inside source: true
 *** True Line Result
-      [1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1,],
-** Processing line: ~      [1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1,],~
+      # You can see all things written via puts in DragonRuby's Console, or under logs/log.txt.
+** Processing line: ~      # To bring up DragonRuby's Console, press the ~ key within the game.~
 - Inside source: true
 *** True Line Result
-      [1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1,],
-** Processing line: ~      [1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1,],~
+      # To bring up DragonRuby's Console, press the ~ key within the game.
+** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
-      [1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1,],
-** Processing line: ~      [1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1,],~
+    end
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-      [1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1,],
-** Processing line: ~      [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,],~
+
+** Processing line: ~    # define all the oridinal positions of the craft slots~
 - Inside source: true
 *** True Line Result
-      [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,],
-** Processing line: ~      [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 ],~
+    # define all the oridinal positions of the craft slots
+** Processing line: ~    if !args.state.craft_area~
 - Inside source: true
 *** True Line Result
-      [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 ],
-** Processing line: ~    ].reverse # reverses the order of the area collection~
+    if !args.state.craft_area
+** Processing line: ~      args.state.craft_area = [~
 - Inside source: true
 *** True Line Result
-    ].reverse # reverses the order of the area collection
-** Processing line: ~~
+      args.state.craft_area = [
+** Processing line: ~        { ordinal_x: 0, ordinal_y: 0 },~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~    # By reversing the order, the way that the area appears above is how it appears~
+        { ordinal_x: 0, ordinal_y: 0 },
+** Processing line: ~        { ordinal_x: 0, ordinal_y: 1 },~
 - Inside source: true
 *** True Line Result
-    # By reversing the order, the way that the area appears above is how it appears
-** Processing line: ~    # on the screen in the game. If we did not reverse, the map would appear inverted.~
+        { ordinal_x: 0, ordinal_y: 1 },
+** Processing line: ~        { ordinal_x: 0, ordinal_y: 2 },~
 - Inside source: true
 *** True Line Result
-    # on the screen in the game. If we did not reverse, the map would appear inverted.
-** Processing line: ~~
+        { ordinal_x: 0, ordinal_y: 2 },
+** Processing line: ~        { ordinal_x: 1, ordinal_y: 0 },~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~    #The wall starts off with no tiles.~
+        { ordinal_x: 1, ordinal_y: 0 },
+** Processing line: ~        { ordinal_x: 1, ordinal_y: 1 },~
 - Inside source: true
 *** True Line Result
-    #The wall starts off with no tiles.
-** Processing line: ~    args.state.walls = []~
+        { ordinal_x: 1, ordinal_y: 1 },
+** Processing line: ~        { ordinal_x: 1, ordinal_y: 2 },~
 - Inside source: true
 *** True Line Result
-    args.state.walls = []
-** Processing line: ~    args.state.plants = []~
+        { ordinal_x: 1, ordinal_y: 2 },
+** Processing line: ~        { ordinal_x: 2, ordinal_y: 0 },~
 - Inside source: true
 *** True Line Result
-    args.state.plants = []
-** Processing line: ~~
+        { ordinal_x: 2, ordinal_y: 0 },
+** Processing line: ~        { ordinal_x: 2, ordinal_y: 1 },~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~    # If v is 1, a green tile is added to args.state.walls.~
+        { ordinal_x: 2, ordinal_y: 1 },
+** Processing line: ~        { ordinal_x: 2, ordinal_y: 2 },~
 - Inside source: true
 *** True Line Result
-    # If v is 1, a green tile is added to args.state.walls.
-** Processing line: ~    # If v is 2, a black tile is created as the goal.~
+        { ordinal_x: 2, ordinal_y: 2 },
+** Processing line: ~      ]~
 - Inside source: true
 *** True Line Result
-    # If v is 2, a black tile is created as the goal.
-** Processing line: ~    args.state.area.map_2d do |y, x, v|~
+      ]
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-    args.state.area.map_2d do |y, x, v|
-** Processing line: ~      if    v == 1~
+
+** Processing line: ~      # after initializing the oridinal positions, derive the pixel~
 - Inside source: true
 *** True Line Result
-      if    v == 1
-** Processing line: ~        args.state.walls << tile(args, x, y, 255, 160, 156) # green tile~
+      # after initializing the oridinal positions, derive the pixel
+** Processing line: ~      # locations assuming that the width and height are 80~
 - Inside source: true
 *** True Line Result
-        args.state.walls << tile(args, x, y, 255, 160, 156) # green tile
-** Processing line: ~      end~
+      # locations assuming that the width and height are 80
+** Processing line: ~      args.state.craft_area.each { |c| set_craft_position args, c }~
 - Inside source: true
 *** True Line Result
-      end
+      args.state.craft_area.each { |c| set_craft_position args, c }
 ** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
@@ -100055,662 +101591,706 @@ Follows is a source code listing for all files that have been open sourced. This
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~  # Allows the player to move their box around the screen~
-- Inside source: true
-*** True Line Result
-  # Allows the player to move their box around the screen
-** Processing line: ~  def move_player args, *vector~
-- Inside source: true
-*** True Line Result
-  def move_player args, *vector
-** Processing line: ~    box = args.state.player.shift_rect(vector) # box is able to move at an angle~
-- Inside source: true
-*** True Line Result
-    box = args.state.player.shift_rect(vector) # box is able to move at an angle
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~    # If the player's box hits a wall, it is not able to move further in that direction~
+** Processing line: ~  def render args~
 - Inside source: true
 *** True Line Result
-    # If the player's box hits a wall, it is not able to move further in that direction
-** Processing line: ~    return if args.state.walls~
+  def render args
+** Processing line: ~    # for the results area, create a sprite that show its boundaries~
 - Inside source: true
 *** True Line Result
-    return if args.state.walls
-** Processing line: ~                  .any_intersect_rect?(box)~
+    # for the results area, create a sprite that show its boundaries
+** Processing line: ~    args.outputs.primitives << { x: args.state.result_border.x,~
 - Inside source: true
 *** True Line Result
-                  .any_intersect_rect?(box)
-** Processing line: ~~
+    args.outputs.primitives << { x: args.state.result_border.x,
+** Processing line: ~                                 y: args.state.result_border.y,~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~    # Player's box is able to move at angles (not just the four general directions) fast~
+                                 y: args.state.result_border.y,
+** Processing line: ~                                 w: args.state.result_border.w,~
 - Inside source: true
 *** True Line Result
-    # Player's box is able to move at angles (not just the four general directions) fast
-** Processing line: ~    args.state.player =~
+                                 w: args.state.result_border.w,
+** Processing line: ~                                 h: args.state.result_border.h,~
 - Inside source: true
 *** True Line Result
-    args.state.player =
-** Processing line: ~      args.state.player~
+                                 h: args.state.result_border.h,
+** Processing line: ~                                 path: 'sprites/border-black.png' }~
 - Inside source: true
 *** True Line Result
-      args.state.player
-** Processing line: ~          .shift_rect(vector.x * args.state.player_speed, # if we don't multiply by speed, then~
+                                 path: 'sprites/border-black.png' }
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-          .shift_rect(vector.x * args.state.player_speed, # if we don't multiply by speed, then
-** Processing line: ~                      vector.y * args.state.player_speed) # the box will move extremely slow~
+
+** Processing line: ~    # for each inventory spot, create a sprite~
 - Inside source: true
 *** True Line Result
-                      vector.y * args.state.player_speed) # the box will move extremely slow
-** Processing line: ~  end~
+    # for each inventory spot, create a sprite
+** Processing line: ~    # args.outputs.primitives is how DragonRuby performs a render.~
 - Inside source: true
 *** True Line Result
-  end
-** Processing line: ~~
+    # args.outputs.primitives is how DragonRuby performs a render.
+** Processing line: ~    # Adding a single hash or multiple hashes to this array will tell~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~#+end_src~
-- Line was identified as the end of a code block.
+    # Adding a single hash or multiple hashes to this array will tell
+** Processing line: ~    # DragonRuby to render those primitives on that frame.~
+- Inside source: true
 *** True Line Result
-#+end_src
+    # DragonRuby to render those primitives on that frame.
 ** Processing line: ~~
-- End of paragraph detected.
-*** True Line Result
-
-** Processing line: ~*** Crafting - Farming Game Starting Point - repl.rb~
-- Header detected.
+- Inside source: true
 *** True Line Result
 
+** Processing line: ~    # The .map function on Array is used instead of any kind of looping.~
+- Inside source: true
 *** True Line Result
-*** Crafting - Farming Game Starting Point - repl.rb
-** Processing line: ~#+begin_src ruby~
-- Line was identified as the beginning of a code block.
+    # The .map function on Array is used instead of any kind of looping.
+** Processing line: ~    # .map returns a new object for every object within an Array.~
+- Inside source: true
 *** True Line Result
-
+    # .map returns a new object for every object within an Array.
+** Processing line: ~    args.outputs.primitives << args.state.inventory_area.map do |a|~
+- Inside source: true
 *** True Line Result
-#+begin_src ruby
-** Processing line: ~  # ./samples/99_genre_crafting/farming_game_starting_point/app/repl.rb~
+    args.outputs.primitives << args.state.inventory_area.map do |a|
+** Processing line: ~      { x: a.x, y: a.y, w: a.w, h: a.h, path: 'sprites/border-black.png' }~
 - Inside source: true
 *** True Line Result
-  # ./samples/99_genre_crafting/farming_game_starting_point/app/repl.rb
-** Processing line: ~  # ===============================================================~
+      { x: a.x, y: a.y, w: a.w, h: a.h, path: 'sprites/border-black.png' }
+** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
-  # ===============================================================
-** Processing line: ~  # Welcome to repl.rb~
+    end
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-  # Welcome to repl.rb
-** Processing line: ~  # ===============================================================~
+
+** Processing line: ~    # for each craft spot, create a sprite~
 - Inside source: true
 *** True Line Result
-  # ===============================================================
-** Processing line: ~  # You can experiement with code within this file. Code in this~
+    # for each craft spot, create a sprite
+** Processing line: ~    args.outputs.primitives << args.state.craft_area.map do |a|~
 - Inside source: true
 *** True Line Result
-  # You can experiement with code within this file. Code in this
-** Processing line: ~  # file is only executed when you save (and only excecuted ONCE).~
+    args.outputs.primitives << args.state.craft_area.map do |a|
+** Processing line: ~      { x: a.x, y: a.y, w: a.w, h: a.h, path: 'sprites/border-black.png' }~
 - Inside source: true
 *** True Line Result
-  # file is only executed when you save (and only excecuted ONCE).
-** Processing line: ~  # ===============================================================~
+      { x: a.x, y: a.y, w: a.w, h: a.h, path: 'sprites/border-black.png' }
+** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
-  # ===============================================================
+    end
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~  # ===============================================================~
+** Processing line: ~    # after the borders have been rendered, render the~
 - Inside source: true
 *** True Line Result
-  # ===============================================================
-** Processing line: ~  # REMOVE the "x" from the word "xrepl" and save the file to RUN~
+    # after the borders have been rendered, render the
+** Processing line: ~    # items within those slots (and allow for highlighting)~
 - Inside source: true
 *** True Line Result
-  # REMOVE the "x" from the word "xrepl" and save the file to RUN
-** Processing line: ~  # the code in between the do/end block delimiters.~
+    # items within those slots (and allow for highlighting)
+** Processing line: ~    # if an item isn't currently being held~
 - Inside source: true
 *** True Line Result
-  # the code in between the do/end block delimiters.
-** Processing line: ~  # ===============================================================~
+    # if an item isn't currently being held
+** Processing line: ~    allow_inventory_highlighting = !args.state.held_item~
 - Inside source: true
 *** True Line Result
-  # ===============================================================
+    allow_inventory_highlighting = !args.state.held_item
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~  # ===============================================================~
+** Processing line: ~    # go through each item and render them~
+- Inside source: true
+*** True Line Result
+    # go through each item and render them
+** Processing line: ~    # use Array's find_all method to remove any items that are currently being held~
 - Inside source: true
 *** True Line Result
-  # ===============================================================
-** Processing line: ~  # ADD the "x" to the word "repl" (make it xrepl) and save the~
+    # use Array's find_all method to remove any items that are currently being held
+** Processing line: ~    args.state.items.find_all { |item| item[:location] != :held }.map do |item|~
 - Inside source: true
 *** True Line Result
-  # ADD the "x" to the word "repl" (make it xrepl) and save the
-** Processing line: ~  # file to IGNORE the code in between the do/end block delimiters.~
+    args.state.items.find_all { |item| item[:location] != :held }.map do |item|
+** Processing line: ~      # if an item is currently being held, don't render it in it's spot within the~
 - Inside source: true
 *** True Line Result
-  # file to IGNORE the code in between the do/end block delimiters.
-** Processing line: ~  # ===============================================================~
+      # if an item is currently being held, don't render it in it's spot within the
+** Processing line: ~      # inventory or craft area (this is handled via the find_all method).~
 - Inside source: true
 *** True Line Result
-  # ===============================================================
+      # inventory or craft area (this is handled via the find_all method).
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~  # Remove the x from xrepl to run the code. Add the x back to ignore to code.~
+** Processing line: ~      # the item_prefab returns a hash containing all the visual components of an item.~
 - Inside source: true
 *** True Line Result
-  # Remove the x from xrepl to run the code. Add the x back to ignore to code.
-** Processing line: ~  xrepl do~
+      # the item_prefab returns a hash containing all the visual components of an item.
+** Processing line: ~      # the main sprite, the black background, the quantity text, and a hover indication~
 - Inside source: true
 *** True Line Result
-  xrepl do
-** Processing line: ~    puts "The result of 1 + 2 is: #{1 + 2}"~
+      # the main sprite, the black background, the quantity text, and a hover indication
+** Processing line: ~      # if the mouse is currently hovering over the item.~
 - Inside source: true
 *** True Line Result
-    puts "The result of 1 + 2 is: #{1 + 2}"
-** Processing line: ~  end~
+      # if the mouse is currently hovering over the item.
+** Processing line: ~      args.outputs.primitives << item_prefab(args, item, allow_inventory_highlighting, args.inputs.mouse)~
 - Inside source: true
 *** True Line Result
-  end
+      args.outputs.primitives << item_prefab(args, item, allow_inventory_highlighting, args.inputs.mouse)
+** Processing line: ~    end~
+- Inside source: true
+*** True Line Result
+    end
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~  # ====================================================================================~
+** Processing line: ~    # The last thing we want to render is the item currently being held.~
 - Inside source: true
 *** True Line Result
-  # ====================================================================================
-** Processing line: ~  # Ruby Crash Course:~
+    # The last thing we want to render is the item currently being held.
+** Processing line: ~    args.outputs.primitives << item_prefab(args, args.state.held_item, allow_inventory_highlighting, args.inputs.mouse)~
 - Inside source: true
 *** True Line Result
-  # Ruby Crash Course:
-** Processing line: ~  # Strings, Numeric, Booleans, Conditionals, Looping, Enumerables, Arrays~
+    args.outputs.primitives << item_prefab(args, args.state.held_item, allow_inventory_highlighting, args.inputs.mouse)
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-  # Strings, Numeric, Booleans, Conditionals, Looping, Enumerables, Arrays
-** Processing line: ~  # ====================================================================================~
+
+** Processing line: ~    args.outputs.primitives << args.state.click_ripples~
 - Inside source: true
 *** True Line Result
-  # ====================================================================================
+    args.outputs.primitives << args.state.click_ripples
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~  # ====================================================================================~
+** Processing line: ~    # render a mouse cursor since we have the OS cursor hidden~
 - Inside source: true
 *** True Line Result
-  # ====================================================================================
-** Processing line: ~  #  Strings~
+    # render a mouse cursor since we have the OS cursor hidden
+** Processing line: ~    args.outputs.primitives << { x: args.inputs.mouse.x - 5, y: args.inputs.mouse.y - 5, w: 10, h: 10, path: 'sprites/circle-gray.png', a: 128 }~
 - Inside source: true
 *** True Line Result
-  #  Strings
-** Processing line: ~  # ====================================================================================~
+    args.outputs.primitives << { x: args.inputs.mouse.x - 5, y: args.inputs.mouse.y - 5, w: 10, h: 10, path: 'sprites/circle-gray.png', a: 128 }
+** Processing line: ~  end~
 - Inside source: true
 *** True Line Result
-  # ====================================================================================
-** Processing line: ~  # Remove the x from xrepl to run the code. Add the x back to ignore to code.~
+  end
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-  # Remove the x from xrepl to run the code. Add the x back to ignore to code.
-** Processing line: ~  xrepl do~
+
+** Processing line: ~  # Alrighty! This is where all the fun happens~
 - Inside source: true
 *** True Line Result
-  xrepl do
-** Processing line: ~    message = "Hello World"~
+  # Alrighty! This is where all the fun happens
+** Processing line: ~  def input args~
 - Inside source: true
 *** True Line Result
-    message = "Hello World"
-** Processing line: ~    puts "The value of message is: " + message~
+  def input args
+** Processing line: ~    # if the mouse is clicked and not item is currently being held~
 - Inside source: true
 *** True Line Result
-    puts "The value of message is: " + message
-** Processing line: ~    puts "Any value can be interpolated within a string using \#{}."~
+    # if the mouse is clicked and not item is currently being held
+** Processing line: ~    # args.state.held_item is nil when the game starts.~
 - Inside source: true
 *** True Line Result
-    puts "Any value can be interpolated within a string using \#{}."
-** Processing line: ~    puts "Interpolated message: #{message}."~
+    # args.state.held_item is nil when the game starts.
+** Processing line: ~    # If the player clicks, the property args.inputs.mouse.click will~
 - Inside source: true
 *** True Line Result
-    puts "Interpolated message: #{message}."
-** Processing line: ~    puts 'This #{message} is not interpolated because the string uses single quotes.'~
+    # If the player clicks, the property args.inputs.mouse.click will
+** Processing line: ~    # be a non nil value, we don't want to process any of the code here~
 - Inside source: true
 *** True Line Result
-    puts 'This #{message} is not interpolated because the string uses single quotes.'
-** Processing line: ~  end~
+    # be a non nil value, we don't want to process any of the code here
+** Processing line: ~    # if the mouse hasn't been clicked~
 - Inside source: true
 *** True Line Result
-  end
+    # if the mouse hasn't been clicked
+** Processing line: ~    return if !args.inputs.mouse.click~
+- Inside source: true
+*** True Line Result
+    return if !args.inputs.mouse.click
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~  # ====================================================================================~
+** Processing line: ~    # if a click occurred, add a ripple to the ripple queue~
 - Inside source: true
 *** True Line Result
-  # ====================================================================================
-** Processing line: ~  #  Numerics~
+    # if a click occurred, add a ripple to the ripple queue
+** Processing line: ~    args.state.click_ripples << { x: args.inputs.mouse.x - 5, y: args.inputs.mouse.y - 5, w: 10, h: 10, path: 'sprites/circle-gray.png', a: 128 }~
 - Inside source: true
 *** True Line Result
-  #  Numerics
-** Processing line: ~  # ====================================================================================~
+    args.state.click_ripples << { x: args.inputs.mouse.x - 5, y: args.inputs.mouse.y - 5, w: 10, h: 10, path: 'sprites/circle-gray.png', a: 128 }
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-  # ====================================================================================
-** Processing line: ~  # Remove the x from xrepl to run the code. Add the x back to ignore to code.~
+
+** Processing line: ~    # if the mouse has been clicked, and no item is currently held...~
 - Inside source: true
 *** True Line Result
-  # Remove the x from xrepl to run the code. Add the x back to ignore to code.
-** Processing line: ~  xrepl do~
+    # if the mouse has been clicked, and no item is currently held...
+** Processing line: ~    if !args.state.held_item~
 - Inside source: true
 *** True Line Result
-  xrepl do
-** Processing line: ~    a = 10~
+    if !args.state.held_item
+** Processing line: ~      # see if any of the items intersect the pointer using the inside_rect? method~
 - Inside source: true
 *** True Line Result
-    a = 10
-** Processing line: ~    puts "The value of a is: #{a}"~
+      # see if any of the items intersect the pointer using the inside_rect? method
+** Processing line: ~      # the find method will either return the first object that returns true~
 - Inside source: true
 *** True Line Result
-    puts "The value of a is: #{a}"
-** Processing line: ~    puts "a + 1 is: #{a + 1}"~
+      # the find method will either return the first object that returns true
+** Processing line: ~      # for the match clause, or it'll return nil if nothing matches the match clause~
 - Inside source: true
 *** True Line Result
-    puts "a + 1 is: #{a + 1}"
-** Processing line: ~    puts "a / 3 is: #{a / 3}"~
+      # for the match clause, or it'll return nil if nothing matches the match clause
+** Processing line: ~      found = args.state.items.find do |item|~
 - Inside source: true
 *** True Line Result
-    puts "a / 3 is: #{a / 3}"
-** Processing line: ~  end~
+      found = args.state.items.find do |item|
+** Processing line: ~        # for each item in args.state.items, run the following boolean check~
 - Inside source: true
 *** True Line Result
-  end
-** Processing line: ~~
+        # for each item in args.state.items, run the following boolean check
+** Processing line: ~        args.inputs.mouse.click.point.inside_rect?(item)~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~  # Remove the x from xrepl to run the code. Add the x back to ignore to code.~
+        args.inputs.mouse.click.point.inside_rect?(item)
+** Processing line: ~      end~
 - Inside source: true
 *** True Line Result
-  # Remove the x from xrepl to run the code. Add the x back to ignore to code.
-** Processing line: ~  xrepl do~
+      end
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-  xrepl do
-** Processing line: ~    b = 10.12~
+
+** Processing line: ~      # if an item intersects the mouse pointer, then set the item's location to :held and~
 - Inside source: true
 *** True Line Result
-    b = 10.12
-** Processing line: ~    puts "The value of b is: #{b}"~
+      # if an item intersects the mouse pointer, then set the item's location to :held and
+** Processing line: ~      # set args.state.held_item to the item for later reference~
 - Inside source: true
 *** True Line Result
-    puts "The value of b is: #{b}"
-** Processing line: ~    puts "b + 1 is: #{b + 1}"~
+      # set args.state.held_item to the item for later reference
+** Processing line: ~      if found~
 - Inside source: true
 *** True Line Result
-    puts "b + 1 is: #{b + 1}"
-** Processing line: ~    puts "b as an integer is: #{b.to_i}"~
+      if found
+** Processing line: ~        args.state.held_item = found~
 - Inside source: true
 *** True Line Result
-    puts "b as an integer is: #{b.to_i}"
-** Processing line: ~    puts ''~
+        args.state.held_item = found
+** Processing line: ~        found[:location] = :held~
 - Inside source: true
 *** True Line Result
-    puts ''
-** Processing line: ~  end~
+        found[:location] = :held
+** Processing line: ~      end~
 - Inside source: true
 *** True Line Result
-  end
+      end
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~  # ====================================================================================~
+** Processing line: ~    # if the mouse is clicked and an item is currently beign held....~
 - Inside source: true
 *** True Line Result
-  # ====================================================================================
-** Processing line: ~  #  Booleans~
+    # if the mouse is clicked and an item is currently beign held....
+** Processing line: ~    elsif args.state.held_item~
 - Inside source: true
 *** True Line Result
-  #  Booleans
-** Processing line: ~  # ====================================================================================~
+    elsif args.state.held_item
+** Processing line: ~      # determine if a slot within the craft area was clicked~
 - Inside source: true
 *** True Line Result
-  # ====================================================================================
-** Processing line: ~  # Remove the x from xrepl to run the code. Add the x back to ignore to code.~
+      # determine if a slot within the craft area was clicked
+** Processing line: ~      craft_area = args.state.craft_area.find { |a| args.inputs.mouse.click.point.inside_rect? a }~
 - Inside source: true
 *** True Line Result
-  # Remove the x from xrepl to run the code. Add the x back to ignore to code.
-** Processing line: ~  xrepl do~
+      craft_area = args.state.craft_area.find { |a| args.inputs.mouse.click.point.inside_rect? a }
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-  xrepl do
-** Processing line: ~    c = 30~
+
+** Processing line: ~      # also determine if a slot within the inventory area was clicked~
 - Inside source: true
 *** True Line Result
-    c = 30
-** Processing line: ~    puts "The value of c is #{c}."~
+      # also determine if a slot within the inventory area was clicked
+** Processing line: ~      inventory_area = args.state.inventory_area.find { |a| args.inputs.mouse.click.point.inside_rect? a }~
 - Inside source: true
 *** True Line Result
-    puts "The value of c is #{c}."
+      inventory_area = args.state.inventory_area.find { |a| args.inputs.mouse.click.point.inside_rect? a }
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~    if c~
+** Processing line: ~      # if the click was within a craft area~
 - Inside source: true
 *** True Line Result
-    if c
-** Processing line: ~      puts "This if statement ran because c is truthy."~
+      # if the click was within a craft area
+** Processing line: ~      if craft_area~
 - Inside source: true
 *** True Line Result
-      puts "This if statement ran because c is truthy."
-** Processing line: ~    end~
+      if craft_area
+** Processing line: ~        # check to see if an item is already there and ignore the click if an item is found~
 - Inside source: true
 *** True Line Result
-    end
-** Processing line: ~  end~
+        # check to see if an item is already there and ignore the click if an item is found
+** Processing line: ~        # item_at_craft_slot is a helper method that returns an item or nil for a given oridinal~
 - Inside source: true
 *** True Line Result
-  end
+        # item_at_craft_slot is a helper method that returns an item or nil for a given oridinal
+** Processing line: ~        # position~
+- Inside source: true
+*** True Line Result
+        # position
+** Processing line: ~        item_already_there = item_at_craft_slot args, craft_area[:ordinal_x], craft_area[:ordinal_y]~
+- Inside source: true
+*** True Line Result
+        item_already_there = item_at_craft_slot args, craft_area[:ordinal_x], craft_area[:ordinal_y]
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~  # Remove the x from xrepl to run the code. Add the x back to ignore to code.~
+** Processing line: ~        # if an item *doesn't* exist in the craft area~
 - Inside source: true
 *** True Line Result
-  # Remove the x from xrepl to run the code. Add the x back to ignore to code.
-** Processing line: ~  xrepl do~
+        # if an item *doesn't* exist in the craft area
+** Processing line: ~        if !item_already_there~
 - Inside source: true
 *** True Line Result
-  xrepl do
-** Processing line: ~    d = false~
+        if !item_already_there
+** Processing line: ~          # if the quantity they are currently holding is greater than 1~
 - Inside source: true
 *** True Line Result
-    d = false
-** Processing line: ~    puts "The value of d is #{d}."~
+          # if the quantity they are currently holding is greater than 1
+** Processing line: ~          if args.state.held_item[:quantity] > 1~
 - Inside source: true
 *** True Line Result
-    puts "The value of d is #{d}."
-** Processing line: ~~
+          if args.state.held_item[:quantity] > 1
+** Processing line: ~            # remove one item (creating a seperate item of the same type), and place it~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~    if !d~
+            # remove one item (creating a seperate item of the same type), and place it
+** Processing line: ~            # at the oridinal position and location of the craft area~
 - Inside source: true
 *** True Line Result
-    if !d
-** Processing line: ~      puts "This if statement ran because d is falsey, using the not operator (!) makes d evaluate to true."~
+            # at the oridinal position and location of the craft area
+** Processing line: ~            # the .merge method on Hash creates a new Hash, but updates any values~
 - Inside source: true
 *** True Line Result
-      puts "This if statement ran because d is falsey, using the not operator (!) makes d evaluate to true."
-** Processing line: ~    end~
+            # the .merge method on Hash creates a new Hash, but updates any values
+** Processing line: ~            # passed as arguments to merge~
 - Inside source: true
 *** True Line Result
-    end
-** Processing line: ~~
+            # passed as arguments to merge
+** Processing line: ~            new_item = args.state.held_item.merge(quantity: 1,~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~    e = nil~
+            new_item = args.state.held_item.merge(quantity: 1,
+** Processing line: ~                                                  location: :craft,~
 - Inside source: true
 *** True Line Result
-    e = nil
-** Processing line: ~    puts "Nil is also considered falsey. The value of e is: #{e}."~
+                                                  location: :craft,
+** Processing line: ~                                                  ordinal_x: craft_area[:ordinal_x],~
 - Inside source: true
 *** True Line Result
-    puts "Nil is also considered falsey. The value of e is: #{e}."
+                                                  ordinal_x: craft_area[:ordinal_x],
+** Processing line: ~                                                  ordinal_y: craft_area[:ordinal_y])~
+- Inside source: true
+*** True Line Result
+                                                  ordinal_y: craft_area[:ordinal_y])
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~    if !e~
+** Processing line: ~            # after the item is crated, place it into the args.state.items collection~
 - Inside source: true
 *** True Line Result
-    if !e
-** Processing line: ~      puts "This if statement ran because e is nil (a falsey value)."~
+            # after the item is crated, place it into the args.state.items collection
+** Processing line: ~            args.state.items << new_item~
 - Inside source: true
 *** True Line Result
-      puts "This if statement ran because e is nil (a falsey value)."
-** Processing line: ~    end~
+            args.state.items << new_item
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-    end
-** Processing line: ~  end~
+
+** Processing line: ~            # then subtract one from the held item~
 - Inside source: true
 *** True Line Result
-  end
+            # then subtract one from the held item
+** Processing line: ~            args.state.held_item[:quantity] -= 1~
+- Inside source: true
+*** True Line Result
+            args.state.held_item[:quantity] -= 1
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~  # ====================================================================================~
+** Processing line: ~          # if the craft area is available and there is only one item being held~
 - Inside source: true
 *** True Line Result
-  # ====================================================================================
-** Processing line: ~  #  Conditionals~
+          # if the craft area is available and there is only one item being held
+** Processing line: ~          elsif args.state.held_item[:quantity] == 1~
 - Inside source: true
 *** True Line Result
-  #  Conditionals
-** Processing line: ~  # ====================================================================================~
+          elsif args.state.held_item[:quantity] == 1
+** Processing line: ~            # instead of creating any new items just set the location of the held item~
 - Inside source: true
 *** True Line Result
-  # ====================================================================================
-** Processing line: ~  # Remove the x from xrepl to run the code. Add the x back to ignore to code.~
+            # instead of creating any new items just set the location of the held item
+** Processing line: ~            # to the oridinal position of the craft area, and then nil out the~
 - Inside source: true
 *** True Line Result
-  # Remove the x from xrepl to run the code. Add the x back to ignore to code.
-** Processing line: ~  xrepl do~
+            # to the oridinal position of the craft area, and then nil out the
+** Processing line: ~            # held item state so that a new item can be picked up~
 - Inside source: true
 *** True Line Result
-  xrepl do
-** Processing line: ~    i_am_true  = true~
+            # held item state so that a new item can be picked up
+** Processing line: ~            args.state.held_item[:location] = :craft~
 - Inside source: true
 *** True Line Result
-    i_am_true  = true
-** Processing line: ~    i_am_nil   = nil~
+            args.state.held_item[:location] = :craft
+** Processing line: ~            args.state.held_item[:ordinal_x] = craft_area[:ordinal_x]~
 - Inside source: true
 *** True Line Result
-    i_am_nil   = nil
-** Processing line: ~    i_am_false = false~
+            args.state.held_item[:ordinal_x] = craft_area[:ordinal_x]
+** Processing line: ~            args.state.held_item[:ordinal_y] = craft_area[:ordinal_y]~
 - Inside source: true
 *** True Line Result
-    i_am_false = false
-** Processing line: ~    i_am_hi    = "hi"~
+            args.state.held_item[:ordinal_y] = craft_area[:ordinal_y]
+** Processing line: ~            args.state.held_item = nil~
 - Inside source: true
 *** True Line Result
-    i_am_hi    = "hi"
+            args.state.held_item = nil
+** Processing line: ~          end~
+- Inside source: true
+*** True Line Result
+          end
+** Processing line: ~        end~
+- Inside source: true
+*** True Line Result
+        end
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~    puts "======== if statement"~
+** Processing line: ~      # if the selected area is an inventory area (as opposed to within the craft area)~
 - Inside source: true
 *** True Line Result
-    puts "======== if statement"
-** Processing line: ~    i_am_one = 1~
+      # if the selected area is an inventory area (as opposed to within the craft area)
+** Processing line: ~      elsif inventory_area~
 - Inside source: true
 *** True Line Result
-    i_am_one = 1
-** Processing line: ~    if i_am_one~
+      elsif inventory_area
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-    if i_am_one
-** Processing line: ~      puts "This was printed because i_am_one is truthy."~
+
+** Processing line: ~        # check to see if there is already an item in that inventory slot~
 - Inside source: true
 *** True Line Result
-      puts "This was printed because i_am_one is truthy."
-** Processing line: ~    end~
+        # check to see if there is already an item in that inventory slot
+** Processing line: ~        # the item_at_inventory_slot helper method returns an item or nil~
 - Inside source: true
 *** True Line Result
-    end
+        # the item_at_inventory_slot helper method returns an item or nil
+** Processing line: ~        item_already_there = item_at_inventory_slot args, inventory_area[:ordinal_x], inventory_area[:ordinal_y]~
+- Inside source: true
+*** True Line Result
+        item_already_there = item_at_inventory_slot args, inventory_area[:ordinal_x], inventory_area[:ordinal_y]
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~    puts "======== if/else statement"~
+** Processing line: ~        # if there is already an item there, and the item types/id match~
 - Inside source: true
 *** True Line Result
-    puts "======== if/else statement"
-** Processing line: ~    if i_am_false~
+        # if there is already an item there, and the item types/id match
+** Processing line: ~        if item_already_there && item_already_there[:id] == args.state.held_item[:id]~
 - Inside source: true
 *** True Line Result
-    if i_am_false
-** Processing line: ~      puts "This will NOT get printed because i_am_false is false."~
+        if item_already_there && item_already_there[:id] == args.state.held_item[:id]
+** Processing line: ~          # then merge the item quantities~
 - Inside source: true
 *** True Line Result
-      puts "This will NOT get printed because i_am_false is false."
-** Processing line: ~    else~
+          # then merge the item quantities
+** Processing line: ~          held_quantity = args.state.held_item[:quantity]~
 - Inside source: true
 *** True Line Result
-    else
-** Processing line: ~      puts "This was printed because i_am_false is false."~
+          held_quantity = args.state.held_item[:quantity]
+** Processing line: ~          item_already_there[:quantity] += held_quantity~
 - Inside source: true
 *** True Line Result
-      puts "This was printed because i_am_false is false."
-** Processing line: ~    end~
+          item_already_there[:quantity] += held_quantity
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-    end
+
+** Processing line: ~          # remove the item being held from the items collection (since it's quantity is now 0)~
+- Inside source: true
+*** True Line Result
+          # remove the item being held from the items collection (since it's quantity is now 0)
+** Processing line: ~          args.state.items.reject! { |i| i[:location] == :held }~
+- Inside source: true
+*** True Line Result
+          args.state.items.reject! { |i| i[:location] == :held }
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~    puts "======== if/elsif/else statement"~
+** Processing line: ~          # nil out the held_item so a new item can be picked up~
 - Inside source: true
 *** True Line Result
-    puts "======== if/elsif/else statement"
-** Processing line: ~    if i_am_false~
+          # nil out the held_item so a new item can be picked up
+** Processing line: ~          args.state.held_item = nil~
 - Inside source: true
 *** True Line Result
-    if i_am_false
-** Processing line: ~      puts "This will NOT get printed because i_am_false is false."~
+          args.state.held_item = nil
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-      puts "This will NOT get printed because i_am_false is false."
-** Processing line: ~    elsif i_am_true~
+
+** Processing line: ~        # if there currently isn't an item there, then put the held item in the slot~
 - Inside source: true
 *** True Line Result
-    elsif i_am_true
-** Processing line: ~      puts "This was printed because i_am_true is true."~
+        # if there currently isn't an item there, then put the held item in the slot
+** Processing line: ~        elsif !item_already_there~
 - Inside source: true
 *** True Line Result
-      puts "This was printed because i_am_true is true."
-** Processing line: ~    else~
+        elsif !item_already_there
+** Processing line: ~          args.state.held_item[:location] = :inventory~
 - Inside source: true
 *** True Line Result
-    else
-** Processing line: ~      puts "This will NOT get printed i_am_true was true."~
+          args.state.held_item[:location] = :inventory
+** Processing line: ~          args.state.held_item[:ordinal_x] = inventory_area[:ordinal_x]~
 - Inside source: true
 *** True Line Result
-      puts "This will NOT get printed i_am_true was true."
-** Processing line: ~    end~
+          args.state.held_item[:ordinal_x] = inventory_area[:ordinal_x]
+** Processing line: ~          args.state.held_item[:ordinal_y] = inventory_area[:ordinal_y]~
 - Inside source: true
 *** True Line Result
-    end
+          args.state.held_item[:ordinal_y] = inventory_area[:ordinal_y]
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~    puts "======== case statement "~
+** Processing line: ~          # nil out the held_item so a new item can be picked up~
 - Inside source: true
 *** True Line Result
-    puts "======== case statement "
-** Processing line: ~    i_am_one = 1~
+          # nil out the held_item so a new item can be picked up
+** Processing line: ~          args.state.held_item = nil~
 - Inside source: true
 *** True Line Result
-    i_am_one = 1
-** Processing line: ~    case i_am_one~
+          args.state.held_item = nil
+** Processing line: ~        end~
 - Inside source: true
 *** True Line Result
-    case i_am_one
-** Processing line: ~    when 10~
+        end
+** Processing line: ~      end~
 - Inside source: true
 *** True Line Result
-    when 10
-** Processing line: ~      puts "case equaled: 10"~
+      end
+** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
-      puts "case equaled: 10"
-** Processing line: ~    when 9~
+    end
+** Processing line: ~  end~
 - Inside source: true
 *** True Line Result
-    when 9
-** Processing line: ~      puts "case equaled: 9"~
+  end
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-      puts "case equaled: 9"
-** Processing line: ~    when 5~
+
+** Processing line: ~  # the calc method is executed after input~
 - Inside source: true
 *** True Line Result
-    when 5
-** Processing line: ~      puts "case equaled: 5"~
+  # the calc method is executed after input
+** Processing line: ~  def calc args~
 - Inside source: true
 *** True Line Result
-      puts "case equaled: 5"
-** Processing line: ~    when 1~
+  def calc args
+** Processing line: ~    # make sure that the real position of the inventory~
 - Inside source: true
 *** True Line Result
-    when 1
-** Processing line: ~      puts "case equaled: 1"~
+    # make sure that the real position of the inventory
+** Processing line: ~    # items are updated every frame to ensure that they~
 - Inside source: true
 *** True Line Result
-      puts "case equaled: 1"
-** Processing line: ~    else~
+    # items are updated every frame to ensure that they
+** Processing line: ~    # are placed correctly given their location and oridinal positions~
 - Inside source: true
 *** True Line Result
-    else
-** Processing line: ~      puts "Value wasn't cased."~
+    # are placed correctly given their location and oridinal positions
+** Processing line: ~    # instead of using .map, here we use .each (since we are not returning a new item and just updating the items in place)~
 - Inside source: true
 *** True Line Result
-      puts "Value wasn't cased."
-** Processing line: ~    end~
+    # instead of using .map, here we use .each (since we are not returning a new item and just updating the items in place)
+** Processing line: ~    args.state.items.each do |item|~
 - Inside source: true
 *** True Line Result
-    end
-** Processing line: ~~
+    args.state.items.each do |item|
+** Processing line: ~      # based on the location of the item, invoke the correct pixel conversion method~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~    puts "======== different types of comparisons"~
+      # based on the location of the item, invoke the correct pixel conversion method
+** Processing line: ~      if item[:location] == :inventory~
 - Inside source: true
 *** True Line Result
-    puts "======== different types of comparisons"
-** Processing line: ~    if 4 == 4~
+      if item[:location] == :inventory
+** Processing line: ~        set_inventory_position args, item~
 - Inside source: true
 *** True Line Result
-    if 4 == 4
-** Processing line: ~      puts "equal (4 == 4)"~
+        set_inventory_position args, item
+** Processing line: ~      elsif item[:location] == :craft~
 - Inside source: true
 *** True Line Result
-      puts "equal (4 == 4)"
-** Processing line: ~    end~
+      elsif item[:location] == :craft
+** Processing line: ~        set_craft_position args, item~
 - Inside source: true
 *** True Line Result
-    end
-** Processing line: ~~
+        set_craft_position args, item
+** Processing line: ~      elsif item[:location] == :held~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~    if 4 != 3~
+      elsif item[:location] == :held
+** Processing line: ~        # if the item is held, center the item around the mouse pointer~
 - Inside source: true
 *** True Line Result
-    if 4 != 3
-** Processing line: ~      puts "not equal (4 != 3)"~
+        # if the item is held, center the item around the mouse pointer
+** Processing line: ~        args.state.held_item.x = args.inputs.mouse.x - args.state.held_item.w.half~
+- Inside source: true
+*** True Line Result
+        args.state.held_item.x = args.inputs.mouse.x - args.state.held_item.w.half
+** Processing line: ~        args.state.held_item.y = args.inputs.mouse.y - args.state.held_item.h.half~
+- Inside source: true
+*** True Line Result
+        args.state.held_item.y = args.inputs.mouse.y - args.state.held_item.h.half
+** Processing line: ~      end~
 - Inside source: true
 *** True Line Result
-      puts "not equal (4 != 3)"
+      end
 ** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
@@ -100719,46 +102299,50 @@ Follows is a source code listing for all files that have been open sourced. This
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~    if 3 < 4~
+** Processing line: ~    # for each hash/sprite in the click ripples queue,~
 - Inside source: true
 *** True Line Result
-    if 3 < 4
-** Processing line: ~      puts "less than (3 < 4)"~
+    # for each hash/sprite in the click ripples queue,
+** Processing line: ~    # expand its size by 20 percent and decrease its alpha~
 - Inside source: true
 *** True Line Result
-      puts "less than (3 < 4)"
-** Processing line: ~    end~
+    # expand its size by 20 percent and decrease its alpha
+** Processing line: ~    # by 10.~
 - Inside source: true
 *** True Line Result
-    end
-** Processing line: ~~
+    # by 10.
+** Processing line: ~    args.state.click_ripples.each do |ripple|~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~    if 4 > 3~
+    args.state.click_ripples.each do |ripple|
+** Processing line: ~      delta_w = ripple.w * 1.2 - ripple.w~
 - Inside source: true
 *** True Line Result
-    if 4 > 3
-** Processing line: ~      puts "greater than (4 > 3)"~
+      delta_w = ripple.w * 1.2 - ripple.w
+** Processing line: ~      delta_h = ripple.h * 1.2 - ripple.h~
 - Inside source: true
 *** True Line Result
-      puts "greater than (4 > 3)"
-** Processing line: ~    end~
+      delta_h = ripple.h * 1.2 - ripple.h
+** Processing line: ~      ripple.x -= delta_w.half~
 - Inside source: true
 *** True Line Result
-    end
-** Processing line: ~~
+      ripple.x -= delta_w.half
+** Processing line: ~      ripple.y -= delta_h.half~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~    if ((4 > 3) || (3 < 4) || false)~
+      ripple.y -= delta_h.half
+** Processing line: ~      ripple.w += delta_w~
 - Inside source: true
 *** True Line Result
-    if ((4 > 3) || (3 < 4) || false)
-** Processing line: ~      puts "or statement ((4 > 3) || (3 < 4) || false)"~
+      ripple.w += delta_w
+** Processing line: ~      ripple.h += delta_h~
+- Inside source: true
+*** True Line Result
+      ripple.h += delta_h
+** Processing line: ~      ripple.a -= 10~
 - Inside source: true
 *** True Line Result
-      puts "or statement ((4 > 3) || (3 < 4) || false)"
+      ripple.a -= 10
 ** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
@@ -100767,18 +102351,22 @@ Follows is a source code listing for all files that have been open sourced. This
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~    if ((4 > 3) && (3 < 4))~
+** Processing line: ~    # remove any items from the collection where the alpha value is less than equal to~
 - Inside source: true
 *** True Line Result
-    if ((4 > 3) && (3 < 4))
-** Processing line: ~      puts "and statement ((4 > 3) && (3 < 4))"~
+    # remove any items from the collection where the alpha value is less than equal to
+** Processing line: ~    # zero using the reject! method (reject with an exclamation point at the end changes the~
 - Inside source: true
 *** True Line Result
-      puts "and statement ((4 > 3) && (3 < 4))"
-** Processing line: ~    end~
+    # zero using the reject! method (reject with an exclamation point at the end changes the
+** Processing line: ~    # array value in place, while reject without the exclamation point returns a new array).~
 - Inside source: true
 *** True Line Result
-    end
+    # array value in place, while reject without the exclamation point returns a new array).
+** Processing line: ~    args.state.click_ripples.reject! { |ripple| ripple.a <= 0 }~
+- Inside source: true
+*** True Line Result
+    args.state.click_ripples.reject! { |ripple| ripple.a <= 0 }
 ** Processing line: ~  end~
 - Inside source: true
 *** True Line Result
@@ -100787,146 +102375,162 @@ Follows is a source code listing for all files that have been open sourced. This
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~  # ====================================================================================~
+** Processing line: ~  # helper function for finding an item at a craft slot~
 - Inside source: true
 *** True Line Result
-  # ====================================================================================
-** Processing line: ~  # Looping~
+  # helper function for finding an item at a craft slot
+** Processing line: ~  def item_at_craft_slot args, ordinal_x, ordinal_y~
 - Inside source: true
 *** True Line Result
-  # Looping
-** Processing line: ~  # ====================================================================================~
+  def item_at_craft_slot args, ordinal_x, ordinal_y
+** Processing line: ~    args.state.items.find { |i| i[:location] == :craft && i[:ordinal_x] == ordinal_x && i[:ordinal_y] == ordinal_y }~
 - Inside source: true
 *** True Line Result
-  # ====================================================================================
-** Processing line: ~  # Remove the x from xrepl to run the code. Add the x back to ignore to code.~
+    args.state.items.find { |i| i[:location] == :craft && i[:ordinal_x] == ordinal_x && i[:ordinal_y] == ordinal_y }
+** Processing line: ~  end~
 - Inside source: true
 *** True Line Result
-  # Remove the x from xrepl to run the code. Add the x back to ignore to code.
-** Processing line: ~  xrepl do~
+  end
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-  xrepl do
-** Processing line: ~    puts "======== times block"~
+
+** Processing line: ~  # helper function for finding an item at an inventory slot~
 - Inside source: true
 *** True Line Result
-    puts "======== times block"
-** Processing line: ~    3.times do |i|~
+  # helper function for finding an item at an inventory slot
+** Processing line: ~  def item_at_inventory_slot args, ordinal_x, ordinal_y~
 - Inside source: true
 *** True Line Result
-    3.times do |i|
-** Processing line: ~      puts i~
+  def item_at_inventory_slot args, ordinal_x, ordinal_y
+** Processing line: ~    args.state.items.find { |i| i[:location] == :inventory && i[:ordinal_x] == ordinal_x && i[:ordinal_y] == ordinal_y }~
 - Inside source: true
 *** True Line Result
-      puts i
-** Processing line: ~    end~
+    args.state.items.find { |i| i[:location] == :inventory && i[:ordinal_x] == ordinal_x && i[:ordinal_y] == ordinal_y }
+** Processing line: ~  end~
 - Inside source: true
 *** True Line Result
-    end
-** Processing line: ~    puts "======== range block exclusive"~
+  end
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-    puts "======== range block exclusive"
-** Processing line: ~    (0...3).each do |i|~
+
+** Processing line: ~  # helper function that creates a visual representation of an item~
 - Inside source: true
 *** True Line Result
-    (0...3).each do |i|
-** Processing line: ~      puts i~
+  # helper function that creates a visual representation of an item
+** Processing line: ~  def item_prefab args, item, should_highlight, mouse~
 - Inside source: true
 *** True Line Result
-      puts i
-** Processing line: ~    end~
+  def item_prefab args, item, should_highlight, mouse
+** Processing line: ~    return nil unless item~
 - Inside source: true
 *** True Line Result
-    end
-** Processing line: ~    puts "======== range block inclusive"~
+    return nil unless item
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-    puts "======== range block inclusive"
-** Processing line: ~    (0..3).each do |i|~
+
+** Processing line: ~    overlay = nil~
 - Inside source: true
 *** True Line Result
-    (0..3).each do |i|
-** Processing line: ~      puts i~
+    overlay = nil
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-      puts i
-** Processing line: ~    end~
+
+** Processing line: ~    x = item.x~
 - Inside source: true
 *** True Line Result
-    end
-** Processing line: ~  end~
+    x = item.x
+** Processing line: ~    y = item.y~
 - Inside source: true
 *** True Line Result
-  end
+    y = item.y
+** Processing line: ~    w = item.w~
+- Inside source: true
+*** True Line Result
+    w = item.w
+** Processing line: ~    h = item.h~
+- Inside source: true
+*** True Line Result
+    h = item.h
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~  # ====================================================================================~
+** Processing line: ~    if should_highlight && mouse.point.inside_rect?(item)~
 - Inside source: true
 *** True Line Result
-  # ====================================================================================
-** Processing line: ~  #  Enumerables~
+    if should_highlight && mouse.point.inside_rect?(item)
+** Processing line: ~      overlay = { x: x, y: y, w: w, h: h, path: "sprites/square-blue.png", a: 130, }~
 - Inside source: true
 *** True Line Result
-  #  Enumerables
-** Processing line: ~  # ====================================================================================~
+      overlay = { x: x, y: y, w: w, h: h, path: "sprites/square-blue.png", a: 130, }
+** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
-  # ====================================================================================
-** Processing line: ~  # Remove the x from xrepl to run the code. Add the x back to ignore to code.~
+    end
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-  # Remove the x from xrepl to run the code. Add the x back to ignore to code.
-** Processing line: ~  xrepl do~
+
+** Processing line: ~    [~
 - Inside source: true
 *** True Line Result
-  xrepl do
-** Processing line: ~    puts "======== array each"~
+    [
+** Processing line: ~      # sprites are hashes with a path property, this is the main sprite~
 - Inside source: true
 *** True Line Result
-    puts "======== array each"
-** Processing line: ~    colors = ["red", "blue", "yellow"]~
+      # sprites are hashes with a path property, this is the main sprite
+** Processing line: ~      { x: x,      y: y, w: args.state.sprite_size, h: args.state.sprite_size, path: item[:path], },~
 - Inside source: true
 *** True Line Result
-    colors = ["red", "blue", "yellow"]
-** Processing line: ~    colors.each do |color|~
+      { x: x,      y: y, w: args.state.sprite_size, h: args.state.sprite_size, path: item[:path], },
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-    colors.each do |color|
-** Processing line: ~      puts color~
+
+** Processing line: ~      # this represents the black area in the bottom right corner of the main sprite so that the~
 - Inside source: true
 *** True Line Result
-      puts color
-** Processing line: ~    end~
+      # this represents the black area in the bottom right corner of the main sprite so that the
+** Processing line: ~      # quantity is visible~
 - Inside source: true
 *** True Line Result
-    end
+      # quantity is visible
+** Processing line: ~      { x: x + 55, y: y, w: 25, h: 25, path: "sprites/square-black.png", }, # sprites are hashes with a path property~
+- Inside source: true
+*** True Line Result
+      { x: x + 55, y: y, w: 25, h: 25, path: "sprites/square-black.png", }, # sprites are hashes with a path property
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~    puts '======== array each_with_index'~
+** Processing line: ~      # labels are hashes with a text property~
 - Inside source: true
 *** True Line Result
-    puts '======== array each_with_index'
-** Processing line: ~    colors = ["red", "blue", "yellow"]~
+      # labels are hashes with a text property
+** Processing line: ~      { x: x + 56, y: y + 22, text: "#{item[:quantity]}", r: 255, g: 255, b: 255, },~
 - Inside source: true
 *** True Line Result
-    colors = ["red", "blue", "yellow"]
-** Processing line: ~    colors.each_with_index do |color, i|~
+      { x: x + 56, y: y + 22, text: "#{item[:quantity]}", r: 255, g: 255, b: 255, },
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-    colors.each_with_index do |color, i|
-** Processing line: ~      puts "#{color} at index #{i}"~
+
+** Processing line: ~      # this is the mouse overlay, if the overlay isn't applicable, then this value will be nil (nil values will not be rendered)~
 - Inside source: true
 *** True Line Result
-      puts "#{color} at index #{i}"
-** Processing line: ~    end~
+      # this is the mouse overlay, if the overlay isn't applicable, then this value will be nil (nil values will not be rendered)
+** Processing line: ~      overlay~
 - Inside source: true
 *** True Line Result
-    end
+      overlay
+** Processing line: ~    ]~
+- Inside source: true
+*** True Line Result
+    ]
 ** Processing line: ~  end~
 - Inside source: true
 *** True Line Result
@@ -100935,434 +102539,446 @@ Follows is a source code listing for all files that have been open sourced. This
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~  # Remove the x from xrepl to run the code. Add the x back to ignore to code.~
-- Inside source: true
-*** True Line Result
-  # Remove the x from xrepl to run the code. Add the x back to ignore to code.
-** Processing line: ~  xrepl do~
+** Processing line: ~  # helper function for deriving the position of an item within inventory~
 - Inside source: true
 *** True Line Result
-  xrepl do
-** Processing line: ~    puts "======== single parameter function"~
+  # helper function for deriving the position of an item within inventory
+** Processing line: ~  def set_inventory_position args, item~
 - Inside source: true
 *** True Line Result
-    puts "======== single parameter function"
-** Processing line: ~    def add_one_to n~
+  def set_inventory_position args, item
+** Processing line: ~    item.x = args.state.inventory_border.x + item[:ordinal_x] * 80~
 - Inside source: true
 *** True Line Result
-    def add_one_to n
-** Processing line: ~      n + 5~
+    item.x = args.state.inventory_border.x + item[:ordinal_x] * 80
+** Processing line: ~    item.y = (args.state.inventory_border.y + args.state.inventory_border.h - 80) - item[:ordinal_y] * 80~
 - Inside source: true
 *** True Line Result
-      n + 5
-** Processing line: ~    end~
+    item.y = (args.state.inventory_border.y + args.state.inventory_border.h - 80) - item[:ordinal_y] * 80
+** Processing line: ~    item.w = 80~
 - Inside source: true
 *** True Line Result
-    end
-** Processing line: ~~
+    item.w = 80
+** Processing line: ~    item.h = 80~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~    puts add_one_to(3)~
+    item.h = 80
+** Processing line: ~  end~
 - Inside source: true
 *** True Line Result
-    puts add_one_to(3)
+  end
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~    puts "======== function with default value"~
+** Processing line: ~  # helper function for deriving the position of an item within the craft area~
 - Inside source: true
 *** True Line Result
-    puts "======== function with default value"
-** Processing line: ~    def function_with_default_value v = 10~
+  # helper function for deriving the position of an item within the craft area
+** Processing line: ~  def set_craft_position args, item~
 - Inside source: true
 *** True Line Result
-    def function_with_default_value v = 10
-** Processing line: ~      v * 10~
+  def set_craft_position args, item
+** Processing line: ~    item.x = args.state.craft_border.x + item[:ordinal_x] * 80~
 - Inside source: true
 *** True Line Result
-      v * 10
-** Processing line: ~    end~
+    item.x = args.state.craft_border.x + item[:ordinal_x] * 80
+** Processing line: ~    item.y = (args.state.craft_border.y + args.state.inventory_border.h - 80) - item[:ordinal_y] * 80~
 - Inside source: true
 *** True Line Result
-    end
-** Processing line: ~~
+    item.y = (args.state.craft_border.y + args.state.inventory_border.h - 80) - item[:ordinal_y] * 80
+** Processing line: ~    item.w = 80~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~    puts "passing three: #{function_with_default_value(3)}"~
+    item.w = 80
+** Processing line: ~    item.h = 80~
 - Inside source: true
 *** True Line Result
-    puts "passing three: #{function_with_default_value(3)}"
-** Processing line: ~    puts "passing nil: #{function_with_default_value}"~
+    item.h = 80
+** Processing line: ~  end~
 - Inside source: true
 *** True Line Result
-    puts "passing nil: #{function_with_default_value}"
+  end
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~    puts "======== Or Equal (||=) operator for nil values"~
-- Inside source: true
-*** True Line Result
-    puts "======== Or Equal (||=) operator for nil values"
-** Processing line: ~    def function_with_nil_default_with_local a = nil~
+** Processing line: ~  # Any lines outside of a function will be executed when the file is reloaded.~
 - Inside source: true
 *** True Line Result
-    def function_with_nil_default_with_local a = nil
-** Processing line: ~      result   = a~
+  # Any lines outside of a function will be executed when the file is reloaded.
+** Processing line: ~  # So every time you save main.rb, the game will be reset.~
 - Inside source: true
 *** True Line Result
-      result   = a
-** Processing line: ~      result ||= "or equal operator was exected and set a default value"~
+  # So every time you save main.rb, the game will be reset.
+** Processing line: ~  # Comment out the line below if you don't want this to happen.~
 - Inside source: true
 *** True Line Result
-      result ||= "or equal operator was exected and set a default value"
-** Processing line: ~    end~
+  # Comment out the line below if you don't want this to happen.
+** Processing line: ~  $gtk.reset~
 - Inside source: true
 *** True Line Result
-    end
+  $gtk.reset
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~    puts "passing 'hi': #{function_with_nil_default_with_local 'hi'}"~
-- Inside source: true
+** Processing line: ~#+end_src~
+- Line was identified as the end of a code block.
 *** True Line Result
-    puts "passing 'hi': #{function_with_nil_default_with_local 'hi'}"
-** Processing line: ~    puts "passing nil: #{function_with_nil_default_with_local}"~
-- Inside source: true
+#+end_src
+** Processing line: ~~
+- End of paragraph detected.
 *** True Line Result
-    puts "passing nil: #{function_with_nil_default_with_local}"
-** Processing line: ~  end~
-- Inside source: true
+
+** Processing line: ~*** Crafting - Farming Game Starting Point - main.rb~
+- Header detected.
 *** True Line Result
-  end
-** Processing line: ~~
-- Inside source: true
+
+*** True Line Result
+*** Crafting - Farming Game Starting Point - main.rb
+** Processing line: ~#+begin_src ruby~
+- Line was identified as the beginning of a code block.
 *** True Line Result
 
-** Processing line: ~  # ====================================================================================~
+*** True Line Result
+#+begin_src ruby
+** Processing line: ~  # ./samples/99_genre_crafting/farming_game_starting_point/app/main.rb~
 - Inside source: true
 *** True Line Result
-  # ====================================================================================
-** Processing line: ~  #  Arrays~
+  # ./samples/99_genre_crafting/farming_game_starting_point/app/main.rb
+** Processing line: ~  def tick args~
 - Inside source: true
 *** True Line Result
-  #  Arrays
-** Processing line: ~  # ====================================================================================~
+  def tick args
+** Processing line: ~    args.state.tile_size     = 80~
 - Inside source: true
 *** True Line Result
-  # ====================================================================================
-** Processing line: ~  # Remove the x from xrepl to run the code. Add the x back to ignore to code.~
+    args.state.tile_size     = 80
+** Processing line: ~    args.state.player_speed  = 4~
 - Inside source: true
 *** True Line Result
-  # Remove the x from xrepl to run the code. Add the x back to ignore to code.
-** Processing line: ~  xrepl do~
+    args.state.player_speed  = 4
+** Processing line: ~    args.state.player      ||= tile(args, 7, 3, 0, 128, 180)~
 - Inside source: true
 *** True Line Result
-  xrepl do
-** Processing line: ~    puts "======== Create an array with the numbers 1 to 10."~
+    args.state.player      ||= tile(args, 7, 3, 0, 128, 180)
+** Processing line: ~    generate_map args~
 - Inside source: true
 *** True Line Result
-    puts "======== Create an array with the numbers 1 to 10."
-** Processing line: ~    one_to_ten = (1..10).to_a~
+    generate_map args
+** Processing line: ~    #press j to plant a green onion~
 - Inside source: true
 *** True Line Result
-    one_to_ten = (1..10).to_a
-** Processing line: ~    puts one_to_ten~
+    #press j to plant a green onion
+** Processing line: ~    if args.inputs.keyboard.j~
 - Inside source: true
 *** True Line Result
-    puts one_to_ten
-** Processing line: ~~
+    if args.inputs.keyboard.j
+** Processing line: ~    #change this part you can change what you want to plant~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~    puts "======== Create a new array that only contains even numbers from the previous array."~
+    #change this part you can change what you want to plant
+** Processing line: ~     args.state.walls << tile(args, ((args.state.player.x+80)/args.state.tile_size), ((args.state.player.y)/args.state.tile_size), 255, 255, 255)~
 - Inside source: true
 *** True Line Result
-    puts "======== Create a new array that only contains even numbers from the previous array."
-** Processing line: ~    one_to_ten = (1..10).to_a~
+     args.state.walls << tile(args, ((args.state.player.x+80)/args.state.tile_size), ((args.state.player.y)/args.state.tile_size), 255, 255, 255)
+** Processing line: ~     args.state.plants << tile(args, ((args.state.player.x+80)/args.state.tile_size), ((args.state.player.y+80)/args.state.tile_size), 0, 160, 0)~
 - Inside source: true
 *** True Line Result
-    one_to_ten = (1..10).to_a
-** Processing line: ~    evens = one_to_ten.find_all do |number|~
+     args.state.plants << tile(args, ((args.state.player.x+80)/args.state.tile_size), ((args.state.player.y+80)/args.state.tile_size), 0, 160, 0)
+** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
-    evens = one_to_ten.find_all do |number|
-** Processing line: ~      number % 2 == 0~
+    end
+** Processing line: ~    # Adds walls, background, and player to args.outputs.solids so they appear on screen~
 - Inside source: true
 *** True Line Result
-      number % 2 == 0
-** Processing line: ~    end~
+    # Adds walls, background, and player to args.outputs.solids so they appear on screen
+** Processing line: ~    args.outputs.solids << [0,0,1280,720, 237,189,101]~
 - Inside source: true
 *** True Line Result
-    end
-** Processing line: ~    puts evens~
+    args.outputs.solids << [0,0,1280,720, 237,189,101]
+** Processing line: ~    args.outputs.sprites << [0, 0, 1280, 720, 'sprites/background.png']~
 - Inside source: true
 *** True Line Result
-    puts evens
-** Processing line: ~~
+    args.outputs.sprites << [0, 0, 1280, 720, 'sprites/background.png']
+** Processing line: ~    args.outputs.solids << args.state.walls~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~    puts "======== Create a new array that rejects odd numbers."~
+    args.outputs.solids << args.state.walls
+** Processing line: ~    args.outputs.solids << args.state.player~
 - Inside source: true
 *** True Line Result
-    puts "======== Create a new array that rejects odd numbers."
-** Processing line: ~    one_to_ten = (1..10).to_a~
+    args.outputs.solids << args.state.player
+** Processing line: ~    args.outputs.solids << args.state.plants~
 - Inside source: true
 *** True Line Result
-    one_to_ten = (1..10).to_a
-** Processing line: ~    also_even = one_to_ten.reject do |number|~
+    args.outputs.solids << args.state.plants
+** Processing line: ~    args.outputs.labels << [320, 640, "press J to plant", 3, 1, 255, 0, 0, 200]~
 - Inside source: true
 *** True Line Result
-    also_even = one_to_ten.reject do |number|
-** Processing line: ~      number % 2 != 0~
+    args.outputs.labels << [320, 640, "press J to plant", 3, 1, 255, 0, 0, 200]
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-      number % 2 != 0
-** Processing line: ~    end~
+
+** Processing line: ~    move_player args, -1,  0 if args.inputs.keyboard.left # x position decreases by 1 if left key is pressed~
 - Inside source: true
 *** True Line Result
-    end
-** Processing line: ~    puts also_even~
+    move_player args, -1,  0 if args.inputs.keyboard.left # x position decreases by 1 if left key is pressed
+** Processing line: ~    move_player args,  1,  0 if args.inputs.keyboard.right # x position increases by 1 if right key is pressed~
 - Inside source: true
 *** True Line Result
-    puts also_even
-** Processing line: ~~
+    move_player args,  1,  0 if args.inputs.keyboard.right # x position increases by 1 if right key is pressed
+** Processing line: ~    move_player args,  0,  1 if args.inputs.keyboard.up # y position increases by 1 if up is pressed~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~    puts "======== Create an array that doubles every number."~
+    move_player args,  0,  1 if args.inputs.keyboard.up # y position increases by 1 if up is pressed
+** Processing line: ~    move_player args,  0, -1 if args.inputs.keyboard.down # y position decreases by 1 if down is pressed~
 - Inside source: true
 *** True Line Result
-    puts "======== Create an array that doubles every number."
-** Processing line: ~    one_to_ten = (1..10).to_a~
+    move_player args,  0, -1 if args.inputs.keyboard.down # y position decreases by 1 if down is pressed
+** Processing line: ~  end~
 - Inside source: true
 *** True Line Result
-    one_to_ten = (1..10).to_a
-** Processing line: ~    doubled = one_to_ten.map do |number|~
+  end
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-    doubled = one_to_ten.map do |number|
-** Processing line: ~      number * 2~
+
+** Processing line: ~  # Sets position, size, and color of the tile~
 - Inside source: true
 *** True Line Result
-      number * 2
-** Processing line: ~    end~
+  # Sets position, size, and color of the tile
+** Processing line: ~  def tile args, x, y, *color~
 - Inside source: true
 *** True Line Result
-    end
-** Processing line: ~    puts doubled~
+  def tile args, x, y, *color
+** Processing line: ~    [x * args.state.tile_size, # sets definition for array using method parameters~
 - Inside source: true
 *** True Line Result
-    puts doubled
-** Processing line: ~~
+    [x * args.state.tile_size, # sets definition for array using method parameters
+** Processing line: ~     y * args.state.tile_size, # multiplying by tile_size sets x and y to correct position using pixel values~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~    puts "======== Create an array that selects only odd numbers and then multiply those by 10."~
+     y * args.state.tile_size, # multiplying by tile_size sets x and y to correct position using pixel values
+** Processing line: ~     args.state.tile_size,~
 - Inside source: true
 *** True Line Result
-    puts "======== Create an array that selects only odd numbers and then multiply those by 10."
-** Processing line: ~    one_to_ten = (1..10).to_a~
+     args.state.tile_size,
+** Processing line: ~     args.state.tile_size,~
 - Inside source: true
 *** True Line Result
-    one_to_ten = (1..10).to_a
-** Processing line: ~    odd_doubled = one_to_ten.find_all do |number|~
+     args.state.tile_size,
+** Processing line: ~     *color]~
 - Inside source: true
 *** True Line Result
-    odd_doubled = one_to_ten.find_all do |number|
-** Processing line: ~      number % 2 != 0~
+     *color]
+** Processing line: ~  end~
 - Inside source: true
 *** True Line Result
-      number % 2 != 0
-** Processing line: ~    end.map do |odd_number|~
+  end
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-    end.map do |odd_number|
-** Processing line: ~      odd_number * 10~
+
+** Processing line: ~  # Creates map by adding tiles to the wall, as well as a goal (that the player needs to reach)~
 - Inside source: true
 *** True Line Result
-      odd_number * 10
-** Processing line: ~    end~
+  # Creates map by adding tiles to the wall, as well as a goal (that the player needs to reach)
+** Processing line: ~  def generate_map args~
 - Inside source: true
 *** True Line Result
-    end
-** Processing line: ~    puts odd_doubled~
+  def generate_map args
+** Processing line: ~    return if args.state.area~
 - Inside source: true
 *** True Line Result
-    puts odd_doubled
+    return if args.state.area
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~    puts "======== All combination of numbers 1 to 10."~
+** Processing line: ~    # Creates the area of the map. There are 9 rows running horizontally across the screen~
 - Inside source: true
 *** True Line Result
-    puts "======== All combination of numbers 1 to 10."
-** Processing line: ~    one_to_ten = (1..10).to_a~
+    # Creates the area of the map. There are 9 rows running horizontally across the screen
+** Processing line: ~    # and 16 columns running vertically on the screen. Any spot with a "1" is not~
 - Inside source: true
 *** True Line Result
-    one_to_ten = (1..10).to_a
-** Processing line: ~    all_combinations = one_to_ten.product(one_to_ten)~
+    # and 16 columns running vertically on the screen. Any spot with a "1" is not
+** Processing line: ~    # open for the player to move into (and is green), and any spot with a "0" is available~
 - Inside source: true
 *** True Line Result
-    all_combinations = one_to_ten.product(one_to_ten)
-** Processing line: ~    puts all_combinations~
+    # open for the player to move into (and is green), and any spot with a "0" is available
+** Processing line: ~    # for the player to move in.~
 - Inside source: true
 *** True Line Result
-    puts all_combinations
-** Processing line: ~~
+    # for the player to move in.
+** Processing line: ~    args.state.area = [~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~    puts "======== All uniq combinations of numbers. For example: [1, 2] is the same as [2, 1]."~
+    args.state.area = [
+** Processing line: ~      [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,],~
 - Inside source: true
 *** True Line Result
-    puts "======== All uniq combinations of numbers. For example: [1, 2] is the same as [2, 1]."
-** Processing line: ~    one_to_ten = (1..10).to_a~
+      [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,],
+** Processing line: ~      [1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1,],~
 - Inside source: true
 *** True Line Result
-    one_to_ten = (1..10).to_a
-** Processing line: ~    uniq_combinations =~
+      [1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1,],
+** Processing line: ~      [1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1,],~
 - Inside source: true
 *** True Line Result
-    uniq_combinations =
-** Processing line: ~      one_to_ten.product(one_to_ten)~
+      [1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1,],
+** Processing line: ~      [1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1,],~
 - Inside source: true
 *** True Line Result
-      one_to_ten.product(one_to_ten)
-** Processing line: ~        .map do |unsorted_number|~
+      [1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1,],
+** Processing line: ~      [1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1,],~
 - Inside source: true
 *** True Line Result
-        .map do |unsorted_number|
-** Processing line: ~      unsorted_number.sort~
+      [1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1,],
+** Processing line: ~      [1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1,],~
 - Inside source: true
 *** True Line Result
-      unsorted_number.sort
-** Processing line: ~    end.uniq~
+      [1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1,],
+** Processing line: ~      [1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1,],~
 - Inside source: true
 *** True Line Result
-    end.uniq
-** Processing line: ~    puts uniq_combinations~
+      [1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1,],
+** Processing line: ~      [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,],~
 - Inside source: true
 *** True Line Result
-    puts uniq_combinations
-** Processing line: ~  end~
+      [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,],
+** Processing line: ~      [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 ],~
 - Inside source: true
 *** True Line Result
-  end
+      [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 ],
+** Processing line: ~    ].reverse # reverses the order of the area collection~
+- Inside source: true
+*** True Line Result
+    ].reverse # reverses the order of the area collection
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~  # ====================================================================================~
+** Processing line: ~    # By reversing the order, the way that the area appears above is how it appears~
 - Inside source: true
 *** True Line Result
-  # ====================================================================================
-** Processing line: ~  #  Advanced Arrays~
+    # By reversing the order, the way that the area appears above is how it appears
+** Processing line: ~    # on the screen in the game. If we did not reverse, the map would appear inverted.~
 - Inside source: true
 *** True Line Result
-  #  Advanced Arrays
-** Processing line: ~  # ====================================================================================~
+    # on the screen in the game. If we did not reverse, the map would appear inverted.
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-  # ====================================================================================
-** Processing line: ~  # Remove the x from xrepl to run the code. Add the x back to ignore to code.~
+
+** Processing line: ~    #The wall starts off with no tiles.~
 - Inside source: true
 *** True Line Result
-  # Remove the x from xrepl to run the code. Add the x back to ignore to code.
-** Processing line: ~  xrepl do~
+    #The wall starts off with no tiles.
+** Processing line: ~    args.state.walls = []~
 - Inside source: true
 *** True Line Result
-  xrepl do
-** Processing line: ~    puts "======== All unique Pythagorean Triples between 1 and 40 sorted by area of the triangle."~
+    args.state.walls = []
+** Processing line: ~    args.state.plants = []~
 - Inside source: true
 *** True Line Result
-    puts "======== All unique Pythagorean Triples between 1 and 40 sorted by area of the triangle."
+    args.state.plants = []
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~    one_to_hundred = (1..40).to_a~
+** Processing line: ~    # If v is 1, a green tile is added to args.state.walls.~
 - Inside source: true
 *** True Line Result
-    one_to_hundred = (1..40).to_a
-** Processing line: ~    triples =~
+    # If v is 1, a green tile is added to args.state.walls.
+** Processing line: ~    # If v is 2, a black tile is created as the goal.~
 - Inside source: true
 *** True Line Result
-    triples =
-** Processing line: ~      one_to_hundred.product(one_to_hundred).map do |width, height|~
+    # If v is 2, a black tile is created as the goal.
+** Processing line: ~    args.state.area.map_2d do |y, x, v|~
 - Inside source: true
 *** True Line Result
-      one_to_hundred.product(one_to_hundred).map do |width, height|
-** Processing line: ~      [width, height, Math.sqrt(width ** 2 + height ** 2)]~
+    args.state.area.map_2d do |y, x, v|
+** Processing line: ~      if    v == 1~
 - Inside source: true
 *** True Line Result
-      [width, height, Math.sqrt(width ** 2 + height ** 2)]
-** Processing line: ~    end.find_all do |_, _, hypotenuse|~
+      if    v == 1
+** Processing line: ~        args.state.walls << tile(args, x, y, 255, 160, 156) # green tile~
 - Inside source: true
 *** True Line Result
-    end.find_all do |_, _, hypotenuse|
-** Processing line: ~      hypotenuse.to_i == hypotenuse~
+        args.state.walls << tile(args, x, y, 255, 160, 156) # green tile
+** Processing line: ~      end~
 - Inside source: true
 *** True Line Result
-      hypotenuse.to_i == hypotenuse
-** Processing line: ~    end.map do |triangle|~
+      end
+** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
-    end.map do |triangle|
-** Processing line: ~      triangle.map(&:to_i)~
+    end
+** Processing line: ~  end~
 - Inside source: true
 *** True Line Result
-      triangle.map(&:to_i)
-** Processing line: ~    end.uniq do |triangle|~
+  end
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-    end.uniq do |triangle|
-** Processing line: ~      triangle.sort~
+
+** Processing line: ~  # Allows the player to move their box around the screen~
 - Inside source: true
 *** True Line Result
-      triangle.sort
-** Processing line: ~    end.map do |width, height, hypotenuse|~
+  # Allows the player to move their box around the screen
+** Processing line: ~  def move_player args, *vector~
 - Inside source: true
 *** True Line Result
-    end.map do |width, height, hypotenuse|
-** Processing line: ~      [width, height, hypotenuse, (width * height) / 2]~
+  def move_player args, *vector
+** Processing line: ~    box = args.state.player.shift_rect(vector) # box is able to move at an angle~
 - Inside source: true
 *** True Line Result
-      [width, height, hypotenuse, (width * height) / 2]
-** Processing line: ~    end.sort_by do |_, _, _, area|~
+    box = args.state.player.shift_rect(vector) # box is able to move at an angle
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-    end.sort_by do |_, _, _, area|
-** Processing line: ~      area~
+
+** Processing line: ~    # If the player's box hits a wall, it is not able to move further in that direction~
 - Inside source: true
 *** True Line Result
-      area
-** Processing line: ~    end~
+    # If the player's box hits a wall, it is not able to move further in that direction
+** Processing line: ~    return if args.state.walls~
 - Inside source: true
 *** True Line Result
-    end
+    return if args.state.walls
+** Processing line: ~                  .any_intersect_rect?(box)~
+- Inside source: true
+*** True Line Result
+                  .any_intersect_rect?(box)
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~    triples.each do |width, height, hypotenuse, area|~
+** Processing line: ~    # Player's box is able to move at angles (not just the four general directions) fast~
 - Inside source: true
 *** True Line Result
-    triples.each do |width, height, hypotenuse, area|
-** Processing line: ~      puts "(#{width}, #{height}, #{hypotenuse}) = #{area}"~
+    # Player's box is able to move at angles (not just the four general directions) fast
+** Processing line: ~    args.state.player =~
 - Inside source: true
 *** True Line Result
-      puts "(#{width}, #{height}, #{hypotenuse}) = #{area}"
-** Processing line: ~    end~
+    args.state.player =
+** Processing line: ~      args.state.player~
 - Inside source: true
 *** True Line Result
-    end
+      args.state.player
+** Processing line: ~          .shift_rect(vector.x * args.state.player_speed, # if we don't multiply by speed, then~
+- Inside source: true
+*** True Line Result
+          .shift_rect(vector.x * args.state.player_speed, # if we don't multiply by speed, then
+** Processing line: ~                      vector.y * args.state.player_speed) # the box will move extremely slow~
+- Inside source: true
+*** True Line Result
+                      vector.y * args.state.player_speed) # the box will move extremely slow
 ** Processing line: ~  end~
 - Inside source: true
 *** True Line Result
@@ -114059,162 +115675,178 @@ Follows is a source code listing for all files that have been open sourced. This
 - End of paragraph detected.
 *** True Line Result
 
-** Processing line: ~*** Platformer - Clepto Frog - main.rb~
+** Processing line: ~*** Mario - Jumping - main.rb~
 - Header detected.
 *** True Line Result
 
 *** True Line Result
-*** Platformer - Clepto Frog - main.rb
+*** Mario - Jumping - main.rb
 ** Processing line: ~#+begin_src ruby~
 - Line was identified as the beginning of a code block.
 *** True Line Result
 
 *** True Line Result
 #+begin_src ruby
-** Processing line: ~  # ./samples/99_genre_platformer/clepto_frog/app/main.rb~
+** Processing line: ~  # ./samples/99_genre_mario/01_jumping/app/main.rb~
 - Inside source: true
 *** True Line Result
-  # ./samples/99_genre_platformer/clepto_frog/app/main.rb
-** Processing line: ~  MAP_FILE_PATH = 'app/map.txt'~
+  # ./samples/99_genre_mario/01_jumping/app/main.rb
+** Processing line: ~  def tick args~
 - Inside source: true
 *** True Line Result
-  MAP_FILE_PATH = 'app/map.txt'
-** Processing line: ~~
+  def tick args
+** Processing line: ~    defaults args~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~  require 'app/map.rb'~
+    defaults args
+** Processing line: ~    render args~
 - Inside source: true
 *** True Line Result
-  require 'app/map.rb'
-** Processing line: ~~
+    render args
+** Processing line: ~    input args~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~  class CleptoFrog~
+    input args
+** Processing line: ~    calc args~
 - Inside source: true
 *** True Line Result
-  class CleptoFrog
-** Processing line: ~    attr_gtk~
+    calc args
+** Processing line: ~  end~
 - Inside source: true
 *** True Line Result
-    attr_gtk
+  end
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~    def render_ending~
+** Processing line: ~  def defaults args~
 - Inside source: true
 *** True Line Result
-    def render_ending
-** Processing line: ~      state.game_over_at ||= state.tick_count~
+  def defaults args
+** Processing line: ~    args.state.player.x      ||= args.grid.w.half~
 - Inside source: true
 *** True Line Result
-      state.game_over_at ||= state.tick_count
-** Processing line: ~~
+    args.state.player.x      ||= args.grid.w.half
+** Processing line: ~    args.state.player.y      ||= 0~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~      outputs.labels << [640, 700, "Clepto Frog", 4, 1]~
+    args.state.player.y      ||= 0
+** Processing line: ~    args.state.player.size   ||= 100~
 - Inside source: true
 *** True Line Result
-      outputs.labels << [640, 700, "Clepto Frog", 4, 1]
-** Processing line: ~~
+    args.state.player.size   ||= 100
+** Processing line: ~    args.state.player.dy     ||= 0~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~      if state.tick_count >= (state.game_over_at + 120)~
+    args.state.player.dy     ||= 0
+** Processing line: ~    args.state.player.action ||= :jumping~
 - Inside source: true
 *** True Line Result
-      if state.tick_count >= (state.game_over_at + 120)
-** Processing line: ~        outputs.labels << [640, 620, "\"I... I.... don't believe it.\" - New Guy",~
+    args.state.player.action ||= :jumping
+** Processing line: ~    args.state.jump.power           = 20~
 - Inside source: true
 *** True Line Result
-        outputs.labels << [640, 620, "\"I... I.... don't believe it.\" - New Guy",
-** Processing line: ~                           4, 1, 0, 0, 0, 255 * (state.game_over_at + 120).ease(60)]~
+    args.state.jump.power           = 20
+** Processing line: ~    args.state.jump.increase_frames = 10~
 - Inside source: true
 *** True Line Result
-                           4, 1, 0, 0, 0, 255 * (state.game_over_at + 120).ease(60)]
-** Processing line: ~      end~
+    args.state.jump.increase_frames = 10
+** Processing line: ~    args.state.jump.increase_power  = 1~
 - Inside source: true
 *** True Line Result
-      end
+    args.state.jump.increase_power  = 1
+** Processing line: ~    args.state.gravity              = -1~
+- Inside source: true
+*** True Line Result
+    args.state.gravity              = -1
+** Processing line: ~  end~
+- Inside source: true
+*** True Line Result
+  end
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~      if state.tick_count >= (state.game_over_at + 240)~
+** Processing line: ~  def render args~
 - Inside source: true
 *** True Line Result
-      if state.tick_count >= (state.game_over_at + 240)
-** Processing line: ~        outputs.labels << [640, 580, "\"He actually stole all the mugs?\" - New Guy",~
+  def render args
+** Processing line: ~    args.outputs.sprites << {~
 - Inside source: true
 *** True Line Result
-        outputs.labels << [640, 580, "\"He actually stole all the mugs?\" - New Guy",
-** Processing line: ~                           4, 1, 0, 0, 0, 255 * (state.game_over_at + 240).ease(60)]~
+    args.outputs.sprites << {
+** Processing line: ~      x: args.state.player.x -~
 - Inside source: true
 *** True Line Result
-                           4, 1, 0, 0, 0, 255 * (state.game_over_at + 240).ease(60)]
-** Processing line: ~      end~
+      x: args.state.player.x -
+** Processing line: ~         args.state.player.size.half,~
 - Inside source: true
 *** True Line Result
-      end
-** Processing line: ~~
+         args.state.player.size.half,
+** Processing line: ~      y: args.state.player.y,~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~      if state.tick_count >= (state.game_over_at + 360)~
+      y: args.state.player.y,
+** Processing line: ~      w: args.state.player.size,~
 - Inside source: true
 *** True Line Result
-      if state.tick_count >= (state.game_over_at + 360)
-** Processing line: ~        outputs.labels << [640, 540, "\"Kind of feel bad STARTING HIM WITH NOTHING again.\" - New Guy",~
+      w: args.state.player.size,
+** Processing line: ~      h: args.state.player.size,~
 - Inside source: true
 *** True Line Result
-        outputs.labels << [640, 540, "\"Kind of feel bad STARTING HIM WITH NOTHING again.\" - New Guy",
-** Processing line: ~                           4, 1, 0, 0, 0, 255 * (state.game_over_at + 360).ease(60)]~
+      h: args.state.player.size,
+** Processing line: ~      path: 'sprites/square/red.png'~
 - Inside source: true
 *** True Line Result
-                           4, 1, 0, 0, 0, 255 * (state.game_over_at + 360).ease(60)]
-** Processing line: ~      end~
+      path: 'sprites/square/red.png'
+** Processing line: ~    }~
 - Inside source: true
 *** True Line Result
-      end
+    }
+** Processing line: ~  end~
+- Inside source: true
+*** True Line Result
+  end
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~      outputs.sprites << [640 - 50, 360 - 50, 100, 100,~
+** Processing line: ~  def input args~
 - Inside source: true
 *** True Line Result
-      outputs.sprites << [640 - 50, 360 - 50, 100, 100,
-** Processing line: ~                          "sprites/square-green.png"]~
+  def input args
+** Processing line: ~    if args.inputs.keyboard.key_down.space~
 - Inside source: true
 *** True Line Result
-                          "sprites/square-green.png"]
-** Processing line: ~~
+    if args.inputs.keyboard.key_down.space
+** Processing line: ~      if args.state.player.action == :standing~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~      outputs.labels << [640, 300, "Current Time: #{"%.2f" % state.stuff_time}", 4, 1]~
+      if args.state.player.action == :standing
+** Processing line: ~        args.state.player.action = :jumping~
 - Inside source: true
 *** True Line Result
-      outputs.labels << [640, 300, "Current Time: #{"%.2f" % state.stuff_time}", 4, 1]
-** Processing line: ~      outputs.labels << [640, 270, "Best Time: #{"%.2f" % state.stuff_best_time}", 4, 1]~
+        args.state.player.action = :jumping
+** Processing line: ~        args.state.player.dy = args.state.jump.power~
 - Inside source: true
 *** True Line Result
-      outputs.labels << [640, 270, "Best Time: #{"%.2f" % state.stuff_best_time}", 4, 1]
+        args.state.player.dy = args.state.jump.power
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~      if state.tick_count >= (state.game_over_at + 550)~
+** Processing line: ~        # record when the action took place~
 - Inside source: true
 *** True Line Result
-      if state.tick_count >= (state.game_over_at + 550)
-** Processing line: ~        restart_game~
+        # record when the action took place
+** Processing line: ~        current_frame = args.state.tick_count~
 - Inside source: true
 *** True Line Result
-        restart_game
+        current_frame = args.state.tick_count
+** Processing line: ~        args.state.player.action_at = current_frame~
+- Inside source: true
+*** True Line Result
+        args.state.player.action_at = current_frame
 ** Processing line: ~      end~
 - Inside source: true
 *** True Line Result
@@ -114227,206 +115859,186 @@ Follows is a source code listing for all files that have been open sourced. This
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~    def restart_game~
-- Inside source: true
-*** True Line Result
-    def restart_game
-** Processing line: ~      state.world = nil~
+** Processing line: ~    # if the space bar is being held~
 - Inside source: true
 *** True Line Result
-      state.world = nil
-** Processing line: ~      state.x = nil~
+    # if the space bar is being held
+** Processing line: ~    if args.inputs.keyboard.key_held.space~
 - Inside source: true
 *** True Line Result
-      state.x = nil
-** Processing line: ~      state.y = nil~
+    if args.inputs.keyboard.key_held.space
+** Processing line: ~      # is the player jumping~
 - Inside source: true
 *** True Line Result
-      state.y = nil
-** Processing line: ~      state.dx = nil~
+      # is the player jumping
+** Processing line: ~      is_jumping = args.state.player.action == :jumping~
 - Inside source: true
 *** True Line Result
-      state.dx = nil
-** Processing line: ~      state.dy = nil~
+      is_jumping = args.state.player.action == :jumping
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-      state.dy = nil
-** Processing line: ~      state.stuff_score = 0~
+
+** Processing line: ~      # when was the jump performed~
 - Inside source: true
 *** True Line Result
-      state.stuff_score = 0
-** Processing line: ~      state.stuff_time = 0~
+      # when was the jump performed
+** Processing line: ~      time_of_jump = args.state.player.action_at~
 - Inside source: true
 *** True Line Result
-      state.stuff_time = 0
-** Processing line: ~      state.intro_tick_count = nil~
+      time_of_jump = args.state.player.action_at
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-      state.intro_tick_count = nil
-** Processing line: ~      defaults~
+
+** Processing line: ~      # how much time has passed since the jump~
 - Inside source: true
 *** True Line Result
-      defaults
-** Processing line: ~      state.game_start_at = state.tick_count~
+      # how much time has passed since the jump
+** Processing line: ~      jump_elapsed_time = time_of_jump.elapsed_time~
 - Inside source: true
 *** True Line Result
-      state.game_start_at = state.tick_count
-** Processing line: ~      state.scene = :game~
+      jump_elapsed_time = time_of_jump.elapsed_time
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-      state.scene = :game
-** Processing line: ~      state.game_over_at = nil~
+
+** Processing line: ~      # how much time is allowed for increasing power~
 - Inside source: true
 *** True Line Result
-      state.game_over_at = nil
-** Processing line: ~    end~
+      # how much time is allowed for increasing power
+** Processing line: ~      time_allowed = args.state.jump.increase_frames~
 - Inside source: true
 *** True Line Result
-    end
+      time_allowed = args.state.jump.increase_frames
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~    def render_intro~
-- Inside source: true
-*** True Line Result
-    def render_intro
-** Processing line: ~      outputs.labels << [640, 700, "Clepto Frog", 4, 1]~
+** Processing line: ~      # if the player is jumping~
 - Inside source: true
 *** True Line Result
-      outputs.labels << [640, 700, "Clepto Frog", 4, 1]
-** Processing line: ~      if state.tick_count >= 120~
+      # if the player is jumping
+** Processing line: ~      # and the elapsed time is less than~
 - Inside source: true
 *** True Line Result
-      if state.tick_count >= 120
-** Processing line: ~        outputs.labels << [640, 620, "\"Uh... your office has a pet frog?\" - New Guy",~
+      # and the elapsed time is less than
+** Processing line: ~      # the allowed time~
 - Inside source: true
 *** True Line Result
-        outputs.labels << [640, 620, "\"Uh... your office has a pet frog?\" - New Guy",
-** Processing line: ~                           4, 1, 0, 0, 0, 255 * 120.ease(60)]~
+      # the allowed time
+** Processing line: ~      if is_jumping && jump_elapsed_time < time_allowed~
 - Inside source: true
 *** True Line Result
-                           4, 1, 0, 0, 0, 255 * 120.ease(60)]
-** Processing line: ~      end~
+      if is_jumping && jump_elapsed_time < time_allowed
+** Processing line: ~         # increase the dy by the increase power~
 - Inside source: true
 *** True Line Result
-      end
-** Processing line: ~~
+         # increase the dy by the increase power
+** Processing line: ~         power_to_add = args.state.jump.increase_power~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~      if state.tick_count >= 240~
+         power_to_add = args.state.jump.increase_power
+** Processing line: ~         args.state.player.dy += power_to_add~
 - Inside source: true
 *** True Line Result
-      if state.tick_count >= 240
-** Processing line: ~        outputs.labels << [640, 580, "\"Yep! His name is Clepto.\" - Jim",~
+         args.state.player.dy += power_to_add
+** Processing line: ~      end~
 - Inside source: true
 *** True Line Result
-        outputs.labels << [640, 580, "\"Yep! His name is Clepto.\" - Jim",
-** Processing line: ~                           4, 1, 0, 0, 0, 255 * 240.ease(60)]~
+      end
+** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
-                           4, 1, 0, 0, 0, 255 * 240.ease(60)]
-** Processing line: ~      end~
+    end
+** Processing line: ~  end~
 - Inside source: true
 *** True Line Result
-      end
+  end
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~      if state.tick_count >= 360~
-- Inside source: true
-*** True Line Result
-      if state.tick_count >= 360
-** Processing line: ~        outputs.labels << [640, 540, "\"Uh...\" - New Guy",~
+** Processing line: ~  def calc args~
 - Inside source: true
 *** True Line Result
-        outputs.labels << [640, 540, "\"Uh...\" - New Guy",
-** Processing line: ~                           4, 1, 0, 0, 0, 255 * 360.ease(60)]~
+  def calc args
+** Processing line: ~    if args.state.player.action == :jumping~
 - Inside source: true
 *** True Line Result
-                           4, 1, 0, 0, 0, 255 * 360.ease(60)]
-** Processing line: ~      end~
+    if args.state.player.action == :jumping
+** Processing line: ~      args.state.player.y  += args.state.player.dy~
 - Inside source: true
 *** True Line Result
-      end
-** Processing line: ~~
+      args.state.player.y  += args.state.player.dy
+** Processing line: ~      args.state.player.dy += args.state.gravity~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~      if state.tick_count >= 480~
+      args.state.player.dy += args.state.gravity
+** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
-      if state.tick_count >= 480
-** Processing line: ~        outputs.labels << [640, 500, "\"He steals mugs while we're away...\" - Jim",~
+    end
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-        outputs.labels << [640, 500, "\"He steals mugs while we're away...\" - Jim",
-** Processing line: ~                           4, 1, 0, 0, 0, 255 * 480.ease(60)]~
+
+** Processing line: ~    if args.state.player.y < 0~
 - Inside source: true
 *** True Line Result
-                           4, 1, 0, 0, 0, 255 * 480.ease(60)]
-** Processing line: ~      end~
+    if args.state.player.y < 0
+** Processing line: ~      args.state.player.y      = 0~
 - Inside source: true
 *** True Line Result
-      end
-** Processing line: ~~
+      args.state.player.y      = 0
+** Processing line: ~      args.state.player.action = :standing~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~      if state.tick_count >= 600~
+      args.state.player.action = :standing
+** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
-      if state.tick_count >= 600
-** Processing line: ~        outputs.labels << [640, 460, "\"It's not a big deal, we take them back in the morning.\" - Jim",~
+    end
+** Processing line: ~  end~
 - Inside source: true
 *** True Line Result
-        outputs.labels << [640, 460, "\"It's not a big deal, we take them back in the morning.\" - Jim",
-** Processing line: ~                           4, 1, 0, 0, 0, 255 * 600.ease(60)]~
+  end
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-                           4, 1, 0, 0, 0, 255 * 600.ease(60)]
-** Processing line: ~      end~
-- Inside source: true
+
+** Processing line: ~#+end_src~
+- Line was identified as the end of a code block.
 *** True Line Result
-      end
+#+end_src
 ** Processing line: ~~
-- Inside source: true
+- End of paragraph detected.
 *** True Line Result
 
-** Processing line: ~      outputs.sprites << [640 - 50, 360 - 50, 100, 100,~
-- Inside source: true
+** Processing line: ~*** Mario - Jumping And Collisions - main.rb~
+- Header detected.
 *** True Line Result
-      outputs.sprites << [640 - 50, 360 - 50, 100, 100,
-** Processing line: ~                          "sprites/square-green.png"]~
-- Inside source: true
+
 *** True Line Result
-                          "sprites/square-green.png"]
-** Processing line: ~~
-- Inside source: true
+*** Mario - Jumping And Collisions - main.rb
+** Processing line: ~#+begin_src ruby~
+- Line was identified as the beginning of a code block.
 *** True Line Result
 
-** Processing line: ~      if state.tick_count == 800~
-- Inside source: true
-*** True Line Result
-      if state.tick_count == 800
-** Processing line: ~        state.scene = :game~
-- Inside source: true
 *** True Line Result
-        state.scene = :game
-** Processing line: ~        state.game_start_at = state.tick_count~
+#+begin_src ruby
+** Processing line: ~  # ./samples/99_genre_mario/02_jumping_and_collisions/app/main.rb~
 - Inside source: true
 *** True Line Result
-        state.game_start_at = state.tick_count
-** Processing line: ~      end~
+  # ./samples/99_genre_mario/02_jumping_and_collisions/app/main.rb
+** Processing line: ~  class Game~
 - Inside source: true
 *** True Line Result
-      end
-** Processing line: ~    end~
+  class Game
+** Processing line: ~    attr_gtk~
 - Inside source: true
 *** True Line Result
-    end
+    attr_gtk
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
@@ -114439,42 +116051,18 @@ Follows is a source code listing for all files that have been open sourced. This
 - Inside source: true
 *** True Line Result
       defaults
-** Processing line: ~      if state.scene == :intro && state.tick_count <= 800~
-- Inside source: true
-*** True Line Result
-      if state.scene == :intro && state.tick_count <= 800
-** Processing line: ~        render_intro~
-- Inside source: true
-*** True Line Result
-        render_intro
-** Processing line: ~      elsif state.scene == :ending~
-- Inside source: true
-*** True Line Result
-      elsif state.scene == :ending
-** Processing line: ~        render_ending~
-- Inside source: true
-*** True Line Result
-        render_ending
-** Processing line: ~      else~
-- Inside source: true
-*** True Line Result
-      else
-** Processing line: ~        render~
+** Processing line: ~      render~
 - Inside source: true
 *** True Line Result
-        render
-** Processing line: ~      end~
+      render
+** Processing line: ~      input~
 - Inside source: true
 *** True Line Result
-      end
+      input
 ** Processing line: ~      calc~
 - Inside source: true
 *** True Line Result
       calc
-** Processing line: ~      process_inputs~
-- Inside source: true
-*** True Line Result
-      process_inputs
 ** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
@@ -114487,194 +116075,174 @@ Follows is a source code listing for all files that have been open sourced. This
 - Inside source: true
 *** True Line Result
     def defaults
-** Processing line: ~      state.scene ||= :intro~
-- Inside source: true
-*** True Line Result
-      state.scene ||= :intro
-** Processing line: ~      state.stuff_score     ||= 0~
-- Inside source: true
-*** True Line Result
-      state.stuff_score     ||= 0
-** Processing line: ~      state.stuff_time      ||= 0~
-- Inside source: true
-*** True Line Result
-      state.stuff_time      ||= 0
-** Processing line: ~      state.stuff_best_time ||= nil~
-- Inside source: true
-*** True Line Result
-      state.stuff_best_time ||= nil
-** Processing line: ~      state.camera_x ||= 0~
-- Inside source: true
-*** True Line Result
-      state.camera_x ||= 0
-** Processing line: ~      state.camera_y ||= 0~
+** Processing line: ~      return if state.tick_count != 0~
 - Inside source: true
 *** True Line Result
-      state.camera_y ||= 0
-** Processing line: ~      state.target_camera_scale ||= 1~
+      return if state.tick_count != 0
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-      state.target_camera_scale ||= 1
-** Processing line: ~      state.camera_scale ||= 1~
+
+** Processing line: ~      player.x                     = 64~
 - Inside source: true
 *** True Line Result
-      state.camera_scale ||= 1
-** Processing line: ~      state.tongue_length          ||= 100~
+      player.x                     = 64
+** Processing line: ~      player.y                     = 800~
 - Inside source: true
 *** True Line Result
-      state.tongue_length          ||= 100
-** Processing line: ~      state.dev_action             ||= :collision_mode~
+      player.y                     = 800
+** Processing line: ~      player.size                  = 50~
 - Inside source: true
 *** True Line Result
-      state.dev_action             ||= :collision_mode
-** Processing line: ~      state.action                 ||= :aiming~
+      player.size                  = 50
+** Processing line: ~      player.dx                    = 0~
 - Inside source: true
 *** True Line Result
-      state.action                 ||= :aiming
-** Processing line: ~      state.tongue_angle           ||= 90~
+      player.dx                    = 0
+** Processing line: ~      player.dy                    = 0~
 - Inside source: true
 *** True Line Result
-      state.tongue_angle           ||= 90
-** Processing line: ~      state.tile_size                = 64~
+      player.dy                    = 0
+** Processing line: ~      player.action                = :falling~
 - Inside source: true
 *** True Line Result
-      state.tile_size                = 64
-** Processing line: ~      state.gravity                  = -0.1~
+      player.action                = :falling
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-      state.gravity                  = -0.1
-** Processing line: ~      state.air                      = -0.01~
+
+** Processing line: ~      player.max_speed             = 20~
 - Inside source: true
 *** True Line Result
-      state.air                      = -0.01
-** Processing line: ~      state.player_width             = 60~
+      player.max_speed             = 20
+** Processing line: ~      player.jump_power            = 15~
 - Inside source: true
 *** True Line Result
-      state.player_width             = 60
-** Processing line: ~      state.player_height            = 60~
+      player.jump_power            = 15
+** Processing line: ~      player.jump_air_time         = 15~
 - Inside source: true
 *** True Line Result
-      state.player_height            = 60
-** Processing line: ~      state.collision_tolerance      = 0.0~
+      player.jump_air_time         = 15
+** Processing line: ~      player.jump_increase_power   = 1~
 - Inside source: true
 *** True Line Result
-      state.collision_tolerance      = 0.0
-** Processing line: ~      state.previous_tile_size     ||= state.tile_size~
+      player.jump_increase_power   = 1
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-      state.previous_tile_size     ||= state.tile_size
-** Processing line: ~      state.x                      ||= 2400~
+
+** Processing line: ~      state.gravity                = -1~
 - Inside source: true
 *** True Line Result
-      state.x                      ||= 2400
-** Processing line: ~      state.y                      ||= 200~
+      state.gravity                = -1
+** Processing line: ~      state.drag                   = 0.001~
 - Inside source: true
 *** True Line Result
-      state.y                      ||= 200
-** Processing line: ~      state.dy                     ||= 0~
+      state.drag                   = 0.001
+** Processing line: ~      state.tile_size              = 64~
 - Inside source: true
 *** True Line Result
-      state.dy                     ||= 0
-** Processing line: ~      state.dx                     ||= 0~
+      state.tile_size              = 64
+** Processing line: ~      state.tiles                ||= [~
 - Inside source: true
 *** True Line Result
-      state.dx                     ||= 0
-** Processing line: ~      attempt_load_world_from_file~
+      state.tiles                ||= [
+** Processing line: ~        { ordinal_x:  0, ordinal_y: 0 },~
 - Inside source: true
 *** True Line Result
-      attempt_load_world_from_file
-** Processing line: ~      state.world_lookup           ||= { }~
+        { ordinal_x:  0, ordinal_y: 0 },
+** Processing line: ~        { ordinal_x:  1, ordinal_y: 0 },~
 - Inside source: true
 *** True Line Result
-      state.world_lookup           ||= { }
-** Processing line: ~      state.world_collision_rects  ||= []~
+        { ordinal_x:  1, ordinal_y: 0 },
+** Processing line: ~        { ordinal_x:  2, ordinal_y: 0 },~
 - Inside source: true
 *** True Line Result
-      state.world_collision_rects  ||= []
-** Processing line: ~      state.mode                   ||= :creating~
+        { ordinal_x:  2, ordinal_y: 0 },
+** Processing line: ~        { ordinal_x:  3, ordinal_y: 0 },~
 - Inside source: true
 *** True Line Result
-      state.mode                   ||= :creating
-** Processing line: ~      state.select_menu            ||= [0, 720, 1280, 720]~
+        { ordinal_x:  3, ordinal_y: 0 },
+** Processing line: ~        { ordinal_x:  4, ordinal_y: 0 },~
 - Inside source: true
 *** True Line Result
-      state.select_menu            ||= [0, 720, 1280, 720]
-** Processing line: ~      state.sprite_quantity        ||= 20~
+        { ordinal_x:  4, ordinal_y: 0 },
+** Processing line: ~        { ordinal_x:  5, ordinal_y: 0 },~
 - Inside source: true
 *** True Line Result
-      state.sprite_quantity        ||= 20
-** Processing line: ~      state.sprite_coords          ||= []~
+        { ordinal_x:  5, ordinal_y: 0 },
+** Processing line: ~        { ordinal_x:  6, ordinal_y: 0 },~
 - Inside source: true
 *** True Line Result
-      state.sprite_coords          ||= []
-** Processing line: ~      state.banner_coords          ||= [640, 680 + 720]~
+        { ordinal_x:  6, ordinal_y: 0 },
+** Processing line: ~        { ordinal_x:  7, ordinal_y: 0 },~
 - Inside source: true
 *** True Line Result
-      state.banner_coords          ||= [640, 680 + 720]
-** Processing line: ~      state.sprite_selected        ||= 1~
+        { ordinal_x:  7, ordinal_y: 0 },
+** Processing line: ~        { ordinal_x:  8, ordinal_y: 0 },~
 - Inside source: true
 *** True Line Result
-      state.sprite_selected        ||= 1
-** Processing line: ~      state.map_saved_at           ||= 0~
+        { ordinal_x:  8, ordinal_y: 0 },
+** Processing line: ~        { ordinal_x:  9, ordinal_y: 0 },~
 - Inside source: true
 *** True Line Result
-      state.map_saved_at           ||= 0
-** Processing line: ~      state.intro_tick_count       ||= state.tick_count~
+        { ordinal_x:  9, ordinal_y: 0 },
+** Processing line: ~        { ordinal_x: 10, ordinal_y: 0 },~
 - Inside source: true
 *** True Line Result
-      state.intro_tick_count       ||= state.tick_count
-** Processing line: ~      if state.sprite_coords == []~
+        { ordinal_x: 10, ordinal_y: 0 },
+** Processing line: ~        { ordinal_x: 11, ordinal_y: 0 },~
 - Inside source: true
 *** True Line Result
-      if state.sprite_coords == []
-** Processing line: ~        count = 1~
+        { ordinal_x: 11, ordinal_y: 0 },
+** Processing line: ~        { ordinal_x: 12, ordinal_y: 0 },~
 - Inside source: true
 *** True Line Result
-        count = 1
-** Processing line: ~        temp_x = 165~
+        { ordinal_x: 12, ordinal_y: 0 },
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-        temp_x = 165
-** Processing line: ~        temp_y = 500 + 720~
+
+** Processing line: ~        { ordinal_x:  9, ordinal_y: 3 },~
 - Inside source: true
 *** True Line Result
-        temp_y = 500 + 720
-** Processing line: ~        state.sprite_quantity.times do~
+        { ordinal_x:  9, ordinal_y: 3 },
+** Processing line: ~        { ordinal_x: 10, ordinal_y: 3 },~
 - Inside source: true
 *** True Line Result
-        state.sprite_quantity.times do
-** Processing line: ~          state.sprite_coords += [[temp_x, temp_y, count]]~
+        { ordinal_x: 10, ordinal_y: 3 },
+** Processing line: ~        { ordinal_x: 11, ordinal_y: 3 },~
 - Inside source: true
 *** True Line Result
-          state.sprite_coords += [[temp_x, temp_y, count]]
-** Processing line: ~          temp_x += 100~
+        { ordinal_x: 11, ordinal_y: 3 },
+** Processing line: ~      ]~
 - Inside source: true
 *** True Line Result
-          temp_x += 100
-** Processing line: ~          count += 1~
+      ]
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-          count += 1
-** Processing line: ~          if temp_x > 1280 - (165 + 50)~
+
+** Processing line: ~      tiles.each do |t|~
 - Inside source: true
 *** True Line Result
-          if temp_x > 1280 - (165 + 50)
-** Processing line: ~            temp_x = 165~
+      tiles.each do |t|
+** Processing line: ~        t.rect = { x: t.ordinal_x * 64,~
 - Inside source: true
 *** True Line Result
-            temp_x = 165
-** Processing line: ~            temp_y -= 75~
+        t.rect = { x: t.ordinal_x * 64,
+** Processing line: ~                   y: t.ordinal_y * 64,~
 - Inside source: true
 *** True Line Result
-            temp_y -= 75
-** Processing line: ~          end~
+                   y: t.ordinal_y * 64,
+** Processing line: ~                   w: 64,~
 - Inside source: true
 *** True Line Result
-          end
-** Processing line: ~        end~
+                   w: 64,
+** Processing line: ~                   h: 64 }~
 - Inside source: true
 *** True Line Result
-        end
+                   h: 64 }
 ** Processing line: ~      end~
 - Inside source: true
 *** True Line Result
@@ -114687,34 +116255,42 @@ Follows is a source code listing for all files that have been open sourced. This
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~    def start_of_tongue x = nil, y = nil~
+** Processing line: ~    def render~
 - Inside source: true
 *** True Line Result
-    def start_of_tongue x = nil, y = nil
-** Processing line: ~      x ||= state.x~
+    def render
+** Processing line: ~      render_player~
 - Inside source: true
 *** True Line Result
-      x ||= state.x
-** Processing line: ~      y ||= state.y~
+      render_player
+** Processing line: ~      render_tiles~
 - Inside source: true
 *** True Line Result
-      y ||= state.y
-** Processing line: ~      [~
+      render_tiles
+** Processing line: ~      # render_grid~
 - Inside source: true
 *** True Line Result
-      [
-** Processing line: ~        x + state.player_width.half,~
+      # render_grid
+** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
-        x + state.player_width.half,
-** Processing line: ~        y + state.player_height.half~
+    end
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-        y + state.player_height.half
-** Processing line: ~      ]~
+
+** Processing line: ~    def input~
 - Inside source: true
 *** True Line Result
-      ]
+    def input
+** Processing line: ~      input_jump~
+- Inside source: true
+*** True Line Result
+      input_jump
+** Processing line: ~      input_move~
+- Inside source: true
+*** True Line Result
+      input_move
 ** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
@@ -114723,186 +116299,206 @@ Follows is a source code listing for all files that have been open sourced. This
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~    def stage_definition~
+** Processing line: ~    def calc~
 - Inside source: true
 *** True Line Result
-    def stage_definition
-** Processing line: ~      outputs.sprites << [vx(0), vy(0), vw(10000), vw(5875), 'sprites/level-map.png']~
+    def calc
+** Processing line: ~      calc_player_rect~
 - Inside source: true
 *** True Line Result
-      outputs.sprites << [vx(0), vy(0), vw(10000), vw(5875), 'sprites/level-map.png']
-** Processing line: ~    end~
+      calc_player_rect
+** Processing line: ~      calc_left~
 - Inside source: true
 *** True Line Result
-    end
-** Processing line: ~~
+      calc_left
+** Processing line: ~      calc_right~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~    def render~
+      calc_right
+** Processing line: ~      calc_below~
 - Inside source: true
 *** True Line Result
-    def render
-** Processing line: ~      stage_definition~
+      calc_below
+** Processing line: ~      calc_above~
 - Inside source: true
 *** True Line Result
-      stage_definition
-** Processing line: ~      start_of_tongue_render = [vx(start_of_tongue.x), vy(start_of_tongue.y)]~
+      calc_above
+** Processing line: ~      calc_player_dy~
 - Inside source: true
 *** True Line Result
-      start_of_tongue_render = [vx(start_of_tongue.x), vy(start_of_tongue.y)]
-** Processing line: ~      end_of_tongue_render = [vx(end_of_tongue.x), vy(end_of_tongue.y)]~
+      calc_player_dy
+** Processing line: ~      calc_player_dx~
 - Inside source: true
 *** True Line Result
-      end_of_tongue_render = [vx(end_of_tongue.x), vy(end_of_tongue.y)]
+      calc_player_dx
+** Processing line: ~      calc_game_over~
+- Inside source: true
+*** True Line Result
+      calc_game_over
+** Processing line: ~    end~
+- Inside source: true
+*** True Line Result
+    end
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~      if state.anchor_point~
+** Processing line: ~    def render_player~
 - Inside source: true
 *** True Line Result
-      if state.anchor_point
-** Processing line: ~        anchor_point_render = [vx(state.anchor_point.x), vy(state.anchor_point.y)]~
+    def render_player
+** Processing line: ~      outputs.sprites << {~
 - Inside source: true
 *** True Line Result
-        anchor_point_render = [vx(state.anchor_point.x), vy(state.anchor_point.y)]
-** Processing line: ~        outputs.sprites << { x: start_of_tongue_render.x,~
+      outputs.sprites << {
+** Processing line: ~        x: player.x,~
 - Inside source: true
 *** True Line Result
-        outputs.sprites << { x: start_of_tongue_render.x,
-** Processing line: ~                             y: start_of_tongue_render.y,~
+        x: player.x,
+** Processing line: ~        y: player.y,~
 - Inside source: true
 *** True Line Result
-                             y: start_of_tongue_render.y,
-** Processing line: ~                             w: vw(2),~
+        y: player.y,
+** Processing line: ~        w: player.size,~
 - Inside source: true
 *** True Line Result
-                             w: vw(2),
-** Processing line: ~                             h: args.geometry.distance(start_of_tongue_render, anchor_point_render),~
+        w: player.size,
+** Processing line: ~        h: player.size,~
 - Inside source: true
 *** True Line Result
-                             h: args.geometry.distance(start_of_tongue_render, anchor_point_render),
-** Processing line: ~                             path:  'sprites/square-pink.png',~
+        h: player.size,
+** Processing line: ~        path: 'sprites/square/red.png'~
 - Inside source: true
 *** True Line Result
-                             path:  'sprites/square-pink.png',
-** Processing line: ~                             angle_anchor_y: 0,~
+        path: 'sprites/square/red.png'
+** Processing line: ~      }~
 - Inside source: true
 *** True Line Result
-                             angle_anchor_y: 0,
-** Processing line: ~                             angle: state.tongue_angle - 90 }~
+      }
+** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
-                             angle: state.tongue_angle - 90 }
-** Processing line: ~      else~
+    end
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-      else
-** Processing line: ~        outputs.sprites << { x: vx(start_of_tongue.x),~
+
+** Processing line: ~    def render_tiles~
 - Inside source: true
 *** True Line Result
-        outputs.sprites << { x: vx(start_of_tongue.x),
-** Processing line: ~                             y: vy(start_of_tongue.y),~
+    def render_tiles
+** Processing line: ~      outputs.sprites << state.tiles.map do |t|~
 - Inside source: true
 *** True Line Result
-                             y: vy(start_of_tongue.y),
-** Processing line: ~                             w: vw(2),~
+      outputs.sprites << state.tiles.map do |t|
+** Processing line: ~        t.merge path: 'sprites/square/white.png',~
 - Inside source: true
 *** True Line Result
-                             w: vw(2),
-** Processing line: ~                             h: vh(state.tongue_length),~
+        t.merge path: 'sprites/square/white.png',
+** Processing line: ~                x: t.ordinal_x * 64,~
 - Inside source: true
 *** True Line Result
-                             h: vh(state.tongue_length),
-** Processing line: ~                             path:  'sprites/square-pink.png',~
+                x: t.ordinal_x * 64,
+** Processing line: ~                y: t.ordinal_y * 64,~
 - Inside source: true
 *** True Line Result
-                             path:  'sprites/square-pink.png',
-** Processing line: ~                             angle_anchor_y: 0,~
+                y: t.ordinal_y * 64,
+** Processing line: ~                w: 64,~
 - Inside source: true
 *** True Line Result
-                             angle_anchor_y: 0,
-** Processing line: ~                             angle: state.tongue_angle - 90 }~
+                w: 64,
+** Processing line: ~                h: 64~
 - Inside source: true
 *** True Line Result
-                             angle: state.tongue_angle - 90 }
+                h: 64
 ** Processing line: ~      end~
 - Inside source: true
 *** True Line Result
       end
+** Processing line: ~    end~
+- Inside source: true
+*** True Line Result
+    end
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~      outputs.sprites << state.objects.map { |o| [vx(o.x), vy(o.y), vw(o.w), vh(o.h), o.path] }~
+** Processing line: ~    def render_grid~
 - Inside source: true
 *** True Line Result
-      outputs.sprites << state.objects.map { |o| [vx(o.x), vy(o.y), vw(o.w), vh(o.h), o.path] }
-** Processing line: ~~
+    def render_grid
+** Processing line: ~      if state.tick_count == 0~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~      if state.god_mode~
+      if state.tick_count == 0
+** Processing line: ~        outputs[:grid].background_color = [0, 0, 0, 0]~
 - Inside source: true
 *** True Line Result
-      if state.god_mode
-** Processing line: ~        # SHOW HIDE COLLISIONS~
+        outputs[:grid].background_color = [0, 0, 0, 0]
+** Processing line: ~        outputs[:grid].borders << available_brick_locations~
 - Inside source: true
 *** True Line Result
-        # SHOW HIDE COLLISIONS
-** Processing line: ~        outputs.sprites << state.world.map do |x, y, w, h|~
+        outputs[:grid].borders << available_brick_locations
+** Processing line: ~        outputs[:grid].labels  << available_brick_locations.map do |b|~
 - Inside source: true
 *** True Line Result
-        outputs.sprites << state.world.map do |x, y, w, h|
-** Processing line: ~          x = vx(x)~
+        outputs[:grid].labels  << available_brick_locations.map do |b|
+** Processing line: ~          [~
 - Inside source: true
 *** True Line Result
-          x = vx(x)
-** Processing line: ~          y = vy(y)~
+          [
+** Processing line: ~            b.merge(text: "#{b.ordinal_x},#{b.ordinal_y}",~
 - Inside source: true
 *** True Line Result
-          y = vy(y)
-** Processing line: ~          if x > -80 && x < 1280 && y > -80 && y < 720~
+            b.merge(text: "#{b.ordinal_x},#{b.ordinal_y}",
+** Processing line: ~                    x: b.x + 2,~
 - Inside source: true
 *** True Line Result
-          if x > -80 && x < 1280 && y > -80 && y < 720
-** Processing line: ~            {~
+                    x: b.x + 2,
+** Processing line: ~                    y: b.y + 2,~
 - Inside source: true
 *** True Line Result
-            {
-** Processing line: ~              x: x,~
+                    y: b.y + 2,
+** Processing line: ~                    size_enum: -3,~
 - Inside source: true
 *** True Line Result
-              x: x,
-** Processing line: ~              y: y,~
+                    size_enum: -3,
+** Processing line: ~                    vertical_alignment_enum: 0,~
 - Inside source: true
 *** True Line Result
-              y: y,
-** Processing line: ~              w: vw(w || state.tile_size),~
+                    vertical_alignment_enum: 0,
+** Processing line: ~                    blendmode_enum: 0),~
 - Inside source: true
 *** True Line Result
-              w: vw(w || state.tile_size),
-** Processing line: ~              h: vh(h || state.tile_size),~
+                    blendmode_enum: 0),
+** Processing line: ~            b.merge(text: "#{b.x},#{b.y}",~
 - Inside source: true
 *** True Line Result
-              h: vh(h || state.tile_size),
-** Processing line: ~              path: 'sprites/square-gray.png',~
+            b.merge(text: "#{b.x},#{b.y}",
+** Processing line: ~                    x: b.x + 2,~
 - Inside source: true
 *** True Line Result
-              path: 'sprites/square-gray.png',
-** Processing line: ~              a: 128~
+                    x: b.x + 2,
+** Processing line: ~                    y: b.y + 2 + 20,~
 - Inside source: true
 *** True Line Result
-              a: 128
-** Processing line: ~            }~
+                    y: b.y + 2 + 20,
+** Processing line: ~                    size_enum: -3,~
 - Inside source: true
 *** True Line Result
-            }
-** Processing line: ~          end~
+                    size_enum: -3,
+** Processing line: ~                    vertical_alignment_enum: 0,~
 - Inside source: true
 *** True Line Result
-          end
+                    vertical_alignment_enum: 0,
+** Processing line: ~                    blendmode_enum: 0)~
+- Inside source: true
+*** True Line Result
+                    blendmode_enum: 0)
+** Processing line: ~          ]~
+- Inside source: true
+*** True Line Result
+          ]
 ** Processing line: ~        end~
 - Inside source: true
 *** True Line Result
@@ -114915,90 +116511,90 @@ Follows is a source code listing for all files that have been open sourced. This
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~      render_player~
+** Processing line: ~      outputs.sprites << { x: 0, y: 0, w: 1280, h: 720, path: :grid }~
 - Inside source: true
 *** True Line Result
-      render_player
-** Processing line: ~      outputs.sprites << [vx(2315), vy(45), vw(569), vh(402), 'sprites/square-blue.png', 0, 40]~
+      outputs.sprites << { x: 0, y: 0, w: 1280, h: 720, path: :grid }
+** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
-      outputs.sprites << [vx(2315), vy(45), vw(569), vh(402), 'sprites/square-blue.png', 0, 40]
+    end
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~      # Label in top left of the screen~
+** Processing line: ~    def input_jump~
 - Inside source: true
 *** True Line Result
-      # Label in top left of the screen
-** Processing line: ~      outputs.primitives << [20, 640, 180, 70, 255, 255, 255, 128].solid~
+    def input_jump
+** Processing line: ~      if inputs.keyboard.key_down.space~
 - Inside source: true
 *** True Line Result
-      outputs.primitives << [20, 640, 180, 70, 255, 255, 255, 128].solid
-** Processing line: ~      outputs.primitives << [30, 700, "Stuff: #{state.stuff_score} of #{$mugs.count}", 1].label~
+      if inputs.keyboard.key_down.space
+** Processing line: ~        player_jump~
 - Inside source: true
 *** True Line Result
-      outputs.primitives << [30, 700, "Stuff: #{state.stuff_score} of #{$mugs.count}", 1].label
-** Processing line: ~      outputs.primitives << [30, 670, "Time: #{"%.2f" % state.stuff_time}", 1].label~
+        player_jump
+** Processing line: ~      end~
 - Inside source: true
 *** True Line Result
-      outputs.primitives << [30, 670, "Time: #{"%.2f" % state.stuff_time}", 1].label
+      end
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~      if state.god_mode~
+** Processing line: ~      if inputs.keyboard.key_held.space~
 - Inside source: true
 *** True Line Result
-      if state.god_mode
-** Processing line: ~        if state.map_saved_at > 0 && state.map_saved_at.elapsed_time < 120~
+      if inputs.keyboard.key_held.space
+** Processing line: ~        player_jump_increase_air_time~
 - Inside source: true
 *** True Line Result
-        if state.map_saved_at > 0 && state.map_saved_at.elapsed_time < 120
-** Processing line: ~          outputs.primitives << [920, 670, 'Map has been exported!', 1, 0, 50, 100, 50].label~
+        player_jump_increase_air_time
+** Processing line: ~      end~
 - Inside source: true
 *** True Line Result
-          outputs.primitives << [920, 670, 'Map has been exported!', 1, 0, 50, 100, 50].label
-** Processing line: ~        end~
+      end
+** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
-        end
+    end
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~~
+** Processing line: ~    def input_move~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~        # Creates sprite following mouse to help indicate which sprite you have selected~
+    def input_move
+** Processing line: ~      if player.dx.abs < 20~
 - Inside source: true
 *** True Line Result
-        # Creates sprite following mouse to help indicate which sprite you have selected
-** Processing line: ~        outputs.primitives << [inputs.mouse.position.x, inputs.mouse.position.y,~
+      if player.dx.abs < 20
+** Processing line: ~        if inputs.keyboard.left~
 - Inside source: true
 *** True Line Result
-        outputs.primitives << [inputs.mouse.position.x, inputs.mouse.position.y,
-** Processing line: ~                               state.tile_size, state.tile_size, 'sprites/square-indigo.png', 0, 100].sprite~
+        if inputs.keyboard.left
+** Processing line: ~          player.dx -= 2~
 - Inside source: true
 *** True Line Result
-                               state.tile_size, state.tile_size, 'sprites/square-indigo.png', 0, 100].sprite
-** Processing line: ~      end~
+          player.dx -= 2
+** Processing line: ~        elsif inputs.keyboard.right~
 - Inside source: true
 *** True Line Result
-      end
-** Processing line: ~~
+        elsif inputs.keyboard.right
+** Processing line: ~          player.dx += 2~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~      render_mini_map~
+          player.dx += 2
+** Processing line: ~        end~
 - Inside source: true
 *** True Line Result
-      render_mini_map
-** Processing line: ~      outputs.primitives << [0, 0, 1280, 720, 255, 255, 255, 255 * state.game_start_at.ease(60, :flip)].solid~
+        end
+** Processing line: ~      end~
 - Inside source: true
 *** True Line Result
-      outputs.primitives << [0, 0, 1280, 720, 255, 255, 255, 255 * state.game_start_at.ease(60, :flip)].solid
+      end
 ** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
@@ -115007,66 +116603,78 @@ Follows is a source code listing for all files that have been open sourced. This
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~    def render_mini_map~
+** Processing line: ~    def calc_game_over~
 - Inside source: true
 *** True Line Result
-    def render_mini_map
-** Processing line: ~      x, y = 1170, 10~
+    def calc_game_over
+** Processing line: ~      if player.y < -64~
 - Inside source: true
 *** True Line Result
-      x, y = 1170, 10
-** Processing line: ~      outputs.primitives << [x, y, 100, 58, 0, 0, 0, 200].solid~
+      if player.y < -64
+** Processing line: ~        player.x = 64~
 - Inside source: true
 *** True Line Result
-      outputs.primitives << [x, y, 100, 58, 0, 0, 0, 200].solid
-** Processing line: ~      outputs.primitives << [x + args.state.x.fdiv(100) - 1, y + args.state.y.fdiv(100) - 1, 2, 2, 0, 255, 0].solid~
+        player.x = 64
+** Processing line: ~        player.y = 800~
 - Inside source: true
 *** True Line Result
-      outputs.primitives << [x + args.state.x.fdiv(100) - 1, y + args.state.y.fdiv(100) - 1, 2, 2, 0, 255, 0].solid
-** Processing line: ~      t_start = start_of_tongue~
+        player.y = 800
+** Processing line: ~        player.dx = 0~
 - Inside source: true
 *** True Line Result
-      t_start = start_of_tongue
-** Processing line: ~      t_end = end_of_tongue~
+        player.dx = 0
+** Processing line: ~        player.dy = 0~
 - Inside source: true
 *** True Line Result
-      t_end = end_of_tongue
-** Processing line: ~      outputs.primitives << [~
+        player.dy = 0
+** Processing line: ~      end~
 - Inside source: true
 *** True Line Result
-      outputs.primitives << [
-** Processing line: ~        x + t_start.x.fdiv(100), y + t_start.y.fdiv(100),~
+      end
+** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
-        x + t_start.x.fdiv(100), y + t_start.y.fdiv(100),
-** Processing line: ~        x + t_end.x.fdiv(100), y + t_end.y.fdiv(100),~
+    end
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-        x + t_end.x.fdiv(100), y + t_end.y.fdiv(100),
-** Processing line: ~        255, 255, 255~
+
+** Processing line: ~    def calc_player_rect~
 - Inside source: true
 *** True Line Result
-        255, 255, 255
-** Processing line: ~      ].line~
+    def calc_player_rect
+** Processing line: ~      player.rect      = player_current_rect~
 - Inside source: true
 *** True Line Result
-      ].line
+      player.rect      = player_current_rect
+** Processing line: ~      player.next_rect = player_next_rect~
+- Inside source: true
+*** True Line Result
+      player.next_rect = player_next_rect
+** Processing line: ~      player.prev_rect = player_prev_rect~
+- Inside source: true
+*** True Line Result
+      player.prev_rect = player_prev_rect
+** Processing line: ~    end~
+- Inside source: true
+*** True Line Result
+    end
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~      state.objects.each do |o|~
+** Processing line: ~    def calc_player_dx~
 - Inside source: true
 *** True Line Result
-      state.objects.each do |o|
-** Processing line: ~        outputs.primitives << [x + o.x.fdiv(100) - 1, y + o.y.fdiv(100) - 1, 2, 2, 200, 200, 0].solid~
+    def calc_player_dx
+** Processing line: ~      player.dx  = player_next_dx~
 - Inside source: true
 *** True Line Result
-        outputs.primitives << [x + o.x.fdiv(100) - 1, y + o.y.fdiv(100) - 1, 2, 2, 200, 200, 0].solid
-** Processing line: ~      end~
+      player.dx  = player_next_dx
+** Processing line: ~      player.x  += player.dx~
 - Inside source: true
 *** True Line Result
-      end
+      player.x  += player.dx
 ** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
@@ -115075,66 +116683,70 @@ Follows is a source code listing for all files that have been open sourced. This
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~    def calc_camera percentage_override = nil~
-- Inside source: true
-*** True Line Result
-    def calc_camera percentage_override = nil
-** Processing line: ~      percentage = percentage_override || (0.2 * state.camera_scale)~
+** Processing line: ~    def calc_player_dy~
 - Inside source: true
 *** True Line Result
-      percentage = percentage_override || (0.2 * state.camera_scale)
-** Processing line: ~      target_scale = state.target_camera_scale~
+    def calc_player_dy
+** Processing line: ~      player.y  += player.dy~
 - Inside source: true
 *** True Line Result
-      target_scale = state.target_camera_scale
-** Processing line: ~      distance_scale = target_scale - state.camera_scale~
+      player.y  += player.dy
+** Processing line: ~      player.dy  = player_next_dy~
 - Inside source: true
 *** True Line Result
-      distance_scale = target_scale - state.camera_scale
-** Processing line: ~      state.camera_scale += distance_scale * percentage~
+      player.dy  = player_next_dy
+** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
-      state.camera_scale += distance_scale * percentage
+    end
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~      target_x = state.x * state.target_camera_scale~
+** Processing line: ~    def calc_below~
 - Inside source: true
 *** True Line Result
-      target_x = state.x * state.target_camera_scale
-** Processing line: ~      target_y = state.y * state.target_camera_scale~
+    def calc_below
+** Processing line: ~      return unless player.dy < 0~
 - Inside source: true
 *** True Line Result
-      target_y = state.y * state.target_camera_scale
-** Processing line: ~~
+      return unless player.dy < 0
+** Processing line: ~      tiles_below = tiles_find { |t| t.rect.top <= player.prev_rect.y }~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~      distance_x = target_x - (state.camera_x + 640)~
+      tiles_below = tiles_find { |t| t.rect.top <= player.prev_rect.y }
+** Processing line: ~      collision = tiles_find_colliding tiles_below, (player.rect.merge y: player.next_rect.y)~
 - Inside source: true
 *** True Line Result
-      distance_x = target_x - (state.camera_x + 640)
-** Processing line: ~      distance_y = target_y - (state.camera_y + 360)~
+      collision = tiles_find_colliding tiles_below, (player.rect.merge y: player.next_rect.y)
+** Processing line: ~      if collision~
 - Inside source: true
 *** True Line Result
-      distance_y = target_y - (state.camera_y + 360)
-** Processing line: ~      state.camera_x += distance_x * percentage if distance_x.abs > 1~
+      if collision
+** Processing line: ~        player.y  = collision.rect.y + state.tile_size~
 - Inside source: true
 *** True Line Result
-      state.camera_x += distance_x * percentage if distance_x.abs > 1
-** Processing line: ~      state.camera_y += distance_y * percentage if distance_y.abs > 1~
+        player.y  = collision.rect.y + state.tile_size
+** Processing line: ~        player.dy = 0~
 - Inside source: true
 *** True Line Result
-      state.camera_y += distance_y * percentage if distance_y.abs > 1
-** Processing line: ~      state.camera_x = 0 if state.camera_x < 0~
+        player.dy = 0
+** Processing line: ~        player.action = :standing~
 - Inside source: true
 *** True Line Result
-      state.camera_x = 0 if state.camera_x < 0
-** Processing line: ~      state.camera_y = 0 if state.camera_y < 0~
+        player.action = :standing
+** Processing line: ~      else~
 - Inside source: true
 *** True Line Result
-      state.camera_y = 0 if state.camera_y < 0
+      else
+** Processing line: ~        player.action = :falling~
+- Inside source: true
+*** True Line Result
+        player.action = :falling
+** Processing line: ~      end~
+- Inside source: true
+*** True Line Result
+      end
 ** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
@@ -115143,30 +116755,34 @@ Follows is a source code listing for all files that have been open sourced. This
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~    def vx x~
+** Processing line: ~    def calc_left~
 - Inside source: true
 *** True Line Result
-    def vx x
-** Processing line: ~       (x * state.camera_scale) - state.camera_x~
+    def calc_left
+** Processing line: ~      return unless player.dx < 0 && player_next_dx < 0~
 - Inside source: true
 *** True Line Result
-       (x * state.camera_scale) - state.camera_x
-** Processing line: ~    end~
+      return unless player.dx < 0 && player_next_dx < 0
+** Processing line: ~      tiles_left = tiles_find { |t| t.rect.right <= player.prev_rect.left }~
 - Inside source: true
 *** True Line Result
-    end
-** Processing line: ~~
+      tiles_left = tiles_find { |t| t.rect.right <= player.prev_rect.left }
+** Processing line: ~      collision = tiles_find_colliding tiles_left, (player.rect.merge x: player.next_rect.x)~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~    def vy y~
+      collision = tiles_find_colliding tiles_left, (player.rect.merge x: player.next_rect.x)
+** Processing line: ~      return unless collision~
 - Inside source: true
 *** True Line Result
-    def vy y
-** Processing line: ~      (y * state.camera_scale) - state.camera_y~
+      return unless collision
+** Processing line: ~      player.x  = collision.rect.right~
 - Inside source: true
 *** True Line Result
-      (y * state.camera_scale) - state.camera_y
+      player.x  = collision.rect.right
+** Processing line: ~      player.dx = 0~
+- Inside source: true
+*** True Line Result
+      player.dx = 0
 ** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
@@ -115175,30 +116791,34 @@ Follows is a source code listing for all files that have been open sourced. This
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~    def vw w~
+** Processing line: ~    def calc_right~
 - Inside source: true
 *** True Line Result
-    def vw w
-** Processing line: ~      w * state.camera_scale~
+    def calc_right
+** Processing line: ~      return unless player.dx > 0 && player_next_dx > 0~
 - Inside source: true
 *** True Line Result
-      w * state.camera_scale
-** Processing line: ~    end~
+      return unless player.dx > 0 && player_next_dx > 0
+** Processing line: ~      tiles_right = tiles_find { |t| t.rect.left >= player.prev_rect.right }~
 - Inside source: true
 *** True Line Result
-    end
-** Processing line: ~~
+      tiles_right = tiles_find { |t| t.rect.left >= player.prev_rect.right }
+** Processing line: ~      collision = tiles_find_colliding tiles_right, (player.rect.merge x: player.next_rect.x)~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~    def vh h~
+      collision = tiles_find_colliding tiles_right, (player.rect.merge x: player.next_rect.x)
+** Processing line: ~      return unless collision~
 - Inside source: true
 *** True Line Result
-    def vh h
-** Processing line: ~      h * state.camera_scale~
+      return unless collision
+** Processing line: ~      player.x  = collision.rect.left - player.rect.w~
 - Inside source: true
 *** True Line Result
-      h * state.camera_scale
+      player.x  = collision.rect.left - player.rect.w
+** Processing line: ~      player.dx = 0~
+- Inside source: true
+*** True Line Result
+      player.dx = 0
 ** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
@@ -115207,30 +116827,34 @@ Follows is a source code listing for all files that have been open sourced. This
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~    def calc~
+** Processing line: ~    def calc_above~
 - Inside source: true
 *** True Line Result
-    def calc
-** Processing line: ~      calc_camera~
+    def calc_above
+** Processing line: ~      return unless player.dy > 0~
 - Inside source: true
 *** True Line Result
-      calc_camera
-** Processing line: ~      calc_world_lookup~
+      return unless player.dy > 0
+** Processing line: ~      tiles_above = tiles_find { |t| t.rect.y >= player.prev_rect.y }~
 - Inside source: true
 *** True Line Result
-      calc_world_lookup
-** Processing line: ~      calc_player~
+      tiles_above = tiles_find { |t| t.rect.y >= player.prev_rect.y }
+** Processing line: ~      collision = tiles_find_colliding tiles_above, (player.rect.merge y: player.next_rect.y)~
 - Inside source: true
 *** True Line Result
-      calc_player
-** Processing line: ~      calc_on_floor~
+      collision = tiles_find_colliding tiles_above, (player.rect.merge y: player.next_rect.y)
+** Processing line: ~      return unless collision~
 - Inside source: true
 *** True Line Result
-      calc_on_floor
-** Processing line: ~      calc_score~
+      return unless collision
+** Processing line: ~      player.dy = 0~
 - Inside source: true
 *** True Line Result
-      calc_score
+      player.dy = 0
+** Processing line: ~      player.y  = collision.rect.bottom - player.rect.h~
+- Inside source: true
+*** True Line Result
+      player.y  = collision.rect.bottom - player.rect.h
 ** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
@@ -115239,18 +116863,14 @@ Follows is a source code listing for all files that have been open sourced. This
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~    def set_camera_scale v = nil~
-- Inside source: true
-*** True Line Result
-    def set_camera_scale v = nil
-** Processing line: ~      return if v < 0.1~
+** Processing line: ~    def player_current_rect~
 - Inside source: true
 *** True Line Result
-      return if v < 0.1
-** Processing line: ~      state.target_camera_scale = v~
+    def player_current_rect
+** Processing line: ~      { x: player.x, y: player.y, w: player.size, h: player.size }~
 - Inside source: true
 *** True Line Result
-      state.target_camera_scale = v
+      { x: player.x, y: player.y, w: player.size, h: player.size }
 ** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
@@ -115259,110 +116879,118 @@ Follows is a source code listing for all files that have been open sourced. This
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~    def process_inputs_god_mode~
+** Processing line: ~    def available_brick_locations~
 - Inside source: true
 *** True Line Result
-    def process_inputs_god_mode
-** Processing line: ~      return unless state.god_mode~
+    def available_brick_locations
+** Processing line: ~      (0..19).to_a~
 - Inside source: true
 *** True Line Result
-      return unless state.god_mode
-** Processing line: ~~
+      (0..19).to_a
+** Processing line: ~        .product(0..11)~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~      if inputs.keyboard.key_down.equal_sign || (inputs.keyboard.equal_sign && state.tick_count.mod_zero?(10))~
+        .product(0..11)
+** Processing line: ~        .map do |(ordinal_x, ordinal_y)|~
 - Inside source: true
 *** True Line Result
-      if inputs.keyboard.key_down.equal_sign || (inputs.keyboard.equal_sign && state.tick_count.mod_zero?(10))
-** Processing line: ~        set_camera_scale state.camera_scale + 0.1~
+        .map do |(ordinal_x, ordinal_y)|
+** Processing line: ~        { ordinal_x: ordinal_x,~
 - Inside source: true
 *** True Line Result
-        set_camera_scale state.camera_scale + 0.1
-** Processing line: ~      elsif inputs.keyboard.key_down.hyphen || (inputs.keyboard.hyphen && state.tick_count.mod_zero?(10))~
+        { ordinal_x: ordinal_x,
+** Processing line: ~          ordinal_y: ordinal_y,~
 - Inside source: true
 *** True Line Result
-      elsif inputs.keyboard.key_down.hyphen || (inputs.keyboard.hyphen && state.tick_count.mod_zero?(10))
-** Processing line: ~        set_camera_scale state.camera_scale - 0.1~
+          ordinal_y: ordinal_y,
+** Processing line: ~          x: ordinal_x * 64,~
 - Inside source: true
 *** True Line Result
-        set_camera_scale state.camera_scale - 0.1
-** Processing line: ~      elsif inputs.keyboard.eight || inputs.keyboard.zero~
+          x: ordinal_x * 64,
+** Processing line: ~          y: ordinal_y * 64,~
 - Inside source: true
 *** True Line Result
-      elsif inputs.keyboard.eight || inputs.keyboard.zero
-** Processing line: ~        set_camera_scale 1~
+          y: ordinal_y * 64,
+** Processing line: ~          w: 64,~
 - Inside source: true
 *** True Line Result
-        set_camera_scale 1
+          w: 64,
+** Processing line: ~          h: 64 }~
+- Inside source: true
+*** True Line Result
+          h: 64 }
 ** Processing line: ~      end~
 - Inside source: true
 *** True Line Result
       end
+** Processing line: ~    end~
+- Inside source: true
+*** True Line Result
+    end
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~      if input_up?~
+** Processing line: ~    def player~
 - Inside source: true
 *** True Line Result
-      if input_up?
-** Processing line: ~        state.y += 10~
+    def player
+** Processing line: ~      state.player ||= args.state.new_entity :player~
 - Inside source: true
 *** True Line Result
-        state.y += 10
-** Processing line: ~        state.dy = 0~
+      state.player ||= args.state.new_entity :player
+** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
-        state.dy = 0
-** Processing line: ~      elsif input_down?~
+    end
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-      elsif input_down?
-** Processing line: ~        state.y -= 10~
+
+** Processing line: ~    def player_next_dy~
 - Inside source: true
 *** True Line Result
-        state.y -= 10
-** Processing line: ~        state.dy = 0~
+    def player_next_dy
+** Processing line: ~      player.dy + state.gravity + state.drag ** 2 * -1~
 - Inside source: true
 *** True Line Result
-        state.dy = 0
-** Processing line: ~      end~
+      player.dy + state.gravity + state.drag ** 2 * -1
+** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
-      end
+    end
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~      if input_left?~
+** Processing line: ~    def player_next_dx~
 - Inside source: true
 *** True Line Result
-      if input_left?
-** Processing line: ~        state.x -= 10~
+    def player_next_dx
+** Processing line: ~      player.dx * 0.8~
 - Inside source: true
 *** True Line Result
-        state.x -= 10
-** Processing line: ~        state.dx = 0~
+      player.dx * 0.8
+** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
-        state.dx = 0
-** Processing line: ~      elsif input_right?~
+    end
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-      elsif input_right?
-** Processing line: ~        state.x += 10~
+
+** Processing line: ~    def player_next_rect~
 - Inside source: true
 *** True Line Result
-        state.x += 10
-** Processing line: ~        state.dx = 0~
+    def player_next_rect
+** Processing line: ~      player.rect.merge x: player.x + player_next_dx,~
 - Inside source: true
 *** True Line Result
-        state.dx = 0
-** Processing line: ~      end~
+      player.rect.merge x: player.x + player_next_dx,
+** Processing line: ~                        y: player.y + player_next_dy~
 - Inside source: true
 *** True Line Result
-      end
+                        y: player.y + player_next_dy
 ** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
@@ -115371,50 +116999,50 @@ Follows is a source code listing for all files that have been open sourced. This
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~    def process_inputs~
+** Processing line: ~    def player_prev_rect~
 - Inside source: true
 *** True Line Result
-    def process_inputs
-** Processing line: ~      if state.scene == :game~
+    def player_prev_rect
+** Processing line: ~      player.rect.merge x: player.x - player.dx,~
 - Inside source: true
 *** True Line Result
-      if state.scene == :game
-** Processing line: ~        process_inputs_player_movement~
+      player.rect.merge x: player.x - player.dx,
+** Processing line: ~                        y: player.y - player.dy~
 - Inside source: true
 *** True Line Result
-        process_inputs_player_movement
-** Processing line: ~        process_inputs_god_mode~
+                        y: player.y - player.dy
+** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
-        process_inputs_god_mode
-** Processing line: ~      elsif state.scene == :intro~
+    end
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-      elsif state.scene == :intro
-** Processing line: ~        if args.inputs.keyboard.key_down.enter || args.inputs.keyboard.key_down.space~
+
+** Processing line: ~    def player_jump~
 - Inside source: true
 *** True Line Result
-        if args.inputs.keyboard.key_down.enter || args.inputs.keyboard.key_down.space
-** Processing line: ~          if Kernel.tick_count < 600~
+    def player_jump
+** Processing line: ~      return if player.action != :standing~
 - Inside source: true
 *** True Line Result
-          if Kernel.tick_count < 600
-** Processing line: ~            Kernel.tick_count = 600~
+      return if player.action != :standing
+** Processing line: ~      player.action = :jumping~
 - Inside source: true
 *** True Line Result
-            Kernel.tick_count = 600
-** Processing line: ~          end~
+      player.action = :jumping
+** Processing line: ~      player.dy = state.player.jump_power~
 - Inside source: true
 *** True Line Result
-          end
-** Processing line: ~        end~
+      player.dy = state.player.jump_power
+** Processing line: ~      current_frame = state.tick_count~
 - Inside source: true
 *** True Line Result
-        end
-** Processing line: ~      end~
+      current_frame = state.tick_count
+** Processing line: ~      player.action_at = current_frame~
 - Inside source: true
 *** True Line Result
-      end
+      player.action_at = current_frame
 ** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
@@ -115423,38 +117051,38 @@ Follows is a source code listing for all files that have been open sourced. This
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~    def input_up?~
+** Processing line: ~    def player_jump_increase_air_time~
 - Inside source: true
 *** True Line Result
-    def input_up?
-** Processing line: ~      inputs.keyboard.w || inputs.keyboard.up || inputs.keyboard.k~
+    def player_jump_increase_air_time
+** Processing line: ~      return if player.action != :jumping~
 - Inside source: true
 *** True Line Result
-      inputs.keyboard.w || inputs.keyboard.up || inputs.keyboard.k
-** Processing line: ~    end~
+      return if player.action != :jumping
+** Processing line: ~      return if player.action_at.elapsed_time >= player.jump_air_time~
 - Inside source: true
 *** True Line Result
-    end
-** Processing line: ~~
+      return if player.action_at.elapsed_time >= player.jump_air_time
+** Processing line: ~      player.dy += player.jump_increase_power~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~    def input_up_released?~
+      player.dy += player.jump_increase_power
+** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
-    def input_up_released?
-** Processing line: ~      inputs.keyboard.key_up.w ||~
+    end
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-      inputs.keyboard.key_up.w ||
-** Processing line: ~      inputs.keyboard.key_up.up ||~
+
+** Processing line: ~    def tiles~
 - Inside source: true
 *** True Line Result
-      inputs.keyboard.key_up.up ||
-** Processing line: ~      inputs.keyboard.key_up.k~
+    def tiles
+** Processing line: ~      state.tiles~
 - Inside source: true
 *** True Line Result
-      inputs.keyboard.key_up.k
+      state.tiles
 ** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
@@ -115463,14 +117091,14 @@ Follows is a source code listing for all files that have been open sourced. This
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~    def input_down?~
+** Processing line: ~    def tiles_find_colliding tiles, target~
 - Inside source: true
 *** True Line Result
-    def input_down?
-** Processing line: ~      inputs.keyboard.s || inputs.keyboard.down || inputs.keyboard.j~
+    def tiles_find_colliding tiles, target
+** Processing line: ~      tiles.find { |t| t.rect.intersect_rect? target }~
 - Inside source: true
 *** True Line Result
-      inputs.keyboard.s || inputs.keyboard.down || inputs.keyboard.j
+      tiles.find { |t| t.rect.intersect_rect? target }
 ** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
@@ -115479,138 +117107,142 @@ Follows is a source code listing for all files that have been open sourced. This
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~    def input_down_released?~
-- Inside source: true
-*** True Line Result
-    def input_down_released?
-** Processing line: ~      inputs.keyboard.key_up.s ||~
-- Inside source: true
-*** True Line Result
-      inputs.keyboard.key_up.s ||
-** Processing line: ~      inputs.keyboard.key_up.down ||~
+** Processing line: ~    def tiles_find &block~
 - Inside source: true
 *** True Line Result
-      inputs.keyboard.key_up.down ||
-** Processing line: ~      inputs.keyboard.key_up.j~
+    def tiles_find &block
+** Processing line: ~      tiles.find_all(&block)~
 - Inside source: true
 *** True Line Result
-      inputs.keyboard.key_up.j
+      tiles.find_all(&block)
 ** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
     end
+** Processing line: ~  end~
+- Inside source: true
+*** True Line Result
+  end
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~    def input_left?~
+** Processing line: ~  def tick args~
 - Inside source: true
 *** True Line Result
-    def input_left?
-** Processing line: ~      inputs.keyboard.a || inputs.keyboard.left || inputs.keyboard.h~
+  def tick args
+** Processing line: ~    $game ||= Game.new~
 - Inside source: true
 *** True Line Result
-      inputs.keyboard.a || inputs.keyboard.left || inputs.keyboard.h
-** Processing line: ~    end~
+    $game ||= Game.new
+** Processing line: ~    $game.args = args~
 - Inside source: true
 *** True Line Result
-    end
-** Processing line: ~~
+    $game.args = args
+** Processing line: ~    $game.tick~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~    def input_right?~
+    $game.tick
+** Processing line: ~  end~
 - Inside source: true
 *** True Line Result
-    def input_right?
-** Processing line: ~      inputs.keyboard.d || inputs.keyboard.right || inputs.keyboard.l~
+  end
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-      inputs.keyboard.d || inputs.keyboard.right || inputs.keyboard.l
-** Processing line: ~    end~
+
+** Processing line: ~  $gtk.reset~
 - Inside source: true
 *** True Line Result
-    end
+  $gtk.reset
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~    def set_object path, w, h~
-- Inside source: true
+** Processing line: ~#+end_src~
+- Line was identified as the end of a code block.
 *** True Line Result
-    def set_object path, w, h
-** Processing line: ~      state.object = path~
-- Inside source: true
+#+end_src
+** Processing line: ~~
+- End of paragraph detected.
 *** True Line Result
-      state.object = path
-** Processing line: ~      state.object_w = w~
-- Inside source: true
+
+** Processing line: ~*** Platformer - Clepto Frog - main.rb~
+- Header detected.
 *** True Line Result
-      state.object_w = w
-** Processing line: ~      state.object_h = h~
+
+*** True Line Result
+*** Platformer - Clepto Frog - main.rb
+** Processing line: ~#+begin_src ruby~
+- Line was identified as the beginning of a code block.
+*** True Line Result
+
+*** True Line Result
+#+begin_src ruby
+** Processing line: ~  # ./samples/99_genre_platformer/clepto_frog/app/main.rb~
 - Inside source: true
 *** True Line Result
-      state.object_h = h
-** Processing line: ~    end~
+  # ./samples/99_genre_platformer/clepto_frog/app/main.rb
+** Processing line: ~  MAP_FILE_PATH = 'map.txt'~
 - Inside source: true
 *** True Line Result
-    end
+  MAP_FILE_PATH = 'map.txt'
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~    def collision_mode~
+** Processing line: ~  require 'app/map.rb'~
 - Inside source: true
 *** True Line Result
-    def collision_mode
-** Processing line: ~      state.dev_action = :collision_mode~
+  require 'app/map.rb'
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-      state.dev_action = :collision_mode
-** Processing line: ~    end~
+
+** Processing line: ~  class CleptoFrog~
 - Inside source: true
 *** True Line Result
-    end
-** Processing line: ~~
+  class CleptoFrog
+** Processing line: ~    attr_gtk~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~    def process_inputs_player_movement~
+    attr_gtk
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-    def process_inputs_player_movement
-** Processing line: ~      if inputs.keyboard.key_down.g~
+
+** Processing line: ~    def render_ending~
 - Inside source: true
 *** True Line Result
-      if inputs.keyboard.key_down.g
-** Processing line: ~        state.god_mode = !state.god_mode~
+    def render_ending
+** Processing line: ~      state.game_over_at ||= state.tick_count~
 - Inside source: true
 *** True Line Result
-        state.god_mode = !state.god_mode
-** Processing line: ~        puts state.god_mode~
+      state.game_over_at ||= state.tick_count
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-        puts state.god_mode
-** Processing line: ~      end~
+
+** Processing line: ~      outputs.labels << [640, 700, "Clepto Frog", 4, 1]~
 - Inside source: true
 *** True Line Result
-      end
+      outputs.labels << [640, 700, "Clepto Frog", 4, 1]
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~      if inputs.keyboard.key_down.u && state.dev_action == :collision_mode~
+** Processing line: ~      if state.tick_count >= (state.game_over_at + 120)~
 - Inside source: true
 *** True Line Result
-      if inputs.keyboard.key_down.u && state.dev_action == :collision_mode
-** Processing line: ~        state.world = state.world[0..-2]~
+      if state.tick_count >= (state.game_over_at + 120)
+** Processing line: ~        outputs.labels << [640, 620, "\"I... I.... don't believe it.\" - New Guy",~
 - Inside source: true
 *** True Line Result
-        state.world = state.world[0..-2]
-** Processing line: ~        state.world_lookup = {}~
+        outputs.labels << [640, 620, "\"I... I.... don't believe it.\" - New Guy",
+** Processing line: ~                           4, 1, 0, 0, 0, 255 * (state.game_over_at + 120).ease(60)]~
 - Inside source: true
 *** True Line Result
-        state.world_lookup = {}
+                           4, 1, 0, 0, 0, 255 * (state.game_over_at + 120).ease(60)]
 ** Processing line: ~      end~
 - Inside source: true
 *** True Line Result
@@ -115619,38 +117251,38 @@ Follows is a source code listing for all files that have been open sourced. This
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~      if inputs.keyboard.key_down.space && !state.anchor_point~
+** Processing line: ~      if state.tick_count >= (state.game_over_at + 240)~
 - Inside source: true
 *** True Line Result
-      if inputs.keyboard.key_down.space && !state.anchor_point
-** Processing line: ~        state.tongue_length = 0~
+      if state.tick_count >= (state.game_over_at + 240)
+** Processing line: ~        outputs.labels << [640, 580, "\"He actually stole all the mugs?\" - New Guy",~
 - Inside source: true
 *** True Line Result
-        state.tongue_length = 0
-** Processing line: ~        state.action = :shooting~
+        outputs.labels << [640, 580, "\"He actually stole all the mugs?\" - New Guy",
+** Processing line: ~                           4, 1, 0, 0, 0, 255 * (state.game_over_at + 240).ease(60)]~
 - Inside source: true
 *** True Line Result
-        state.action = :shooting
-** Processing line: ~        outputs.sounds << 'sounds/shooting.wav'~
+                           4, 1, 0, 0, 0, 255 * (state.game_over_at + 240).ease(60)]
+** Processing line: ~      end~
 - Inside source: true
 *** True Line Result
-        outputs.sounds << 'sounds/shooting.wav'
-** Processing line: ~      elsif inputs.keyboard.key_down.space~
+      end
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-      elsif inputs.keyboard.key_down.space
-** Processing line: ~        state.action = :aiming~
+
+** Processing line: ~      if state.tick_count >= (state.game_over_at + 360)~
 - Inside source: true
 *** True Line Result
-        state.action = :aiming
-** Processing line: ~        state.anchor_point  = nil~
+      if state.tick_count >= (state.game_over_at + 360)
+** Processing line: ~        outputs.labels << [640, 540, "\"Kind of feel bad STARTING HIM WITH NOTHING again.\" - New Guy",~
 - Inside source: true
 *** True Line Result
-        state.anchor_point  = nil
-** Processing line: ~        state.tongue_length = 100~
+        outputs.labels << [640, 540, "\"Kind of feel bad STARTING HIM WITH NOTHING again.\" - New Guy",
+** Processing line: ~                           4, 1, 0, 0, 0, 255 * (state.game_over_at + 360).ease(60)]~
 - Inside source: true
 *** True Line Result
-        state.tongue_length = 100
+                           4, 1, 0, 0, 0, 255 * (state.game_over_at + 360).ease(60)]
 ** Processing line: ~      end~
 - Inside source: true
 *** True Line Result
@@ -115659,134 +117291,130 @@ Follows is a source code listing for all files that have been open sourced. This
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~      if state.anchor_point~
+** Processing line: ~      outputs.sprites << [640 - 50, 360 - 50, 100, 100,~
 - Inside source: true
 *** True Line Result
-      if state.anchor_point
-** Processing line: ~        if input_up?~
+      outputs.sprites << [640 - 50, 360 - 50, 100, 100,
+** Processing line: ~                          "sprites/square-green.png"]~
 - Inside source: true
 *** True Line Result
-        if input_up?
-** Processing line: ~          if state.tongue_length >= 105~
+                          "sprites/square-green.png"]
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-          if state.tongue_length >= 105
-** Processing line: ~            state.tongue_length -= 5~
+
+** Processing line: ~      outputs.labels << [640, 300, "Current Time: #{"%.2f" % state.stuff_time}", 4, 1]~
 - Inside source: true
 *** True Line Result
-            state.tongue_length -= 5
-** Processing line: ~            state.dy += 0.8~
+      outputs.labels << [640, 300, "Current Time: #{"%.2f" % state.stuff_time}", 4, 1]
+** Processing line: ~      outputs.labels << [640, 270, "Best Time: #{"%.2f" % state.stuff_best_time}", 4, 1]~
 - Inside source: true
 *** True Line Result
-            state.dy += 0.8
-** Processing line: ~          end~
+      outputs.labels << [640, 270, "Best Time: #{"%.2f" % state.stuff_best_time}", 4, 1]
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-          end
-** Processing line: ~        elsif input_down?~
+
+** Processing line: ~      if state.tick_count >= (state.game_over_at + 550)~
 - Inside source: true
 *** True Line Result
-        elsif input_down?
-** Processing line: ~          state.tongue_length += 5~
+      if state.tick_count >= (state.game_over_at + 550)
+** Processing line: ~        restart_game~
 - Inside source: true
 *** True Line Result
-          state.tongue_length += 5
-** Processing line: ~          state.dy -= 0.8~
+        restart_game
+** Processing line: ~      end~
 - Inside source: true
 *** True Line Result
-          state.dy -= 0.8
-** Processing line: ~        end~
+      end
+** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
-        end
+    end
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~        if input_left? && state.dx > 1~
-- Inside source: true
-*** True Line Result
-        if input_left? && state.dx > 1
-** Processing line: ~          state.dx *= 0.98~
+** Processing line: ~    def restart_game~
 - Inside source: true
 *** True Line Result
-          state.dx *= 0.98
-** Processing line: ~        elsif input_left? && state.dx < -1~
+    def restart_game
+** Processing line: ~      state.world = nil~
 - Inside source: true
 *** True Line Result
-        elsif input_left? && state.dx < -1
-** Processing line: ~          state.dx *= 1.03~
+      state.world = nil
+** Processing line: ~      state.x = nil~
 - Inside source: true
 *** True Line Result
-          state.dx *= 1.03
-** Processing line: ~        elsif input_left? && !state.on_floor~
+      state.x = nil
+** Processing line: ~      state.y = nil~
 - Inside source: true
 *** True Line Result
-        elsif input_left? && !state.on_floor
-** Processing line: ~          state.dx -= 3~
+      state.y = nil
+** Processing line: ~      state.dx = nil~
 - Inside source: true
 *** True Line Result
-          state.dx -= 3
-** Processing line: ~        elsif input_right? && state.dx > 1~
+      state.dx = nil
+** Processing line: ~      state.dy = nil~
 - Inside source: true
 *** True Line Result
-        elsif input_right? && state.dx > 1
-** Processing line: ~          state.dx *= 1.03~
+      state.dy = nil
+** Processing line: ~      state.stuff_score = 0~
 - Inside source: true
 *** True Line Result
-          state.dx *= 1.03
-** Processing line: ~        elsif input_right? && state.dx < -1~
+      state.stuff_score = 0
+** Processing line: ~      state.stuff_time = 0~
 - Inside source: true
 *** True Line Result
-        elsif input_right? && state.dx < -1
-** Processing line: ~          state.dx *= 0.98~
+      state.stuff_time = 0
+** Processing line: ~      state.intro_tick_count = nil~
 - Inside source: true
 *** True Line Result
-          state.dx *= 0.98
-** Processing line: ~        elsif input_right? && !state.on_floor~
+      state.intro_tick_count = nil
+** Processing line: ~      defaults~
 - Inside source: true
 *** True Line Result
-        elsif input_right? && !state.on_floor
-** Processing line: ~          state.dx += 3~
+      defaults
+** Processing line: ~      state.game_start_at = state.tick_count~
 - Inside source: true
 *** True Line Result
-          state.dx += 3
-** Processing line: ~        end~
+      state.game_start_at = state.tick_count
+** Processing line: ~      state.scene = :game~
 - Inside source: true
 *** True Line Result
-        end
-** Processing line: ~      else~
+      state.scene = :game
+** Processing line: ~      state.game_over_at = nil~
 - Inside source: true
 *** True Line Result
-      else
-** Processing line: ~        if input_left?~
+      state.game_over_at = nil
+** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
-        if input_left?
-** Processing line: ~          state.tongue_angle += 1.5~
+    end
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-          state.tongue_angle += 1.5
-** Processing line: ~          state.tongue_angle = state.tongue_angle~
+
+** Processing line: ~    def render_intro~
 - Inside source: true
 *** True Line Result
-          state.tongue_angle = state.tongue_angle
-** Processing line: ~        elsif input_right?~
+    def render_intro
+** Processing line: ~      outputs.labels << [640, 700, "Clepto Frog", 4, 1]~
 - Inside source: true
 *** True Line Result
-        elsif input_right?
-** Processing line: ~          state.tongue_angle -= 1.5~
+      outputs.labels << [640, 700, "Clepto Frog", 4, 1]
+** Processing line: ~      if state.tick_count == 120~
 - Inside source: true
 *** True Line Result
-          state.tongue_angle -= 1.5
-** Processing line: ~          state.tongue_angle = state.tongue_angle~
+      if state.tick_count == 120
+** Processing line: ~        state.scene = :game~
 - Inside source: true
 *** True Line Result
-          state.tongue_angle = state.tongue_angle
-** Processing line: ~        end~
+        state.scene = :game
+** Processing line: ~        state.game_start_at = state.tick_count~
 - Inside source: true
 *** True Line Result
-        end
+        state.game_start_at = state.tick_count
 ** Processing line: ~      end~
 - Inside source: true
 *** True Line Result
@@ -115799,42 +117427,50 @@ Follows is a source code listing for all files that have been open sourced. This
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~    def add_floors~
+** Processing line: ~    def tick~
 - Inside source: true
 *** True Line Result
-    def add_floors
-** Processing line: ~      # floors~
+    def tick
+** Processing line: ~      defaults~
 - Inside source: true
 *** True Line Result
-      # floors
-** Processing line: ~      state.world += [~
+      defaults
+** Processing line: ~      if state.scene == :intro && state.tick_count <= 120~
 - Inside source: true
 *** True Line Result
-      state.world += [
-** Processing line: ~        [0,       0, 10000, 40],~
+      if state.scene == :intro && state.tick_count <= 120
+** Processing line: ~        render_intro~
 - Inside source: true
 *** True Line Result
-        [0,       0, 10000, 40],
-** Processing line: ~        [0,    1670, 3250, 60],~
+        render_intro
+** Processing line: ~      elsif state.scene == :ending~
 - Inside source: true
 *** True Line Result
-        [0,    1670, 3250, 60],
-** Processing line: ~        [6691, 1653, 3290, 60],~
+      elsif state.scene == :ending
+** Processing line: ~        render_ending~
 - Inside source: true
 *** True Line Result
-        [6691, 1653, 3290, 60],
-** Processing line: ~        [1521, 3792, 7370, 60],~
+        render_ending
+** Processing line: ~      else~
 - Inside source: true
 *** True Line Result
-        [1521, 3792, 7370, 60],
-** Processing line: ~        [0, 5137, 3290, 60]~
+      else
+** Processing line: ~        render~
 - Inside source: true
 *** True Line Result
-        [0, 5137, 3290, 60]
-** Processing line: ~      ]~
+        render
+** Processing line: ~      end~
 - Inside source: true
 *** True Line Result
-      ]
+      end
+** Processing line: ~      calc~
+- Inside source: true
+*** True Line Result
+      calc
+** Processing line: ~      process_inputs~
+- Inside source: true
+*** True Line Result
+      process_inputs
 ** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
@@ -115843,354 +117479,350 @@ Follows is a source code listing for all files that have been open sourced. This
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~    def attempt_load_world_from_file~
-- Inside source: true
-*** True Line Result
-    def attempt_load_world_from_file
-** Processing line: ~      return if state.world~
+** Processing line: ~    def defaults~
 - Inside source: true
 *** True Line Result
-      return if state.world
-** Processing line: ~      # exported_world = gtk.read_file(MAP_FILE_PATH)~
+    def defaults
+** Processing line: ~      state.scene ||= :intro~
 - Inside source: true
 *** True Line Result
-      # exported_world = gtk.read_file(MAP_FILE_PATH)
-** Processing line: ~      state.world = []~
+      state.scene ||= :intro
+** Processing line: ~      state.stuff_score     ||= 0~
 - Inside source: true
 *** True Line Result
-      state.world = []
-** Processing line: ~      state.objects = []~
+      state.stuff_score     ||= 0
+** Processing line: ~      state.stuff_time      ||= 0~
 - Inside source: true
 *** True Line Result
-      state.objects = []
-** Processing line: ~~
+      state.stuff_time      ||= 0
+** Processing line: ~      state.stuff_best_time ||= nil~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~      if $collisions~
+      state.stuff_best_time ||= nil
+** Processing line: ~      state.camera_x ||= 0~
 - Inside source: true
 *** True Line Result
-      if $collisions
-** Processing line: ~        $collisions.map do |x, y, w, h|~
+      state.camera_x ||= 0
+** Processing line: ~      state.camera_y ||= 0~
 - Inside source: true
 *** True Line Result
-        $collisions.map do |x, y, w, h|
-** Processing line: ~          state.world << [x, y, w, h]~
+      state.camera_y ||= 0
+** Processing line: ~      state.target_camera_scale ||= 1~
 - Inside source: true
 *** True Line Result
-          state.world << [x, y, w, h]
-** Processing line: ~        end~
+      state.target_camera_scale ||= 1
+** Processing line: ~      state.camera_scale ||= 1~
 - Inside source: true
 *** True Line Result
-        end
-** Processing line: ~~
+      state.camera_scale ||= 1
+** Processing line: ~      state.tongue_length          ||= 100~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~        add_floors~
+      state.tongue_length          ||= 100
+** Processing line: ~      state.dev_action             ||= :collision_mode~
 - Inside source: true
 *** True Line Result
-        add_floors
-** Processing line: ~      # elsif exported_world~
+      state.dev_action             ||= :collision_mode
+** Processing line: ~      state.action                 ||= :aiming~
 - Inside source: true
 *** True Line Result
-      # elsif exported_world
-** Processing line: ~      #   exported_world.each_line.map do |l|~
+      state.action                 ||= :aiming
+** Processing line: ~      state.tongue_angle           ||= 90~
 - Inside source: true
 *** True Line Result
-      #   exported_world.each_line.map do |l|
-** Processing line: ~      #     tokens = l.strip.split(',')~
+      state.tongue_angle           ||= 90
+** Processing line: ~      state.tile_size                = 64~
 - Inside source: true
 *** True Line Result
-      #     tokens = l.strip.split(',')
-** Processing line: ~      #     x    = tokens[0].to_i~
+      state.tile_size                = 64
+** Processing line: ~      state.gravity                  = -0.1~
 - Inside source: true
 *** True Line Result
-      #     x    = tokens[0].to_i
-** Processing line: ~      #     y    = tokens[1].to_i~
+      state.gravity                  = -0.1
+** Processing line: ~      state.air                      = -0.01~
 - Inside source: true
 *** True Line Result
-      #     y    = tokens[1].to_i
-** Processing line: ~      #     type = tokens[2].to_i~
+      state.air                      = -0.01
+** Processing line: ~      state.player_width             = 60~
 - Inside source: true
 *** True Line Result
-      #     type = tokens[2].to_i
-** Processing line: ~      #     if type == 1~
+      state.player_width             = 60
+** Processing line: ~      state.player_height            = 60~
 - Inside source: true
 *** True Line Result
-      #     if type == 1
-** Processing line: ~      #       state.world << [x, y, state.tile_size, state.tile_size]~
+      state.player_height            = 60
+** Processing line: ~      state.collision_tolerance      = 0.0~
 - Inside source: true
 *** True Line Result
-      #       state.world << [x, y, state.tile_size, state.tile_size]
-** Processing line: ~      #     elsif type == 2~
+      state.collision_tolerance      = 0.0
+** Processing line: ~      state.previous_tile_size     ||= state.tile_size~
 - Inside source: true
 *** True Line Result
-      #     elsif type == 2
-** Processing line: ~      #       w, h, path = tokens[3..-1]~
+      state.previous_tile_size     ||= state.tile_size
+** Processing line: ~      state.x                      ||= 2400~
 - Inside source: true
 *** True Line Result
-      #       w, h, path = tokens[3..-1]
-** Processing line: ~      #       state.objects << [x, y, w.to_i, h.to_i, path]~
+      state.x                      ||= 2400
+** Processing line: ~      state.y                      ||= 200~
 - Inside source: true
 *** True Line Result
-      #       state.objects << [x, y, w.to_i, h.to_i, path]
-** Processing line: ~      #     end~
+      state.y                      ||= 200
+** Processing line: ~      state.dy                     ||= 0~
 - Inside source: true
 *** True Line Result
-      #     end
-** Processing line: ~      #   end~
+      state.dy                     ||= 0
+** Processing line: ~      state.dx                     ||= 0~
 - Inside source: true
 *** True Line Result
-      #   end
-** Processing line: ~~
+      state.dx                     ||= 0
+** Processing line: ~      attempt_load_world_from_file~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~      #   add_floors~
+      attempt_load_world_from_file
+** Processing line: ~      state.world_lookup           ||= { }~
 - Inside source: true
 *** True Line Result
-      #   add_floors
-** Processing line: ~      end~
+      state.world_lookup           ||= { }
+** Processing line: ~      state.world_collision_rects  ||= []~
 - Inside source: true
 *** True Line Result
-      end
-** Processing line: ~~
+      state.world_collision_rects  ||= []
+** Processing line: ~      state.mode                   ||= :creating~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~      if $mugs~
+      state.mode                   ||= :creating
+** Processing line: ~      state.select_menu            ||= [0, 720, 1280, 720]~
 - Inside source: true
 *** True Line Result
-      if $mugs
-** Processing line: ~        $mugs.map do |x, y, w, h, path|~
+      state.select_menu            ||= [0, 720, 1280, 720]
+** Processing line: ~      state.sprite_quantity        ||= 20~
 - Inside source: true
 *** True Line Result
-        $mugs.map do |x, y, w, h, path|
-** Processing line: ~          state.objects << [x, y, w, h, path]~
+      state.sprite_quantity        ||= 20
+** Processing line: ~      state.sprite_coords          ||= []~
 - Inside source: true
 *** True Line Result
-          state.objects << [x, y, w, h, path]
-** Processing line: ~        end~
+      state.sprite_coords          ||= []
+** Processing line: ~      state.banner_coords          ||= [640, 680 + 720]~
 - Inside source: true
 *** True Line Result
-        end
-** Processing line: ~      end~
+      state.banner_coords          ||= [640, 680 + 720]
+** Processing line: ~      state.sprite_selected        ||= 1~
 - Inside source: true
 *** True Line Result
-      end
-** Processing line: ~    end~
+      state.sprite_selected        ||= 1
+** Processing line: ~      state.map_saved_at           ||= 0~
 - Inside source: true
 *** True Line Result
-    end
-** Processing line: ~~
+      state.map_saved_at           ||= 0
+** Processing line: ~      state.intro_tick_count       ||= state.tick_count~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~    def calc_world_lookup~
+      state.intro_tick_count       ||= state.tick_count
+** Processing line: ~      if state.sprite_coords == []~
 - Inside source: true
 *** True Line Result
-    def calc_world_lookup
-** Processing line: ~      if state.tile_size != state.previous_tile_size~
+      if state.sprite_coords == []
+** Processing line: ~        count = 1~
 - Inside source: true
 *** True Line Result
-      if state.tile_size != state.previous_tile_size
-** Processing line: ~        state.previous_tile_size = state.tile_size~
+        count = 1
+** Processing line: ~        temp_x = 165~
 - Inside source: true
 *** True Line Result
-        state.previous_tile_size = state.tile_size
-** Processing line: ~        state.world_lookup = {}~
+        temp_x = 165
+** Processing line: ~        temp_y = 500 + 720~
 - Inside source: true
 *** True Line Result
-        state.world_lookup = {}
-** Processing line: ~      end~
+        temp_y = 500 + 720
+** Processing line: ~        state.sprite_quantity.times do~
 - Inside source: true
 *** True Line Result
-      end
-** Processing line: ~~
+        state.sprite_quantity.times do
+** Processing line: ~          state.sprite_coords += [[temp_x, temp_y, count]]~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~      return if state.world_lookup.keys.length > 0~
+          state.sprite_coords += [[temp_x, temp_y, count]]
+** Processing line: ~          temp_x += 100~
 - Inside source: true
 *** True Line Result
-      return if state.world_lookup.keys.length > 0
-** Processing line: ~      return unless state.world.length > 0~
+          temp_x += 100
+** Processing line: ~          count += 1~
 - Inside source: true
 *** True Line Result
-      return unless state.world.length > 0
-** Processing line: ~~
+          count += 1
+** Processing line: ~          if temp_x > 1280 - (165 + 50)~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~      # Searches through the world and finds the cordinates that exist~
+          if temp_x > 1280 - (165 + 50)
+** Processing line: ~            temp_x = 165~
 - Inside source: true
 *** True Line Result
-      # Searches through the world and finds the cordinates that exist
-** Processing line: ~      state.world_lookup = {}~
+            temp_x = 165
+** Processing line: ~            temp_y -= 75~
 - Inside source: true
 *** True Line Result
-      state.world_lookup = {}
-** Processing line: ~      state.world.each do |x, y, w, h|~
+            temp_y -= 75
+** Processing line: ~          end~
 - Inside source: true
 *** True Line Result
-      state.world.each do |x, y, w, h|
-** Processing line: ~        state.world_lookup[[x, y, w || state.tile_size, h || state.tile_size]] = true~
+          end
+** Processing line: ~        end~
 - Inside source: true
 *** True Line Result
-        state.world_lookup[[x, y, w || state.tile_size, h || state.tile_size]] = true
+        end
 ** Processing line: ~      end~
 - Inside source: true
 *** True Line Result
       end
+** Processing line: ~    end~
+- Inside source: true
+*** True Line Result
+    end
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~      # Assigns collision rects for every sprite drawn~
+** Processing line: ~    def start_of_tongue x = nil, y = nil~
 - Inside source: true
 *** True Line Result
-      # Assigns collision rects for every sprite drawn
-** Processing line: ~      state.world_collision_rects =~
+    def start_of_tongue x = nil, y = nil
+** Processing line: ~      x ||= state.x~
 - Inside source: true
 *** True Line Result
-      state.world_collision_rects =
-** Processing line: ~        state.world_lookup~
+      x ||= state.x
+** Processing line: ~      y ||= state.y~
 - Inside source: true
 *** True Line Result
-        state.world_lookup
-** Processing line: ~             .keys~
+      y ||= state.y
+** Processing line: ~      [~
 - Inside source: true
 *** True Line Result
-             .keys
-** Processing line: ~             .map do |x, y, w, h|~
+      [
+** Processing line: ~        x + state.player_width.half,~
 - Inside source: true
 *** True Line Result
-             .map do |x, y, w, h|
-** Processing line: ~               s = state.tile_size~
+        x + state.player_width.half,
+** Processing line: ~        y + state.player_height.half~
 - Inside source: true
 *** True Line Result
-               s = state.tile_size
-** Processing line: ~               w ||= s~
+        y + state.player_height.half
+** Processing line: ~      ]~
 - Inside source: true
 *** True Line Result
-               w ||= s
-** Processing line: ~               h ||= s~
+      ]
+** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
-               h ||= s
-** Processing line: ~               {~
+    end
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-               {
-** Processing line: ~                 args:       [x, y, w, h],~
+
+** Processing line: ~    def stage_definition~
 - Inside source: true
 *** True Line Result
-                 args:       [x, y, w, h],
-** Processing line: ~                 left_right: [x,     y + 4, w,     h - 6],~
+    def stage_definition
+** Processing line: ~      outputs.sprites << [vx(0), vy(0), vw(10000), vw(5875), 'sprites/level-map.png']~
 - Inside source: true
 *** True Line Result
-                 left_right: [x,     y + 4, w,     h - 6],
-** Processing line: ~                 top:        [x + 4, y + 6, w - 8, h - 6],~
+      outputs.sprites << [vx(0), vy(0), vw(10000), vw(5875), 'sprites/level-map.png']
+** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
-                 top:        [x + 4, y + 6, w - 8, h - 6],
-** Processing line: ~                 bottom:     [x + 1, y - 1, w - 2, h - 8],~
+    end
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-                 bottom:     [x + 1, y - 1, w - 2, h - 8],
-** Processing line: ~               }~
+
+** Processing line: ~    def render~
 - Inside source: true
 *** True Line Result
-               }
-** Processing line: ~             end~
+    def render
+** Processing line: ~      stage_definition~
 - Inside source: true
 *** True Line Result
-             end
-** Processing line: ~~
+      stage_definition
+** Processing line: ~      start_of_tongue_render = [vx(start_of_tongue.x), vy(start_of_tongue.y)]~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~    end~
+      start_of_tongue_render = [vx(start_of_tongue.x), vy(start_of_tongue.y)]
+** Processing line: ~      end_of_tongue_render = [vx(end_of_tongue.x), vy(end_of_tongue.y)]~
 - Inside source: true
 *** True Line Result
-    end
+      end_of_tongue_render = [vx(end_of_tongue.x), vy(end_of_tongue.y)]
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~    def calc_pendulum~
-- Inside source: true
-*** True Line Result
-    def calc_pendulum
-** Processing line: ~      return if !state.anchor_point~
+** Processing line: ~      if state.anchor_point~
 - Inside source: true
 *** True Line Result
-      return if !state.anchor_point
-** Processing line: ~      target_x = state.anchor_point.x - start_of_tongue.x~
+      if state.anchor_point
+** Processing line: ~        anchor_point_render = [vx(state.anchor_point.x), vy(state.anchor_point.y)]~
 - Inside source: true
 *** True Line Result
-      target_x = state.anchor_point.x - start_of_tongue.x
-** Processing line: ~      target_y = state.anchor_point.y -~
+        anchor_point_render = [vx(state.anchor_point.x), vy(state.anchor_point.y)]
+** Processing line: ~        outputs.sprites << { x: start_of_tongue_render.x,~
 - Inside source: true
 *** True Line Result
-      target_y = state.anchor_point.y -
-** Processing line: ~                 state.tongue_length - 5 - 20 - state.player_height~
+        outputs.sprites << { x: start_of_tongue_render.x,
+** Processing line: ~                             y: start_of_tongue_render.y,~
 - Inside source: true
 *** True Line Result
-                 state.tongue_length - 5 - 20 - state.player_height
-** Processing line: ~~
+                             y: start_of_tongue_render.y,
+** Processing line: ~                             w: vw(2),~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~      diff_y = state.y - target_y~
+                             w: vw(2),
+** Processing line: ~                             h: args.geometry.distance(start_of_tongue_render, anchor_point_render),~
 - Inside source: true
 *** True Line Result
-      diff_y = state.y - target_y
-** Processing line: ~~
+                             h: args.geometry.distance(start_of_tongue_render, anchor_point_render),
+** Processing line: ~                             path:  'sprites/square-pink.png',~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~      if target_x > 0~
+                             path:  'sprites/square-pink.png',
+** Processing line: ~                             angle_anchor_y: 0,~
 - Inside source: true
 *** True Line Result
-      if target_x > 0
-** Processing line: ~        state.dx += 0.6~
+                             angle_anchor_y: 0,
+** Processing line: ~                             angle: state.tongue_angle - 90 }~
 - Inside source: true
 *** True Line Result
-        state.dx += 0.6
-** Processing line: ~      elsif target_x < 0~
+                             angle: state.tongue_angle - 90 }
+** Processing line: ~      else~
 - Inside source: true
 *** True Line Result
-      elsif target_x < 0
-** Processing line: ~        state.dx -= 0.6~
+      else
+** Processing line: ~        outputs.sprites << { x: vx(start_of_tongue.x),~
 - Inside source: true
 *** True Line Result
-        state.dx -= 0.6
-** Processing line: ~      end~
+        outputs.sprites << { x: vx(start_of_tongue.x),
+** Processing line: ~                             y: vy(start_of_tongue.y),~
 - Inside source: true
 *** True Line Result
-      end
-** Processing line: ~~
+                             y: vy(start_of_tongue.y),
+** Processing line: ~                             w: vw(2),~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~      if diff_y > 0~
+                             w: vw(2),
+** Processing line: ~                             h: vh(state.tongue_length),~
 - Inside source: true
 *** True Line Result
-      if diff_y > 0
-** Processing line: ~        state.dy -= 0.1~
+                             h: vh(state.tongue_length),
+** Processing line: ~                             path:  'sprites/square-pink.png',~
 - Inside source: true
 *** True Line Result
-        state.dy -= 0.1
-** Processing line: ~      elsif diff_y < 0~
+                             path:  'sprites/square-pink.png',
+** Processing line: ~                             angle_anchor_y: 0,~
 - Inside source: true
 *** True Line Result
-      elsif diff_y < 0
-** Processing line: ~        state.dy += 0.1~
+                             angle_anchor_y: 0,
+** Processing line: ~                             angle: state.tongue_angle - 90 }~
 - Inside source: true
 *** True Line Result
-        state.dy += 0.1
+                             angle: state.tongue_angle - 90 }
 ** Processing line: ~      end~
 - Inside source: true
 *** True Line Result
@@ -116199,326 +117831,346 @@ Follows is a source code listing for all files that have been open sourced. This
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~      state.dx *= 0.99~
+** Processing line: ~      outputs.sprites << state.objects.map { |o| [vx(o.x), vy(o.y), vw(o.w), vh(o.h), o.path] }~
 - Inside source: true
 *** True Line Result
-      state.dx *= 0.99
+      outputs.sprites << state.objects.map { |o| [vx(o.x), vy(o.y), vw(o.w), vh(o.h), o.path] }
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~      if state.dy.abs < 2~
+** Processing line: ~      if state.god_mode~
 - Inside source: true
 *** True Line Result
-      if state.dy.abs < 2
-** Processing line: ~        state.dy *= 0.8~
+      if state.god_mode
+** Processing line: ~        # SHOW HIDE COLLISIONS~
 - Inside source: true
 *** True Line Result
-        state.dy *= 0.8
-** Processing line: ~      else~
+        # SHOW HIDE COLLISIONS
+** Processing line: ~        outputs.sprites << state.world.map do |rect|~
 - Inside source: true
 *** True Line Result
-      else
-** Processing line: ~        state.dy *= 0.90~
+        outputs.sprites << state.world.map do |rect|
+** Processing line: ~          x = vx(rect.x)~
 - Inside source: true
 *** True Line Result
-        state.dy *= 0.90
-** Processing line: ~      end~
+          x = vx(rect.x)
+** Processing line: ~          y = vy(rect.y)~
 - Inside source: true
 *** True Line Result
-      end
-** Processing line: ~~
+          y = vy(rect.y)
+** Processing line: ~          if x > -80 && x < 1280 && y > -80 && y < 720~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~      if state.tongue_length && state.y~
+          if x > -80 && x < 1280 && y > -80 && y < 720
+** Processing line: ~            {~
 - Inside source: true
 *** True Line Result
-      if state.tongue_length && state.y
-** Processing line: ~        state.dy += state.tongue_angle.vector_y state.tongue_length.fdiv(1000)~
+            {
+** Processing line: ~              x: x,~
 - Inside source: true
 *** True Line Result
-        state.dy += state.tongue_angle.vector_y state.tongue_length.fdiv(1000)
-** Processing line: ~      end~
+              x: x,
+** Processing line: ~              y: y,~
 - Inside source: true
 *** True Line Result
-      end
-** Processing line: ~    end~
+              y: y,
+** Processing line: ~              w: vw(rect.w || state.tile_size),~
 - Inside source: true
 *** True Line Result
-    end
-** Processing line: ~~
+              w: vw(rect.w || state.tile_size),
+** Processing line: ~              h: vh(rect.h || state.tile_size),~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~    def calc_tongue_angle~
+              h: vh(rect.h || state.tile_size),
+** Processing line: ~              path: 'sprites/square-gray.png',~
 - Inside source: true
 *** True Line Result
-    def calc_tongue_angle
-** Processing line: ~      return unless state.anchor_point~
+              path: 'sprites/square-gray.png',
+** Processing line: ~              a: 128~
 - Inside source: true
 *** True Line Result
-      return unless state.anchor_point
-** Processing line: ~      state.tongue_angle = args.geometry.angle_from state.anchor_point, start_of_tongue~
+              a: 128
+** Processing line: ~            }~
 - Inside source: true
 *** True Line Result
-      state.tongue_angle = args.geometry.angle_from state.anchor_point, start_of_tongue
-** Processing line: ~      state.tongue_length = args.geometry.distance(start_of_tongue, state.anchor_point)~
+            }
+** Processing line: ~          end~
 - Inside source: true
 *** True Line Result
-      state.tongue_length = args.geometry.distance(start_of_tongue, state.anchor_point)
-** Processing line: ~      state.tongue_length = state.tongue_length.greater(100)~
+          end
+** Processing line: ~        end~
 - Inside source: true
 *** True Line Result
-      state.tongue_length = state.tongue_length.greater(100)
-** Processing line: ~    end~
+        end
+** Processing line: ~      end~
 - Inside source: true
 *** True Line Result
-    end
+      end
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~    def player_from_end_of_tongue~
+** Processing line: ~      render_player~
 - Inside source: true
 *** True Line Result
-    def player_from_end_of_tongue
-** Processing line: ~      p = state.tongue_angle.vector(state.tongue_length)~
+      render_player
+** Processing line: ~      outputs.sprites << [vx(2315), vy(45), vw(569), vh(402), 'sprites/square-blue.png', 0, 40]~
 - Inside source: true
 *** True Line Result
-      p = state.tongue_angle.vector(state.tongue_length)
-** Processing line: ~      derived_start = [state.anchor_point.x - p.x, state.anchor_point.y - p.y]~
+      outputs.sprites << [vx(2315), vy(45), vw(569), vh(402), 'sprites/square-blue.png', 0, 40]
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-      derived_start = [state.anchor_point.x - p.x, state.anchor_point.y - p.y]
-** Processing line: ~      derived_start.x -= state.player_width.half~
+
+** Processing line: ~      # Label in top left of the screen~
 - Inside source: true
 *** True Line Result
-      derived_start.x -= state.player_width.half
-** Processing line: ~      derived_start.y -= state.player_height.half~
+      # Label in top left of the screen
+** Processing line: ~      outputs.primitives << [20, 640, 180, 70, 255, 255, 255, 128].solid~
 - Inside source: true
 *** True Line Result
-      derived_start.y -= state.player_height.half
-** Processing line: ~      derived_start~
+      outputs.primitives << [20, 640, 180, 70, 255, 255, 255, 128].solid
+** Processing line: ~      outputs.primitives << [30, 700, "Stuff: #{state.stuff_score} of #{$mugs.count}", 1].label~
 - Inside source: true
 *** True Line Result
-      derived_start
-** Processing line: ~    end~
+      outputs.primitives << [30, 700, "Stuff: #{state.stuff_score} of #{$mugs.count}", 1].label
+** Processing line: ~      outputs.primitives << [30, 670, "Time: #{"%.2f" % state.stuff_time}", 1].label~
 - Inside source: true
 *** True Line Result
-    end
+      outputs.primitives << [30, 670, "Time: #{"%.2f" % state.stuff_time}", 1].label
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~    def end_of_tongue~
+** Processing line: ~      if state.god_mode~
 - Inside source: true
 *** True Line Result
-    def end_of_tongue
-** Processing line: ~      p = state.tongue_angle.vector(state.tongue_length)~
+      if state.god_mode
+** Processing line: ~        if state.map_saved_at > 0 && state.map_saved_at.elapsed_time < 120~
 - Inside source: true
 *** True Line Result
-      p = state.tongue_angle.vector(state.tongue_length)
-** Processing line: ~      [start_of_tongue.x + p.x, start_of_tongue.y + p.y]~
+        if state.map_saved_at > 0 && state.map_saved_at.elapsed_time < 120
+** Processing line: ~          outputs.primitives << [920, 670, 'Map has been exported!', 1, 0, 50, 100, 50].label~
 - Inside source: true
 *** True Line Result
-      [start_of_tongue.x + p.x, start_of_tongue.y + p.y]
-** Processing line: ~    end~
+          outputs.primitives << [920, 670, 'Map has been exported!', 1, 0, 50, 100, 50].label
+** Processing line: ~        end~
 - Inside source: true
 *** True Line Result
-    end
+        end
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~    def calc_shooting~
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-    def calc_shooting
-** Processing line: ~      return unless state.action == :shooting~
+
+** Processing line: ~        # Creates sprite following mouse to help indicate which sprite you have selected~
 - Inside source: true
 *** True Line Result
-      return unless state.action == :shooting
-** Processing line: ~      state.tongue_length += 30~
+        # Creates sprite following mouse to help indicate which sprite you have selected
+** Processing line: ~        outputs.primitives << [inputs.mouse.position.x - 32 * state.camera_scale,~
 - Inside source: true
 *** True Line Result
-      state.tongue_length += 30
-** Processing line: ~      potential_anchor = end_of_tongue~
+        outputs.primitives << [inputs.mouse.position.x - 32 * state.camera_scale,
+** Processing line: ~                               inputs.mouse.position.y - 32 * state.camera_scale,~
 - Inside source: true
 *** True Line Result
-      potential_anchor = end_of_tongue
-** Processing line: ~      if potential_anchor.x <= 0~
+                               inputs.mouse.position.y - 32 * state.camera_scale,
+** Processing line: ~                               state.tile_size * state.camera_scale,~
 - Inside source: true
 *** True Line Result
-      if potential_anchor.x <= 0
-** Processing line: ~        state.anchor_point = potential_anchor~
+                               state.tile_size * state.camera_scale,
+** Processing line: ~                               state.tile_size * state.camera_scale, 'sprites/square-indigo.png', 0, 100].sprite~
 - Inside source: true
 *** True Line Result
-        state.anchor_point = potential_anchor
-** Processing line: ~        state.action = :anchored~
+                               state.tile_size * state.camera_scale, 'sprites/square-indigo.png', 0, 100].sprite
+** Processing line: ~      end~
 - Inside source: true
 *** True Line Result
-        state.action = :anchored
-** Processing line: ~        outputs.sounds << 'sounds/attached.wav'~
+      end
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-        outputs.sounds << 'sounds/attached.wav'
-** Processing line: ~      elsif potential_anchor.x >= 10000~
+
+** Processing line: ~      render_mini_map~
 - Inside source: true
 *** True Line Result
-      elsif potential_anchor.x >= 10000
-** Processing line: ~        state.anchor_point = potential_anchor~
+      render_mini_map
+** Processing line: ~      outputs.primitives << [0, 0, 1280, 720, 255, 255, 255, 255 * state.game_start_at.ease(60, :flip)].solid~
 - Inside source: true
 *** True Line Result
-        state.anchor_point = potential_anchor
-** Processing line: ~        state.action = :anchored~
+      outputs.primitives << [0, 0, 1280, 720, 255, 255, 255, 255 * state.game_start_at.ease(60, :flip)].solid
+** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
-        state.action = :anchored
-** Processing line: ~        outputs.sounds << 'sounds/attached.wav'~
+    end
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-        outputs.sounds << 'sounds/attached.wav'
-** Processing line: ~      elsif potential_anchor.y <= 0~
+
+** Processing line: ~    def render_mini_map~
 - Inside source: true
 *** True Line Result
-      elsif potential_anchor.y <= 0
-** Processing line: ~        state.anchor_point = potential_anchor~
+    def render_mini_map
+** Processing line: ~      x, y = 1170, 10~
 - Inside source: true
 *** True Line Result
-        state.anchor_point = potential_anchor
-** Processing line: ~        state.action = :anchored~
+      x, y = 1170, 10
+** Processing line: ~      outputs.primitives << [x, y, 100, 58, 0, 0, 0, 200].solid~
 - Inside source: true
 *** True Line Result
-        state.action = :anchored
-** Processing line: ~        outputs.sounds << 'sounds/attached.wav'~
+      outputs.primitives << [x, y, 100, 58, 0, 0, 0, 200].solid
+** Processing line: ~      outputs.primitives << [x + args.state.x.fdiv(100) - 1, y + args.state.y.fdiv(100) - 1, 2, 2, 0, 255, 0].solid~
 - Inside source: true
 *** True Line Result
-        outputs.sounds << 'sounds/attached.wav'
-** Processing line: ~      elsif potential_anchor.y >= 5875~
+      outputs.primitives << [x + args.state.x.fdiv(100) - 1, y + args.state.y.fdiv(100) - 1, 2, 2, 0, 255, 0].solid
+** Processing line: ~      t_start = start_of_tongue~
 - Inside source: true
 *** True Line Result
-      elsif potential_anchor.y >= 5875
-** Processing line: ~        state.anchor_point = potential_anchor~
+      t_start = start_of_tongue
+** Processing line: ~      t_end = end_of_tongue~
 - Inside source: true
 *** True Line Result
-        state.anchor_point = potential_anchor
-** Processing line: ~        state.action = :anchored~
+      t_end = end_of_tongue
+** Processing line: ~      outputs.primitives << [~
 - Inside source: true
 *** True Line Result
-        state.action = :anchored
-** Processing line: ~        outputs.sounds << 'sounds/attached.wav'~
+      outputs.primitives << [
+** Processing line: ~        x + t_start.x.fdiv(100), y + t_start.y.fdiv(100),~
 - Inside source: true
 *** True Line Result
-        outputs.sounds << 'sounds/attached.wav'
-** Processing line: ~      else~
+        x + t_start.x.fdiv(100), y + t_start.y.fdiv(100),
+** Processing line: ~        x + t_end.x.fdiv(100), y + t_end.y.fdiv(100),~
 - Inside source: true
 *** True Line Result
-      else
-** Processing line: ~        anchor_rect = [potential_anchor.x - 5, potential_anchor.y - 5, 10, 10]~
+        x + t_end.x.fdiv(100), y + t_end.y.fdiv(100),
+** Processing line: ~        255, 255, 255~
 - Inside source: true
 *** True Line Result
-        anchor_rect = [potential_anchor.x - 5, potential_anchor.y - 5, 10, 10]
-** Processing line: ~        collision = state.world_collision_rects.find_all do |v|~
+        255, 255, 255
+** Processing line: ~      ].line~
 - Inside source: true
 *** True Line Result
-        collision = state.world_collision_rects.find_all do |v|
-** Processing line: ~          [v[:args].x, v[:args].y, v[:args].w, v[:args].h].intersect_rect?(anchor_rect)~
+      ].line
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-          [v[:args].x, v[:args].y, v[:args].w, v[:args].h].intersect_rect?(anchor_rect)
-** Processing line: ~        end.first~
+
+** Processing line: ~      state.objects.each do |o|~
 - Inside source: true
 *** True Line Result
-        end.first
-** Processing line: ~        if collision~
+      state.objects.each do |o|
+** Processing line: ~        outputs.primitives << [x + o.x.fdiv(100) - 1, y + o.y.fdiv(100) - 1, 2, 2, 200, 200, 0].solid~
 - Inside source: true
 *** True Line Result
-        if collision
-** Processing line: ~          state.anchor_point = potential_anchor~
+        outputs.primitives << [x + o.x.fdiv(100) - 1, y + o.y.fdiv(100) - 1, 2, 2, 200, 200, 0].solid
+** Processing line: ~      end~
 - Inside source: true
 *** True Line Result
-          state.anchor_point = potential_anchor
-** Processing line: ~          state.action = :anchored~
+      end
+** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
-          state.action = :anchored
-** Processing line: ~        outputs.sounds << 'sounds/attached.wav'~
+    end
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-        outputs.sounds << 'sounds/attached.wav'
-** Processing line: ~        end~
+
+** Processing line: ~    def calc_camera percentage_override = nil~
 - Inside source: true
 *** True Line Result
-        end
-** Processing line: ~      end~
+    def calc_camera percentage_override = nil
+** Processing line: ~      percentage = percentage_override || (0.2 * state.camera_scale)~
 - Inside source: true
 *** True Line Result
-      end
-** Processing line: ~    end~
+      percentage = percentage_override || (0.2 * state.camera_scale)
+** Processing line: ~      target_scale = state.target_camera_scale~
 - Inside source: true
 *** True Line Result
-    end
+      target_scale = state.target_camera_scale
+** Processing line: ~      distance_scale = target_scale - state.camera_scale~
+- Inside source: true
+*** True Line Result
+      distance_scale = target_scale - state.camera_scale
+** Processing line: ~      state.camera_scale += distance_scale * percentage~
+- Inside source: true
+*** True Line Result
+      state.camera_scale += distance_scale * percentage
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~    def calc_player~
+** Processing line: ~      target_x = state.x * state.target_camera_scale~
 - Inside source: true
 *** True Line Result
-    def calc_player
-** Processing line: ~      calc_shooting~
+      target_x = state.x * state.target_camera_scale
+** Processing line: ~      target_y = state.y * state.target_camera_scale~
 - Inside source: true
 *** True Line Result
-      calc_shooting
-** Processing line: ~      if !state.god_mode~
+      target_y = state.y * state.target_camera_scale
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-      if !state.god_mode
-** Processing line: ~        state.dy += state.gravity  # Since acceleration is the change in velocity, the change in y (dy) increases every frame~
+
+** Processing line: ~      distance_x = target_x - (state.camera_x + 640)~
 - Inside source: true
 *** True Line Result
-        state.dy += state.gravity  # Since acceleration is the change in velocity, the change in y (dy) increases every frame
-** Processing line: ~        state.dx += state.dx * state.air~
+      distance_x = target_x - (state.camera_x + 640)
+** Processing line: ~      distance_y = target_y - (state.camera_y + 360)~
 - Inside source: true
 *** True Line Result
-        state.dx += state.dx * state.air
-** Processing line: ~      end~
+      distance_y = target_y - (state.camera_y + 360)
+** Processing line: ~      state.camera_x += distance_x * percentage if distance_x.abs > 1~
 - Inside source: true
 *** True Line Result
-      end
-** Processing line: ~      calc_pendulum~
+      state.camera_x += distance_x * percentage if distance_x.abs > 1
+** Processing line: ~      state.camera_y += distance_y * percentage if distance_y.abs > 1~
 - Inside source: true
 *** True Line Result
-      calc_pendulum
-** Processing line: ~      calc_box_collision~
+      state.camera_y += distance_y * percentage if distance_y.abs > 1
+** Processing line: ~      state.camera_x = 0 if state.camera_x < 0~
 - Inside source: true
 *** True Line Result
-      calc_box_collision
-** Processing line: ~      calc_edge_collision~
+      state.camera_x = 0 if state.camera_x < 0
+** Processing line: ~      state.camera_y = 0 if state.camera_y < 0~
 - Inside source: true
 *** True Line Result
-      calc_edge_collision
-** Processing line: ~      if !state.god_mode~
+      state.camera_y = 0 if state.camera_y < 0
+** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
-      if !state.god_mode
-** Processing line: ~        state.y  += state.dy~
+    end
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-        state.y  += state.dy
-** Processing line: ~        state.x  += state.dx~
+
+** Processing line: ~    def vx x~
 - Inside source: true
 *** True Line Result
-        state.x  += state.dx
-** Processing line: ~      end~
+    def vx x
+** Processing line: ~       (x * state.camera_scale) - state.camera_x~
 - Inside source: true
 *** True Line Result
-      end
-** Processing line: ~      calc_tongue_angle~
+       (x * state.camera_scale) - state.camera_x
+** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
-      calc_tongue_angle
+    end
+** Processing line: ~~
+- Inside source: true
+*** True Line Result
+
+** Processing line: ~    def vy y~
+- Inside source: true
+*** True Line Result
+    def vy y
+** Processing line: ~      (y * state.camera_scale) - state.camera_y~
+- Inside source: true
+*** True Line Result
+      (y * state.camera_scale) - state.camera_y
 ** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
@@ -116527,30 +118179,30 @@ Follows is a source code listing for all files that have been open sourced. This
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~    def calc_box_collision~
+** Processing line: ~    def vw w~
 - Inside source: true
 *** True Line Result
-    def calc_box_collision
-** Processing line: ~      return unless state.world_lookup.keys.length > 0~
+    def vw w
+** Processing line: ~      w * state.camera_scale~
 - Inside source: true
 *** True Line Result
-      return unless state.world_lookup.keys.length > 0
-** Processing line: ~      collision_floor~
+      w * state.camera_scale
+** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
-      collision_floor
-** Processing line: ~      collision_left~
+    end
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-      collision_left
-** Processing line: ~      collision_right~
+
+** Processing line: ~    def vh h~
 - Inside source: true
 *** True Line Result
-      collision_right
-** Processing line: ~      collision_ceiling~
+    def vh h
+** Processing line: ~      h * state.camera_scale~
 - Inside source: true
 *** True Line Result
-      collision_ceiling
+      h * state.camera_scale
 ** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
@@ -116559,266 +118211,282 @@ Follows is a source code listing for all files that have been open sourced. This
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~    def calc_edge_collision~
+** Processing line: ~    def calc~
 - Inside source: true
 *** True Line Result
-    def calc_edge_collision
-** Processing line: ~      # Ensures that player doesn't fall below the map~
+    def calc
+** Processing line: ~      calc_camera~
 - Inside source: true
 *** True Line Result
-      # Ensures that player doesn't fall below the map
-** Processing line: ~      if next_y < 0 && state.dy < 0~
+      calc_camera
+** Processing line: ~      calc_world_lookup~
 - Inside source: true
 *** True Line Result
-      if next_y < 0 && state.dy < 0
-** Processing line: ~        state.y = 0~
+      calc_world_lookup
+** Processing line: ~      calc_player~
 - Inside source: true
 *** True Line Result
-        state.y = 0
-** Processing line: ~        state.dy = state.dy.abs * 0.8~
+      calc_player
+** Processing line: ~      calc_on_floor~
 - Inside source: true
 *** True Line Result
-        state.dy = state.dy.abs * 0.8
-** Processing line: ~        state.collision_on_y = true~
+      calc_on_floor
+** Processing line: ~      calc_score~
 - Inside source: true
 *** True Line Result
-        state.collision_on_y = true
-** Processing line: ~      # Ensures player doesn't go insanely high~
+      calc_score
+** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
-      # Ensures player doesn't go insanely high
-** Processing line: ~      elsif next_y > 5875 - state.tile_size && state.dy > 0~
+    end
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-      elsif next_y > 5875 - state.tile_size && state.dy > 0
-** Processing line: ~        state.y = 5875 - state.tile_size~
+
+** Processing line: ~    def set_camera_scale v = nil~
 - Inside source: true
 *** True Line Result
-        state.y = 5875 - state.tile_size
-** Processing line: ~        state.dy = state.dy.abs * 0.8 * -1~
+    def set_camera_scale v = nil
+** Processing line: ~      return if v < 0.1~
 - Inside source: true
 *** True Line Result
-        state.dy = state.dy.abs * 0.8 * -1
-** Processing line: ~        state.collision_on_y = true~
+      return if v < 0.1
+** Processing line: ~      state.target_camera_scale = v~
 - Inside source: true
 *** True Line Result
-        state.collision_on_y = true
-** Processing line: ~      end~
+      state.target_camera_scale = v
+** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
-      end
+    end
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~      # Ensures that player remains in the horizontal range its supposed to~
+** Processing line: ~    def process_inputs_god_mode~
 - Inside source: true
 *** True Line Result
-      # Ensures that player remains in the horizontal range its supposed to
-** Processing line: ~      if state.x >= 10000 - state.tile_size && state.dx > 0~
+    def process_inputs_god_mode
+** Processing line: ~      return unless state.god_mode~
 - Inside source: true
 *** True Line Result
-      if state.x >= 10000 - state.tile_size && state.dx > 0
-** Processing line: ~        state.x = 10000 - state.tile_size~
+      return unless state.god_mode
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-        state.x = 10000 - state.tile_size
-** Processing line: ~        state.dx = state.dx.abs * 0.8 * -1~
+
+** Processing line: ~      if inputs.keyboard.key_down.equal_sign || (inputs.keyboard.equal_sign && state.tick_count.mod_zero?(10))~
 - Inside source: true
 *** True Line Result
-        state.dx = state.dx.abs * 0.8 * -1
-** Processing line: ~        state.collision_on_x = true~
+      if inputs.keyboard.key_down.equal_sign || (inputs.keyboard.equal_sign && state.tick_count.mod_zero?(10))
+** Processing line: ~        set_camera_scale state.camera_scale + 0.1~
 - Inside source: true
 *** True Line Result
-        state.collision_on_x = true
-** Processing line: ~      elsif state.x <= 0 && state.dx < 0~
+        set_camera_scale state.camera_scale + 0.1
+** Processing line: ~      elsif inputs.keyboard.key_down.hyphen || (inputs.keyboard.hyphen && state.tick_count.mod_zero?(10))~
 - Inside source: true
 *** True Line Result
-      elsif state.x <= 0 && state.dx < 0
-** Processing line: ~        state.x = 0~
+      elsif inputs.keyboard.key_down.hyphen || (inputs.keyboard.hyphen && state.tick_count.mod_zero?(10))
+** Processing line: ~        set_camera_scale state.camera_scale - 0.1~
 - Inside source: true
 *** True Line Result
-        state.x = 0
-** Processing line: ~        state.dx = state.dx.abs * 0.8~
+        set_camera_scale state.camera_scale - 0.1
+** Processing line: ~      elsif inputs.keyboard.eight || inputs.keyboard.zero~
 - Inside source: true
 *** True Line Result
-        state.dx = state.dx.abs * 0.8
-** Processing line: ~        state.collision_on_x = true~
+      elsif inputs.keyboard.eight || inputs.keyboard.zero
+** Processing line: ~        set_camera_scale 1~
 - Inside source: true
 *** True Line Result
-        state.collision_on_x = true
+        set_camera_scale 1
 ** Processing line: ~      end~
 - Inside source: true
 *** True Line Result
       end
-** Processing line: ~    end~
-- Inside source: true
-*** True Line Result
-    end
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~    def next_y~
+** Processing line: ~      if inputs.mouse.click~
 - Inside source: true
 *** True Line Result
-    def next_y
-** Processing line: ~      state.y + state.dy~
+      if inputs.mouse.click
+** Processing line: ~        state.id_seed += 1~
 - Inside source: true
 *** True Line Result
-      state.y + state.dy
-** Processing line: ~    end~
+        state.id_seed += 1
+** Processing line: ~        id = state.id_seed~
 - Inside source: true
 *** True Line Result
-    end
-** Processing line: ~~
+        id = state.id_seed
+** Processing line: ~        x = state.camera_x + (inputs.mouse.click.x.fdiv(state.camera_scale) - 32)~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~    def next_x~
+        x = state.camera_x + (inputs.mouse.click.x.fdiv(state.camera_scale) - 32)
+** Processing line: ~        y = state.camera_y + (inputs.mouse.click.y.fdiv(state.camera_scale) - 32)~
 - Inside source: true
 *** True Line Result
-    def next_x
-** Processing line: ~      if state.dx < 0~
+        y = state.camera_y + (inputs.mouse.click.y.fdiv(state.camera_scale) - 32)
+** Processing line: ~        x = ((x + 2).idiv 4) * 4~
 - Inside source: true
 *** True Line Result
-      if state.dx < 0
-** Processing line: ~        return (state.x + state.dx) - (state.tile_size - state.player_width)~
+        x = ((x + 2).idiv 4) * 4
+** Processing line: ~        y = ((y + 2).idiv 4) * 4~
 - Inside source: true
 *** True Line Result
-        return (state.x + state.dx) - (state.tile_size - state.player_width)
-** Processing line: ~      else~
+        y = ((y + 2).idiv 4) * 4
+** Processing line: ~        w = 64~
 - Inside source: true
 *** True Line Result
-      else
-** Processing line: ~        return (state.x + state.dx) + (state.tile_size - state.player_width)~
+        w = 64
+** Processing line: ~        h = 64~
 - Inside source: true
 *** True Line Result
-        return (state.x + state.dx) + (state.tile_size - state.player_width)
-** Processing line: ~      end~
+        h = 64
+** Processing line: ~        candidate_rect = { id: id, x: x, y: y, w: w, h: h }~
 - Inside source: true
 *** True Line Result
-      end
-** Processing line: ~    end~
+        candidate_rect = { id: id, x: x, y: y, w: w, h: h }
+** Processing line: ~        scaled_candidate_rect = { x: x + 30, y: y + 30, w: w - 60, h: h - 60 }~
 - Inside source: true
 *** True Line Result
-    end
-** Processing line: ~~
+        scaled_candidate_rect = { x: x + 30, y: y + 30, w: w - 60, h: h - 60 }
+** Processing line: ~        to_remove = state.world.find { |r| r.intersect_rect? scaled_candidate_rect }~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~    def collision_floor~
+        to_remove = state.world.find { |r| r.intersect_rect? scaled_candidate_rect }
+** Processing line: ~        if to_remove && args.inputs.keyboard.x~
 - Inside source: true
 *** True Line Result
-    def collision_floor
-** Processing line: ~      return unless state.dy <= 0~
+        if to_remove && args.inputs.keyboard.x
+** Processing line: ~          state.world.reject! { |r| r.id == to_remove.id }~
 - Inside source: true
 *** True Line Result
-      return unless state.dy <= 0
-** Processing line: ~~
+          state.world.reject! { |r| r.id == to_remove.id }
+** Processing line: ~        else~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~      player_rect = [state.x, next_y, state.tile_size, state.tile_size]~
+        else
+** Processing line: ~          state.world << candidate_rect~
 - Inside source: true
 *** True Line Result
-      player_rect = [state.x, next_y, state.tile_size, state.tile_size]
-** Processing line: ~~
+          state.world << candidate_rect
+** Processing line: ~        end~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~      # Runs through all the sprites on the field and determines if the player hits the bottom of sprite (hence "-0.1" above)~
+        end
+** Processing line: ~        export_map~
 - Inside source: true
 *** True Line Result
-      # Runs through all the sprites on the field and determines if the player hits the bottom of sprite (hence "-0.1" above)
-** Processing line: ~      floor_collisions = state.world_collision_rects~
+        export_map
+** Processing line: ~        state.world_lookup = {}~
 - Inside source: true
 *** True Line Result
-      floor_collisions = state.world_collision_rects
-** Processing line: ~                           .find_all { |r| r[:top].intersect_rect?(player_rect, state.collision_tolerance) }~
+        state.world_lookup = {}
+** Processing line: ~        state.world_collision_rects = nil~
 - Inside source: true
 *** True Line Result
-                           .find_all { |r| r[:top].intersect_rect?(player_rect, state.collision_tolerance) }
-** Processing line: ~                           .first~
+        state.world_collision_rects = nil
+** Processing line: ~        calc_world_lookup~
 - Inside source: true
 *** True Line Result
-                           .first
+        calc_world_lookup
+** Processing line: ~      end~
+- Inside source: true
+*** True Line Result
+      end
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~      return unless floor_collisions~
+** Processing line: ~      if input_up?~
 - Inside source: true
 *** True Line Result
-      return unless floor_collisions
-** Processing line: ~      state.y = floor_collisions[:top].top~
+      if input_up?
+** Processing line: ~        state.y += 10~
 - Inside source: true
 *** True Line Result
-      state.y = floor_collisions[:top].top
-** Processing line: ~      state.dy = state.dy.abs * 0.8~
+        state.y += 10
+** Processing line: ~        state.dy = 0~
 - Inside source: true
 *** True Line Result
-      state.dy = state.dy.abs * 0.8
-** Processing line: ~    end~
+        state.dy = 0
+** Processing line: ~      elsif input_down?~
 - Inside source: true
 *** True Line Result
-    end
+      elsif input_down?
+** Processing line: ~        state.y -= 10~
+- Inside source: true
+*** True Line Result
+        state.y -= 10
+** Processing line: ~        state.dy = 0~
+- Inside source: true
+*** True Line Result
+        state.dy = 0
+** Processing line: ~      end~
+- Inside source: true
+*** True Line Result
+      end
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~    def collision_left~
+** Processing line: ~      if input_left?~
 - Inside source: true
 *** True Line Result
-    def collision_left
-** Processing line: ~      return unless state.dx < 0~
+      if input_left?
+** Processing line: ~        state.x -= 10~
 - Inside source: true
 *** True Line Result
-      return unless state.dx < 0
-** Processing line: ~      player_rect = [next_x, state.y, state.tile_size, state.tile_size]~
+        state.x -= 10
+** Processing line: ~        state.dx = 0~
 - Inside source: true
 *** True Line Result
-      player_rect = [next_x, state.y, state.tile_size, state.tile_size]
-** Processing line: ~~
+        state.dx = 0
+** Processing line: ~      elsif input_right?~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~      # Runs through all the sprites on the field and determines if the player hits the left side of sprite (hence "-0.1" above)~
+      elsif input_right?
+** Processing line: ~        state.x += 10~
 - Inside source: true
 *** True Line Result
-      # Runs through all the sprites on the field and determines if the player hits the left side of sprite (hence "-0.1" above)
-** Processing line: ~      left_side_collisions = state.world_collision_rects~
+        state.x += 10
+** Processing line: ~        state.dx = 0~
 - Inside source: true
 *** True Line Result
-      left_side_collisions = state.world_collision_rects
-** Processing line: ~                               .find_all { |r| r[:left_right].intersect_rect?(player_rect, state.collision_tolerance) }~
+        state.dx = 0
+** Processing line: ~      end~
 - Inside source: true
 *** True Line Result
-                               .find_all { |r| r[:left_right].intersect_rect?(player_rect, state.collision_tolerance) }
-** Processing line: ~                               .first~
+      end
+** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
-                               .first
+    end
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~      return unless left_side_collisions~
+** Processing line: ~    def process_inputs~
 - Inside source: true
 *** True Line Result
-      return unless left_side_collisions
-** Processing line: ~      state.x = left_side_collisions[:left_right].right~
+    def process_inputs
+** Processing line: ~      if state.scene == :game~
 - Inside source: true
 *** True Line Result
-      state.x = left_side_collisions[:left_right].right
-** Processing line: ~      state.dx = state.dy.abs * 0.8~
+      if state.scene == :game
+** Processing line: ~        process_inputs_player_movement~
 - Inside source: true
 *** True Line Result
-      state.dx = state.dy.abs * 0.8
-** Processing line: ~      state.collision_on_x = true~
+        process_inputs_player_movement
+** Processing line: ~        process_inputs_god_mode~
 - Inside source: true
 *** True Line Result
-      state.collision_on_x = true
+        process_inputs_god_mode
+** Processing line: ~      end~
+- Inside source: true
+*** True Line Result
+      end
 ** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
@@ -116827,58 +118495,54 @@ Follows is a source code listing for all files that have been open sourced. This
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~    def collision_right~
+** Processing line: ~    def input_up?~
 - Inside source: true
 *** True Line Result
-    def collision_right
-** Processing line: ~      return unless state.dx > 0~
+    def input_up?
+** Processing line: ~      inputs.keyboard.w || inputs.keyboard.up || inputs.keyboard.k~
 - Inside source: true
 *** True Line Result
-      return unless state.dx > 0
+      inputs.keyboard.w || inputs.keyboard.up || inputs.keyboard.k
+** Processing line: ~    end~
+- Inside source: true
+*** True Line Result
+    end
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~      player_rect = [next_x, state.y, state.tile_size, state.tile_size]~
+** Processing line: ~    def input_up_released?~
 - Inside source: true
 *** True Line Result
-      player_rect = [next_x, state.y, state.tile_size, state.tile_size]
-** Processing line: ~      # Runs through all the sprites on the field and determines if the player hits the right side of sprite (hence "-0.1" above)~
+    def input_up_released?
+** Processing line: ~      inputs.keyboard.key_up.w ||~
 - Inside source: true
 *** True Line Result
-      # Runs through all the sprites on the field and determines if the player hits the right side of sprite (hence "-0.1" above)
-** Processing line: ~      right_side_collisions = state.world_collision_rects~
+      inputs.keyboard.key_up.w ||
+** Processing line: ~      inputs.keyboard.key_up.up ||~
 - Inside source: true
 *** True Line Result
-      right_side_collisions = state.world_collision_rects
-** Processing line: ~                                .find_all { |r| r[:left_right].intersect_rect?(player_rect, state.collision_tolerance) }~
+      inputs.keyboard.key_up.up ||
+** Processing line: ~      inputs.keyboard.key_up.k~
 - Inside source: true
 *** True Line Result
-                                .find_all { |r| r[:left_right].intersect_rect?(player_rect, state.collision_tolerance) }
-** Processing line: ~                                .first~
+      inputs.keyboard.key_up.k
+** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
-                                .first
+    end
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~      return unless right_side_collisions~
-- Inside source: true
-*** True Line Result
-      return unless right_side_collisions
-** Processing line: ~      state.x = right_side_collisions[:left_right].left - state.tile_size~
-- Inside source: true
-*** True Line Result
-      state.x = right_side_collisions[:left_right].left - state.tile_size
-** Processing line: ~      state.dx = state.dx.abs * 0.8 * -1~
+** Processing line: ~    def input_down?~
 - Inside source: true
 *** True Line Result
-      state.dx = state.dx.abs * 0.8 * -1
-** Processing line: ~      state.collision_on_x = true~
+    def input_down?
+** Processing line: ~      inputs.keyboard.s || inputs.keyboard.down || inputs.keyboard.j~
 - Inside source: true
 *** True Line Result
-      state.collision_on_x = true
+      inputs.keyboard.s || inputs.keyboard.down || inputs.keyboard.j
 ** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
@@ -116887,62 +118551,54 @@ Follows is a source code listing for all files that have been open sourced. This
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~    def collision_ceiling~
+** Processing line: ~    def input_down_released?~
 - Inside source: true
 *** True Line Result
-    def collision_ceiling
-** Processing line: ~      return unless state.dy > 0~
+    def input_down_released?
+** Processing line: ~      inputs.keyboard.key_up.s ||~
 - Inside source: true
 *** True Line Result
-      return unless state.dy > 0
-** Processing line: ~~
+      inputs.keyboard.key_up.s ||
+** Processing line: ~      inputs.keyboard.key_up.down ||~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~      player_rect = [state.x, next_y, state.player_width, state.player_height]~
+      inputs.keyboard.key_up.down ||
+** Processing line: ~      inputs.keyboard.key_up.j~
 - Inside source: true
 *** True Line Result
-      player_rect = [state.x, next_y, state.player_width, state.player_height]
-** Processing line: ~~
+      inputs.keyboard.key_up.j
+** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~      # Runs through all the sprites on the field and determines if the player hits the ceiling of sprite (hence "+0.1" above)~
+    end
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-      # Runs through all the sprites on the field and determines if the player hits the ceiling of sprite (hence "+0.1" above)
-** Processing line: ~      ceil_collisions = state.world_collision_rects~
+
+** Processing line: ~    def input_left?~
 - Inside source: true
 *** True Line Result
-      ceil_collisions = state.world_collision_rects
-** Processing line: ~                          .find_all { |r| r[:bottom].intersect_rect?(player_rect, state.collision_tolerance) }~
+    def input_left?
+** Processing line: ~      inputs.keyboard.a || inputs.keyboard.left || inputs.keyboard.h~
 - Inside source: true
 *** True Line Result
-                          .find_all { |r| r[:bottom].intersect_rect?(player_rect, state.collision_tolerance) }
-** Processing line: ~                          .first~
+      inputs.keyboard.a || inputs.keyboard.left || inputs.keyboard.h
+** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
-                          .first
+    end
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~      return unless ceil_collisions~
-- Inside source: true
-*** True Line Result
-      return unless ceil_collisions
-** Processing line: ~      state.y = ceil_collisions[:bottom].y - state.tile_size~
-- Inside source: true
-*** True Line Result
-      state.y = ceil_collisions[:bottom].y - state.tile_size
-** Processing line: ~      state.dy = state.dy.abs * 0.8 * -1~
+** Processing line: ~    def input_right?~
 - Inside source: true
 *** True Line Result
-      state.dy = state.dy.abs * 0.8 * -1
-** Processing line: ~      state.collision_on_y = true~
+    def input_right?
+** Processing line: ~      inputs.keyboard.d || inputs.keyboard.right || inputs.keyboard.l~
 - Inside source: true
 *** True Line Result
-      state.collision_on_y = true
+      inputs.keyboard.d || inputs.keyboard.right || inputs.keyboard.l
 ** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
@@ -116951,26 +118607,22 @@ Follows is a source code listing for all files that have been open sourced. This
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~    def to_coord point~
-- Inside source: true
-*** True Line Result
-    def to_coord point
-** Processing line: ~      # Integer divides (idiv) point.x to turn into grid~
+** Processing line: ~    def set_object path, w, h~
 - Inside source: true
 *** True Line Result
-      # Integer divides (idiv) point.x to turn into grid
-** Processing line: ~      # Then, you can just multiply each integer by state.tile_size~
+    def set_object path, w, h
+** Processing line: ~      state.object = path~
 - Inside source: true
 *** True Line Result
-      # Then, you can just multiply each integer by state.tile_size
-** Processing line: ~      # later and huzzah. Grid coordinates~
+      state.object = path
+** Processing line: ~      state.object_w = w~
 - Inside source: true
 *** True Line Result
-      # later and huzzah. Grid coordinates
-** Processing line: ~      [point.x.idiv(state.tile_size), point.y.idiv(state.tile_size)]~
+      state.object_w = w
+** Processing line: ~      state.object_h = h~
 - Inside source: true
 *** True Line Result
-      [point.x.idiv(state.tile_size), point.y.idiv(state.tile_size)]
+      state.object_h = h
 ** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
@@ -116979,206 +118631,230 @@ Follows is a source code listing for all files that have been open sourced. This
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~    def export_map~
-- Inside source: true
-*** True Line Result
-    def export_map
-** Processing line: ~      export_string = state.world.map do |x, y|~
+** Processing line: ~    def collision_mode~
 - Inside source: true
 *** True Line Result
-      export_string = state.world.map do |x, y|
-** Processing line: ~        "#{x},#{y},1"~
+    def collision_mode
+** Processing line: ~      state.dev_action = :collision_mode~
 - Inside source: true
 *** True Line Result
-        "#{x},#{y},1"
-** Processing line: ~      end~
+      state.dev_action = :collision_mode
+** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
-      end
-** Processing line: ~      export_string += state.objects.map do |x, y, w, h, path|~
+    end
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-      export_string += state.objects.map do |x, y, w, h, path|
-** Processing line: ~        "#{x},#{y},2,#{w},#{h},#{path}"~
+
+** Processing line: ~    def process_inputs_player_movement~
 - Inside source: true
 *** True Line Result
-        "#{x},#{y},2,#{w},#{h},#{path}"
-** Processing line: ~      end~
+    def process_inputs_player_movement
+** Processing line: ~      if inputs.keyboard.key_down.g~
 - Inside source: true
 *** True Line Result
-      end
-** Processing line: ~      gtk.write_file(MAP_FILE_PATH, export_string.join("\n"))~
+      if inputs.keyboard.key_down.g
+** Processing line: ~        state.god_mode = !state.god_mode~
 - Inside source: true
 *** True Line Result
-      gtk.write_file(MAP_FILE_PATH, export_string.join("\n"))
-** Processing line: ~      state.map_saved_at = state.tick_count~
+        state.god_mode = !state.god_mode
+** Processing line: ~        puts state.god_mode~
 - Inside source: true
 *** True Line Result
-      state.map_saved_at = state.tick_count
-** Processing line: ~    end~
+        puts state.god_mode
+** Processing line: ~      end~
 - Inside source: true
 *** True Line Result
-    end
+      end
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~    def inputs_export_stage~
+** Processing line: ~      if inputs.keyboard.key_down.u && state.dev_action == :collision_mode~
 - Inside source: true
 *** True Line Result
-    def inputs_export_stage
-** Processing line: ~    end~
+      if inputs.keyboard.key_down.u && state.dev_action == :collision_mode
+** Processing line: ~        state.world = state.world[0..-2]~
 - Inside source: true
 *** True Line Result
-    end
+        state.world = state.world[0..-2]
+** Processing line: ~        state.world_lookup = {}~
+- Inside source: true
+*** True Line Result
+        state.world_lookup = {}
+** Processing line: ~      end~
+- Inside source: true
+*** True Line Result
+      end
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~    def calc_score~
+** Processing line: ~      if inputs.keyboard.key_down.space && !state.anchor_point~
 - Inside source: true
 *** True Line Result
-    def calc_score
-** Processing line: ~      return unless state.scene == :game~
+      if inputs.keyboard.key_down.space && !state.anchor_point
+** Processing line: ~        state.tongue_length = 0~
 - Inside source: true
 *** True Line Result
-      return unless state.scene == :game
-** Processing line: ~      player = [state.x, state.y, state.player_width, state.player_height]~
+        state.tongue_length = 0
+** Processing line: ~        state.action = :shooting~
 - Inside source: true
 *** True Line Result
-      player = [state.x, state.y, state.player_width, state.player_height]
-** Processing line: ~      collected = state.objects.find_all { |s| s.intersect_rect? player }~
+        state.action = :shooting
+** Processing line: ~        outputs.sounds << 'sounds/shooting.wav'~
 - Inside source: true
 *** True Line Result
-      collected = state.objects.find_all { |s| s.intersect_rect? player }
-** Processing line: ~      state.stuff_score += collected.length~
+        outputs.sounds << 'sounds/shooting.wav'
+** Processing line: ~      elsif inputs.keyboard.key_down.space~
 - Inside source: true
 *** True Line Result
-      state.stuff_score += collected.length
-** Processing line: ~      if collected.length > 0~
+      elsif inputs.keyboard.key_down.space
+** Processing line: ~        state.action = :aiming~
 - Inside source: true
 *** True Line Result
-      if collected.length > 0
-** Processing line: ~        outputs.sounds << 'sounds/collectable.wav'~
+        state.action = :aiming
+** Processing line: ~        state.anchor_point  = nil~
 - Inside source: true
 *** True Line Result
-        outputs.sounds << 'sounds/collectable.wav'
+        state.anchor_point  = nil
+** Processing line: ~        state.tongue_length = 100~
+- Inside source: true
+*** True Line Result
+        state.tongue_length = 100
 ** Processing line: ~      end~
 - Inside source: true
 *** True Line Result
       end
-** Processing line: ~      state.objects = state.objects.reject { |s| collected.include? s }~
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-      state.objects = state.objects.reject { |s| collected.include? s }
-** Processing line: ~      state.stuff_time += 0.01~
+
+** Processing line: ~      if state.anchor_point~
 - Inside source: true
 *** True Line Result
-      state.stuff_time += 0.01
-** Processing line: ~      if state.objects.length == 0~
+      if state.anchor_point
+** Processing line: ~        if input_up?~
 - Inside source: true
 *** True Line Result
-      if state.objects.length == 0
-** Processing line: ~        if !state.stuff_best_time || state.stuff_time < state.stuff_best_time~
+        if input_up?
+** Processing line: ~          if state.tongue_length >= 105~
 - Inside source: true
 *** True Line Result
-        if !state.stuff_best_time || state.stuff_time < state.stuff_best_time
-** Processing line: ~          state.stuff_best_time = state.stuff_time~
+          if state.tongue_length >= 105
+** Processing line: ~            state.tongue_length -= 5~
 - Inside source: true
 *** True Line Result
-          state.stuff_best_time = state.stuff_time
-** Processing line: ~        end~
+            state.tongue_length -= 5
+** Processing line: ~            state.dy += 0.8~
 - Inside source: true
 *** True Line Result
-        end
-** Processing line: ~        state.game_over_at = nil~
+            state.dy += 0.8
+** Processing line: ~          end~
 - Inside source: true
 *** True Line Result
-        state.game_over_at = nil
-** Processing line: ~        state.scene = :ending~
+          end
+** Processing line: ~        elsif input_down?~
 - Inside source: true
 *** True Line Result
-        state.scene = :ending
-** Processing line: ~      end~
+        elsif input_down?
+** Processing line: ~          state.tongue_length += 5~
 - Inside source: true
 *** True Line Result
-      end
-** Processing line: ~    end~
+          state.tongue_length += 5
+** Processing line: ~          state.dy -= 0.8~
 - Inside source: true
 *** True Line Result
-    end
+          state.dy -= 0.8
+** Processing line: ~        end~
+- Inside source: true
+*** True Line Result
+        end
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~    def calc_on_floor~
+** Processing line: ~        if input_left? && state.dx > 1~
 - Inside source: true
 *** True Line Result
-    def calc_on_floor
-** Processing line: ~      if state.action == :anchored~
+        if input_left? && state.dx > 1
+** Processing line: ~          state.dx *= 0.98~
 - Inside source: true
 *** True Line Result
-      if state.action == :anchored
-** Processing line: ~        state.on_floor = false~
+          state.dx *= 0.98
+** Processing line: ~        elsif input_left? && state.dx < -1~
 - Inside source: true
 *** True Line Result
-        state.on_floor = false
-** Processing line: ~        state.on_floor_debounce = 30~
+        elsif input_left? && state.dx < -1
+** Processing line: ~          state.dx *= 1.03~
 - Inside source: true
 *** True Line Result
-        state.on_floor_debounce = 30
-** Processing line: ~      else~
+          state.dx *= 1.03
+** Processing line: ~        elsif input_left? && !state.on_floor~
 - Inside source: true
 *** True Line Result
-      else
-** Processing line: ~        state.on_floor_debounce ||= 30~
+        elsif input_left? && !state.on_floor
+** Processing line: ~          state.dx -= 3~
 - Inside source: true
 *** True Line Result
-        state.on_floor_debounce ||= 30
-** Processing line: ~~
+          state.dx -= 3
+** Processing line: ~        elsif input_right? && state.dx > 1~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~        if state.dy.round != 0~
+        elsif input_right? && state.dx > 1
+** Processing line: ~          state.dx *= 1.03~
 - Inside source: true
 *** True Line Result
-        if state.dy.round != 0
-** Processing line: ~          state.on_floor_debounce = 30~
+          state.dx *= 1.03
+** Processing line: ~        elsif input_right? && state.dx < -1~
 - Inside source: true
 *** True Line Result
-          state.on_floor_debounce = 30
-** Processing line: ~          state.on_floor = false~
+        elsif input_right? && state.dx < -1
+** Processing line: ~          state.dx *= 0.98~
 - Inside source: true
 *** True Line Result
-          state.on_floor = false
-** Processing line: ~        else~
+          state.dx *= 0.98
+** Processing line: ~        elsif input_right? && !state.on_floor~
 - Inside source: true
 *** True Line Result
-        else
-** Processing line: ~          state.on_floor_debounce -= 1~
+        elsif input_right? && !state.on_floor
+** Processing line: ~          state.dx += 3~
 - Inside source: true
 *** True Line Result
-          state.on_floor_debounce -= 1
+          state.dx += 3
 ** Processing line: ~        end~
 - Inside source: true
 *** True Line Result
         end
-** Processing line: ~~
+** Processing line: ~      else~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~        if state.on_floor_debounce <= 0~
+      else
+** Processing line: ~        if input_left?~
 - Inside source: true
 *** True Line Result
-        if state.on_floor_debounce <= 0
-** Processing line: ~          state.on_floor_debounce = 0~
+        if input_left?
+** Processing line: ~          state.tongue_angle += 1.5~
 - Inside source: true
 *** True Line Result
-          state.on_floor_debounce = 0
-** Processing line: ~          state.on_floor = true~
+          state.tongue_angle += 1.5
+** Processing line: ~          state.tongue_angle = state.tongue_angle~
 - Inside source: true
 *** True Line Result
-          state.on_floor = true
+          state.tongue_angle = state.tongue_angle
+** Processing line: ~        elsif input_right?~
+- Inside source: true
+*** True Line Result
+        elsif input_right?
+** Processing line: ~          state.tongue_angle -= 1.5~
+- Inside source: true
+*** True Line Result
+          state.tongue_angle -= 1.5
+** Processing line: ~          state.tongue_angle = state.tongue_angle~
+- Inside source: true
+*** True Line Result
+          state.tongue_angle = state.tongue_angle
 ** Processing line: ~        end~
 - Inside source: true
 *** True Line Result
@@ -117195,106 +118871,106 @@ Follows is a source code listing for all files that have been open sourced. This
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~    def render_player~
+** Processing line: ~    def attempt_load_world_from_file~
 - Inside source: true
 *** True Line Result
-    def render_player
-** Processing line: ~      path = "sprites/square-green.png"~
+    def attempt_load_world_from_file
+** Processing line: ~      return if state.world~
 - Inside source: true
 *** True Line Result
-      path = "sprites/square-green.png"
-** Processing line: ~      angle = 0~
+      return if state.world
+** Processing line: ~      # exported_world = gtk.read_file(MAP_FILE_PATH)~
 - Inside source: true
 *** True Line Result
-      angle = 0
-** Processing line: ~      # outputs.labels << [vx(state.x), vy(state.y) - 30, "dy: #{state.dy.round}"]~
+      # exported_world = gtk.read_file(MAP_FILE_PATH)
+** Processing line: ~      state.world = []~
 - Inside source: true
 *** True Line Result
-      # outputs.labels << [vx(state.x), vy(state.y) - 30, "dy: #{state.dy.round}"]
-** Processing line: ~      if state.action == :idle~
+      state.world = []
+** Processing line: ~      state.objects = []~
 - Inside source: true
 *** True Line Result
-      if state.action == :idle
-** Processing line: ~        # outputs.labels << [vx(state.x), vy(state.y), "IDLE"]~
+      state.objects = []
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-        # outputs.labels << [vx(state.x), vy(state.y), "IDLE"]
-** Processing line: ~        path = "sprites/square-green.png"~
+
+** Processing line: ~      if $collisions~
 - Inside source: true
 *** True Line Result
-        path = "sprites/square-green.png"
-** Processing line: ~      elsif state.action == :aiming && !state.on_floor~
+      if $collisions
+** Processing line: ~        state.id_seed ||= 0~
 - Inside source: true
 *** True Line Result
-      elsif state.action == :aiming && !state.on_floor
-** Processing line: ~        # outputs.labels << [vx(state.x), vy(state.y), "AIMING AIR BORN"]~
+        state.id_seed ||= 0
+** Processing line: ~        $collisions.each do |x, y, w, h|~
 - Inside source: true
 *** True Line Result
-        # outputs.labels << [vx(state.x), vy(state.y), "AIMING AIR BORN"]
-** Processing line: ~        angle = state.tongue_angle - 90~
+        $collisions.each do |x, y, w, h|
+** Processing line: ~          state.id_seed += 1~
 - Inside source: true
 *** True Line Result
-        angle = state.tongue_angle - 90
-** Processing line: ~        path = "sprites/square-green.png"~
+          state.id_seed += 1
+** Processing line: ~          state.world << { id: state.id_seed, x: x, y: y, w: w, h: h }~
 - Inside source: true
 *** True Line Result
-        path = "sprites/square-green.png"
-** Processing line: ~      elsif state.action == :aiming # ON THE GROUND~
+          state.world << { id: state.id_seed, x: x, y: y, w: w, h: h }
+** Processing line: ~        end~
 - Inside source: true
 *** True Line Result
-      elsif state.action == :aiming # ON THE GROUND
-** Processing line: ~        # outputs.labels << [vx(state.x), vy(state.y), "AIMING GROUND"]~
+        end
+** Processing line: ~      end~
 - Inside source: true
 *** True Line Result
-        # outputs.labels << [vx(state.x), vy(state.y), "AIMING GROUND"]
-** Processing line: ~        path = "sprites/square-green.png"~
+      end
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-        path = "sprites/square-green.png"
-** Processing line: ~      elsif state.action == :shooting && !state.on_floor~
+
+** Processing line: ~      if $mugs~
 - Inside source: true
 *** True Line Result
-      elsif state.action == :shooting && !state.on_floor
-** Processing line: ~        # outputs.labels << [vx(state.x), vy(state.y), "SHOOTING AIR BORN"]~
+      if $mugs
+** Processing line: ~        $mugs.map do |x, y, w, h, path|~
 - Inside source: true
 *** True Line Result
-        # outputs.labels << [vx(state.x), vy(state.y), "SHOOTING AIR BORN"]
-** Processing line: ~        path = "sprites/square-green.png"~
+        $mugs.map do |x, y, w, h, path|
+** Processing line: ~          state.objects << [x, y, w, h, path]~
 - Inside source: true
 *** True Line Result
-        path = "sprites/square-green.png"
-** Processing line: ~        angle = state.tongue_angle - 90~
+          state.objects << [x, y, w, h, path]
+** Processing line: ~        end~
 - Inside source: true
 *** True Line Result
-        angle = state.tongue_angle - 90
-** Processing line: ~      elsif state.action == :shooting~
+        end
+** Processing line: ~      end~
 - Inside source: true
 *** True Line Result
-      elsif state.action == :shooting
-** Processing line: ~        # outputs.labels << [vx(state.x), vy(state.y), "SHOOTING ON GROUND"]~
+      end
+** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
-        # outputs.labels << [vx(state.x), vy(state.y), "SHOOTING ON GROUND"]
-** Processing line: ~        path = "sprites/square-green.png"~
+    end
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-        path = "sprites/square-green.png"
-** Processing line: ~      elsif state.action == :anchored~
+
+** Processing line: ~    def calc_world_lookup~
 - Inside source: true
 *** True Line Result
-      elsif state.action == :anchored
-** Processing line: ~        # outputs.labels << [vx(state.x), vy(state.y), "SWINGING"]~
+    def calc_world_lookup
+** Processing line: ~      if state.tile_size != state.previous_tile_size~
 - Inside source: true
 *** True Line Result
-        # outputs.labels << [vx(state.x), vy(state.y), "SWINGING"]
-** Processing line: ~        angle = state.tongue_angle - 90~
+      if state.tile_size != state.previous_tile_size
+** Processing line: ~        state.previous_tile_size = state.tile_size~
 - Inside source: true
 *** True Line Result
-        angle = state.tongue_angle - 90
-** Processing line: ~        path = "sprites/square-green.png"~
+        state.previous_tile_size = state.tile_size
+** Processing line: ~        state.world_lookup = {}~
 - Inside source: true
 *** True Line Result
-        path = "sprites/square-green.png"
+        state.world_lookup = {}
 ** Processing line: ~      end~
 - Inside source: true
 *** True Line Result
@@ -117303,4838 +118979,8526 @@ Follows is a source code listing for all files that have been open sourced. This
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~      outputs.sprites << [vx(state.x),~
+** Processing line: ~      return if state.world_lookup.keys.length > 0~
 - Inside source: true
 *** True Line Result
-      outputs.sprites << [vx(state.x),
-** Processing line: ~                          vy(state.y),~
+      return if state.world_lookup.keys.length > 0
+** Processing line: ~      return unless state.world.length > 0~
 - Inside source: true
 *** True Line Result
-                          vy(state.y),
-** Processing line: ~                          vw(state.player_width),~
+      return unless state.world.length > 0
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-                          vw(state.player_width),
-** Processing line: ~                          vh(state.player_height),~
+
+** Processing line: ~      # Searches through the world and finds the cordinates that exist~
 - Inside source: true
 *** True Line Result
-                          vh(state.player_height),
-** Processing line: ~                          path,~
+      # Searches through the world and finds the cordinates that exist
+** Processing line: ~      state.world_lookup = {}~
 - Inside source: true
 *** True Line Result
-                          path,
-** Processing line: ~                          angle]~
+      state.world_lookup = {}
+** Processing line: ~      state.world.each do |rect|~
 - Inside source: true
 *** True Line Result
-                          angle]
-** Processing line: ~    end~
+      state.world.each do |rect|
+** Processing line: ~        state.world_lookup[rect.id] = rect~
 - Inside source: true
 *** True Line Result
-    end
-** Processing line: ~~
+        state.world_lookup[rect.id] = rect
+** Processing line: ~      end~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~    def render_player_old~
+      end
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-    def render_player_old
-** Processing line: ~      # Player~
+
+** Processing line: ~      # Assigns collision rects for every sprite drawn~
 - Inside source: true
 *** True Line Result
-      # Player
-** Processing line: ~      if state.action == :aiming~
+      # Assigns collision rects for every sprite drawn
+** Processing line: ~      state.world_collision_rects =~
 - Inside source: true
 *** True Line Result
-      if state.action == :aiming
-** Processing line: ~        path = 'sprites\frg\idle\frog_idle.png'~
+      state.world_collision_rects =
+** Processing line: ~        state.world_lookup~
 - Inside source: true
 *** True Line Result
-        path = 'sprites\frg\idle\frog_idle.png'
-** Processing line: ~        if state.dx > 2~
+        state.world_lookup
+** Processing line: ~             .keys~
 - Inside source: true
 *** True Line Result
-        if state.dx > 2
-** Processing line: ~  	  #directional right sprite was here but i needa redo it~
+             .keys
+** Processing line: ~             .map do |key|~
 - Inside source: true
 *** True Line Result
-  	  #directional right sprite was here but i needa redo it
-** Processing line: ~          path = 'sprites\frg\anchor\frog-anchor-0.png'~
+             .map do |key|
+** Processing line: ~               rect = state.world_lookup[key]~
 - Inside source: true
 *** True Line Result
-          path = 'sprites\frg\anchor\frog-anchor-0.png'
-** Processing line: ~        #directional left sprite was here but i needa redo it~
+               rect = state.world_lookup[key]
+** Processing line: ~               s = state.tile_size~
 - Inside source: true
 *** True Line Result
-        #directional left sprite was here but i needa redo it
-** Processing line: ~  	  elsif state.dx < -2~
+               s = state.tile_size
+** Processing line: ~               rect.w ||= s~
 - Inside source: true
 *** True Line Result
-  	  elsif state.dx < -2
-** Processing line: ~          path = 'sprites\frg\anchor\frog-anchor-0.png'~
+               rect.w ||= s
+** Processing line: ~               rect.h ||= s~
 - Inside source: true
 *** True Line Result
-          path = 'sprites\frg\anchor\frog-anchor-0.png'
-** Processing line: ~        end~
+               rect.h ||= s
+** Processing line: ~               {~
 - Inside source: true
 *** True Line Result
-        end
-** Processing line: ~        outputs.sprites << [vx(state.x),~
+               {
+** Processing line: ~                 args:       rect,~
 - Inside source: true
 *** True Line Result
-        outputs.sprites << [vx(state.x),
-** Processing line: ~                            vy(state.y),~
+                 args:       rect,
+** Processing line: ~                 left_right: { x: rect.x,     y: rect.y + 4, w: rect.w,     h: rect.h - 6 },~
 - Inside source: true
 *** True Line Result
-                            vy(state.y),
-** Processing line: ~                            vw(state.player_width),~
+                 left_right: { x: rect.x,     y: rect.y + 4, w: rect.w,     h: rect.h - 6 },
+** Processing line: ~                 top:        { x: rect.x + 4, y: rect.y + 6, w: rect.w - 8, h: rect.h - 6 },~
 - Inside source: true
 *** True Line Result
-                            vw(state.player_width),
-** Processing line: ~                            vh(state.player_height),~
+                 top:        { x: rect.x + 4, y: rect.y + 6, w: rect.w - 8, h: rect.h - 6 },
+** Processing line: ~                 bottom:     { x: rect.x + 1, y: rect.y - 1, w: rect.w - 2, h: rect.h - 8 },~
 - Inside source: true
 *** True Line Result
-                            vh(state.player_height),
-** Processing line: ~                            path,~
+                 bottom:     { x: rect.x + 1, y: rect.y - 1, w: rect.w - 2, h: rect.h - 8 },
+** Processing line: ~               }~
 - Inside source: true
 *** True Line Result
-                            path,
-** Processing line: ~                            (state.tongue_angle - 90)]~
+               }
+** Processing line: ~             end~
 - Inside source: true
 *** True Line Result
-                            (state.tongue_angle - 90)]
-** Processing line: ~      elsif state.action == :anchored || state.action == :shooting~
+             end
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-      elsif state.action == :anchored || state.action == :shooting
-** Processing line: ~        outputs.sprites << [vx(state.x),~
+
+** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
-        outputs.sprites << [vx(state.x),
-** Processing line: ~                            vy(state.y),~
+    end
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-                            vy(state.y),
-** Processing line: ~                            vw(state.player_width),~
+
+** Processing line: ~    def calc_pendulum~
 - Inside source: true
 *** True Line Result
-                            vw(state.player_width),
-** Processing line: ~                            vw(state.player_height),~
+    def calc_pendulum
+** Processing line: ~      return if !state.anchor_point~
 - Inside source: true
 *** True Line Result
-                            vw(state.player_height),
-** Processing line: ~                            'sprites/animations_povfrog/frog_bwah_up.png',~
+      return if !state.anchor_point
+** Processing line: ~      target_x = state.anchor_point.x - start_of_tongue.x~
 - Inside source: true
 *** True Line Result
-                            'sprites/animations_povfrog/frog_bwah_up.png',
-** Processing line: ~                            (state.tongue_angle - 90)]~
+      target_x = state.anchor_point.x - start_of_tongue.x
+** Processing line: ~      target_y = state.anchor_point.y -~
 - Inside source: true
 *** True Line Result
-                            (state.tongue_angle - 90)]
-** Processing line: ~      end~
+      target_y = state.anchor_point.y -
+** Processing line: ~                 state.tongue_length - 5 - 20 - state.player_height~
 - Inside source: true
 *** True Line Result
-      end
-** Processing line: ~    end~
+                 state.tongue_length - 5 - 20 - state.player_height
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-    end
-** Processing line: ~  end~
+
+** Processing line: ~      diff_y = state.y - target_y~
 - Inside source: true
 *** True Line Result
-  end
+      diff_y = state.y - target_y
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~~
+** Processing line: ~      if target_x > 0~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~  $game = CleptoFrog.new~
+      if target_x > 0
+** Processing line: ~        state.dx += 0.6~
 - Inside source: true
 *** True Line Result
-  $game = CleptoFrog.new
+        state.dx += 0.6
+** Processing line: ~      elsif target_x < 0~
+- Inside source: true
+*** True Line Result
+      elsif target_x < 0
+** Processing line: ~        state.dx -= 0.6~
+- Inside source: true
+*** True Line Result
+        state.dx -= 0.6
+** Processing line: ~      end~
+- Inside source: true
+*** True Line Result
+      end
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~  def tick args~
+** Processing line: ~      if diff_y > 0~
 - Inside source: true
 *** True Line Result
-  def tick args
-** Processing line: ~    if args.state.scene == :game~
+      if diff_y > 0
+** Processing line: ~        state.dy -= 0.1~
 - Inside source: true
 *** True Line Result
-    if args.state.scene == :game
-** Processing line: ~      tick_instructions args, "SPACE to SHOOT and RELEASE tongue. LEFT, RIGHT to SWING and BUILD momentum. MINIMAP in bottom right corner.", 360~
+        state.dy -= 0.1
+** Processing line: ~      elsif diff_y < 0~
 - Inside source: true
 *** True Line Result
-      tick_instructions args, "SPACE to SHOOT and RELEASE tongue. LEFT, RIGHT to SWING and BUILD momentum. MINIMAP in bottom right corner.", 360
-** Processing line: ~    end~
+      elsif diff_y < 0
+** Processing line: ~        state.dy += 0.1~
 - Inside source: true
 *** True Line Result
-    end
-** Processing line: ~    $game.args = args~
+        state.dy += 0.1
+** Processing line: ~      end~
 - Inside source: true
 *** True Line Result
-    $game.args = args
-** Processing line: ~    $game.tick~
+      end
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-    $game.tick
-** Processing line: ~  end~
+
+** Processing line: ~      state.dx *= 0.99~
 - Inside source: true
 *** True Line Result
-  end
+      state.dx *= 0.99
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~  def tick_instructions args, text, y = 715~
+** Processing line: ~      if state.dy.abs < 2~
 - Inside source: true
 *** True Line Result
-  def tick_instructions args, text, y = 715
-** Processing line: ~    return if args.state.key_event_occurred~
+      if state.dy.abs < 2
+** Processing line: ~        state.dy *= 0.8~
 - Inside source: true
 *** True Line Result
-    return if args.state.key_event_occurred
-** Processing line: ~    if args.inputs.keyboard.directional_vector || args.inputs.keyboard.key_down.space~
+        state.dy *= 0.8
+** Processing line: ~      else~
 - Inside source: true
 *** True Line Result
-    if args.inputs.keyboard.directional_vector || args.inputs.keyboard.key_down.space
-** Processing line: ~      args.state.key_event_occurred = true~
+      else
+** Processing line: ~        state.dy *= 0.90~
 - Inside source: true
 *** True Line Result
-      args.state.key_event_occurred = true
-** Processing line: ~    end~
+        state.dy *= 0.90
+** Processing line: ~      end~
 - Inside source: true
 *** True Line Result
-    end
+      end
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~    args.outputs.debug << [0, y - 50, 1280, 60].solid~
+** Processing line: ~      if state.tongue_length && state.y~
 - Inside source: true
 *** True Line Result
-    args.outputs.debug << [0, y - 50, 1280, 60].solid
-** Processing line: ~    args.outputs.debug << [640, y, text, 1, 1, 255, 255, 255].label~
+      if state.tongue_length && state.y
+** Processing line: ~        state.dy += state.tongue_angle.vector_y state.tongue_length.fdiv(1000)~
 - Inside source: true
 *** True Line Result
-    args.outputs.debug << [640, y, text, 1, 1, 255, 255, 255].label
-** Processing line: ~    args.outputs.debug << [640, y - 25, "(SPACE to dismiss instructions)" , -2, 1, 255, 255, 255].label~
+        state.dy += state.tongue_angle.vector_y state.tongue_length.fdiv(1000)
+** Processing line: ~      end~
 - Inside source: true
 *** True Line Result
-    args.outputs.debug << [640, y - 25, "(SPACE to dismiss instructions)" , -2, 1, 255, 255, 255].label
-** Processing line: ~  end~
+      end
+** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
-  end
+    end
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~#+end_src~
-- Line was identified as the end of a code block.
-*** True Line Result
-#+end_src
-** Processing line: ~~
-- End of paragraph detected.
-*** True Line Result
-
-** Processing line: ~*** Platformer - Clepto Frog - map.rb~
-- Header detected.
-*** True Line Result
-
-*** True Line Result
-*** Platformer - Clepto Frog - map.rb
-** Processing line: ~#+begin_src ruby~
-- Line was identified as the beginning of a code block.
-*** True Line Result
-
-*** True Line Result
-#+begin_src ruby
-** Processing line: ~  # ./samples/99_genre_platformer/clepto_frog/app/map.rb~
+** Processing line: ~    def calc_tongue_angle~
 - Inside source: true
 *** True Line Result
-  # ./samples/99_genre_platformer/clepto_frog/app/map.rb
-** Processing line: ~  $collisions = [~
+    def calc_tongue_angle
+** Processing line: ~      return unless state.anchor_point~
 - Inside source: true
 *** True Line Result
-  $collisions = [
-** Processing line: ~    [326, 463, 64, 64],~
+      return unless state.anchor_point
+** Processing line: ~      state.tongue_angle = args.geometry.angle_from state.anchor_point, start_of_tongue~
 - Inside source: true
 *** True Line Result
-    [326, 463, 64, 64],
-** Processing line: ~    [274, 462, 64, 64],~
+      state.tongue_angle = args.geometry.angle_from state.anchor_point, start_of_tongue
+** Processing line: ~      state.tongue_length = args.geometry.distance(start_of_tongue, state.anchor_point)~
 - Inside source: true
 *** True Line Result
-    [274, 462, 64, 64],
-** Processing line: ~    [326, 413, 64, 64],~
+      state.tongue_length = args.geometry.distance(start_of_tongue, state.anchor_point)
+** Processing line: ~      state.tongue_length = state.tongue_length.greater(100)~
 - Inside source: true
 *** True Line Result
-    [326, 413, 64, 64],
-** Processing line: ~    [275, 412, 64, 64],~
+      state.tongue_length = state.tongue_length.greater(100)
+** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
-    [275, 412, 64, 64],
-** Processing line: ~    [124, 651, 64, 64],~
+    end
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-    [124, 651, 64, 64],
-** Processing line: ~    [72, 651, 64, 64],~
+
+** Processing line: ~    def player_from_end_of_tongue~
 - Inside source: true
 *** True Line Result
-    [72, 651, 64, 64],
-** Processing line: ~    [124, 600, 64, 64],~
+    def player_from_end_of_tongue
+** Processing line: ~      p = state.tongue_angle.vector(state.tongue_length)~
 - Inside source: true
 *** True Line Result
-    [124, 600, 64, 64],
-** Processing line: ~    [69, 599, 64, 64],~
+      p = state.tongue_angle.vector(state.tongue_length)
+** Processing line: ~      derived_start = [state.anchor_point.x - p.x, state.anchor_point.y - p.y]~
 - Inside source: true
 *** True Line Result
-    [69, 599, 64, 64],
-** Processing line: ~    [501, 997, 64, 64],~
+      derived_start = [state.anchor_point.x - p.x, state.anchor_point.y - p.y]
+** Processing line: ~      derived_start.x -= state.player_width.half~
 - Inside source: true
 *** True Line Result
-    [501, 997, 64, 64],
-** Processing line: ~    [476, 995, 64, 64],~
+      derived_start.x -= state.player_width.half
+** Processing line: ~      derived_start.y -= state.player_height.half~
 - Inside source: true
 *** True Line Result
-    [476, 995, 64, 64],
-** Processing line: ~    [3224, 2057, 64, 64],~
+      derived_start.y -= state.player_height.half
+** Processing line: ~      derived_start~
 - Inside source: true
 *** True Line Result
-    [3224, 2057, 64, 64],
-** Processing line: ~    [3224, 1994, 64, 64],~
+      derived_start
+** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
-    [3224, 1994, 64, 64],
-** Processing line: ~    [3225, 1932, 64, 64],~
+    end
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-    [3225, 1932, 64, 64],
-** Processing line: ~    [3225, 1870, 64, 64],~
+
+** Processing line: ~    def end_of_tongue~
 - Inside source: true
 *** True Line Result
-    [3225, 1870, 64, 64],
-** Processing line: ~    [3226, 1806, 64, 64],~
+    def end_of_tongue
+** Processing line: ~      p = state.tongue_angle.vector(state.tongue_length)~
 - Inside source: true
 *** True Line Result
-    [3226, 1806, 64, 64],
-** Processing line: ~    [3224, 1744, 64, 64],~
+      p = state.tongue_angle.vector(state.tongue_length)
+** Processing line: ~      { x: start_of_tongue.x + p.x, y: start_of_tongue.y + p.y }~
 - Inside source: true
 *** True Line Result
-    [3224, 1744, 64, 64],
-** Processing line: ~    [3225, 1689, 64, 64],~
+      { x: start_of_tongue.x + p.x, y: start_of_tongue.y + p.y }
+** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
-    [3225, 1689, 64, 64],
-** Processing line: ~    [3226, 1660, 64, 64],~
+    end
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-    [3226, 1660, 64, 64],
-** Processing line: ~    [3161, 1658, 64, 64],~
+
+** Processing line: ~    def calc_shooting~
 - Inside source: true
 *** True Line Result
-    [3161, 1658, 64, 64],
-** Processing line: ~    [3097, 1660, 64, 64],~
+    def calc_shooting
+** Processing line: ~      calc_shooting_increment~
 - Inside source: true
 *** True Line Result
-    [3097, 1660, 64, 64],
-** Processing line: ~    [3033, 1658, 64, 64],~
+      calc_shooting_increment
+** Processing line: ~      calc_shooting_increment~
 - Inside source: true
 *** True Line Result
-    [3033, 1658, 64, 64],
-** Processing line: ~    [2969, 1658, 64, 64],~
+      calc_shooting_increment
+** Processing line: ~      calc_shooting_increment~
 - Inside source: true
 *** True Line Result
-    [2969, 1658, 64, 64],
-** Processing line: ~    [2904, 1658, 64, 64],~
+      calc_shooting_increment
+** Processing line: ~      calc_shooting_increment~
 - Inside source: true
 *** True Line Result
-    [2904, 1658, 64, 64],
-** Processing line: ~    [2839, 1657, 64, 64],~
+      calc_shooting_increment
+** Processing line: ~      calc_shooting_increment~
 - Inside source: true
 *** True Line Result
-    [2839, 1657, 64, 64],
-** Processing line: ~    [2773, 1657, 64, 64],~
+      calc_shooting_increment
+** Processing line: ~      calc_shooting_increment~
 - Inside source: true
 *** True Line Result
-    [2773, 1657, 64, 64],
-** Processing line: ~    [2709, 1658, 64, 64],~
+      calc_shooting_increment
+** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
-    [2709, 1658, 64, 64],
-** Processing line: ~    [2643, 1657, 64, 64],~
+    end
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-    [2643, 1657, 64, 64],
-** Processing line: ~    [2577, 1657, 64, 64],~
+
+** Processing line: ~    def calc_shooting_increment~
 - Inside source: true
 *** True Line Result
-    [2577, 1657, 64, 64],
-** Processing line: ~    [2509, 1658, 64, 64],~
+    def calc_shooting_increment
+** Processing line: ~      return unless state.action == :shooting~
 - Inside source: true
 *** True Line Result
-    [2509, 1658, 64, 64],
-** Processing line: ~    [2440, 1658, 64, 64],~
+      return unless state.action == :shooting
+** Processing line: ~      state.tongue_length += 5~
 - Inside source: true
 *** True Line Result
-    [2440, 1658, 64, 64],
-** Processing line: ~    [2371, 1658, 64, 64],~
+      state.tongue_length += 5
+** Processing line: ~      potential_anchor = end_of_tongue~
 - Inside source: true
 *** True Line Result
-    [2371, 1658, 64, 64],
-** Processing line: ~    [2301, 1659, 64, 64],~
+      potential_anchor = end_of_tongue
+** Processing line: ~      if potential_anchor.x <= 0~
 - Inside source: true
 *** True Line Result
-    [2301, 1659, 64, 64],
-** Processing line: ~    [2230, 1659, 64, 64],~
+      if potential_anchor.x <= 0
+** Processing line: ~        state.anchor_point = potential_anchor~
 - Inside source: true
 *** True Line Result
-    [2230, 1659, 64, 64],
-** Processing line: ~    [2159, 1659, 64, 64],~
+        state.anchor_point = potential_anchor
+** Processing line: ~        state.action = :anchored~
 - Inside source: true
 *** True Line Result
-    [2159, 1659, 64, 64],
-** Processing line: ~    [2092, 1660, 64, 64],~
+        state.action = :anchored
+** Processing line: ~        outputs.sounds << 'sounds/attached.wav'~
 - Inside source: true
 *** True Line Result
-    [2092, 1660, 64, 64],
-** Processing line: ~    [2025, 1661, 64, 64],~
+        outputs.sounds << 'sounds/attached.wav'
+** Processing line: ~      elsif potential_anchor.x >= 10000~
 - Inside source: true
 *** True Line Result
-    [2025, 1661, 64, 64],
-** Processing line: ~    [1958, 1660, 64, 64],~
+      elsif potential_anchor.x >= 10000
+** Processing line: ~        state.anchor_point = potential_anchor~
 - Inside source: true
 *** True Line Result
-    [1958, 1660, 64, 64],
-** Processing line: ~    [1888, 1659, 64, 64],~
+        state.anchor_point = potential_anchor
+** Processing line: ~        state.action = :anchored~
 - Inside source: true
 *** True Line Result
-    [1888, 1659, 64, 64],
-** Processing line: ~    [1817, 1657, 64, 64],~
+        state.action = :anchored
+** Processing line: ~        outputs.sounds << 'sounds/attached.wav'~
 - Inside source: true
 *** True Line Result
-    [1817, 1657, 64, 64],
-** Processing line: ~    [1745, 1656, 64, 64],~
+        outputs.sounds << 'sounds/attached.wav'
+** Processing line: ~      elsif potential_anchor.y <= 0~
 - Inside source: true
 *** True Line Result
-    [1745, 1656, 64, 64],
-** Processing line: ~    [1673, 1658, 64, 64],~
+      elsif potential_anchor.y <= 0
+** Processing line: ~        state.anchor_point = potential_anchor~
 - Inside source: true
 *** True Line Result
-    [1673, 1658, 64, 64],
-** Processing line: ~    [1605, 1660, 64, 64],~
+        state.anchor_point = potential_anchor
+** Processing line: ~        state.action = :anchored~
 - Inside source: true
 *** True Line Result
-    [1605, 1660, 64, 64],
-** Processing line: ~    [1536, 1658, 64, 64],~
+        state.action = :anchored
+** Processing line: ~        outputs.sounds << 'sounds/attached.wav'~
 - Inside source: true
 *** True Line Result
-    [1536, 1658, 64, 64],
-** Processing line: ~    [1465, 1660, 64, 64],~
+        outputs.sounds << 'sounds/attached.wav'
+** Processing line: ~      elsif potential_anchor.y >= 5875~
 - Inside source: true
 *** True Line Result
-    [1465, 1660, 64, 64],
-** Processing line: ~    [1386, 1960, 64, 64],~
+      elsif potential_anchor.y >= 5875
+** Processing line: ~        state.anchor_point = potential_anchor~
 - Inside source: true
 *** True Line Result
-    [1386, 1960, 64, 64],
-** Processing line: ~    [1384, 1908, 64, 64],~
+        state.anchor_point = potential_anchor
+** Processing line: ~        state.action = :anchored~
 - Inside source: true
 *** True Line Result
-    [1384, 1908, 64, 64],
-** Processing line: ~    [1387, 1862, 64, 64],~
+        state.action = :anchored
+** Processing line: ~        outputs.sounds << 'sounds/attached.wav'~
 - Inside source: true
 *** True Line Result
-    [1387, 1862, 64, 64],
-** Processing line: ~    [1326, 1863, 64, 64],~
+        outputs.sounds << 'sounds/attached.wav'
+** Processing line: ~      else~
 - Inside source: true
 *** True Line Result
-    [1326, 1863, 64, 64],
-** Processing line: ~    [1302, 1862, 64, 64],~
+      else
+** Processing line: ~        anchor_rect = { x: potential_anchor.x - 5, y: potential_anchor.y - 5, w: 10, h: 10 }~
 - Inside source: true
 *** True Line Result
-    [1302, 1862, 64, 64],
-** Processing line: ~    [1119, 1906, 64, 64],~
+        anchor_rect = { x: potential_anchor.x - 5, y: potential_anchor.y - 5, w: 10, h: 10 }
+** Processing line: ~        collision = state.world_collision_rects.find_all do |v|~
 - Inside source: true
 *** True Line Result
-    [1119, 1906, 64, 64],
-** Processing line: ~    [1057, 1905, 64, 64],~
+        collision = state.world_collision_rects.find_all do |v|
+** Processing line: ~          v[:args].intersect_rect?(anchor_rect)~
 - Inside source: true
 *** True Line Result
-    [1057, 1905, 64, 64],
-** Processing line: ~    [994, 1905, 64, 64],~
+          v[:args].intersect_rect?(anchor_rect)
+** Processing line: ~        end.first~
 - Inside source: true
 *** True Line Result
-    [994, 1905, 64, 64],
-** Processing line: ~    [937, 1904, 64, 64],~
+        end.first
+** Processing line: ~        if collision~
 - Inside source: true
 *** True Line Result
-    [937, 1904, 64, 64],
-** Processing line: ~    [896, 1904, 64, 64],~
+        if collision
+** Processing line: ~          state.anchor_point = potential_anchor~
 - Inside source: true
 *** True Line Result
-    [896, 1904, 64, 64],
-** Processing line: ~    [1001, 1845, 64, 64],~
+          state.anchor_point = potential_anchor
+** Processing line: ~          state.action = :anchored~
 - Inside source: true
 *** True Line Result
-    [1001, 1845, 64, 64],
-** Processing line: ~    [1003, 1780, 64, 64],~
+          state.action = :anchored
+** Processing line: ~        outputs.sounds << 'sounds/attached.wav'~
 - Inside source: true
 *** True Line Result
-    [1003, 1780, 64, 64],
-** Processing line: ~    [1003, 1718, 64, 64],~
+        outputs.sounds << 'sounds/attached.wav'
+** Processing line: ~        end~
 - Inside source: true
 *** True Line Result
-    [1003, 1718, 64, 64],
-** Processing line: ~    [692, 1958, 64, 64],~
+        end
+** Processing line: ~      end~
 - Inside source: true
 *** True Line Result
-    [692, 1958, 64, 64],
-** Processing line: ~    [691, 1900, 64, 64],~
+      end
+** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
-    [691, 1900, 64, 64],
-** Processing line: ~    [774, 1861, 64, 64],~
+    end
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-    [774, 1861, 64, 64],
-** Processing line: ~    [712, 1861, 64, 64],~
+
+** Processing line: ~    def calc_player~
 - Inside source: true
 *** True Line Result
-    [712, 1861, 64, 64],
-** Processing line: ~    [691, 1863, 64, 64],~
+    def calc_player
+** Processing line: ~      calc_shooting~
 - Inside source: true
 *** True Line Result
-    [691, 1863, 64, 64],
-** Processing line: ~    [325, 2133, 64, 64],~
+      calc_shooting
+** Processing line: ~      if !state.god_mode~
 - Inside source: true
 *** True Line Result
-    [325, 2133, 64, 64],
-** Processing line: ~    [275, 2134, 64, 64],~
+      if !state.god_mode
+** Processing line: ~        state.dy += state.gravity  # Since acceleration is the change in velocity, the change in y (dy) increases every frame~
 - Inside source: true
 *** True Line Result
-    [275, 2134, 64, 64],
-** Processing line: ~    [326, 2082, 64, 64],~
+        state.dy += state.gravity  # Since acceleration is the change in velocity, the change in y (dy) increases every frame
+** Processing line: ~        state.dx += state.dx * state.air~
 - Inside source: true
 *** True Line Result
-    [326, 2082, 64, 64],
-** Processing line: ~    [275, 2082, 64, 64],~
+        state.dx += state.dx * state.air
+** Processing line: ~      end~
 - Inside source: true
 *** True Line Result
-    [275, 2082, 64, 64],
-** Processing line: ~    [124, 2321, 64, 64],~
+      end
+** Processing line: ~      calc_pendulum~
 - Inside source: true
 *** True Line Result
-    [124, 2321, 64, 64],
-** Processing line: ~    [71, 2320, 64, 64],~
+      calc_pendulum
+** Processing line: ~      calc_box_collision~
 - Inside source: true
 *** True Line Result
-    [71, 2320, 64, 64],
-** Processing line: ~    [123, 2267, 64, 64],~
+      calc_box_collision
+** Processing line: ~      calc_edge_collision~
 - Inside source: true
 *** True Line Result
-    [123, 2267, 64, 64],
-** Processing line: ~    [71, 2268, 64, 64],~
+      calc_edge_collision
+** Processing line: ~      if !state.god_mode~
 - Inside source: true
 *** True Line Result
-    [71, 2268, 64, 64],
-** Processing line: ~    [2354, 1859, 64, 64],~
+      if !state.god_mode
+** Processing line: ~        state.y  += state.dy~
 - Inside source: true
 *** True Line Result
-    [2354, 1859, 64, 64],
-** Processing line: ~    [2292, 1859, 64, 64],~
+        state.y  += state.dy
+** Processing line: ~        state.x  += state.dx~
 - Inside source: true
 *** True Line Result
-    [2292, 1859, 64, 64],
-** Processing line: ~    [2231, 1857, 64, 64],~
+        state.x  += state.dx
+** Processing line: ~      end~
 - Inside source: true
 *** True Line Result
-    [2231, 1857, 64, 64],
-** Processing line: ~    [2198, 1858, 64, 64],~
+      end
+** Processing line: ~      calc_tongue_angle~
 - Inside source: true
 *** True Line Result
-    [2198, 1858, 64, 64],
-** Processing line: ~    [2353, 1802, 64, 64],~
+      calc_tongue_angle
+** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
-    [2353, 1802, 64, 64],
-** Processing line: ~    [2296, 1798, 64, 64],~
+    end
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-    [2296, 1798, 64, 64],
-** Processing line: ~    [2233, 1797, 64, 64],~
+
+** Processing line: ~    def calc_box_collision~
 - Inside source: true
 *** True Line Result
-    [2233, 1797, 64, 64],
-** Processing line: ~    [2200, 1797, 64, 64],~
+    def calc_box_collision
+** Processing line: ~      return unless state.world_lookup.keys.length > 0~
 - Inside source: true
 *** True Line Result
-    [2200, 1797, 64, 64],
-** Processing line: ~    [2352, 1742, 64, 64],~
+      return unless state.world_lookup.keys.length > 0
+** Processing line: ~      collision_floor~
 - Inside source: true
 *** True Line Result
-    [2352, 1742, 64, 64],
-** Processing line: ~    [2288, 1741, 64, 64],~
+      collision_floor
+** Processing line: ~      collision_left~
 - Inside source: true
 *** True Line Result
-    [2288, 1741, 64, 64],
-** Processing line: ~    [2230, 1743, 64, 64],~
+      collision_left
+** Processing line: ~      collision_right~
 - Inside source: true
 *** True Line Result
-    [2230, 1743, 64, 64],
-** Processing line: ~    [2196, 1743, 64, 64],~
+      collision_right
+** Processing line: ~      collision_ceiling~
 - Inside source: true
 *** True Line Result
-    [2196, 1743, 64, 64],
-** Processing line: ~    [1736, 460, 64, 64],~
+      collision_ceiling
+** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
-    [1736, 460, 64, 64],
-** Processing line: ~    [1735, 400, 64, 64],~
+    end
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-    [1735, 400, 64, 64],
-** Processing line: ~    [1736, 339, 64, 64],~
+
+** Processing line: ~    def calc_edge_collision~
 - Inside source: true
 *** True Line Result
-    [1736, 339, 64, 64],
-** Processing line: ~    [1736, 275, 64, 64],~
+    def calc_edge_collision
+** Processing line: ~      # Ensures that player doesn't fall below the map~
 - Inside source: true
 *** True Line Result
-    [1736, 275, 64, 64],
-** Processing line: ~    [1738, 210, 64, 64],~
+      # Ensures that player doesn't fall below the map
+** Processing line: ~      if next_y < 0 && state.dy < 0~
 - Inside source: true
 *** True Line Result
-    [1738, 210, 64, 64],
-** Processing line: ~    [1735, 145, 64, 64],~
+      if next_y < 0 && state.dy < 0
+** Processing line: ~        state.y = 0~
 - Inside source: true
 *** True Line Result
-    [1735, 145, 64, 64],
-** Processing line: ~    [1735, 87, 64, 64],~
+        state.y = 0
+** Processing line: ~        state.dy = state.dy.abs * 0.8~
 - Inside source: true
 *** True Line Result
-    [1735, 87, 64, 64],
-** Processing line: ~    [1736, 51, 64, 64],~
+        state.dy = state.dy.abs * 0.8
+** Processing line: ~        state.collision_on_y = true~
 - Inside source: true
 *** True Line Result
-    [1736, 51, 64, 64],
-** Processing line: ~    [539, 289, 64, 64],~
+        state.collision_on_y = true
+** Processing line: ~      # Ensures player doesn't go insanely high~
 - Inside source: true
 *** True Line Result
-    [539, 289, 64, 64],
-** Processing line: ~    [541, 228, 64, 64],~
+      # Ensures player doesn't go insanely high
+** Processing line: ~      elsif next_y > 5875 - state.tile_size && state.dy > 0~
 - Inside source: true
 *** True Line Result
-    [541, 228, 64, 64],
-** Processing line: ~    [626, 191, 64, 64],~
+      elsif next_y > 5875 - state.tile_size && state.dy > 0
+** Processing line: ~        state.y = 5875 - state.tile_size~
 - Inside source: true
 *** True Line Result
-    [626, 191, 64, 64],
-** Processing line: ~    [572, 192, 64, 64],~
+        state.y = 5875 - state.tile_size
+** Processing line: ~        state.dy = state.dy.abs * 0.8 * -1~
 - Inside source: true
 *** True Line Result
-    [572, 192, 64, 64],
-** Processing line: ~    [540, 193, 64, 64],~
+        state.dy = state.dy.abs * 0.8 * -1
+** Processing line: ~        state.collision_on_y = true~
 - Inside source: true
 *** True Line Result
-    [540, 193, 64, 64],
-** Processing line: ~    [965, 233, 64, 64],~
+        state.collision_on_y = true
+** Processing line: ~      end~
 - Inside source: true
 *** True Line Result
-    [965, 233, 64, 64],
-** Processing line: ~    [904, 234, 64, 64],~
+      end
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-    [904, 234, 64, 64],
-** Processing line: ~    [840, 234, 64, 64],~
+
+** Processing line: ~      # Ensures that player remains in the horizontal range its supposed to~
 - Inside source: true
 *** True Line Result
-    [840, 234, 64, 64],
-** Processing line: ~    [779, 234, 64, 64],~
+      # Ensures that player remains in the horizontal range its supposed to
+** Processing line: ~      if state.x >= 10000 - state.tile_size && state.dx > 0~
 - Inside source: true
 *** True Line Result
-    [779, 234, 64, 64],
-** Processing line: ~    [745, 236, 64, 64],~
+      if state.x >= 10000 - state.tile_size && state.dx > 0
+** Processing line: ~        state.x = 10000 - state.tile_size~
 - Inside source: true
 *** True Line Result
-    [745, 236, 64, 64],
-** Processing line: ~    [851, 169, 64, 64],~
+        state.x = 10000 - state.tile_size
+** Processing line: ~        state.dx = state.dx.abs * 0.8 * -1~
 - Inside source: true
 *** True Line Result
-    [851, 169, 64, 64],
-** Processing line: ~    [849, 108, 64, 64],~
+        state.dx = state.dx.abs * 0.8 * -1
+** Processing line: ~        state.collision_on_x = true~
 - Inside source: true
 *** True Line Result
-    [849, 108, 64, 64],
-** Processing line: ~    [852, 50, 64, 64],~
+        state.collision_on_x = true
+** Processing line: ~      elsif state.x <= 0 && state.dx < 0~
 - Inside source: true
 *** True Line Result
-    [852, 50, 64, 64],
-** Processing line: ~    [1237, 289, 64, 64],~
+      elsif state.x <= 0 && state.dx < 0
+** Processing line: ~        state.x = 0~
 - Inside source: true
 *** True Line Result
-    [1237, 289, 64, 64],
-** Processing line: ~    [1236, 228, 64, 64],~
+        state.x = 0
+** Processing line: ~        state.dx = state.dx.abs * 0.8~
 - Inside source: true
 *** True Line Result
-    [1236, 228, 64, 64],
-** Processing line: ~    [1238, 197, 64, 64],~
+        state.dx = state.dx.abs * 0.8
+** Processing line: ~        state.collision_on_x = true~
 - Inside source: true
 *** True Line Result
-    [1238, 197, 64, 64],
-** Processing line: ~    [1181, 192, 64, 64],~
+        state.collision_on_x = true
+** Processing line: ~      end~
 - Inside source: true
 *** True Line Result
-    [1181, 192, 64, 64],
-** Processing line: ~    [1152, 192, 64, 64],~
+      end
+** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
-    [1152, 192, 64, 64],
-** Processing line: ~    [1443, 605, 64, 64],~
+    end
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-    [1443, 605, 64, 64],
-** Processing line: ~    [1419, 606, 64, 64],~
+
+** Processing line: ~    def next_y~
 - Inside source: true
 *** True Line Result
-    [1419, 606, 64, 64],
-** Processing line: ~    [1069, 925, 64, 64],~
+    def next_y
+** Processing line: ~      state.y + state.dy~
 - Inside source: true
 *** True Line Result
-    [1069, 925, 64, 64],
-** Processing line: ~    [1068, 902, 64, 64],~
+      state.y + state.dy
+** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
-    [1068, 902, 64, 64],
-** Processing line: ~    [1024, 927, 64, 64],~
+    end
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-    [1024, 927, 64, 64],
-** Processing line: ~    [1017, 897, 64, 64],~
+
+** Processing line: ~    def next_x~
 - Inside source: true
 *** True Line Result
-    [1017, 897, 64, 64],
-** Processing line: ~    [963, 926, 64, 64],~
+    def next_x
+** Processing line: ~      if state.dx < 0~
 - Inside source: true
 *** True Line Result
-    [963, 926, 64, 64],
-** Processing line: ~    [958, 898, 64, 64],~
+      if state.dx < 0
+** Processing line: ~        return (state.x + state.dx) - (state.tile_size - state.player_width)~
 - Inside source: true
 *** True Line Result
-    [958, 898, 64, 64],
-** Processing line: ~    [911, 928, 64, 64],~
+        return (state.x + state.dx) - (state.tile_size - state.player_width)
+** Processing line: ~      else~
 - Inside source: true
 *** True Line Result
-    [911, 928, 64, 64],
-** Processing line: ~    [911, 896, 64, 64],~
+      else
+** Processing line: ~        return (state.x + state.dx) + (state.tile_size - state.player_width)~
 - Inside source: true
 *** True Line Result
-    [911, 896, 64, 64],
-** Processing line: ~    [2132, 803, 64, 64],~
+        return (state.x + state.dx) + (state.tile_size - state.player_width)
+** Processing line: ~      end~
 - Inside source: true
 *** True Line Result
-    [2132, 803, 64, 64],
-** Processing line: ~    [2081, 803, 64, 64],~
+      end
+** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
-    [2081, 803, 64, 64],
-** Processing line: ~    [2131, 752, 64, 64],~
+    end
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-    [2131, 752, 64, 64],
-** Processing line: ~    [2077, 751, 64, 64],~
+
+** Processing line: ~    def collision_floor~
 - Inside source: true
 *** True Line Result
-    [2077, 751, 64, 64],
-** Processing line: ~    [2615, 649, 64, 64],~
+    def collision_floor
+** Processing line: ~      return unless state.dy <= 0~
 - Inside source: true
 *** True Line Result
-    [2615, 649, 64, 64],
-** Processing line: ~    [2564, 651, 64, 64],~
+      return unless state.dy <= 0
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-    [2564, 651, 64, 64],
-** Processing line: ~    [2533, 650, 64, 64],~
+
+** Processing line: ~      player_rect = [state.x, next_y, state.tile_size, state.tile_size]~
 - Inside source: true
 *** True Line Result
-    [2533, 650, 64, 64],
-** Processing line: ~    [2027, 156, 64, 64],~
+      player_rect = [state.x, next_y, state.tile_size, state.tile_size]
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-    [2027, 156, 64, 64],
-** Processing line: ~    [1968, 155, 64, 64],~
+
+** Processing line: ~      # Runs through all the sprites on the field and determines if the player hits the bottom of sprite (hence "-0.1" above)~
 - Inside source: true
 *** True Line Result
-    [1968, 155, 64, 64],
-** Processing line: ~    [1907, 153, 64, 64],~
+      # Runs through all the sprites on the field and determines if the player hits the bottom of sprite (hence "-0.1" above)
+** Processing line: ~      floor_collisions = state.world_collision_rects~
 - Inside source: true
 *** True Line Result
-    [1907, 153, 64, 64],
-** Processing line: ~    [1873, 155, 64, 64],~
+      floor_collisions = state.world_collision_rects
+** Processing line: ~                           .find_all { |r| r[:top].intersect_rect?(player_rect, state.collision_tolerance) }~
 - Inside source: true
 *** True Line Result
-    [1873, 155, 64, 64],
-** Processing line: ~    [2025, 95, 64, 64],~
+                           .find_all { |r| r[:top].intersect_rect?(player_rect, state.collision_tolerance) }
+** Processing line: ~                           .first~
 - Inside source: true
 *** True Line Result
-    [2025, 95, 64, 64],
-** Processing line: ~    [1953, 98, 64, 64],~
+                           .first
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-    [1953, 98, 64, 64],
-** Processing line: ~    [1894, 100, 64, 64],~
+
+** Processing line: ~      return unless floor_collisions~
 - Inside source: true
 *** True Line Result
-    [1894, 100, 64, 64],
-** Processing line: ~    [1870, 100, 64, 64],~
+      return unless floor_collisions
+** Processing line: ~      state.y = floor_collisions[:top].top~
 - Inside source: true
 *** True Line Result
-    [1870, 100, 64, 64],
-** Processing line: ~    [2029, 45, 64, 64],~
+      state.y = floor_collisions[:top].top
+** Processing line: ~      state.dy = state.dy.abs * 0.8~
 - Inside source: true
 *** True Line Result
-    [2029, 45, 64, 64],
-** Processing line: ~    [1971, 48, 64, 64],~
+      state.dy = state.dy.abs * 0.8
+** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
-    [1971, 48, 64, 64],
-** Processing line: ~    [1915, 47, 64, 64],~
+    end
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-    [1915, 47, 64, 64],
-** Processing line: ~    [1873, 47, 64, 64],~
+
+** Processing line: ~    def collision_left~
 - Inside source: true
 *** True Line Result
-    [1873, 47, 64, 64],
-** Processing line: ~    [3956, 288, 64, 64],~
+    def collision_left
+** Processing line: ~      return unless state.dx < 0~
 - Inside source: true
 *** True Line Result
-    [3956, 288, 64, 64],
-** Processing line: ~    [3954, 234, 64, 64],~
+      return unless state.dx < 0
+** Processing line: ~      player_rect = [next_x, state.y, state.tile_size, state.tile_size]~
 - Inside source: true
 *** True Line Result
-    [3954, 234, 64, 64],
-** Processing line: ~    [4042, 190, 64, 64],~
+      player_rect = [next_x, state.y, state.tile_size, state.tile_size]
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-    [4042, 190, 64, 64],
-** Processing line: ~    [3990, 190, 64, 64],~
+
+** Processing line: ~      # Runs through all the sprites on the field and determines if the player hits the left side of sprite (hence "-0.1" above)~
 - Inside source: true
 *** True Line Result
-    [3990, 190, 64, 64],
-** Processing line: ~    [3958, 195, 64, 64],~
+      # Runs through all the sprites on the field and determines if the player hits the left side of sprite (hence "-0.1" above)
+** Processing line: ~      left_side_collisions = state.world_collision_rects~
 - Inside source: true
 *** True Line Result
-    [3958, 195, 64, 64],
-** Processing line: ~    [3422, 709, 64, 64],~
+      left_side_collisions = state.world_collision_rects
+** Processing line: ~                               .find_all { |r| r[:left_right].intersect_rect?(player_rect, state.collision_tolerance) }~
 - Inside source: true
 *** True Line Result
-    [3422, 709, 64, 64],
-** Processing line: ~    [3425, 686, 64, 64],~
+                               .find_all { |r| r[:left_right].intersect_rect?(player_rect, state.collision_tolerance) }
+** Processing line: ~                               .first~
 - Inside source: true
 *** True Line Result
-    [3425, 686, 64, 64],
-** Processing line: ~    [3368, 709, 64, 64],~
+                               .first
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-    [3368, 709, 64, 64],
-** Processing line: ~    [3364, 683, 64, 64],~
+
+** Processing line: ~      return unless left_side_collisions~
 - Inside source: true
 *** True Line Result
-    [3364, 683, 64, 64],
-** Processing line: ~    [3312, 711, 64, 64],~
+      return unless left_side_collisions
+** Processing line: ~      state.x = left_side_collisions[:left_right].right + 1~
 - Inside source: true
 *** True Line Result
-    [3312, 711, 64, 64],
-** Processing line: ~    [3307, 684, 64, 64],~
+      state.x = left_side_collisions[:left_right].right + 1
+** Processing line: ~      state.dx = state.dy.abs * 0.8~
 - Inside source: true
 *** True Line Result
-    [3307, 684, 64, 64],
-** Processing line: ~    [3266, 712, 64, 64],~
+      state.dx = state.dy.abs * 0.8
+** Processing line: ~      state.collision_on_x = true~
 - Inside source: true
 *** True Line Result
-    [3266, 712, 64, 64],
-** Processing line: ~    [3269, 681, 64, 64],~
+      state.collision_on_x = true
+** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
-    [3269, 681, 64, 64],
-** Processing line: ~    [4384, 236, 64, 64],~
+    end
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-    [4384, 236, 64, 64],
-** Processing line: ~    [4320, 234, 64, 64],~
+
+** Processing line: ~    def collision_right~
 - Inside source: true
 *** True Line Result
-    [4320, 234, 64, 64],
-** Processing line: ~    [4257, 235, 64, 64],~
+    def collision_right
+** Processing line: ~      return unless state.dx > 0~
 - Inside source: true
 *** True Line Result
-    [4257, 235, 64, 64],
-** Processing line: ~    [4192, 234, 64, 64],~
+      return unless state.dx > 0
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-    [4192, 234, 64, 64],
-** Processing line: ~    [4162, 234, 64, 64],~
+
+** Processing line: ~      player_rect = [next_x, state.y, state.tile_size, state.tile_size]~
 - Inside source: true
 *** True Line Result
-    [4162, 234, 64, 64],
-** Processing line: ~    [4269, 171, 64, 64],~
+      player_rect = [next_x, state.y, state.tile_size, state.tile_size]
+** Processing line: ~      # Runs through all the sprites on the field and determines if the player hits the right side of sprite (hence "-0.1" above)~
 - Inside source: true
 *** True Line Result
-    [4269, 171, 64, 64],
-** Processing line: ~    [4267, 111, 64, 64],~
+      # Runs through all the sprites on the field and determines if the player hits the right side of sprite (hence "-0.1" above)
+** Processing line: ~      right_side_collisions = state.world_collision_rects~
 - Inside source: true
 *** True Line Result
-    [4267, 111, 64, 64],
-** Processing line: ~    [4266, 52, 64, 64],~
+      right_side_collisions = state.world_collision_rects
+** Processing line: ~                                .find_all { |r| r[:left_right].intersect_rect?(player_rect, state.collision_tolerance) }~
 - Inside source: true
 *** True Line Result
-    [4266, 52, 64, 64],
-** Processing line: ~    [4580, 458, 64, 64],~
+                                .find_all { |r| r[:left_right].intersect_rect?(player_rect, state.collision_tolerance) }
+** Processing line: ~                                .first~
 - Inside source: true
 *** True Line Result
-    [4580, 458, 64, 64],
-** Processing line: ~    [4582, 396, 64, 64],~
+                                .first
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-    [4582, 396, 64, 64],
-** Processing line: ~    [4582, 335, 64, 64],~
+
+** Processing line: ~      return unless right_side_collisions~
 - Inside source: true
 *** True Line Result
-    [4582, 335, 64, 64],
-** Processing line: ~    [4581, 275, 64, 64],~
+      return unless right_side_collisions
+** Processing line: ~      state.x = right_side_collisions[:left_right].left - state.tile_size - 1~
 - Inside source: true
 *** True Line Result
-    [4581, 275, 64, 64],
-** Processing line: ~    [4581, 215, 64, 64],~
+      state.x = right_side_collisions[:left_right].left - state.tile_size - 1
+** Processing line: ~      state.dx = state.dx.abs * 0.8 * -1~
 - Inside source: true
 *** True Line Result
-    [4581, 215, 64, 64],
-** Processing line: ~    [4581, 152, 64, 64],~
+      state.dx = state.dx.abs * 0.8 * -1
+** Processing line: ~      state.collision_on_x = true~
 - Inside source: true
 *** True Line Result
-    [4581, 152, 64, 64],
-** Processing line: ~    [4582, 89, 64, 64],~
+      state.collision_on_x = true
+** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
-    [4582, 89, 64, 64],
-** Processing line: ~    [4583, 51, 64, 64],~
+    end
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-    [4583, 51, 64, 64],
-** Processing line: ~    [4810, 289, 64, 64],~
+
+** Processing line: ~    def collision_ceiling~
 - Inside source: true
 *** True Line Result
-    [4810, 289, 64, 64],
-** Processing line: ~    [4810, 227, 64, 64],~
+    def collision_ceiling
+** Processing line: ~      return unless state.dy > 0~
 - Inside source: true
 *** True Line Result
-    [4810, 227, 64, 64],
-** Processing line: ~    [4895, 189, 64, 64],~
+      return unless state.dy > 0
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-    [4895, 189, 64, 64],
-** Processing line: ~    [4844, 191, 64, 64],~
+
+** Processing line: ~      player_rect = [state.x, next_y, state.player_width, state.player_height]~
 - Inside source: true
 *** True Line Result
-    [4844, 191, 64, 64],
-** Processing line: ~    [4809, 191, 64, 64],~
+      player_rect = [state.x, next_y, state.player_width, state.player_height]
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-    [4809, 191, 64, 64],
-** Processing line: ~    [5235, 233, 64, 64],~
+
+** Processing line: ~      # Runs through all the sprites on the field and determines if the player hits the ceiling of sprite (hence "+0.1" above)~
 - Inside source: true
 *** True Line Result
-    [5235, 233, 64, 64],
-** Processing line: ~    [5176, 232, 64, 64],~
+      # Runs through all the sprites on the field and determines if the player hits the ceiling of sprite (hence "+0.1" above)
+** Processing line: ~      ceil_collisions = state.world_collision_rects~
 - Inside source: true
 *** True Line Result
-    [5176, 232, 64, 64],
-** Processing line: ~    [5118, 230, 64, 64],~
+      ceil_collisions = state.world_collision_rects
+** Processing line: ~                          .find_all { |r| r[:bottom].intersect_rect?(player_rect, state.collision_tolerance) }~
 - Inside source: true
 *** True Line Result
-    [5118, 230, 64, 64],
-** Processing line: ~    [5060, 232, 64, 64],~
+                          .find_all { |r| r[:bottom].intersect_rect?(player_rect, state.collision_tolerance) }
+** Processing line: ~                          .first~
 - Inside source: true
 *** True Line Result
-    [5060, 232, 64, 64],
-** Processing line: ~    [5015, 237, 64, 64],~
+                          .first
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-    [5015, 237, 64, 64],
-** Processing line: ~    [5123, 171, 64, 64],~
+
+** Processing line: ~      return unless ceil_collisions~
 - Inside source: true
 *** True Line Result
-    [5123, 171, 64, 64],
-** Processing line: ~    [5123, 114, 64, 64],~
+      return unless ceil_collisions
+** Processing line: ~      state.y = ceil_collisions[:bottom].y - state.tile_size - 1~
 - Inside source: true
 *** True Line Result
-    [5123, 114, 64, 64],
-** Processing line: ~    [5121, 51, 64, 64],~
+      state.y = ceil_collisions[:bottom].y - state.tile_size - 1
+** Processing line: ~      state.dy = state.dy.abs * 0.8 * -1~
 - Inside source: true
 *** True Line Result
-    [5121, 51, 64, 64],
-** Processing line: ~    [5523, 461, 64, 64],~
+      state.dy = state.dy.abs * 0.8 * -1
+** Processing line: ~      state.collision_on_y = true~
 - Inside source: true
 *** True Line Result
-    [5523, 461, 64, 64],
-** Processing line: ~    [5123, 42, 64, 64],~
+      state.collision_on_y = true
+** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
-    [5123, 42, 64, 64],
-** Processing line: ~    [5525, 401, 64, 64],~
+    end
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-    [5525, 401, 64, 64],
-** Processing line: ~    [5525, 340, 64, 64],~
+
+** Processing line: ~    def to_coord point~
 - Inside source: true
 *** True Line Result
-    [5525, 340, 64, 64],
-** Processing line: ~    [5526, 273, 64, 64],~
+    def to_coord point
+** Processing line: ~      # Integer divides (idiv) point.x to turn into grid~
 - Inside source: true
 *** True Line Result
-    [5526, 273, 64, 64],
-** Processing line: ~    [5527, 211, 64, 64],~
+      # Integer divides (idiv) point.x to turn into grid
+** Processing line: ~      # Then, you can just multiply each integer by state.tile_size~
 - Inside source: true
 *** True Line Result
-    [5527, 211, 64, 64],
-** Processing line: ~    [5525, 150, 64, 64],~
+      # Then, you can just multiply each integer by state.tile_size
+** Processing line: ~      # later and huzzah. Grid coordinates~
 - Inside source: true
 *** True Line Result
-    [5525, 150, 64, 64],
-** Processing line: ~    [5527, 84, 64, 64],~
+      # later and huzzah. Grid coordinates
+** Processing line: ~      [point.x.idiv(state.tile_size), point.y.idiv(state.tile_size)]~
 - Inside source: true
 *** True Line Result
-    [5527, 84, 64, 64],
-** Processing line: ~    [5524, 44, 64, 64],~
+      [point.x.idiv(state.tile_size), point.y.idiv(state.tile_size)]
+** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
-    [5524, 44, 64, 64],
-** Processing line: ~    [5861, 288, 64, 64],~
+    end
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-    [5861, 288, 64, 64],
-** Processing line: ~    [5861, 229, 64, 64],~
+
+** Processing line: ~    def export_map~
 - Inside source: true
 *** True Line Result
-    [5861, 229, 64, 64],
-** Processing line: ~    [5945, 193, 64, 64],~
+    def export_map
+** Processing line: ~      export_string = "$collisions = [\n"~
 - Inside source: true
 *** True Line Result
-    [5945, 193, 64, 64],
-** Processing line: ~    [5904, 193, 64, 64],~
+      export_string = "$collisions = [\n"
+** Processing line: ~      export_string += state.world.map do |rect|~
 - Inside source: true
 *** True Line Result
-    [5904, 193, 64, 64],
-** Processing line: ~    [5856, 194, 64, 64],~
+      export_string += state.world.map do |rect|
+** Processing line: ~        "[#{rect.x},#{rect.y},#{rect.w},#{rect.h}],"~
 - Inside source: true
 *** True Line Result
-    [5856, 194, 64, 64],
-** Processing line: ~    [6542, 234, 64, 64],~
+        "[#{rect.x},#{rect.y},#{rect.w},#{rect.h}],"
+** Processing line: ~      end.join "\n"~
 - Inside source: true
 *** True Line Result
-    [6542, 234, 64, 64],
-** Processing line: ~    [6478, 235, 64, 64],~
+      end.join "\n"
+** Processing line: ~      export_string += "\n]\n\n"~
 - Inside source: true
 *** True Line Result
-    [6478, 235, 64, 64],
-** Processing line: ~    [6413, 238, 64, 64],~
+      export_string += "\n]\n\n"
+** Processing line: ~      export_string += "$mugs = [\n"~
 - Inside source: true
 *** True Line Result
-    [6413, 238, 64, 64],
-** Processing line: ~    [6348, 235, 64, 64],~
+      export_string += "$mugs = [\n"
+** Processing line: ~      export_string += state.objects.map do |x, y, w, h, path|~
 - Inside source: true
 *** True Line Result
-    [6348, 235, 64, 64],
-** Processing line: ~    [6285, 236, 64, 64],~
+      export_string += state.objects.map do |x, y, w, h, path|
+** Processing line: ~        "[#{x},#{y},#{w},#{h},'#{path}'],"~
 - Inside source: true
 *** True Line Result
-    [6285, 236, 64, 64],
-** Processing line: ~    [6222, 235, 64, 64],~
+        "[#{x},#{y},#{w},#{h},'#{path}'],"
+** Processing line: ~      end.join "\n"~
 - Inside source: true
 *** True Line Result
-    [6222, 235, 64, 64],
-** Processing line: ~    [6160, 235, 64, 64],~
+      end.join "\n"
+** Processing line: ~      export_string += "\n]\n\n"~
 - Inside source: true
 *** True Line Result
-    [6160, 235, 64, 64],
-** Processing line: ~    [6097, 236, 64, 64],~
+      export_string += "\n]\n\n"
+** Processing line: ~      gtk.write_file(MAP_FILE_PATH, export_string)~
 - Inside source: true
 *** True Line Result
-    [6097, 236, 64, 64],
-** Processing line: ~    [6069, 237, 64, 64],~
+      gtk.write_file(MAP_FILE_PATH, export_string)
+** Processing line: ~      state.map_saved_at = state.tick_count~
 - Inside source: true
 *** True Line Result
-    [6069, 237, 64, 64],
-** Processing line: ~    [6321, 174, 64, 64],~
+      state.map_saved_at = state.tick_count
+** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
-    [6321, 174, 64, 64],
-** Processing line: ~    [6318, 111, 64, 64],~
+    end
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-    [6318, 111, 64, 64],
-** Processing line: ~    [6320, 49, 64, 64],~
+
+** Processing line: ~    def inputs_export_stage~
 - Inside source: true
 *** True Line Result
-    [6320, 49, 64, 64],
-** Processing line: ~    [6753, 291, 64, 64],~
+    def inputs_export_stage
+** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
-    [6753, 291, 64, 64],
-** Processing line: ~    [6752, 227, 64, 64],~
+    end
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-    [6752, 227, 64, 64],
-** Processing line: ~    [6753, 192, 64, 64],~
+
+** Processing line: ~    def calc_score~
 - Inside source: true
 *** True Line Result
-    [6753, 192, 64, 64],
-** Processing line: ~    [6692, 191, 64, 64],~
+    def calc_score
+** Processing line: ~      return unless state.scene == :game~
 - Inside source: true
 *** True Line Result
-    [6692, 191, 64, 64],
-** Processing line: ~    [6668, 193, 64, 64],~
+      return unless state.scene == :game
+** Processing line: ~      player = [state.x, state.y, state.player_width, state.player_height]~
 - Inside source: true
 *** True Line Result
-    [6668, 193, 64, 64],
-** Processing line: ~    [6336, 604, 64, 64],~
+      player = [state.x, state.y, state.player_width, state.player_height]
+** Processing line: ~      collected = state.objects.find_all { |s| s.intersect_rect? player }~
 - Inside source: true
 *** True Line Result
-    [6336, 604, 64, 64],
-** Processing line: ~    [6309, 603, 64, 64],~
+      collected = state.objects.find_all { |s| s.intersect_rect? player }
+** Processing line: ~      state.stuff_score += collected.length~
 - Inside source: true
 *** True Line Result
-    [6309, 603, 64, 64],
-** Processing line: ~    [7264, 461, 64, 64],~
+      state.stuff_score += collected.length
+** Processing line: ~      if collected.length > 0~
 - Inside source: true
 *** True Line Result
-    [7264, 461, 64, 64],
-** Processing line: ~    [7264, 395, 64, 64],~
+      if collected.length > 0
+** Processing line: ~        outputs.sounds << 'sounds/collectable.wav'~
 - Inside source: true
 *** True Line Result
-    [7264, 395, 64, 64],
-** Processing line: ~    [7264, 333, 64, 64],~
+        outputs.sounds << 'sounds/collectable.wav'
+** Processing line: ~      end~
 - Inside source: true
 *** True Line Result
-    [7264, 333, 64, 64],
-** Processing line: ~    [7264, 270, 64, 64],~
+      end
+** Processing line: ~      state.objects = state.objects.reject { |s| collected.include? s }~
 - Inside source: true
 *** True Line Result
-    [7264, 270, 64, 64],
-** Processing line: ~    [7265, 207, 64, 64],~
+      state.objects = state.objects.reject { |s| collected.include? s }
+** Processing line: ~      state.stuff_time += 0.01~
 - Inside source: true
 *** True Line Result
-    [7265, 207, 64, 64],
-** Processing line: ~    [7266, 138, 64, 64],~
+      state.stuff_time += 0.01
+** Processing line: ~      if state.objects.length == 0~
 - Inside source: true
 *** True Line Result
-    [7266, 138, 64, 64],
-** Processing line: ~    [7264, 78, 64, 64],~
+      if state.objects.length == 0
+** Processing line: ~        if !state.stuff_best_time || state.stuff_time < state.stuff_best_time~
 - Inside source: true
 *** True Line Result
-    [7264, 78, 64, 64],
-** Processing line: ~    [7266, 48, 64, 64],~
+        if !state.stuff_best_time || state.stuff_time < state.stuff_best_time
+** Processing line: ~          state.stuff_best_time = state.stuff_time~
 - Inside source: true
 *** True Line Result
-    [7266, 48, 64, 64],
-** Processing line: ~    [7582, 149, 64, 64],~
+          state.stuff_best_time = state.stuff_time
+** Processing line: ~        end~
 - Inside source: true
 *** True Line Result
-    [7582, 149, 64, 64],
-** Processing line: ~    [7524, 147, 64, 64],~
+        end
+** Processing line: ~        state.game_over_at = nil~
 - Inside source: true
 *** True Line Result
-    [7524, 147, 64, 64],
-** Processing line: ~    [7461, 146, 64, 64],~
+        state.game_over_at = nil
+** Processing line: ~        state.scene = :ending~
 - Inside source: true
 *** True Line Result
-    [7461, 146, 64, 64],
-** Processing line: ~    [7425, 148, 64, 64],~
+        state.scene = :ending
+** Processing line: ~      end~
 - Inside source: true
 *** True Line Result
-    [7425, 148, 64, 64],
-** Processing line: ~    [7580, 86, 64, 64],~
+      end
+** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
-    [7580, 86, 64, 64],
-** Processing line: ~    [7582, 41, 64, 64],~
+    end
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-    [7582, 41, 64, 64],
-** Processing line: ~    [7519, 41, 64, 64],~
+
+** Processing line: ~    def calc_on_floor~
 - Inside source: true
 *** True Line Result
-    [7519, 41, 64, 64],
-** Processing line: ~    [7460, 40, 64, 64],~
+    def calc_on_floor
+** Processing line: ~      if state.action == :anchored~
 - Inside source: true
 *** True Line Result
-    [7460, 40, 64, 64],
-** Processing line: ~    [7427, 96, 64, 64],~
+      if state.action == :anchored
+** Processing line: ~        state.on_floor = false~
 - Inside source: true
 *** True Line Result
-    [7427, 96, 64, 64],
-** Processing line: ~    [7427, 41, 64, 64],~
+        state.on_floor = false
+** Processing line: ~        state.on_floor_debounce = 30~
 - Inside source: true
 *** True Line Result
-    [7427, 41, 64, 64],
-** Processing line: ~    [8060, 288, 64, 64],~
+        state.on_floor_debounce = 30
+** Processing line: ~      else~
 - Inside source: true
 *** True Line Result
-    [8060, 288, 64, 64],
-** Processing line: ~    [8059, 226, 64, 64],~
+      else
+** Processing line: ~        state.on_floor_debounce ||= 30~
 - Inside source: true
 *** True Line Result
-    [8059, 226, 64, 64],
-** Processing line: ~    [8145, 194, 64, 64],~
+        state.on_floor_debounce ||= 30
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-    [8145, 194, 64, 64],
-** Processing line: ~    [8081, 194, 64, 64],~
+
+** Processing line: ~        if state.dy.round != 0~
 - Inside source: true
 *** True Line Result
-    [8081, 194, 64, 64],
-** Processing line: ~    [8058, 195, 64, 64],~
+        if state.dy.round != 0
+** Processing line: ~          state.on_floor_debounce = 30~
 - Inside source: true
 *** True Line Result
-    [8058, 195, 64, 64],
-** Processing line: ~    [8485, 234, 64, 64],~
+          state.on_floor_debounce = 30
+** Processing line: ~          state.on_floor = false~
 - Inside source: true
 *** True Line Result
-    [8485, 234, 64, 64],
-** Processing line: ~    [8422, 235, 64, 64],~
+          state.on_floor = false
+** Processing line: ~        else~
 - Inside source: true
 *** True Line Result
-    [8422, 235, 64, 64],
-** Processing line: ~    [8360, 235, 64, 64],~
+        else
+** Processing line: ~          state.on_floor_debounce -= 1~
 - Inside source: true
 *** True Line Result
-    [8360, 235, 64, 64],
-** Processing line: ~    [8296, 235, 64, 64],~
+          state.on_floor_debounce -= 1
+** Processing line: ~        end~
 - Inside source: true
 *** True Line Result
-    [8296, 235, 64, 64],
-** Processing line: ~    [8266, 237, 64, 64],~
+        end
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-    [8266, 237, 64, 64],
-** Processing line: ~    [8371, 173, 64, 64],~
+
+** Processing line: ~        if state.on_floor_debounce <= 0~
 - Inside source: true
 *** True Line Result
-    [8371, 173, 64, 64],
-** Processing line: ~    [8370, 117, 64, 64],~
+        if state.on_floor_debounce <= 0
+** Processing line: ~          state.on_floor_debounce = 0~
 - Inside source: true
 *** True Line Result
-    [8370, 117, 64, 64],
-** Processing line: ~    [8372, 59, 64, 64],~
+          state.on_floor_debounce = 0
+** Processing line: ~          state.on_floor = true~
 - Inside source: true
 *** True Line Result
-    [8372, 59, 64, 64],
-** Processing line: ~    [8372, 51, 64, 64],~
+          state.on_floor = true
+** Processing line: ~        end~
 - Inside source: true
 *** True Line Result
-    [8372, 51, 64, 64],
-** Processing line: ~    [9147, 192, 64, 64],~
+        end
+** Processing line: ~      end~
 - Inside source: true
 *** True Line Result
-    [9147, 192, 64, 64],
-** Processing line: ~    [9063, 287, 64, 64],~
+      end
+** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
-    [9063, 287, 64, 64],
-** Processing line: ~    [9064, 225, 64, 64],~
+    end
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-    [9064, 225, 64, 64],
-** Processing line: ~    [9085, 193, 64, 64],~
+
+** Processing line: ~    def render_player~
 - Inside source: true
 *** True Line Result
-    [9085, 193, 64, 64],
-** Processing line: ~    [9063, 194, 64, 64],~
+    def render_player
+** Processing line: ~      path = "sprites/square-green.png"~
 - Inside source: true
 *** True Line Result
-    [9063, 194, 64, 64],
-** Processing line: ~    [9492, 234, 64, 64],~
+      path = "sprites/square-green.png"
+** Processing line: ~      angle = 0~
 - Inside source: true
 *** True Line Result
-    [9492, 234, 64, 64],
-** Processing line: ~    [9428, 234, 64, 64],~
+      angle = 0
+** Processing line: ~      # outputs.labels << [vx(state.x), vy(state.y) - 30, "dy: #{state.dy.round}"]~
 - Inside source: true
 *** True Line Result
-    [9428, 234, 64, 64],
-** Processing line: ~    [9365, 235, 64, 64],~
+      # outputs.labels << [vx(state.x), vy(state.y) - 30, "dy: #{state.dy.round}"]
+** Processing line: ~      if state.action == :idle~
 - Inside source: true
 *** True Line Result
-    [9365, 235, 64, 64],
-** Processing line: ~    [9302, 235, 64, 64],~
+      if state.action == :idle
+** Processing line: ~        # outputs.labels << [vx(state.x), vy(state.y), "IDLE"]~
 - Inside source: true
 *** True Line Result
-    [9302, 235, 64, 64],
-** Processing line: ~    [9270, 237, 64, 64],~
+        # outputs.labels << [vx(state.x), vy(state.y), "IDLE"]
+** Processing line: ~        path = "sprites/square-green.png"~
 - Inside source: true
 *** True Line Result
-    [9270, 237, 64, 64],
-** Processing line: ~    [9374, 172, 64, 64],~
+        path = "sprites/square-green.png"
+** Processing line: ~      elsif state.action == :aiming && !state.on_floor~
 - Inside source: true
 *** True Line Result
-    [9374, 172, 64, 64],
-** Processing line: ~    [9376, 109, 64, 64],~
+      elsif state.action == :aiming && !state.on_floor
+** Processing line: ~        # outputs.labels << [vx(state.x), vy(state.y), "AIMING AIR BORN"]~
 - Inside source: true
 *** True Line Result
-    [9376, 109, 64, 64],
-** Processing line: ~    [9377, 48, 64, 64],~
+        # outputs.labels << [vx(state.x), vy(state.y), "AIMING AIR BORN"]
+** Processing line: ~        angle = state.tongue_angle - 90~
 - Inside source: true
 *** True Line Result
-    [9377, 48, 64, 64],
-** Processing line: ~    [9545, 1060, 64, 64],~
+        angle = state.tongue_angle - 90
+** Processing line: ~        path = "sprites/square-green.png"~
 - Inside source: true
 *** True Line Result
-    [9545, 1060, 64, 64],
-** Processing line: ~    [9482, 1062, 64, 64],~
+        path = "sprites/square-green.png"
+** Processing line: ~      elsif state.action == :aiming # ON THE GROUND~
 - Inside source: true
 *** True Line Result
-    [9482, 1062, 64, 64],
-** Processing line: ~    [9423, 1062, 64, 64],~
+      elsif state.action == :aiming # ON THE GROUND
+** Processing line: ~        # outputs.labels << [vx(state.x), vy(state.y), "AIMING GROUND"]~
 - Inside source: true
 *** True Line Result
-    [9423, 1062, 64, 64],
-** Processing line: ~    [9387, 1062, 64, 64],~
+        # outputs.labels << [vx(state.x), vy(state.y), "AIMING GROUND"]
+** Processing line: ~        path = "sprites/square-green.png"~
 - Inside source: true
 *** True Line Result
-    [9387, 1062, 64, 64],
-** Processing line: ~    [9541, 999, 64, 64],~
+        path = "sprites/square-green.png"
+** Processing line: ~      elsif state.action == :shooting && !state.on_floor~
 - Inside source: true
 *** True Line Result
-    [9541, 999, 64, 64],
-** Processing line: ~    [9542, 953, 64, 64],~
+      elsif state.action == :shooting && !state.on_floor
+** Processing line: ~        # outputs.labels << [vx(state.x), vy(state.y), "SHOOTING AIR BORN"]~
 - Inside source: true
 *** True Line Result
-    [9542, 953, 64, 64],
-** Processing line: ~    [9478, 953, 64, 64],~
+        # outputs.labels << [vx(state.x), vy(state.y), "SHOOTING AIR BORN"]
+** Processing line: ~        path = "sprites/square-green.png"~
 - Inside source: true
 *** True Line Result
-    [9478, 953, 64, 64],
-** Processing line: ~    [9388, 999, 64, 64],~
+        path = "sprites/square-green.png"
+** Processing line: ~        angle = state.tongue_angle - 90~
 - Inside source: true
 *** True Line Result
-    [9388, 999, 64, 64],
-** Processing line: ~    [9414, 953, 64, 64],~
+        angle = state.tongue_angle - 90
+** Processing line: ~      elsif state.action == :shooting~
 - Inside source: true
 *** True Line Result
-    [9414, 953, 64, 64],
-** Processing line: ~    [9389, 953, 64, 64],~
+      elsif state.action == :shooting
+** Processing line: ~        # outputs.labels << [vx(state.x), vy(state.y), "SHOOTING ON GROUND"]~
 - Inside source: true
 *** True Line Result
-    [9389, 953, 64, 64],
-** Processing line: ~    [9294, 1194, 64, 64],~
+        # outputs.labels << [vx(state.x), vy(state.y), "SHOOTING ON GROUND"]
+** Processing line: ~        path = "sprites/square-green.png"~
 - Inside source: true
 *** True Line Result
-    [9294, 1194, 64, 64],
-** Processing line: ~    [9245, 1195, 64, 64],~
+        path = "sprites/square-green.png"
+** Processing line: ~      elsif state.action == :anchored~
 - Inside source: true
 *** True Line Result
-    [9245, 1195, 64, 64],
-** Processing line: ~    [9297, 1143, 64, 64],~
+      elsif state.action == :anchored
+** Processing line: ~        # outputs.labels << [vx(state.x), vy(state.y), "SWINGING"]~
 - Inside source: true
 *** True Line Result
-    [9297, 1143, 64, 64],
-** Processing line: ~    [9245, 1144, 64, 64],~
+        # outputs.labels << [vx(state.x), vy(state.y), "SWINGING"]
+** Processing line: ~        angle = state.tongue_angle - 90~
 - Inside source: true
 *** True Line Result
-    [9245, 1144, 64, 64],
-** Processing line: ~    [5575, 1781, 64, 64],~
+        angle = state.tongue_angle - 90
+** Processing line: ~        path = "sprites/square-green.png"~
 - Inside source: true
 *** True Line Result
-    [5575, 1781, 64, 64],
-** Processing line: ~    [5574, 1753, 64, 64],~
+        path = "sprites/square-green.png"
+** Processing line: ~      end~
 - Inside source: true
 *** True Line Result
-    [5574, 1753, 64, 64],
-** Processing line: ~    [5522, 1782, 64, 64],~
+      end
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-    [5522, 1782, 64, 64],
-** Processing line: ~    [5518, 1753, 64, 64],~
+
+** Processing line: ~      outputs.sprites << [vx(state.x),~
 - Inside source: true
 *** True Line Result
-    [5518, 1753, 64, 64],
-** Processing line: ~    [5472, 1783, 64, 64],~
+      outputs.sprites << [vx(state.x),
+** Processing line: ~                          vy(state.y),~
 - Inside source: true
 *** True Line Result
-    [5472, 1783, 64, 64],
-** Processing line: ~    [5471, 1751, 64, 64],~
+                          vy(state.y),
+** Processing line: ~                          vw(state.player_width),~
 - Inside source: true
 *** True Line Result
-    [5471, 1751, 64, 64],
-** Processing line: ~    [5419, 1781, 64, 64],~
+                          vw(state.player_width),
+** Processing line: ~                          vh(state.player_height),~
 - Inside source: true
 *** True Line Result
-    [5419, 1781, 64, 64],
-** Processing line: ~    [5421, 1749, 64, 64],~
+                          vh(state.player_height),
+** Processing line: ~                          path,~
 - Inside source: true
 *** True Line Result
-    [5421, 1749, 64, 64],
-** Processing line: ~    [500, 3207, 64, 64],~
+                          path,
+** Processing line: ~                          angle]~
 - Inside source: true
 *** True Line Result
-    [500, 3207, 64, 64],
-** Processing line: ~    [477, 3205, 64, 64],~
+                          angle]
+** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
-    [477, 3205, 64, 64],
-** Processing line: ~    [1282, 3214, 64, 64],~
+    end
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-    [1282, 3214, 64, 64],
-** Processing line: ~    [1221, 3214, 64, 64],~
+
+** Processing line: ~    def render_player_old~
 - Inside source: true
 *** True Line Result
-    [1221, 3214, 64, 64],
-** Processing line: ~    [1188, 3215, 64, 64],~
+    def render_player_old
+** Processing line: ~      # Player~
 - Inside source: true
 *** True Line Result
-    [1188, 3215, 64, 64],
-** Processing line: ~    [1345, 3103, 64, 64],~
+      # Player
+** Processing line: ~      if state.action == :aiming~
 - Inside source: true
 *** True Line Result
-    [1345, 3103, 64, 64],
-** Processing line: ~    [1288, 3103, 64, 64],~
+      if state.action == :aiming
+** Processing line: ~        path = 'sprites\frg\idle\frog_idle.png'~
 - Inside source: true
 *** True Line Result
-    [1288, 3103, 64, 64],
-** Processing line: ~    [1231, 3104, 64, 64],~
+        path = 'sprites\frg\idle\frog_idle.png'
+** Processing line: ~        if state.dx > 2~
 - Inside source: true
 *** True Line Result
-    [1231, 3104, 64, 64],
-** Processing line: ~    [1190, 3153, 64, 64],~
+        if state.dx > 2
+** Processing line: ~  	  #directional right sprite was here but i needa redo it~
 - Inside source: true
 *** True Line Result
-    [1190, 3153, 64, 64],
-** Processing line: ~    [1189, 3105, 64, 64],~
+  	  #directional right sprite was here but i needa redo it
+** Processing line: ~          path = 'sprites\frg\anchor\frog-anchor-0.png'~
 - Inside source: true
 *** True Line Result
-    [1189, 3105, 64, 64],
-** Processing line: ~    [2255, 3508, 64, 64],~
+          path = 'sprites\frg\anchor\frog-anchor-0.png'
+** Processing line: ~        #directional left sprite was here but i needa redo it~
 - Inside source: true
 *** True Line Result
-    [2255, 3508, 64, 64],
-** Processing line: ~    [2206, 3510, 64, 64],~
+        #directional left sprite was here but i needa redo it
+** Processing line: ~  	  elsif state.dx < -2~
 - Inside source: true
 *** True Line Result
-    [2206, 3510, 64, 64],
-** Processing line: ~    [2254, 3458, 64, 64],~
+  	  elsif state.dx < -2
+** Processing line: ~          path = 'sprites\frg\anchor\frog-anchor-0.png'~
 - Inside source: true
 *** True Line Result
-    [2254, 3458, 64, 64],
-** Processing line: ~    [2202, 3458, 64, 64],~
+          path = 'sprites\frg\anchor\frog-anchor-0.png'
+** Processing line: ~        end~
 - Inside source: true
 *** True Line Result
-    [2202, 3458, 64, 64],
-** Processing line: ~    [2754, 2930, 64, 64],~
+        end
+** Processing line: ~        outputs.sprites << [vx(state.x),~
 - Inside source: true
 *** True Line Result
-    [2754, 2930, 64, 64],
-** Processing line: ~    [2726, 2932, 64, 64],~
+        outputs.sprites << [vx(state.x),
+** Processing line: ~                            vy(state.y),~
 - Inside source: true
 *** True Line Result
-    [2726, 2932, 64, 64],
-** Processing line: ~    [3408, 2874, 64, 64],~
+                            vy(state.y),
+** Processing line: ~                            vw(state.player_width),~
 - Inside source: true
 *** True Line Result
-    [3408, 2874, 64, 64],
-** Processing line: ~    [3407, 2849, 64, 64],~
+                            vw(state.player_width),
+** Processing line: ~                            vh(state.player_height),~
 - Inside source: true
 *** True Line Result
-    [3407, 2849, 64, 64],
-** Processing line: ~    [3345, 2872, 64, 64],~
+                            vh(state.player_height),
+** Processing line: ~                            path,~
 - Inside source: true
 *** True Line Result
-    [3345, 2872, 64, 64],
-** Processing line: ~    [3342, 2847, 64, 64],~
+                            path,
+** Processing line: ~                            (state.tongue_angle - 90)]~
 - Inside source: true
 *** True Line Result
-    [3342, 2847, 64, 64],
-** Processing line: ~    [3284, 2874, 64, 64],~
+                            (state.tongue_angle - 90)]
+** Processing line: ~      elsif state.action == :anchored || state.action == :shooting~
 - Inside source: true
 *** True Line Result
-    [3284, 2874, 64, 64],
-** Processing line: ~    [3284, 2848, 64, 64],~
+      elsif state.action == :anchored || state.action == :shooting
+** Processing line: ~        outputs.sprites << [vx(state.x),~
 - Inside source: true
 *** True Line Result
-    [3284, 2848, 64, 64],
-** Processing line: ~    [3248, 2878, 64, 64],~
+        outputs.sprites << [vx(state.x),
+** Processing line: ~                            vy(state.y),~
 - Inside source: true
 *** True Line Result
-    [3248, 2878, 64, 64],
-** Processing line: ~    [3252, 2848, 64, 64],~
+                            vy(state.y),
+** Processing line: ~                            vw(state.player_width),~
 - Inside source: true
 *** True Line Result
-    [3252, 2848, 64, 64],
-** Processing line: ~    [3953, 3274, 64, 64],~
+                            vw(state.player_width),
+** Processing line: ~                            vw(state.player_height),~
 - Inside source: true
 *** True Line Result
-    [3953, 3274, 64, 64],
-** Processing line: ~    [3899, 3277, 64, 64],~
+                            vw(state.player_height),
+** Processing line: ~                            'sprites/animations_povfrog/frog_bwah_up.png',~
 - Inside source: true
 *** True Line Result
-    [3899, 3277, 64, 64],
-** Processing line: ~    [3951, 3222, 64, 64],~
+                            'sprites/animations_povfrog/frog_bwah_up.png',
+** Processing line: ~                            (state.tongue_angle - 90)]~
 - Inside source: true
 *** True Line Result
-    [3951, 3222, 64, 64],
-** Processing line: ~    [3900, 3222, 64, 64],~
+                            (state.tongue_angle - 90)]
+** Processing line: ~      end~
 - Inside source: true
 *** True Line Result
-    [3900, 3222, 64, 64],
-** Processing line: ~    [4310, 2968, 64, 64],~
+      end
+** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
-    [4310, 2968, 64, 64],
-** Processing line: ~    [4246, 2969, 64, 64],~
+    end
+** Processing line: ~  end~
 - Inside source: true
 *** True Line Result
-    [4246, 2969, 64, 64],
-** Processing line: ~    [4183, 2965, 64, 64],~
+  end
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-    [4183, 2965, 64, 64],
-** Processing line: ~    [4153, 2967, 64, 64],~
+
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-    [4153, 2967, 64, 64],
-** Processing line: ~    [4311, 2910, 64, 64],~
+
+** Processing line: ~  $game = CleptoFrog.new~
 - Inside source: true
 *** True Line Result
-    [4311, 2910, 64, 64],
-** Processing line: ~    [4308, 2856, 64, 64],~
+  $game = CleptoFrog.new
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-    [4308, 2856, 64, 64],
-** Processing line: ~    [4251, 2855, 64, 64],~
+
+** Processing line: ~  def tick args~
 - Inside source: true
 *** True Line Result
-    [4251, 2855, 64, 64],
-** Processing line: ~    [4197, 2857, 64, 64],~
+  def tick args
+** Processing line: ~    if args.state.scene == :game~
 - Inside source: true
 *** True Line Result
-    [4197, 2857, 64, 64],
-** Processing line: ~    [5466, 3184, 64, 64],~
+    if args.state.scene == :game
+** Processing line: ~      tick_instructions args, "SPACE to SHOOT and RELEASE tongue. LEFT, RIGHT to SWING and BUILD momentum. MINIMAP in bottom right corner.", 360~
 - Inside source: true
 *** True Line Result
-    [5466, 3184, 64, 64],
-** Processing line: ~    [5466, 3158, 64, 64],~
+      tick_instructions args, "SPACE to SHOOT and RELEASE tongue. LEFT, RIGHT to SWING and BUILD momentum. MINIMAP in bottom right corner.", 360
+** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
-    [5466, 3158, 64, 64],
-** Processing line: ~    [5404, 3184, 64, 64],~
+    end
+** Processing line: ~    $game.args = args~
 - Inside source: true
 *** True Line Result
-    [5404, 3184, 64, 64],
-** Processing line: ~    [5404, 3156, 64, 64],~
+    $game.args = args
+** Processing line: ~    $game.tick~
 - Inside source: true
 *** True Line Result
-    [5404, 3156, 64, 64],
-** Processing line: ~    [5343, 3185, 64, 64],~
+    $game.tick
+** Processing line: ~  end~
 - Inside source: true
 *** True Line Result
-    [5343, 3185, 64, 64],
-** Processing line: ~    [5342, 3156, 64, 64],~
+  end
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-    [5342, 3156, 64, 64],
-** Processing line: ~    [5308, 3185, 64, 64],~
+
+** Processing line: ~  def tick_instructions args, text, y = 715~
 - Inside source: true
 *** True Line Result
-    [5308, 3185, 64, 64],
-** Processing line: ~    [5307, 3154, 64, 64],~
+  def tick_instructions args, text, y = 715
+** Processing line: ~    return if args.state.key_event_occurred~
 - Inside source: true
 *** True Line Result
-    [5307, 3154, 64, 64],
-** Processing line: ~    [6163, 2950, 64, 64],~
+    return if args.state.key_event_occurred
+** Processing line: ~    if args.inputs.keyboard.directional_vector || args.inputs.keyboard.key_down.space~
 - Inside source: true
 *** True Line Result
-    [6163, 2950, 64, 64],
-** Processing line: ~    [6111, 2952, 64, 64],~
+    if args.inputs.keyboard.directional_vector || args.inputs.keyboard.key_down.space
+** Processing line: ~      args.state.key_event_occurred = true~
 - Inside source: true
 *** True Line Result
-    [6111, 2952, 64, 64],
-** Processing line: ~    [6164, 2898, 64, 64],~
+      args.state.key_event_occurred = true
+** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
-    [6164, 2898, 64, 64],
-** Processing line: ~    [6113, 2897, 64, 64],~
+    end
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-    [6113, 2897, 64, 64],
-** Processing line: ~    [7725, 3156, 64, 64],~
+
+** Processing line: ~    args.outputs.debug << [0, y - 50, 1280, 60].solid~
 - Inside source: true
 *** True Line Result
-    [7725, 3156, 64, 64],
-** Processing line: ~    [7661, 3157, 64, 64],~
+    args.outputs.debug << [0, y - 50, 1280, 60].solid
+** Processing line: ~    args.outputs.debug << [640, y, text, 1, 1, 255, 255, 255].label~
 - Inside source: true
 *** True Line Result
-    [7661, 3157, 64, 64],
-** Processing line: ~    [7598, 3157, 64, 64],~
+    args.outputs.debug << [640, y, text, 1, 1, 255, 255, 255].label
+** Processing line: ~    args.outputs.debug << [640, y - 25, "(SPACE to dismiss instructions)" , -2, 1, 255, 255, 255].label~
 - Inside source: true
 *** True Line Result
-    [7598, 3157, 64, 64],
-** Processing line: ~    [7533, 3156, 64, 64],~
+    args.outputs.debug << [640, y - 25, "(SPACE to dismiss instructions)" , -2, 1, 255, 255, 255].label
+** Processing line: ~  end~
 - Inside source: true
 *** True Line Result
-    [7533, 3156, 64, 64],
-** Processing line: ~    [7468, 3156, 64, 64],~
+  end
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-    [7468, 3156, 64, 64],
-** Processing line: ~    [7401, 3156, 64, 64],~
-- Inside source: true
+
+** Processing line: ~#+end_src~
+- Line was identified as the end of a code block.
 *** True Line Result
-    [7401, 3156, 64, 64],
-** Processing line: ~    [7335, 3157, 64, 64],~
-- Inside source: true
+#+end_src
+** Processing line: ~~
+- End of paragraph detected.
 *** True Line Result
-    [7335, 3157, 64, 64],
-** Processing line: ~    [7270, 3157, 64, 64],~
-- Inside source: true
+
+** Processing line: ~*** Platformer - Clepto Frog - map.rb~
+- Header detected.
 *** True Line Result
-    [7270, 3157, 64, 64],
-** Processing line: ~    [7208, 3157, 64, 64],~
-- Inside source: true
+
 *** True Line Result
-    [7208, 3157, 64, 64],
-** Processing line: ~    [7146, 3157, 64, 64],~
-- Inside source: true
+*** Platformer - Clepto Frog - map.rb
+** Processing line: ~#+begin_src ruby~
+- Line was identified as the beginning of a code block.
 *** True Line Result
-    [7146, 3157, 64, 64],
-** Processing line: ~    [7134, 3159, 64, 64],~
+
+*** True Line Result
+#+begin_src ruby
+** Processing line: ~  # ./samples/99_genre_platformer/clepto_frog/app/map.rb~
 - Inside source: true
 *** True Line Result
-    [7134, 3159, 64, 64],
-** Processing line: ~    [6685, 3726, 64, 64],~
+  # ./samples/99_genre_platformer/clepto_frog/app/map.rb
+** Processing line: ~  $collisions = [~
 - Inside source: true
 *** True Line Result
-    [6685, 3726, 64, 64],
-** Processing line: ~    [6685, 3663, 64, 64],~
+  $collisions = [
+** Processing line: ~    [326, 463, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [6685, 3663, 64, 64],
-** Processing line: ~    [6683, 3602, 64, 64],~
+    [326, 463, 64, 64],
+** Processing line: ~    [274, 462, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [6683, 3602, 64, 64],
-** Processing line: ~    [6679, 3538, 64, 64],~
+    [274, 462, 64, 64],
+** Processing line: ~    [326, 413, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [6679, 3538, 64, 64],
-** Processing line: ~    [6680, 3474, 64, 64],~
+    [326, 413, 64, 64],
+** Processing line: ~    [275, 412, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [6680, 3474, 64, 64],
-** Processing line: ~    [6682, 3413, 64, 64],~
+    [275, 412, 64, 64],
+** Processing line: ~    [124, 651, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [6682, 3413, 64, 64],
-** Processing line: ~    [6681, 3347, 64, 64],~
+    [124, 651, 64, 64],
+** Processing line: ~    [72, 651, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [6681, 3347, 64, 64],
-** Processing line: ~    [6681, 3287, 64, 64],~
+    [72, 651, 64, 64],
+** Processing line: ~    [124, 600, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [6681, 3287, 64, 64],
-** Processing line: ~    [6682, 3223, 64, 64],~
+    [124, 600, 64, 64],
+** Processing line: ~    [69, 599, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [6682, 3223, 64, 64],
-** Processing line: ~    [6683, 3161, 64, 64],~
+    [69, 599, 64, 64],
+** Processing line: ~    [501, 997, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [6683, 3161, 64, 64],
-** Processing line: ~    [6682, 3102, 64, 64],~
+    [501, 997, 64, 64],
+** Processing line: ~    [476, 995, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [6682, 3102, 64, 64],
-** Processing line: ~    [6684, 3042, 64, 64],~
+    [476, 995, 64, 64],
+** Processing line: ~    [3224, 2057, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [6684, 3042, 64, 64],
-** Processing line: ~    [6685, 2980, 64, 64],~
+    [3224, 2057, 64, 64],
+** Processing line: ~    [3224, 1994, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [6685, 2980, 64, 64],
-** Processing line: ~    [6685, 2920, 64, 64],~
+    [3224, 1994, 64, 64],
+** Processing line: ~    [3225, 1932, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [6685, 2920, 64, 64],
-** Processing line: ~    [6683, 2859, 64, 64],~
+    [3225, 1932, 64, 64],
+** Processing line: ~    [3225, 1870, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [6683, 2859, 64, 64],
-** Processing line: ~    [6684, 2801, 64, 64],~
+    [3225, 1870, 64, 64],
+** Processing line: ~    [3226, 1806, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [6684, 2801, 64, 64],
-** Processing line: ~    [6686, 2743, 64, 64],~
+    [3226, 1806, 64, 64],
+** Processing line: ~    [3224, 1744, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [6686, 2743, 64, 64],
-** Processing line: ~    [6683, 2683, 64, 64],~
+    [3224, 1744, 64, 64],
+** Processing line: ~    [3225, 1689, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [6683, 2683, 64, 64],
-** Processing line: ~    [6681, 2622, 64, 64],~
+    [3225, 1689, 64, 64],
+** Processing line: ~    [3226, 1660, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [6681, 2622, 64, 64],
-** Processing line: ~    [6682, 2559, 64, 64],~
+    [3226, 1660, 64, 64],
+** Processing line: ~    [3161, 1658, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [6682, 2559, 64, 64],
-** Processing line: ~    [6683, 2498, 64, 64],~
+    [3161, 1658, 64, 64],
+** Processing line: ~    [3097, 1660, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [6683, 2498, 64, 64],
-** Processing line: ~    [6685, 2434, 64, 64],~
+    [3097, 1660, 64, 64],
+** Processing line: ~    [3033, 1658, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [6685, 2434, 64, 64],
-** Processing line: ~    [6683, 2371, 64, 64],~
+    [3033, 1658, 64, 64],
+** Processing line: ~    [2969, 1658, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [6683, 2371, 64, 64],
-** Processing line: ~    [6683, 2306, 64, 64],~
+    [2969, 1658, 64, 64],
+** Processing line: ~    [2904, 1658, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [6683, 2306, 64, 64],
-** Processing line: ~    [6684, 2242, 64, 64],~
+    [2904, 1658, 64, 64],
+** Processing line: ~    [2839, 1657, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [6684, 2242, 64, 64],
-** Processing line: ~    [6683, 2177, 64, 64],~
+    [2839, 1657, 64, 64],
+** Processing line: ~    [2773, 1657, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [6683, 2177, 64, 64],
-** Processing line: ~    [6683, 2112, 64, 64],~
+    [2773, 1657, 64, 64],
+** Processing line: ~    [2709, 1658, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [6683, 2112, 64, 64],
-** Processing line: ~    [6683, 2049, 64, 64],~
+    [2709, 1658, 64, 64],
+** Processing line: ~    [2643, 1657, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [6683, 2049, 64, 64],
-** Processing line: ~    [6683, 1985, 64, 64],~
+    [2643, 1657, 64, 64],
+** Processing line: ~    [2577, 1657, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [6683, 1985, 64, 64],
-** Processing line: ~    [6682, 1923, 64, 64],~
+    [2577, 1657, 64, 64],
+** Processing line: ~    [2509, 1658, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [6682, 1923, 64, 64],
-** Processing line: ~    [6683, 1860, 64, 64],~
+    [2509, 1658, 64, 64],
+** Processing line: ~    [2440, 1658, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [6683, 1860, 64, 64],
-** Processing line: ~    [6685, 1797, 64, 64],~
+    [2440, 1658, 64, 64],
+** Processing line: ~    [2371, 1658, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [6685, 1797, 64, 64],
-** Processing line: ~    [6684, 1735, 64, 64],~
+    [2371, 1658, 64, 64],
+** Processing line: ~    [2301, 1659, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [6684, 1735, 64, 64],
-** Processing line: ~    [6685, 1724, 64, 64],~
+    [2301, 1659, 64, 64],
+** Processing line: ~    [2230, 1659, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [6685, 1724, 64, 64],
-** Processing line: ~    [7088, 1967, 64, 64],~
+    [2230, 1659, 64, 64],
+** Processing line: ~    [2159, 1659, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [7088, 1967, 64, 64],
-** Processing line: ~    [7026, 1966, 64, 64],~
+    [2159, 1659, 64, 64],
+** Processing line: ~    [2092, 1660, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [7026, 1966, 64, 64],
-** Processing line: ~    [6964, 1967, 64, 64],~
+    [2092, 1660, 64, 64],
+** Processing line: ~    [2025, 1661, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [6964, 1967, 64, 64],
-** Processing line: ~    [6900, 1965, 64, 64],~
+    [2025, 1661, 64, 64],
+** Processing line: ~    [1958, 1660, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [6900, 1965, 64, 64],
-** Processing line: ~    [6869, 1969, 64, 64],~
+    [1958, 1660, 64, 64],
+** Processing line: ~    [1888, 1659, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [6869, 1969, 64, 64],
-** Processing line: ~    [6972, 1904, 64, 64],~
+    [1888, 1659, 64, 64],
+** Processing line: ~    [1817, 1657, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [6972, 1904, 64, 64],
-** Processing line: ~    [6974, 1840, 64, 64],~
+    [1817, 1657, 64, 64],
+** Processing line: ~    [1745, 1656, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [6974, 1840, 64, 64],
-** Processing line: ~    [6971, 1776, 64, 64],~
+    [1745, 1656, 64, 64],
+** Processing line: ~    [1673, 1658, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [6971, 1776, 64, 64],
-** Processing line: ~    [6971, 1716, 64, 64],~
+    [1673, 1658, 64, 64],
+** Processing line: ~    [1605, 1660, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [6971, 1716, 64, 64],
-** Processing line: ~    [7168, 1979, 64, 64],~
+    [1605, 1660, 64, 64],
+** Processing line: ~    [1536, 1658, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [7168, 1979, 64, 64],
-** Processing line: ~    [7170, 1919, 64, 64],~
+    [1536, 1658, 64, 64],
+** Processing line: ~    [1465, 1660, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [7170, 1919, 64, 64],
-** Processing line: ~    [7169, 1882, 64, 64],~
+    [1465, 1660, 64, 64],
+** Processing line: ~    [1386, 1960, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [7169, 1882, 64, 64],
-** Processing line: ~    [7115, 1880, 64, 64],~
+    [1386, 1960, 64, 64],
+** Processing line: ~    [1384, 1908, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [7115, 1880, 64, 64],
-** Processing line: ~    [7086, 1881, 64, 64],~
+    [1384, 1908, 64, 64],
+** Processing line: ~    [1387, 1862, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [7086, 1881, 64, 64],
-** Processing line: ~    [7725, 1837, 64, 64],~
+    [1387, 1862, 64, 64],
+** Processing line: ~    [1326, 1863, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [7725, 1837, 64, 64],
-** Processing line: ~    [7724, 1776, 64, 64],~
+    [1326, 1863, 64, 64],
+** Processing line: ~    [1302, 1862, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [7724, 1776, 64, 64],
-** Processing line: ~    [7724, 1728, 64, 64],~
+    [1302, 1862, 64, 64],
+** Processing line: ~    [1119, 1906, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [7724, 1728, 64, 64],
-** Processing line: ~    [7661, 1727, 64, 64],~
+    [1119, 1906, 64, 64],
+** Processing line: ~    [1057, 1905, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [7661, 1727, 64, 64],
-** Processing line: ~    [7603, 1728, 64, 64],~
+    [1057, 1905, 64, 64],
+** Processing line: ~    [994, 1905, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [7603, 1728, 64, 64],
-** Processing line: ~    [7571, 1837, 64, 64],~
+    [994, 1905, 64, 64],
+** Processing line: ~    [937, 1904, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [7571, 1837, 64, 64],
-** Processing line: ~    [7570, 1774, 64, 64],~
+    [937, 1904, 64, 64],
+** Processing line: ~    [896, 1904, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [7570, 1774, 64, 64],
-** Processing line: ~    [7572, 1725, 64, 64],~
+    [896, 1904, 64, 64],
+** Processing line: ~    [1001, 1845, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [7572, 1725, 64, 64],
-** Processing line: ~    [7859, 2134, 64, 64],~
+    [1001, 1845, 64, 64],
+** Processing line: ~    [1003, 1780, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [7859, 2134, 64, 64],
-** Processing line: ~    [7858, 2070, 64, 64],~
+    [1003, 1780, 64, 64],
+** Processing line: ~    [1003, 1718, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [7858, 2070, 64, 64],
-** Processing line: ~    [7858, 2008, 64, 64],~
+    [1003, 1718, 64, 64],
+** Processing line: ~    [692, 1958, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [7858, 2008, 64, 64],
-** Processing line: ~    [7860, 1942, 64, 64],~
+    [692, 1958, 64, 64],
+** Processing line: ~    [691, 1900, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [7860, 1942, 64, 64],
-** Processing line: ~    [7856, 1878, 64, 64],~
+    [691, 1900, 64, 64],
+** Processing line: ~    [774, 1861, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [7856, 1878, 64, 64],
-** Processing line: ~    [7860, 1813, 64, 64],~
+    [774, 1861, 64, 64],
+** Processing line: ~    [712, 1861, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [7860, 1813, 64, 64],
-** Processing line: ~    [7859, 1750, 64, 64],~
+    [712, 1861, 64, 64],
+** Processing line: ~    [691, 1863, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [7859, 1750, 64, 64],
-** Processing line: ~    [7856, 1724, 64, 64],~
+    [691, 1863, 64, 64],
+** Processing line: ~    [325, 2133, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [7856, 1724, 64, 64],
-** Processing line: ~    [8155, 1837, 64, 64],~
+    [325, 2133, 64, 64],
+** Processing line: ~    [275, 2134, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [8155, 1837, 64, 64],
-** Processing line: ~    [8092, 1839, 64, 64],~
+    [275, 2134, 64, 64],
+** Processing line: ~    [326, 2082, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [8092, 1839, 64, 64],
-** Processing line: ~    [8032, 1838, 64, 64],~
+    [326, 2082, 64, 64],
+** Processing line: ~    [275, 2082, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [8032, 1838, 64, 64],
-** Processing line: ~    [7999, 1839, 64, 64],~
+    [275, 2082, 64, 64],
+** Processing line: ~    [124, 2321, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [7999, 1839, 64, 64],
-** Processing line: ~    [8153, 1773, 64, 64],~
+    [124, 2321, 64, 64],
+** Processing line: ~    [71, 2320, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [8153, 1773, 64, 64],
-** Processing line: ~    [8154, 1731, 64, 64],~
+    [71, 2320, 64, 64],
+** Processing line: ~    [123, 2267, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [8154, 1731, 64, 64],
-** Processing line: ~    [8090, 1730, 64, 64],~
+    [123, 2267, 64, 64],
+** Processing line: ~    [71, 2268, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [8090, 1730, 64, 64],
-** Processing line: ~    [8035, 1732, 64, 64],~
+    [71, 2268, 64, 64],
+** Processing line: ~    [2354, 1859, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [8035, 1732, 64, 64],
-** Processing line: ~    [8003, 1776, 64, 64],~
+    [2354, 1859, 64, 64],
+** Processing line: ~    [2292, 1859, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [8003, 1776, 64, 64],
-** Processing line: ~    [8003, 1730, 64, 64],~
+    [2292, 1859, 64, 64],
+** Processing line: ~    [2231, 1857, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [8003, 1730, 64, 64],
-** Processing line: ~    [8421, 1978, 64, 64],~
+    [2231, 1857, 64, 64],
+** Processing line: ~    [2198, 1858, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [8421, 1978, 64, 64],
-** Processing line: ~    [8420, 1917, 64, 64],~
+    [2198, 1858, 64, 64],
+** Processing line: ~    [2353, 1802, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [8420, 1917, 64, 64],
-** Processing line: ~    [8505, 1878, 64, 64],~
+    [2353, 1802, 64, 64],
+** Processing line: ~    [2296, 1798, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [8505, 1878, 64, 64],
-** Processing line: ~    [8443, 1881, 64, 64],~
+    [2296, 1798, 64, 64],
+** Processing line: ~    [2233, 1797, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [8443, 1881, 64, 64],
-** Processing line: ~    [8420, 1882, 64, 64],~
+    [2233, 1797, 64, 64],
+** Processing line: ~    [2200, 1797, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [8420, 1882, 64, 64],
-** Processing line: ~    [8847, 1908, 64, 64],~
+    [2200, 1797, 64, 64],
+** Processing line: ~    [2352, 1742, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [8847, 1908, 64, 64],
-** Processing line: ~    [8783, 1908, 64, 64],~
+    [2352, 1742, 64, 64],
+** Processing line: ~    [2288, 1741, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [8783, 1908, 64, 64],
-** Processing line: ~    [8718, 1910, 64, 64],~
+    [2288, 1741, 64, 64],
+** Processing line: ~    [2230, 1743, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [8718, 1910, 64, 64],
-** Processing line: ~    [8654, 1910, 64, 64],~
+    [2230, 1743, 64, 64],
+** Processing line: ~    [2196, 1743, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [8654, 1910, 64, 64],
-** Processing line: ~    [8628, 1911, 64, 64],~
+    [2196, 1743, 64, 64],
+** Processing line: ~    [1736, 460, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [8628, 1911, 64, 64],
-** Processing line: ~    [8729, 1847, 64, 64],~
+    [1736, 460, 64, 64],
+** Processing line: ~    [1735, 400, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [8729, 1847, 64, 64],
-** Processing line: ~    [8731, 1781, 64, 64],~
+    [1735, 400, 64, 64],
+** Processing line: ~    [1736, 339, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [8731, 1781, 64, 64],
-** Processing line: ~    [8731, 1721, 64, 64],~
+    [1736, 339, 64, 64],
+** Processing line: ~    [1736, 275, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [8731, 1721, 64, 64],
-** Processing line: ~    [9058, 2135, 64, 64],~
+    [1736, 275, 64, 64],
+** Processing line: ~    [1738, 210, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [9058, 2135, 64, 64],
-** Processing line: ~    [9056, 2073, 64, 64],~
+    [1738, 210, 64, 64],
+** Processing line: ~    [1735, 145, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [9056, 2073, 64, 64],
-** Processing line: ~    [9058, 2006, 64, 64],~
+    [1735, 145, 64, 64],
+** Processing line: ~    [1735, 87, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [9058, 2006, 64, 64],
-** Processing line: ~    [9057, 1939, 64, 64],~
+    [1735, 87, 64, 64],
+** Processing line: ~    [1736, 51, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [9057, 1939, 64, 64],
-** Processing line: ~    [9058, 1876, 64, 64],~
+    [1736, 51, 64, 64],
+** Processing line: ~    [539, 289, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [9058, 1876, 64, 64],
-** Processing line: ~    [9056, 1810, 64, 64],~
+    [539, 289, 64, 64],
+** Processing line: ~    [541, 228, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [9056, 1810, 64, 64],
-** Processing line: ~    [9059, 1745, 64, 64],~
+    [541, 228, 64, 64],
+** Processing line: ~    [626, 191, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [9059, 1745, 64, 64],
-** Processing line: ~    [9060, 1722, 64, 64],~
+    [626, 191, 64, 64],
+** Processing line: ~    [572, 192, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [9060, 1722, 64, 64],
-** Processing line: ~    [9273, 1977, 64, 64],~
+    [572, 192, 64, 64],
+** Processing line: ~    [540, 193, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [9273, 1977, 64, 64],
-** Processing line: ~    [9273, 1912, 64, 64],~
+    [540, 193, 64, 64],
+** Processing line: ~    [965, 233, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [9273, 1912, 64, 64],
-** Processing line: ~    [9358, 1883, 64, 64],~
+    [965, 233, 64, 64],
+** Processing line: ~    [904, 234, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [9358, 1883, 64, 64],
-** Processing line: ~    [9298, 1881, 64, 64],~
+    [904, 234, 64, 64],
+** Processing line: ~    [840, 234, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [9298, 1881, 64, 64],
-** Processing line: ~    [9270, 1883, 64, 64],~
+    [840, 234, 64, 64],
+** Processing line: ~    [779, 234, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [9270, 1883, 64, 64],
-** Processing line: ~    [9699, 1910, 64, 64],~
+    [779, 234, 64, 64],
+** Processing line: ~    [745, 236, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [9699, 1910, 64, 64],
-** Processing line: ~    [9637, 1910, 64, 64],~
+    [745, 236, 64, 64],
+** Processing line: ~    [851, 169, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [9637, 1910, 64, 64],
-** Processing line: ~    [9576, 1910, 64, 64],~
+    [851, 169, 64, 64],
+** Processing line: ~    [849, 108, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [9576, 1910, 64, 64],
-** Processing line: ~    [9512, 1911, 64, 64],~
+    [849, 108, 64, 64],
+** Processing line: ~    [852, 50, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [9512, 1911, 64, 64],
-** Processing line: ~    [9477, 1912, 64, 64],~
+    [852, 50, 64, 64],
+** Processing line: ~    [1237, 289, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [9477, 1912, 64, 64],
-** Processing line: ~    [9584, 1846, 64, 64],~
+    [1237, 289, 64, 64],
+** Processing line: ~    [1236, 228, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [9584, 1846, 64, 64],
-** Processing line: ~    [9585, 1783, 64, 64],~
+    [1236, 228, 64, 64],
+** Processing line: ~    [1238, 197, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [9585, 1783, 64, 64],
-** Processing line: ~    [9586, 1719, 64, 64],~
+    [1238, 197, 64, 64],
+** Processing line: ~    [1181, 192, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [9586, 1719, 64, 64],
-** Processing line: ~    [8320, 2788, 64, 64],~
+    [1181, 192, 64, 64],
+** Processing line: ~    [1152, 192, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [8320, 2788, 64, 64],
-** Processing line: ~    [8256, 2789, 64, 64],~
+    [1152, 192, 64, 64],
+** Processing line: ~    [1443, 605, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [8256, 2789, 64, 64],
-** Processing line: ~    [8192, 2789, 64, 64],~
+    [1443, 605, 64, 64],
+** Processing line: ~    [1419, 606, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [8192, 2789, 64, 64],
-** Processing line: ~    [8180, 2789, 64, 64],~
+    [1419, 606, 64, 64],
+** Processing line: ~    [1069, 925, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [8180, 2789, 64, 64],
-** Processing line: ~    [8319, 2730, 64, 64],~
+    [1069, 925, 64, 64],
+** Processing line: ~    [1068, 902, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [8319, 2730, 64, 64],
-** Processing line: ~    [8319, 2671, 64, 64],~
+    [1068, 902, 64, 64],
+** Processing line: ~    [1024, 927, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [8319, 2671, 64, 64],
-** Processing line: ~    [8319, 2639, 64, 64],~
+    [1024, 927, 64, 64],
+** Processing line: ~    [1017, 897, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [8319, 2639, 64, 64],
-** Processing line: ~    [8259, 2639, 64, 64],~
+    [1017, 897, 64, 64],
+** Processing line: ~    [963, 926, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [8259, 2639, 64, 64],
-** Processing line: ~    [8202, 2639, 64, 64],~
+    [963, 926, 64, 64],
+** Processing line: ~    [958, 898, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [8202, 2639, 64, 64],
-** Processing line: ~    [8179, 2727, 64, 64],~
+    [958, 898, 64, 64],
+** Processing line: ~    [911, 928, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [8179, 2727, 64, 64],
-** Processing line: ~    [8178, 2665, 64, 64],~
+    [911, 928, 64, 64],
+** Processing line: ~    [911, 896, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [8178, 2665, 64, 64],
-** Processing line: ~    [8177, 2636, 64, 64],~
+    [911, 896, 64, 64],
+** Processing line: ~    [2132, 803, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [8177, 2636, 64, 64],
-** Processing line: ~    [9360, 3138, 64, 64],~
+    [2132, 803, 64, 64],
+** Processing line: ~    [2081, 803, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [9360, 3138, 64, 64],
-** Processing line: ~    [9296, 3137, 64, 64],~
+    [2081, 803, 64, 64],
+** Processing line: ~    [2131, 752, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [9296, 3137, 64, 64],
-** Processing line: ~    [9235, 3139, 64, 64],~
+    [2131, 752, 64, 64],
+** Processing line: ~    [2077, 751, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [9235, 3139, 64, 64],
-** Processing line: ~    [9174, 3139, 64, 64],~
+    [2077, 751, 64, 64],
+** Processing line: ~    [2615, 649, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [9174, 3139, 64, 64],
-** Processing line: ~    [9113, 3138, 64, 64],~
+    [2615, 649, 64, 64],
+** Processing line: ~    [2564, 651, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [9113, 3138, 64, 64],
-** Processing line: ~    [9050, 3138, 64, 64],~
+    [2564, 651, 64, 64],
+** Processing line: ~    [2533, 650, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [9050, 3138, 64, 64],
-** Processing line: ~    [8988, 3138, 64, 64],~
+    [2533, 650, 64, 64],
+** Processing line: ~    [2027, 156, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [8988, 3138, 64, 64],
-** Processing line: ~    [8925, 3138, 64, 64],~
+    [2027, 156, 64, 64],
+** Processing line: ~    [1968, 155, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [8925, 3138, 64, 64],
-** Processing line: ~    [8860, 3136, 64, 64],~
+    [1968, 155, 64, 64],
+** Processing line: ~    [1907, 153, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [8860, 3136, 64, 64],
-** Processing line: ~    [8797, 3136, 64, 64],~
+    [1907, 153, 64, 64],
+** Processing line: ~    [1873, 155, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [8797, 3136, 64, 64],
-** Processing line: ~    [8770, 3138, 64, 64],~
+    [1873, 155, 64, 64],
+** Processing line: ~    [2025, 95, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [8770, 3138, 64, 64],
-** Processing line: ~    [8827, 4171, 64, 64],~
+    [2025, 95, 64, 64],
+** Processing line: ~    [1953, 98, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [8827, 4171, 64, 64],
-** Processing line: ~    [8827, 4107, 64, 64],~
+    [1953, 98, 64, 64],
+** Processing line: ~    [1894, 100, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [8827, 4107, 64, 64],
-** Processing line: ~    [8827, 4043, 64, 64],~
+    [1894, 100, 64, 64],
+** Processing line: ~    [1870, 100, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [8827, 4043, 64, 64],
-** Processing line: ~    [8827, 3978, 64, 64],~
+    [1870, 100, 64, 64],
+** Processing line: ~    [2029, 45, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [8827, 3978, 64, 64],
-** Processing line: ~    [8825, 3914, 64, 64],~
+    [2029, 45, 64, 64],
+** Processing line: ~    [1971, 48, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [8825, 3914, 64, 64],
-** Processing line: ~    [8824, 3858, 64, 64],~
+    [1971, 48, 64, 64],
+** Processing line: ~    [1915, 47, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [8824, 3858, 64, 64],
-** Processing line: ~    [9635, 4234, 64, 64],~
+    [1915, 47, 64, 64],
+** Processing line: ~    [1873, 47, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [9635, 4234, 64, 64],
-** Processing line: ~    [9584, 4235, 64, 64],~
+    [1873, 47, 64, 64],
+** Processing line: ~    [3956, 288, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [9584, 4235, 64, 64],
-** Processing line: ~    [9634, 4187, 64, 64],~
+    [3956, 288, 64, 64],
+** Processing line: ~    [3954, 234, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [9634, 4187, 64, 64],
-** Processing line: ~    [9582, 4183, 64, 64],~
+    [3954, 234, 64, 64],
+** Processing line: ~    [4042, 190, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [9582, 4183, 64, 64],
-** Processing line: ~    [9402, 5114, 64, 64],~
+    [4042, 190, 64, 64],
+** Processing line: ~    [3990, 190, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [9402, 5114, 64, 64],
-** Processing line: ~    [9402, 5087, 64, 64],~
+    [3990, 190, 64, 64],
+** Processing line: ~    [3958, 195, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [9402, 5087, 64, 64],
-** Processing line: ~    [9347, 5113, 64, 64],~
+    [3958, 195, 64, 64],
+** Processing line: ~    [3422, 709, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [9347, 5113, 64, 64],
-** Processing line: ~    [9345, 5086, 64, 64],~
+    [3422, 709, 64, 64],
+** Processing line: ~    [3425, 686, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [9345, 5086, 64, 64],
-** Processing line: ~    [9287, 5114, 64, 64],~
+    [3425, 686, 64, 64],
+** Processing line: ~    [3368, 709, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [9287, 5114, 64, 64],
-** Processing line: ~    [9285, 5085, 64, 64],~
+    [3368, 709, 64, 64],
+** Processing line: ~    [3364, 683, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [9285, 5085, 64, 64],
-** Processing line: ~    [9245, 5114, 64, 64],~
+    [3364, 683, 64, 64],
+** Processing line: ~    [3312, 711, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [9245, 5114, 64, 64],
-** Processing line: ~    [9244, 5086, 64, 64],~
+    [3312, 711, 64, 64],
+** Processing line: ~    [3307, 684, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [9244, 5086, 64, 64],
-** Processing line: ~    [9336, 5445, 64, 64],~
+    [3307, 684, 64, 64],
+** Processing line: ~    [3266, 712, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [9336, 5445, 64, 64],
-** Processing line: ~    [9285, 5445, 64, 64],~
+    [3266, 712, 64, 64],
+** Processing line: ~    [3269, 681, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [9285, 5445, 64, 64],
-** Processing line: ~    [9337, 5395, 64, 64],~
+    [3269, 681, 64, 64],
+** Processing line: ~    [4384, 236, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [9337, 5395, 64, 64],
-** Processing line: ~    [9283, 5393, 64, 64],~
+    [4384, 236, 64, 64],
+** Processing line: ~    [4320, 234, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [9283, 5393, 64, 64],
-** Processing line: ~    [8884, 4968, 64, 64],~
+    [4320, 234, 64, 64],
+** Processing line: ~    [4257, 235, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [8884, 4968, 64, 64],
-** Processing line: ~    [8884, 4939, 64, 64],~
+    [4257, 235, 64, 64],
+** Processing line: ~    [4192, 234, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [8884, 4939, 64, 64],
-** Processing line: ~    [8822, 4967, 64, 64],~
+    [4192, 234, 64, 64],
+** Processing line: ~    [4162, 234, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [8822, 4967, 64, 64],
-** Processing line: ~    [8823, 4940, 64, 64],~
+    [4162, 234, 64, 64],
+** Processing line: ~    [4269, 171, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [8823, 4940, 64, 64],
-** Processing line: ~    [8765, 4967, 64, 64],~
+    [4269, 171, 64, 64],
+** Processing line: ~    [4267, 111, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [8765, 4967, 64, 64],
-** Processing line: ~    [8762, 4937, 64, 64],~
+    [4267, 111, 64, 64],
+** Processing line: ~    [4266, 52, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [8762, 4937, 64, 64],
-** Processing line: ~    [8726, 4969, 64, 64],~
+    [4266, 52, 64, 64],
+** Processing line: ~    [4580, 458, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [8726, 4969, 64, 64],
-** Processing line: ~    [8727, 4939, 64, 64],~
+    [4580, 458, 64, 64],
+** Processing line: ~    [4582, 396, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [8727, 4939, 64, 64],
-** Processing line: ~    [7946, 5248, 64, 64],~
+    [4582, 396, 64, 64],
+** Processing line: ~    [4582, 335, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [7946, 5248, 64, 64],
-** Processing line: ~    [7945, 5220, 64, 64],~
+    [4582, 335, 64, 64],
+** Processing line: ~    [4581, 275, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [7945, 5220, 64, 64],
-** Processing line: ~    [7887, 5248, 64, 64],~
+    [4581, 275, 64, 64],
+** Processing line: ~    [4581, 215, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [7887, 5248, 64, 64],
-** Processing line: ~    [7886, 5219, 64, 64],~
+    [4581, 215, 64, 64],
+** Processing line: ~    [4581, 152, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [7886, 5219, 64, 64],
-** Processing line: ~    [7830, 5248, 64, 64],~
+    [4581, 152, 64, 64],
+** Processing line: ~    [4582, 89, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [7830, 5248, 64, 64],
-** Processing line: ~    [7827, 5218, 64, 64],~
+    [4582, 89, 64, 64],
+** Processing line: ~    [4583, 51, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [7827, 5218, 64, 64],
-** Processing line: ~    [7781, 5248, 64, 64],~
+    [4583, 51, 64, 64],
+** Processing line: ~    [4810, 289, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [7781, 5248, 64, 64],
-** Processing line: ~    [7781, 5216, 64, 64],~
+    [4810, 289, 64, 64],
+** Processing line: ~    [4810, 227, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [7781, 5216, 64, 64],
-** Processing line: ~    [6648, 4762, 64, 64],~
+    [4810, 227, 64, 64],
+** Processing line: ~    [4895, 189, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [6648, 4762, 64, 64],
-** Processing line: ~    [6621, 4761, 64, 64],~
+    [4895, 189, 64, 64],
+** Processing line: ~    [4844, 191, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [6621, 4761, 64, 64],
-** Processing line: ~    [5011, 4446, 64, 64],~
+    [4844, 191, 64, 64],
+** Processing line: ~    [4809, 191, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [5011, 4446, 64, 64],
-** Processing line: ~    [4982, 4444, 64, 64],~
+    [4809, 191, 64, 64],
+** Processing line: ~    [5235, 233, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [4982, 4444, 64, 64],
-** Processing line: ~    [4146, 4641, 64, 64],~
+    [5235, 233, 64, 64],
+** Processing line: ~    [5176, 232, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [4146, 4641, 64, 64],
-** Processing line: ~    [4092, 4643, 64, 64],~
+    [5176, 232, 64, 64],
+** Processing line: ~    [5118, 230, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [4092, 4643, 64, 64],
-** Processing line: ~    [4145, 4589, 64, 64],~
+    [5118, 230, 64, 64],
+** Processing line: ~    [5060, 232, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [4145, 4589, 64, 64],
-** Processing line: ~    [4091, 4590, 64, 64],~
+    [5060, 232, 64, 64],
+** Processing line: ~    [5015, 237, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [4091, 4590, 64, 64],
-** Processing line: ~    [4139, 4497, 64, 64],~
+    [5015, 237, 64, 64],
+** Processing line: ~    [5123, 171, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [4139, 4497, 64, 64],
-** Processing line: ~    [4135, 4437, 64, 64],~
+    [5123, 171, 64, 64],
+** Processing line: ~    [5123, 114, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [4135, 4437, 64, 64],
-** Processing line: ~    [4135, 4383, 64, 64],~
+    [5123, 114, 64, 64],
+** Processing line: ~    [5121, 51, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [4135, 4383, 64, 64],
-** Processing line: ~    [4078, 4495, 64, 64],~
+    [5121, 51, 64, 64],
+** Processing line: ~    [5523, 461, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [4078, 4495, 64, 64],
-** Processing line: ~    [4014, 4494, 64, 64],~
+    [5523, 461, 64, 64],
+** Processing line: ~    [5123, 42, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [4014, 4494, 64, 64],
-** Processing line: ~    [3979, 4496, 64, 64],~
+    [5123, 42, 64, 64],
+** Processing line: ~    [5525, 401, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [3979, 4496, 64, 64],
-** Processing line: ~    [4074, 4384, 64, 64],~
+    [5525, 401, 64, 64],
+** Processing line: ~    [5525, 340, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [4074, 4384, 64, 64],
-** Processing line: ~    [4015, 4381, 64, 64],~
+    [5525, 340, 64, 64],
+** Processing line: ~    [5526, 273, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [4015, 4381, 64, 64],
-** Processing line: ~    [3980, 4433, 64, 64],~
+    [5526, 273, 64, 64],
+** Processing line: ~    [5527, 211, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [3980, 4433, 64, 64],
-** Processing line: ~    [3981, 4384, 64, 64],~
+    [5527, 211, 64, 64],
+** Processing line: ~    [5525, 150, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [3981, 4384, 64, 64],
-** Processing line: ~    [3276, 4279, 64, 64],~
+    [5525, 150, 64, 64],
+** Processing line: ~    [5527, 84, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [3276, 4279, 64, 64],
-** Processing line: ~    [3275, 4218, 64, 64],~
+    [5527, 84, 64, 64],
+** Processing line: ~    [5524, 44, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [3275, 4218, 64, 64],
-** Processing line: ~    [3276, 4170, 64, 64],~
+    [5524, 44, 64, 64],
+** Processing line: ~    [5861, 288, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [3276, 4170, 64, 64],
-** Processing line: ~    [3211, 4164, 64, 64],~
+    [5861, 288, 64, 64],
+** Processing line: ~    [5861, 229, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [3211, 4164, 64, 64],
-** Processing line: ~    [3213, 4280, 64, 64],~
+    [5861, 229, 64, 64],
+** Processing line: ~    [5945, 193, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [3213, 4280, 64, 64],
-** Processing line: ~    [3156, 4278, 64, 64],~
+    [5945, 193, 64, 64],
+** Processing line: ~    [5904, 193, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [3156, 4278, 64, 64],
-** Processing line: ~    [3120, 4278, 64, 64],~
+    [5904, 193, 64, 64],
+** Processing line: ~    [5856, 194, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [3120, 4278, 64, 64],
-** Processing line: ~    [3151, 4163, 64, 64],~
+    [5856, 194, 64, 64],
+** Processing line: ~    [6542, 234, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [3151, 4163, 64, 64],
-** Processing line: ~    [3120, 4216, 64, 64],~
+    [6542, 234, 64, 64],
+** Processing line: ~    [6478, 235, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [3120, 4216, 64, 64],
-** Processing line: ~    [3120, 4161, 64, 64],~
+    [6478, 235, 64, 64],
+** Processing line: ~    [6413, 238, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [3120, 4161, 64, 64],
-** Processing line: ~    [1536, 4171, 64, 64],~
+    [6413, 238, 64, 64],
+** Processing line: ~    [6348, 235, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [1536, 4171, 64, 64],
-** Processing line: ~    [1536, 4110, 64, 64],~
+    [6348, 235, 64, 64],
+** Processing line: ~    [6285, 236, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [1536, 4110, 64, 64],
-** Processing line: ~    [1535, 4051, 64, 64],~
+    [6285, 236, 64, 64],
+** Processing line: ~    [6222, 235, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [1535, 4051, 64, 64],
-** Processing line: ~    [1536, 3991, 64, 64],~
+    [6222, 235, 64, 64],
+** Processing line: ~    [6160, 235, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [1536, 3991, 64, 64],
-** Processing line: ~    [1536, 3928, 64, 64],~
+    [6160, 235, 64, 64],
+** Processing line: ~    [6097, 236, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [1536, 3928, 64, 64],
-** Processing line: ~    [1536, 3863, 64, 64],~
+    [6097, 236, 64, 64],
+** Processing line: ~    [6069, 237, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [1536, 3863, 64, 64],
-** Processing line: ~    [1078, 4605, 64, 64],~
+    [6069, 237, 64, 64],
+** Processing line: ~    [6321, 174, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [1078, 4605, 64, 64],
-** Processing line: ~    [1076, 4577, 64, 64],~
+    [6321, 174, 64, 64],
+** Processing line: ~    [6318, 111, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [1076, 4577, 64, 64],
-** Processing line: ~    [1018, 4604, 64, 64],~
+    [6318, 111, 64, 64],
+** Processing line: ~    [6320, 49, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [1018, 4604, 64, 64],
-** Processing line: ~    [1018, 4575, 64, 64],~
+    [6320, 49, 64, 64],
+** Processing line: ~    [6753, 291, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [1018, 4575, 64, 64],
-** Processing line: ~    [957, 4606, 64, 64],~
+    [6753, 291, 64, 64],
+** Processing line: ~    [6752, 227, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [957, 4606, 64, 64],
-** Processing line: ~    [960, 4575, 64, 64],~
+    [6752, 227, 64, 64],
+** Processing line: ~    [6753, 192, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [960, 4575, 64, 64],
-** Processing line: ~    [918, 4602, 64, 64],~
+    [6753, 192, 64, 64],
+** Processing line: ~    [6692, 191, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [918, 4602, 64, 64],
-** Processing line: ~    [918, 4580, 64, 64],~
+    [6692, 191, 64, 64],
+** Processing line: ~    [6668, 193, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [918, 4580, 64, 64],
-** Processing line: ~    [394, 4164, 64, 64],~
+    [6668, 193, 64, 64],
+** Processing line: ~    [6336, 604, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [394, 4164, 64, 64],
-** Processing line: ~    [335, 4163, 64, 64],~
+    [6336, 604, 64, 64],
+** Processing line: ~    [6309, 603, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [335, 4163, 64, 64],
-** Processing line: ~    [274, 4161, 64, 64],~
+    [6309, 603, 64, 64],
+** Processing line: ~    [7264, 461, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [274, 4161, 64, 64],
-** Processing line: ~    [236, 4163, 64, 64],~
+    [7264, 461, 64, 64],
+** Processing line: ~    [7264, 395, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [236, 4163, 64, 64],
-** Processing line: ~    [394, 4140, 64, 64],~
+    [7264, 395, 64, 64],
+** Processing line: ~    [7264, 333, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [394, 4140, 64, 64],
-** Processing line: ~    [329, 4139, 64, 64],~
+    [7264, 333, 64, 64],
+** Processing line: ~    [7264, 270, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [329, 4139, 64, 64],
-** Processing line: ~    [268, 4139, 64, 64],~
+    [7264, 270, 64, 64],
+** Processing line: ~    [7265, 207, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [268, 4139, 64, 64],
-** Processing line: ~    [239, 4139, 64, 64],~
+    [7265, 207, 64, 64],
+** Processing line: ~    [7266, 138, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [239, 4139, 64, 64],
-** Processing line: ~    [4326, 5073, 64, 64],~
+    [7266, 138, 64, 64],
+** Processing line: ~    [7264, 78, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [4326, 5073, 64, 64],
-** Processing line: ~    [4324, 5042, 64, 64],~
+    [7264, 78, 64, 64],
+** Processing line: ~    [7266, 48, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [4324, 5042, 64, 64],
-** Processing line: ~    [4265, 5074, 64, 64],~
+    [7266, 48, 64, 64],
+** Processing line: ~    [7582, 149, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [4265, 5074, 64, 64],
-** Processing line: ~    [4263, 5042, 64, 64],~
+    [7582, 149, 64, 64],
+** Processing line: ~    [7524, 147, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [4263, 5042, 64, 64],
-** Processing line: ~    [4214, 5072, 64, 64],~
+    [7524, 147, 64, 64],
+** Processing line: ~    [7461, 146, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [4214, 5072, 64, 64],
-** Processing line: ~    [4211, 5043, 64, 64],~
+    [7461, 146, 64, 64],
+** Processing line: ~    [7425, 148, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [4211, 5043, 64, 64],
-** Processing line: ~    [4166, 5073, 64, 64],~
+    [7425, 148, 64, 64],
+** Processing line: ~    [7580, 86, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [4166, 5073, 64, 64],
-** Processing line: ~    [4164, 5041, 64, 64],~
+    [7580, 86, 64, 64],
+** Processing line: ~    [7582, 41, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [4164, 5041, 64, 64],
-** Processing line: ~    [4844, 5216, 64, 64],~
+    [7582, 41, 64, 64],
+** Processing line: ~    [7519, 41, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [4844, 5216, 64, 64],
-** Processing line: ~    [4844, 5189, 64, 64],~
+    [7519, 41, 64, 64],
+** Processing line: ~    [7460, 40, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [4844, 5189, 64, 64],
-** Processing line: ~    [4785, 5217, 64, 64],~
+    [7460, 40, 64, 64],
+** Processing line: ~    [7427, 96, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [4785, 5217, 64, 64],
-** Processing line: ~    [4790, 5187, 64, 64],~
+    [7427, 96, 64, 64],
+** Processing line: ~    [7427, 41, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [4790, 5187, 64, 64],
-** Processing line: ~    [4726, 5219, 64, 64],~
+    [7427, 41, 64, 64],
+** Processing line: ~    [8060, 288, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [4726, 5219, 64, 64],
-** Processing line: ~    [4728, 5185, 64, 64],~
+    [8060, 288, 64, 64],
+** Processing line: ~    [8059, 226, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [4728, 5185, 64, 64],
-** Processing line: ~    [4681, 5218, 64, 64],~
+    [8059, 226, 64, 64],
+** Processing line: ~    [8145, 194, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [4681, 5218, 64, 64],
-** Processing line: ~    [4684, 5186, 64, 64],~
+    [8145, 194, 64, 64],
+** Processing line: ~    [8081, 194, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [4684, 5186, 64, 64],
-** Processing line: ~    [4789, 4926, 64, 64],~
+    [8081, 194, 64, 64],
+** Processing line: ~    [8058, 195, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [4789, 4926, 64, 64],
-** Processing line: ~    [4734, 4928, 64, 64],~
+    [8058, 195, 64, 64],
+** Processing line: ~    [8485, 234, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [4734, 4928, 64, 64],
-** Processing line: ~    [4787, 4876, 64, 64],~
+    [8485, 234, 64, 64],
+** Processing line: ~    [8422, 235, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [4787, 4876, 64, 64],
-** Processing line: ~    [4738, 4874, 64, 64],~
+    [8422, 235, 64, 64],
+** Processing line: ~    [8360, 235, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [4738, 4874, 64, 64],
-** Processing line: ~    [4775, 5548, 64, 64],~
+    [8360, 235, 64, 64],
+** Processing line: ~    [8296, 235, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [4775, 5548, 64, 64],
-** Processing line: ~    [4775, 5495, 64, 64],~
+    [8296, 235, 64, 64],
+** Processing line: ~    [8266, 237, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [4775, 5495, 64, 64],
-** Processing line: ~    [4723, 5550, 64, 64],~
+    [8266, 237, 64, 64],
+** Processing line: ~    [8371, 173, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [4723, 5550, 64, 64],
-** Processing line: ~    [4725, 5494, 64, 64],~
+    [8371, 173, 64, 64],
+** Processing line: ~    [8370, 117, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [4725, 5494, 64, 64],
-** Processing line: ~    [1360, 5269, 64, 64],~
+    [8370, 117, 64, 64],
+** Processing line: ~    [8372, 59, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [1360, 5269, 64, 64],
-** Processing line: ~    [1362, 5218, 64, 64],~
+    [8372, 59, 64, 64],
+** Processing line: ~    [8372, 51, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [1362, 5218, 64, 64],
-** Processing line: ~    [1315, 5266, 64, 64],~
+    [8372, 51, 64, 64],
+** Processing line: ~    [9147, 192, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [1315, 5266, 64, 64],
-** Processing line: ~    [1282, 5266, 64, 64],~
+    [9147, 192, 64, 64],
+** Processing line: ~    [9063, 287, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [1282, 5266, 64, 64],
-** Processing line: ~    [1246, 5311, 64, 64],~
+    [9063, 287, 64, 64],
+** Processing line: ~    [9064, 225, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [1246, 5311, 64, 64],
-** Processing line: ~    [1190, 5312, 64, 64],~
+    [9064, 225, 64, 64],
+** Processing line: ~    [9085, 193, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [1190, 5312, 64, 64],
-** Processing line: ~    [1136, 5310, 64, 64],~
+    [9085, 193, 64, 64],
+** Processing line: ~    [9063, 194, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [1136, 5310, 64, 64],
-** Processing line: ~    [1121, 5427, 64, 64],~
+    [9063, 194, 64, 64],
+** Processing line: ~    [9492, 234, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [1121, 5427, 64, 64],
-** Processing line: ~    [1121, 5370, 64, 64],~
+    [9492, 234, 64, 64],
+** Processing line: ~    [9428, 234, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [1121, 5370, 64, 64],
-** Processing line: ~    [1074, 5427, 64, 64],~
+    [9428, 234, 64, 64],
+** Processing line: ~    [9365, 235, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [1074, 5427, 64, 64],
-** Processing line: ~    [1064, 5423, 64, 64],~
+    [9365, 235, 64, 64],
+** Processing line: ~    [9302, 235, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [1064, 5423, 64, 64],
-** Processing line: ~    [1052, 5417, 64, 64],~
+    [9302, 235, 64, 64],
+** Processing line: ~    [9270, 237, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [1052, 5417, 64, 64],
-** Processing line: ~    [1050, 5368, 64, 64],~
+    [9270, 237, 64, 64],
+** Processing line: ~    [9374, 172, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [1050, 5368, 64, 64],
-** Processing line: ~    [1008, 5314, 64, 64],~
+    [9374, 172, 64, 64],
+** Processing line: ~    [9376, 109, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [1008, 5314, 64, 64],
-** Processing line: ~    [997, 5307, 64, 64],~
+    [9376, 109, 64, 64],
+** Processing line: ~    [9377, 48, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [997, 5307, 64, 64],
-** Processing line: ~    [977, 5299, 64, 64],~
+    [9377, 48, 64, 64],
+** Processing line: ~    [9545, 1060, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [977, 5299, 64, 64],
-** Processing line: ~    [976, 5248, 64, 64],~
+    [9545, 1060, 64, 64],
+** Processing line: ~    [9482, 1062, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [976, 5248, 64, 64],
-** Processing line: ~    [825, 5267, 64, 64],~
+    [9482, 1062, 64, 64],
+** Processing line: ~    [9423, 1062, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [825, 5267, 64, 64],
-** Processing line: ~    [826, 5213, 64, 64],~
+    [9423, 1062, 64, 64],
+** Processing line: ~    [9387, 1062, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [826, 5213, 64, 64],
-** Processing line: ~    [776, 5267, 64, 64],~
+    [9387, 1062, 64, 64],
+** Processing line: ~    [9541, 999, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [776, 5267, 64, 64],
-** Processing line: ~    [768, 5261, 64, 64],~
+    [9541, 999, 64, 64],
+** Processing line: ~    [9542, 953, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [768, 5261, 64, 64],
-** Processing line: ~    [755, 5256, 64, 64],~
+    [9542, 953, 64, 64],
+** Processing line: ~    [9478, 953, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [755, 5256, 64, 64],
-** Processing line: ~    [753, 5209, 64, 64],~
+    [9478, 953, 64, 64],
+** Processing line: ~    [9388, 999, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [753, 5209, 64, 64],
-** Processing line: ~    [1299, 5206, 64, 64],~
+    [9388, 999, 64, 64],
+** Processing line: ~    [9414, 953, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [1299, 5206, 64, 64],
-** Processing line: ~    [1238, 5204, 64, 64],~
+    [9414, 953, 64, 64],
+** Processing line: ~    [9389, 953, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [1238, 5204, 64, 64],
-** Processing line: ~    [1178, 5203, 64, 64],~
+    [9389, 953, 64, 64],
+** Processing line: ~    [9294, 1194, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [1178, 5203, 64, 64],
-** Processing line: ~    [1124, 5204, 64, 64],~
+    [9294, 1194, 64, 64],
+** Processing line: ~    [9245, 1195, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [1124, 5204, 64, 64],
-** Processing line: ~    [1065, 5206, 64, 64],~
+    [9245, 1195, 64, 64],
+** Processing line: ~    [9297, 1143, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [1065, 5206, 64, 64],
-** Processing line: ~    [1008, 5203, 64, 64],~
+    [9297, 1143, 64, 64],
+** Processing line: ~    [9245, 1144, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [1008, 5203, 64, 64],
-** Processing line: ~    [977, 5214, 64, 64],~
+    [9245, 1144, 64, 64],
+** Processing line: ~    [5575, 1781, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [977, 5214, 64, 64],
-** Processing line: ~    [410, 5313, 64, 64],~
+    [5575, 1781, 64, 64],
+** Processing line: ~    [5574, 1753, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [410, 5313, 64, 64],
-** Processing line: ~    [407, 5249, 64, 64],~
+    [5574, 1753, 64, 64],
+** Processing line: ~    [5522, 1782, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [407, 5249, 64, 64],
-** Processing line: ~    [411, 5225, 64, 64],~
+    [5522, 1782, 64, 64],
+** Processing line: ~    [5518, 1753, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [411, 5225, 64, 64],
-** Processing line: ~    [397, 5217, 64, 64],~
+    [5518, 1753, 64, 64],
+** Processing line: ~    [5472, 1783, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [397, 5217, 64, 64],
-** Processing line: ~    [378, 5209, 64, 64],~
+    [5472, 1783, 64, 64],
+** Processing line: ~    [5471, 1751, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [378, 5209, 64, 64],
-** Processing line: ~    [358, 5312, 64, 64],~
+    [5471, 1751, 64, 64],
+** Processing line: ~    [5419, 1781, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [358, 5312, 64, 64],
-** Processing line: ~    [287, 5427, 64, 64],~
+    [5419, 1781, 64, 64],
+** Processing line: ~    [5421, 1749, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [287, 5427, 64, 64],
-** Processing line: ~    [286, 5364, 64, 64],~
+    [5421, 1749, 64, 64],
+** Processing line: ~    [500, 3207, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [286, 5364, 64, 64],
-** Processing line: ~    [300, 5313, 64, 64],~
+    [500, 3207, 64, 64],
+** Processing line: ~    [477, 3205, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [300, 5313, 64, 64],
-** Processing line: ~    [242, 5427, 64, 64],~
+    [477, 3205, 64, 64],
+** Processing line: ~    [1282, 3214, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [242, 5427, 64, 64],
-** Processing line: ~    [229, 5420, 64, 64],~
+    [1282, 3214, 64, 64],
+** Processing line: ~    [1221, 3214, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [229, 5420, 64, 64],
-** Processing line: ~    [217, 5416, 64, 64],~
+    [1221, 3214, 64, 64],
+** Processing line: ~    [1188, 3215, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [217, 5416, 64, 64],
-** Processing line: ~    [215, 5364, 64, 64],~
+    [1188, 3215, 64, 64],
+** Processing line: ~    [1345, 3103, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [215, 5364, 64, 64],
-** Processing line: ~    [174, 5311, 64, 64],~
+    [1345, 3103, 64, 64],
+** Processing line: ~    [1288, 3103, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [174, 5311, 64, 64],
-** Processing line: ~    [165, 5308, 64, 64],~
+    [1288, 3103, 64, 64],
+** Processing line: ~    [1231, 3104, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [165, 5308, 64, 64],
-** Processing line: ~    [139, 5300, 64, 64],~
+    [1231, 3104, 64, 64],
+** Processing line: ~    [1190, 3153, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [139, 5300, 64, 64],
-** Processing line: ~    [141, 5236, 64, 64],~
+    [1190, 3153, 64, 64],
+** Processing line: ~    [1189, 3105, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [141, 5236, 64, 64],
-** Processing line: ~    [141, 5211, 64, 64],~
+    [1189, 3105, 64, 64],
+** Processing line: ~    [2255, 3508, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [141, 5211, 64, 64],
-** Processing line: ~    [315, 5208, 64, 64],~
+    [2255, 3508, 64, 64],
+** Processing line: ~    [2206, 3510, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [315, 5208, 64, 64],
-** Processing line: ~    [251, 5208, 64, 64],~
+    [2206, 3510, 64, 64],
+** Processing line: ~    [2254, 3458, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [251, 5208, 64, 64],
-** Processing line: ~    [211, 5211, 64, 64],~
+    [2254, 3458, 64, 64],
+** Processing line: ~    [2202, 3458, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [211, 5211, 64, 64],
-** Processing line: ~    [8050, 4060, 64, 64],~
+    [2202, 3458, 64, 64],
+** Processing line: ~    [2754, 2930, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [8050, 4060, 64, 64],
-** Processing line: ~    [7992, 4060, 64, 64],~
+    [2754, 2930, 64, 64],
+** Processing line: ~    [2726, 2932, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [7992, 4060, 64, 64],
-** Processing line: ~    [7929, 4060, 64, 64],~
+    [2726, 2932, 64, 64],
+** Processing line: ~    [3408, 2874, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [7929, 4060, 64, 64],
-** Processing line: ~    [7866, 4061, 64, 64],~
+    [3408, 2874, 64, 64],
+** Processing line: ~    [3407, 2849, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [7866, 4061, 64, 64],
-** Processing line: ~    [7828, 4063, 64, 64],~
+    [3407, 2849, 64, 64],
+** Processing line: ~    [3345, 2872, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [7828, 4063, 64, 64],
-** Processing line: ~    [7934, 4001, 64, 64],~
+    [3345, 2872, 64, 64],
+** Processing line: ~    [3342, 2847, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [7934, 4001, 64, 64],
-** Processing line: ~    [7935, 3936, 64, 64],~
+    [3342, 2847, 64, 64],
+** Processing line: ~    [3284, 2874, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [7935, 3936, 64, 64],
-** Processing line: ~    [7935, 3875, 64, 64],~
+    [3284, 2874, 64, 64],
+** Processing line: ~    [3284, 2848, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [7935, 3875, 64, 64],
-** Processing line: ~    [7622, 4111, 64, 64],~
+    [3284, 2848, 64, 64],
+** Processing line: ~    [3248, 2878, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [7622, 4111, 64, 64],
-** Processing line: ~    [7623, 4049, 64, 64],~
+    [3248, 2878, 64, 64],
+** Processing line: ~    [3252, 2848, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [7623, 4049, 64, 64],
-** Processing line: ~    [7707, 4018, 64, 64],~
+    [3252, 2848, 64, 64],
+** Processing line: ~    [3953, 3274, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [7707, 4018, 64, 64],
-** Processing line: ~    [7663, 4019, 64, 64],~
+    [3953, 3274, 64, 64],
+** Processing line: ~    [3899, 3277, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [7663, 4019, 64, 64],
-** Processing line: ~    [7623, 4017, 64, 64],~
+    [3899, 3277, 64, 64],
+** Processing line: ~    [3951, 3222, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [7623, 4017, 64, 64],
-** Processing line: ~    [7193, 4060, 64, 64],~
+    [3951, 3222, 64, 64],
+** Processing line: ~    [3900, 3222, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [7193, 4060, 64, 64],
-** Processing line: ~    [7131, 4059, 64, 64],~
+    [3900, 3222, 64, 64],
+** Processing line: ~    [4310, 2968, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [7131, 4059, 64, 64],
-** Processing line: ~    [7070, 4057, 64, 64],~
+    [4310, 2968, 64, 64],
+** Processing line: ~    [4246, 2969, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [7070, 4057, 64, 64],
-** Processing line: ~    [7008, 4060, 64, 64],~
+    [4246, 2969, 64, 64],
+** Processing line: ~    [4183, 2965, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [7008, 4060, 64, 64],
-** Processing line: ~    [6977, 4060, 64, 64],~
+    [4183, 2965, 64, 64],
+** Processing line: ~    [4153, 2967, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [6977, 4060, 64, 64],
-** Processing line: ~    [7080, 3998, 64, 64],~
+    [4153, 2967, 64, 64],
+** Processing line: ~    [4311, 2910, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [7080, 3998, 64, 64],
-** Processing line: ~    [7081, 3935, 64, 64],~
+    [4311, 2910, 64, 64],
+** Processing line: ~    [4308, 2856, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [7081, 3935, 64, 64],
-** Processing line: ~    [7080, 3873, 64, 64],~
+    [4308, 2856, 64, 64],
+** Processing line: ~    [4251, 2855, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [7080, 3873, 64, 64],
-** Processing line: ~    [6855, 4019, 64, 64],~
+    [4251, 2855, 64, 64],
+** Processing line: ~    [4197, 2857, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [6855, 4019, 64, 64],
-** Processing line: ~    [6790, 4018, 64, 64],~
+    [4197, 2857, 64, 64],
+** Processing line: ~    [5466, 3184, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [6790, 4018, 64, 64],
-** Processing line: ~    [6770, 4114, 64, 64],~
+    [5466, 3184, 64, 64],
+** Processing line: ~    [5466, 3158, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [6770, 4114, 64, 64],
-** Processing line: ~    [6770, 4060, 64, 64],~
+    [5466, 3158, 64, 64],
+** Processing line: ~    [5404, 3184, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [6770, 4060, 64, 64],
-** Processing line: ~    [6768, 4013, 64, 64],~
+    [5404, 3184, 64, 64],
+** Processing line: ~    [5404, 3156, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [6768, 4013, 64, 64],
-** Processing line: ~    [6345, 4060, 64, 64],~
+    [5404, 3156, 64, 64],
+** Processing line: ~    [5343, 3185, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [6345, 4060, 64, 64],
-** Processing line: ~    [6284, 4062, 64, 64],~
+    [5343, 3185, 64, 64],
+** Processing line: ~    [5342, 3156, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [6284, 4062, 64, 64],
-** Processing line: ~    [6222, 4061, 64, 64],~
+    [5342, 3156, 64, 64],
+** Processing line: ~    [5308, 3185, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [6222, 4061, 64, 64],
-** Processing line: ~    [6166, 4061, 64, 64],~
+    [5308, 3185, 64, 64],
+** Processing line: ~    [5307, 3154, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [6166, 4061, 64, 64],
-** Processing line: ~    [6124, 4066, 64, 64],~
+    [5307, 3154, 64, 64],
+** Processing line: ~    [6163, 2950, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [6124, 4066, 64, 64],
-** Processing line: ~    [6226, 3995, 64, 64],~
+    [6163, 2950, 64, 64],
+** Processing line: ~    [6111, 2952, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [6226, 3995, 64, 64],
-** Processing line: ~    [6226, 3933, 64, 64],~
+    [6111, 2952, 64, 64],
+** Processing line: ~    [6164, 2898, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [6226, 3933, 64, 64],
-** Processing line: ~    [6228, 3868, 64, 64],~
+    [6164, 2898, 64, 64],
+** Processing line: ~    [6113, 2897, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [6228, 3868, 64, 64],
-** Processing line: ~    [5916, 4113, 64, 64],~
+    [6113, 2897, 64, 64],
+** Processing line: ~    [7725, 3156, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [5916, 4113, 64, 64],
-** Processing line: ~    [5918, 4052, 64, 64],~
+    [7725, 3156, 64, 64],
+** Processing line: ~    [7661, 3157, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [5918, 4052, 64, 64],
-** Processing line: ~    [6001, 4018, 64, 64],~
+    [7661, 3157, 64, 64],
+** Processing line: ~    [7598, 3157, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [6001, 4018, 64, 64],
-** Processing line: ~    [5941, 4019, 64, 64],~
+    [7598, 3157, 64, 64],
+** Processing line: ~    [7533, 3156, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [5941, 4019, 64, 64],
-** Processing line: ~    [5918, 4020, 64, 64],~
+    [7533, 3156, 64, 64],
+** Processing line: ~    [7468, 3156, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [5918, 4020, 64, 64],
-** Processing line: ~    [5501, 4059, 64, 64],~
+    [7468, 3156, 64, 64],
+** Processing line: ~    [7401, 3156, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [5501, 4059, 64, 64],
-** Processing line: ~    [5439, 4061, 64, 64],~
+    [7401, 3156, 64, 64],
+** Processing line: ~    [7335, 3157, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [5439, 4061, 64, 64],
-** Processing line: ~    [5376, 4059, 64, 64],~
+    [7335, 3157, 64, 64],
+** Processing line: ~    [7270, 3157, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [5376, 4059, 64, 64],
-** Processing line: ~    [5312, 4058, 64, 64],~
+    [7270, 3157, 64, 64],
+** Processing line: ~    [7208, 3157, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [5312, 4058, 64, 64],
-** Processing line: ~    [5285, 4062, 64, 64],~
+    [7208, 3157, 64, 64],
+** Processing line: ~    [7146, 3157, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [5285, 4062, 64, 64],
-** Processing line: ~    [5388, 3999, 64, 64],~
+    [7146, 3157, 64, 64],
+** Processing line: ~    [7134, 3159, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [5388, 3999, 64, 64],
-** Processing line: ~    [5385, 3941, 64, 64],~
+    [7134, 3159, 64, 64],
+** Processing line: ~    [6685, 3726, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [5385, 3941, 64, 64],
-** Processing line: ~    [5384, 3874, 64, 64],~
+    [6685, 3726, 64, 64],
+** Processing line: ~    [6685, 3663, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [5384, 3874, 64, 64],
-** Processing line: ~    [5075, 4112, 64, 64],~
+    [6685, 3663, 64, 64],
+** Processing line: ~    [6683, 3602, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [5075, 4112, 64, 64],
-** Processing line: ~    [5074, 4051, 64, 64],~
+    [6683, 3602, 64, 64],
+** Processing line: ~    [6679, 3538, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [5074, 4051, 64, 64],
-** Processing line: ~    [5158, 4018, 64, 64],~
+    [6679, 3538, 64, 64],
+** Processing line: ~    [6680, 3474, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [5158, 4018, 64, 64],
-** Processing line: ~    [5095, 4020, 64, 64],~
+    [6680, 3474, 64, 64],
+** Processing line: ~    [6682, 3413, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [5095, 4020, 64, 64],
-** Processing line: ~    [5073, 4018, 64, 64],~
+    [6682, 3413, 64, 64],
+** Processing line: ~    [6681, 3347, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [5073, 4018, 64, 64],
-** Processing line: ~    [4549, 3998, 64, 64],~
+    [6681, 3347, 64, 64],
+** Processing line: ~    [6681, 3287, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [4549, 3998, 64, 64],
-** Processing line: ~    [4393, 3996, 64, 64],~
+    [6681, 3287, 64, 64],
+** Processing line: ~    [6682, 3223, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [4393, 3996, 64, 64],
-** Processing line: ~    [4547, 3938, 64, 64],~
+    [6682, 3223, 64, 64],
+** Processing line: ~    [6683, 3161, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [4547, 3938, 64, 64],
-** Processing line: ~    [4547, 3886, 64, 64],~
+    [6683, 3161, 64, 64],
+** Processing line: ~    [6682, 3102, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [4547, 3886, 64, 64],
-** Processing line: ~    [4488, 3885, 64, 64],~
+    [6682, 3102, 64, 64],
+** Processing line: ~    [6684, 3042, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [4488, 3885, 64, 64],
-** Processing line: ~    [4427, 3885, 64, 64],~
+    [6684, 3042, 64, 64],
+** Processing line: ~    [6685, 2980, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [4427, 3885, 64, 64],
-** Processing line: ~    [4395, 3938, 64, 64],~
+    [6685, 2980, 64, 64],
+** Processing line: ~    [6685, 2920, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [4395, 3938, 64, 64],
-** Processing line: ~    [4395, 3885, 64, 64],~
+    [6685, 2920, 64, 64],
+** Processing line: ~    [6683, 2859, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [4395, 3885, 64, 64],
-** Processing line: ~    [0, 0, 64, 64],~
+    [6683, 2859, 64, 64],
+** Processing line: ~    [6684, 2801, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [0, 0, 64, 64],
-** Processing line: ~    [0, 1670, 64, 64],~
+    [6684, 2801, 64, 64],
+** Processing line: ~    [6686, 2743, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [0, 1670, 64, 64],
-** Processing line: ~    [6691, 1653, 64, 64],~
+    [6686, 2743, 64, 64],
+** Processing line: ~    [6683, 2683, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [6691, 1653, 64, 64],
-** Processing line: ~    [1521, 3792, 64, 64],~
+    [6683, 2683, 64, 64],
+** Processing line: ~    [6681, 2622, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [1521, 3792, 64, 64],
-** Processing line: ~    [0, 5137, 64, 64],~
+    [6681, 2622, 64, 64],
+** Processing line: ~    [6682, 2559, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [0, 5137, 64, 64],
-** Processing line: ~    [0, 0, 64, 64],~
+    [6682, 2559, 64, 64],
+** Processing line: ~    [6683, 2498, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [0, 0, 64, 64],
-** Processing line: ~    [0, 1670, 64, 64],~
+    [6683, 2498, 64, 64],
+** Processing line: ~    [6685, 2434, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [0, 1670, 64, 64],
-** Processing line: ~    [6691, 1653, 64, 64],~
+    [6685, 2434, 64, 64],
+** Processing line: ~    [6683, 2371, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [6691, 1653, 64, 64],
-** Processing line: ~    [1521, 3792, 64, 64],~
+    [6683, 2371, 64, 64],
+** Processing line: ~    [6683, 2306, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [1521, 3792, 64, 64],
-** Processing line: ~    [0, 5137, 64, 64],~
+    [6683, 2306, 64, 64],
+** Processing line: ~    [6684, 2242, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [0, 5137, 64, 64],
-** Processing line: ~    [1215, 2421, 64, 64],~
+    [6684, 2242, 64, 64],
+** Processing line: ~    [6683, 2177, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [1215, 2421, 64, 64],
-** Processing line: ~    [1214, 2360, 64, 64],~
+    [6683, 2177, 64, 64],
+** Processing line: ~    [6683, 2112, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [1214, 2360, 64, 64],
-** Processing line: ~    [1211, 2300, 64, 64],~
+    [6683, 2112, 64, 64],
+** Processing line: ~    [6683, 2049, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [1211, 2300, 64, 64],
-** Processing line: ~    [1211, 2291, 64, 64],~
+    [6683, 2049, 64, 64],
+** Processing line: ~    [6683, 1985, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [1211, 2291, 64, 64],
-** Processing line: ~    [1158, 2420, 64, 64],~
+    [6683, 1985, 64, 64],
+** Processing line: ~    [6682, 1923, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [1158, 2420, 64, 64],
-** Processing line: ~    [1156, 2358, 64, 64],~
+    [6682, 1923, 64, 64],
+** Processing line: ~    [6683, 1860, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [1156, 2358, 64, 64],
-** Processing line: ~    [1149, 2291, 64, 64],~
+    [6683, 1860, 64, 64],
+** Processing line: ~    [6685, 1797, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [1149, 2291, 64, 64],
-** Processing line: ~    [1095, 2420, 64, 64],~
+    [6685, 1797, 64, 64],
+** Processing line: ~    [6684, 1735, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [1095, 2420, 64, 64],
-** Processing line: ~    [1030, 2418, 64, 64],~
+    [6684, 1735, 64, 64],
+** Processing line: ~    [6685, 1724, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [1030, 2418, 64, 64],
-** Processing line: ~    [966, 2419, 64, 64],~
+    [6685, 1724, 64, 64],
+** Processing line: ~    [7088, 1967, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [966, 2419, 64, 64],
-** Processing line: ~    [903, 2419, 64, 64],~
+    [7088, 1967, 64, 64],
+** Processing line: ~    [7026, 1966, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [903, 2419, 64, 64],
-** Processing line: ~    [852, 2419, 64, 64],~
+    [7026, 1966, 64, 64],
+** Processing line: ~    [6964, 1967, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [852, 2419, 64, 64],
-** Processing line: ~    [1087, 2291, 64, 64],~
+    [6964, 1967, 64, 64],
+** Processing line: ~    [6900, 1965, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [1087, 2291, 64, 64],
-** Processing line: ~    [1023, 2291, 64, 64],~
+    [6900, 1965, 64, 64],
+** Processing line: ~    [6869, 1969, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [1023, 2291, 64, 64],
-** Processing line: ~    [960, 2291, 64, 64],~
+    [6869, 1969, 64, 64],
+** Processing line: ~    [6972, 1904, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [960, 2291, 64, 64],
-** Processing line: ~    [896, 2292, 64, 64],~
+    [6972, 1904, 64, 64],
+** Processing line: ~    [6974, 1840, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [896, 2292, 64, 64],
-** Processing line: ~    [854, 2355, 64, 64],~
+    [6974, 1840, 64, 64],
+** Processing line: ~    [6971, 1776, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [854, 2355, 64, 64],
-** Processing line: ~    [854, 2292, 64, 64],~
+    [6971, 1776, 64, 64],
+** Processing line: ~    [6971, 1716, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [854, 2292, 64, 64],
-** Processing line: ~    [675, 3017, 64, 64],~
+    [6971, 1716, 64, 64],
+** Processing line: ~    [7168, 1979, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [675, 3017, 64, 64],
-** Processing line: ~    [622, 3017, 64, 64],~
+    [7168, 1979, 64, 64],
+** Processing line: ~    [7170, 1919, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [622, 3017, 64, 64],
-** Processing line: ~    [676, 2965, 64, 64],~
+    [7170, 1919, 64, 64],
+** Processing line: ~    [7169, 1882, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [676, 2965, 64, 64],
-** Processing line: ~    [622, 2965, 64, 64],~
+    [7169, 1882, 64, 64],
+** Processing line: ~    [7115, 1880, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [622, 2965, 64, 64],
-** Processing line: ~    [1560, 3212, 64, 64],~
+    [7115, 1880, 64, 64],
+** Processing line: ~    [7086, 1881, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [1560, 3212, 64, 64],
-** Processing line: ~    [1496, 3212, 64, 64],~
+    [7086, 1881, 64, 64],
+** Processing line: ~    [7725, 1837, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [1496, 3212, 64, 64],
-** Processing line: ~    [1430, 3211, 64, 64],~
+    [7725, 1837, 64, 64],
+** Processing line: ~    [7724, 1776, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [1430, 3211, 64, 64],
-** Processing line: ~    [1346, 3214, 64, 64],~
+    [7724, 1776, 64, 64],
+** Processing line: ~    [7724, 1728, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [1346, 3214, 64, 64],
-** Processing line: ~    [1410, 3213, 64, 64],~
+    [7724, 1728, 64, 64],
+** Processing line: ~    [7661, 1727, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [1410, 3213, 64, 64],
-** Processing line: ~    [1560, 3147, 64, 64],~
+    [7661, 1727, 64, 64],
+** Processing line: ~    [7603, 1728, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [1560, 3147, 64, 64],
-** Processing line: ~    [1559, 3105, 64, 64],~
+    [7603, 1728, 64, 64],
+** Processing line: ~    [7571, 1837, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [1559, 3105, 64, 64],
-** Processing line: ~    [1496, 3105, 64, 64],~
+    [7571, 1837, 64, 64],
+** Processing line: ~    [7570, 1774, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [1496, 3105, 64, 64],
-** Processing line: ~    [1442, 3105, 64, 64],~
+    [7570, 1774, 64, 64],
+** Processing line: ~    [7572, 1725, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [1442, 3105, 64, 64],
-** Processing line: ~    [1412, 3106, 64, 64],~
+    [7572, 1725, 64, 64],
+** Processing line: ~    [7859, 2134, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [1412, 3106, 64, 64],
-** Processing line: ~    [918, 4163, 64, 64],~
+    [7859, 2134, 64, 64],
+** Processing line: ~    [7858, 2070, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [918, 4163, 64, 64],
-** Processing line: ~    [854, 4161, 64, 64],~
+    [7858, 2070, 64, 64],
+** Processing line: ~    [7858, 2008, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [854, 4161, 64, 64],
-** Processing line: ~    [792, 4160, 64, 64],~
+    [7858, 2008, 64, 64],
+** Processing line: ~    [7860, 1942, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [792, 4160, 64, 64],
-** Processing line: ~    [729, 4159, 64, 64],~
+    [7860, 1942, 64, 64],
+** Processing line: ~    [7856, 1878, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [729, 4159, 64, 64],
-** Processing line: ~    [666, 4158, 64, 64],~
+    [7856, 1878, 64, 64],
+** Processing line: ~    [7860, 1813, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [666, 4158, 64, 64],
-** Processing line: ~    [601, 4158, 64, 64],~
+    [7860, 1813, 64, 64],
+** Processing line: ~    [7859, 1750, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [601, 4158, 64, 64],
-** Processing line: ~    [537, 4156, 64, 64],~
+    [7859, 1750, 64, 64],
+** Processing line: ~    [7856, 1724, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [537, 4156, 64, 64],
-** Processing line: ~    [918, 4137, 64, 64],~
+    [7856, 1724, 64, 64],
+** Processing line: ~    [8155, 1837, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [918, 4137, 64, 64],
-** Processing line: ~    [854, 4137, 64, 64],~
+    [8155, 1837, 64, 64],
+** Processing line: ~    [8092, 1839, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [854, 4137, 64, 64],
-** Processing line: ~    [789, 4136, 64, 64],~
+    [8092, 1839, 64, 64],
+** Processing line: ~    [8032, 1838, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [789, 4136, 64, 64],
-** Processing line: ~    [726, 4137, 64, 64],~
+    [8032, 1838, 64, 64],
+** Processing line: ~    [7999, 1839, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [726, 4137, 64, 64],
-** Processing line: ~    [661, 4137, 64, 64],~
+    [7999, 1839, 64, 64],
+** Processing line: ~    [8153, 1773, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [661, 4137, 64, 64],
-** Processing line: ~    [599, 4139, 64, 64],~
+    [8153, 1773, 64, 64],
+** Processing line: ~    [8154, 1731, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [599, 4139, 64, 64],
-** Processing line: ~    [538, 4137, 64, 64],~
+    [8154, 1731, 64, 64],
+** Processing line: ~    [8090, 1730, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [538, 4137, 64, 64],
-** Processing line: ~    [5378, 4254, 64, 64],~
+    [8090, 1730, 64, 64],
+** Processing line: ~    [8035, 1732, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [5378, 4254, 64, 64],
-** Processing line: ~    [5440, 4204, 64, 64],~
+    [8035, 1732, 64, 64],
+** Processing line: ~    [8003, 1776, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [5440, 4204, 64, 64],
-** Processing line: ~    [5405, 4214, 64, 64],~
+    [8003, 1776, 64, 64],
+** Processing line: ~    [8003, 1730, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [5405, 4214, 64, 64],
-** Processing line: ~    [5350, 4254, 64, 64],~
+    [8003, 1730, 64, 64],
+** Processing line: ~    [8421, 1978, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [5350, 4254, 64, 64],
-** Processing line: ~    [5439, 4177, 64, 64],~
+    [8421, 1978, 64, 64],
+** Processing line: ~    [8420, 1917, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [5439, 4177, 64, 64],
-** Processing line: ~    [5413, 4173, 64, 64],~
+    [8420, 1917, 64, 64],
+** Processing line: ~    [8505, 1878, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [5413, 4173, 64, 64],
-** Processing line: ~    [5399, 4128, 64, 64],~
+    [8505, 1878, 64, 64],
+** Processing line: ~    [8443, 1881, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [5399, 4128, 64, 64],
-** Processing line: ~    [5352, 4200, 64, 64],~
+    [8443, 1881, 64, 64],
+** Processing line: ~    [8420, 1882, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [5352, 4200, 64, 64],
-** Processing line: ~    [5352, 4158, 64, 64],~
+    [8420, 1882, 64, 64],
+** Processing line: ~    [8847, 1908, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [5352, 4158, 64, 64],
-** Processing line: ~    [5392, 4130, 64, 64],~
+    [8847, 1908, 64, 64],
+** Processing line: ~    [8783, 1908, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [5392, 4130, 64, 64],
-** Processing line: ~    [6216, 4251, 64, 64],~
+    [8783, 1908, 64, 64],
+** Processing line: ~    [8718, 1910, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [6216, 4251, 64, 64],
-** Processing line: ~    [6190, 4251, 64, 64],~
+    [8718, 1910, 64, 64],
+** Processing line: ~    [8654, 1910, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [6190, 4251, 64, 64],
-** Processing line: ~    [6279, 4200, 64, 64],~
+    [8654, 1910, 64, 64],
+** Processing line: ~    [8628, 1911, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [6279, 4200, 64, 64],
-** Processing line: ~    [6262, 4205, 64, 64],~
+    [8628, 1911, 64, 64],
+** Processing line: ~    [8729, 1847, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [6262, 4205, 64, 64],
-** Processing line: ~    [6233, 4214, 64, 64],~
+    [8729, 1847, 64, 64],
+** Processing line: ~    [8731, 1781, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [6233, 4214, 64, 64],
-** Processing line: ~    [6280, 4172, 64, 64],~
+    [8731, 1781, 64, 64],
+** Processing line: ~    [8731, 1721, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [6280, 4172, 64, 64],
-** Processing line: ~    [6256, 4169, 64, 64],~
+    [8731, 1721, 64, 64],
+** Processing line: ~    [9058, 2135, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [6256, 4169, 64, 64],
-** Processing line: ~    [6239, 4128, 64, 64],~
+    [9058, 2135, 64, 64],
+** Processing line: ~    [9056, 2073, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [6239, 4128, 64, 64],
-** Processing line: ~    [6231, 4128, 64, 64],~
+    [9056, 2073, 64, 64],
+** Processing line: ~    [9058, 2006, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [6231, 4128, 64, 64],
-** Processing line: ~    [6191, 4195, 64, 64],~
+    [9058, 2006, 64, 64],
+** Processing line: ~    [9057, 1939, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [6191, 4195, 64, 64],
-** Processing line: ~    [6190, 4158, 64, 64],~
+    [9057, 1939, 64, 64],
+** Processing line: ~    [9058, 1876, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [6190, 4158, 64, 64],
-** Processing line: ~    [7072, 4250, 64, 64],~
+    [9058, 1876, 64, 64],
+** Processing line: ~    [9056, 1810, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [7072, 4250, 64, 64],
-** Processing line: ~    [7046, 4250, 64, 64],~
+    [9056, 1810, 64, 64],
+** Processing line: ~    [9059, 1745, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [7046, 4250, 64, 64],
-** Processing line: ~    [7133, 4202, 64, 64],~
+    [9059, 1745, 64, 64],
+** Processing line: ~    [9060, 1722, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [7133, 4202, 64, 64],
-** Processing line: ~    [7107, 4209, 64, 64],~
+    [9060, 1722, 64, 64],
+** Processing line: ~    [9273, 1977, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [7107, 4209, 64, 64],
-** Processing line: ~    [7086, 4214, 64, 64],~
+    [9273, 1977, 64, 64],
+** Processing line: ~    [9273, 1912, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [7086, 4214, 64, 64],
-** Processing line: ~    [7133, 4173, 64, 64],~
+    [9273, 1912, 64, 64],
+** Processing line: ~    [9358, 1883, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [7133, 4173, 64, 64],
-** Processing line: ~    [7108, 4169, 64, 64],~
+    [9358, 1883, 64, 64],
+** Processing line: ~    [9298, 1881, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [7108, 4169, 64, 64],
-** Processing line: ~    [7092, 4127, 64, 64],~
+    [9298, 1881, 64, 64],
+** Processing line: ~    [9270, 1883, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [7092, 4127, 64, 64],
-** Processing line: ~    [7084, 4128, 64, 64],~
+    [9270, 1883, 64, 64],
+** Processing line: ~    [9699, 1910, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [7084, 4128, 64, 64],
-** Processing line: ~    [7047, 4191, 64, 64],~
+    [9699, 1910, 64, 64],
+** Processing line: ~    [9637, 1910, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [7047, 4191, 64, 64],
-** Processing line: ~    [7047, 4156, 64, 64],~
+    [9637, 1910, 64, 64],
+** Processing line: ~    [9576, 1910, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [7047, 4156, 64, 64],
-** Processing line: ~    [7926, 4252, 64, 64],~
+    [9576, 1910, 64, 64],
+** Processing line: ~    [9512, 1911, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [7926, 4252, 64, 64],
-** Processing line: ~    [7900, 4253, 64, 64],~
+    [9512, 1911, 64, 64],
+** Processing line: ~    [9477, 1912, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [7900, 4253, 64, 64],
-** Processing line: ~    [7987, 4202, 64, 64],~
+    [9477, 1912, 64, 64],
+** Processing line: ~    [9584, 1846, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [7987, 4202, 64, 64],
-** Processing line: ~    [7965, 4209, 64, 64],~
+    [9584, 1846, 64, 64],
+** Processing line: ~    [9585, 1783, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [7965, 4209, 64, 64],
-** Processing line: ~    [7942, 4216, 64, 64],~
+    [9585, 1783, 64, 64],
+** Processing line: ~    [9586, 1719, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [7942, 4216, 64, 64],
-** Processing line: ~    [7989, 4174, 64, 64],~
+    [9586, 1719, 64, 64],
+** Processing line: ~    [8320, 2788, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [7989, 4174, 64, 64],
-** Processing line: ~    [7970, 4170, 64, 64],~
+    [8320, 2788, 64, 64],
+** Processing line: ~    [8256, 2789, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [7970, 4170, 64, 64],
-** Processing line: ~    [7949, 4126, 64, 64],~
+    [8256, 2789, 64, 64],
+** Processing line: ~    [8192, 2789, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [7949, 4126, 64, 64],
-** Processing line: ~    [7901, 4196, 64, 64],~
+    [8192, 2789, 64, 64],
+** Processing line: ~    [8180, 2789, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [7901, 4196, 64, 64],
-** Processing line: ~    [7900, 4159, 64, 64],~
+    [8180, 2789, 64, 64],
+** Processing line: ~    [8319, 2730, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [7900, 4159, 64, 64],
-** Processing line: ~    [7941, 4130, 64, 64],~
+    [8319, 2730, 64, 64],
+** Processing line: ~    [8319, 2671, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [7941, 4130, 64, 64],
-** Processing line: ~    [2847, 379, 64, 64],~
+    [8319, 2671, 64, 64],
+** Processing line: ~    [8319, 2639, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [2847, 379, 64, 64],
-** Processing line: ~    [2825, 380, 64, 64],~
+    [8319, 2639, 64, 64],
+** Processing line: ~    [8259, 2639, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [2825, 380, 64, 64],
-** Processing line: ~    [2845, 317, 64, 64],~
+    [8259, 2639, 64, 64],
+** Processing line: ~    [8202, 2639, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [2845, 317, 64, 64],
-** Processing line: ~    [2829, 316, 64, 64],~
+    [8202, 2639, 64, 64],
+** Processing line: ~    [8179, 2727, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [2829, 316, 64, 64],
-** Processing line: ~    [2845, 255, 64, 64],~
+    [8179, 2727, 64, 64],
+** Processing line: ~    [8178, 2665, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [2845, 255, 64, 64],
-** Processing line: ~    [2830, 257, 64, 64],~
+    [8178, 2665, 64, 64],
+** Processing line: ~    [8177, 2636, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [2830, 257, 64, 64],
-** Processing line: ~    [2845, 202, 64, 64],~
+    [8177, 2636, 64, 64],
+** Processing line: ~    [9360, 3138, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [2845, 202, 64, 64],
-** Processing line: ~    [2829, 198, 64, 64],~
+    [9360, 3138, 64, 64],
+** Processing line: ~    [9296, 3137, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [2829, 198, 64, 64],
-** Processing line: ~    [2770, 169, 64, 64],~
+    [9296, 3137, 64, 64],
+** Processing line: ~    [9235, 3139, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [2770, 169, 64, 64],
-** Processing line: ~    [2708, 170, 64, 64],~
+    [9235, 3139, 64, 64],
+** Processing line: ~    [9174, 3139, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [2708, 170, 64, 64],
-** Processing line: ~    [2646, 171, 64, 64],~
+    [9174, 3139, 64, 64],
+** Processing line: ~    [9113, 3138, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [2646, 171, 64, 64],
-** Processing line: ~    [2582, 171, 64, 64],~
+    [9113, 3138, 64, 64],
+** Processing line: ~    [9050, 3138, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [2582, 171, 64, 64],
-** Processing line: ~    [2518, 171, 64, 64],~
+    [9050, 3138, 64, 64],
+** Processing line: ~    [8988, 3138, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [2518, 171, 64, 64],
-** Processing line: ~    [2454, 171, 64, 64],~
+    [8988, 3138, 64, 64],
+** Processing line: ~    [8925, 3138, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [2454, 171, 64, 64],
-** Processing line: ~    [2391, 172, 64, 64],~
+    [8925, 3138, 64, 64],
+** Processing line: ~    [8860, 3136, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [2391, 172, 64, 64],
-** Processing line: ~    [2332, 379, 64, 64],~
+    [8860, 3136, 64, 64],
+** Processing line: ~    [8797, 3136, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [2332, 379, 64, 64],
-** Processing line: ~    [2315, 379, 64, 64],~
+    [8797, 3136, 64, 64],
+** Processing line: ~    [8770, 3138, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [2315, 379, 64, 64],
-** Processing line: ~    [2334, 316, 64, 64],~
+    [8770, 3138, 64, 64],
+** Processing line: ~    [8827, 4171, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [2334, 316, 64, 64],
-** Processing line: ~    [2315, 317, 64, 64],~
+    [8827, 4171, 64, 64],
+** Processing line: ~    [8827, 4107, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [2315, 317, 64, 64],
-** Processing line: ~    [2332, 254, 64, 64],~
+    [8827, 4107, 64, 64],
+** Processing line: ~    [8827, 4043, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [2332, 254, 64, 64],
-** Processing line: ~    [2314, 254, 64, 64],~
+    [8827, 4043, 64, 64],
+** Processing line: ~    [8827, 3978, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [2314, 254, 64, 64],
-** Processing line: ~    [2335, 192, 64, 64],~
+    [8827, 3978, 64, 64],
+** Processing line: ~    [8825, 3914, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [2335, 192, 64, 64],
-** Processing line: ~    [2311, 192, 64, 64],~
+    [8825, 3914, 64, 64],
+** Processing line: ~    [8824, 3858, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [2311, 192, 64, 64],
-** Processing line: ~    [2846, 142, 64, 64],~
+    [8824, 3858, 64, 64],
+** Processing line: ~    [9635, 4234, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [2846, 142, 64, 64],
-** Processing line: ~    [2784, 140, 64, 64],~
+    [9635, 4234, 64, 64],
+** Processing line: ~    [9584, 4235, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [2784, 140, 64, 64],
-** Processing line: ~    [2846, 79, 64, 64],~
+    [9584, 4235, 64, 64],
+** Processing line: ~    [9634, 4187, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [2846, 79, 64, 64],
-** Processing line: ~    [2847, 41, 64, 64],~
+    [9634, 4187, 64, 64],
+** Processing line: ~    [9582, 4183, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [2847, 41, 64, 64],
-** Processing line: ~    [2783, 80, 64, 64],~
+    [9582, 4183, 64, 64],
+** Processing line: ~    [9402, 5114, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [2783, 80, 64, 64],
-** Processing line: ~    [2790, 39, 64, 64],~
+    [9402, 5114, 64, 64],
+** Processing line: ~    [9402, 5087, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [2790, 39, 64, 64],
-** Processing line: ~    [2727, 41, 64, 64],~
+    [9402, 5087, 64, 64],
+** Processing line: ~    [9347, 5113, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [2727, 41, 64, 64],
-** Processing line: ~    [2665, 43, 64, 64],~
+    [9347, 5113, 64, 64],
+** Processing line: ~    [9345, 5086, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [2665, 43, 64, 64],
-** Processing line: ~    [2605, 43, 64, 64],~
+    [9345, 5086, 64, 64],
+** Processing line: ~    [9287, 5114, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [2605, 43, 64, 64],
-** Processing line: ~    [2543, 44, 64, 64],~
+    [9287, 5114, 64, 64],
+** Processing line: ~    [9285, 5085, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [2543, 44, 64, 64],
-** Processing line: ~    [2480, 45, 64, 64],~
+    [9285, 5085, 64, 64],
+** Processing line: ~    [9245, 5114, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [2480, 45, 64, 64],
-** Processing line: ~    [2419, 45, 64, 64],~
+    [9245, 5114, 64, 64],
+** Processing line: ~    [9244, 5086, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [2419, 45, 64, 64],
-** Processing line: ~    [2357, 44, 64, 64],~
+    [9244, 5086, 64, 64],
+** Processing line: ~    [9336, 5445, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [2357, 44, 64, 64],
-** Processing line: ~    [2313, 129, 64, 64],~
+    [9336, 5445, 64, 64],
+** Processing line: ~    [9285, 5445, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [2313, 129, 64, 64],
-** Processing line: ~    [2313, 70, 64, 64],~
+    [9285, 5445, 64, 64],
+** Processing line: ~    [9337, 5395, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [2313, 70, 64, 64],
-** Processing line: ~    [2314, 40, 64, 64],~
+    [9337, 5395, 64, 64],
+** Processing line: ~    [9283, 5393, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [2314, 40, 64, 64],
-** Processing line: ~    [2517, 2385, 64, 64],~
+    [9283, 5393, 64, 64],
+** Processing line: ~    [8884, 4968, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [2517, 2385, 64, 64],
-** Processing line: ~    [2452, 2385, 64, 64],~
+    [8884, 4968, 64, 64],
+** Processing line: ~    [8884, 4939, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [2452, 2385, 64, 64],
-** Processing line: ~    [2390, 2386, 64, 64],~
+    [8884, 4939, 64, 64],
+** Processing line: ~    [8822, 4967, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [2390, 2386, 64, 64],
-** Processing line: ~    [2328, 2386, 64, 64],~
+    [8822, 4967, 64, 64],
+** Processing line: ~    [8823, 4940, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [2328, 2386, 64, 64],
-** Processing line: ~    [2264, 2386, 64, 64],~
+    [8823, 4940, 64, 64],
+** Processing line: ~    [8765, 4967, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [2264, 2386, 64, 64],
-** Processing line: ~    [2200, 2386, 64, 64],~
+    [8765, 4967, 64, 64],
+** Processing line: ~    [8762, 4937, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [2200, 2386, 64, 64],
-** Processing line: ~    [2137, 2387, 64, 64],~
+    [8762, 4937, 64, 64],
+** Processing line: ~    [8726, 4969, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [2137, 2387, 64, 64],
-** Processing line: ~    [2071, 2385, 64, 64],~
+    [8726, 4969, 64, 64],
+** Processing line: ~    [8727, 4939, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [2071, 2385, 64, 64],
-** Processing line: ~    [2016, 2389, 64, 64],~
+    [8727, 4939, 64, 64],
+** Processing line: ~    [7946, 5248, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [2016, 2389, 64, 64],
-** Processing line: ~    [2517, 2341, 64, 64],~
+    [7946, 5248, 64, 64],
+** Processing line: ~    [7945, 5220, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [2517, 2341, 64, 64],
-** Processing line: ~    [2518, 2316, 64, 64],~
+    [7945, 5220, 64, 64],
+** Processing line: ~    [7887, 5248, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [2518, 2316, 64, 64],
-** Processing line: ~    [2456, 2316, 64, 64],~
+    [7887, 5248, 64, 64],
+** Processing line: ~    [7886, 5219, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [2456, 2316, 64, 64],
-** Processing line: ~    [2393, 2316, 64, 64],~
+    [7886, 5219, 64, 64],
+** Processing line: ~    [7830, 5248, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [2393, 2316, 64, 64],
-** Processing line: ~    [2328, 2317, 64, 64],~
+    [7830, 5248, 64, 64],
+** Processing line: ~    [7827, 5218, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [2328, 2317, 64, 64],
-** Processing line: ~    [2264, 2316, 64, 64],~
+    [7827, 5218, 64, 64],
+** Processing line: ~    [7781, 5248, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [2264, 2316, 64, 64],
-** Processing line: ~    [2207, 2318, 64, 64],~
+    [7781, 5248, 64, 64],
+** Processing line: ~    [7781, 5216, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [2207, 2318, 64, 64],
-** Processing line: ~    [2144, 2317, 64, 64],~
+    [7781, 5216, 64, 64],
+** Processing line: ~    [6648, 4762, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [2144, 2317, 64, 64],
-** Processing line: ~    [2081, 2316, 64, 64],~
+    [6648, 4762, 64, 64],
+** Processing line: ~    [6621, 4761, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [2081, 2316, 64, 64],
-** Processing line: ~    [2015, 2342, 64, 64],~
+    [6621, 4761, 64, 64],
+** Processing line: ~    [5011, 4446, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [2015, 2342, 64, 64],
-** Processing line: ~    [2016, 2315, 64, 64],~
+    [5011, 4446, 64, 64],
+** Processing line: ~    [4982, 4444, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [2016, 2315, 64, 64],
-** Processing line: ~    [869, 3709, 64, 64],~
+    [4982, 4444, 64, 64],
+** Processing line: ~    [4146, 4641, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [869, 3709, 64, 64],
-** Processing line: ~    [819, 3710, 64, 64],~
+    [4146, 4641, 64, 64],
+** Processing line: ~    [4092, 4643, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [819, 3710, 64, 64],
-** Processing line: ~    [869, 3658, 64, 64],~
+    [4092, 4643, 64, 64],
+** Processing line: ~    [4145, 4589, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [869, 3658, 64, 64],
-** Processing line: ~    [820, 3658, 64, 64],~
+    [4145, 4589, 64, 64],
+** Processing line: ~    [4091, 4590, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [820, 3658, 64, 64],
-** Processing line: ~    [0, 0, 64, 64],~
+    [4091, 4590, 64, 64],
+** Processing line: ~    [4139, 4497, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [0, 0, 64, 64],
-** Processing line: ~    [0, 1670, 64, 64],~
+    [4139, 4497, 64, 64],
+** Processing line: ~    [4135, 4437, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [0, 1670, 64, 64],
-** Processing line: ~    [6691, 1653, 64, 64],~
+    [4135, 4437, 64, 64],
+** Processing line: ~    [4135, 4383, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [6691, 1653, 64, 64],
-** Processing line: ~    [1521, 3792, 64, 64],~
+    [4135, 4383, 64, 64],
+** Processing line: ~    [4078, 4495, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [1521, 3792, 64, 64],
-** Processing line: ~    [0, 5137, 64, 64],~
+    [4078, 4495, 64, 64],
+** Processing line: ~    [4014, 4494, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [0, 5137, 64, 64],
-** Processing line: ~    [3898, 2400, 64, 64],~
+    [4014, 4494, 64, 64],
+** Processing line: ~    [3979, 4496, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [3898, 2400, 64, 64],
-** Processing line: ~    [3835, 2400, 64, 64],~
+    [3979, 4496, 64, 64],
+** Processing line: ~    [4074, 4384, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [3835, 2400, 64, 64],
-** Processing line: ~    [3771, 2400, 64, 64],~
+    [4074, 4384, 64, 64],
+** Processing line: ~    [4015, 4381, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [3771, 2400, 64, 64],
-** Processing line: ~    [3708, 2401, 64, 64],~
+    [4015, 4381, 64, 64],
+** Processing line: ~    [3980, 4433, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [3708, 2401, 64, 64],
-** Processing line: ~    [3646, 2401, 64, 64],~
+    [3980, 4433, 64, 64],
+** Processing line: ~    [3981, 4384, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [3646, 2401, 64, 64],
-** Processing line: ~    [3587, 2401, 64, 64],~
+    [3981, 4384, 64, 64],
+** Processing line: ~    [3276, 4279, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [3587, 2401, 64, 64],
-** Processing line: ~    [3530, 2401, 64, 64],~
+    [3276, 4279, 64, 64],
+** Processing line: ~    [3275, 4218, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [3530, 2401, 64, 64],
-** Processing line: ~    [3897, 2340, 64, 64],~
+    [3275, 4218, 64, 64],
+** Processing line: ~    [3276, 4170, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [3897, 2340, 64, 64],
-** Processing line: ~    [3897, 2295, 64, 64],~
+    [3276, 4170, 64, 64],
+** Processing line: ~    [3211, 4164, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [3897, 2295, 64, 64],
-** Processing line: ~    [3834, 2296, 64, 64],~
+    [3211, 4164, 64, 64],
+** Processing line: ~    [3213, 4280, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [3834, 2296, 64, 64],
-** Processing line: ~    [3773, 2295, 64, 64],~
+    [3213, 4280, 64, 64],
+** Processing line: ~    [3156, 4278, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [3773, 2295, 64, 64],
-** Processing line: ~    [3710, 2296, 64, 64],~
+    [3156, 4278, 64, 64],
+** Processing line: ~    [3120, 4278, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [3710, 2296, 64, 64],
-** Processing line: ~    [3656, 2295, 64, 64],~
+    [3120, 4278, 64, 64],
+** Processing line: ~    [3151, 4163, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [3656, 2295, 64, 64],
-** Processing line: ~    [3593, 2294, 64, 64],~
+    [3151, 4163, 64, 64],
+** Processing line: ~    [3120, 4216, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [3593, 2294, 64, 64],
-** Processing line: ~    [3527, 2339, 64, 64],~
+    [3120, 4216, 64, 64],
+** Processing line: ~    [3120, 4161, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [3527, 2339, 64, 64],
-** Processing line: ~    [3531, 2293, 64, 64],~
+    [3120, 4161, 64, 64],
+** Processing line: ~    [1536, 4171, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [3531, 2293, 64, 64],
-** Processing line: ~    [4152, 2903, 64, 64],~
+    [1536, 4171, 64, 64],
+** Processing line: ~    [1536, 4110, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [4152, 2903, 64, 64],
-** Processing line: ~    [4155, 2858, 64, 64],~
+    [1536, 4110, 64, 64],
+** Processing line: ~    [1535, 4051, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [4155, 2858, 64, 64],
-** Processing line: ~    [3942, 1306, 64, 64],~
+    [1535, 4051, 64, 64],
+** Processing line: ~    [1536, 3991, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [3942, 1306, 64, 64],
-** Processing line: ~    [3942, 1279, 64, 64],~
+    [1536, 3991, 64, 64],
+** Processing line: ~    [1536, 3928, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [3942, 1279, 64, 64],
-** Processing line: ~    [3879, 1306, 64, 64],~
+    [1536, 3928, 64, 64],
+** Processing line: ~    [1536, 3863, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [3879, 1306, 64, 64],
-** Processing line: ~    [3881, 1278, 64, 64],~
+    [1536, 3863, 64, 64],
+** Processing line: ~    [1078, 4605, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [3881, 1278, 64, 64],
-** Processing line: ~    [3819, 1305, 64, 64],~
+    [1078, 4605, 64, 64],
+** Processing line: ~    [1076, 4577, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [3819, 1305, 64, 64],
-** Processing line: ~    [3819, 1277, 64, 64],~
+    [1076, 4577, 64, 64],
+** Processing line: ~    [1018, 4604, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [3819, 1277, 64, 64],
-** Processing line: ~    [3756, 1306, 64, 64],~
+    [1018, 4604, 64, 64],
+** Processing line: ~    [1018, 4575, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [3756, 1306, 64, 64],
-** Processing line: ~    [3756, 1277, 64, 64],~
+    [1018, 4575, 64, 64],
+** Processing line: ~    [957, 4606, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [3756, 1277, 64, 64],
-** Processing line: ~    [3694, 1306, 64, 64],~
+    [957, 4606, 64, 64],
+** Processing line: ~    [960, 4575, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [3694, 1306, 64, 64],
-** Processing line: ~    [3695, 1277, 64, 64],~
+    [960, 4575, 64, 64],
+** Processing line: ~    [918, 4602, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [918, 4602, 64, 64],
+** Processing line: ~    [918, 4580, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [918, 4580, 64, 64],
+** Processing line: ~    [394, 4164, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [394, 4164, 64, 64],
+** Processing line: ~    [335, 4163, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [335, 4163, 64, 64],
+** Processing line: ~    [274, 4161, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [274, 4161, 64, 64],
+** Processing line: ~    [236, 4163, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [236, 4163, 64, 64],
+** Processing line: ~    [394, 4140, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [394, 4140, 64, 64],
+** Processing line: ~    [329, 4139, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [329, 4139, 64, 64],
+** Processing line: ~    [268, 4139, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [268, 4139, 64, 64],
+** Processing line: ~    [239, 4139, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [239, 4139, 64, 64],
+** Processing line: ~    [4326, 5073, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [4326, 5073, 64, 64],
+** Processing line: ~    [4324, 5042, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [4324, 5042, 64, 64],
+** Processing line: ~    [4265, 5074, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [4265, 5074, 64, 64],
+** Processing line: ~    [4263, 5042, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [4263, 5042, 64, 64],
+** Processing line: ~    [4214, 5072, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [4214, 5072, 64, 64],
+** Processing line: ~    [4211, 5043, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [4211, 5043, 64, 64],
+** Processing line: ~    [4166, 5073, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [4166, 5073, 64, 64],
+** Processing line: ~    [4164, 5041, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [4164, 5041, 64, 64],
+** Processing line: ~    [4844, 5216, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [4844, 5216, 64, 64],
+** Processing line: ~    [4844, 5189, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [4844, 5189, 64, 64],
+** Processing line: ~    [4785, 5217, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [4785, 5217, 64, 64],
+** Processing line: ~    [4790, 5187, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [4790, 5187, 64, 64],
+** Processing line: ~    [4726, 5219, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [4726, 5219, 64, 64],
+** Processing line: ~    [4728, 5185, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [4728, 5185, 64, 64],
+** Processing line: ~    [4681, 5218, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [4681, 5218, 64, 64],
+** Processing line: ~    [4684, 5186, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [4684, 5186, 64, 64],
+** Processing line: ~    [4789, 4926, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [4789, 4926, 64, 64],
+** Processing line: ~    [4734, 4928, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [4734, 4928, 64, 64],
+** Processing line: ~    [4787, 4876, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [4787, 4876, 64, 64],
+** Processing line: ~    [4738, 4874, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [4738, 4874, 64, 64],
+** Processing line: ~    [4775, 5548, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [4775, 5548, 64, 64],
+** Processing line: ~    [4775, 5495, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [4775, 5495, 64, 64],
+** Processing line: ~    [4723, 5550, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [4723, 5550, 64, 64],
+** Processing line: ~    [4725, 5494, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [4725, 5494, 64, 64],
+** Processing line: ~    [1360, 5269, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [1360, 5269, 64, 64],
+** Processing line: ~    [1362, 5218, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [1362, 5218, 64, 64],
+** Processing line: ~    [1315, 5266, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [1315, 5266, 64, 64],
+** Processing line: ~    [1282, 5266, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [1282, 5266, 64, 64],
+** Processing line: ~    [1246, 5311, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [1246, 5311, 64, 64],
+** Processing line: ~    [1190, 5312, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [1190, 5312, 64, 64],
+** Processing line: ~    [1136, 5310, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [1136, 5310, 64, 64],
+** Processing line: ~    [1121, 5427, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [1121, 5427, 64, 64],
+** Processing line: ~    [1121, 5370, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [1121, 5370, 64, 64],
+** Processing line: ~    [1074, 5427, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [1074, 5427, 64, 64],
+** Processing line: ~    [1064, 5423, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [1064, 5423, 64, 64],
+** Processing line: ~    [1052, 5417, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [1052, 5417, 64, 64],
+** Processing line: ~    [1050, 5368, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [1050, 5368, 64, 64],
+** Processing line: ~    [1008, 5314, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [1008, 5314, 64, 64],
+** Processing line: ~    [997, 5307, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [997, 5307, 64, 64],
+** Processing line: ~    [977, 5299, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [977, 5299, 64, 64],
+** Processing line: ~    [976, 5248, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [976, 5248, 64, 64],
+** Processing line: ~    [825, 5267, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [825, 5267, 64, 64],
+** Processing line: ~    [826, 5213, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [826, 5213, 64, 64],
+** Processing line: ~    [776, 5267, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [776, 5267, 64, 64],
+** Processing line: ~    [768, 5261, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [768, 5261, 64, 64],
+** Processing line: ~    [755, 5256, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [755, 5256, 64, 64],
+** Processing line: ~    [753, 5209, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [753, 5209, 64, 64],
+** Processing line: ~    [1299, 5206, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [1299, 5206, 64, 64],
+** Processing line: ~    [1238, 5204, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [1238, 5204, 64, 64],
+** Processing line: ~    [1178, 5203, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [1178, 5203, 64, 64],
+** Processing line: ~    [1124, 5204, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [1124, 5204, 64, 64],
+** Processing line: ~    [1065, 5206, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [1065, 5206, 64, 64],
+** Processing line: ~    [1008, 5203, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [1008, 5203, 64, 64],
+** Processing line: ~    [977, 5214, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [977, 5214, 64, 64],
+** Processing line: ~    [410, 5313, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [410, 5313, 64, 64],
+** Processing line: ~    [407, 5249, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [407, 5249, 64, 64],
+** Processing line: ~    [411, 5225, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [411, 5225, 64, 64],
+** Processing line: ~    [397, 5217, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [397, 5217, 64, 64],
+** Processing line: ~    [378, 5209, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [378, 5209, 64, 64],
+** Processing line: ~    [358, 5312, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [358, 5312, 64, 64],
+** Processing line: ~    [287, 5427, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [287, 5427, 64, 64],
+** Processing line: ~    [286, 5364, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [286, 5364, 64, 64],
+** Processing line: ~    [300, 5313, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [300, 5313, 64, 64],
+** Processing line: ~    [242, 5427, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [242, 5427, 64, 64],
+** Processing line: ~    [229, 5420, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [229, 5420, 64, 64],
+** Processing line: ~    [217, 5416, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [217, 5416, 64, 64],
+** Processing line: ~    [215, 5364, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [215, 5364, 64, 64],
+** Processing line: ~    [174, 5311, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [174, 5311, 64, 64],
+** Processing line: ~    [165, 5308, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [165, 5308, 64, 64],
+** Processing line: ~    [139, 5300, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [139, 5300, 64, 64],
+** Processing line: ~    [141, 5236, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [141, 5236, 64, 64],
+** Processing line: ~    [141, 5211, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [141, 5211, 64, 64],
+** Processing line: ~    [315, 5208, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [315, 5208, 64, 64],
+** Processing line: ~    [251, 5208, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [251, 5208, 64, 64],
+** Processing line: ~    [211, 5211, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [211, 5211, 64, 64],
+** Processing line: ~    [8050, 4060, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [8050, 4060, 64, 64],
+** Processing line: ~    [7992, 4060, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [7992, 4060, 64, 64],
+** Processing line: ~    [7929, 4060, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [7929, 4060, 64, 64],
+** Processing line: ~    [7866, 4061, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [7866, 4061, 64, 64],
+** Processing line: ~    [7828, 4063, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [7828, 4063, 64, 64],
+** Processing line: ~    [7934, 4001, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [7934, 4001, 64, 64],
+** Processing line: ~    [7935, 3936, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [7935, 3936, 64, 64],
+** Processing line: ~    [7935, 3875, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [7935, 3875, 64, 64],
+** Processing line: ~    [7622, 4111, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [7622, 4111, 64, 64],
+** Processing line: ~    [7623, 4049, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [7623, 4049, 64, 64],
+** Processing line: ~    [7707, 4018, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [7707, 4018, 64, 64],
+** Processing line: ~    [7663, 4019, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [7663, 4019, 64, 64],
+** Processing line: ~    [7623, 4017, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [7623, 4017, 64, 64],
+** Processing line: ~    [7193, 4060, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [7193, 4060, 64, 64],
+** Processing line: ~    [7131, 4059, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [7131, 4059, 64, 64],
+** Processing line: ~    [7070, 4057, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [7070, 4057, 64, 64],
+** Processing line: ~    [7008, 4060, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [7008, 4060, 64, 64],
+** Processing line: ~    [6977, 4060, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [6977, 4060, 64, 64],
+** Processing line: ~    [7080, 3998, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [7080, 3998, 64, 64],
+** Processing line: ~    [7081, 3935, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [7081, 3935, 64, 64],
+** Processing line: ~    [7080, 3873, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [7080, 3873, 64, 64],
+** Processing line: ~    [6855, 4019, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [6855, 4019, 64, 64],
+** Processing line: ~    [6790, 4018, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [6790, 4018, 64, 64],
+** Processing line: ~    [6770, 4114, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [6770, 4114, 64, 64],
+** Processing line: ~    [6770, 4060, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [6770, 4060, 64, 64],
+** Processing line: ~    [6768, 4013, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [6768, 4013, 64, 64],
+** Processing line: ~    [6345, 4060, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [6345, 4060, 64, 64],
+** Processing line: ~    [6284, 4062, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [6284, 4062, 64, 64],
+** Processing line: ~    [6222, 4061, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [6222, 4061, 64, 64],
+** Processing line: ~    [6166, 4061, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [6166, 4061, 64, 64],
+** Processing line: ~    [6124, 4066, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [6124, 4066, 64, 64],
+** Processing line: ~    [6226, 3995, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [6226, 3995, 64, 64],
+** Processing line: ~    [6226, 3933, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [6226, 3933, 64, 64],
+** Processing line: ~    [6228, 3868, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [6228, 3868, 64, 64],
+** Processing line: ~    [5916, 4113, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [5916, 4113, 64, 64],
+** Processing line: ~    [5918, 4052, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [5918, 4052, 64, 64],
+** Processing line: ~    [6001, 4018, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [6001, 4018, 64, 64],
+** Processing line: ~    [5941, 4019, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [5941, 4019, 64, 64],
+** Processing line: ~    [5918, 4020, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [5918, 4020, 64, 64],
+** Processing line: ~    [5501, 4059, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [5501, 4059, 64, 64],
+** Processing line: ~    [5439, 4061, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [5439, 4061, 64, 64],
+** Processing line: ~    [5376, 4059, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [5376, 4059, 64, 64],
+** Processing line: ~    [5312, 4058, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [5312, 4058, 64, 64],
+** Processing line: ~    [5285, 4062, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [5285, 4062, 64, 64],
+** Processing line: ~    [5388, 3999, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [5388, 3999, 64, 64],
+** Processing line: ~    [5385, 3941, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [5385, 3941, 64, 64],
+** Processing line: ~    [5384, 3874, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [5384, 3874, 64, 64],
+** Processing line: ~    [5075, 4112, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [5075, 4112, 64, 64],
+** Processing line: ~    [5074, 4051, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [5074, 4051, 64, 64],
+** Processing line: ~    [5158, 4018, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [5158, 4018, 64, 64],
+** Processing line: ~    [5095, 4020, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [5095, 4020, 64, 64],
+** Processing line: ~    [5073, 4018, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [5073, 4018, 64, 64],
+** Processing line: ~    [4549, 3998, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [4549, 3998, 64, 64],
+** Processing line: ~    [4393, 3996, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [4393, 3996, 64, 64],
+** Processing line: ~    [4547, 3938, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [4547, 3938, 64, 64],
+** Processing line: ~    [4547, 3886, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [4547, 3886, 64, 64],
+** Processing line: ~    [4488, 3885, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [4488, 3885, 64, 64],
+** Processing line: ~    [4427, 3885, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [4427, 3885, 64, 64],
+** Processing line: ~    [4395, 3938, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [4395, 3938, 64, 64],
+** Processing line: ~    [4395, 3885, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [4395, 3885, 64, 64],
+** Processing line: ~    [0, 0, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [0, 0, 64, 64],
+** Processing line: ~    [0, 1670, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [0, 1670, 64, 64],
+** Processing line: ~    [6691, 1653, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [6691, 1653, 64, 64],
+** Processing line: ~    [1521, 3792, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [1521, 3792, 64, 64],
+** Processing line: ~    [0, 5137, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [0, 5137, 64, 64],
+** Processing line: ~    [0, 0, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [0, 0, 64, 64],
+** Processing line: ~    [0, 1670, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [0, 1670, 64, 64],
+** Processing line: ~    [6691, 1653, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [6691, 1653, 64, 64],
+** Processing line: ~    [1521, 3792, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [1521, 3792, 64, 64],
+** Processing line: ~    [0, 5137, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [0, 5137, 64, 64],
+** Processing line: ~    [1215, 2421, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [1215, 2421, 64, 64],
+** Processing line: ~    [1214, 2360, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [1214, 2360, 64, 64],
+** Processing line: ~    [1211, 2300, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [1211, 2300, 64, 64],
+** Processing line: ~    [1211, 2291, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [1211, 2291, 64, 64],
+** Processing line: ~    [1158, 2420, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [1158, 2420, 64, 64],
+** Processing line: ~    [1156, 2358, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [1156, 2358, 64, 64],
+** Processing line: ~    [1149, 2291, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [1149, 2291, 64, 64],
+** Processing line: ~    [1095, 2420, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [1095, 2420, 64, 64],
+** Processing line: ~    [1030, 2418, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [1030, 2418, 64, 64],
+** Processing line: ~    [966, 2419, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [966, 2419, 64, 64],
+** Processing line: ~    [903, 2419, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [903, 2419, 64, 64],
+** Processing line: ~    [852, 2419, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [852, 2419, 64, 64],
+** Processing line: ~    [1087, 2291, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [1087, 2291, 64, 64],
+** Processing line: ~    [1023, 2291, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [1023, 2291, 64, 64],
+** Processing line: ~    [960, 2291, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [960, 2291, 64, 64],
+** Processing line: ~    [896, 2292, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [896, 2292, 64, 64],
+** Processing line: ~    [854, 2355, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [854, 2355, 64, 64],
+** Processing line: ~    [854, 2292, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [854, 2292, 64, 64],
+** Processing line: ~    [675, 3017, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [675, 3017, 64, 64],
+** Processing line: ~    [622, 3017, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [622, 3017, 64, 64],
+** Processing line: ~    [676, 2965, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [676, 2965, 64, 64],
+** Processing line: ~    [622, 2965, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [622, 2965, 64, 64],
+** Processing line: ~    [1560, 3212, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [1560, 3212, 64, 64],
+** Processing line: ~    [1496, 3212, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [1496, 3212, 64, 64],
+** Processing line: ~    [1430, 3211, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [1430, 3211, 64, 64],
+** Processing line: ~    [1346, 3214, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [1346, 3214, 64, 64],
+** Processing line: ~    [1410, 3213, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [1410, 3213, 64, 64],
+** Processing line: ~    [1560, 3147, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [1560, 3147, 64, 64],
+** Processing line: ~    [1559, 3105, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [1559, 3105, 64, 64],
+** Processing line: ~    [1496, 3105, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [1496, 3105, 64, 64],
+** Processing line: ~    [1442, 3105, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [1442, 3105, 64, 64],
+** Processing line: ~    [1412, 3106, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [1412, 3106, 64, 64],
+** Processing line: ~    [918, 4163, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [918, 4163, 64, 64],
+** Processing line: ~    [854, 4161, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [854, 4161, 64, 64],
+** Processing line: ~    [792, 4160, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [792, 4160, 64, 64],
+** Processing line: ~    [729, 4159, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [729, 4159, 64, 64],
+** Processing line: ~    [666, 4158, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [666, 4158, 64, 64],
+** Processing line: ~    [601, 4158, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [601, 4158, 64, 64],
+** Processing line: ~    [537, 4156, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [537, 4156, 64, 64],
+** Processing line: ~    [918, 4137, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [918, 4137, 64, 64],
+** Processing line: ~    [854, 4137, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [854, 4137, 64, 64],
+** Processing line: ~    [789, 4136, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [789, 4136, 64, 64],
+** Processing line: ~    [726, 4137, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [726, 4137, 64, 64],
+** Processing line: ~    [661, 4137, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [661, 4137, 64, 64],
+** Processing line: ~    [599, 4139, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [599, 4139, 64, 64],
+** Processing line: ~    [538, 4137, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [538, 4137, 64, 64],
+** Processing line: ~    [5378, 4254, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [5378, 4254, 64, 64],
+** Processing line: ~    [5440, 4204, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [5440, 4204, 64, 64],
+** Processing line: ~    [5405, 4214, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [5405, 4214, 64, 64],
+** Processing line: ~    [5350, 4254, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [5350, 4254, 64, 64],
+** Processing line: ~    [5439, 4177, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [5439, 4177, 64, 64],
+** Processing line: ~    [5413, 4173, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [5413, 4173, 64, 64],
+** Processing line: ~    [5399, 4128, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [5399, 4128, 64, 64],
+** Processing line: ~    [5352, 4200, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [5352, 4200, 64, 64],
+** Processing line: ~    [5352, 4158, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [5352, 4158, 64, 64],
+** Processing line: ~    [5392, 4130, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [5392, 4130, 64, 64],
+** Processing line: ~    [6216, 4251, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [6216, 4251, 64, 64],
+** Processing line: ~    [6190, 4251, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [6190, 4251, 64, 64],
+** Processing line: ~    [6279, 4200, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [6279, 4200, 64, 64],
+** Processing line: ~    [6262, 4205, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [6262, 4205, 64, 64],
+** Processing line: ~    [6233, 4214, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [6233, 4214, 64, 64],
+** Processing line: ~    [6280, 4172, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [6280, 4172, 64, 64],
+** Processing line: ~    [6256, 4169, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [6256, 4169, 64, 64],
+** Processing line: ~    [6239, 4128, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [6239, 4128, 64, 64],
+** Processing line: ~    [6231, 4128, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [6231, 4128, 64, 64],
+** Processing line: ~    [6191, 4195, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [6191, 4195, 64, 64],
+** Processing line: ~    [6190, 4158, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [6190, 4158, 64, 64],
+** Processing line: ~    [7072, 4250, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [7072, 4250, 64, 64],
+** Processing line: ~    [7046, 4250, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [7046, 4250, 64, 64],
+** Processing line: ~    [7133, 4202, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [7133, 4202, 64, 64],
+** Processing line: ~    [7107, 4209, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [7107, 4209, 64, 64],
+** Processing line: ~    [7086, 4214, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [7086, 4214, 64, 64],
+** Processing line: ~    [7133, 4173, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [7133, 4173, 64, 64],
+** Processing line: ~    [7108, 4169, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [7108, 4169, 64, 64],
+** Processing line: ~    [7092, 4127, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [7092, 4127, 64, 64],
+** Processing line: ~    [7084, 4128, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [7084, 4128, 64, 64],
+** Processing line: ~    [7047, 4191, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [7047, 4191, 64, 64],
+** Processing line: ~    [7047, 4156, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [7047, 4156, 64, 64],
+** Processing line: ~    [7926, 4252, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [7926, 4252, 64, 64],
+** Processing line: ~    [7900, 4253, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [7900, 4253, 64, 64],
+** Processing line: ~    [7987, 4202, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [7987, 4202, 64, 64],
+** Processing line: ~    [7965, 4209, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [7965, 4209, 64, 64],
+** Processing line: ~    [7942, 4216, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [7942, 4216, 64, 64],
+** Processing line: ~    [7989, 4174, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [7989, 4174, 64, 64],
+** Processing line: ~    [7970, 4170, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [7970, 4170, 64, 64],
+** Processing line: ~    [7949, 4126, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [7949, 4126, 64, 64],
+** Processing line: ~    [7901, 4196, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [7901, 4196, 64, 64],
+** Processing line: ~    [7900, 4159, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [7900, 4159, 64, 64],
+** Processing line: ~    [7941, 4130, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [7941, 4130, 64, 64],
+** Processing line: ~    [2847, 379, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [2847, 379, 64, 64],
+** Processing line: ~    [2825, 380, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [2825, 380, 64, 64],
+** Processing line: ~    [2845, 317, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [2845, 317, 64, 64],
+** Processing line: ~    [2829, 316, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [2829, 316, 64, 64],
+** Processing line: ~    [2845, 255, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [2845, 255, 64, 64],
+** Processing line: ~    [2830, 257, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [2830, 257, 64, 64],
+** Processing line: ~    [2845, 202, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [2845, 202, 64, 64],
+** Processing line: ~    [2829, 198, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [2829, 198, 64, 64],
+** Processing line: ~    [2770, 169, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [2770, 169, 64, 64],
+** Processing line: ~    [2708, 170, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [2708, 170, 64, 64],
+** Processing line: ~    [2646, 171, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [2646, 171, 64, 64],
+** Processing line: ~    [2582, 171, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [2582, 171, 64, 64],
+** Processing line: ~    [2518, 171, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [2518, 171, 64, 64],
+** Processing line: ~    [2454, 171, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [2454, 171, 64, 64],
+** Processing line: ~    [2391, 172, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [2391, 172, 64, 64],
+** Processing line: ~    [2332, 379, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [2332, 379, 64, 64],
+** Processing line: ~    [2315, 379, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [2315, 379, 64, 64],
+** Processing line: ~    [2334, 316, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [2334, 316, 64, 64],
+** Processing line: ~    [2315, 317, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [2315, 317, 64, 64],
+** Processing line: ~    [2332, 254, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [2332, 254, 64, 64],
+** Processing line: ~    [2314, 254, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [2314, 254, 64, 64],
+** Processing line: ~    [2335, 192, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [2335, 192, 64, 64],
+** Processing line: ~    [2311, 192, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [2311, 192, 64, 64],
+** Processing line: ~    [2846, 142, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [2846, 142, 64, 64],
+** Processing line: ~    [2784, 140, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [2784, 140, 64, 64],
+** Processing line: ~    [2846, 79, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [2846, 79, 64, 64],
+** Processing line: ~    [2847, 41, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [2847, 41, 64, 64],
+** Processing line: ~    [2783, 80, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [2783, 80, 64, 64],
+** Processing line: ~    [2790, 39, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [2790, 39, 64, 64],
+** Processing line: ~    [2727, 41, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [2727, 41, 64, 64],
+** Processing line: ~    [2665, 43, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [2665, 43, 64, 64],
+** Processing line: ~    [2605, 43, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [2605, 43, 64, 64],
+** Processing line: ~    [2543, 44, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [2543, 44, 64, 64],
+** Processing line: ~    [2480, 45, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [2480, 45, 64, 64],
+** Processing line: ~    [2419, 45, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [2419, 45, 64, 64],
+** Processing line: ~    [2357, 44, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [2357, 44, 64, 64],
+** Processing line: ~    [2313, 129, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [2313, 129, 64, 64],
+** Processing line: ~    [2313, 70, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [2313, 70, 64, 64],
+** Processing line: ~    [2314, 40, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [2314, 40, 64, 64],
+** Processing line: ~    [2517, 2385, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [2517, 2385, 64, 64],
+** Processing line: ~    [2452, 2385, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [2452, 2385, 64, 64],
+** Processing line: ~    [2390, 2386, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [2390, 2386, 64, 64],
+** Processing line: ~    [2328, 2386, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [2328, 2386, 64, 64],
+** Processing line: ~    [2264, 2386, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [2264, 2386, 64, 64],
+** Processing line: ~    [2200, 2386, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [2200, 2386, 64, 64],
+** Processing line: ~    [2137, 2387, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [2137, 2387, 64, 64],
+** Processing line: ~    [2071, 2385, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [2071, 2385, 64, 64],
+** Processing line: ~    [2016, 2389, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [2016, 2389, 64, 64],
+** Processing line: ~    [2517, 2341, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [2517, 2341, 64, 64],
+** Processing line: ~    [2518, 2316, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [2518, 2316, 64, 64],
+** Processing line: ~    [2456, 2316, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [2456, 2316, 64, 64],
+** Processing line: ~    [2393, 2316, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [2393, 2316, 64, 64],
+** Processing line: ~    [2328, 2317, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [2328, 2317, 64, 64],
+** Processing line: ~    [2264, 2316, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [2264, 2316, 64, 64],
+** Processing line: ~    [2207, 2318, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [2207, 2318, 64, 64],
+** Processing line: ~    [2144, 2317, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [2144, 2317, 64, 64],
+** Processing line: ~    [2081, 2316, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [2081, 2316, 64, 64],
+** Processing line: ~    [2015, 2342, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [2015, 2342, 64, 64],
+** Processing line: ~    [2016, 2315, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [2016, 2315, 64, 64],
+** Processing line: ~    [869, 3709, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [869, 3709, 64, 64],
+** Processing line: ~    [819, 3710, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [819, 3710, 64, 64],
+** Processing line: ~    [869, 3658, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [869, 3658, 64, 64],
+** Processing line: ~    [820, 3658, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [820, 3658, 64, 64],
+** Processing line: ~    [0, 0, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [0, 0, 64, 64],
+** Processing line: ~    [0, 1670, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [0, 1670, 64, 64],
+** Processing line: ~    [6691, 1653, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [6691, 1653, 64, 64],
+** Processing line: ~    [1521, 3792, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [1521, 3792, 64, 64],
+** Processing line: ~    [0, 5137, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [0, 5137, 64, 64],
+** Processing line: ~    [3898, 2400, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [3898, 2400, 64, 64],
+** Processing line: ~    [3835, 2400, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [3835, 2400, 64, 64],
+** Processing line: ~    [3771, 2400, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [3771, 2400, 64, 64],
+** Processing line: ~    [3708, 2401, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [3708, 2401, 64, 64],
+** Processing line: ~    [3646, 2401, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [3646, 2401, 64, 64],
+** Processing line: ~    [3587, 2401, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [3587, 2401, 64, 64],
+** Processing line: ~    [3530, 2401, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [3530, 2401, 64, 64],
+** Processing line: ~    [3897, 2340, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [3897, 2340, 64, 64],
+** Processing line: ~    [3897, 2295, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [3897, 2295, 64, 64],
+** Processing line: ~    [3834, 2296, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [3834, 2296, 64, 64],
+** Processing line: ~    [3773, 2295, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [3773, 2295, 64, 64],
+** Processing line: ~    [3710, 2296, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [3710, 2296, 64, 64],
+** Processing line: ~    [3656, 2295, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [3656, 2295, 64, 64],
+** Processing line: ~    [3593, 2294, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [3593, 2294, 64, 64],
+** Processing line: ~    [3527, 2339, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [3527, 2339, 64, 64],
+** Processing line: ~    [3531, 2293, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [3531, 2293, 64, 64],
+** Processing line: ~    [4152, 2903, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [4152, 2903, 64, 64],
+** Processing line: ~    [4155, 2858, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [4155, 2858, 64, 64],
+** Processing line: ~    [3942, 1306, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [3942, 1306, 64, 64],
+** Processing line: ~    [3942, 1279, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [3942, 1279, 64, 64],
+** Processing line: ~    [3879, 1306, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [3879, 1306, 64, 64],
+** Processing line: ~    [3881, 1278, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [3881, 1278, 64, 64],
+** Processing line: ~    [3819, 1305, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [3819, 1305, 64, 64],
+** Processing line: ~    [3819, 1277, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [3819, 1277, 64, 64],
+** Processing line: ~    [3756, 1306, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [3756, 1306, 64, 64],
+** Processing line: ~    [3756, 1277, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [3756, 1277, 64, 64],
+** Processing line: ~    [3694, 1306, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [3694, 1306, 64, 64],
+** Processing line: ~    [3695, 1277, 64, 64],~
 - Inside source: true
 *** True Line Result
     [3695, 1277, 64, 64],
 ** Processing line: ~    [3631, 1306, 64, 64],~
 - Inside source: true
 *** True Line Result
-    [3631, 1306, 64, 64],
-** Processing line: ~    [3632, 1278, 64, 64],~
+    [3631, 1306, 64, 64],
+** Processing line: ~    [3632, 1278, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [3632, 1278, 64, 64],
+** Processing line: ~    [3565, 1306, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [3565, 1306, 64, 64],
+** Processing line: ~    [3567, 1279, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [3567, 1279, 64, 64],
+** Processing line: ~    [4432, 1165, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [4432, 1165, 64, 64],
+** Processing line: ~    [4408, 1163, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [4408, 1163, 64, 64],
+** Processing line: ~    [5123, 1003, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [5123, 1003, 64, 64],
+** Processing line: ~    [5065, 1002, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [5065, 1002, 64, 64],
+** Processing line: ~    [5042, 1002, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [5042, 1002, 64, 64],
+** Processing line: ~    [6020, 1780, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [6020, 1780, 64, 64],
+** Processing line: ~    [6020, 1756, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [6020, 1756, 64, 64],
+** Processing line: ~    [5959, 1780, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [5959, 1780, 64, 64],
+** Processing line: ~    [5959, 1752, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [5959, 1752, 64, 64],
+** Processing line: ~    [5897, 1779, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [5897, 1779, 64, 64],
+** Processing line: ~    [5899, 1752, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [5899, 1752, 64, 64],
+** Processing line: ~    [5836, 1779, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [5836, 1779, 64, 64],
+** Processing line: ~    [5836, 1751, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [5836, 1751, 64, 64],
+** Processing line: ~    [5776, 1780, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [5776, 1780, 64, 64],
+** Processing line: ~    [5776, 1754, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [5776, 1754, 64, 64],
+** Processing line: ~    [5717, 1780, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [5717, 1780, 64, 64],
+** Processing line: ~    [5716, 1752, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [5716, 1752, 64, 64],
+** Processing line: ~    [5658, 1781, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [5658, 1781, 64, 64],
+** Processing line: ~    [5658, 1755, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [5658, 1755, 64, 64],
+** Processing line: ~    [5640, 1781, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [5640, 1781, 64, 64],
+** Processing line: ~    [5640, 1754, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [5640, 1754, 64, 64],
+** Processing line: ~    [5832, 2095, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [5832, 2095, 64, 64],
+** Processing line: ~    [5782, 2093, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [5782, 2093, 64, 64],
+** Processing line: ~    [5832, 2044, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [5832, 2044, 64, 64],
+** Processing line: ~    [5777, 2043, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [5777, 2043, 64, 64],
+** Processing line: ~    [4847, 2577, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [4847, 2577, 64, 64],
+** Processing line: ~    [4795, 2577, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [4795, 2577, 64, 64],
+** Processing line: ~    [4846, 2526, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [4846, 2526, 64, 64],
+** Processing line: ~    [4794, 2526, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [4794, 2526, 64, 64],
+** Processing line: ~    [8390, 923, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [8390, 923, 64, 64],
+** Processing line: ~    [8363, 922, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [8363, 922, 64, 64],
+** Processing line: ~    [7585, 1084, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [7585, 1084, 64, 64],
+** Processing line: ~    [7582, 1058, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [7582, 1058, 64, 64],
+** Processing line: ~    [7525, 1084, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [7525, 1084, 64, 64],
+** Processing line: ~    [7524, 1056, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [7524, 1056, 64, 64],
+** Processing line: ~    [7478, 1085, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [7478, 1085, 64, 64],
+** Processing line: ~    [7476, 1055, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [7476, 1055, 64, 64],
+** Processing line: ~    [7421, 1086, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [7421, 1086, 64, 64],
+** Processing line: ~    [7421, 1052, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [7421, 1052, 64, 64],
+** Processing line: ~    [7362, 1085, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [7362, 1085, 64, 64],
+** Processing line: ~    [7361, 1053, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [7361, 1053, 64, 64],
+** Processing line: ~    [7307, 1087, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [7307, 1087, 64, 64],
+** Processing line: ~    [7307, 1054, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [7307, 1054, 64, 64],
+** Processing line: ~    [7258, 1086, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [7258, 1086, 64, 64],
+** Processing line: ~    [7255, 1058, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [7255, 1058, 64, 64],
+** Processing line: ~    [7203, 1083, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [7203, 1083, 64, 64],
+** Processing line: ~    [7203, 1055, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [7203, 1055, 64, 64],
+** Processing line: ~    [7161, 1085, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [7161, 1085, 64, 64],
+** Processing line: ~    [7158, 1057, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [7158, 1057, 64, 64],
+** Processing line: ~    [7100, 1083, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [7100, 1083, 64, 64],
+** Processing line: ~    [7099, 1058, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [7099, 1058, 64, 64],
+** Processing line: ~    [7038, 1082, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [7038, 1082, 64, 64],
+** Processing line: ~    [7038, 1058, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [7038, 1058, 64, 64],
+** Processing line: ~    [6982, 1083, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [6982, 1083, 64, 64],
+** Processing line: ~    [6984, 1057, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [6984, 1057, 64, 64],
+** Processing line: ~    [0, 0, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [0, 0, 64, 64],
+** Processing line: ~    [0, 1670, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [0, 1670, 64, 64],
+** Processing line: ~    [6691, 1653, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [6691, 1653, 64, 64],
+** Processing line: ~    [1521, 3792, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [1521, 3792, 64, 64],
+** Processing line: ~    [0, 5137, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [0, 5137, 64, 64],
+** Processing line: ~    [0, 0, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [0, 0, 64, 64],
+** Processing line: ~    [0, 1670, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [0, 1670, 64, 64],
+** Processing line: ~    [6691, 1653, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [6691, 1653, 64, 64],
+** Processing line: ~    [1521, 3792, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [1521, 3792, 64, 64],
+** Processing line: ~    [0, 5137, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [0, 5137, 64, 64],
+** Processing line: ~    [0, 0, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [0, 0, 64, 64],
+** Processing line: ~    [0, 1670, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [0, 1670, 64, 64],
+** Processing line: ~    [6691, 1653, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [6691, 1653, 64, 64],
+** Processing line: ~    [1521, 3792, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [1521, 3792, 64, 64],
+** Processing line: ~    [0, 5137, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [0, 5137, 64, 64],
+** Processing line: ~    [8346, 424, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [8346, 424, 64, 64],
+** Processing line: ~    [8407, 376, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [8407, 376, 64, 64],
+** Processing line: ~    [8375, 386, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [8375, 386, 64, 64],
+** Processing line: ~    [8407, 347, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [8407, 347, 64, 64],
+** Processing line: ~    [8388, 343, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [8388, 343, 64, 64],
+** Processing line: ~    [8320, 423, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [8320, 423, 64, 64],
+** Processing line: ~    [8319, 363, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [8319, 363, 64, 64],
+** Processing line: ~    [8368, 303, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [8368, 303, 64, 64],
+** Processing line: ~    [8359, 303, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [8359, 303, 64, 64],
+** Processing line: ~    [8318, 330, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [8318, 330, 64, 64],
+** Processing line: ~    [9369, 425, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [9369, 425, 64, 64],
+** Processing line: ~    [9340, 425, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [9340, 425, 64, 64],
+** Processing line: ~    [9431, 376, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [9431, 376, 64, 64],
+** Processing line: ~    [9414, 382, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [9414, 382, 64, 64],
+** Processing line: ~    [9387, 391, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [9387, 391, 64, 64],
+** Processing line: ~    [9431, 349, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [9431, 349, 64, 64],
+** Processing line: ~    [9412, 344, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [9412, 344, 64, 64],
+** Processing line: ~    [9392, 305, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [9392, 305, 64, 64],
+** Processing line: ~    [9339, 365, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [9339, 365, 64, 64],
+** Processing line: ~    [9341, 333, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [9341, 333, 64, 64],
+** Processing line: ~    [9384, 301, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [9384, 301, 64, 64],
+** Processing line: ~    [7673, 1896, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [7673, 1896, 64, 64],
+** Processing line: ~    [7642, 1834, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [7642, 1834, 64, 64],
+** Processing line: ~    [7646, 1901, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [7646, 1901, 64, 64],
+** Processing line: ~    [4500, 4054, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [4500, 4054, 64, 64],
+** Processing line: ~    [4476, 4055, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [4476, 4055, 64, 64],
+** Processing line: ~    [4459, 3997, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [4459, 3997, 64, 64],
+** Processing line: ~    [76, 5215, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [76, 5215, 64, 64],
+** Processing line: ~    [39, 5217, 64, 64],~
+- Inside source: true
+*** True Line Result
+    [39, 5217, 64, 64],
+** Processing line: ~    [0,       0, 10000, 40],~
+- Inside source: true
+*** True Line Result
+    [0,       0, 10000, 40],
+** Processing line: ~    [0,    1670, 3250, 60],~
+- Inside source: true
+*** True Line Result
+    [0,    1670, 3250, 60],
+** Processing line: ~    [6691, 1653, 3290, 60],~
+- Inside source: true
+*** True Line Result
+    [6691, 1653, 3290, 60],
+** Processing line: ~    [1521, 3792, 7370, 60],~
+- Inside source: true
+*** True Line Result
+    [1521, 3792, 7370, 60],
+** Processing line: ~    [0, 5137, 3290, 60]~
+- Inside source: true
+*** True Line Result
+    [0, 5137, 3290, 60]
+** Processing line: ~  ]~
+- Inside source: true
+*** True Line Result
+  ]
+** Processing line: ~~
+- Inside source: true
+*** True Line Result
+
+** Processing line: ~  $mugs = [~
+- Inside source: true
+*** True Line Result
+  $mugs = [
+** Processing line: ~    [85, 87, 39, 43, "sprites/square-orange.png"],~
+- Inside source: true
+*** True Line Result
+    [85, 87, 39, 43, "sprites/square-orange.png"],
+** Processing line: ~    [958, 1967, 39, 43, "sprites/square-orange.png"],~
+- Inside source: true
+*** True Line Result
+    [958, 1967, 39, 43, "sprites/square-orange.png"],
+** Processing line: ~    [2537, 1734, 39, 43, "sprites/square-orange.png"],~
+- Inside source: true
+*** True Line Result
+    [2537, 1734, 39, 43, "sprites/square-orange.png"],
+** Processing line: ~    [3755, 2464, 39, 43, "sprites/square-orange.png"],~
+- Inside source: true
+*** True Line Result
+    [3755, 2464, 39, 43, "sprites/square-orange.png"],
+** Processing line: ~    [1548, 3273, 39, 43, "sprites/square-orange.png"],~
+- Inside source: true
+*** True Line Result
+    [1548, 3273, 39, 43, "sprites/square-orange.png"],
+** Processing line: ~    [2050, 220, 39, 43, "sprites/square-orange.png"],~
+- Inside source: true
+*** True Line Result
+    [2050, 220, 39, 43, "sprites/square-orange.png"],
+** Processing line: ~    [854, 297, 39, 43, "sprites/square-orange.png"],~
+- Inside source: true
+*** True Line Result
+    [854, 297, 39, 43, "sprites/square-orange.png"],
+** Processing line: ~    [343, 526, 39, 43, "sprites/square-orange.png"],~
+- Inside source: true
+*** True Line Result
+    [343, 526, 39, 43, "sprites/square-orange.png"],
+** Processing line: ~    [3454, 772, 39, 43, "sprites/square-orange.png"],~
+- Inside source: true
+*** True Line Result
+    [3454, 772, 39, 43, "sprites/square-orange.png"],
+** Processing line: ~    [5041, 298, 39, 43, "sprites/square-orange.png"],~
+- Inside source: true
+*** True Line Result
+    [5041, 298, 39, 43, "sprites/square-orange.png"],
+** Processing line: ~    [6089, 300, 39, 43, "sprites/square-orange.png"],~
+- Inside source: true
+*** True Line Result
+    [6089, 300, 39, 43, "sprites/square-orange.png"],
+** Processing line: ~    [6518, 295, 39, 43, "sprites/square-orange.png"],~
+- Inside source: true
+*** True Line Result
+    [6518, 295, 39, 43, "sprites/square-orange.png"],
+** Processing line: ~    [7661, 47, 39, 43, "sprites/square-orange.png"],~
+- Inside source: true
+*** True Line Result
+    [7661, 47, 39, 43, "sprites/square-orange.png"],
+** Processing line: ~    [9392, 1125, 39, 43, "sprites/square-orange.png"],~
+- Inside source: true
+*** True Line Result
+    [9392, 1125, 39, 43, "sprites/square-orange.png"],
+** Processing line: ~    [7298, 1152, 39, 43, "sprites/square-orange.png"],~
+- Inside source: true
+*** True Line Result
+    [7298, 1152, 39, 43, "sprites/square-orange.png"],
+** Processing line: ~    [5816, 1843, 39, 43, "sprites/square-orange.png"],~
+- Inside source: true
+*** True Line Result
+    [5816, 1843, 39, 43, "sprites/square-orange.png"],
+** Processing line: ~    [876, 3772, 39, 43, "sprites/square-orange.png"],~
+- Inside source: true
+*** True Line Result
+    [876, 3772, 39, 43, "sprites/square-orange.png"],
+** Processing line: ~    [1029, 4667, 39, 43, "sprites/square-orange.png"],~
+- Inside source: true
+*** True Line Result
+    [1029, 4667, 39, 43, "sprites/square-orange.png"],
+** Processing line: ~    [823, 5324, 39, 43, "sprites/square-orange.png"],~
+- Inside source: true
+*** True Line Result
+    [823, 5324, 39, 43, "sprites/square-orange.png"],
+** Processing line: ~    [3251, 5220, 39, 43, "sprites/square-orange.png"],~
+- Inside source: true
+*** True Line Result
+    [3251, 5220, 39, 43, "sprites/square-orange.png"],
+** Processing line: ~    [4747, 5282, 39, 43, "sprites/square-orange.png"],~
+- Inside source: true
+*** True Line Result
+    [4747, 5282, 39, 43, "sprites/square-orange.png"],
+** Processing line: ~    [9325, 5178, 39, 43, "sprites/square-orange.png"],~
+- Inside source: true
+*** True Line Result
+    [9325, 5178, 39, 43, "sprites/square-orange.png"],
+** Processing line: ~    [9635, 4298, 39, 43, "sprites/square-orange.png"],~
+- Inside source: true
+*** True Line Result
+    [9635, 4298, 39, 43, "sprites/square-orange.png"],
+** Processing line: ~    [7837, 4127, 39, 43, "sprites/square-orange.png"],~
+- Inside source: true
+*** True Line Result
+    [7837, 4127, 39, 43, "sprites/square-orange.png"],
+** Processing line: ~    [8651, 1971, 39, 43, "sprites/square-orange.png"],~
+- Inside source: true
+*** True Line Result
+    [8651, 1971, 39, 43, "sprites/square-orange.png"],
+** Processing line: ~    [6892, 2031, 39, 43, "sprites/square-orange.png"],~
+- Inside source: true
+*** True Line Result
+    [6892, 2031, 39, 43, "sprites/square-orange.png"],
+** Processing line: ~    [4626, 3882, 39, 43, "sprites/square-orange.png"],~
+- Inside source: true
+*** True Line Result
+    [4626, 3882, 39, 43, "sprites/square-orange.png"],
+** Processing line: ~    [4024, 4554, 39, 43, "sprites/square-orange.png"],~
+- Inside source: true
+*** True Line Result
+    [4024, 4554, 39, 43, "sprites/square-orange.png"],
+** Processing line: ~    [3925, 3337, 39, 43, "sprites/square-orange.png"],~
+- Inside source: true
+*** True Line Result
+    [3925, 3337, 39, 43, "sprites/square-orange.png"],
+** Processing line: ~    [5064, 1064, 39, 43, "sprites/square-orange.png"]~
+- Inside source: true
+*** True Line Result
+    [5064, 1064, 39, 43, "sprites/square-orange.png"]
+** Processing line: ~  ]~
+- Inside source: true
+*** True Line Result
+  ]
+** Processing line: ~~
+- Inside source: true
+*** True Line Result
+
+** Processing line: ~#+end_src~
+- Line was identified as the end of a code block.
+*** True Line Result
+#+end_src
+** Processing line: ~~
+- End of paragraph detected.
+*** True Line Result
+
+** Processing line: ~*** Platformer - Gorillas Basic - credits.txt~
+- Header detected.
+*** True Line Result
+
+*** True Line Result
+*** Platformer - Gorillas Basic - credits.txt
+** Processing line: ~#+begin_src ruby~
+- Line was identified as the beginning of a code block.
+*** True Line Result
+
+*** True Line Result
+#+begin_src ruby
+** Processing line: ~  # ./samples/99_genre_platformer/gorillas_basic/CREDITS.txt~
+- Inside source: true
+*** True Line Result
+  # ./samples/99_genre_platformer/gorillas_basic/CREDITS.txt
+** Processing line: ~  code: Amir Rajan, https://twitter.com/amirrajan~
+- Inside source: true
+*** True Line Result
+  code: Amir Rajan, https://twitter.com/amirrajan
+** Processing line: ~  graphics: Nick Culbertson, https://twitter.com/MobyPixel~
+- Inside source: true
+*** True Line Result
+  graphics: Nick Culbertson, https://twitter.com/MobyPixel
+** Processing line: ~~
+- Inside source: true
+*** True Line Result
+
+** Processing line: ~~
+- Inside source: true
+*** True Line Result
+
+** Processing line: ~#+end_src~
+- Line was identified as the end of a code block.
+*** True Line Result
+#+end_src
+** Processing line: ~~
+- End of paragraph detected.
+*** True Line Result
+
+** Processing line: ~*** Platformer - Gorillas Basic - main.rb~
+- Header detected.
+*** True Line Result
+
+*** True Line Result
+*** Platformer - Gorillas Basic - main.rb
+** Processing line: ~#+begin_src ruby~
+- Line was identified as the beginning of a code block.
+*** True Line Result
+
+*** True Line Result
+#+begin_src ruby
+** Processing line: ~  # ./samples/99_genre_platformer/gorillas_basic/app/main.rb~
+- Inside source: true
+*** True Line Result
+  # ./samples/99_genre_platformer/gorillas_basic/app/main.rb
+** Processing line: ~  class YouSoBasicGorillas~
+- Inside source: true
+*** True Line Result
+  class YouSoBasicGorillas
+** Processing line: ~    attr_accessor :outputs, :grid, :state, :inputs~
+- Inside source: true
+*** True Line Result
+    attr_accessor :outputs, :grid, :state, :inputs
+** Processing line: ~~
+- Inside source: true
+*** True Line Result
+
+** Processing line: ~    def tick~
+- Inside source: true
+*** True Line Result
+    def tick
+** Processing line: ~      defaults~
+- Inside source: true
+*** True Line Result
+      defaults
+** Processing line: ~      render~
+- Inside source: true
+*** True Line Result
+      render
+** Processing line: ~      calc~
+- Inside source: true
+*** True Line Result
+      calc
+** Processing line: ~      process_inputs~
+- Inside source: true
+*** True Line Result
+      process_inputs
+** Processing line: ~    end~
+- Inside source: true
+*** True Line Result
+    end
+** Processing line: ~~
+- Inside source: true
+*** True Line Result
+
+** Processing line: ~    def defaults~
+- Inside source: true
+*** True Line Result
+    def defaults
+** Processing line: ~      outputs.background_color = [33, 32, 87]~
+- Inside source: true
+*** True Line Result
+      outputs.background_color = [33, 32, 87]
+** Processing line: ~      state.building_spacing       = 1~
+- Inside source: true
+*** True Line Result
+      state.building_spacing       = 1
+** Processing line: ~      state.building_room_spacing  = 15~
+- Inside source: true
+*** True Line Result
+      state.building_room_spacing  = 15
+** Processing line: ~      state.building_room_width    = 10~
+- Inside source: true
+*** True Line Result
+      state.building_room_width    = 10
+** Processing line: ~      state.building_room_height   = 15~
+- Inside source: true
+*** True Line Result
+      state.building_room_height   = 15
+** Processing line: ~      state.building_heights       = [4, 4, 6, 8, 15, 20, 18]~
+- Inside source: true
+*** True Line Result
+      state.building_heights       = [4, 4, 6, 8, 15, 20, 18]
+** Processing line: ~      state.building_room_sizes    = [5, 4, 6, 7]~
+- Inside source: true
+*** True Line Result
+      state.building_room_sizes    = [5, 4, 6, 7]
+** Processing line: ~      state.gravity                = 0.25~
+- Inside source: true
+*** True Line Result
+      state.gravity                = 0.25
+** Processing line: ~      state.first_strike         ||= :player_1~
+- Inside source: true
+*** True Line Result
+      state.first_strike         ||= :player_1
+** Processing line: ~      state.buildings            ||= []~
+- Inside source: true
+*** True Line Result
+      state.buildings            ||= []
+** Processing line: ~      state.holes                ||= []~
+- Inside source: true
+*** True Line Result
+      state.holes                ||= []
+** Processing line: ~      state.player_1_score       ||= 0~
+- Inside source: true
+*** True Line Result
+      state.player_1_score       ||= 0
+** Processing line: ~      state.player_2_score       ||= 0~
+- Inside source: true
+*** True Line Result
+      state.player_2_score       ||= 0
+** Processing line: ~      state.wind                 ||= 0~
+- Inside source: true
+*** True Line Result
+      state.wind                 ||= 0
+** Processing line: ~    end~
+- Inside source: true
+*** True Line Result
+    end
+** Processing line: ~~
+- Inside source: true
+*** True Line Result
+
+** Processing line: ~    def render~
+- Inside source: true
+*** True Line Result
+    def render
+** Processing line: ~      render_stage~
+- Inside source: true
+*** True Line Result
+      render_stage
+** Processing line: ~      render_value_insertion~
+- Inside source: true
+*** True Line Result
+      render_value_insertion
+** Processing line: ~      render_gorillas~
+- Inside source: true
+*** True Line Result
+      render_gorillas
+** Processing line: ~      render_holes~
+- Inside source: true
+*** True Line Result
+      render_holes
+** Processing line: ~      render_banana~
+- Inside source: true
+*** True Line Result
+      render_banana
+** Processing line: ~      render_game_over~
+- Inside source: true
+*** True Line Result
+      render_game_over
+** Processing line: ~      render_score~
+- Inside source: true
+*** True Line Result
+      render_score
+** Processing line: ~      render_wind~
+- Inside source: true
+*** True Line Result
+      render_wind
+** Processing line: ~    end~
+- Inside source: true
+*** True Line Result
+    end
+** Processing line: ~~
+- Inside source: true
+*** True Line Result
+
+** Processing line: ~    def render_score~
+- Inside source: true
+*** True Line Result
+    def render_score
+** Processing line: ~      outputs.primitives << [0, 0, 1280, 31, fancy_white].solid~
+- Inside source: true
+*** True Line Result
+      outputs.primitives << [0, 0, 1280, 31, fancy_white].solid
+** Processing line: ~      outputs.primitives << [1, 1, 1279, 29].solid~
+- Inside source: true
+*** True Line Result
+      outputs.primitives << [1, 1, 1279, 29].solid
+** Processing line: ~      outputs.labels << [  10, 25, "Score: #{state.player_1_score}", 0, 0, fancy_white]~
+- Inside source: true
+*** True Line Result
+      outputs.labels << [  10, 25, "Score: #{state.player_1_score}", 0, 0, fancy_white]
+** Processing line: ~      outputs.labels << [1270, 25, "Score: #{state.player_2_score}", 0, 2, fancy_white]~
+- Inside source: true
+*** True Line Result
+      outputs.labels << [1270, 25, "Score: #{state.player_2_score}", 0, 2, fancy_white]
+** Processing line: ~    end~
+- Inside source: true
+*** True Line Result
+    end
+** Processing line: ~~
+- Inside source: true
+*** True Line Result
+
+** Processing line: ~    def render_wind~
+- Inside source: true
+*** True Line Result
+    def render_wind
+** Processing line: ~      outputs.primitives << [640, 12, state.wind * 500 + state.wind * 10 * rand, 4, 35, 136, 162].solid~
+- Inside source: true
+*** True Line Result
+      outputs.primitives << [640, 12, state.wind * 500 + state.wind * 10 * rand, 4, 35, 136, 162].solid
+** Processing line: ~      outputs.lines     <<  [640, 30, 640, 0, fancy_white]~
+- Inside source: true
+*** True Line Result
+      outputs.lines     <<  [640, 30, 640, 0, fancy_white]
+** Processing line: ~    end~
+- Inside source: true
+*** True Line Result
+    end
+** Processing line: ~~
+- Inside source: true
+*** True Line Result
+
+** Processing line: ~    def render_game_over~
+- Inside source: true
+*** True Line Result
+    def render_game_over
+** Processing line: ~      return unless state.over~
+- Inside source: true
+*** True Line Result
+      return unless state.over
+** Processing line: ~      outputs.primitives << [grid.rect, 0, 0, 0, 200].solid~
+- Inside source: true
+*** True Line Result
+      outputs.primitives << [grid.rect, 0, 0, 0, 200].solid
+** Processing line: ~      outputs.primitives << [640, 370, "Game Over!!", 5, 1, fancy_white].label~
+- Inside source: true
+*** True Line Result
+      outputs.primitives << [640, 370, "Game Over!!", 5, 1, fancy_white].label
+** Processing line: ~      if state.winner == :player_1~
+- Inside source: true
+*** True Line Result
+      if state.winner == :player_1
+** Processing line: ~        outputs.primitives << [640, 340, "Player 1 Wins!!", 5, 1, fancy_white].label~
+- Inside source: true
+*** True Line Result
+        outputs.primitives << [640, 340, "Player 1 Wins!!", 5, 1, fancy_white].label
+** Processing line: ~      else~
+- Inside source: true
+*** True Line Result
+      else
+** Processing line: ~        outputs.primitives << [640, 340, "Player 2 Wins!!", 5, 1, fancy_white].label~
+- Inside source: true
+*** True Line Result
+        outputs.primitives << [640, 340, "Player 2 Wins!!", 5, 1, fancy_white].label
+** Processing line: ~      end~
+- Inside source: true
+*** True Line Result
+      end
+** Processing line: ~    end~
+- Inside source: true
+*** True Line Result
+    end
+** Processing line: ~~
+- Inside source: true
+*** True Line Result
+
+** Processing line: ~    def render_stage~
+- Inside source: true
+*** True Line Result
+    def render_stage
+** Processing line: ~      return unless state.stage_generated~
+- Inside source: true
+*** True Line Result
+      return unless state.stage_generated
+** Processing line: ~      return if state.stage_rendered~
+- Inside source: true
+*** True Line Result
+      return if state.stage_rendered
+** Processing line: ~~
+- Inside source: true
+*** True Line Result
+
+** Processing line: ~      outputs.static_solids << [grid.rect, 33, 32, 87]~
+- Inside source: true
+*** True Line Result
+      outputs.static_solids << [grid.rect, 33, 32, 87]
+** Processing line: ~      outputs.static_solids << state.buildings.map(&:solids)~
+- Inside source: true
+*** True Line Result
+      outputs.static_solids << state.buildings.map(&:solids)
+** Processing line: ~      state.stage_rendered = true~
+- Inside source: true
+*** True Line Result
+      state.stage_rendered = true
+** Processing line: ~    end~
+- Inside source: true
+*** True Line Result
+    end
+** Processing line: ~~
+- Inside source: true
+*** True Line Result
+
+** Processing line: ~    def render_gorilla gorilla, id~
+- Inside source: true
+*** True Line Result
+    def render_gorilla gorilla, id
+** Processing line: ~      return unless gorilla~
+- Inside source: true
+*** True Line Result
+      return unless gorilla
+** Processing line: ~      if state.banana && state.banana.owner == gorilla~
+- Inside source: true
+*** True Line Result
+      if state.banana && state.banana.owner == gorilla
+** Processing line: ~        animation_index  = state.banana.created_at.frame_index(3, 5, false)~
+- Inside source: true
+*** True Line Result
+        animation_index  = state.banana.created_at.frame_index(3, 5, false)
+** Processing line: ~      end~
+- Inside source: true
+*** True Line Result
+      end
+** Processing line: ~      if !animation_index~
+- Inside source: true
+*** True Line Result
+      if !animation_index
+** Processing line: ~        outputs.sprites << [gorilla.solid, "sprites/#{id}-idle.png"]~
+- Inside source: true
+*** True Line Result
+        outputs.sprites << [gorilla.solid, "sprites/#{id}-idle.png"]
+** Processing line: ~      else~
+- Inside source: true
+*** True Line Result
+      else
+** Processing line: ~        outputs.sprites << [gorilla.solid, "sprites/#{id}-#{animation_index}.png"]~
+- Inside source: true
+*** True Line Result
+        outputs.sprites << [gorilla.solid, "sprites/#{id}-#{animation_index}.png"]
+** Processing line: ~      end~
+- Inside source: true
+*** True Line Result
+      end
+** Processing line: ~    end~
+- Inside source: true
+*** True Line Result
+    end
+** Processing line: ~~
+- Inside source: true
+*** True Line Result
+
+** Processing line: ~    def render_gorillas~
+- Inside source: true
+*** True Line Result
+    def render_gorillas
+** Processing line: ~      render_gorilla state.player_1, :left~
+- Inside source: true
+*** True Line Result
+      render_gorilla state.player_1, :left
+** Processing line: ~      render_gorilla state.player_2, :right~
+- Inside source: true
+*** True Line Result
+      render_gorilla state.player_2, :right
+** Processing line: ~    end~
+- Inside source: true
+*** True Line Result
+    end
+** Processing line: ~~
+- Inside source: true
+*** True Line Result
+
+** Processing line: ~    def render_value_insertion~
+- Inside source: true
+*** True Line Result
+    def render_value_insertion
+** Processing line: ~      return if state.banana~
+- Inside source: true
+*** True Line Result
+      return if state.banana
+** Processing line: ~      return if state.over~
+- Inside source: true
+*** True Line Result
+      return if state.over
+** Processing line: ~~
+- Inside source: true
+*** True Line Result
+
+** Processing line: ~      if    state.current_turn == :player_1_angle~
+- Inside source: true
+*** True Line Result
+      if    state.current_turn == :player_1_angle
+** Processing line: ~        outputs.labels << [  10, 710, "Angle:    #{state.player_1_angle}_",    fancy_white]~
+- Inside source: true
+*** True Line Result
+        outputs.labels << [  10, 710, "Angle:    #{state.player_1_angle}_",    fancy_white]
+** Processing line: ~      elsif state.current_turn == :player_1_velocity~
+- Inside source: true
+*** True Line Result
+      elsif state.current_turn == :player_1_velocity
+** Processing line: ~        outputs.labels << [  10, 710, "Angle:    #{state.player_1_angle}",     fancy_white]~
+- Inside source: true
+*** True Line Result
+        outputs.labels << [  10, 710, "Angle:    #{state.player_1_angle}",     fancy_white]
+** Processing line: ~        outputs.labels << [  10, 690, "Velocity: #{state.player_1_velocity}_", fancy_white]~
+- Inside source: true
+*** True Line Result
+        outputs.labels << [  10, 690, "Velocity: #{state.player_1_velocity}_", fancy_white]
+** Processing line: ~      elsif state.current_turn == :player_2_angle~
+- Inside source: true
+*** True Line Result
+      elsif state.current_turn == :player_2_angle
+** Processing line: ~        outputs.labels << [1120, 710, "Angle:    #{state.player_2_angle}_",    fancy_white]~
+- Inside source: true
+*** True Line Result
+        outputs.labels << [1120, 710, "Angle:    #{state.player_2_angle}_",    fancy_white]
+** Processing line: ~      elsif state.current_turn == :player_2_velocity~
+- Inside source: true
+*** True Line Result
+      elsif state.current_turn == :player_2_velocity
+** Processing line: ~        outputs.labels << [1120, 710, "Angle:    #{state.player_2_angle}",     fancy_white]~
+- Inside source: true
+*** True Line Result
+        outputs.labels << [1120, 710, "Angle:    #{state.player_2_angle}",     fancy_white]
+** Processing line: ~        outputs.labels << [1120, 690, "Velocity: #{state.player_2_velocity}_", fancy_white]~
+- Inside source: true
+*** True Line Result
+        outputs.labels << [1120, 690, "Velocity: #{state.player_2_velocity}_", fancy_white]
+** Processing line: ~      end~
+- Inside source: true
+*** True Line Result
+      end
+** Processing line: ~    end~
+- Inside source: true
+*** True Line Result
+    end
+** Processing line: ~~
+- Inside source: true
+*** True Line Result
+
+** Processing line: ~    def render_banana~
+- Inside source: true
+*** True Line Result
+    def render_banana
+** Processing line: ~      return unless state.banana~
+- Inside source: true
+*** True Line Result
+      return unless state.banana
+** Processing line: ~      rotation = state.tick_count.%(360) * 20~
+- Inside source: true
+*** True Line Result
+      rotation = state.tick_count.%(360) * 20
+** Processing line: ~      rotation *= -1 if state.banana.dx > 0~
+- Inside source: true
+*** True Line Result
+      rotation *= -1 if state.banana.dx > 0
+** Processing line: ~      outputs.sprites << [state.banana.x, state.banana.y, 15, 15, 'sprites/banana.png', rotation]~
+- Inside source: true
+*** True Line Result
+      outputs.sprites << [state.banana.x, state.banana.y, 15, 15, 'sprites/banana.png', rotation]
+** Processing line: ~    end~
+- Inside source: true
+*** True Line Result
+    end
+** Processing line: ~~
+- Inside source: true
+*** True Line Result
+
+** Processing line: ~    def render_holes~
+- Inside source: true
+*** True Line Result
+    def render_holes
+** Processing line: ~      outputs.sprites << state.holes.map do |s|~
+- Inside source: true
+*** True Line Result
+      outputs.sprites << state.holes.map do |s|
+** Processing line: ~        animation_index = s.created_at.frame_index(7, 3, false)~
+- Inside source: true
+*** True Line Result
+        animation_index = s.created_at.frame_index(7, 3, false)
+** Processing line: ~        if animation_index~
+- Inside source: true
+*** True Line Result
+        if animation_index
+** Processing line: ~          [s.sprite, [s.sprite.rect, "sprites/explosion#{animation_index}.png" ]]~
+- Inside source: true
+*** True Line Result
+          [s.sprite, [s.sprite.rect, "sprites/explosion#{animation_index}.png" ]]
+** Processing line: ~        else~
+- Inside source: true
+*** True Line Result
+        else
+** Processing line: ~          s.sprite~
+- Inside source: true
+*** True Line Result
+          s.sprite
+** Processing line: ~        end~
+- Inside source: true
+*** True Line Result
+        end
+** Processing line: ~      end~
+- Inside source: true
+*** True Line Result
+      end
+** Processing line: ~    end~
+- Inside source: true
+*** True Line Result
+    end
+** Processing line: ~~
+- Inside source: true
+*** True Line Result
+
+** Processing line: ~    def calc~
+- Inside source: true
+*** True Line Result
+    def calc
+** Processing line: ~      calc_generate_stage~
+- Inside source: true
+*** True Line Result
+      calc_generate_stage
+** Processing line: ~      calc_current_turn~
+- Inside source: true
+*** True Line Result
+      calc_current_turn
+** Processing line: ~      calc_banana~
+- Inside source: true
+*** True Line Result
+      calc_banana
+** Processing line: ~    end~
+- Inside source: true
+*** True Line Result
+    end
+** Processing line: ~~
+- Inside source: true
+*** True Line Result
+
+** Processing line: ~    def calc_current_turn~
+- Inside source: true
+*** True Line Result
+    def calc_current_turn
+** Processing line: ~      return if state.current_turn~
+- Inside source: true
+*** True Line Result
+      return if state.current_turn
+** Processing line: ~~
+- Inside source: true
+*** True Line Result
+
+** Processing line: ~      state.current_turn = :player_1_angle~
+- Inside source: true
+*** True Line Result
+      state.current_turn = :player_1_angle
+** Processing line: ~      state.current_turn = :player_2_angle if state.first_strike == :player_2~
+- Inside source: true
+*** True Line Result
+      state.current_turn = :player_2_angle if state.first_strike == :player_2
+** Processing line: ~    end~
+- Inside source: true
+*** True Line Result
+    end
+** Processing line: ~~
+- Inside source: true
+*** True Line Result
+
+** Processing line: ~    def calc_generate_stage~
+- Inside source: true
+*** True Line Result
+    def calc_generate_stage
+** Processing line: ~      return if state.stage_generated~
+- Inside source: true
+*** True Line Result
+      return if state.stage_generated
+** Processing line: ~~
+- Inside source: true
+*** True Line Result
+
+** Processing line: ~      state.buildings << building_prefab(state.building_spacing + -20, *random_building_size)~
+- Inside source: true
+*** True Line Result
+      state.buildings << building_prefab(state.building_spacing + -20, *random_building_size)
+** Processing line: ~      8.numbers.inject(state.buildings) do |buildings, i|~
+- Inside source: true
+*** True Line Result
+      8.numbers.inject(state.buildings) do |buildings, i|
+** Processing line: ~        buildings <<~
+- Inside source: true
+*** True Line Result
+        buildings <<
+** Processing line: ~          building_prefab(state.building_spacing +~
+- Inside source: true
+*** True Line Result
+          building_prefab(state.building_spacing +
+** Processing line: ~                          state.buildings.last.right,~
+- Inside source: true
+*** True Line Result
+                          state.buildings.last.right,
+** Processing line: ~                          *random_building_size)~
+- Inside source: true
+*** True Line Result
+                          *random_building_size)
+** Processing line: ~      end~
+- Inside source: true
+*** True Line Result
+      end
+** Processing line: ~~
+- Inside source: true
+*** True Line Result
+
+** Processing line: ~      building_two = state.buildings[1]~
+- Inside source: true
+*** True Line Result
+      building_two = state.buildings[1]
+** Processing line: ~      state.player_1 = new_player(building_two.x + building_two.w.fdiv(2),~
+- Inside source: true
+*** True Line Result
+      state.player_1 = new_player(building_two.x + building_two.w.fdiv(2),
+** Processing line: ~                                 building_two.h)~
+- Inside source: true
+*** True Line Result
+                                 building_two.h)
+** Processing line: ~~
+- Inside source: true
+*** True Line Result
+
+** Processing line: ~      building_nine = state.buildings[-3]~
+- Inside source: true
+*** True Line Result
+      building_nine = state.buildings[-3]
+** Processing line: ~      state.player_2 = new_player(building_nine.x + building_nine.w.fdiv(2),~
+- Inside source: true
+*** True Line Result
+      state.player_2 = new_player(building_nine.x + building_nine.w.fdiv(2),
+** Processing line: ~                                 building_nine.h)~
+- Inside source: true
+*** True Line Result
+                                 building_nine.h)
+** Processing line: ~      state.stage_generated = true~
+- Inside source: true
+*** True Line Result
+      state.stage_generated = true
+** Processing line: ~      state.wind = 1.randomize(:ratio, :sign)~
+- Inside source: true
+*** True Line Result
+      state.wind = 1.randomize(:ratio, :sign)
+** Processing line: ~    end~
+- Inside source: true
+*** True Line Result
+    end
+** Processing line: ~~
+- Inside source: true
+*** True Line Result
+
+** Processing line: ~    def new_player x, y~
+- Inside source: true
+*** True Line Result
+    def new_player x, y
+** Processing line: ~      state.new_entity(:gorilla) do |p|~
+- Inside source: true
+*** True Line Result
+      state.new_entity(:gorilla) do |p|
+** Processing line: ~        p.x = x - 25~
+- Inside source: true
+*** True Line Result
+        p.x = x - 25
+** Processing line: ~        p.y = y~
+- Inside source: true
+*** True Line Result
+        p.y = y
+** Processing line: ~        p.solid = [p.x, p.y, 50, 50]~
+- Inside source: true
+*** True Line Result
+        p.solid = [p.x, p.y, 50, 50]
+** Processing line: ~      end~
+- Inside source: true
+*** True Line Result
+      end
+** Processing line: ~    end~
+- Inside source: true
+*** True Line Result
+    end
+** Processing line: ~~
+- Inside source: true
+*** True Line Result
+
+** Processing line: ~    def calc_banana~
+- Inside source: true
+*** True Line Result
+    def calc_banana
+** Processing line: ~      return unless state.banana~
+- Inside source: true
+*** True Line Result
+      return unless state.banana
+** Processing line: ~~
+- Inside source: true
+*** True Line Result
+
+** Processing line: ~      state.banana.x  += state.banana.dx~
+- Inside source: true
+*** True Line Result
+      state.banana.x  += state.banana.dx
+** Processing line: ~      state.banana.dx += state.wind.fdiv(50)~
+- Inside source: true
+*** True Line Result
+      state.banana.dx += state.wind.fdiv(50)
+** Processing line: ~      state.banana.y  += state.banana.dy~
+- Inside source: true
+*** True Line Result
+      state.banana.y  += state.banana.dy
+** Processing line: ~      state.banana.dy -= state.gravity~
+- Inside source: true
+*** True Line Result
+      state.banana.dy -= state.gravity
+** Processing line: ~      banana_collision = [state.banana.x, state.banana.y, 10, 10]~
+- Inside source: true
+*** True Line Result
+      banana_collision = [state.banana.x, state.banana.y, 10, 10]
+** Processing line: ~~
+- Inside source: true
+*** True Line Result
+
+** Processing line: ~      if state.player_1 && banana_collision.intersect_rect?(state.player_1.solid)~
+- Inside source: true
+*** True Line Result
+      if state.player_1 && banana_collision.intersect_rect?(state.player_1.solid)
+** Processing line: ~        state.over = true~
+- Inside source: true
+*** True Line Result
+        state.over = true
+** Processing line: ~        if state.banana.owner == state.player_2~
+- Inside source: true
+*** True Line Result
+        if state.banana.owner == state.player_2
+** Processing line: ~          state.winner = :player_2~
+- Inside source: true
+*** True Line Result
+          state.winner = :player_2
+** Processing line: ~        else~
+- Inside source: true
+*** True Line Result
+        else
+** Processing line: ~          state.winner = :player_1~
+- Inside source: true
+*** True Line Result
+          state.winner = :player_1
+** Processing line: ~        end~
+- Inside source: true
+*** True Line Result
+        end
+** Processing line: ~~
+- Inside source: true
+*** True Line Result
+
+** Processing line: ~        state.player_2_score += 1~
+- Inside source: true
+*** True Line Result
+        state.player_2_score += 1
+** Processing line: ~      elsif state.player_2 && banana_collision.intersect_rect?(state.player_2.solid)~
+- Inside source: true
+*** True Line Result
+      elsif state.player_2 && banana_collision.intersect_rect?(state.player_2.solid)
+** Processing line: ~        state.over = true~
+- Inside source: true
+*** True Line Result
+        state.over = true
+** Processing line: ~        if state.banana.owner == state.player_2~
+- Inside source: true
+*** True Line Result
+        if state.banana.owner == state.player_2
+** Processing line: ~          state.winner = :player_1~
+- Inside source: true
+*** True Line Result
+          state.winner = :player_1
+** Processing line: ~        else~
+- Inside source: true
+*** True Line Result
+        else
+** Processing line: ~          state.winner = :player_2~
+- Inside source: true
+*** True Line Result
+          state.winner = :player_2
+** Processing line: ~        end~
+- Inside source: true
+*** True Line Result
+        end
+** Processing line: ~        state.player_1_score += 1~
+- Inside source: true
+*** True Line Result
+        state.player_1_score += 1
+** Processing line: ~      end~
+- Inside source: true
+*** True Line Result
+      end
+** Processing line: ~~
+- Inside source: true
+*** True Line Result
+
+** Processing line: ~      if state.over~
+- Inside source: true
+*** True Line Result
+      if state.over
+** Processing line: ~        place_hole~
+- Inside source: true
+*** True Line Result
+        place_hole
+** Processing line: ~        return~
+- Inside source: true
+*** True Line Result
+        return
+** Processing line: ~      end~
+- Inside source: true
+*** True Line Result
+      end
+** Processing line: ~~
+- Inside source: true
+*** True Line Result
+
+** Processing line: ~      return if state.holes.any? do |h|~
+- Inside source: true
+*** True Line Result
+      return if state.holes.any? do |h|
+** Processing line: ~        h.sprite.scale_rect(0.8, 0.5, 0.5).intersect_rect? [state.banana.x, state.banana.y, 10, 10]~
+- Inside source: true
+*** True Line Result
+        h.sprite.scale_rect(0.8, 0.5, 0.5).intersect_rect? [state.banana.x, state.banana.y, 10, 10]
+** Processing line: ~      end~
+- Inside source: true
+*** True Line Result
+      end
+** Processing line: ~~
+- Inside source: true
+*** True Line Result
+
+** Processing line: ~      return unless state.banana.y < 0 || state.buildings.any? do |b|~
+- Inside source: true
+*** True Line Result
+      return unless state.banana.y < 0 || state.buildings.any? do |b|
+** Processing line: ~        b.rect.intersect_rect? [state.banana.x, state.banana.y, 1, 1]~
 - Inside source: true
 *** True Line Result
-    [3632, 1278, 64, 64],
-** Processing line: ~    [3565, 1306, 64, 64],~
+        b.rect.intersect_rect? [state.banana.x, state.banana.y, 1, 1]
+** Processing line: ~      end~
 - Inside source: true
 *** True Line Result
-    [3565, 1306, 64, 64],
-** Processing line: ~    [3567, 1279, 64, 64],~
+      end
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-    [3567, 1279, 64, 64],
-** Processing line: ~    [4432, 1165, 64, 64],~
+
+** Processing line: ~      place_hole~
 - Inside source: true
 *** True Line Result
-    [4432, 1165, 64, 64],
-** Processing line: ~    [4408, 1163, 64, 64],~
+      place_hole
+** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
-    [4408, 1163, 64, 64],
-** Processing line: ~    [5123, 1003, 64, 64],~
+    end
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-    [5123, 1003, 64, 64],
-** Processing line: ~    [5065, 1002, 64, 64],~
+
+** Processing line: ~    def place_hole~
 - Inside source: true
 *** True Line Result
-    [5065, 1002, 64, 64],
-** Processing line: ~    [5042, 1002, 64, 64],~
+    def place_hole
+** Processing line: ~      return unless state.banana~
 - Inside source: true
 *** True Line Result
-    [5042, 1002, 64, 64],
-** Processing line: ~    [6020, 1780, 64, 64],~
+      return unless state.banana
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-    [6020, 1780, 64, 64],
-** Processing line: ~    [6020, 1756, 64, 64],~
+
+** Processing line: ~      state.holes << state.new_entity(:banana) do |b|~
 - Inside source: true
 *** True Line Result
-    [6020, 1756, 64, 64],
-** Processing line: ~    [5959, 1780, 64, 64],~
+      state.holes << state.new_entity(:banana) do |b|
+** Processing line: ~        b.sprite = [state.banana.x - 20, state.banana.y - 20, 40, 40, 'sprites/hole.png']~
 - Inside source: true
 *** True Line Result
-    [5959, 1780, 64, 64],
-** Processing line: ~    [5959, 1752, 64, 64],~
+        b.sprite = [state.banana.x - 20, state.banana.y - 20, 40, 40, 'sprites/hole.png']
+** Processing line: ~      end~
 - Inside source: true
 *** True Line Result
-    [5959, 1752, 64, 64],
-** Processing line: ~    [5897, 1779, 64, 64],~
+      end
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-    [5897, 1779, 64, 64],
-** Processing line: ~    [5899, 1752, 64, 64],~
+
+** Processing line: ~      state.banana = nil~
 - Inside source: true
 *** True Line Result
-    [5899, 1752, 64, 64],
-** Processing line: ~    [5836, 1779, 64, 64],~
+      state.banana = nil
+** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
-    [5836, 1779, 64, 64],
-** Processing line: ~    [5836, 1751, 64, 64],~
+    end
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-    [5836, 1751, 64, 64],
-** Processing line: ~    [5776, 1780, 64, 64],~
+
+** Processing line: ~    def process_inputs_main~
 - Inside source: true
 *** True Line Result
-    [5776, 1780, 64, 64],
-** Processing line: ~    [5776, 1754, 64, 64],~
+    def process_inputs_main
+** Processing line: ~      return if state.banana~
 - Inside source: true
 *** True Line Result
-    [5776, 1754, 64, 64],
-** Processing line: ~    [5717, 1780, 64, 64],~
+      return if state.banana
+** Processing line: ~      return if state.over~
 - Inside source: true
 *** True Line Result
-    [5717, 1780, 64, 64],
-** Processing line: ~    [5716, 1752, 64, 64],~
+      return if state.over
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-    [5716, 1752, 64, 64],
-** Processing line: ~    [5658, 1781, 64, 64],~
+
+** Processing line: ~      if inputs.keyboard.key_down.enter~
 - Inside source: true
 *** True Line Result
-    [5658, 1781, 64, 64],
-** Processing line: ~    [5658, 1755, 64, 64],~
+      if inputs.keyboard.key_down.enter
+** Processing line: ~        input_execute_turn~
 - Inside source: true
 *** True Line Result
-    [5658, 1755, 64, 64],
-** Processing line: ~    [5640, 1781, 64, 64],~
+        input_execute_turn
+** Processing line: ~      elsif inputs.keyboard.key_down.backspace~
 - Inside source: true
 *** True Line Result
-    [5640, 1781, 64, 64],
-** Processing line: ~    [5640, 1754, 64, 64],~
+      elsif inputs.keyboard.key_down.backspace
+** Processing line: ~        state.as_hash[state.current_turn] ||= ""~
 - Inside source: true
 *** True Line Result
-    [5640, 1754, 64, 64],
-** Processing line: ~    [5832, 2095, 64, 64],~
+        state.as_hash[state.current_turn] ||= ""
+** Processing line: ~        state.as_hash[state.current_turn]   = state.as_hash[state.current_turn][0..-2]~
 - Inside source: true
 *** True Line Result
-    [5832, 2095, 64, 64],
-** Processing line: ~    [5782, 2093, 64, 64],~
+        state.as_hash[state.current_turn]   = state.as_hash[state.current_turn][0..-2]
+** Processing line: ~      elsif inputs.keyboard.key_down.char~
 - Inside source: true
 *** True Line Result
-    [5782, 2093, 64, 64],
-** Processing line: ~    [5832, 2044, 64, 64],~
+      elsif inputs.keyboard.key_down.char
+** Processing line: ~        state.as_hash[state.current_turn] ||= ""~
 - Inside source: true
 *** True Line Result
-    [5832, 2044, 64, 64],
-** Processing line: ~    [5777, 2043, 64, 64],~
+        state.as_hash[state.current_turn] ||= ""
+** Processing line: ~        state.as_hash[state.current_turn]  += inputs.keyboard.key_down.char~
 - Inside source: true
 *** True Line Result
-    [5777, 2043, 64, 64],
-** Processing line: ~    [4847, 2577, 64, 64],~
+        state.as_hash[state.current_turn]  += inputs.keyboard.key_down.char
+** Processing line: ~      end~
 - Inside source: true
 *** True Line Result
-    [4847, 2577, 64, 64],
-** Processing line: ~    [4795, 2577, 64, 64],~
+      end
+** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
-    [4795, 2577, 64, 64],
-** Processing line: ~    [4846, 2526, 64, 64],~
+    end
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-    [4846, 2526, 64, 64],
-** Processing line: ~    [4794, 2526, 64, 64],~
+
+** Processing line: ~    def process_inputs_game_over~
 - Inside source: true
 *** True Line Result
-    [4794, 2526, 64, 64],
-** Processing line: ~    [8390, 923, 64, 64],~
+    def process_inputs_game_over
+** Processing line: ~      return unless state.over~
 - Inside source: true
 *** True Line Result
-    [8390, 923, 64, 64],
-** Processing line: ~    [8363, 922, 64, 64],~
+      return unless state.over
+** Processing line: ~      return unless inputs.keyboard.key_down.truthy_keys.any?~
 - Inside source: true
 *** True Line Result
-    [8363, 922, 64, 64],
-** Processing line: ~    [7585, 1084, 64, 64],~
+      return unless inputs.keyboard.key_down.truthy_keys.any?
+** Processing line: ~      state.over = false~
 - Inside source: true
 *** True Line Result
-    [7585, 1084, 64, 64],
-** Processing line: ~    [7582, 1058, 64, 64],~
+      state.over = false
+** Processing line: ~      outputs.static_solids.clear~
 - Inside source: true
 *** True Line Result
-    [7582, 1058, 64, 64],
-** Processing line: ~    [7525, 1084, 64, 64],~
+      outputs.static_solids.clear
+** Processing line: ~      state.buildings.clear~
 - Inside source: true
 *** True Line Result
-    [7525, 1084, 64, 64],
-** Processing line: ~    [7524, 1056, 64, 64],~
+      state.buildings.clear
+** Processing line: ~      state.holes.clear~
+- Inside source: true
+*** True Line Result
+      state.holes.clear
+** Processing line: ~      state.stage_generated = false~
+- Inside source: true
+*** True Line Result
+      state.stage_generated = false
+** Processing line: ~      state.stage_rendered = false~
+- Inside source: true
+*** True Line Result
+      state.stage_rendered = false
+** Processing line: ~      if state.first_strike == :player_1~
+- Inside source: true
+*** True Line Result
+      if state.first_strike == :player_1
+** Processing line: ~        state.first_strike = :player_2~
+- Inside source: true
+*** True Line Result
+        state.first_strike = :player_2
+** Processing line: ~      else~
+- Inside source: true
+*** True Line Result
+      else
+** Processing line: ~        state.first_strike = :player_1~
+- Inside source: true
+*** True Line Result
+        state.first_strike = :player_1
+** Processing line: ~      end~
+- Inside source: true
+*** True Line Result
+      end
+** Processing line: ~    end~
+- Inside source: true
+*** True Line Result
+    end
+** Processing line: ~~
+- Inside source: true
+*** True Line Result
+
+** Processing line: ~    def process_inputs~
+- Inside source: true
+*** True Line Result
+    def process_inputs
+** Processing line: ~      process_inputs_main~
+- Inside source: true
+*** True Line Result
+      process_inputs_main
+** Processing line: ~      process_inputs_game_over~
+- Inside source: true
+*** True Line Result
+      process_inputs_game_over
+** Processing line: ~    end~
+- Inside source: true
+*** True Line Result
+    end
+** Processing line: ~~
+- Inside source: true
+*** True Line Result
+
+** Processing line: ~    def input_execute_turn~
+- Inside source: true
+*** True Line Result
+    def input_execute_turn
+** Processing line: ~      return if state.banana~
+- Inside source: true
+*** True Line Result
+      return if state.banana
+** Processing line: ~~
+- Inside source: true
+*** True Line Result
+
+** Processing line: ~      if state.current_turn == :player_1_angle && parse_or_clear!(:player_1_angle)~
+- Inside source: true
+*** True Line Result
+      if state.current_turn == :player_1_angle && parse_or_clear!(:player_1_angle)
+** Processing line: ~        state.current_turn = :player_1_velocity~
+- Inside source: true
+*** True Line Result
+        state.current_turn = :player_1_velocity
+** Processing line: ~      elsif state.current_turn == :player_1_velocity && parse_or_clear!(:player_1_velocity)~
+- Inside source: true
+*** True Line Result
+      elsif state.current_turn == :player_1_velocity && parse_or_clear!(:player_1_velocity)
+** Processing line: ~        state.current_turn = :player_2_angle~
+- Inside source: true
+*** True Line Result
+        state.current_turn = :player_2_angle
+** Processing line: ~        state.banana =~
+- Inside source: true
+*** True Line Result
+        state.banana =
+** Processing line: ~          new_banana(state.player_1,~
+- Inside source: true
+*** True Line Result
+          new_banana(state.player_1,
+** Processing line: ~                     state.player_1.x + 25,~
+- Inside source: true
+*** True Line Result
+                     state.player_1.x + 25,
+** Processing line: ~                     state.player_1.y + 60,~
+- Inside source: true
+*** True Line Result
+                     state.player_1.y + 60,
+** Processing line: ~                     state.player_1_angle,~
+- Inside source: true
+*** True Line Result
+                     state.player_1_angle,
+** Processing line: ~                     state.player_1_velocity)~
+- Inside source: true
+*** True Line Result
+                     state.player_1_velocity)
+** Processing line: ~      elsif state.current_turn == :player_2_angle && parse_or_clear!(:player_2_angle)~
+- Inside source: true
+*** True Line Result
+      elsif state.current_turn == :player_2_angle && parse_or_clear!(:player_2_angle)
+** Processing line: ~        state.current_turn = :player_2_velocity~
+- Inside source: true
+*** True Line Result
+        state.current_turn = :player_2_velocity
+** Processing line: ~      elsif state.current_turn == :player_2_velocity && parse_or_clear!(:player_2_velocity)~
+- Inside source: true
+*** True Line Result
+      elsif state.current_turn == :player_2_velocity && parse_or_clear!(:player_2_velocity)
+** Processing line: ~        state.current_turn = :player_1_angle~
+- Inside source: true
+*** True Line Result
+        state.current_turn = :player_1_angle
+** Processing line: ~        state.banana =~
+- Inside source: true
+*** True Line Result
+        state.banana =
+** Processing line: ~          new_banana(state.player_2,~
+- Inside source: true
+*** True Line Result
+          new_banana(state.player_2,
+** Processing line: ~                     state.player_2.x + 25,~
+- Inside source: true
+*** True Line Result
+                     state.player_2.x + 25,
+** Processing line: ~                     state.player_2.y + 60,~
+- Inside source: true
+*** True Line Result
+                     state.player_2.y + 60,
+** Processing line: ~                     180 - state.player_2_angle,~
+- Inside source: true
+*** True Line Result
+                     180 - state.player_2_angle,
+** Processing line: ~                     state.player_2_velocity)~
+- Inside source: true
+*** True Line Result
+                     state.player_2_velocity)
+** Processing line: ~      end~
+- Inside source: true
+*** True Line Result
+      end
+** Processing line: ~~
+- Inside source: true
+*** True Line Result
+
+** Processing line: ~      if state.banana~
+- Inside source: true
+*** True Line Result
+      if state.banana
+** Processing line: ~        state.player_1_angle = nil~
+- Inside source: true
+*** True Line Result
+        state.player_1_angle = nil
+** Processing line: ~        state.player_1_velocity = nil~
+- Inside source: true
+*** True Line Result
+        state.player_1_velocity = nil
+** Processing line: ~        state.player_2_angle = nil~
+- Inside source: true
+*** True Line Result
+        state.player_2_angle = nil
+** Processing line: ~        state.player_2_velocity = nil~
+- Inside source: true
+*** True Line Result
+        state.player_2_velocity = nil
+** Processing line: ~      end~
+- Inside source: true
+*** True Line Result
+      end
+** Processing line: ~    end~
+- Inside source: true
+*** True Line Result
+    end
+** Processing line: ~~
+- Inside source: true
+*** True Line Result
+
+** Processing line: ~    def random_building_size~
+- Inside source: true
+*** True Line Result
+    def random_building_size
+** Processing line: ~      [state.building_heights.sample, state.building_room_sizes.sample]~
+- Inside source: true
+*** True Line Result
+      [state.building_heights.sample, state.building_room_sizes.sample]
+** Processing line: ~    end~
+- Inside source: true
+*** True Line Result
+    end
+** Processing line: ~~
+- Inside source: true
+*** True Line Result
+
+** Processing line: ~    def int? v~
+- Inside source: true
+*** True Line Result
+    def int? v
+** Processing line: ~      v.to_i.to_s == v.to_s~
+- Inside source: true
+*** True Line Result
+      v.to_i.to_s == v.to_s
+** Processing line: ~    end~
+- Inside source: true
+*** True Line Result
+    end
+** Processing line: ~~
+- Inside source: true
+*** True Line Result
+
+** Processing line: ~    def random_building_color~
+- Inside source: true
+*** True Line Result
+    def random_building_color
+** Processing line: ~      [[ 99,   0, 107],~
+- Inside source: true
+*** True Line Result
+      [[ 99,   0, 107],
+** Processing line: ~       [ 35,  64, 124],~
+- Inside source: true
+*** True Line Result
+       [ 35,  64, 124],
+** Processing line: ~       [ 35, 136, 162],~
+- Inside source: true
+*** True Line Result
+       [ 35, 136, 162],
+** Processing line: ~       ].sample~
+- Inside source: true
+*** True Line Result
+       ].sample
+** Processing line: ~    end~
+- Inside source: true
+*** True Line Result
+    end
+** Processing line: ~~
+- Inside source: true
+*** True Line Result
+
+** Processing line: ~    def random_window_color~
+- Inside source: true
+*** True Line Result
+    def random_window_color
+** Processing line: ~      [[ 88,  62, 104],~
+- Inside source: true
+*** True Line Result
+      [[ 88,  62, 104],
+** Processing line: ~       [253, 224, 187]].sample~
+- Inside source: true
+*** True Line Result
+       [253, 224, 187]].sample
+** Processing line: ~    end~
+- Inside source: true
+*** True Line Result
+    end
+** Processing line: ~~
+- Inside source: true
+*** True Line Result
+
+** Processing line: ~    def windows_for_building starting_x, floors, rooms~
+- Inside source: true
+*** True Line Result
+    def windows_for_building starting_x, floors, rooms
+** Processing line: ~      floors.-(1).combinations(rooms - 1).map do |floor, room|~
+- Inside source: true
+*** True Line Result
+      floors.-(1).combinations(rooms - 1).map do |floor, room|
+** Processing line: ~        [starting_x +~
+- Inside source: true
+*** True Line Result
+        [starting_x +
+** Processing line: ~         state.building_room_width.*(room) +~
+- Inside source: true
+*** True Line Result
+         state.building_room_width.*(room) +
+** Processing line: ~         state.building_room_spacing.*(room + 1),~
+- Inside source: true
+*** True Line Result
+         state.building_room_spacing.*(room + 1),
+** Processing line: ~         state.building_room_height.*(floor) +~
+- Inside source: true
+*** True Line Result
+         state.building_room_height.*(floor) +
+** Processing line: ~         state.building_room_spacing.*(floor + 1),~
+- Inside source: true
+*** True Line Result
+         state.building_room_spacing.*(floor + 1),
+** Processing line: ~         state.building_room_width,~
+- Inside source: true
+*** True Line Result
+         state.building_room_width,
+** Processing line: ~         state.building_room_height,~
+- Inside source: true
+*** True Line Result
+         state.building_room_height,
+** Processing line: ~         random_window_color]~
+- Inside source: true
+*** True Line Result
+         random_window_color]
+** Processing line: ~      end~
+- Inside source: true
+*** True Line Result
+      end
+** Processing line: ~    end~
+- Inside source: true
+*** True Line Result
+    end
+** Processing line: ~~
+- Inside source: true
+*** True Line Result
+
+** Processing line: ~    def building_prefab starting_x, floors, rooms~
+- Inside source: true
+*** True Line Result
+    def building_prefab starting_x, floors, rooms
+** Processing line: ~      state.new_entity(:building) do |b|~
+- Inside source: true
+*** True Line Result
+      state.new_entity(:building) do |b|
+** Processing line: ~        b.x      = starting_x~
+- Inside source: true
+*** True Line Result
+        b.x      = starting_x
+** Processing line: ~        b.y      = 0~
+- Inside source: true
+*** True Line Result
+        b.y      = 0
+** Processing line: ~        b.w      = state.building_room_width.*(rooms) +~
+- Inside source: true
+*** True Line Result
+        b.w      = state.building_room_width.*(rooms) +
+** Processing line: ~                   state.building_room_spacing.*(rooms + 1)~
+- Inside source: true
+*** True Line Result
+                   state.building_room_spacing.*(rooms + 1)
+** Processing line: ~        b.h      = state.building_room_height.*(floors) +~
+- Inside source: true
+*** True Line Result
+        b.h      = state.building_room_height.*(floors) +
+** Processing line: ~                   state.building_room_spacing.*(floors + 1)~
+- Inside source: true
+*** True Line Result
+                   state.building_room_spacing.*(floors + 1)
+** Processing line: ~        b.right  = b.x + b.w~
+- Inside source: true
+*** True Line Result
+        b.right  = b.x + b.w
+** Processing line: ~        b.rect   = [b.x, b.y, b.w, b.h]~
+- Inside source: true
+*** True Line Result
+        b.rect   = [b.x, b.y, b.w, b.h]
+** Processing line: ~        b.solids = [[b.x - 1, b.y, b.w + 2, b.h + 1, fancy_white],~
+- Inside source: true
+*** True Line Result
+        b.solids = [[b.x - 1, b.y, b.w + 2, b.h + 1, fancy_white],
+** Processing line: ~                    [b.x, b.y, b.w, b.h, random_building_color],~
+- Inside source: true
+*** True Line Result
+                    [b.x, b.y, b.w, b.h, random_building_color],
+** Processing line: ~                    windows_for_building(b.x, floors, rooms)]~
+- Inside source: true
+*** True Line Result
+                    windows_for_building(b.x, floors, rooms)]
+** Processing line: ~      end~
+- Inside source: true
+*** True Line Result
+      end
+** Processing line: ~    end~
+- Inside source: true
+*** True Line Result
+    end
+** Processing line: ~~
+- Inside source: true
+*** True Line Result
+
+** Processing line: ~    def parse_or_clear! game_prop~
+- Inside source: true
+*** True Line Result
+    def parse_or_clear! game_prop
+** Processing line: ~      if int? state.as_hash[game_prop]~
+- Inside source: true
+*** True Line Result
+      if int? state.as_hash[game_prop]
+** Processing line: ~        state.as_hash[game_prop] = state.as_hash[game_prop].to_i~
+- Inside source: true
+*** True Line Result
+        state.as_hash[game_prop] = state.as_hash[game_prop].to_i
+** Processing line: ~        return true~
+- Inside source: true
+*** True Line Result
+        return true
+** Processing line: ~      end~
+- Inside source: true
+*** True Line Result
+      end
+** Processing line: ~~
+- Inside source: true
+*** True Line Result
+
+** Processing line: ~      state.as_hash[game_prop] = nil~
+- Inside source: true
+*** True Line Result
+      state.as_hash[game_prop] = nil
+** Processing line: ~      return false~
+- Inside source: true
+*** True Line Result
+      return false
+** Processing line: ~    end~
+- Inside source: true
+*** True Line Result
+    end
+** Processing line: ~~
+- Inside source: true
+*** True Line Result
+
+** Processing line: ~    def new_banana owner, x, y, angle, velocity~
+- Inside source: true
+*** True Line Result
+    def new_banana owner, x, y, angle, velocity
+** Processing line: ~      state.new_entity(:banana) do |b|~
+- Inside source: true
+*** True Line Result
+      state.new_entity(:banana) do |b|
+** Processing line: ~        b.owner     = owner~
+- Inside source: true
+*** True Line Result
+        b.owner     = owner
+** Processing line: ~        b.x         = x~
+- Inside source: true
+*** True Line Result
+        b.x         = x
+** Processing line: ~        b.y         = y~
+- Inside source: true
+*** True Line Result
+        b.y         = y
+** Processing line: ~        b.angle     = angle % 360~
+- Inside source: true
+*** True Line Result
+        b.angle     = angle % 360
+** Processing line: ~        b.velocity  = velocity / 5~
+- Inside source: true
+*** True Line Result
+        b.velocity  = velocity / 5
+** Processing line: ~        b.dx        = b.angle.vector_x(b.velocity)~
+- Inside source: true
+*** True Line Result
+        b.dx        = b.angle.vector_x(b.velocity)
+** Processing line: ~        b.dy        = b.angle.vector_y(b.velocity)~
+- Inside source: true
+*** True Line Result
+        b.dy        = b.angle.vector_y(b.velocity)
+** Processing line: ~      end~
+- Inside source: true
+*** True Line Result
+      end
+** Processing line: ~    end~
+- Inside source: true
+*** True Line Result
+    end
+** Processing line: ~~
+- Inside source: true
+*** True Line Result
+
+** Processing line: ~    def fancy_white~
+- Inside source: true
+*** True Line Result
+    def fancy_white
+** Processing line: ~      [253, 252, 253]~
+- Inside source: true
+*** True Line Result
+      [253, 252, 253]
+** Processing line: ~    end~
+- Inside source: true
+*** True Line Result
+    end
+** Processing line: ~  end~
+- Inside source: true
+*** True Line Result
+  end
+** Processing line: ~~
+- Inside source: true
+*** True Line Result
+
+** Processing line: ~  $you_so_basic_gorillas = YouSoBasicGorillas.new~
+- Inside source: true
+*** True Line Result
+  $you_so_basic_gorillas = YouSoBasicGorillas.new
+** Processing line: ~~
+- Inside source: true
+*** True Line Result
+
+** Processing line: ~  def tick args~
+- Inside source: true
+*** True Line Result
+  def tick args
+** Processing line: ~    $you_so_basic_gorillas.outputs = args.outputs~
+- Inside source: true
+*** True Line Result
+    $you_so_basic_gorillas.outputs = args.outputs
+** Processing line: ~    $you_so_basic_gorillas.grid    = args.grid~
+- Inside source: true
+*** True Line Result
+    $you_so_basic_gorillas.grid    = args.grid
+** Processing line: ~    $you_so_basic_gorillas.state    = args.state~
+- Inside source: true
+*** True Line Result
+    $you_so_basic_gorillas.state    = args.state
+** Processing line: ~    $you_so_basic_gorillas.inputs  = args.inputs~
+- Inside source: true
+*** True Line Result
+    $you_so_basic_gorillas.inputs  = args.inputs
+** Processing line: ~    $you_so_basic_gorillas.tick~
+- Inside source: true
+*** True Line Result
+    $you_so_basic_gorillas.tick
+** Processing line: ~  end~
+- Inside source: true
+*** True Line Result
+  end
+** Processing line: ~~
+- Inside source: true
+*** True Line Result
+
+** Processing line: ~#+end_src~
+- Line was identified as the end of a code block.
+*** True Line Result
+#+end_src
+** Processing line: ~~
+- End of paragraph detected.
+*** True Line Result
+
+** Processing line: ~*** Platformer - Gorillas Basic - tests.rb~
+- Header detected.
+*** True Line Result
+
+*** True Line Result
+*** Platformer - Gorillas Basic - tests.rb
+** Processing line: ~#+begin_src ruby~
+- Line was identified as the beginning of a code block.
+*** True Line Result
+
+*** True Line Result
+#+begin_src ruby
+** Processing line: ~  # ./samples/99_genre_platformer/gorillas_basic/app/tests.rb~
+- Inside source: true
+*** True Line Result
+  # ./samples/99_genre_platformer/gorillas_basic/app/tests.rb
+** Processing line: ~  $gtk.reset 100~
+- Inside source: true
+*** True Line Result
+  $gtk.reset 100
+** Processing line: ~  $gtk.supress_framerate_warning = true~
+- Inside source: true
+*** True Line Result
+  $gtk.supress_framerate_warning = true
+** Processing line: ~  $gtk.require 'app/tests/building_generation_tests.rb'~
+- Inside source: true
+*** True Line Result
+  $gtk.require 'app/tests/building_generation_tests.rb'
+** Processing line: ~  $gtk.tests.start~
+- Inside source: true
+*** True Line Result
+  $gtk.tests.start
+** Processing line: ~~
+- Inside source: true
+*** True Line Result
+
+** Processing line: ~#+end_src~
+- Line was identified as the end of a code block.
+*** True Line Result
+#+end_src
+** Processing line: ~~
+- End of paragraph detected.
+*** True Line Result
+
+** Processing line: ~*** Platformer - Gorillas Basic - Tests - building_generation_tests.rb~
+- Header detected.
+*** True Line Result
+
+*** True Line Result
+*** Platformer - Gorillas Basic - Tests - building_generation_tests.rb
+** Processing line: ~#+begin_src ruby~
+- Line was identified as the beginning of a code block.
+*** True Line Result
+
+*** True Line Result
+#+begin_src ruby
+** Processing line: ~  # ./samples/99_genre_platformer/gorillas_basic/app/tests/building_generation_tests.rb~
+- Inside source: true
+*** True Line Result
+  # ./samples/99_genre_platformer/gorillas_basic/app/tests/building_generation_tests.rb
+** Processing line: ~  def test_solids args, assert~
+- Inside source: true
+*** True Line Result
+  def test_solids args, assert
+** Processing line: ~    game = YouSoBasicGorillas.new~
+- Inside source: true
+*** True Line Result
+    game = YouSoBasicGorillas.new
+** Processing line: ~    game.outputs = args.outputs~
+- Inside source: true
+*** True Line Result
+    game.outputs = args.outputs
+** Processing line: ~    game.grid = args.grid~
+- Inside source: true
+*** True Line Result
+    game.grid = args.grid
+** Processing line: ~    game.state = args.state~
+- Inside source: true
+*** True Line Result
+    game.state = args.state
+** Processing line: ~    game.inputs = args.inputs~
+- Inside source: true
+*** True Line Result
+    game.inputs = args.inputs
+** Processing line: ~    game.tick~
+- Inside source: true
+*** True Line Result
+    game.tick
+** Processing line: ~    assert.true! args.state.stage_generated, "stage wasn't generated but it should have been"~
+- Inside source: true
+*** True Line Result
+    assert.true! args.state.stage_generated, "stage wasn't generated but it should have been"
+** Processing line: ~    game.tick~
+- Inside source: true
+*** True Line Result
+    game.tick
+** Processing line: ~    assert.true! args.outputs.static_solids.length > 0, "stage wasn't rendered"~
+- Inside source: true
+*** True Line Result
+    assert.true! args.outputs.static_solids.length > 0, "stage wasn't rendered"
+** Processing line: ~    number_of_building_components = (args.state.buildings.map { |b| 2 + b.solids[2].length }.inject do |sum, v| (sum || 0) + v end)~
+- Inside source: true
+*** True Line Result
+    number_of_building_components = (args.state.buildings.map { |b| 2 + b.solids[2].length }.inject do |sum, v| (sum || 0) + v end)
+** Processing line: ~    the_only_background = 1~
+- Inside source: true
+*** True Line Result
+    the_only_background = 1
+** Processing line: ~    static_solids = args.outputs.static_solids.length~
+- Inside source: true
+*** True Line Result
+    static_solids = args.outputs.static_solids.length
+** Processing line: ~    assert.true! static_solids == the_only_background.+(number_of_building_components), "not all parts of the buildings and background were rendered"~
+- Inside source: true
+*** True Line Result
+    assert.true! static_solids == the_only_background.+(number_of_building_components), "not all parts of the buildings and background were rendered"
+** Processing line: ~  end~
+- Inside source: true
+*** True Line Result
+  end
+** Processing line: ~~
+- Inside source: true
+*** True Line Result
+
+** Processing line: ~#+end_src~
+- Line was identified as the end of a code block.
+*** True Line Result
+#+end_src
+** Processing line: ~~
+- End of paragraph detected.
+*** True Line Result
+
+** Processing line: ~*** Platformer - The Little Probe - main.rb~
+- Header detected.
+*** True Line Result
+
+*** True Line Result
+*** Platformer - The Little Probe - main.rb
+** Processing line: ~#+begin_src ruby~
+- Line was identified as the beginning of a code block.
+*** True Line Result
+
+*** True Line Result
+#+begin_src ruby
+** Processing line: ~  # ./samples/99_genre_platformer/the_little_probe/app/main.rb~
+- Inside source: true
+*** True Line Result
+  # ./samples/99_genre_platformer/the_little_probe/app/main.rb
+** Processing line: ~  class FallingCircle~
+- Inside source: true
+*** True Line Result
+  class FallingCircle
+** Processing line: ~    attr_gtk~
+- Inside source: true
+*** True Line Result
+    attr_gtk
+** Processing line: ~~
+- Inside source: true
+*** True Line Result
+
+** Processing line: ~    def tick~
+- Inside source: true
+*** True Line Result
+    def tick
+** Processing line: ~      fiddle~
+- Inside source: true
+*** True Line Result
+      fiddle
+** Processing line: ~      defaults~
+- Inside source: true
+*** True Line Result
+      defaults
+** Processing line: ~      render~
+- Inside source: true
+*** True Line Result
+      render
+** Processing line: ~      input~
+- Inside source: true
+*** True Line Result
+      input
+** Processing line: ~      calc~
+- Inside source: true
+*** True Line Result
+      calc
+** Processing line: ~    end~
+- Inside source: true
+*** True Line Result
+    end
+** Processing line: ~~
+- Inside source: true
+*** True Line Result
+
+** Processing line: ~    def fiddle~
+- Inside source: true
+*** True Line Result
+    def fiddle
+** Processing line: ~      state.gravity     = -0.02~
+- Inside source: true
+*** True Line Result
+      state.gravity     = -0.02
+** Processing line: ~      circle.radius     = 15~
+- Inside source: true
+*** True Line Result
+      circle.radius     = 15
+** Processing line: ~      circle.elasticity = 0.4~
+- Inside source: true
+*** True Line Result
+      circle.elasticity = 0.4
+** Processing line: ~      camera.follow_speed = 0.4 * 0.4~
+- Inside source: true
+*** True Line Result
+      camera.follow_speed = 0.4 * 0.4
+** Processing line: ~    end~
+- Inside source: true
+*** True Line Result
+    end
+** Processing line: ~~
+- Inside source: true
+*** True Line Result
+
+** Processing line: ~    def render~
+- Inside source: true
+*** True Line Result
+    def render
+** Processing line: ~      render_stage_editor~
+- Inside source: true
+*** True Line Result
+      render_stage_editor
+** Processing line: ~      render_debug~
+- Inside source: true
+*** True Line Result
+      render_debug
+** Processing line: ~      render_game~
+- Inside source: true
+*** True Line Result
+      render_game
+** Processing line: ~    end~
+- Inside source: true
+*** True Line Result
+    end
+** Processing line: ~~
+- Inside source: true
+*** True Line Result
+
+** Processing line: ~    def defaults~
+- Inside source: true
+*** True Line Result
+    def defaults
+** Processing line: ~      if state.tick_count == 0~
+- Inside source: true
+*** True Line Result
+      if state.tick_count == 0
+** Processing line: ~        outputs.sounds << "sounds/bg.ogg"~
+- Inside source: true
+*** True Line Result
+        outputs.sounds << "sounds/bg.ogg"
+** Processing line: ~      end~
+- Inside source: true
+*** True Line Result
+      end
+** Processing line: ~~
+- Inside source: true
+*** True Line Result
+
+** Processing line: ~      state.storyline ||= [~
+- Inside source: true
+*** True Line Result
+      state.storyline ||= [
+** Processing line: ~        { text: "<- -> to aim, hold space to charge",                            distance_gate: 0 },~
+- Inside source: true
+*** True Line Result
+        { text: "<- -> to aim, hold space to charge",                            distance_gate: 0 },
+** Processing line: ~        { text: "the little probe - by @amirrajan, made with DragonRuby Game Toolkit", distance_gate: 0 },~
+- Inside source: true
+*** True Line Result
+        { text: "the little probe - by @amirrajan, made with DragonRuby Game Toolkit", distance_gate: 0 },
+** Processing line: ~        { text: "mission control, this is sasha. landing on europa successful.", distance_gate: 0 },~
+- Inside source: true
+*** True Line Result
+        { text: "mission control, this is sasha. landing on europa successful.", distance_gate: 0 },
+** Processing line: ~        { text: "operation \"find earth 2.0\", initiated at 8-29-2036 14:00.",   distance_gate: 0 },~
+- Inside source: true
+*** True Line Result
+        { text: "operation \"find earth 2.0\", initiated at 8-29-2036 14:00.",   distance_gate: 0 },
+** Processing line: ~        { text: "jupiter's sure is beautiful...",   distance_gate: 4000 },~
+- Inside source: true
+*** True Line Result
+        { text: "jupiter's sure is beautiful...",   distance_gate: 4000 },
+** Processing line: ~        { text: "hmm, it seems there's some kind of anomoly in the sky",   distance_gate: 7000 },~
+- Inside source: true
+*** True Line Result
+        { text: "hmm, it seems there's some kind of anomoly in the sky",   distance_gate: 7000 },
+** Processing line: ~        { text: "dancing lights, i'll call them whisps.",   distance_gate: 8000 },~
+- Inside source: true
+*** True Line Result
+        { text: "dancing lights, i'll call them whisps.",   distance_gate: 8000 },
+** Processing line: ~        { text: "#todo... look i ran out of time -_-",   distance_gate: 9000 },~
+- Inside source: true
+*** True Line Result
+        { text: "#todo... look i ran out of time -_-",   distance_gate: 9000 },
+** Processing line: ~        { text: "there's never enough time",   distance_gate: 9000 },~
+- Inside source: true
+*** True Line Result
+        { text: "there's never enough time",   distance_gate: 9000 },
+** Processing line: ~        { text: "the game jam was fun though ^_^",   distance_gate: 10000 },~
+- Inside source: true
+*** True Line Result
+        { text: "the game jam was fun though ^_^",   distance_gate: 10000 },
+** Processing line: ~      ]~
+- Inside source: true
+*** True Line Result
+      ]
+** Processing line: ~~
+- Inside source: true
+*** True Line Result
+
+** Processing line: ~      load_level force: args.state.tick_count == 0~
+- Inside source: true
+*** True Line Result
+      load_level force: args.state.tick_count == 0
+** Processing line: ~      state.line_mode            ||= :terrain~
+- Inside source: true
+*** True Line Result
+      state.line_mode            ||= :terrain
+** Processing line: ~~
+- Inside source: true
+*** True Line Result
+
+** Processing line: ~      state.sound_index          ||= 1~
 - Inside source: true
 *** True Line Result
-    [7524, 1056, 64, 64],
-** Processing line: ~    [7478, 1085, 64, 64],~
+      state.sound_index          ||= 1
+** Processing line: ~      circle.potential_lift      ||= 0~
 - Inside source: true
 *** True Line Result
-    [7478, 1085, 64, 64],
-** Processing line: ~    [7476, 1055, 64, 64],~
+      circle.potential_lift      ||= 0
+** Processing line: ~      circle.angle               ||= 90~
 - Inside source: true
 *** True Line Result
-    [7476, 1055, 64, 64],
-** Processing line: ~    [7421, 1086, 64, 64],~
+      circle.angle               ||= 90
+** Processing line: ~      circle.check_point_at      ||= -1000~
 - Inside source: true
 *** True Line Result
-    [7421, 1086, 64, 64],
-** Processing line: ~    [7421, 1052, 64, 64],~
+      circle.check_point_at      ||= -1000
+** Processing line: ~      circle.game_over_at        ||= -1000~
 - Inside source: true
 *** True Line Result
-    [7421, 1052, 64, 64],
-** Processing line: ~    [7362, 1085, 64, 64],~
+      circle.game_over_at        ||= -1000
+** Processing line: ~      circle.x                   ||= -485~
 - Inside source: true
 *** True Line Result
-    [7362, 1085, 64, 64],
-** Processing line: ~    [7361, 1053, 64, 64],~
+      circle.x                   ||= -485
+** Processing line: ~      circle.y                   ||= 12226~
 - Inside source: true
 *** True Line Result
-    [7361, 1053, 64, 64],
-** Processing line: ~    [7307, 1087, 64, 64],~
+      circle.y                   ||= 12226
+** Processing line: ~      circle.check_point_x       ||= circle.x~
 - Inside source: true
 *** True Line Result
-    [7307, 1087, 64, 64],
-** Processing line: ~    [7307, 1054, 64, 64],~
+      circle.check_point_x       ||= circle.x
+** Processing line: ~      circle.check_point_y       ||= circle.y~
 - Inside source: true
 *** True Line Result
-    [7307, 1054, 64, 64],
-** Processing line: ~    [7258, 1086, 64, 64],~
+      circle.check_point_y       ||= circle.y
+** Processing line: ~      circle.dy                  ||= 0~
 - Inside source: true
 *** True Line Result
-    [7258, 1086, 64, 64],
-** Processing line: ~    [7255, 1058, 64, 64],~
+      circle.dy                  ||= 0
+** Processing line: ~      circle.dx                  ||= 0~
 - Inside source: true
 *** True Line Result
-    [7255, 1058, 64, 64],
-** Processing line: ~    [7203, 1083, 64, 64],~
+      circle.dx                  ||= 0
+** Processing line: ~      circle.previous_dy         ||= 0~
 - Inside source: true
 *** True Line Result
-    [7203, 1083, 64, 64],
-** Processing line: ~    [7203, 1055, 64, 64],~
+      circle.previous_dy         ||= 0
+** Processing line: ~      circle.previous_dx         ||= 0~
 - Inside source: true
 *** True Line Result
-    [7203, 1055, 64, 64],
-** Processing line: ~    [7161, 1085, 64, 64],~
+      circle.previous_dx         ||= 0
+** Processing line: ~      circle.angle               ||= 0~
 - Inside source: true
 *** True Line Result
-    [7161, 1085, 64, 64],
-** Processing line: ~    [7158, 1057, 64, 64],~
+      circle.angle               ||= 0
+** Processing line: ~      circle.after_images        ||= []~
 - Inside source: true
 *** True Line Result
-    [7158, 1057, 64, 64],
-** Processing line: ~    [7100, 1083, 64, 64],~
+      circle.after_images        ||= []
+** Processing line: ~      circle.terrains_to_monitor ||= {}~
 - Inside source: true
 *** True Line Result
-    [7100, 1083, 64, 64],
-** Processing line: ~    [7099, 1058, 64, 64],~
+      circle.terrains_to_monitor ||= {}
+** Processing line: ~      circle.impact_history      ||= []~
 - Inside source: true
 *** True Line Result
-    [7099, 1058, 64, 64],
-** Processing line: ~    [7038, 1082, 64, 64],~
+      circle.impact_history      ||= []
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-    [7038, 1082, 64, 64],
-** Processing line: ~    [7038, 1058, 64, 64],~
+
+** Processing line: ~      camera.x                   ||= 0~
 - Inside source: true
 *** True Line Result
-    [7038, 1058, 64, 64],
-** Processing line: ~    [6982, 1083, 64, 64],~
+      camera.x                   ||= 0
+** Processing line: ~      camera.y                   ||= 0~
 - Inside source: true
 *** True Line Result
-    [6982, 1083, 64, 64],
-** Processing line: ~    [6984, 1057, 64, 64],~
+      camera.y                   ||= 0
+** Processing line: ~      camera.target_x            ||= 0~
 - Inside source: true
 *** True Line Result
-    [6984, 1057, 64, 64],
-** Processing line: ~    [0, 0, 64, 64],~
+      camera.target_x            ||= 0
+** Processing line: ~      camera.target_y            ||= 0~
 - Inside source: true
 *** True Line Result
-    [0, 0, 64, 64],
-** Processing line: ~    [0, 1670, 64, 64],~
+      camera.target_y            ||= 0
+** Processing line: ~      state.snaps                ||= { }~
 - Inside source: true
 *** True Line Result
-    [0, 1670, 64, 64],
-** Processing line: ~    [6691, 1653, 64, 64],~
+      state.snaps                ||= { }
+** Processing line: ~      state.snap_number            = 10~
 - Inside source: true
 *** True Line Result
-    [6691, 1653, 64, 64],
-** Processing line: ~    [1521, 3792, 64, 64],~
+      state.snap_number            = 10
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-    [1521, 3792, 64, 64],
-** Processing line: ~    [0, 5137, 64, 64],~
+
+** Processing line: ~      args.state.storyline_x ||= -1000~
 - Inside source: true
 *** True Line Result
-    [0, 5137, 64, 64],
-** Processing line: ~    [0, 0, 64, 64],~
+      args.state.storyline_x ||= -1000
+** Processing line: ~      args.state.storyline_y ||= -1000~
 - Inside source: true
 *** True Line Result
-    [0, 0, 64, 64],
-** Processing line: ~    [0, 1670, 64, 64],~
+      args.state.storyline_y ||= -1000
+** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
-    [0, 1670, 64, 64],
-** Processing line: ~    [6691, 1653, 64, 64],~
+    end
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-    [6691, 1653, 64, 64],
-** Processing line: ~    [1521, 3792, 64, 64],~
+
+** Processing line: ~    def render_game~
 - Inside source: true
 *** True Line Result
-    [1521, 3792, 64, 64],
-** Processing line: ~    [0, 5137, 64, 64],~
+    def render_game
+** Processing line: ~      outputs.background_color = [0, 0, 0]~
 - Inside source: true
 *** True Line Result
-    [0, 5137, 64, 64],
-** Processing line: ~    [0, 0, 64, 64],~
+      outputs.background_color = [0, 0, 0]
+** Processing line: ~      outputs.sprites << [-circle.x + 1100,~
 - Inside source: true
 *** True Line Result
-    [0, 0, 64, 64],
-** Processing line: ~    [0, 1670, 64, 64],~
+      outputs.sprites << [-circle.x + 1100,
+** Processing line: ~                          -circle.y - 100,~
 - Inside source: true
 *** True Line Result
-    [0, 1670, 64, 64],
-** Processing line: ~    [6691, 1653, 64, 64],~
+                          -circle.y - 100,
+** Processing line: ~                          2416 * 4,~
 - Inside source: true
 *** True Line Result
-    [6691, 1653, 64, 64],
-** Processing line: ~    [1521, 3792, 64, 64],~
+                          2416 * 4,
+** Processing line: ~                          3574 * 4,~
 - Inside source: true
 *** True Line Result
-    [1521, 3792, 64, 64],
-** Processing line: ~    [0, 5137, 64, 64],~
+                          3574 * 4,
+** Processing line: ~                          'sprites/jupiter.png']~
 - Inside source: true
 *** True Line Result
-    [0, 5137, 64, 64],
-** Processing line: ~    [8346, 424, 64, 64],~
+                          'sprites/jupiter.png']
+** Processing line: ~      outputs.sprites << [-circle.x,~
 - Inside source: true
 *** True Line Result
-    [8346, 424, 64, 64],
-** Processing line: ~    [8407, 376, 64, 64],~
+      outputs.sprites << [-circle.x,
+** Processing line: ~                          -circle.y,~
 - Inside source: true
 *** True Line Result
-    [8407, 376, 64, 64],
-** Processing line: ~    [8375, 386, 64, 64],~
+                          -circle.y,
+** Processing line: ~                          2416 * 4,~
 - Inside source: true
 *** True Line Result
-    [8375, 386, 64, 64],
-** Processing line: ~    [8407, 347, 64, 64],~
+                          2416 * 4,
+** Processing line: ~                          3574 * 4,~
 - Inside source: true
 *** True Line Result
-    [8407, 347, 64, 64],
-** Processing line: ~    [8388, 343, 64, 64],~
+                          3574 * 4,
+** Processing line: ~                          'sprites/level.png']~
 - Inside source: true
 *** True Line Result
-    [8388, 343, 64, 64],
-** Processing line: ~    [8320, 423, 64, 64],~
+                          'sprites/level.png']
+** Processing line: ~      outputs.sprites << state.whisp_queue~
 - Inside source: true
 *** True Line Result
-    [8320, 423, 64, 64],
-** Processing line: ~    [8319, 363, 64, 64],~
+      outputs.sprites << state.whisp_queue
+** Processing line: ~      render_aiming_retical~
 - Inside source: true
 *** True Line Result
-    [8319, 363, 64, 64],
-** Processing line: ~    [8368, 303, 64, 64],~
+      render_aiming_retical
+** Processing line: ~      render_circle~
 - Inside source: true
 *** True Line Result
-    [8368, 303, 64, 64],
-** Processing line: ~    [8359, 303, 64, 64],~
+      render_circle
+** Processing line: ~      render_notification~
 - Inside source: true
 *** True Line Result
-    [8359, 303, 64, 64],
-** Processing line: ~    [8318, 330, 64, 64],~
+      render_notification
+** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
-    [8318, 330, 64, 64],
-** Processing line: ~    [9369, 425, 64, 64],~
+    end
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-    [9369, 425, 64, 64],
-** Processing line: ~    [9340, 425, 64, 64],~
+
+** Processing line: ~    def render_notification~
 - Inside source: true
 *** True Line Result
-    [9340, 425, 64, 64],
-** Processing line: ~    [9431, 376, 64, 64],~
+    def render_notification
+** Processing line: ~      toast_length = 500~
 - Inside source: true
 *** True Line Result
-    [9431, 376, 64, 64],
-** Processing line: ~    [9414, 382, 64, 64],~
+      toast_length = 500
+** Processing line: ~      if circle.game_over_at.elapsed_time < toast_length~
 - Inside source: true
 *** True Line Result
-    [9414, 382, 64, 64],
-** Processing line: ~    [9387, 391, 64, 64],~
+      if circle.game_over_at.elapsed_time < toast_length
+** Processing line: ~        label_text = "..."~
 - Inside source: true
 *** True Line Result
-    [9387, 391, 64, 64],
-** Processing line: ~    [9431, 349, 64, 64],~
+        label_text = "..."
+** Processing line: ~      elsif circle.check_point_at.elapsed_time > toast_length~
 - Inside source: true
 *** True Line Result
-    [9431, 349, 64, 64],
-** Processing line: ~    [9412, 344, 64, 64],~
+      elsif circle.check_point_at.elapsed_time > toast_length
+** Processing line: ~        args.state.current_storyline = nil~
 - Inside source: true
 *** True Line Result
-    [9412, 344, 64, 64],
-** Processing line: ~    [9392, 305, 64, 64],~
+        args.state.current_storyline = nil
+** Processing line: ~        return~
 - Inside source: true
 *** True Line Result
-    [9392, 305, 64, 64],
-** Processing line: ~    [9339, 365, 64, 64],~
+        return
+** Processing line: ~      end~
 - Inside source: true
 *** True Line Result
-    [9339, 365, 64, 64],
-** Processing line: ~    [9341, 333, 64, 64],~
+      end
+** Processing line: ~      if circle.check_point_at &&~
 - Inside source: true
 *** True Line Result
-    [9341, 333, 64, 64],
-** Processing line: ~    [9384, 301, 64, 64],~
+      if circle.check_point_at &&
+** Processing line: ~         circle.check_point_at.elapsed_time == 1 &&~
 - Inside source: true
 *** True Line Result
-    [9384, 301, 64, 64],
-** Processing line: ~    [7673, 1896, 64, 64],~
+         circle.check_point_at.elapsed_time == 1 &&
+** Processing line: ~         !args.state.current_storyline~
 - Inside source: true
 *** True Line Result
-    [7673, 1896, 64, 64],
-** Processing line: ~    [7642, 1834, 64, 64],~
+         !args.state.current_storyline
+** Processing line: ~         if args.state.storyline.length > 0 && args.state.distance_traveled > args.state.storyline[0][:distance_gate]~
 - Inside source: true
 *** True Line Result
-    [7642, 1834, 64, 64],
-** Processing line: ~    [7646, 1901, 64, 64],~
+         if args.state.storyline.length > 0 && args.state.distance_traveled > args.state.storyline[0][:distance_gate]
+** Processing line: ~           args.state.current_storyline = args.state.storyline.shift[:text]~
 - Inside source: true
 *** True Line Result
-    [7646, 1901, 64, 64],
-** Processing line: ~    [4500, 4054, 64, 64],~
+           args.state.current_storyline = args.state.storyline.shift[:text]
+** Processing line: ~           args.state.distance_traveled ||= 0~
 - Inside source: true
 *** True Line Result
-    [4500, 4054, 64, 64],
-** Processing line: ~    [4476, 4055, 64, 64],~
+           args.state.distance_traveled ||= 0
+** Processing line: ~           args.state.storyline_x = circle.x~
 - Inside source: true
 *** True Line Result
-    [4476, 4055, 64, 64],
-** Processing line: ~    [4459, 3997, 64, 64],~
+           args.state.storyline_x = circle.x
+** Processing line: ~           args.state.storyline_y = circle.y~
 - Inside source: true
 *** True Line Result
-    [4459, 3997, 64, 64],
-** Processing line: ~    [76, 5215, 64, 64],~
+           args.state.storyline_y = circle.y
+** Processing line: ~         end~
 - Inside source: true
 *** True Line Result
-    [76, 5215, 64, 64],
-** Processing line: ~    [39, 5217, 64, 64],~
+         end
+** Processing line: ~        return unless args.state.current_storyline~
 - Inside source: true
 *** True Line Result
-    [39, 5217, 64, 64],
-** Processing line: ~  ]~
+        return unless args.state.current_storyline
+** Processing line: ~      end~
 - Inside source: true
 *** True Line Result
-  ]
-** Processing line: ~~
+      end
+** Processing line: ~      label_text = args.state.current_storyline~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~  $mugs = [~
+      label_text = args.state.current_storyline
+** Processing line: ~      return unless label_text~
 - Inside source: true
 *** True Line Result
-  $mugs = [
-** Processing line: ~    [85, 87, 39, 43, "sprites/square-orange.png"],~
+      return unless label_text
+** Processing line: ~      x = circle.x + camera.x~
 - Inside source: true
 *** True Line Result
-    [85, 87, 39, 43, "sprites/square-orange.png"],
-** Processing line: ~    [958, 1967, 39, 43, "sprites/square-orange.png"],~
+      x = circle.x + camera.x
+** Processing line: ~      y = circle.y + camera.y - 40~
 - Inside source: true
 *** True Line Result
-    [958, 1967, 39, 43, "sprites/square-orange.png"],
-** Processing line: ~    [2537, 1734, 39, 43, "sprites/square-orange.png"],~
+      y = circle.y + camera.y - 40
+** Processing line: ~      w = 900~
 - Inside source: true
 *** True Line Result
-    [2537, 1734, 39, 43, "sprites/square-orange.png"],
-** Processing line: ~    [3755, 2464, 39, 43, "sprites/square-orange.png"],~
+      w = 900
+** Processing line: ~      h = 30~
 - Inside source: true
 *** True Line Result
-    [3755, 2464, 39, 43, "sprites/square-orange.png"],
-** Processing line: ~    [1548, 3273, 39, 43, "sprites/square-orange.png"],~
+      h = 30
+** Processing line: ~      outputs.primitives << [x - w.idiv(2), y - h, w, h, 255, 255, 255, 255].solid~
 - Inside source: true
 *** True Line Result
-    [1548, 3273, 39, 43, "sprites/square-orange.png"],
-** Processing line: ~    [2050, 220, 39, 43, "sprites/square-orange.png"],~
+      outputs.primitives << [x - w.idiv(2), y - h, w, h, 255, 255, 255, 255].solid
+** Processing line: ~      outputs.primitives << [x - w.idiv(2), y - h, w, h, 0, 0, 0, 255].border~
 - Inside source: true
 *** True Line Result
-    [2050, 220, 39, 43, "sprites/square-orange.png"],
-** Processing line: ~    [854, 297, 39, 43, "sprites/square-orange.png"],~
+      outputs.primitives << [x - w.idiv(2), y - h, w, h, 0, 0, 0, 255].border
+** Processing line: ~      outputs.labels << [x, y - 4, label_text, 1, 1, 0, 0, 0, 255]~
 - Inside source: true
 *** True Line Result
-    [854, 297, 39, 43, "sprites/square-orange.png"],
-** Processing line: ~    [343, 526, 39, 43, "sprites/square-orange.png"],~
+      outputs.labels << [x, y - 4, label_text, 1, 1, 0, 0, 0, 255]
+** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
-    [343, 526, 39, 43, "sprites/square-orange.png"],
-** Processing line: ~    [3454, 772, 39, 43, "sprites/square-orange.png"],~
+    end
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-    [3454, 772, 39, 43, "sprites/square-orange.png"],
-** Processing line: ~    [5041, 298, 39, 43, "sprites/square-orange.png"],~
+
+** Processing line: ~    def render_aiming_retical~
 - Inside source: true
 *** True Line Result
-    [5041, 298, 39, 43, "sprites/square-orange.png"],
-** Processing line: ~    [6089, 300, 39, 43, "sprites/square-orange.png"],~
+    def render_aiming_retical
+** Processing line: ~      outputs.sprites << [state.camera.x + circle.x + circle.angle.vector_x(circle.potential_lift * 10) - 5,~
 - Inside source: true
 *** True Line Result
-    [6089, 300, 39, 43, "sprites/square-orange.png"],
-** Processing line: ~    [6518, 295, 39, 43, "sprites/square-orange.png"],~
+      outputs.sprites << [state.camera.x + circle.x + circle.angle.vector_x(circle.potential_lift * 10) - 5,
+** Processing line: ~                          state.camera.y + circle.y + circle.angle.vector_y(circle.potential_lift * 10) - 5,~
 - Inside source: true
 *** True Line Result
-    [6518, 295, 39, 43, "sprites/square-orange.png"],
-** Processing line: ~    [7661, 47, 39, 43, "sprites/square-orange.png"],~
+                          state.camera.y + circle.y + circle.angle.vector_y(circle.potential_lift * 10) - 5,
+** Processing line: ~                          10, 10, 'sprites/circle-orange.png']~
 - Inside source: true
 *** True Line Result
-    [7661, 47, 39, 43, "sprites/square-orange.png"],
-** Processing line: ~    [9392, 1125, 39, 43, "sprites/square-orange.png"],~
+                          10, 10, 'sprites/circle-orange.png']
+** Processing line: ~      outputs.sprites << [state.camera.x + circle.x + circle.angle.vector_x(circle.radius * 3) - 5,~
 - Inside source: true
 *** True Line Result
-    [9392, 1125, 39, 43, "sprites/square-orange.png"],
-** Processing line: ~    [7298, 1152, 39, 43, "sprites/square-orange.png"],~
+      outputs.sprites << [state.camera.x + circle.x + circle.angle.vector_x(circle.radius * 3) - 5,
+** Processing line: ~                          state.camera.y + circle.y + circle.angle.vector_y(circle.radius * 3) - 5,~
 - Inside source: true
 *** True Line Result
-    [7298, 1152, 39, 43, "sprites/square-orange.png"],
-** Processing line: ~    [5816, 1843, 39, 43, "sprites/square-orange.png"],~
+                          state.camera.y + circle.y + circle.angle.vector_y(circle.radius * 3) - 5,
+** Processing line: ~                          10, 10, 'sprites/circle-orange.png', 0, 128]~
 - Inside source: true
 *** True Line Result
-    [5816, 1843, 39, 43, "sprites/square-orange.png"],
-** Processing line: ~    [876, 3772, 39, 43, "sprites/square-orange.png"],~
+                          10, 10, 'sprites/circle-orange.png', 0, 128]
+** Processing line: ~      if rand > 0.9~
 - Inside source: true
 *** True Line Result
-    [876, 3772, 39, 43, "sprites/square-orange.png"],
-** Processing line: ~    [1029, 4667, 39, 43, "sprites/square-orange.png"],~
+      if rand > 0.9
+** Processing line: ~        outputs.sprites << [state.camera.x + circle.x + circle.angle.vector_x(circle.radius * 3) - 5,~
 - Inside source: true
 *** True Line Result
-    [1029, 4667, 39, 43, "sprites/square-orange.png"],
-** Processing line: ~    [823, 5324, 39, 43, "sprites/square-orange.png"],~
+        outputs.sprites << [state.camera.x + circle.x + circle.angle.vector_x(circle.radius * 3) - 5,
+** Processing line: ~                            state.camera.y + circle.y + circle.angle.vector_y(circle.radius * 3) - 5,~
 - Inside source: true
 *** True Line Result
-    [823, 5324, 39, 43, "sprites/square-orange.png"],
-** Processing line: ~    [3251, 5220, 39, 43, "sprites/square-orange.png"],~
+                            state.camera.y + circle.y + circle.angle.vector_y(circle.radius * 3) - 5,
+** Processing line: ~                            10, 10, 'sprites/circle-white.png', 0, 128]~
 - Inside source: true
 *** True Line Result
-    [3251, 5220, 39, 43, "sprites/square-orange.png"],
-** Processing line: ~    [4747, 5282, 39, 43, "sprites/square-orange.png"],~
+                            10, 10, 'sprites/circle-white.png', 0, 128]
+** Processing line: ~      end~
 - Inside source: true
 *** True Line Result
-    [4747, 5282, 39, 43, "sprites/square-orange.png"],
-** Processing line: ~    [9325, 5178, 39, 43, "sprites/square-orange.png"],~
+      end
+** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
-    [9325, 5178, 39, 43, "sprites/square-orange.png"],
-** Processing line: ~    [9635, 4298, 39, 43, "sprites/square-orange.png"],~
+    end
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-    [9635, 4298, 39, 43, "sprites/square-orange.png"],
-** Processing line: ~    [7837, 4127, 39, 43, "sprites/square-orange.png"],~
+
+** Processing line: ~    def render_circle~
 - Inside source: true
 *** True Line Result
-    [7837, 4127, 39, 43, "sprites/square-orange.png"],
-** Processing line: ~    [8651, 1971, 39, 43, "sprites/square-orange.png"],~
+    def render_circle
+** Processing line: ~      outputs.sprites << circle.after_images.map do |ai|~
 - Inside source: true
 *** True Line Result
-    [8651, 1971, 39, 43, "sprites/square-orange.png"],
-** Processing line: ~    [6892, 2031, 39, 43, "sprites/square-orange.png"],~
+      outputs.sprites << circle.after_images.map do |ai|
+** Processing line: ~        ai.merge(x: ai.x + state.camera.x - circle.radius,~
 - Inside source: true
 *** True Line Result
-    [6892, 2031, 39, 43, "sprites/square-orange.png"],
-** Processing line: ~    [4626, 3882, 39, 43, "sprites/square-orange.png"],~
+        ai.merge(x: ai.x + state.camera.x - circle.radius,
+** Processing line: ~                 y: ai.y + state.camera.y - circle.radius,~
 - Inside source: true
 *** True Line Result
-    [4626, 3882, 39, 43, "sprites/square-orange.png"],
-** Processing line: ~    [4024, 4554, 39, 43, "sprites/square-orange.png"],~
+                 y: ai.y + state.camera.y - circle.radius,
+** Processing line: ~                 w: circle.radius * 2,~
 - Inside source: true
 *** True Line Result
-    [4024, 4554, 39, 43, "sprites/square-orange.png"],
-** Processing line: ~    [3925, 3337, 39, 43, "sprites/square-orange.png"],~
+                 w: circle.radius * 2,
+** Processing line: ~                 h: circle.radius * 2,~
 - Inside source: true
 *** True Line Result
-    [3925, 3337, 39, 43, "sprites/square-orange.png"],
-** Processing line: ~    [5064, 1064, 39, 43, "sprites/square-orange.png"]~
+                 h: circle.radius * 2,
+** Processing line: ~                 path: 'sprites/circle-white.png')~
 - Inside source: true
 *** True Line Result
-    [5064, 1064, 39, 43, "sprites/square-orange.png"]
-** Processing line: ~  ]~
+                 path: 'sprites/circle-white.png')
+** Processing line: ~      end~
 - Inside source: true
 *** True Line Result
-  ]
+      end
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~#+end_src~
-- Line was identified as the end of a code block.
+** Processing line: ~      outputs.sprites << [(circle.x - circle.radius) + state.camera.x,~
+- Inside source: true
 *** True Line Result
-#+end_src
-** Processing line: ~~
-- End of paragraph detected.
+      outputs.sprites << [(circle.x - circle.radius) + state.camera.x,
+** Processing line: ~                          (circle.y - circle.radius) + state.camera.y,~
+- Inside source: true
 *** True Line Result
-
-** Processing line: ~*** Platformer - Gorillas Basic - credits.txt~
-- Header detected.
+                          (circle.y - circle.radius) + state.camera.y,
+** Processing line: ~                          circle.radius * 2,~
+- Inside source: true
 *** True Line Result
-
+                          circle.radius * 2,
+** Processing line: ~                          circle.radius * 2,~
+- Inside source: true
 *** True Line Result
-*** Platformer - Gorillas Basic - credits.txt
-** Processing line: ~#+begin_src ruby~
-- Line was identified as the beginning of a code block.
+                          circle.radius * 2,
+** Processing line: ~                          'sprites/probe.png']~
+- Inside source: true
 *** True Line Result
-
+                          'sprites/probe.png']
+** Processing line: ~    end~
+- Inside source: true
 *** True Line Result
-#+begin_src ruby
-** Processing line: ~  # ./samples/99_genre_platformer/gorillas_basic/CREDITS.txt~
+    end
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-  # ./samples/99_genre_platformer/gorillas_basic/CREDITS.txt
-** Processing line: ~  code: Amir Rajan, https://twitter.com/amirrajan~
+
+** Processing line: ~    def render_debug~
 - Inside source: true
 *** True Line Result
-  code: Amir Rajan, https://twitter.com/amirrajan
-** Processing line: ~  graphics: Nick Culbertson, https://twitter.com/MobyPixel~
+    def render_debug
+** Processing line: ~      return unless state.debug_mode~
 - Inside source: true
 *** True Line Result
-  graphics: Nick Culbertson, https://twitter.com/MobyPixel
+      return unless state.debug_mode
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~~
+** Processing line: ~      outputs.labels << [10, 30, state.line_mode, 0, 0, 0, 0, 0]~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~#+end_src~
-- Line was identified as the end of a code block.
+      outputs.labels << [10, 30, state.line_mode, 0, 0, 0, 0, 0]
+** Processing line: ~      outputs.labels << [12, 32, state.line_mode, 0, 0, 255, 255, 255]~
+- Inside source: true
 *** True Line Result
-#+end_src
+      outputs.labels << [12, 32, state.line_mode, 0, 0, 255, 255, 255]
 ** Processing line: ~~
-- End of paragraph detected.
-*** True Line Result
-
-** Processing line: ~*** Platformer - Gorillas Basic - main.rb~
-- Header detected.
+- Inside source: true
 *** True Line Result
 
+** Processing line: ~      args.outputs.lines << trajectory(circle).line.to_hash.tap do |h|~
+- Inside source: true
 *** True Line Result
-*** Platformer - Gorillas Basic - main.rb
-** Processing line: ~#+begin_src ruby~
-- Line was identified as the beginning of a code block.
+      args.outputs.lines << trajectory(circle).line.to_hash.tap do |h|
+** Processing line: ~        h[:x] += state.camera.x~
+- Inside source: true
 *** True Line Result
-
+        h[:x] += state.camera.x
+** Processing line: ~        h[:y] += state.camera.y~
+- Inside source: true
 *** True Line Result
-#+begin_src ruby
-** Processing line: ~  # ./samples/99_genre_platformer/gorillas_basic/app/main.rb~
+        h[:y] += state.camera.y
+** Processing line: ~        h[:x2] += state.camera.x~
 - Inside source: true
 *** True Line Result
-  # ./samples/99_genre_platformer/gorillas_basic/app/main.rb
-** Processing line: ~  class YouSoBasicGorillas~
+        h[:x2] += state.camera.x
+** Processing line: ~        h[:y2] += state.camera.y~
 - Inside source: true
 *** True Line Result
-  class YouSoBasicGorillas
-** Processing line: ~    attr_accessor :outputs, :grid, :state, :inputs~
+        h[:y2] += state.camera.y
+** Processing line: ~      end~
 - Inside source: true
 *** True Line Result
-    attr_accessor :outputs, :grid, :state, :inputs
+      end
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~    def tick~
+** Processing line: ~      outputs.primitives << state.terrain.find_all do |t|~
 - Inside source: true
 *** True Line Result
-    def tick
-** Processing line: ~      defaults~
+      outputs.primitives << state.terrain.find_all do |t|
+** Processing line: ~        circle.x.between?(t.x - 640, t.x2 + 640) || circle.y.between?(t.y - 360, t.y2 + 360)~
 - Inside source: true
 *** True Line Result
-      defaults
-** Processing line: ~      render~
+        circle.x.between?(t.x - 640, t.x2 + 640) || circle.y.between?(t.y - 360, t.y2 + 360)
+** Processing line: ~      end.map do |t|~
 - Inside source: true
 *** True Line Result
-      render
-** Processing line: ~      calc~
+      end.map do |t|
+** Processing line: ~        [~
 - Inside source: true
 *** True Line Result
-      calc
-** Processing line: ~      process_inputs~
+        [
+** Processing line: ~          t.line.associate(r: 0, g: 255, b: 0) do |h|~
 - Inside source: true
 *** True Line Result
-      process_inputs
-** Processing line: ~    end~
+          t.line.associate(r: 0, g: 255, b: 0) do |h|
+** Processing line: ~            h.x  += state.camera.x~
 - Inside source: true
 *** True Line Result
-    end
-** Processing line: ~~
+            h.x  += state.camera.x
+** Processing line: ~            h.y  += state.camera.y~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~    def defaults~
+            h.y  += state.camera.y
+** Processing line: ~            h.x2 += state.camera.x~
 - Inside source: true
 *** True Line Result
-    def defaults
-** Processing line: ~      outputs.background_color = [33, 32, 87]~
+            h.x2 += state.camera.x
+** Processing line: ~            h.y2 += state.camera.y~
 - Inside source: true
 *** True Line Result
-      outputs.background_color = [33, 32, 87]
-** Processing line: ~      state.building_spacing       = 1~
+            h.y2 += state.camera.y
+** Processing line: ~            if circle.rect.intersect_rect? t[:rect]~
 - Inside source: true
 *** True Line Result
-      state.building_spacing       = 1
-** Processing line: ~      state.building_room_spacing  = 15~
+            if circle.rect.intersect_rect? t[:rect]
+** Processing line: ~              h[:r] = 255~
 - Inside source: true
 *** True Line Result
-      state.building_room_spacing  = 15
-** Processing line: ~      state.building_room_width    = 10~
+              h[:r] = 255
+** Processing line: ~              h[:g] = 0~
 - Inside source: true
 *** True Line Result
-      state.building_room_width    = 10
-** Processing line: ~      state.building_room_height   = 15~
+              h[:g] = 0
+** Processing line: ~            end~
 - Inside source: true
 *** True Line Result
-      state.building_room_height   = 15
-** Processing line: ~      state.building_heights       = [4, 4, 6, 8, 15, 20, 18]~
+            end
+** Processing line: ~            h~
 - Inside source: true
 *** True Line Result
-      state.building_heights       = [4, 4, 6, 8, 15, 20, 18]
-** Processing line: ~      state.building_room_sizes    = [5, 4, 6, 7]~
+            h
+** Processing line: ~          end,~
 - Inside source: true
 *** True Line Result
-      state.building_room_sizes    = [5, 4, 6, 7]
-** Processing line: ~      state.gravity                = 0.25~
+          end,
+** Processing line: ~          t[:rect].border.associate(r: 255, g: 0, b: 0) do |h|~
 - Inside source: true
 *** True Line Result
-      state.gravity                = 0.25
-** Processing line: ~      state.first_strike         ||= :player_1~
+          t[:rect].border.associate(r: 255, g: 0, b: 0) do |h|
+** Processing line: ~            h.x += state.camera.x~
 - Inside source: true
 *** True Line Result
-      state.first_strike         ||= :player_1
-** Processing line: ~      state.buildings            ||= []~
+            h.x += state.camera.x
+** Processing line: ~            h.y += state.camera.y~
 - Inside source: true
 *** True Line Result
-      state.buildings            ||= []
-** Processing line: ~      state.holes                ||= []~
+            h.y += state.camera.y
+** Processing line: ~            h.b = 255 if line_near_rect? circle.rect, t~
 - Inside source: true
 *** True Line Result
-      state.holes                ||= []
-** Processing line: ~      state.player_1_score       ||= 0~
+            h.b = 255 if line_near_rect? circle.rect, t
+** Processing line: ~            h~
 - Inside source: true
 *** True Line Result
-      state.player_1_score       ||= 0
-** Processing line: ~      state.player_2_score       ||= 0~
+            h
+** Processing line: ~          end~
 - Inside source: true
 *** True Line Result
-      state.player_2_score       ||= 0
-** Processing line: ~      state.wind                 ||= 0~
+          end
+** Processing line: ~        ]~
 - Inside source: true
 *** True Line Result
-      state.wind                 ||= 0
-** Processing line: ~    end~
+        ]
+** Processing line: ~      end~
 - Inside source: true
 *** True Line Result
-    end
+      end
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~    def render~
+** Processing line: ~      outputs.primitives << state.lava.find_all do |t|~
 - Inside source: true
 *** True Line Result
-    def render
-** Processing line: ~      render_stage~
+      outputs.primitives << state.lava.find_all do |t|
+** Processing line: ~        circle.x.between?(t.x - 640, t.x2 + 640) || circle.y.between?(t.y - 360, t.y2 + 360)~
 - Inside source: true
 *** True Line Result
-      render_stage
-** Processing line: ~      render_value_insertion~
+        circle.x.between?(t.x - 640, t.x2 + 640) || circle.y.between?(t.y - 360, t.y2 + 360)
+** Processing line: ~      end.map do |t|~
 - Inside source: true
 *** True Line Result
-      render_value_insertion
-** Processing line: ~      render_gorillas~
+      end.map do |t|
+** Processing line: ~        [~
 - Inside source: true
 *** True Line Result
-      render_gorillas
-** Processing line: ~      render_holes~
+        [
+** Processing line: ~          t.line.associate(r: 0, g: 0, b: 255) do |h|~
 - Inside source: true
 *** True Line Result
-      render_holes
-** Processing line: ~      render_banana~
+          t.line.associate(r: 0, g: 0, b: 255) do |h|
+** Processing line: ~            h.x  += state.camera.x~
 - Inside source: true
 *** True Line Result
-      render_banana
-** Processing line: ~      render_game_over~
+            h.x  += state.camera.x
+** Processing line: ~            h.y  += state.camera.y~
 - Inside source: true
 *** True Line Result
-      render_game_over
-** Processing line: ~      render_score~
+            h.y  += state.camera.y
+** Processing line: ~            h.x2 += state.camera.x~
 - Inside source: true
 *** True Line Result
-      render_score
-** Processing line: ~      render_wind~
+            h.x2 += state.camera.x
+** Processing line: ~            h.y2 += state.camera.y~
 - Inside source: true
 *** True Line Result
-      render_wind
-** Processing line: ~    end~
+            h.y2 += state.camera.y
+** Processing line: ~            if circle.rect.intersect_rect? t[:rect]~
 - Inside source: true
 *** True Line Result
-    end
-** Processing line: ~~
+            if circle.rect.intersect_rect? t[:rect]
+** Processing line: ~              h[:r] = 255~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~    def render_score~
+              h[:r] = 255
+** Processing line: ~              h[:b] = 0~
 - Inside source: true
 *** True Line Result
-    def render_score
-** Processing line: ~      outputs.primitives << [0, 0, 1280, 31, fancy_white].solid~
+              h[:b] = 0
+** Processing line: ~            end~
 - Inside source: true
 *** True Line Result
-      outputs.primitives << [0, 0, 1280, 31, fancy_white].solid
-** Processing line: ~      outputs.primitives << [1, 1, 1279, 29].solid~
+            end
+** Processing line: ~            h~
 - Inside source: true
 *** True Line Result
-      outputs.primitives << [1, 1, 1279, 29].solid
-** Processing line: ~      outputs.labels << [  10, 25, "Score: #{state.player_1_score}", 0, 0, fancy_white]~
+            h
+** Processing line: ~          end,~
 - Inside source: true
 *** True Line Result
-      outputs.labels << [  10, 25, "Score: #{state.player_1_score}", 0, 0, fancy_white]
-** Processing line: ~      outputs.labels << [1270, 25, "Score: #{state.player_2_score}", 0, 2, fancy_white]~
+          end,
+** Processing line: ~          t[:rect].border.associate(r: 255, g: 0, b: 0) do |h|~
 - Inside source: true
 *** True Line Result
-      outputs.labels << [1270, 25, "Score: #{state.player_2_score}", 0, 2, fancy_white]
-** Processing line: ~    end~
+          t[:rect].border.associate(r: 255, g: 0, b: 0) do |h|
+** Processing line: ~            h.x += state.camera.x~
 - Inside source: true
 *** True Line Result
-    end
-** Processing line: ~~
+            h.x += state.camera.x
+** Processing line: ~            h.y += state.camera.y~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~    def render_wind~
+            h.y += state.camera.y
+** Processing line: ~            h.b = 255 if line_near_rect? circle.rect, t~
 - Inside source: true
 *** True Line Result
-    def render_wind
-** Processing line: ~      outputs.primitives << [640, 12, state.wind * 500 + state.wind * 10 * rand, 4, 35, 136, 162].solid~
+            h.b = 255 if line_near_rect? circle.rect, t
+** Processing line: ~            h~
 - Inside source: true
 *** True Line Result
-      outputs.primitives << [640, 12, state.wind * 500 + state.wind * 10 * rand, 4, 35, 136, 162].solid
-** Processing line: ~      outputs.lines     <<  [640, 30, 640, 0, fancy_white]~
+            h
+** Processing line: ~          end~
 - Inside source: true
 *** True Line Result
-      outputs.lines     <<  [640, 30, 640, 0, fancy_white]
-** Processing line: ~    end~
+          end
+** Processing line: ~        ]~
 - Inside source: true
 *** True Line Result
-    end
+        ]
+** Processing line: ~      end~
+- Inside source: true
+*** True Line Result
+      end
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~    def render_game_over~
+** Processing line: ~      if state.god_mode~
 - Inside source: true
 *** True Line Result
-    def render_game_over
-** Processing line: ~      return unless state.over~
+      if state.god_mode
+** Processing line: ~        border = circle.rect.merge(x: circle.rect.x + state.camera.x,~
 - Inside source: true
 *** True Line Result
-      return unless state.over
-** Processing line: ~      outputs.primitives << [grid.rect, 0, 0, 0, 200].solid~
+        border = circle.rect.merge(x: circle.rect.x + state.camera.x,
+** Processing line: ~                                   y: circle.rect.y + state.camera.y,~
 - Inside source: true
 *** True Line Result
-      outputs.primitives << [grid.rect, 0, 0, 0, 200].solid
-** Processing line: ~      outputs.primitives << [640, 370, "Game Over!!", 5, 1, fancy_white].label~
+                                   y: circle.rect.y + state.camera.y,
+** Processing line: ~                                   g: 255)~
 - Inside source: true
 *** True Line Result
-      outputs.primitives << [640, 370, "Game Over!!", 5, 1, fancy_white].label
-** Processing line: ~      if state.winner == :player_1~
+                                   g: 255)
+** Processing line: ~      else~
 - Inside source: true
 *** True Line Result
-      if state.winner == :player_1
-** Processing line: ~        outputs.primitives << [640, 340, "Player 1 Wins!!", 5, 1, fancy_white].label~
+      else
+** Processing line: ~        border = circle.rect.merge(x: circle.rect.x + state.camera.x,~
 - Inside source: true
 *** True Line Result
-        outputs.primitives << [640, 340, "Player 1 Wins!!", 5, 1, fancy_white].label
-** Processing line: ~      else~
+        border = circle.rect.merge(x: circle.rect.x + state.camera.x,
+** Processing line: ~                                   y: circle.rect.y + state.camera.y,~
 - Inside source: true
 *** True Line Result
-      else
-** Processing line: ~        outputs.primitives << [640, 340, "Player 2 Wins!!", 5, 1, fancy_white].label~
+                                   y: circle.rect.y + state.camera.y,
+** Processing line: ~                                   b: 255)~
 - Inside source: true
 *** True Line Result
-        outputs.primitives << [640, 340, "Player 2 Wins!!", 5, 1, fancy_white].label
+                                   b: 255)
 ** Processing line: ~      end~
 - Inside source: true
 *** True Line Result
       end
-** Processing line: ~    end~
-- Inside source: true
-*** True Line Result
-    end
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~    def render_stage~
+** Processing line: ~      outputs.borders << border~
 - Inside source: true
 *** True Line Result
-    def render_stage
-** Processing line: ~      return unless state.stage_generated~
+      outputs.borders << border
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-      return unless state.stage_generated
-** Processing line: ~      return if state.stage_rendered~
+
+** Processing line: ~      overlapping ||= {}~
 - Inside source: true
 *** True Line Result
-      return if state.stage_rendered
+      overlapping ||= {}
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~      outputs.static_solids << [grid.rect, 33, 32, 87]~
+** Processing line: ~      circle.impact_history.each do |h|~
 - Inside source: true
 *** True Line Result
-      outputs.static_solids << [grid.rect, 33, 32, 87]
-** Processing line: ~      outputs.static_solids << state.buildings.map(&:solids)~
+      circle.impact_history.each do |h|
+** Processing line: ~        label_mod = 300~
 - Inside source: true
 *** True Line Result
-      outputs.static_solids << state.buildings.map(&:solids)
-** Processing line: ~      state.stage_rendered = true~
+        label_mod = 300
+** Processing line: ~        x = (h[:body][:x].-(150).idiv(label_mod)) * label_mod + camera.x~
 - Inside source: true
 *** True Line Result
-      state.stage_rendered = true
-** Processing line: ~    end~
+        x = (h[:body][:x].-(150).idiv(label_mod)) * label_mod + camera.x
+** Processing line: ~        y = (h[:body][:y].+(150).idiv(label_mod)) * label_mod + camera.y~
 - Inside source: true
 *** True Line Result
-    end
-** Processing line: ~~
+        y = (h[:body][:y].+(150).idiv(label_mod)) * label_mod + camera.y
+** Processing line: ~        10.times do~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~    def render_gorilla gorilla, id~
+        10.times do
+** Processing line: ~          if overlapping[x] && overlapping[x][y]~
 - Inside source: true
 *** True Line Result
-    def render_gorilla gorilla, id
-** Processing line: ~      return unless gorilla~
+          if overlapping[x] && overlapping[x][y]
+** Processing line: ~            y -= 52~
 - Inside source: true
 *** True Line Result
-      return unless gorilla
-** Processing line: ~      if state.banana && state.banana.owner == gorilla~
+            y -= 52
+** Processing line: ~          else~
 - Inside source: true
 *** True Line Result
-      if state.banana && state.banana.owner == gorilla
-** Processing line: ~        animation_index  = state.banana.created_at.frame_index(3, 5, false)~
+          else
+** Processing line: ~            break~
 - Inside source: true
 *** True Line Result
-        animation_index  = state.banana.created_at.frame_index(3, 5, false)
-** Processing line: ~      end~
+            break
+** Processing line: ~          end~
 - Inside source: true
 *** True Line Result
-      end
-** Processing line: ~      if !animation_index~
+          end
+** Processing line: ~        end~
 - Inside source: true
 *** True Line Result
-      if !animation_index
-** Processing line: ~        outputs.sprites << [gorilla.solid, "sprites/#{id}-idle.png"]~
+        end
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-        outputs.sprites << [gorilla.solid, "sprites/#{id}-idle.png"]
-** Processing line: ~      else~
+
+** Processing line: ~        overlapping[x] ||= {}~
 - Inside source: true
 *** True Line Result
-      else
-** Processing line: ~        outputs.sprites << [gorilla.solid, "sprites/#{id}-#{animation_index}.png"]~
+        overlapping[x] ||= {}
+** Processing line: ~        overlapping[x][y] ||= true~
 - Inside source: true
 *** True Line Result
-        outputs.sprites << [gorilla.solid, "sprites/#{id}-#{animation_index}.png"]
-** Processing line: ~      end~
+        overlapping[x][y] ||= true
+** Processing line: ~        outputs.primitives << [x, y - 25, 300, 50, 0, 0, 0, 128].solid~
 - Inside source: true
 *** True Line Result
-      end
-** Processing line: ~    end~
+        outputs.primitives << [x, y - 25, 300, 50, 0, 0, 0, 128].solid
+** Processing line: ~        outputs.labels << [x + 10, y + 24, "dy: %.2f" % h[:body][:new_dy], -2, 0, 255, 255, 255]~
 - Inside source: true
 *** True Line Result
-    end
-** Processing line: ~~
+        outputs.labels << [x + 10, y + 24, "dy: %.2f" % h[:body][:new_dy], -2, 0, 255, 255, 255]
+** Processing line: ~        outputs.labels << [x + 10, y +  9, "dx: %.2f" % h[:body][:new_dx], -2, 0, 255, 255, 255]~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~    def render_gorillas~
+        outputs.labels << [x + 10, y +  9, "dx: %.2f" % h[:body][:new_dx], -2, 0, 255, 255, 255]
+** Processing line: ~        outputs.labels << [x + 10, y -  5, " ?: #{h[:body][:new_reason]}", -2, 0, 255, 255, 255]~
 - Inside source: true
 *** True Line Result
-    def render_gorillas
-** Processing line: ~      render_gorilla state.player_1, :left~
+        outputs.labels << [x + 10, y -  5, " ?: #{h[:body][:new_reason]}", -2, 0, 255, 255, 255]
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-      render_gorilla state.player_1, :left
-** Processing line: ~      render_gorilla state.player_2, :right~
+
+** Processing line: ~        outputs.labels << [x + 100, y + 24, "angle: %.2f" % h[:impact][:angle], -2, 0, 255, 255, 255]~
 - Inside source: true
 *** True Line Result
-      render_gorilla state.player_2, :right
-** Processing line: ~    end~
+        outputs.labels << [x + 100, y + 24, "angle: %.2f" % h[:impact][:angle], -2, 0, 255, 255, 255]
+** Processing line: ~        outputs.labels << [x + 100, y + 9, "m(l): %.2f" % h[:terrain][:slope], -2, 0, 255, 255, 255]~
 - Inside source: true
 *** True Line Result
-    end
+        outputs.labels << [x + 100, y + 9, "m(l): %.2f" % h[:terrain][:slope], -2, 0, 255, 255, 255]
+** Processing line: ~        outputs.labels << [x + 100, y - 5, "m(c): %.2f" % h[:body][:slope], -2, 0, 255, 255, 255]~
+- Inside source: true
+*** True Line Result
+        outputs.labels << [x + 100, y - 5, "m(c): %.2f" % h[:body][:slope], -2, 0, 255, 255, 255]
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~    def render_value_insertion~
+** Processing line: ~        outputs.labels << [x + 200, y + 24, "ray: #{h[:impact][:ray]}", -2, 0, 255, 255, 255]~
 - Inside source: true
 *** True Line Result
-    def render_value_insertion
-** Processing line: ~      return if state.banana~
+        outputs.labels << [x + 200, y + 24, "ray: #{h[:impact][:ray]}", -2, 0, 255, 255, 255]
+** Processing line: ~        outputs.labels << [x + 200, y +  9, "nxt: #{h[:impact][:ray_next]}", -2, 0, 255, 255, 255]~
 - Inside source: true
 *** True Line Result
-      return if state.banana
-** Processing line: ~      return if state.over~
+        outputs.labels << [x + 200, y +  9, "nxt: #{h[:impact][:ray_next]}", -2, 0, 255, 255, 255]
+** Processing line: ~        outputs.labels << [x + 200, y -  5, "typ: #{h[:impact][:type]}", -2, 0, 255, 255, 255]~
 - Inside source: true
 *** True Line Result
-      return if state.over
+        outputs.labels << [x + 200, y -  5, "typ: #{h[:impact][:type]}", -2, 0, 255, 255, 255]
+** Processing line: ~      end~
+- Inside source: true
+*** True Line Result
+      end
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~      if    state.current_turn == :player_1_angle~
+** Processing line: ~      if circle.floor~
 - Inside source: true
 *** True Line Result
-      if    state.current_turn == :player_1_angle
-** Processing line: ~        outputs.labels << [  10, 710, "Angle:    #{state.player_1_angle}_",    fancy_white]~
+      if circle.floor
+** Processing line: ~        outputs.labels << [circle.x + camera.x + 30, circle.y + camera.y + 100, "point: #{circle.floor_point.slice(:x, :y).values}", -2, 0]~
 - Inside source: true
 *** True Line Result
-        outputs.labels << [  10, 710, "Angle:    #{state.player_1_angle}_",    fancy_white]
-** Processing line: ~      elsif state.current_turn == :player_1_velocity~
+        outputs.labels << [circle.x + camera.x + 30, circle.y + camera.y + 100, "point: #{circle.floor_point.slice(:x, :y).values}", -2, 0]
+** Processing line: ~        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]~
 - Inside source: true
 *** True Line Result
-      elsif state.current_turn == :player_1_velocity
-** Processing line: ~        outputs.labels << [  10, 710, "Angle:    #{state.player_1_angle}",     fancy_white]~
+        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]
+** Processing line: ~        outputs.labels << [circle.x + camera.x + 30, circle.y + camera.y +  85, "circle: #{circle.as_hash.slice(:x, :y).values}", -2, 0]~
 - Inside source: true
 *** True Line Result
-        outputs.labels << [  10, 710, "Angle:    #{state.player_1_angle}",     fancy_white]
-** Processing line: ~        outputs.labels << [  10, 690, "Velocity: #{state.player_1_velocity}_", fancy_white]~
+        outputs.labels << [circle.x + camera.x + 30, circle.y + camera.y +  85, "circle: #{circle.as_hash.slice(:x, :y).values}", -2, 0]
+** Processing line: ~        outputs.labels << [circle.x + camera.x + 31, circle.y + camera.y +  86, "circle: #{circle.as_hash.slice(:x, :y).values}", -2, 0, 255, 255, 255]~
 - Inside source: true
 *** True Line Result
-        outputs.labels << [  10, 690, "Velocity: #{state.player_1_velocity}_", fancy_white]
-** Processing line: ~      elsif state.current_turn == :player_2_angle~
+        outputs.labels << [circle.x + camera.x + 31, circle.y + camera.y +  86, "circle: #{circle.as_hash.slice(:x, :y).values}", -2, 0, 255, 255, 255]
+** Processing line: ~        outputs.labels << [circle.x + camera.x + 30, circle.y + camera.y +  70, "rel: #{circle.floor_relative_x} #{circle.floor_relative_y}", -2, 0]~
 - Inside source: true
 *** True Line Result
-      elsif state.current_turn == :player_2_angle
-** Processing line: ~        outputs.labels << [1120, 710, "Angle:    #{state.player_2_angle}_",    fancy_white]~
+        outputs.labels << [circle.x + camera.x + 30, circle.y + camera.y +  70, "rel: #{circle.floor_relative_x} #{circle.floor_relative_y}", -2, 0]
+** Processing line: ~        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]~
 - Inside source: true
 *** True Line Result
-        outputs.labels << [1120, 710, "Angle:    #{state.player_2_angle}_",    fancy_white]
-** Processing line: ~      elsif state.current_turn == :player_2_velocity~
+        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]
+** Processing line: ~      end~
 - Inside source: true
 *** True Line Result
-      elsif state.current_turn == :player_2_velocity
-** Processing line: ~        outputs.labels << [1120, 710, "Angle:    #{state.player_2_angle}",     fancy_white]~
+      end
+** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
-        outputs.labels << [1120, 710, "Angle:    #{state.player_2_angle}",     fancy_white]
-** Processing line: ~        outputs.labels << [1120, 690, "Velocity: #{state.player_2_velocity}_", fancy_white]~
+    end
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-        outputs.labels << [1120, 690, "Velocity: #{state.player_2_velocity}_", fancy_white]
-** Processing line: ~      end~
+
+** Processing line: ~    def render_stage_editor~
 - Inside source: true
 *** True Line Result
-      end
+    def render_stage_editor
+** Processing line: ~      return unless state.god_mode~
+- Inside source: true
+*** True Line Result
+      return unless state.god_mode
+** Processing line: ~      return unless state.point_one~
+- Inside source: true
+*** True Line Result
+      return unless state.point_one
+** Processing line: ~      args.lines << [state.point_one, inputs.mouse.point, 0, 255, 255]~
+- Inside source: true
+*** True Line Result
+      args.lines << [state.point_one, inputs.mouse.point, 0, 255, 255]
 ** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
@@ -122143,26 +127507,30 @@ Follows is a source code listing for all files that have been open sourced. This
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~    def render_banana~
+** Processing line: ~    def trajectory body~
 - Inside source: true
 *** True Line Result
-    def render_banana
-** Processing line: ~      return unless state.banana~
+    def trajectory body
+** Processing line: ~      [body.x + body.dx,~
 - Inside source: true
 *** True Line Result
-      return unless state.banana
-** Processing line: ~      rotation = state.tick_count.%(360) * 20~
+      [body.x + body.dx,
+** Processing line: ~       body.y + body.dy,~
 - Inside source: true
 *** True Line Result
-      rotation = state.tick_count.%(360) * 20
-** Processing line: ~      rotation *= -1 if state.banana.dx > 0~
+       body.y + body.dy,
+** Processing line: ~       body.x + body.dx * 1000,~
 - Inside source: true
 *** True Line Result
-      rotation *= -1 if state.banana.dx > 0
-** Processing line: ~      outputs.sprites << [state.banana.x, state.banana.y, 15, 15, 'sprites/banana.png', rotation]~
+       body.x + body.dx * 1000,
+** Processing line: ~       body.y + body.dy * 1000,~
 - Inside source: true
 *** True Line Result
-      outputs.sprites << [state.banana.x, state.banana.y, 15, 15, 'sprites/banana.png', rotation]
+       body.y + body.dy * 1000,
+** Processing line: ~       0, 255, 255]~
+- Inside source: true
+*** True Line Result
+       0, 255, 255]
 ** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
@@ -122171,38 +127539,34 @@ Follows is a source code listing for all files that have been open sourced. This
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~    def render_holes~
-- Inside source: true
-*** True Line Result
-    def render_holes
-** Processing line: ~      outputs.sprites << state.holes.map do |s|~
+** Processing line: ~    def lengthen_line line, num~
 - Inside source: true
 *** True Line Result
-      outputs.sprites << state.holes.map do |s|
-** Processing line: ~        animation_index = s.created_at.frame_index(7, 3, false)~
+    def lengthen_line line, num
+** Processing line: ~      line = normalize_line(line)~
 - Inside source: true
 *** True Line Result
-        animation_index = s.created_at.frame_index(7, 3, false)
-** Processing line: ~        if animation_index~
+      line = normalize_line(line)
+** Processing line: ~      slope = geometry.line_slope(line, replace_infinity: 10).abs~
 - Inside source: true
 *** True Line Result
-        if animation_index
-** Processing line: ~          [s.sprite, [s.sprite.rect, "sprites/explosion#{animation_index}.png" ]]~
+      slope = geometry.line_slope(line, replace_infinity: 10).abs
+** Processing line: ~      if slope < 2~
 - Inside source: true
 *** True Line Result
-          [s.sprite, [s.sprite.rect, "sprites/explosion#{animation_index}.png" ]]
-** Processing line: ~        else~
+      if slope < 2
+** Processing line: ~        [line.x - num, line.y, line.x2 + num, line.y2].line.to_hash~
 - Inside source: true
 *** True Line Result
-        else
-** Processing line: ~          s.sprite~
+        [line.x - num, line.y, line.x2 + num, line.y2].line.to_hash
+** Processing line: ~      else~
 - Inside source: true
 *** True Line Result
-          s.sprite
-** Processing line: ~        end~
+      else
+** Processing line: ~        [line.x, line.y, line.x2, line.y2].line.to_hash~
 - Inside source: true
 *** True Line Result
-        end
+        [line.x, line.y, line.x2, line.y2].line.to_hash
 ** Processing line: ~      end~
 - Inside source: true
 *** True Line Result
@@ -122215,50 +127579,58 @@ Follows is a source code listing for all files that have been open sourced. This
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~    def calc~
+** Processing line: ~    def normalize_line line~
 - Inside source: true
 *** True Line Result
-    def calc
-** Processing line: ~      calc_generate_stage~
+    def normalize_line line
+** Processing line: ~      if line.x > line.x2~
 - Inside source: true
 *** True Line Result
-      calc_generate_stage
-** Processing line: ~      calc_current_turn~
+      if line.x > line.x2
+** Processing line: ~        x  = line.x2~
 - Inside source: true
 *** True Line Result
-      calc_current_turn
-** Processing line: ~      calc_banana~
+        x  = line.x2
+** Processing line: ~        y  = line.y2~
 - Inside source: true
 *** True Line Result
-      calc_banana
-** Processing line: ~    end~
+        y  = line.y2
+** Processing line: ~        x2 = line.x~
 - Inside source: true
 *** True Line Result
-    end
-** Processing line: ~~
+        x2 = line.x
+** Processing line: ~        y2 = line.y~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~    def calc_current_turn~
+        y2 = line.y
+** Processing line: ~      else~
 - Inside source: true
 *** True Line Result
-    def calc_current_turn
-** Processing line: ~      return if state.current_turn~
+      else
+** Processing line: ~        x  = line.x~
 - Inside source: true
 *** True Line Result
-      return if state.current_turn
-** Processing line: ~~
+        x  = line.x
+** Processing line: ~        y  = line.y~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~      state.current_turn = :player_1_angle~
+        y  = line.y
+** Processing line: ~        x2 = line.x2~
 - Inside source: true
 *** True Line Result
-      state.current_turn = :player_1_angle
-** Processing line: ~      state.current_turn = :player_2_angle if state.first_strike == :player_2~
+        x2 = line.x2
+** Processing line: ~        y2 = line.y2~
 - Inside source: true
 *** True Line Result
-      state.current_turn = :player_2_angle if state.first_strike == :player_2
+        y2 = line.y2
+** Processing line: ~      end~
+- Inside source: true
+*** True Line Result
+      end
+** Processing line: ~      [x, y, x2, y2]~
+- Inside source: true
+*** True Line Result
+      [x, y, x2, y2]
 ** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
@@ -122267,42 +127639,50 @@ Follows is a source code listing for all files that have been open sourced. This
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~    def calc_generate_stage~
+** Processing line: ~    def rect_for_line line~
 - Inside source: true
 *** True Line Result
-    def calc_generate_stage
-** Processing line: ~      return if state.stage_generated~
+    def rect_for_line line
+** Processing line: ~      if line.x > line.x2~
 - Inside source: true
 *** True Line Result
-      return if state.stage_generated
-** Processing line: ~~
+      if line.x > line.x2
+** Processing line: ~        x  = line.x2~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~      state.buildings << building_prefab(state.building_spacing + -20, *random_building_size)~
+        x  = line.x2
+** Processing line: ~        y  = line.y2~
 - Inside source: true
 *** True Line Result
-      state.buildings << building_prefab(state.building_spacing + -20, *random_building_size)
-** Processing line: ~      8.numbers.inject(state.buildings) do |buildings, i|~
+        y  = line.y2
+** Processing line: ~        x2 = line.x~
 - Inside source: true
 *** True Line Result
-      8.numbers.inject(state.buildings) do |buildings, i|
-** Processing line: ~        buildings <<~
+        x2 = line.x
+** Processing line: ~        y2 = line.y~
 - Inside source: true
 *** True Line Result
-        buildings <<
-** Processing line: ~          building_prefab(state.building_spacing +~
+        y2 = line.y
+** Processing line: ~      else~
 - Inside source: true
 *** True Line Result
-          building_prefab(state.building_spacing +
-** Processing line: ~                          state.buildings.last.right,~
+      else
+** Processing line: ~        x  = line.x~
 - Inside source: true
 *** True Line Result
-                          state.buildings.last.right,
-** Processing line: ~                          *random_building_size)~
+        x  = line.x
+** Processing line: ~        y  = line.y~
+- Inside source: true
+*** True Line Result
+        y  = line.y
+** Processing line: ~        x2 = line.x2~
+- Inside source: true
+*** True Line Result
+        x2 = line.x2
+** Processing line: ~        y2 = line.y2~
 - Inside source: true
 *** True Line Result
-                          *random_building_size)
+        y2 = line.y2
 ** Processing line: ~      end~
 - Inside source: true
 *** True Line Result
@@ -122311,186 +127691,174 @@ Follows is a source code listing for all files that have been open sourced. This
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~      building_two = state.buildings[1]~
-- Inside source: true
-*** True Line Result
-      building_two = state.buildings[1]
-** Processing line: ~      state.player_1 = new_player(building_two.x + building_two.w.fdiv(2),~
+** Processing line: ~      w = x2 - x~
 - Inside source: true
 *** True Line Result
-      state.player_1 = new_player(building_two.x + building_two.w.fdiv(2),
-** Processing line: ~                                 building_two.h)~
+      w = x2 - x
+** Processing line: ~      h = y2 - y~
 - Inside source: true
 *** True Line Result
-                                 building_two.h)
+      h = y2 - y
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~      building_nine = state.buildings[-3]~
+** Processing line: ~      if h < 0~
 - Inside source: true
 *** True Line Result
-      building_nine = state.buildings[-3]
-** Processing line: ~      state.player_2 = new_player(building_nine.x + building_nine.w.fdiv(2),~
+      if h < 0
+** Processing line: ~        y += h~
 - Inside source: true
 *** True Line Result
-      state.player_2 = new_player(building_nine.x + building_nine.w.fdiv(2),
-** Processing line: ~                                 building_nine.h)~
+        y += h
+** Processing line: ~        h = h.abs~
 - Inside source: true
 *** True Line Result
-                                 building_nine.h)
-** Processing line: ~      state.stage_generated = true~
+        h = h.abs
+** Processing line: ~      end~
 - Inside source: true
 *** True Line Result
-      state.stage_generated = true
-** Processing line: ~      state.wind = 1.randomize(:ratio, :sign)~
+      end
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-      state.wind = 1.randomize(:ratio, :sign)
-** Processing line: ~    end~
+
+** Processing line: ~      if w < circle.radius~
 - Inside source: true
 *** True Line Result
-    end
-** Processing line: ~~
+      if w < circle.radius
+** Processing line: ~        x -= circle.radius~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~    def new_player x, y~
+        x -= circle.radius
+** Processing line: ~        w = circle.radius * 2~
 - Inside source: true
 *** True Line Result
-    def new_player x, y
-** Processing line: ~      state.new_entity(:gorilla) do |p|~
+        w = circle.radius * 2
+** Processing line: ~      end~
 - Inside source: true
 *** True Line Result
-      state.new_entity(:gorilla) do |p|
-** Processing line: ~        p.x = x - 25~
+      end
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-        p.x = x - 25
-** Processing line: ~        p.y = y~
+
+** Processing line: ~      if h < circle.radius~
 - Inside source: true
 *** True Line Result
-        p.y = y
-** Processing line: ~        p.solid = [p.x, p.y, 50, 50]~
+      if h < circle.radius
+** Processing line: ~        y -= circle.radius~
 - Inside source: true
 *** True Line Result
-        p.solid = [p.x, p.y, 50, 50]
-** Processing line: ~      end~
+        y -= circle.radius
+** Processing line: ~        h = circle.radius * 2~
 - Inside source: true
 *** True Line Result
-      end
-** Processing line: ~    end~
+        h = circle.radius * 2
+** Processing line: ~      end~
 - Inside source: true
 *** True Line Result
-    end
+      end
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~    def calc_banana~
+** Processing line: ~      { x: x, y: y, w: w, h: h }~
 - Inside source: true
 *** True Line Result
-    def calc_banana
-** Processing line: ~      return unless state.banana~
+      { x: x, y: y, w: w, h: h }
+** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
-      return unless state.banana
+    end
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~      state.banana.x  += state.banana.dx~
-- Inside source: true
-*** True Line Result
-      state.banana.x  += state.banana.dx
-** Processing line: ~      state.banana.dx += state.wind.fdiv(50)~
+** Processing line: ~    def snap_to_grid x, y, snaps~
 - Inside source: true
 *** True Line Result
-      state.banana.dx += state.wind.fdiv(50)
-** Processing line: ~      state.banana.y  += state.banana.dy~
+    def snap_to_grid x, y, snaps
+** Processing line: ~      snap_number = 10~
 - Inside source: true
 *** True Line Result
-      state.banana.y  += state.banana.dy
-** Processing line: ~      state.banana.dy -= state.gravity~
+      snap_number = 10
+** Processing line: ~      x = x.to_i~
 - Inside source: true
 *** True Line Result
-      state.banana.dy -= state.gravity
-** Processing line: ~      banana_collision = [state.banana.x, state.banana.y, 10, 10]~
+      x = x.to_i
+** Processing line: ~      y = y.to_i~
 - Inside source: true
 *** True Line Result
-      banana_collision = [state.banana.x, state.banana.y, 10, 10]
+      y = y.to_i
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~      if state.player_1 && banana_collision.intersect_rect?(state.player_1.solid)~
+** Processing line: ~      x_floor = x.idiv(snap_number) * snap_number~
 - Inside source: true
 *** True Line Result
-      if state.player_1 && banana_collision.intersect_rect?(state.player_1.solid)
-** Processing line: ~        state.over = true~
+      x_floor = x.idiv(snap_number) * snap_number
+** Processing line: ~      x_mod   = x % snap_number~
 - Inside source: true
 *** True Line Result
-        state.over = true
-** Processing line: ~        if state.banana.owner == state.player_2~
+      x_mod   = x % snap_number
+** Processing line: ~      x_ceil  = (x.idiv(snap_number) + 1) * snap_number~
 - Inside source: true
 *** True Line Result
-        if state.banana.owner == state.player_2
-** Processing line: ~          state.winner = :player_2~
+      x_ceil  = (x.idiv(snap_number) + 1) * snap_number
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-          state.winner = :player_2
-** Processing line: ~        else~
+
+** Processing line: ~      y_floor = y.idiv(snap_number) * snap_number~
 - Inside source: true
 *** True Line Result
-        else
-** Processing line: ~          state.winner = :player_1~
+      y_floor = y.idiv(snap_number) * snap_number
+** Processing line: ~      y_mod   = y % snap_number~
 - Inside source: true
 *** True Line Result
-          state.winner = :player_1
-** Processing line: ~        end~
+      y_mod   = y % snap_number
+** Processing line: ~      y_ceil  = (y.idiv(snap_number) + 1) * snap_number~
 - Inside source: true
 *** True Line Result
-        end
+      y_ceil  = (y.idiv(snap_number) + 1) * snap_number
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~        state.player_2_score += 1~
-- Inside source: true
-*** True Line Result
-        state.player_2_score += 1
-** Processing line: ~      elsif state.player_2 && banana_collision.intersect_rect?(state.player_2.solid)~
+** Processing line: ~      if snaps[x_floor]~
 - Inside source: true
 *** True Line Result
-      elsif state.player_2 && banana_collision.intersect_rect?(state.player_2.solid)
-** Processing line: ~        state.over = true~
+      if snaps[x_floor]
+** Processing line: ~        x_result = x_floor~
 - Inside source: true
 *** True Line Result
-        state.over = true
-** Processing line: ~        if state.banana.owner == state.player_2~
+        x_result = x_floor
+** Processing line: ~      elsif snaps[x_ceil]~
 - Inside source: true
 *** True Line Result
-        if state.banana.owner == state.player_2
-** Processing line: ~          state.winner = :player_1~
+      elsif snaps[x_ceil]
+** Processing line: ~        x_result = x_ceil~
 - Inside source: true
 *** True Line Result
-          state.winner = :player_1
-** Processing line: ~        else~
+        x_result = x_ceil
+** Processing line: ~      elsif x_mod < snap_number.idiv(2)~
 - Inside source: true
 *** True Line Result
-        else
-** Processing line: ~          state.winner = :player_2~
+      elsif x_mod < snap_number.idiv(2)
+** Processing line: ~        x_result = x_floor~
 - Inside source: true
 *** True Line Result
-          state.winner = :player_2
-** Processing line: ~        end~
+        x_result = x_floor
+** Processing line: ~      else~
 - Inside source: true
 *** True Line Result
-        end
-** Processing line: ~        state.player_1_score += 1~
+      else
+** Processing line: ~        x_result = x_ceil~
 - Inside source: true
 *** True Line Result
-        state.player_1_score += 1
+        x_result = x_ceil
 ** Processing line: ~      end~
 - Inside source: true
 *** True Line Result
@@ -122499,34 +127867,46 @@ Follows is a source code listing for all files that have been open sourced. This
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~      if state.over~
+** Processing line: ~      snaps[x_result] ||= {}~
 - Inside source: true
 *** True Line Result
-      if state.over
-** Processing line: ~        place_hole~
+      snaps[x_result] ||= {}
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-        place_hole
-** Processing line: ~        return~
+
+** Processing line: ~      if snaps[x_result][y_floor]~
 - Inside source: true
 *** True Line Result
-        return
-** Processing line: ~      end~
+      if snaps[x_result][y_floor]
+** Processing line: ~        y_result = y_floor~
 - Inside source: true
 *** True Line Result
-      end
-** Processing line: ~~
+        y_result = y_floor
+** Processing line: ~      elsif snaps[x_result][y_ceil]~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~      return if state.holes.any? do |h|~
+      elsif snaps[x_result][y_ceil]
+** Processing line: ~        y_result = y_ceil~
 - Inside source: true
 *** True Line Result
-      return if state.holes.any? do |h|
-** Processing line: ~        h.sprite.scale_rect(0.8, 0.5, 0.5).intersect_rect? [state.banana.x, state.banana.y, 10, 10]~
+        y_result = y_ceil
+** Processing line: ~      elsif y_mod < snap_number.idiv(2)~
 - Inside source: true
 *** True Line Result
-        h.sprite.scale_rect(0.8, 0.5, 0.5).intersect_rect? [state.banana.x, state.banana.y, 10, 10]
+      elsif y_mod < snap_number.idiv(2)
+** Processing line: ~        y_result = y_floor~
+- Inside source: true
+*** True Line Result
+        y_result = y_floor
+** Processing line: ~      else~
+- Inside source: true
+*** True Line Result
+      else
+** Processing line: ~        y_result = y_ceil~
+- Inside source: true
+*** True Line Result
+        y_result = y_ceil
 ** Processing line: ~      end~
 - Inside source: true
 *** True Line Result
@@ -122535,26 +127915,34 @@ Follows is a source code listing for all files that have been open sourced. This
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~      return unless state.banana.y < 0 || state.buildings.any? do |b|~
+** Processing line: ~      snaps[x_result][y_result] = true~
 - Inside source: true
 *** True Line Result
-      return unless state.banana.y < 0 || state.buildings.any? do |b|
-** Processing line: ~        b.rect.intersect_rect? [state.banana.x, state.banana.y, 1, 1]~
+      snaps[x_result][y_result] = true
+** Processing line: ~      return [x_result, y_result]~
 - Inside source: true
 *** True Line Result
-        b.rect.intersect_rect? [state.banana.x, state.banana.y, 1, 1]
-** Processing line: ~      end~
+      return [x_result, y_result]
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-      end
+
+** Processing line: ~    end~
+- Inside source: true
+*** True Line Result
+    end
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~      place_hole~
+** Processing line: ~    def snap_line line~
 - Inside source: true
 *** True Line Result
-      place_hole
+    def snap_line line
+** Processing line: ~      x, y, x2, y2 = line~
+- Inside source: true
+*** True Line Result
+      x, y, x2, y2 = line
 ** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
@@ -122563,26 +127951,30 @@ Follows is a source code listing for all files that have been open sourced. This
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~    def place_hole~
+** Processing line: ~    def string_to_line s~
 - Inside source: true
 *** True Line Result
-    def place_hole
-** Processing line: ~      return unless state.banana~
+    def string_to_line s
+** Processing line: ~      x, y, x2, y2 = s.split(',').map(&:to_f)~
 - Inside source: true
 *** True Line Result
-      return unless state.banana
+      x, y, x2, y2 = s.split(',').map(&:to_f)
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~      state.holes << state.new_entity(:banana) do |b|~
+** Processing line: ~      if x > x2~
 - Inside source: true
 *** True Line Result
-      state.holes << state.new_entity(:banana) do |b|
-** Processing line: ~        b.sprite = [state.banana.x - 20, state.banana.y - 20, 40, 40, 'sprites/hole.png']~
+      if x > x2
+** Processing line: ~        x2, x = x, x2~
 - Inside source: true
 *** True Line Result
-        b.sprite = [state.banana.x - 20, state.banana.y - 20, 40, 40, 'sprites/hole.png']
+        x2, x = x, x2
+** Processing line: ~        y2, y = y, y2~
+- Inside source: true
+*** True Line Result
+        y2, y = y, y2
 ** Processing line: ~      end~
 - Inside source: true
 *** True Line Result
@@ -122591,70 +127983,70 @@ Follows is a source code listing for all files that have been open sourced. This
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~      state.banana = nil~
+** Processing line: ~      x, y = snap_to_grid x, y, state.snaps~
 - Inside source: true
 *** True Line Result
-      state.banana = nil
-** Processing line: ~    end~
+      x, y = snap_to_grid x, y, state.snaps
+** Processing line: ~      x2, y2 = snap_to_grid x2, y2, state.snaps~
 - Inside source: true
 *** True Line Result
-    end
-** Processing line: ~~
+      x2, y2 = snap_to_grid x2, y2, state.snaps
+** Processing line: ~      [x, y, x2, y2].line.to_hash~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~    def process_inputs_main~
+      [x, y, x2, y2].line.to_hash
+** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
-    def process_inputs_main
-** Processing line: ~      return if state.banana~
+    end
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-      return if state.banana
-** Processing line: ~      return if state.over~
+
+** Processing line: ~    def load_lines file~
 - Inside source: true
 *** True Line Result
-      return if state.over
-** Processing line: ~~
+    def load_lines file
+** Processing line: ~      return unless state.snaps~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~      if inputs.keyboard.key_down.enter~
+      return unless state.snaps
+** Processing line: ~      data = gtk.read_file(file) || ""~
 - Inside source: true
 *** True Line Result
-      if inputs.keyboard.key_down.enter
-** Processing line: ~        input_execute_turn~
+      data = gtk.read_file(file) || ""
+** Processing line: ~      data.each_line~
 - Inside source: true
 *** True Line Result
-        input_execute_turn
-** Processing line: ~      elsif inputs.keyboard.key_down.backspace~
+      data.each_line
+** Processing line: ~          .reject { |l| l.strip.length == 0 }~
 - Inside source: true
 *** True Line Result
-      elsif inputs.keyboard.key_down.backspace
-** Processing line: ~        state.as_hash[state.current_turn] ||= ""~
+          .reject { |l| l.strip.length == 0 }
+** Processing line: ~          .map { |l| string_to_line l }~
 - Inside source: true
 *** True Line Result
-        state.as_hash[state.current_turn] ||= ""
-** Processing line: ~        state.as_hash[state.current_turn]   = state.as_hash[state.current_turn][0..-2]~
+          .map { |l| string_to_line l }
+** Processing line: ~          .map { |h| h.merge(rect: rect_for_line(h))  }~
 - Inside source: true
 *** True Line Result
-        state.as_hash[state.current_turn]   = state.as_hash[state.current_turn][0..-2]
-** Processing line: ~      elsif inputs.keyboard.key_down.char~
+          .map { |h| h.merge(rect: rect_for_line(h))  }
+** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
-      elsif inputs.keyboard.key_down.char
-** Processing line: ~        state.as_hash[state.current_turn] ||= ""~
+    end
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-        state.as_hash[state.current_turn] ||= ""
-** Processing line: ~        state.as_hash[state.current_turn]  += inputs.keyboard.key_down.char~
+
+** Processing line: ~    def load_terrain~
 - Inside source: true
 *** True Line Result
-        state.as_hash[state.current_turn]  += inputs.keyboard.key_down.char
-** Processing line: ~      end~
+    def load_terrain
+** Processing line: ~      load_lines 'data/level.txt'~
 - Inside source: true
 *** True Line Result
-      end
+      load_lines 'data/level.txt'
 ** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
@@ -122663,58 +128055,54 @@ Follows is a source code listing for all files that have been open sourced. This
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~    def process_inputs_game_over~
-- Inside source: true
-*** True Line Result
-    def process_inputs_game_over
-** Processing line: ~      return unless state.over~
-- Inside source: true
-*** True Line Result
-      return unless state.over
-** Processing line: ~      return unless inputs.keyboard.key_down.truthy_keys.any?~
+** Processing line: ~    def load_lava~
 - Inside source: true
 *** True Line Result
-      return unless inputs.keyboard.key_down.truthy_keys.any?
-** Processing line: ~      state.over = false~
+    def load_lava
+** Processing line: ~      load_lines 'data/level_lava.txt'~
 - Inside source: true
 *** True Line Result
-      state.over = false
-** Processing line: ~      outputs.static_solids.clear~
+      load_lines 'data/level_lava.txt'
+** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
-      outputs.static_solids.clear
-** Processing line: ~      state.buildings.clear~
+    end
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-      state.buildings.clear
-** Processing line: ~      state.holes.clear~
+
+** Processing line: ~    def load_level force: false~
 - Inside source: true
 *** True Line Result
-      state.holes.clear
-** Processing line: ~      state.stage_generated = false~
+    def load_level force: false
+** Processing line: ~      if force~
 - Inside source: true
 *** True Line Result
-      state.stage_generated = false
-** Processing line: ~      state.stage_rendered = false~
+      if force
+** Processing line: ~        state.snaps = {}~
 - Inside source: true
 *** True Line Result
-      state.stage_rendered = false
-** Processing line: ~      if state.first_strike == :player_1~
+        state.snaps = {}
+** Processing line: ~        state.terrain = load_terrain~
 - Inside source: true
 *** True Line Result
-      if state.first_strike == :player_1
-** Processing line: ~        state.first_strike = :player_2~
+        state.terrain = load_terrain
+** Processing line: ~        state.lava = load_lava~
 - Inside source: true
 *** True Line Result
-        state.first_strike = :player_2
+        state.lava = load_lava
 ** Processing line: ~      else~
 - Inside source: true
 *** True Line Result
       else
-** Processing line: ~        state.first_strike = :player_1~
+** Processing line: ~        state.terrain ||= load_terrain~
 - Inside source: true
 *** True Line Result
-        state.first_strike = :player_1
+        state.terrain ||= load_terrain
+** Processing line: ~        state.lava ||= load_lava~
+- Inside source: true
+*** True Line Result
+        state.lava ||= load_lava
 ** Processing line: ~      end~
 - Inside source: true
 *** True Line Result
@@ -122727,18 +128115,26 @@ Follows is a source code listing for all files that have been open sourced. This
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~    def process_inputs~
+** Processing line: ~    def save_lines lines, file~
 - Inside source: true
 *** True Line Result
-    def process_inputs
-** Processing line: ~      process_inputs_main~
+    def save_lines lines, file
+** Processing line: ~      s = lines.map do |l|~
 - Inside source: true
 *** True Line Result
-      process_inputs_main
-** Processing line: ~      process_inputs_game_over~
+      s = lines.map do |l|
+** Processing line: ~        "#{l.x1},#{l.y1},#{l.x2},#{l.y2}"~
 - Inside source: true
 *** True Line Result
-      process_inputs_game_over
+        "#{l.x1},#{l.y1},#{l.x2},#{l.y2}"
+** Processing line: ~      end.join("\n")~
+- Inside source: true
+*** True Line Result
+      end.join("\n")
+** Processing line: ~      gtk.write_file(file, s)~
+- Inside source: true
+*** True Line Result
+      gtk.write_file(file, s)
 ** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
@@ -122747,162 +128143,174 @@ Follows is a source code listing for all files that have been open sourced. This
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~    def input_execute_turn~
+** Processing line: ~    def save_level~
 - Inside source: true
 *** True Line Result
-    def input_execute_turn
-** Processing line: ~      return if state.banana~
+    def save_level
+** Processing line: ~      save_lines(state.terrain, 'level.txt')~
 - Inside source: true
 *** True Line Result
-      return if state.banana
-** Processing line: ~~
+      save_lines(state.terrain, 'level.txt')
+** Processing line: ~      save_lines(state.lava, 'level_lava.txt')~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~      if state.current_turn == :player_1_angle && parse_or_clear!(:player_1_angle)~
+      save_lines(state.lava, 'level_lava.txt')
+** Processing line: ~      load_level force: true~
 - Inside source: true
 *** True Line Result
-      if state.current_turn == :player_1_angle && parse_or_clear!(:player_1_angle)
-** Processing line: ~        state.current_turn = :player_1_velocity~
+      load_level force: true
+** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
-        state.current_turn = :player_1_velocity
-** Processing line: ~      elsif state.current_turn == :player_1_velocity && parse_or_clear!(:player_1_velocity)~
+    end
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-      elsif state.current_turn == :player_1_velocity && parse_or_clear!(:player_1_velocity)
-** Processing line: ~        state.current_turn = :player_2_angle~
+
+** Processing line: ~    def line_near_rect? rect, terrain~
 - Inside source: true
 *** True Line Result
-        state.current_turn = :player_2_angle
-** Processing line: ~        state.banana =~
+    def line_near_rect? rect, terrain
+** Processing line: ~      geometry.intersect_rect?(rect, terrain[:rect])~
 - Inside source: true
 *** True Line Result
-        state.banana =
-** Processing line: ~          new_banana(state.player_1,~
+      geometry.intersect_rect?(rect, terrain[:rect])
+** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
-          new_banana(state.player_1,
-** Processing line: ~                     state.player_1.x + 25,~
+    end
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-                     state.player_1.x + 25,
-** Processing line: ~                     state.player_1.y + 60,~
+
+** Processing line: ~    def point_within_line? point, line~
 - Inside source: true
 *** True Line Result
-                     state.player_1.y + 60,
-** Processing line: ~                     state.player_1_angle,~
+    def point_within_line? point, line
+** Processing line: ~      return false if !point~
 - Inside source: true
 *** True Line Result
-                     state.player_1_angle,
-** Processing line: ~                     state.player_1_velocity)~
+      return false if !point
+** Processing line: ~      return false if !line~
 - Inside source: true
 *** True Line Result
-                     state.player_1_velocity)
-** Processing line: ~      elsif state.current_turn == :player_2_angle && parse_or_clear!(:player_2_angle)~
+      return false if !line
+** Processing line: ~      return true~
 - Inside source: true
 *** True Line Result
-      elsif state.current_turn == :player_2_angle && parse_or_clear!(:player_2_angle)
-** Processing line: ~        state.current_turn = :player_2_velocity~
+      return true
+** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
-        state.current_turn = :player_2_velocity
-** Processing line: ~      elsif state.current_turn == :player_2_velocity && parse_or_clear!(:player_2_velocity)~
+    end
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-      elsif state.current_turn == :player_2_velocity && parse_or_clear!(:player_2_velocity)
-** Processing line: ~        state.current_turn = :player_1_angle~
+
+** Processing line: ~    def calc_impacts x, dx, y, dy, radius~
 - Inside source: true
 *** True Line Result
-        state.current_turn = :player_1_angle
-** Processing line: ~        state.banana =~
+    def calc_impacts x, dx, y, dy, radius
+** Processing line: ~      results = { }~
 - Inside source: true
 *** True Line Result
-        state.banana =
-** Processing line: ~          new_banana(state.player_2,~
+      results = { }
+** Processing line: ~      results[:x] = x~
 - Inside source: true
 *** True Line Result
-          new_banana(state.player_2,
-** Processing line: ~                     state.player_2.x + 25,~
+      results[:x] = x
+** Processing line: ~      results[:y] = y~
 - Inside source: true
 *** True Line Result
-                     state.player_2.x + 25,
-** Processing line: ~                     state.player_2.y + 60,~
+      results[:y] = y
+** Processing line: ~      results[:dx] = x~
 - Inside source: true
 *** True Line Result
-                     state.player_2.y + 60,
-** Processing line: ~                     180 - state.player_2_angle,~
+      results[:dx] = x
+** Processing line: ~      results[:dy] = y~
 - Inside source: true
 *** True Line Result
-                     180 - state.player_2_angle,
-** Processing line: ~                     state.player_2_velocity)~
+      results[:dy] = y
+** Processing line: ~      results[:point] = { x: x, y: y }~
 - Inside source: true
 *** True Line Result
-                     state.player_2_velocity)
-** Processing line: ~      end~
+      results[:point] = { x: x, y: y }
+** Processing line: ~      results[:rect] = { x: x - radius, y: y - radius, w: radius * 2, h: radius * 2 }~
 - Inside source: true
 *** True Line Result
-      end
-** Processing line: ~~
+      results[:rect] = { x: x - radius, y: y - radius, w: radius * 2, h: radius * 2 }
+** Processing line: ~      results[:trajectory] = trajectory(results)~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~      if state.banana~
+      results[:trajectory] = trajectory(results)
+** Processing line: ~      results[:impacts] = terrain.find_all { |t| t && (line_near_rect? results[:rect], t) }.map do |t|~
 - Inside source: true
 *** True Line Result
-      if state.banana
-** Processing line: ~        state.player_1_angle = nil~
+      results[:impacts] = terrain.find_all { |t| t && (line_near_rect? results[:rect], t) }.map do |t|
+** Processing line: ~        {~
 - Inside source: true
 *** True Line Result
-        state.player_1_angle = nil
-** Processing line: ~        state.player_1_velocity = nil~
+        {
+** Processing line: ~          terrain: t,~
 - Inside source: true
 *** True Line Result
-        state.player_1_velocity = nil
-** Processing line: ~        state.player_2_angle = nil~
+          terrain: t,
+** Processing line: ~          point: geometry.line_intersect(results[:trajectory], t, replace_infinity: 1000),~
 - Inside source: true
 *** True Line Result
-        state.player_2_angle = nil
-** Processing line: ~        state.player_2_velocity = nil~
+          point: geometry.line_intersect(results[:trajectory], t, replace_infinity: 1000),
+** Processing line: ~          type: :terrain~
 - Inside source: true
 *** True Line Result
-        state.player_2_velocity = nil
-** Processing line: ~      end~
+          type: :terrain
+** Processing line: ~        }~
 - Inside source: true
 *** True Line Result
-      end
-** Processing line: ~    end~
+        }
+** Processing line: ~      end.reject { |t| !point_within_line? t[:point], t[:terrain] }~
 - Inside source: true
 *** True Line Result
-    end
+      end.reject { |t| !point_within_line? t[:point], t[:terrain] }
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~    def random_building_size~
+** Processing line: ~      results[:impacts] += lava.find_all { |t| line_near_rect? results[:rect], t }.map do |t|~
 - Inside source: true
 *** True Line Result
-    def random_building_size
-** Processing line: ~      [state.building_heights.sample, state.building_room_sizes.sample]~
+      results[:impacts] += lava.find_all { |t| line_near_rect? results[:rect], t }.map do |t|
+** Processing line: ~        {~
 - Inside source: true
 *** True Line Result
-      [state.building_heights.sample, state.building_room_sizes.sample]
-** Processing line: ~    end~
+        {
+** Processing line: ~          terrain: t,~
 - Inside source: true
 *** True Line Result
-    end
-** Processing line: ~~
+          terrain: t,
+** Processing line: ~          point: geometry.line_intersect(results[:trajectory], t, replace_infinity: 1000),~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~    def int? v~
+          point: geometry.line_intersect(results[:trajectory], t, replace_infinity: 1000),
+** Processing line: ~          type: :lava~
 - Inside source: true
 *** True Line Result
-    def int? v
-** Processing line: ~      v.to_i.to_s == v.to_s~
+          type: :lava
+** Processing line: ~        }~
 - Inside source: true
 *** True Line Result
-      v.to_i.to_s == v.to_s
+        }
+** Processing line: ~      end.reject { |t| !t || (!point_within_line? t[:point], t[:terrain]) }~
+- Inside source: true
+*** True Line Result
+      end.reject { |t| !t || (!point_within_line? t[:point], t[:terrain]) }
+** Processing line: ~~
+- Inside source: true
+*** True Line Result
+
+** Processing line: ~      results~
+- Inside source: true
+*** True Line Result
+      results
 ** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
@@ -122911,26 +128319,26 @@ Follows is a source code listing for all files that have been open sourced. This
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~    def random_building_color~
+** Processing line: ~    def calc_potential_impacts~
 - Inside source: true
 *** True Line Result
-    def random_building_color
-** Processing line: ~      [[ 99,   0, 107],~
+    def calc_potential_impacts
+** Processing line: ~      impact_results = calc_impacts circle.x, circle.dx, circle.y, circle.dy, circle.radius~
 - Inside source: true
 *** True Line Result
-      [[ 99,   0, 107],
-** Processing line: ~       [ 35,  64, 124],~
+      impact_results = calc_impacts circle.x, circle.dx, circle.y, circle.dy, circle.radius
+** Processing line: ~      circle.rect = impact_results[:rect]~
 - Inside source: true
 *** True Line Result
-       [ 35,  64, 124],
-** Processing line: ~       [ 35, 136, 162],~
+      circle.rect = impact_results[:rect]
+** Processing line: ~      circle.trajectory = impact_results[:trajectory]~
 - Inside source: true
 *** True Line Result
-       [ 35, 136, 162],
-** Processing line: ~       ].sample~
+      circle.trajectory = impact_results[:trajectory]
+** Processing line: ~      circle.impacts = impact_results[:impacts]~
 - Inside source: true
 *** True Line Result
-       ].sample
+      circle.impacts = impact_results[:impacts]
 ** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
@@ -122939,66 +128347,66 @@ Follows is a source code listing for all files that have been open sourced. This
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~    def random_window_color~
+** Processing line: ~    def calc_terrains_to_monitor~
 - Inside source: true
 *** True Line Result
-    def random_window_color
-** Processing line: ~      [[ 88,  62, 104],~
+    def calc_terrains_to_monitor
+** Processing line: ~      return unless circle.impacts~
 - Inside source: true
 *** True Line Result
-      [[ 88,  62, 104],
-** Processing line: ~       [253, 224, 187]].sample~
+      return unless circle.impacts
+** Processing line: ~      circle.impact = nil~
 - Inside source: true
 *** True Line Result
-       [253, 224, 187]].sample
-** Processing line: ~    end~
+      circle.impact = nil
+** Processing line: ~      circle.impacts.each do |i|~
 - Inside source: true
 *** True Line Result
-    end
-** Processing line: ~~
+      circle.impacts.each do |i|
+** Processing line: ~        circle.terrains_to_monitor[i[:terrain]] ||= {~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~    def windows_for_building starting_x, floors, rooms~
+        circle.terrains_to_monitor[i[:terrain]] ||= {
+** Processing line: ~          ray_start: geometry.ray_test(circle, i[:terrain]),~
 - Inside source: true
 *** True Line Result
-    def windows_for_building starting_x, floors, rooms
-** Processing line: ~      floors.-(1).combinations(rooms - 1).map do |floor, room|~
+          ray_start: geometry.ray_test(circle, i[:terrain]),
+** Processing line: ~        }~
 - Inside source: true
 *** True Line Result
-      floors.-(1).combinations(rooms - 1).map do |floor, room|
-** Processing line: ~        [starting_x +~
+        }
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-        [starting_x +
-** Processing line: ~         state.building_room_width.*(room) +~
+
+** Processing line: ~        circle.terrains_to_monitor[i[:terrain]][:ray_current] = geometry.ray_test(circle, i[:terrain])~
 - Inside source: true
 *** True Line Result
-         state.building_room_width.*(room) +
-** Processing line: ~         state.building_room_spacing.*(room + 1),~
+        circle.terrains_to_monitor[i[:terrain]][:ray_current] = geometry.ray_test(circle, i[:terrain])
+** Processing line: ~        if circle.terrains_to_monitor[i[:terrain]][:ray_start] != circle.terrains_to_monitor[i[:terrain]][:ray_current]~
 - Inside source: true
 *** True Line Result
-         state.building_room_spacing.*(room + 1),
-** Processing line: ~         state.building_room_height.*(floor) +~
+        if circle.terrains_to_monitor[i[:terrain]][:ray_start] != circle.terrains_to_monitor[i[:terrain]][:ray_current]
+** Processing line: ~          if circle.x.between?(i[:terrain].x, i[:terrain].x2) || circle.y.between?(i[:terrain].y, i[:terrain].y2)~
 - Inside source: true
 *** True Line Result
-         state.building_room_height.*(floor) +
-** Processing line: ~         state.building_room_spacing.*(floor + 1),~
+          if circle.x.between?(i[:terrain].x, i[:terrain].x2) || circle.y.between?(i[:terrain].y, i[:terrain].y2)
+** Processing line: ~            circle.impact = i~
 - Inside source: true
 *** True Line Result
-         state.building_room_spacing.*(floor + 1),
-** Processing line: ~         state.building_room_width,~
+            circle.impact = i
+** Processing line: ~            circle.ray_current = circle.terrains_to_monitor[i[:terrain]][:ray_current]~
 - Inside source: true
 *** True Line Result
-         state.building_room_width,
-** Processing line: ~         state.building_room_height,~
+            circle.ray_current = circle.terrains_to_monitor[i[:terrain]][:ray_current]
+** Processing line: ~          end~
 - Inside source: true
 *** True Line Result
-         state.building_room_height,
-** Processing line: ~         random_window_color]~
+          end
+** Processing line: ~        end~
 - Inside source: true
 *** True Line Result
-         random_window_color]
+        end
 ** Processing line: ~      end~
 - Inside source: true
 *** True Line Result
@@ -123011,438 +128419,486 @@ Follows is a source code listing for all files that have been open sourced. This
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~    def building_prefab starting_x, floors, rooms~
+** Processing line: ~    def impact_result body, impact~
 - Inside source: true
 *** True Line Result
-    def building_prefab starting_x, floors, rooms
-** Processing line: ~      state.new_entity(:building) do |b|~
+    def impact_result body, impact
+** Processing line: ~      infinity_alias = 1000~
 - Inside source: true
 *** True Line Result
-      state.new_entity(:building) do |b|
-** Processing line: ~        b.x      = starting_x~
+      infinity_alias = 1000
+** Processing line: ~      r = {~
 - Inside source: true
 *** True Line Result
-        b.x      = starting_x
-** Processing line: ~        b.y      = 0~
+      r = {
+** Processing line: ~        body: {},~
 - Inside source: true
 *** True Line Result
-        b.y      = 0
-** Processing line: ~        b.w      = state.building_room_width.*(rooms) +~
+        body: {},
+** Processing line: ~        terrain: {},~
 - Inside source: true
 *** True Line Result
-        b.w      = state.building_room_width.*(rooms) +
-** Processing line: ~                   state.building_room_spacing.*(rooms + 1)~
+        terrain: {},
+** Processing line: ~        impact: {}~
 - Inside source: true
 *** True Line Result
-                   state.building_room_spacing.*(rooms + 1)
-** Processing line: ~        b.h      = state.building_room_height.*(floors) +~
+        impact: {}
+** Processing line: ~      }~
 - Inside source: true
 *** True Line Result
-        b.h      = state.building_room_height.*(floors) +
-** Processing line: ~                   state.building_room_spacing.*(floors + 1)~
+      }
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-                   state.building_room_spacing.*(floors + 1)
-** Processing line: ~        b.right  = b.x + b.w~
+
+** Processing line: ~      r[:body][:line] = body.trajectory.dup~
 - Inside source: true
 *** True Line Result
-        b.right  = b.x + b.w
-** Processing line: ~        b.rect   = [b.x, b.y, b.w, b.h]~
+      r[:body][:line] = body.trajectory.dup
+** Processing line: ~      r[:body][:slope] = geometry.line_slope(body.trajectory, replace_infinity: infinity_alias)~
 - Inside source: true
 *** True Line Result
-        b.rect   = [b.x, b.y, b.w, b.h]
-** Processing line: ~        b.solids = [[b.x - 1, b.y, b.w + 2, b.h + 1, fancy_white],~
+      r[:body][:slope] = geometry.line_slope(body.trajectory, replace_infinity: infinity_alias)
+** Processing line: ~      r[:body][:slope_sign] = r[:body][:slope].sign~
 - Inside source: true
 *** True Line Result
-        b.solids = [[b.x - 1, b.y, b.w + 2, b.h + 1, fancy_white],
-** Processing line: ~                    [b.x, b.y, b.w, b.h, random_building_color],~
+      r[:body][:slope_sign] = r[:body][:slope].sign
+** Processing line: ~      r[:body][:x] = body.x~
 - Inside source: true
 *** True Line Result
-                    [b.x, b.y, b.w, b.h, random_building_color],
-** Processing line: ~                    windows_for_building(b.x, floors, rooms)]~
+      r[:body][:x] = body.x
+** Processing line: ~      r[:body][:y] = body.y~
 - Inside source: true
 *** True Line Result
-                    windows_for_building(b.x, floors, rooms)]
-** Processing line: ~      end~
+      r[:body][:y] = body.y
+** Processing line: ~      r[:body][:dy] = body.dy~
 - Inside source: true
 *** True Line Result
-      end
-** Processing line: ~    end~
+      r[:body][:dy] = body.dy
+** Processing line: ~      r[:body][:dx] = body.dx~
 - Inside source: true
 *** True Line Result
-    end
+      r[:body][:dx] = body.dx
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~    def parse_or_clear! game_prop~
+** Processing line: ~      r[:terrain][:line] = impact[:terrain].dup~
 - Inside source: true
 *** True Line Result
-    def parse_or_clear! game_prop
-** Processing line: ~      if int? state.as_hash[game_prop]~
+      r[:terrain][:line] = impact[:terrain].dup
+** Processing line: ~      r[:terrain][:slope] = geometry.line_slope(impact[:terrain], replace_infinity: infinity_alias)~
 - Inside source: true
 *** True Line Result
-      if int? state.as_hash[game_prop]
-** Processing line: ~        state.as_hash[game_prop] = state.as_hash[game_prop].to_i~
+      r[:terrain][:slope] = geometry.line_slope(impact[:terrain], replace_infinity: infinity_alias)
+** Processing line: ~      r[:terrain][:slope_sign] = r[:terrain][:slope].sign~
 - Inside source: true
 *** True Line Result
-        state.as_hash[game_prop] = state.as_hash[game_prop].to_i
-** Processing line: ~        return true~
+      r[:terrain][:slope_sign] = r[:terrain][:slope].sign
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-        return true
-** Processing line: ~      end~
+
+** Processing line: ~      r[:impact][:angle] = geometry.angle_between_lines(body.trajectory, impact[:terrain], replace_infinity: infinity_alias)~
 - Inside source: true
 *** True Line Result
-      end
-** Processing line: ~~
+      r[:impact][:angle] = geometry.angle_between_lines(body.trajectory, impact[:terrain], replace_infinity: infinity_alias)
+** Processing line: ~      r[:impact][:point] = { x: impact[:point].x, y: impact[:point].y }~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~      state.as_hash[game_prop] = nil~
+      r[:impact][:point] = { x: impact[:point].x, y: impact[:point].y }
+** Processing line: ~      r[:impact][:same_slope_sign] = r[:body][:slope_sign] == r[:terrain][:slope_sign]~
 - Inside source: true
 *** True Line Result
-      state.as_hash[game_prop] = nil
-** Processing line: ~      return false~
+      r[:impact][:same_slope_sign] = r[:body][:slope_sign] == r[:terrain][:slope_sign]
+** Processing line: ~      r[:impact][:ray] = body.ray_current~
 - Inside source: true
 *** True Line Result
-      return false
-** Processing line: ~    end~
+      r[:impact][:ray] = body.ray_current
+** Processing line: ~      r[:body][:new_on_floor] = body.on_floor~
 - Inside source: true
 *** True Line Result
-    end
+      r[:body][:new_on_floor] = body.on_floor
+** Processing line: ~      r[:body][:new_floor] = r[:terrain][:line]~
+- Inside source: true
+*** True Line Result
+      r[:body][:new_floor] = r[:terrain][:line]
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~    def new_banana owner, x, y, angle, velocity~
+** Processing line: ~      if r[:impact][:angle].abs < 90 && r[:terrain][:slope].abs < 3~
 - Inside source: true
 *** True Line Result
-    def new_banana owner, x, y, angle, velocity
-** Processing line: ~      state.new_entity(:banana) do |b|~
+      if r[:impact][:angle].abs < 90 && r[:terrain][:slope].abs < 3
+** Processing line: ~        play_sound~
 - Inside source: true
 *** True Line Result
-      state.new_entity(:banana) do |b|
-** Processing line: ~        b.owner     = owner~
+        play_sound
+** Processing line: ~        r[:body][:new_dy] = r[:body][:dy] * circle.elasticity * -1~
 - Inside source: true
 *** True Line Result
-        b.owner     = owner
-** Processing line: ~        b.x         = x~
+        r[:body][:new_dy] = r[:body][:dy] * circle.elasticity * -1
+** Processing line: ~        r[:body][:new_dx] = r[:body][:dx] * circle.elasticity~
 - Inside source: true
 *** True Line Result
-        b.x         = x
-** Processing line: ~        b.y         = y~
+        r[:body][:new_dx] = r[:body][:dx] * circle.elasticity
+** Processing line: ~        r[:impact][:type] = :horizontal~
 - Inside source: true
 *** True Line Result
-        b.y         = y
-** Processing line: ~        b.angle     = angle % 360~
+        r[:impact][:type] = :horizontal
+** Processing line: ~        r[:body][:new_reason] = "-"~
 - Inside source: true
 *** True Line Result
-        b.angle     = angle % 360
-** Processing line: ~        b.velocity  = velocity / 5~
+        r[:body][:new_reason] = "-"
+** Processing line: ~      elsif r[:impact][:angle].abs < 90 && r[:terrain][:slope].abs > 3~
 - Inside source: true
 *** True Line Result
-        b.velocity  = velocity / 5
-** Processing line: ~        b.dx        = b.angle.vector_x(b.velocity)~
+      elsif r[:impact][:angle].abs < 90 && r[:terrain][:slope].abs > 3
+** Processing line: ~        play_sound~
 - Inside source: true
 *** True Line Result
-        b.dx        = b.angle.vector_x(b.velocity)
-** Processing line: ~        b.dy        = b.angle.vector_y(b.velocity)~
+        play_sound
+** Processing line: ~        r[:body][:new_dy] = r[:body][:dy] * 1.1~
 - Inside source: true
 *** True Line Result
-        b.dy        = b.angle.vector_y(b.velocity)
-** Processing line: ~      end~
+        r[:body][:new_dy] = r[:body][:dy] * 1.1
+** Processing line: ~        r[:body][:new_dx] = r[:body][:dx] * -circle.elasticity~
 - Inside source: true
 *** True Line Result
-      end
-** Processing line: ~    end~
+        r[:body][:new_dx] = r[:body][:dx] * -circle.elasticity
+** Processing line: ~        r[:impact][:type] = :vertical~
 - Inside source: true
 *** True Line Result
-    end
-** Processing line: ~~
+        r[:impact][:type] = :vertical
+** Processing line: ~        r[:body][:new_reason] = "|"~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~    def fancy_white~
+        r[:body][:new_reason] = "|"
+** Processing line: ~      else~
 - Inside source: true
 *** True Line Result
-    def fancy_white
-** Processing line: ~      [253, 252, 253]~
+      else
+** Processing line: ~        play_sound~
 - Inside source: true
 *** True Line Result
-      [253, 252, 253]
-** Processing line: ~    end~
+        play_sound
+** Processing line: ~        r[:body][:new_dx] = r[:body][:dx] * -circle.elasticity~
 - Inside source: true
 *** True Line Result
-    end
-** Processing line: ~  end~
+        r[:body][:new_dx] = r[:body][:dx] * -circle.elasticity
+** Processing line: ~        r[:body][:new_dy] = r[:body][:dy] * -circle.elasticity~
 - Inside source: true
 *** True Line Result
-  end
+        r[:body][:new_dy] = r[:body][:dy] * -circle.elasticity
+** Processing line: ~        r[:impact][:type] = :slanted~
+- Inside source: true
+*** True Line Result
+        r[:impact][:type] = :slanted
+** Processing line: ~        r[:body][:new_reason] = "/"~
+- Inside source: true
+*** True Line Result
+        r[:body][:new_reason] = "/"
+** Processing line: ~      end~
+- Inside source: true
+*** True Line Result
+      end
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~  $you_so_basic_gorillas = YouSoBasicGorillas.new~
+** Processing line: ~      r[:impact][:energy] = r[:body][:new_dx].abs + r[:body][:new_dy].abs~
 - Inside source: true
 *** True Line Result
-  $you_so_basic_gorillas = YouSoBasicGorillas.new
+      r[:impact][:energy] = r[:body][:new_dx].abs + r[:body][:new_dy].abs
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~  def tick args~
+** Processing line: ~      if r[:impact][:energy] <= 0.3 && r[:terrain][:slope].abs < 4~
 - Inside source: true
 *** True Line Result
-  def tick args
-** Processing line: ~    $you_so_basic_gorillas.outputs = args.outputs~
+      if r[:impact][:energy] <= 0.3 && r[:terrain][:slope].abs < 4
+** Processing line: ~        r[:body][:new_dx] = 0~
 - Inside source: true
 *** True Line Result
-    $you_so_basic_gorillas.outputs = args.outputs
-** Processing line: ~    $you_so_basic_gorillas.grid    = args.grid~
+        r[:body][:new_dx] = 0
+** Processing line: ~        r[:body][:new_dy] = 0~
 - Inside source: true
 *** True Line Result
-    $you_so_basic_gorillas.grid    = args.grid
-** Processing line: ~    $you_so_basic_gorillas.state    = args.state~
+        r[:body][:new_dy] = 0
+** Processing line: ~        r[:impact][:energy] = 0~
 - Inside source: true
 *** True Line Result
-    $you_so_basic_gorillas.state    = args.state
-** Processing line: ~    $you_so_basic_gorillas.inputs  = args.inputs~
+        r[:impact][:energy] = 0
+** Processing line: ~        r[:body][:new_on_floor] = true~
 - Inside source: true
 *** True Line Result
-    $you_so_basic_gorillas.inputs  = args.inputs
-** Processing line: ~    $you_so_basic_gorillas.tick~
+        r[:body][:new_on_floor] = true
+** Processing line: ~        r[:body][:new_floor] = r[:terrain][:line]~
 - Inside source: true
 *** True Line Result
-    $you_so_basic_gorillas.tick
-** Processing line: ~  end~
+        r[:body][:new_floor] = r[:terrain][:line]
+** Processing line: ~        r[:body][:new_reason] = "0"~
 - Inside source: true
 *** True Line Result
-  end
-** Processing line: ~~
+        r[:body][:new_reason] = "0"
+** Processing line: ~      end~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~#+end_src~
-- Line was identified as the end of a code block.
-*** True Line Result
-#+end_src
+      end
 ** Processing line: ~~
-- End of paragraph detected.
+- Inside source: true
 *** True Line Result
 
-** Processing line: ~*** Platformer - Gorillas Basic - tests.rb~
-- Header detected.
+** Processing line: ~      r[:impact][:ray_next] = geometry.ray_test({ x: r[:body][:x] - (r[:body][:dx] * 1.1) + r[:body][:new_dx],~
+- Inside source: true
 *** True Line Result
-
+      r[:impact][:ray_next] = geometry.ray_test({ x: r[:body][:x] - (r[:body][:dx] * 1.1) + r[:body][:new_dx],
+** Processing line: ~                                                  y: r[:body][:y] - (r[:body][:dy] * 1.1) + r[:body][:new_dy] + state.gravity },~
+- Inside source: true
 *** True Line Result
-*** Platformer - Gorillas Basic - tests.rb
-** Processing line: ~#+begin_src ruby~
-- Line was identified as the beginning of a code block.
+                                                  y: r[:body][:y] - (r[:body][:dy] * 1.1) + r[:body][:new_dy] + state.gravity },
+** Processing line: ~                                                r[:terrain][:line])~
+- Inside source: true
 *** True Line Result
-
+                                                r[:terrain][:line])
+** Processing line: ~~
+- Inside source: true
 *** True Line Result
-#+begin_src ruby
-** Processing line: ~  # ./samples/99_genre_platformer/gorillas_basic/app/tests.rb~
+
+** Processing line: ~      if r[:impact][:ray_next] == r[:impact][:ray]~
 - Inside source: true
 *** True Line Result
-  # ./samples/99_genre_platformer/gorillas_basic/app/tests.rb
-** Processing line: ~  $gtk.reset 100~
+      if r[:impact][:ray_next] == r[:impact][:ray]
+** Processing line: ~        r[:body][:new_dx] *= -1~
 - Inside source: true
 *** True Line Result
-  $gtk.reset 100
-** Processing line: ~  $gtk.supress_framerate_warning = true~
+        r[:body][:new_dx] *= -1
+** Processing line: ~        r[:body][:new_dy] *= -1~
 - Inside source: true
 *** True Line Result
-  $gtk.supress_framerate_warning = true
-** Processing line: ~  $gtk.require 'app/tests/building_generation_tests.rb'~
+        r[:body][:new_dy] *= -1
+** Processing line: ~        r[:body][:new_reason] = "clip"~
 - Inside source: true
 *** True Line Result
-  $gtk.require 'app/tests/building_generation_tests.rb'
-** Processing line: ~  $gtk.tests.start~
+        r[:body][:new_reason] = "clip"
+** Processing line: ~      end~
 - Inside source: true
 *** True Line Result
-  $gtk.tests.start
+      end
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~#+end_src~
-- Line was identified as the end of a code block.
+** Processing line: ~      r~
+- Inside source: true
 *** True Line Result
-#+end_src
+      r
+** Processing line: ~    end~
+- Inside source: true
+*** True Line Result
+    end
 ** Processing line: ~~
-- End of paragraph detected.
+- Inside source: true
 *** True Line Result
 
-** Processing line: ~*** Platformer - Gorillas Basic - Tests - building_generation_tests.rb~
-- Header detected.
+** Processing line: ~    def game_over!~
+- Inside source: true
 *** True Line Result
-
+    def game_over!
+** Processing line: ~      circle.x = circle.check_point_x~
+- Inside source: true
 *** True Line Result
-*** Platformer - Gorillas Basic - Tests - building_generation_tests.rb
-** Processing line: ~#+begin_src ruby~
-- Line was identified as the beginning of a code block.
+      circle.x = circle.check_point_x
+** Processing line: ~      circle.y = circle.check_point_y~
+- Inside source: true
 *** True Line Result
-
+      circle.y = circle.check_point_y
+** Processing line: ~      circle.dx = 0~
+- Inside source: true
 *** True Line Result
-#+begin_src ruby
-** Processing line: ~  # ./samples/99_genre_platformer/gorillas_basic/app/tests/building_generation_tests.rb~
+      circle.dx = 0
+** Processing line: ~      circle.dy = 0~
 - Inside source: true
 *** True Line Result
-  # ./samples/99_genre_platformer/gorillas_basic/app/tests/building_generation_tests.rb
-** Processing line: ~  def test_solids args, assert~
+      circle.dy = 0
+** Processing line: ~      circle.game_over_at = state.tick_count~
 - Inside source: true
 *** True Line Result
-  def test_solids args, assert
-** Processing line: ~    game = YouSoBasicGorillas.new~
+      circle.game_over_at = state.tick_count
+** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
-    game = YouSoBasicGorillas.new
-** Processing line: ~    game.outputs = args.outputs~
+    end
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-    game.outputs = args.outputs
-** Processing line: ~    game.grid = args.grid~
+
+** Processing line: ~    def not_game_over!~
 - Inside source: true
 *** True Line Result
-    game.grid = args.grid
-** Processing line: ~    game.state = args.state~
+    def not_game_over!
+** Processing line: ~      impact_history_entry = impact_result circle, circle.impact~
 - Inside source: true
 *** True Line Result
-    game.state = args.state
-** Processing line: ~    game.inputs = args.inputs~
+      impact_history_entry = impact_result circle, circle.impact
+** Processing line: ~      circle.impact_history << impact_history_entry~
 - Inside source: true
 *** True Line Result
-    game.inputs = args.inputs
-** Processing line: ~    game.tick~
+      circle.impact_history << impact_history_entry
+** Processing line: ~      circle.x -= circle.dx * 1.1~
 - Inside source: true
 *** True Line Result
-    game.tick
-** Processing line: ~    assert.true! args.state.stage_generated, "stage wasn't generated but it should have been"~
+      circle.x -= circle.dx * 1.1
+** Processing line: ~      circle.y -= circle.dy * 1.1~
 - Inside source: true
 *** True Line Result
-    assert.true! args.state.stage_generated, "stage wasn't generated but it should have been"
-** Processing line: ~    game.tick~
+      circle.y -= circle.dy * 1.1
+** Processing line: ~      circle.dx = impact_history_entry[:body][:new_dx]~
 - Inside source: true
 *** True Line Result
-    game.tick
-** Processing line: ~    assert.true! args.outputs.static_solids.length > 0, "stage wasn't rendered"~
+      circle.dx = impact_history_entry[:body][:new_dx]
+** Processing line: ~      circle.dy = impact_history_entry[:body][:new_dy]~
 - Inside source: true
 *** True Line Result
-    assert.true! args.outputs.static_solids.length > 0, "stage wasn't rendered"
-** Processing line: ~    number_of_building_components = (args.state.buildings.map { |b| 2 + b.solids[2].length }.inject do |sum, v| (sum || 0) + v end)~
+      circle.dy = impact_history_entry[:body][:new_dy]
+** Processing line: ~      circle.on_floor = impact_history_entry[:body][:new_on_floor]~
 - Inside source: true
 *** True Line Result
-    number_of_building_components = (args.state.buildings.map { |b| 2 + b.solids[2].length }.inject do |sum, v| (sum || 0) + v end)
-** Processing line: ~    the_only_background = 1~
+      circle.on_floor = impact_history_entry[:body][:new_on_floor]
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-    the_only_background = 1
-** Processing line: ~    static_solids = args.outputs.static_solids.length~
+
+** Processing line: ~      if circle.on_floor~
 - Inside source: true
 *** True Line Result
-    static_solids = args.outputs.static_solids.length
-** Processing line: ~    assert.true! static_solids == the_only_background.+(number_of_building_components), "not all parts of the buildings and background were rendered"~
+      if circle.on_floor
+** Processing line: ~        circle.check_point_at = state.tick_count~
 - Inside source: true
 *** True Line Result
-    assert.true! static_solids == the_only_background.+(number_of_building_components), "not all parts of the buildings and background were rendered"
-** Processing line: ~  end~
+        circle.check_point_at = state.tick_count
+** Processing line: ~        circle.check_point_x = circle.x~
 - Inside source: true
 *** True Line Result
-  end
-** Processing line: ~~
+        circle.check_point_x = circle.x
+** Processing line: ~        circle.check_point_y = circle.y~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~#+end_src~
-- Line was identified as the end of a code block.
+        circle.check_point_y = circle.y
+** Processing line: ~      end~
+- Inside source: true
 *** True Line Result
-#+end_src
+      end
 ** Processing line: ~~
-- End of paragraph detected.
+- Inside source: true
 *** True Line Result
 
-** Processing line: ~*** Platformer - The Little Probe - main.rb~
-- Header detected.
+** Processing line: ~      circle.previous_floor = circle.floor || {}~
+- Inside source: true
 *** True Line Result
-
+      circle.previous_floor = circle.floor || {}
+** Processing line: ~      circle.floor = impact_history_entry[:body][:new_floor] || {}~
+- Inside source: true
 *** True Line Result
-*** Platformer - The Little Probe - main.rb
-** Processing line: ~#+begin_src ruby~
-- Line was identified as the beginning of a code block.
+      circle.floor = impact_history_entry[:body][:new_floor] || {}
+** Processing line: ~      circle.floor_point = impact_history_entry[:impact][:point]~
+- Inside source: true
 *** True Line Result
-
+      circle.floor_point = impact_history_entry[:impact][:point]
+** Processing line: ~      if circle.floor.slice(:x, :y, :x2, :y2) != circle.previous_floor.slice(:x, :y, :x2, :y2)~
+- Inside source: true
 *** True Line Result
-#+begin_src ruby
-** Processing line: ~  # ./samples/99_genre_platformer/the_little_probe/app/main.rb~
+      if circle.floor.slice(:x, :y, :x2, :y2) != circle.previous_floor.slice(:x, :y, :x2, :y2)
+** Processing line: ~        new_relative_x = if circle.dx > 0~
 - Inside source: true
 *** True Line Result
-  # ./samples/99_genre_platformer/the_little_probe/app/main.rb
-** Processing line: ~  class FallingCircle~
+        new_relative_x = if circle.dx > 0
+** Processing line: ~                           :right~
 - Inside source: true
 *** True Line Result
-  class FallingCircle
-** Processing line: ~    attr_gtk~
+                           :right
+** Processing line: ~                         elsif circle.dx < 0~
+- Inside source: true
+*** True Line Result
+                         elsif circle.dx < 0
+** Processing line: ~                           :left~
+- Inside source: true
+*** True Line Result
+                           :left
+** Processing line: ~                         else~
+- Inside source: true
+*** True Line Result
+                         else
+** Processing line: ~                           nil~
+- Inside source: true
+*** True Line Result
+                           nil
+** Processing line: ~                         end~
 - Inside source: true
 *** True Line Result
-    attr_gtk
+                         end
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~    def tick~
+** Processing line: ~        new_relative_y = if circle.dy > 0~
 - Inside source: true
 *** True Line Result
-    def tick
-** Processing line: ~      fiddle~
+        new_relative_y = if circle.dy > 0
+** Processing line: ~                           :above~
 - Inside source: true
 *** True Line Result
-      fiddle
-** Processing line: ~      defaults~
+                           :above
+** Processing line: ~                         elsif circle.dy < 0~
 - Inside source: true
 *** True Line Result
-      defaults
-** Processing line: ~      render~
+                         elsif circle.dy < 0
+** Processing line: ~                           :below~
 - Inside source: true
 *** True Line Result
-      render
-** Processing line: ~      input~
+                           :below
+** Processing line: ~                         else~
 - Inside source: true
 *** True Line Result
-      input
-** Processing line: ~      calc~
+                         else
+** Processing line: ~                           nil~
 - Inside source: true
 *** True Line Result
-      calc
-** Processing line: ~    end~
+                           nil
+** Processing line: ~                         end~
 - Inside source: true
 *** True Line Result
-    end
+                         end
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~    def fiddle~
+** Processing line: ~        circle.floor_relative_x = new_relative_x~
 - Inside source: true
 *** True Line Result
-    def fiddle
-** Processing line: ~      state.gravity     = -0.02~
+        circle.floor_relative_x = new_relative_x
+** Processing line: ~        circle.floor_relative_y = new_relative_y~
 - Inside source: true
 *** True Line Result
-      state.gravity     = -0.02
-** Processing line: ~      circle.radius     = 15~
+        circle.floor_relative_y = new_relative_y
+** Processing line: ~      end~
 - Inside source: true
 *** True Line Result
-      circle.radius     = 15
-** Processing line: ~      circle.elasticity = 0.4~
+      end
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-      circle.elasticity = 0.4
-** Processing line: ~      camera.follow_speed = 0.4 * 0.4~
+
+** Processing line: ~      circle.impact = nil~
 - Inside source: true
 *** True Line Result
-      camera.follow_speed = 0.4 * 0.4
+      circle.impact = nil
+** Processing line: ~      circle.terrains_to_monitor.clear~
+- Inside source: true
+*** True Line Result
+      circle.terrains_to_monitor.clear
 ** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
@@ -123451,42 +128907,46 @@ Follows is a source code listing for all files that have been open sourced. This
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~    def render~
+** Processing line: ~    def calc_physics~
 - Inside source: true
 *** True Line Result
-    def render
-** Processing line: ~      render_stage_editor~
+    def calc_physics
+** Processing line: ~      if args.state.god_mode~
 - Inside source: true
 *** True Line Result
-      render_stage_editor
-** Processing line: ~      render_debug~
+      if args.state.god_mode
+** Processing line: ~        calc_potential_impacts~
 - Inside source: true
 *** True Line Result
-      render_debug
-** Processing line: ~      render_game~
+        calc_potential_impacts
+** Processing line: ~        calc_terrains_to_monitor~
 - Inside source: true
 *** True Line Result
-      render_game
-** Processing line: ~    end~
+        calc_terrains_to_monitor
+** Processing line: ~        return~
 - Inside source: true
 *** True Line Result
-    end
+        return
+** Processing line: ~      end~
+- Inside source: true
+*** True Line Result
+      end
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~    def defaults~
+** Processing line: ~      if circle.y < -700~
 - Inside source: true
 *** True Line Result
-    def defaults
-** Processing line: ~      if state.tick_count == 0~
+      if circle.y < -700
+** Processing line: ~        game_over~
 - Inside source: true
 *** True Line Result
-      if state.tick_count == 0
-** Processing line: ~        outputs.sounds << "sounds/bg.ogg"~
+        game_over
+** Processing line: ~        return~
 - Inside source: true
 *** True Line Result
-        outputs.sounds << "sounds/bg.ogg"
+        return
 ** Processing line: ~      end~
 - Inside source: true
 *** True Line Result
@@ -123495,422 +128955,422 @@ Follows is a source code listing for all files that have been open sourced. This
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~      state.storyline ||= [~
+** Processing line: ~      return if state.game_over~
 - Inside source: true
 *** True Line Result
-      state.storyline ||= [
-** Processing line: ~        { text: "<- -> to aim, hold space to charge",                            distance_gate: 0 },~
+      return if state.game_over
+** Processing line: ~      return if circle.on_floor~
 - Inside source: true
 *** True Line Result
-        { text: "<- -> to aim, hold space to charge",                            distance_gate: 0 },
-** Processing line: ~        { text: "the little probe - by @amirrajan, made with DragonRuby Game Toolkit", distance_gate: 0 },~
+      return if circle.on_floor
+** Processing line: ~      circle.previous_dy = circle.dy~
 - Inside source: true
 *** True Line Result
-        { text: "the little probe - by @amirrajan, made with DragonRuby Game Toolkit", distance_gate: 0 },
-** Processing line: ~        { text: "mission control, this is sasha. landing on europa successful.", distance_gate: 0 },~
+      circle.previous_dy = circle.dy
+** Processing line: ~      circle.previous_dx = circle.dx~
 - Inside source: true
 *** True Line Result
-        { text: "mission control, this is sasha. landing on europa successful.", distance_gate: 0 },
-** Processing line: ~        { text: "operation \"find earth 2.0\", initiated at 8-29-2036 14:00.",   distance_gate: 0 },~
+      circle.previous_dx = circle.dx
+** Processing line: ~      circle.x  += circle.dx~
 - Inside source: true
 *** True Line Result
-        { text: "operation \"find earth 2.0\", initiated at 8-29-2036 14:00.",   distance_gate: 0 },
-** Processing line: ~        { text: "jupiter's sure is beautiful...",   distance_gate: 4000 },~
+      circle.x  += circle.dx
+** Processing line: ~      circle.y  += circle.dy~
 - Inside source: true
 *** True Line Result
-        { text: "jupiter's sure is beautiful...",   distance_gate: 4000 },
-** Processing line: ~        { text: "hmm, it seems there's some kind of anomoly in the sky",   distance_gate: 7000 },~
+      circle.y  += circle.dy
+** Processing line: ~      args.state.distance_traveled ||= 0~
 - Inside source: true
 *** True Line Result
-        { text: "hmm, it seems there's some kind of anomoly in the sky",   distance_gate: 7000 },
-** Processing line: ~        { text: "dancing lights, i'll call them whisps.",   distance_gate: 8000 },~
+      args.state.distance_traveled ||= 0
+** Processing line: ~      args.state.distance_traveled += circle.dx.abs + circle.dy.abs~
 - Inside source: true
 *** True Line Result
-        { text: "dancing lights, i'll call them whisps.",   distance_gate: 8000 },
-** Processing line: ~        { text: "#todo... look i ran out of time -_-",   distance_gate: 9000 },~
+      args.state.distance_traveled += circle.dx.abs + circle.dy.abs
+** Processing line: ~      circle.dy += state.gravity~
 - Inside source: true
 *** True Line Result
-        { text: "#todo... look i ran out of time -_-",   distance_gate: 9000 },
-** Processing line: ~        { text: "there's never enough time",   distance_gate: 9000 },~
+      circle.dy += state.gravity
+** Processing line: ~      calc_potential_impacts~
 - Inside source: true
 *** True Line Result
-        { text: "there's never enough time",   distance_gate: 9000 },
-** Processing line: ~        { text: "the game jam was fun though ^_^",   distance_gate: 10000 },~
+      calc_potential_impacts
+** Processing line: ~      calc_terrains_to_monitor~
 - Inside source: true
 *** True Line Result
-        { text: "the game jam was fun though ^_^",   distance_gate: 10000 },
-** Processing line: ~      ]~
+      calc_terrains_to_monitor
+** Processing line: ~      return unless circle.impact~
 - Inside source: true
 *** True Line Result
-      ]
-** Processing line: ~~
+      return unless circle.impact
+** Processing line: ~      if circle.impact && circle.impact[:type] == :lava~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~      load_level force: args.state.tick_count == 0~
+      if circle.impact && circle.impact[:type] == :lava
+** Processing line: ~        game_over!~
 - Inside source: true
 *** True Line Result
-      load_level force: args.state.tick_count == 0
-** Processing line: ~      state.line_mode            ||= :terrain~
+        game_over!
+** Processing line: ~      else~
 - Inside source: true
 *** True Line Result
-      state.line_mode            ||= :terrain
-** Processing line: ~~
+      else
+** Processing line: ~        not_game_over!~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~      state.sound_index          ||= 1~
+        not_game_over!
+** Processing line: ~      end~
 - Inside source: true
 *** True Line Result
-      state.sound_index          ||= 1
-** Processing line: ~      circle.potential_lift      ||= 0~
+      end
+** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
-      circle.potential_lift      ||= 0
-** Processing line: ~      circle.angle               ||= 90~
+    end
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-      circle.angle               ||= 90
-** Processing line: ~      circle.check_point_at      ||= -1000~
+
+** Processing line: ~    def input_god_mode~
 - Inside source: true
 *** True Line Result
-      circle.check_point_at      ||= -1000
-** Processing line: ~      circle.game_over_at        ||= -1000~
+    def input_god_mode
+** Processing line: ~      state.debug_mode = !state.debug_mode if inputs.keyboard.key_down.forward_slash~
 - Inside source: true
 *** True Line Result
-      circle.game_over_at        ||= -1000
-** Processing line: ~      circle.x                   ||= -485~
+      state.debug_mode = !state.debug_mode if inputs.keyboard.key_down.forward_slash
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-      circle.x                   ||= -485
-** Processing line: ~      circle.y                   ||= 12226~
+
+** Processing line: ~      # toggle god mode~
 - Inside source: true
 *** True Line Result
-      circle.y                   ||= 12226
-** Processing line: ~      circle.check_point_x       ||= circle.x~
+      # toggle god mode
+** Processing line: ~      if inputs.keyboard.key_down.g~
 - Inside source: true
 *** True Line Result
-      circle.check_point_x       ||= circle.x
-** Processing line: ~      circle.check_point_y       ||= circle.y~
+      if inputs.keyboard.key_down.g
+** Processing line: ~        state.god_mode = !state.god_mode~
 - Inside source: true
 *** True Line Result
-      circle.check_point_y       ||= circle.y
-** Processing line: ~      circle.dy                  ||= 0~
+        state.god_mode = !state.god_mode
+** Processing line: ~        state.potential_lift = 0~
 - Inside source: true
 *** True Line Result
-      circle.dy                  ||= 0
-** Processing line: ~      circle.dx                  ||= 0~
+        state.potential_lift = 0
+** Processing line: ~        circle.floor = nil~
 - Inside source: true
 *** True Line Result
-      circle.dx                  ||= 0
-** Processing line: ~      circle.previous_dy         ||= 0~
+        circle.floor = nil
+** Processing line: ~        circle.floor_point = nil~
 - Inside source: true
 *** True Line Result
-      circle.previous_dy         ||= 0
-** Processing line: ~      circle.previous_dx         ||= 0~
+        circle.floor_point = nil
+** Processing line: ~        circle.floor_relative_x = nil~
 - Inside source: true
 *** True Line Result
-      circle.previous_dx         ||= 0
-** Processing line: ~      circle.angle               ||= 0~
+        circle.floor_relative_x = nil
+** Processing line: ~        circle.floor_relative_y = nil~
 - Inside source: true
 *** True Line Result
-      circle.angle               ||= 0
-** Processing line: ~      circle.after_images        ||= []~
+        circle.floor_relative_y = nil
+** Processing line: ~        circle.impact = nil~
 - Inside source: true
 *** True Line Result
-      circle.after_images        ||= []
-** Processing line: ~      circle.terrains_to_monitor ||= {}~
+        circle.impact = nil
+** Processing line: ~        circle.terrains_to_monitor.clear~
 - Inside source: true
 *** True Line Result
-      circle.terrains_to_monitor ||= {}
-** Processing line: ~      circle.impact_history      ||= []~
+        circle.terrains_to_monitor.clear
+** Processing line: ~        return~
 - Inside source: true
 *** True Line Result
-      circle.impact_history      ||= []
+        return
+** Processing line: ~      end~
+- Inside source: true
+*** True Line Result
+      end
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~      camera.x                   ||= 0~
+** Processing line: ~      return unless state.god_mode~
 - Inside source: true
 *** True Line Result
-      camera.x                   ||= 0
-** Processing line: ~      camera.y                   ||= 0~
+      return unless state.god_mode
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-      camera.y                   ||= 0
-** Processing line: ~      camera.target_x            ||= 0~
+
+** Processing line: ~      circle.x = circle.x.to_i~
 - Inside source: true
 *** True Line Result
-      camera.target_x            ||= 0
-** Processing line: ~      camera.target_y            ||= 0~
+      circle.x = circle.x.to_i
+** Processing line: ~      circle.y = circle.y.to_i~
 - Inside source: true
 *** True Line Result
-      camera.target_y            ||= 0
-** Processing line: ~      state.snaps                ||= { }~
+      circle.y = circle.y.to_i
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-      state.snaps                ||= { }
-** Processing line: ~      state.snap_number            = 10~
+
+** Processing line: ~      # move god circle~
 - Inside source: true
 *** True Line Result
-      state.snap_number            = 10
-** Processing line: ~~
+      # move god circle
+** Processing line: ~      if inputs.keyboard.left || inputs.keyboard.a~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~      args.state.storyline_x ||= -1000~
+      if inputs.keyboard.left || inputs.keyboard.a
+** Processing line: ~        circle.x -= 20~
 - Inside source: true
 *** True Line Result
-      args.state.storyline_x ||= -1000
-** Processing line: ~      args.state.storyline_y ||= -1000~
+        circle.x -= 20
+** Processing line: ~      elsif inputs.keyboard.right || inputs.keyboard.d || inputs.keyboard.f~
 - Inside source: true
 *** True Line Result
-      args.state.storyline_y ||= -1000
-** Processing line: ~    end~
+      elsif inputs.keyboard.right || inputs.keyboard.d || inputs.keyboard.f
+** Processing line: ~        circle.x += 20~
 - Inside source: true
 *** True Line Result
-    end
-** Processing line: ~~
+        circle.x += 20
+** Processing line: ~      end~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~    def render_game~
+      end
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-    def render_game
-** Processing line: ~      outputs.background_color = [0, 0, 0]~
+
+** Processing line: ~      if inputs.keyboard.up || inputs.keyboard.w~
 - Inside source: true
 *** True Line Result
-      outputs.background_color = [0, 0, 0]
-** Processing line: ~      outputs.sprites << [-circle.x + 1100,~
+      if inputs.keyboard.up || inputs.keyboard.w
+** Processing line: ~        circle.y += 20~
 - Inside source: true
 *** True Line Result
-      outputs.sprites << [-circle.x + 1100,
-** Processing line: ~                          -circle.y - 100,~
+        circle.y += 20
+** Processing line: ~      elsif inputs.keyboard.down || inputs.keyboard.s~
 - Inside source: true
 *** True Line Result
-                          -circle.y - 100,
-** Processing line: ~                          2416 * 4,~
+      elsif inputs.keyboard.down || inputs.keyboard.s
+** Processing line: ~        circle.y -= 20~
 - Inside source: true
 *** True Line Result
-                          2416 * 4,
-** Processing line: ~                          3574 * 4,~
+        circle.y -= 20
+** Processing line: ~      end~
 - Inside source: true
 *** True Line Result
-                          3574 * 4,
-** Processing line: ~                          'sprites/jupiter.png']~
+      end
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-                          'sprites/jupiter.png']
-** Processing line: ~      outputs.sprites << [-circle.x,~
+
+** Processing line: ~      # delete terrain~
 - Inside source: true
 *** True Line Result
-      outputs.sprites << [-circle.x,
-** Processing line: ~                          -circle.y,~
+      # delete terrain
+** Processing line: ~      if inputs.keyboard.key_down.x~
 - Inside source: true
 *** True Line Result
-                          -circle.y,
-** Processing line: ~                          2416 * 4,~
+      if inputs.keyboard.key_down.x
+** Processing line: ~        calc_terrains_to_monitor~
 - Inside source: true
 *** True Line Result
-                          2416 * 4,
-** Processing line: ~                          3574 * 4,~
+        calc_terrains_to_monitor
+** Processing line: ~        state.terrain = state.terrain.reject do |t|~
 - Inside source: true
 *** True Line Result
-                          3574 * 4,
-** Processing line: ~                          'sprites/level.png']~
+        state.terrain = state.terrain.reject do |t|
+** Processing line: ~          t[:rect].intersect_rect? circle.rect~
 - Inside source: true
 *** True Line Result
-                          'sprites/level.png']
-** Processing line: ~      outputs.sprites << state.whisp_queue~
+          t[:rect].intersect_rect? circle.rect
+** Processing line: ~        end~
 - Inside source: true
 *** True Line Result
-      outputs.sprites << state.whisp_queue
-** Processing line: ~      render_aiming_retical~
+        end
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-      render_aiming_retical
-** Processing line: ~      render_circle~
+
+** Processing line: ~        state.lava = state.lava.reject do |t|~
 - Inside source: true
 *** True Line Result
-      render_circle
-** Processing line: ~      render_notification~
+        state.lava = state.lava.reject do |t|
+** Processing line: ~          t[:rect].intersect_rect? circle.rect~
 - Inside source: true
 *** True Line Result
-      render_notification
-** Processing line: ~    end~
+          t[:rect].intersect_rect? circle.rect
+** Processing line: ~        end~
 - Inside source: true
 *** True Line Result
-    end
+        end
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~    def render_notification~
-- Inside source: true
-*** True Line Result
-    def render_notification
-** Processing line: ~      toast_length = 500~
+** Processing line: ~        calc_potential_impacts~
 - Inside source: true
 *** True Line Result
-      toast_length = 500
-** Processing line: ~      if circle.game_over_at.elapsed_time < toast_length~
+        calc_potential_impacts
+** Processing line: ~        save_level~
 - Inside source: true
 *** True Line Result
-      if circle.game_over_at.elapsed_time < toast_length
-** Processing line: ~        label_text = "..."~
+        save_level
+** Processing line: ~      end~
 - Inside source: true
 *** True Line Result
-        label_text = "..."
-** Processing line: ~      elsif circle.check_point_at.elapsed_time > toast_length~
+      end
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-      elsif circle.check_point_at.elapsed_time > toast_length
-** Processing line: ~        args.state.current_storyline = nil~
+
+** Processing line: ~      # change terrain type~
 - Inside source: true
 *** True Line Result
-        args.state.current_storyline = nil
-** Processing line: ~        return~
+      # change terrain type
+** Processing line: ~      if inputs.keyboard.key_down.l~
 - Inside source: true
 *** True Line Result
-        return
-** Processing line: ~      end~
+      if inputs.keyboard.key_down.l
+** Processing line: ~        if state.line_mode == :terrain~
 - Inside source: true
 *** True Line Result
-      end
-** Processing line: ~      if circle.check_point_at &&~
+        if state.line_mode == :terrain
+** Processing line: ~          state.line_mode = :lava~
 - Inside source: true
 *** True Line Result
-      if circle.check_point_at &&
-** Processing line: ~         circle.check_point_at.elapsed_time == 1 &&~
+          state.line_mode = :lava
+** Processing line: ~        else~
 - Inside source: true
 *** True Line Result
-         circle.check_point_at.elapsed_time == 1 &&
-** Processing line: ~         !args.state.current_storyline~
+        else
+** Processing line: ~          state.line_mode = :terrain~
 - Inside source: true
 *** True Line Result
-         !args.state.current_storyline
-** Processing line: ~         if args.state.storyline.length > 0 && args.state.distance_traveled > args.state.storyline[0][:distance_gate]~
+          state.line_mode = :terrain
+** Processing line: ~        end~
 - Inside source: true
 *** True Line Result
-         if args.state.storyline.length > 0 && args.state.distance_traveled > args.state.storyline[0][:distance_gate]
-** Processing line: ~           args.state.current_storyline = args.state.storyline.shift[:text]~
+        end
+** Processing line: ~      end~
 - Inside source: true
 *** True Line Result
-           args.state.current_storyline = args.state.storyline.shift[:text]
-** Processing line: ~           args.state.distance_traveled ||= 0~
+      end
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-           args.state.distance_traveled ||= 0
-** Processing line: ~           args.state.storyline_x = circle.x~
+
+** Processing line: ~      if inputs.mouse.click && !state.point_one~
 - Inside source: true
 *** True Line Result
-           args.state.storyline_x = circle.x
-** Processing line: ~           args.state.storyline_y = circle.y~
+      if inputs.mouse.click && !state.point_one
+** Processing line: ~        state.point_one = inputs.mouse.click.point~
 - Inside source: true
 *** True Line Result
-           args.state.storyline_y = circle.y
-** Processing line: ~         end~
+        state.point_one = inputs.mouse.click.point
+** Processing line: ~      elsif inputs.mouse.click && state.point_one~
 - Inside source: true
 *** True Line Result
-         end
-** Processing line: ~        return unless args.state.current_storyline~
+      elsif inputs.mouse.click && state.point_one
+** Processing line: ~        l = [*state.point_one, *inputs.mouse.click.point]~
 - Inside source: true
 *** True Line Result
-        return unless args.state.current_storyline
-** Processing line: ~      end~
+        l = [*state.point_one, *inputs.mouse.click.point]
+** Processing line: ~        l = [l.x  - state.camera.x,~
 - Inside source: true
 *** True Line Result
-      end
-** Processing line: ~      label_text = args.state.current_storyline~
+        l = [l.x  - state.camera.x,
+** Processing line: ~             l.y  - state.camera.y,~
 - Inside source: true
 *** True Line Result
-      label_text = args.state.current_storyline
-** Processing line: ~      return unless label_text~
+             l.y  - state.camera.y,
+** Processing line: ~             l.x2 - state.camera.x,~
 - Inside source: true
 *** True Line Result
-      return unless label_text
-** Processing line: ~      x = circle.x + camera.x~
+             l.x2 - state.camera.x,
+** Processing line: ~             l.y2 - state.camera.y].line.to_hash~
 - Inside source: true
 *** True Line Result
-      x = circle.x + camera.x
-** Processing line: ~      y = circle.y + camera.y - 40~
+             l.y2 - state.camera.y].line.to_hash
+** Processing line: ~        l[:rect] = rect_for_line l~
 - Inside source: true
 *** True Line Result
-      y = circle.y + camera.y - 40
-** Processing line: ~      w = 900~
+        l[:rect] = rect_for_line l
+** Processing line: ~        if state.line_mode == :terrain~
 - Inside source: true
 *** True Line Result
-      w = 900
-** Processing line: ~      h = 30~
+        if state.line_mode == :terrain
+** Processing line: ~          state.terrain << l~
 - Inside source: true
 *** True Line Result
-      h = 30
-** Processing line: ~      outputs.primitives << [x - w.idiv(2), y - h, w, h, 255, 255, 255, 255].solid~
+          state.terrain << l
+** Processing line: ~        else~
 - Inside source: true
 *** True Line Result
-      outputs.primitives << [x - w.idiv(2), y - h, w, h, 255, 255, 255, 255].solid
-** Processing line: ~      outputs.primitives << [x - w.idiv(2), y - h, w, h, 0, 0, 0, 255].border~
+        else
+** Processing line: ~          state.lava << l~
 - Inside source: true
 *** True Line Result
-      outputs.primitives << [x - w.idiv(2), y - h, w, h, 0, 0, 0, 255].border
-** Processing line: ~      outputs.labels << [x, y - 4, label_text, 1, 1, 0, 0, 0, 255]~
+          state.lava << l
+** Processing line: ~        end~
 - Inside source: true
 *** True Line Result
-      outputs.labels << [x, y - 4, label_text, 1, 1, 0, 0, 0, 255]
-** Processing line: ~    end~
+        end
+** Processing line: ~        save_level~
 - Inside source: true
 *** True Line Result
-    end
-** Processing line: ~~
+        save_level
+** Processing line: ~        next_x = inputs.mouse.click.point.x - 640~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~    def render_aiming_retical~
+        next_x = inputs.mouse.click.point.x - 640
+** Processing line: ~        next_y = inputs.mouse.click.point.y - 360~
 - Inside source: true
 *** True Line Result
-    def render_aiming_retical
-** Processing line: ~      outputs.sprites << [state.camera.x + circle.x + circle.angle.vector_x(circle.potential_lift * 10) - 5,~
+        next_y = inputs.mouse.click.point.y - 360
+** Processing line: ~        circle.x += next_x~
 - Inside source: true
 *** True Line Result
-      outputs.sprites << [state.camera.x + circle.x + circle.angle.vector_x(circle.potential_lift * 10) - 5,
-** Processing line: ~                          state.camera.y + circle.y + circle.angle.vector_y(circle.potential_lift * 10) - 5,~
+        circle.x += next_x
+** Processing line: ~        circle.y += next_y~
 - Inside source: true
 *** True Line Result
-                          state.camera.y + circle.y + circle.angle.vector_y(circle.potential_lift * 10) - 5,
-** Processing line: ~                          10, 10, 'sprites/circle-orange.png']~
+        circle.y += next_y
+** Processing line: ~        state.point_one = nil~
 - Inside source: true
 *** True Line Result
-                          10, 10, 'sprites/circle-orange.png']
-** Processing line: ~      outputs.sprites << [state.camera.x + circle.x + circle.angle.vector_x(circle.radius * 3) - 5,~
+        state.point_one = nil
+** Processing line: ~      elsif inputs.keyboard.one~
 - Inside source: true
 *** True Line Result
-      outputs.sprites << [state.camera.x + circle.x + circle.angle.vector_x(circle.radius * 3) - 5,
-** Processing line: ~                          state.camera.y + circle.y + circle.angle.vector_y(circle.radius * 3) - 5,~
+      elsif inputs.keyboard.one
+** Processing line: ~        state.point_one = [circle.x + camera.x, circle.y+ camera.y]~
 - Inside source: true
 *** True Line Result
-                          state.camera.y + circle.y + circle.angle.vector_y(circle.radius * 3) - 5,
-** Processing line: ~                          10, 10, 'sprites/circle-orange.png', 0, 128]~
+        state.point_one = [circle.x + camera.x, circle.y+ camera.y]
+** Processing line: ~      end~
 - Inside source: true
 *** True Line Result
-                          10, 10, 'sprites/circle-orange.png', 0, 128]
-** Processing line: ~      if rand > 0.9~
+      end
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-      if rand > 0.9
-** Processing line: ~        outputs.sprites << [state.camera.x + circle.x + circle.angle.vector_x(circle.radius * 3) - 5,~
+
+** Processing line: ~      # cancel chain lines~
 - Inside source: true
 *** True Line Result
-        outputs.sprites << [state.camera.x + circle.x + circle.angle.vector_x(circle.radius * 3) - 5,
-** Processing line: ~                            state.camera.y + circle.y + circle.angle.vector_y(circle.radius * 3) - 5,~
+      # cancel chain lines
+** Processing line: ~      if inputs.keyboard.key_down.nine || inputs.keyboard.key_down.escape || inputs.keyboard.key_up.six || inputs.keyboard.key_up.one~
 - Inside source: true
 *** True Line Result
-                            state.camera.y + circle.y + circle.angle.vector_y(circle.radius * 3) - 5,
-** Processing line: ~                            10, 10, 'sprites/circle-white.png', 0, 128]~
+      if inputs.keyboard.key_down.nine || inputs.keyboard.key_down.escape || inputs.keyboard.key_up.six || inputs.keyboard.key_up.one
+** Processing line: ~        state.point_one = nil~
 - Inside source: true
 *** True Line Result
-                            10, 10, 'sprites/circle-white.png', 0, 128]
+        state.point_one = nil
 ** Processing line: ~      end~
 - Inside source: true
 *** True Line Result
@@ -123923,114 +129383,138 @@ Follows is a source code listing for all files that have been open sourced. This
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~    def render_circle~
+** Processing line: ~    def play_sound~
 - Inside source: true
 *** True Line Result
-    def render_circle
-** Processing line: ~      outputs.sprites << circle.after_images.map do |ai|~
+    def play_sound
+** Processing line: ~      return if state.sound_debounce > 0~
 - Inside source: true
 *** True Line Result
-      outputs.sprites << circle.after_images.map do |ai|
-** Processing line: ~        ai.merge(x: ai.x + state.camera.x - circle.radius,~
+      return if state.sound_debounce > 0
+** Processing line: ~      state.sound_debounce = 5~
 - Inside source: true
 *** True Line Result
-        ai.merge(x: ai.x + state.camera.x - circle.radius,
-** Processing line: ~                 y: ai.y + state.camera.y - circle.radius,~
+      state.sound_debounce = 5
+** Processing line: ~      outputs.sounds << "sounds/03#{"%02d" % state.sound_index}.wav"~
 - Inside source: true
 *** True Line Result
-                 y: ai.y + state.camera.y - circle.radius,
-** Processing line: ~                 w: circle.radius * 2,~
+      outputs.sounds << "sounds/03#{"%02d" % state.sound_index}.wav"
+** Processing line: ~      state.sound_index += 1~
 - Inside source: true
 *** True Line Result
-                 w: circle.radius * 2,
-** Processing line: ~                 h: circle.radius * 2,~
+      state.sound_index += 1
+** Processing line: ~      if state.sound_index > 21~
 - Inside source: true
 *** True Line Result
-                 h: circle.radius * 2,
-** Processing line: ~                 path: 'sprites/circle-white.png')~
+      if state.sound_index > 21
+** Processing line: ~        state.sound_index = 1~
 - Inside source: true
 *** True Line Result
-                 path: 'sprites/circle-white.png')
+        state.sound_index = 1
 ** Processing line: ~      end~
 - Inside source: true
 *** True Line Result
       end
+** Processing line: ~    end~
+- Inside source: true
+*** True Line Result
+    end
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~      outputs.sprites << [(circle.x - circle.radius) + state.camera.x,~
+** Processing line: ~    def input_game~
 - Inside source: true
 *** True Line Result
-      outputs.sprites << [(circle.x - circle.radius) + state.camera.x,
-** Processing line: ~                          (circle.y - circle.radius) + state.camera.y,~
+    def input_game
+** Processing line: ~      if inputs.keyboard.down || inputs.keyboard.space~
 - Inside source: true
 *** True Line Result
-                          (circle.y - circle.radius) + state.camera.y,
-** Processing line: ~                          circle.radius * 2,~
+      if inputs.keyboard.down || inputs.keyboard.space
+** Processing line: ~        circle.potential_lift += 0.03~
 - Inside source: true
 *** True Line Result
-                          circle.radius * 2,
-** Processing line: ~                          circle.radius * 2,~
+        circle.potential_lift += 0.03
+** Processing line: ~        circle.potential_lift = circle.potential_lift.lesser(10)~
 - Inside source: true
 *** True Line Result
-                          circle.radius * 2,
-** Processing line: ~                          'sprites/probe.png']~
+        circle.potential_lift = circle.potential_lift.lesser(10)
+** Processing line: ~      elsif inputs.keyboard.key_up.down || inputs.keyboard.key_up.space~
 - Inside source: true
 *** True Line Result
-                          'sprites/probe.png']
-** Processing line: ~    end~
+      elsif inputs.keyboard.key_up.down || inputs.keyboard.key_up.space
+** Processing line: ~        play_sound~
 - Inside source: true
 *** True Line Result
-    end
+        play_sound
+** Processing line: ~        circle.dy += circle.angle.vector_y circle.potential_lift~
+- Inside source: true
+*** True Line Result
+        circle.dy += circle.angle.vector_y circle.potential_lift
+** Processing line: ~        circle.dx += circle.angle.vector_x circle.potential_lift~
+- Inside source: true
+*** True Line Result
+        circle.dx += circle.angle.vector_x circle.potential_lift
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~    def render_debug~
+** Processing line: ~        if circle.on_floor~
 - Inside source: true
 *** True Line Result
-    def render_debug
-** Processing line: ~      return unless state.debug_mode~
+        if circle.on_floor
+** Processing line: ~          if circle.floor_relative_y == :above~
 - Inside source: true
 *** True Line Result
-      return unless state.debug_mode
-** Processing line: ~~
+          if circle.floor_relative_y == :above
+** Processing line: ~            circle.y += circle.potential_lift.abs * 2~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~      outputs.labels << [10, 30, state.line_mode, 0, 0, 0, 0, 0]~
+            circle.y += circle.potential_lift.abs * 2
+** Processing line: ~          elsif circle.floor_relative_y == :below~
 - Inside source: true
 *** True Line Result
-      outputs.labels << [10, 30, state.line_mode, 0, 0, 0, 0, 0]
-** Processing line: ~      outputs.labels << [12, 32, state.line_mode, 0, 0, 255, 255, 255]~
+          elsif circle.floor_relative_y == :below
+** Processing line: ~            circle.y -= circle.potential_lift.abs * 2~
 - Inside source: true
 *** True Line Result
-      outputs.labels << [12, 32, state.line_mode, 0, 0, 255, 255, 255]
+            circle.y -= circle.potential_lift.abs * 2
+** Processing line: ~          end~
+- Inside source: true
+*** True Line Result
+          end
+** Processing line: ~        end~
+- Inside source: true
+*** True Line Result
+        end
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~      args.outputs.lines << trajectory(circle).line.to_hash.tap do |h|~
+** Processing line: ~        circle.on_floor = false~
 - Inside source: true
 *** True Line Result
-      args.outputs.lines << trajectory(circle).line.to_hash.tap do |h|
-** Processing line: ~        h[:x] += state.camera.x~
+        circle.on_floor = false
+** Processing line: ~        circle.potential_lift = 0~
 - Inside source: true
 *** True Line Result
-        h[:x] += state.camera.x
-** Processing line: ~        h[:y] += state.camera.y~
+        circle.potential_lift = 0
+** Processing line: ~        circle.terrains_to_monitor.clear~
 - Inside source: true
 *** True Line Result
-        h[:y] += state.camera.y
-** Processing line: ~        h[:x2] += state.camera.x~
+        circle.terrains_to_monitor.clear
+** Processing line: ~        circle.impact_history.clear~
 - Inside source: true
 *** True Line Result
-        h[:x2] += state.camera.x
-** Processing line: ~        h[:y2] += state.camera.y~
+        circle.impact_history.clear
+** Processing line: ~        circle.impact = nil~
 - Inside source: true
 *** True Line Result
-        h[:y2] += state.camera.y
+        circle.impact = nil
+** Processing line: ~        calc_physics~
+- Inside source: true
+*** True Line Result
+        calc_physics
 ** Processing line: ~      end~
 - Inside source: true
 *** True Line Result
@@ -124039,190 +129523,190 @@ Follows is a source code listing for all files that have been open sourced. This
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~      outputs.primitives << state.terrain.find_all do |t|~
+** Processing line: ~      # aim probe~
 - Inside source: true
 *** True Line Result
-      outputs.primitives << state.terrain.find_all do |t|
-** Processing line: ~        circle.x.between?(t.x - 640, t.x2 + 640) || circle.y.between?(t.y - 360, t.y2 + 360)~
+      # aim probe
+** Processing line: ~      if inputs.keyboard.right || inputs.keyboard.a~
 - Inside source: true
 *** True Line Result
-        circle.x.between?(t.x - 640, t.x2 + 640) || circle.y.between?(t.y - 360, t.y2 + 360)
-** Processing line: ~      end.map do |t|~
+      if inputs.keyboard.right || inputs.keyboard.a
+** Processing line: ~        circle.angle -= 2~
 - Inside source: true
 *** True Line Result
-      end.map do |t|
-** Processing line: ~        [~
+        circle.angle -= 2
+** Processing line: ~      elsif inputs.keyboard.left || inputs.keyboard.d~
 - Inside source: true
 *** True Line Result
-        [
-** Processing line: ~          t.line.associate(r: 0, g: 255, b: 0) do |h|~
+      elsif inputs.keyboard.left || inputs.keyboard.d
+** Processing line: ~        circle.angle += 2~
 - Inside source: true
 *** True Line Result
-          t.line.associate(r: 0, g: 255, b: 0) do |h|
-** Processing line: ~            h.x  += state.camera.x~
+        circle.angle += 2
+** Processing line: ~      end~
 - Inside source: true
 *** True Line Result
-            h.x  += state.camera.x
-** Processing line: ~            h.y  += state.camera.y~
+      end
+** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
-            h.y  += state.camera.y
-** Processing line: ~            h.x2 += state.camera.x~
+    end
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-            h.x2 += state.camera.x
-** Processing line: ~            h.y2 += state.camera.y~
+
+** Processing line: ~    def input~
 - Inside source: true
 *** True Line Result
-            h.y2 += state.camera.y
-** Processing line: ~            if circle.rect.intersect_rect? t[:rect]~
+    def input
+** Processing line: ~      input_god_mode~
 - Inside source: true
 *** True Line Result
-            if circle.rect.intersect_rect? t[:rect]
-** Processing line: ~              h[:r] = 255~
+      input_god_mode
+** Processing line: ~      input_game~
 - Inside source: true
 *** True Line Result
-              h[:r] = 255
-** Processing line: ~              h[:g] = 0~
+      input_game
+** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
-              h[:g] = 0
-** Processing line: ~            end~
+    end
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-            end
-** Processing line: ~            h~
+
+** Processing line: ~    def calc_camera~
 - Inside source: true
 *** True Line Result
-            h
-** Processing line: ~          end,~
+    def calc_camera
+** Processing line: ~      state.camera.target_x = 640 - circle.x~
 - Inside source: true
 *** True Line Result
-          end,
-** Processing line: ~          t[:rect].border.associate(r: 255, g: 0, b: 0) do |h|~
+      state.camera.target_x = 640 - circle.x
+** Processing line: ~      state.camera.target_y = 360 - circle.y~
 - Inside source: true
 *** True Line Result
-          t[:rect].border.associate(r: 255, g: 0, b: 0) do |h|
-** Processing line: ~            h.x += state.camera.x~
+      state.camera.target_y = 360 - circle.y
+** Processing line: ~      xdiff = state.camera.target_x - state.camera.x~
 - Inside source: true
 *** True Line Result
-            h.x += state.camera.x
-** Processing line: ~            h.y += state.camera.y~
+      xdiff = state.camera.target_x - state.camera.x
+** Processing line: ~      ydiff = state.camera.target_y - state.camera.y~
 - Inside source: true
 *** True Line Result
-            h.y += state.camera.y
-** Processing line: ~            h.b = 255 if line_near_rect? circle.rect, t~
+      ydiff = state.camera.target_y - state.camera.y
+** Processing line: ~      state.camera.x += xdiff * camera.follow_speed~
 - Inside source: true
 *** True Line Result
-            h.b = 255 if line_near_rect? circle.rect, t
-** Processing line: ~            h~
+      state.camera.x += xdiff * camera.follow_speed
+** Processing line: ~      state.camera.y += ydiff * camera.follow_speed~
 - Inside source: true
 *** True Line Result
-            h
-** Processing line: ~          end~
+      state.camera.y += ydiff * camera.follow_speed
+** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
-          end
-** Processing line: ~        ]~
+    end
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-        ]
-** Processing line: ~      end~
+
+** Processing line: ~    def calc~
 - Inside source: true
 *** True Line Result
-      end
-** Processing line: ~~
+    def calc
+** Processing line: ~      state.sound_debounce ||= 0~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~      outputs.primitives << state.lava.find_all do |t|~
+      state.sound_debounce ||= 0
+** Processing line: ~      state.sound_debounce -= 1~
 - Inside source: true
 *** True Line Result
-      outputs.primitives << state.lava.find_all do |t|
-** Processing line: ~        circle.x.between?(t.x - 640, t.x2 + 640) || circle.y.between?(t.y - 360, t.y2 + 360)~
+      state.sound_debounce -= 1
+** Processing line: ~      state.sound_debounce = 0 if state.sound_debounce < 0~
 - Inside source: true
 *** True Line Result
-        circle.x.between?(t.x - 640, t.x2 + 640) || circle.y.between?(t.y - 360, t.y2 + 360)
-** Processing line: ~      end.map do |t|~
+      state.sound_debounce = 0 if state.sound_debounce < 0
+** Processing line: ~      if state.god_mode~
 - Inside source: true
 *** True Line Result
-      end.map do |t|
-** Processing line: ~        [~
+      if state.god_mode
+** Processing line: ~        circle.dy *= 0.1~
 - Inside source: true
 *** True Line Result
-        [
-** Processing line: ~          t.line.associate(r: 0, g: 0, b: 255) do |h|~
+        circle.dy *= 0.1
+** Processing line: ~        circle.dx *= 0.1~
 - Inside source: true
 *** True Line Result
-          t.line.associate(r: 0, g: 0, b: 255) do |h|
-** Processing line: ~            h.x  += state.camera.x~
+        circle.dx *= 0.1
+** Processing line: ~      end~
 - Inside source: true
 *** True Line Result
-            h.x  += state.camera.x
-** Processing line: ~            h.y  += state.camera.y~
+      end
+** Processing line: ~      calc_camera~
 - Inside source: true
 *** True Line Result
-            h.y  += state.camera.y
-** Processing line: ~            h.x2 += state.camera.x~
+      calc_camera
+** Processing line: ~      state.whisp_queue ||= []~
 - Inside source: true
 *** True Line Result
-            h.x2 += state.camera.x
-** Processing line: ~            h.y2 += state.camera.y~
+      state.whisp_queue ||= []
+** Processing line: ~      if state.tick_count.mod_zero?(4)~
 - Inside source: true
 *** True Line Result
-            h.y2 += state.camera.y
-** Processing line: ~            if circle.rect.intersect_rect? t[:rect]~
+      if state.tick_count.mod_zero?(4)
+** Processing line: ~        state.whisp_queue << {~
 - Inside source: true
 *** True Line Result
-            if circle.rect.intersect_rect? t[:rect]
-** Processing line: ~              h[:r] = 255~
+        state.whisp_queue << {
+** Processing line: ~          x: -300,~
 - Inside source: true
 *** True Line Result
-              h[:r] = 255
-** Processing line: ~              h[:b] = 0~
+          x: -300,
+** Processing line: ~          y: 1400 * rand,~
 - Inside source: true
 *** True Line Result
-              h[:b] = 0
-** Processing line: ~            end~
+          y: 1400 * rand,
+** Processing line: ~          speed: 2.randomize(:ratio) + 3,~
 - Inside source: true
 *** True Line Result
-            end
-** Processing line: ~            h~
+          speed: 2.randomize(:ratio) + 3,
+** Processing line: ~          w: 20,~
 - Inside source: true
 *** True Line Result
-            h
-** Processing line: ~          end,~
+          w: 20,
+** Processing line: ~          h: 20, path: 'sprites/whisp.png',~
 - Inside source: true
 *** True Line Result
-          end,
-** Processing line: ~          t[:rect].border.associate(r: 255, g: 0, b: 0) do |h|~
+          h: 20, path: 'sprites/whisp.png',
+** Processing line: ~          a: 0,~
 - Inside source: true
 *** True Line Result
-          t[:rect].border.associate(r: 255, g: 0, b: 0) do |h|
-** Processing line: ~            h.x += state.camera.x~
+          a: 0,
+** Processing line: ~          created_at: state.tick_count,~
 - Inside source: true
 *** True Line Result
-            h.x += state.camera.x
-** Processing line: ~            h.y += state.camera.y~
+          created_at: state.tick_count,
+** Processing line: ~          angle: 0,~
 - Inside source: true
 *** True Line Result
-            h.y += state.camera.y
-** Processing line: ~            h.b = 255 if line_near_rect? circle.rect, t~
+          angle: 0,
+** Processing line: ~          r: 100,~
 - Inside source: true
 *** True Line Result
-            h.b = 255 if line_near_rect? circle.rect, t
-** Processing line: ~            h~
+          r: 100,
+** Processing line: ~          g: 128 + 128 * rand,~
 - Inside source: true
 *** True Line Result
-            h
-** Processing line: ~          end~
+          g: 128 + 128 * rand,
+** Processing line: ~          b: 128 + 128 * rand~
 - Inside source: true
 *** True Line Result
-          end
-** Processing line: ~        ]~
+          b: 128 + 128 * rand
+** Processing line: ~        }~
 - Inside source: true
 *** True Line Result
-        ]
+        }
 ** Processing line: ~      end~
 - Inside source: true
 *** True Line Result
@@ -124231,38 +129715,34 @@ Follows is a source code listing for all files that have been open sourced. This
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~      if state.god_mode~
-- Inside source: true
-*** True Line Result
-      if state.god_mode
-** Processing line: ~        border = circle.rect.merge(x: circle.rect.x + state.camera.x,~
+** Processing line: ~      state.whisp_queue.each do |w|~
 - Inside source: true
 *** True Line Result
-        border = circle.rect.merge(x: circle.rect.x + state.camera.x,
-** Processing line: ~                                   y: circle.rect.y + state.camera.y,~
+      state.whisp_queue.each do |w|
+** Processing line: ~        w.x += w[:speed] * 2~
 - Inside source: true
 *** True Line Result
-                                   y: circle.rect.y + state.camera.y,
-** Processing line: ~                                   g: 255)~
+        w.x += w[:speed] * 2
+** Processing line: ~        w.x -= circle.dx * 0.3~
 - Inside source: true
 *** True Line Result
-                                   g: 255)
-** Processing line: ~      else~
+        w.x -= circle.dx * 0.3
+** Processing line: ~        w.y -= w[:speed]~
 - Inside source: true
 *** True Line Result
-      else
-** Processing line: ~        border = circle.rect.merge(x: circle.rect.x + state.camera.x,~
+        w.y -= w[:speed]
+** Processing line: ~        w.y -= circle.dy * 0.3~
 - Inside source: true
 *** True Line Result
-        border = circle.rect.merge(x: circle.rect.x + state.camera.x,
-** Processing line: ~                                   y: circle.rect.y + state.camera.y,~
+        w.y -= circle.dy * 0.3
+** Processing line: ~        w.angle += w[:speed]~
 - Inside source: true
 *** True Line Result
-                                   y: circle.rect.y + state.camera.y,
-** Processing line: ~                                   b: 255)~
+        w.angle += w[:speed]
+** Processing line: ~        w.a = w[:created_at].ease(30) * 255~
 - Inside source: true
 *** True Line Result
-                                   b: 255)
+        w.a = w[:created_at].ease(30) * 255
 ** Processing line: ~      end~
 - Inside source: true
 *** True Line Result
@@ -124271,166 +129751,130 @@ Follows is a source code listing for all files that have been open sourced. This
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~      outputs.borders << border~
-- Inside source: true
-*** True Line Result
-      outputs.borders << border
-** Processing line: ~~
-- Inside source: true
-*** True Line Result
-
-** Processing line: ~      overlapping ||= {}~
+** Processing line: ~      state.whisp_queue = state.whisp_queue.reject { |w| w[:x] > 1280 }~
 - Inside source: true
 *** True Line Result
-      overlapping ||= {}
+      state.whisp_queue = state.whisp_queue.reject { |w| w[:x] > 1280 }
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~      circle.impact_history.each do |h|~
-- Inside source: true
-*** True Line Result
-      circle.impact_history.each do |h|
-** Processing line: ~        label_mod = 300~
+** Processing line: ~      if state.tick_count.mod_zero?(2) && (circle.dx != 0 || circle.dy != 0)~
 - Inside source: true
 *** True Line Result
-        label_mod = 300
-** Processing line: ~        x = (h[:body][:x].-(150).idiv(label_mod)) * label_mod + camera.x~
+      if state.tick_count.mod_zero?(2) && (circle.dx != 0 || circle.dy != 0)
+** Processing line: ~        circle.after_images << {~
 - Inside source: true
 *** True Line Result
-        x = (h[:body][:x].-(150).idiv(label_mod)) * label_mod + camera.x
-** Processing line: ~        y = (h[:body][:y].+(150).idiv(label_mod)) * label_mod + camera.y~
+        circle.after_images << {
+** Processing line: ~          x: circle.x,~
 - Inside source: true
 *** True Line Result
-        y = (h[:body][:y].+(150).idiv(label_mod)) * label_mod + camera.y
-** Processing line: ~        10.times do~
+          x: circle.x,
+** Processing line: ~          y: circle.y,~
 - Inside source: true
 *** True Line Result
-        10.times do
-** Processing line: ~          if overlapping[x] && overlapping[x][y]~
+          y: circle.y,
+** Processing line: ~          w: circle.radius,~
 - Inside source: true
 *** True Line Result
-          if overlapping[x] && overlapping[x][y]
-** Processing line: ~            y -= 52~
+          w: circle.radius,
+** Processing line: ~          h: circle.radius,~
 - Inside source: true
 *** True Line Result
-            y -= 52
-** Processing line: ~          else~
+          h: circle.radius,
+** Processing line: ~          a: 255,~
 - Inside source: true
 *** True Line Result
-          else
-** Processing line: ~            break~
+          a: 255,
+** Processing line: ~          created_at: state.tick_count~
 - Inside source: true
 *** True Line Result
-            break
-** Processing line: ~          end~
+          created_at: state.tick_count
+** Processing line: ~        }~
 - Inside source: true
 *** True Line Result
-          end
-** Processing line: ~        end~
+        }
+** Processing line: ~      end~
 - Inside source: true
 *** True Line Result
-        end
+      end
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~        overlapping[x] ||= {}~
-- Inside source: true
-*** True Line Result
-        overlapping[x] ||= {}
-** Processing line: ~        overlapping[x][y] ||= true~
-- Inside source: true
-*** True Line Result
-        overlapping[x][y] ||= true
-** Processing line: ~        outputs.primitives << [x, y - 25, 300, 50, 0, 0, 0, 128].solid~
-- Inside source: true
-*** True Line Result
-        outputs.primitives << [x, y - 25, 300, 50, 0, 0, 0, 128].solid
-** Processing line: ~        outputs.labels << [x + 10, y + 24, "dy: %.2f" % h[:body][:new_dy], -2, 0, 255, 255, 255]~
+** Processing line: ~      circle.after_images.each do |ai|~
 - Inside source: true
 *** True Line Result
-        outputs.labels << [x + 10, y + 24, "dy: %.2f" % h[:body][:new_dy], -2, 0, 255, 255, 255]
-** Processing line: ~        outputs.labels << [x + 10, y +  9, "dx: %.2f" % h[:body][:new_dx], -2, 0, 255, 255, 255]~
+      circle.after_images.each do |ai|
+** Processing line: ~        ai.a = ai[:created_at].ease(10, :flip) * 255~
 - Inside source: true
 *** True Line Result
-        outputs.labels << [x + 10, y +  9, "dx: %.2f" % h[:body][:new_dx], -2, 0, 255, 255, 255]
-** Processing line: ~        outputs.labels << [x + 10, y -  5, " ?: #{h[:body][:new_reason]}", -2, 0, 255, 255, 255]~
+        ai.a = ai[:created_at].ease(10, :flip) * 255
+** Processing line: ~      end~
 - Inside source: true
 *** True Line Result
-        outputs.labels << [x + 10, y -  5, " ?: #{h[:body][:new_reason]}", -2, 0, 255, 255, 255]
+      end
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~        outputs.labels << [x + 100, y + 24, "angle: %.2f" % h[:impact][:angle], -2, 0, 255, 255, 255]~
+** Processing line: ~      circle.after_images = circle.after_images.reject { |ai| ai[:created_at].elapsed_time > 10 }~
 - Inside source: true
 *** True Line Result
-        outputs.labels << [x + 100, y + 24, "angle: %.2f" % h[:impact][:angle], -2, 0, 255, 255, 255]
-** Processing line: ~        outputs.labels << [x + 100, y + 9, "m(l): %.2f" % h[:terrain][:slope], -2, 0, 255, 255, 255]~
+      circle.after_images = circle.after_images.reject { |ai| ai[:created_at].elapsed_time > 10 }
+** Processing line: ~      calc_physics~
 - Inside source: true
 *** True Line Result
-        outputs.labels << [x + 100, y + 9, "m(l): %.2f" % h[:terrain][:slope], -2, 0, 255, 255, 255]
-** Processing line: ~        outputs.labels << [x + 100, y - 5, "m(c): %.2f" % h[:body][:slope], -2, 0, 255, 255, 255]~
+      calc_physics
+** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
-        outputs.labels << [x + 100, y - 5, "m(c): %.2f" % h[:body][:slope], -2, 0, 255, 255, 255]
+    end
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~        outputs.labels << [x + 200, y + 24, "ray: #{h[:impact][:ray]}", -2, 0, 255, 255, 255]~
-- Inside source: true
-*** True Line Result
-        outputs.labels << [x + 200, y + 24, "ray: #{h[:impact][:ray]}", -2, 0, 255, 255, 255]
-** Processing line: ~        outputs.labels << [x + 200, y +  9, "nxt: #{h[:impact][:ray_next]}", -2, 0, 255, 255, 255]~
+** Processing line: ~    def circle~
 - Inside source: true
 *** True Line Result
-        outputs.labels << [x + 200, y +  9, "nxt: #{h[:impact][:ray_next]}", -2, 0, 255, 255, 255]
-** Processing line: ~        outputs.labels << [x + 200, y -  5, "typ: #{h[:impact][:type]}", -2, 0, 255, 255, 255]~
+    def circle
+** Processing line: ~      state.circle~
 - Inside source: true
 *** True Line Result
-        outputs.labels << [x + 200, y -  5, "typ: #{h[:impact][:type]}", -2, 0, 255, 255, 255]
-** Processing line: ~      end~
+      state.circle
+** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
-      end
+    end
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~      if circle.floor~
-- Inside source: true
-*** True Line Result
-      if circle.floor
-** Processing line: ~        outputs.labels << [circle.x + camera.x + 30, circle.y + camera.y + 100, "point: #{circle.floor_point.slice(:x, :y).values}", -2, 0]~
-- Inside source: true
-*** True Line Result
-        outputs.labels << [circle.x + camera.x + 30, circle.y + camera.y + 100, "point: #{circle.floor_point.slice(:x, :y).values}", -2, 0]
-** Processing line: ~        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]~
+** Processing line: ~    def camera~
 - Inside source: true
 *** True Line Result
-        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]
-** Processing line: ~        outputs.labels << [circle.x + camera.x + 30, circle.y + camera.y +  85, "circle: #{circle.as_hash.slice(:x, :y).values}", -2, 0]~
+    def camera
+** Processing line: ~      state.camera~
 - Inside source: true
 *** True Line Result
-        outputs.labels << [circle.x + camera.x + 30, circle.y + camera.y +  85, "circle: #{circle.as_hash.slice(:x, :y).values}", -2, 0]
-** Processing line: ~        outputs.labels << [circle.x + camera.x + 31, circle.y + camera.y +  86, "circle: #{circle.as_hash.slice(:x, :y).values}", -2, 0, 255, 255, 255]~
+      state.camera
+** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
-        outputs.labels << [circle.x + camera.x + 31, circle.y + camera.y +  86, "circle: #{circle.as_hash.slice(:x, :y).values}", -2, 0, 255, 255, 255]
-** Processing line: ~        outputs.labels << [circle.x + camera.x + 30, circle.y + camera.y +  70, "rel: #{circle.floor_relative_x} #{circle.floor_relative_y}", -2, 0]~
+    end
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-        outputs.labels << [circle.x + camera.x + 30, circle.y + camera.y +  70, "rel: #{circle.floor_relative_x} #{circle.floor_relative_y}", -2, 0]
-** Processing line: ~        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]~
+
+** Processing line: ~    def terrain~
 - Inside source: true
 *** True Line Result
-        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]
-** Processing line: ~      end~
+    def terrain
+** Processing line: ~      state.terrain~
 - Inside source: true
 *** True Line Result
-      end
+      state.terrain
 ** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
@@ -124439,9578 +129883,9674 @@ Follows is a source code listing for all files that have been open sourced. This
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~    def render_stage_editor~
-- Inside source: true
-*** True Line Result
-    def render_stage_editor
-** Processing line: ~      return unless state.god_mode~
-- Inside source: true
-*** True Line Result
-      return unless state.god_mode
-** Processing line: ~      return unless state.point_one~
+** Processing line: ~    def lava~
 - Inside source: true
 *** True Line Result
-      return unless state.point_one
-** Processing line: ~      args.lines << [state.point_one, inputs.mouse.point, 0, 255, 255]~
+    def lava
+** Processing line: ~      state.lava~
 - Inside source: true
 *** True Line Result
-      args.lines << [state.point_one, inputs.mouse.point, 0, 255, 255]
+      state.lava
 ** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
     end
+** Processing line: ~  end~
+- Inside source: true
+*** True Line Result
+  end
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~    def trajectory body~
+** Processing line: ~  # $gtk.reset~
 - Inside source: true
 *** True Line Result
-    def trajectory body
-** Processing line: ~      [body.x + body.dx,~
+  # $gtk.reset
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-      [body.x + body.dx,
-** Processing line: ~       body.y + body.dy,~
+
+** Processing line: ~  def tick args~
 - Inside source: true
 *** True Line Result
-       body.y + body.dy,
-** Processing line: ~       body.x + body.dx * 1000,~
+  def tick args
+** Processing line: ~    args.outputs.background_color = [0, 0, 0]~
 - Inside source: true
 *** True Line Result
-       body.x + body.dx * 1000,
-** Processing line: ~       body.y + body.dy * 1000,~
+    args.outputs.background_color = [0, 0, 0]
+** Processing line: ~    if args.inputs.keyboard.r~
 - Inside source: true
 *** True Line Result
-       body.y + body.dy * 1000,
-** Processing line: ~       0, 255, 255]~
+    if args.inputs.keyboard.r
+** Processing line: ~      args.gtk.reset~
 - Inside source: true
 *** True Line Result
-       0, 255, 255]
+      args.gtk.reset
+** Processing line: ~      return~
+- Inside source: true
+*** True Line Result
+      return
 ** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
     end
-** Processing line: ~~
+** Processing line: ~    # uncomment the line below to slow down the game so you~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~    def lengthen_line line, num~
+    # uncomment the line below to slow down the game so you
+** Processing line: ~    # can see each tick as it passes~
 - Inside source: true
 *** True Line Result
-    def lengthen_line line, num
-** Processing line: ~      line = normalize_line(line)~
+    # can see each tick as it passes
+** Processing line: ~    # args.gtk.slowmo! 30~
 - Inside source: true
 *** True Line Result
-      line = normalize_line(line)
-** Processing line: ~      slope = geometry.line_slope(line, replace_infinity: 10).abs~
+    # args.gtk.slowmo! 30
+** Processing line: ~    $game ||= FallingCircle.new~
 - Inside source: true
 *** True Line Result
-      slope = geometry.line_slope(line, replace_infinity: 10).abs
-** Processing line: ~      if slope < 2~
+    $game ||= FallingCircle.new
+** Processing line: ~    $game.args = args~
 - Inside source: true
 *** True Line Result
-      if slope < 2
-** Processing line: ~        [line.x - num, line.y, line.x2 + num, line.y2].line.to_hash~
+    $game.args = args
+** Processing line: ~    $game.tick~
 - Inside source: true
 *** True Line Result
-        [line.x - num, line.y, line.x2 + num, line.y2].line.to_hash
-** Processing line: ~      else~
+    $game.tick
+** Processing line: ~  end~
 - Inside source: true
 *** True Line Result
-      else
-** Processing line: ~        [line.x, line.y, line.x2, line.y2].line.to_hash~
+  end
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-        [line.x, line.y, line.x2, line.y2].line.to_hash
-** Processing line: ~      end~
+
+** Processing line: ~  def reset~
 - Inside source: true
 *** True Line Result
-      end
-** Processing line: ~    end~
+  def reset
+** Processing line: ~    $game = nil~
 - Inside source: true
 *** True Line Result
-    end
+    $game = nil
+** Processing line: ~  end~
+- Inside source: true
+*** True Line Result
+  end
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~    def normalize_line line~
-- Inside source: true
+** Processing line: ~#+end_src~
+- Line was identified as the end of a code block.
 *** True Line Result
-    def normalize_line line
-** Processing line: ~      if line.x > line.x2~
-- Inside source: true
+#+end_src
+** Processing line: ~~
+- End of paragraph detected.
 *** True Line Result
-      if line.x > line.x2
-** Processing line: ~        x  = line.x2~
-- Inside source: true
+
+** Processing line: ~*** Platformer - The Little Probe - Data - level.txt~
+- Header detected.
 *** True Line Result
-        x  = line.x2
-** Processing line: ~        y  = line.y2~
-- Inside source: true
+
 *** True Line Result
-        y  = line.y2
-** Processing line: ~        x2 = line.x~
+*** Platformer - The Little Probe - Data - level.txt
+** Processing line: ~#+begin_src ruby~
+- Line was identified as the beginning of a code block.
+*** True Line Result
+
+*** True Line Result
+#+begin_src ruby
+** Processing line: ~  # ./samples/99_genre_platformer/the_little_probe/data/level.txt~
 - Inside source: true
 *** True Line Result
-        x2 = line.x
-** Processing line: ~        y2 = line.y~
+  # ./samples/99_genre_platformer/the_little_probe/data/level.txt
+** Processing line: ~  640,8840,1180,8840~
 - Inside source: true
 *** True Line Result
-        y2 = line.y
-** Processing line: ~      else~
+  640,8840,1180,8840
+** Processing line: ~  -60,10220,0,9960~
 - Inside source: true
 *** True Line Result
-      else
-** Processing line: ~        x  = line.x~
+  -60,10220,0,9960
+** Processing line: ~  -60,10220,0,10500~
 - Inside source: true
 *** True Line Result
-        x  = line.x
-** Processing line: ~        y  = line.y~
+  -60,10220,0,10500
+** Processing line: ~  0,10500,0,10780~
 - Inside source: true
 *** True Line Result
-        y  = line.y
-** Processing line: ~        x2 = line.x2~
+  0,10500,0,10780
+** Processing line: ~  0,10780,40,10900~
 - Inside source: true
 *** True Line Result
-        x2 = line.x2
-** Processing line: ~        y2 = line.y2~
+  0,10780,40,10900
+** Processing line: ~  500,10920,760,10960~
 - Inside source: true
 *** True Line Result
-        y2 = line.y2
-** Processing line: ~      end~
+  500,10920,760,10960
+** Processing line: ~  300,10560,820,10600~
 - Inside source: true
 *** True Line Result
-      end
-** Processing line: ~      [x, y, x2, y2]~
+  300,10560,820,10600
+** Processing line: ~  420,10320,700,10300~
 - Inside source: true
 *** True Line Result
-      [x, y, x2, y2]
-** Processing line: ~    end~
+  420,10320,700,10300
+** Processing line: ~  820,10600,1500,10600~
 - Inside source: true
 *** True Line Result
-    end
-** Processing line: ~~
+  820,10600,1500,10600
+** Processing line: ~  1500,10600,1940,10600~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~    def rect_for_line line~
+  1500,10600,1940,10600
+** Processing line: ~  1940,10600,2380,10580~
 - Inside source: true
 *** True Line Result
-    def rect_for_line line
-** Processing line: ~      if line.x > line.x2~
+  1940,10600,2380,10580
+** Processing line: ~  2380,10580,2800,10620~
 - Inside source: true
 *** True Line Result
-      if line.x > line.x2
-** Processing line: ~        x  = line.x2~
+  2380,10580,2800,10620
+** Processing line: ~  2240,11080,2480,11020~
 - Inside source: true
 *** True Line Result
-        x  = line.x2
-** Processing line: ~        y  = line.y2~
+  2240,11080,2480,11020
+** Processing line: ~  2000,11120,2240,11080~
 - Inside source: true
 *** True Line Result
-        y  = line.y2
-** Processing line: ~        x2 = line.x~
+  2000,11120,2240,11080
+** Processing line: ~  1760,11180,2000,11120~
 - Inside source: true
 *** True Line Result
-        x2 = line.x
-** Processing line: ~        y2 = line.y~
+  1760,11180,2000,11120
+** Processing line: ~  1620,11180,1760,11180~
 - Inside source: true
 *** True Line Result
-        y2 = line.y
-** Processing line: ~      else~
+  1620,11180,1760,11180
+** Processing line: ~  1500,11220,1620,11180~
 - Inside source: true
 *** True Line Result
-      else
-** Processing line: ~        x  = line.x~
+  1500,11220,1620,11180
+** Processing line: ~  1180,11280,1340,11220~
 - Inside source: true
 *** True Line Result
-        x  = line.x
-** Processing line: ~        y  = line.y~
+  1180,11280,1340,11220
+** Processing line: ~  1040,11240,1180,11280~
 - Inside source: true
 *** True Line Result
-        y  = line.y
-** Processing line: ~        x2 = line.x2~
+  1040,11240,1180,11280
+** Processing line: ~  840,11280,1040,11240~
 - Inside source: true
 *** True Line Result
-        x2 = line.x2
-** Processing line: ~        y2 = line.y2~
+  840,11280,1040,11240
+** Processing line: ~  640,11280,840,11280~
 - Inside source: true
 *** True Line Result
-        y2 = line.y2
-** Processing line: ~      end~
+  640,11280,840,11280
+** Processing line: ~  500,11220,640,11280~
 - Inside source: true
 *** True Line Result
-      end
-** Processing line: ~~
+  500,11220,640,11280
+** Processing line: ~  420,11140,500,11220~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~      w = x2 - x~
+  420,11140,500,11220
+** Processing line: ~  240,11100,420,11140~
 - Inside source: true
 *** True Line Result
-      w = x2 - x
-** Processing line: ~      h = y2 - y~
+  240,11100,420,11140
+** Processing line: ~  100,11120,240,11100~
 - Inside source: true
 *** True Line Result
-      h = y2 - y
-** Processing line: ~~
+  100,11120,240,11100
+** Processing line: ~  0,11180,100,11120~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~      if h < 0~
+  0,11180,100,11120
+** Processing line: ~  -160,11220,0,11180~
 - Inside source: true
 *** True Line Result
-      if h < 0
-** Processing line: ~        y += h~
+  -160,11220,0,11180
+** Processing line: ~  -260,11240,-160,11220~
 - Inside source: true
 *** True Line Result
-        y += h
-** Processing line: ~        h = h.abs~
+  -260,11240,-160,11220
+** Processing line: ~  1340,11220,1500,11220~
 - Inside source: true
 *** True Line Result
-        h = h.abs
-** Processing line: ~      end~
+  1340,11220,1500,11220
+** Processing line: ~  960,13300,1280,13060~
 - Inside source: true
 *** True Line Result
-      end
-** Processing line: ~~
+  960,13300,1280,13060
+** Processing line: ~  1280,13060,1540,12860~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~      if w < circle.radius~
+  1280,13060,1540,12860
+** Processing line: ~  1540,12860,1820,12700~
 - Inside source: true
 *** True Line Result
-      if w < circle.radius
-** Processing line: ~        x -= circle.radius~
+  1540,12860,1820,12700
+** Processing line: ~  1820,12700,2080,12520~
 - Inside source: true
 *** True Line Result
-        x -= circle.radius
-** Processing line: ~        w = circle.radius * 2~
+  1820,12700,2080,12520
+** Processing line: ~  2080,12520,2240,12400~
 - Inside source: true
 *** True Line Result
-        w = circle.radius * 2
-** Processing line: ~      end~
+  2080,12520,2240,12400
+** Processing line: ~  2240,12400,2240,12240~
 - Inside source: true
 *** True Line Result
-      end
-** Processing line: ~~
+  2240,12400,2240,12240
+** Processing line: ~  2240,12240,2400,12080~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~      if h < circle.radius~
+  2240,12240,2400,12080
+** Processing line: ~  2400,12080,2560,11920~
 - Inside source: true
 *** True Line Result
-      if h < circle.radius
-** Processing line: ~        y -= circle.radius~
+  2400,12080,2560,11920
+** Processing line: ~  2560,11920,2640,11740~
 - Inside source: true
 *** True Line Result
-        y -= circle.radius
-** Processing line: ~        h = circle.radius * 2~
+  2560,11920,2640,11740
+** Processing line: ~  2640,11740,2740,11580~
 - Inside source: true
 *** True Line Result
-        h = circle.radius * 2
-** Processing line: ~      end~
+  2640,11740,2740,11580
+** Processing line: ~  2740,11580,2800,11400~
 - Inside source: true
 *** True Line Result
-      end
-** Processing line: ~~
+  2740,11580,2800,11400
+** Processing line: ~  2800,11400,2800,11240~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~      { x: x, y: y, w: w, h: h }~
+  2800,11400,2800,11240
+** Processing line: ~  2740,11140,2800,11240~
 - Inside source: true
 *** True Line Result
-      { x: x, y: y, w: w, h: h }
-** Processing line: ~    end~
+  2740,11140,2800,11240
+** Processing line: ~  2700,11040,2740,11140~
 - Inside source: true
 *** True Line Result
-    end
-** Processing line: ~~
+  2700,11040,2740,11140
+** Processing line: ~  2700,11040,2740,10960~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~    def snap_to_grid x, y, snaps~
+  2700,11040,2740,10960
+** Processing line: ~  2740,10960,2740,10920~
 - Inside source: true
 *** True Line Result
-    def snap_to_grid x, y, snaps
-** Processing line: ~      snap_number = 10~
+  2740,10960,2740,10920
+** Processing line: ~  2700,10900,2740,10920~
 - Inside source: true
 *** True Line Result
-      snap_number = 10
-** Processing line: ~      x = x.to_i~
+  2700,10900,2740,10920
+** Processing line: ~  2380,10900,2700,10900~
 - Inside source: true
 *** True Line Result
-      x = x.to_i
-** Processing line: ~      y = y.to_i~
+  2380,10900,2700,10900
+** Processing line: ~  2040,10920,2380,10900~
 - Inside source: true
 *** True Line Result
-      y = y.to_i
-** Processing line: ~~
+  2040,10920,2380,10900
+** Processing line: ~  1720,10940,2040,10920~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~      x_floor = x.idiv(snap_number) * snap_number~
+  1720,10940,2040,10920
+** Processing line: ~  1380,11000,1720,10940~
 - Inside source: true
 *** True Line Result
-      x_floor = x.idiv(snap_number) * snap_number
-** Processing line: ~      x_mod   = x % snap_number~
+  1380,11000,1720,10940
+** Processing line: ~  1180,10980,1380,11000~
 - Inside source: true
 *** True Line Result
-      x_mod   = x % snap_number
-** Processing line: ~      x_ceil  = (x.idiv(snap_number) + 1) * snap_number~
+  1180,10980,1380,11000
+** Processing line: ~  900,10980,1180,10980~
 - Inside source: true
 *** True Line Result
-      x_ceil  = (x.idiv(snap_number) + 1) * snap_number
-** Processing line: ~~
+  900,10980,1180,10980
+** Processing line: ~  760,10960,900,10980~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~      y_floor = y.idiv(snap_number) * snap_number~
+  760,10960,900,10980
+** Processing line: ~  240,10960,500,10920~
 - Inside source: true
 *** True Line Result
-      y_floor = y.idiv(snap_number) * snap_number
-** Processing line: ~      y_mod   = y % snap_number~
+  240,10960,500,10920
+** Processing line: ~  40,10900,240,10960~
 - Inside source: true
 *** True Line Result
-      y_mod   = y % snap_number
-** Processing line: ~      y_ceil  = (y.idiv(snap_number) + 1) * snap_number~
+  40,10900,240,10960
+** Processing line: ~  0,9700,0,9960~
 - Inside source: true
 *** True Line Result
-      y_ceil  = (y.idiv(snap_number) + 1) * snap_number
-** Processing line: ~~
+  0,9700,0,9960
+** Processing line: ~  -60,9500,0,9700~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~      if snaps[x_floor]~
+  -60,9500,0,9700
+** Processing line: ~  -60,9420,-60,9500~
 - Inside source: true
 *** True Line Result
-      if snaps[x_floor]
-** Processing line: ~        x_result = x_floor~
+  -60,9420,-60,9500
+** Processing line: ~  -60,9420,-60,9340~
 - Inside source: true
 *** True Line Result
-        x_result = x_floor
-** Processing line: ~      elsif snaps[x_ceil]~
+  -60,9420,-60,9340
+** Processing line: ~  -60,9340,-60,9280~
 - Inside source: true
 *** True Line Result
-      elsif snaps[x_ceil]
-** Processing line: ~        x_result = x_ceil~
+  -60,9340,-60,9280
+** Processing line: ~  -60,9120,-60,9280~
 - Inside source: true
 *** True Line Result
-        x_result = x_ceil
-** Processing line: ~      elsif x_mod < snap_number.idiv(2)~
+  -60,9120,-60,9280
+** Processing line: ~  -60,8940,-60,9120~
 - Inside source: true
 *** True Line Result
-      elsif x_mod < snap_number.idiv(2)
-** Processing line: ~        x_result = x_floor~
+  -60,8940,-60,9120
+** Processing line: ~  -60,8940,-60,8780~
 - Inside source: true
 *** True Line Result
-        x_result = x_floor
-** Processing line: ~      else~
+  -60,8940,-60,8780
+** Processing line: ~  -60,8780,0,8700~
 - Inside source: true
 *** True Line Result
-      else
-** Processing line: ~        x_result = x_ceil~
+  -60,8780,0,8700
+** Processing line: ~  0,8700,40,8680~
 - Inside source: true
 *** True Line Result
-        x_result = x_ceil
-** Processing line: ~      end~
+  0,8700,40,8680
+** Processing line: ~  40,8680,240,8700~
 - Inside source: true
 *** True Line Result
-      end
-** Processing line: ~~
+  40,8680,240,8700
+** Processing line: ~  240,8700,360,8780~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~      snaps[x_result] ||= {}~
+  240,8700,360,8780
+** Processing line: ~  360,8780,640,8840~
 - Inside source: true
 *** True Line Result
-      snaps[x_result] ||= {}
-** Processing line: ~~
+  360,8780,640,8840
+** Processing line: ~  1420,8400,1540,8480~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~      if snaps[x_result][y_floor]~
+  1420,8400,1540,8480
+** Processing line: ~  1540,8480,1680,8500~
 - Inside source: true
 *** True Line Result
-      if snaps[x_result][y_floor]
-** Processing line: ~        y_result = y_floor~
+  1540,8480,1680,8500
+** Processing line: ~  1680,8500,1940,8460~
 - Inside source: true
 *** True Line Result
-        y_result = y_floor
-** Processing line: ~      elsif snaps[x_result][y_ceil]~
+  1680,8500,1940,8460
+** Processing line: ~  1180,8840,1280,8880~
 - Inside source: true
 *** True Line Result
-      elsif snaps[x_result][y_ceil]
-** Processing line: ~        y_result = y_ceil~
+  1180,8840,1280,8880
+** Processing line: ~  1280,8880,1340,8860~
 - Inside source: true
 *** True Line Result
-        y_result = y_ceil
-** Processing line: ~      elsif y_mod < snap_number.idiv(2)~
+  1280,8880,1340,8860
+** Processing line: ~  1340,8860,1720,8860~
 - Inside source: true
 *** True Line Result
-      elsif y_mod < snap_number.idiv(2)
-** Processing line: ~        y_result = y_floor~
+  1340,8860,1720,8860
+** Processing line: ~  1720,8860,1820,8920~
 - Inside source: true
 *** True Line Result
-        y_result = y_floor
-** Processing line: ~      else~
+  1720,8860,1820,8920
+** Processing line: ~  1820,8920,1820,9140~
 - Inside source: true
 *** True Line Result
-      else
-** Processing line: ~        y_result = y_ceil~
+  1820,8920,1820,9140
+** Processing line: ~  1820,9140,1820,9280~
 - Inside source: true
 *** True Line Result
-        y_result = y_ceil
-** Processing line: ~      end~
+  1820,9140,1820,9280
+** Processing line: ~  1820,9460,1820,9280~
 - Inside source: true
 *** True Line Result
-      end
-** Processing line: ~~
+  1820,9460,1820,9280
+** Processing line: ~  1760,9480,1820,9460~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~      snaps[x_result][y_result] = true~
+  1760,9480,1820,9460
+** Processing line: ~  1640,9480,1760,9480~
 - Inside source: true
 *** True Line Result
-      snaps[x_result][y_result] = true
-** Processing line: ~      return [x_result, y_result]~
+  1640,9480,1760,9480
+** Processing line: ~  1540,9500,1640,9480~
 - Inside source: true
 *** True Line Result
-      return [x_result, y_result]
-** Processing line: ~~
+  1540,9500,1640,9480
+** Processing line: ~  1340,9500,1540,9500~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~    end~
+  1340,9500,1540,9500
+** Processing line: ~  1100,9500,1340,9500~
 - Inside source: true
 *** True Line Result
-    end
-** Processing line: ~~
+  1100,9500,1340,9500
+** Processing line: ~  1040,9540,1100,9500~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~    def snap_line line~
+  1040,9540,1100,9500
+** Processing line: ~  960,9540,1040,9540~
 - Inside source: true
 *** True Line Result
-    def snap_line line
-** Processing line: ~      x, y, x2, y2 = line~
+  960,9540,1040,9540
+** Processing line: ~  300,9420,360,9460~
 - Inside source: true
 *** True Line Result
-      x, y, x2, y2 = line
-** Processing line: ~    end~
+  300,9420,360,9460
+** Processing line: ~  240,9440,300,9420~
 - Inside source: true
 *** True Line Result
-    end
-** Processing line: ~~
+  240,9440,300,9420
+** Processing line: ~  180,9600,240,9440~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~    def string_to_line s~
+  180,9600,240,9440
+** Processing line: ~  120,9660,180,9600~
 - Inside source: true
 *** True Line Result
-    def string_to_line s
-** Processing line: ~      x, y, x2, y2 = s.split(',').map(&:to_f)~
+  120,9660,180,9600
+** Processing line: ~  100,9820,120,9660~
 - Inside source: true
 *** True Line Result
-      x, y, x2, y2 = s.split(',').map(&:to_f)
-** Processing line: ~~
+  100,9820,120,9660
+** Processing line: ~  100,9820,120,9860~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~      if x > x2~
+  100,9820,120,9860
+** Processing line: ~  120,9860,140,9900~
 - Inside source: true
 *** True Line Result
-      if x > x2
-** Processing line: ~        x2, x = x, x2~
+  120,9860,140,9900
+** Processing line: ~  140,9900,140,10000~
 - Inside source: true
 *** True Line Result
-        x2, x = x, x2
-** Processing line: ~        y2, y = y, y2~
+  140,9900,140,10000
+** Processing line: ~  140,10440,180,10540~
 - Inside source: true
 *** True Line Result
-        y2, y = y, y2
-** Processing line: ~      end~
+  140,10440,180,10540
+** Processing line: ~  100,10080,140,10000~
 - Inside source: true
 *** True Line Result
-      end
-** Processing line: ~~
+  100,10080,140,10000
+** Processing line: ~  100,10080,140,10100~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~      x, y = snap_to_grid x, y, state.snaps~
+  100,10080,140,10100
+** Processing line: ~  140,10100,140,10440~
 - Inside source: true
 *** True Line Result
-      x, y = snap_to_grid x, y, state.snaps
-** Processing line: ~      x2, y2 = snap_to_grid x2, y2, state.snaps~
+  140,10100,140,10440
+** Processing line: ~  180,10540,300,10560~
 - Inside source: true
 *** True Line Result
-      x2, y2 = snap_to_grid x2, y2, state.snaps
-** Processing line: ~      [x, y, x2, y2].line.to_hash~
+  180,10540,300,10560
+** Processing line: ~  2140,9560,2140,9640~
 - Inside source: true
 *** True Line Result
-      [x, y, x2, y2].line.to_hash
-** Processing line: ~    end~
+  2140,9560,2140,9640
+** Processing line: ~  2140,9720,2140,9640~
 - Inside source: true
 *** True Line Result
-    end
-** Processing line: ~~
+  2140,9720,2140,9640
+** Processing line: ~  1880,9780,2140,9720~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~    def load_lines file~
+  1880,9780,2140,9720
+** Processing line: ~  1720,9780,1880,9780~
 - Inside source: true
 *** True Line Result
-    def load_lines file
-** Processing line: ~      data = gtk.read_file(file) || ""~
+  1720,9780,1880,9780
+** Processing line: ~  1620,9740,1720,9780~
 - Inside source: true
 *** True Line Result
-      data = gtk.read_file(file) || ""
-** Processing line: ~      data.each_line~
+  1620,9740,1720,9780
+** Processing line: ~  1500,9780,1620,9740~
 - Inside source: true
 *** True Line Result
-      data.each_line
-** Processing line: ~          .reject { |l| l.strip.length == 0 }~
+  1500,9780,1620,9740
+** Processing line: ~  1380,9780,1500,9780~
 - Inside source: true
 *** True Line Result
-          .reject { |l| l.strip.length == 0 }
-** Processing line: ~          .map { |l| string_to_line l }~
+  1380,9780,1500,9780
+** Processing line: ~  1340,9820,1380,9780~
 - Inside source: true
 *** True Line Result
-          .map { |l| string_to_line l }
-** Processing line: ~          .map { |h| h.merge(rect: rect_for_line(h))  }~
+  1340,9820,1380,9780
+** Processing line: ~  1200,9820,1340,9820~
 - Inside source: true
 *** True Line Result
-          .map { |h| h.merge(rect: rect_for_line(h))  }
-** Processing line: ~    end~
+  1200,9820,1340,9820
+** Processing line: ~  1100,9780,1200,9820~
 - Inside source: true
 *** True Line Result
-    end
-** Processing line: ~~
+  1100,9780,1200,9820
+** Processing line: ~  900,9780,1100,9780~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~    def load_terrain~
+  900,9780,1100,9780
+** Processing line: ~  820,9720,900,9780~
 - Inside source: true
 *** True Line Result
-    def load_terrain
-** Processing line: ~      load_lines 'data/level.txt'~
+  820,9720,900,9780
+** Processing line: ~  540,9720,820,9720~
 - Inside source: true
 *** True Line Result
-      load_lines 'data/level.txt'
-** Processing line: ~    end~
+  540,9720,820,9720
+** Processing line: ~  360,9840,540,9720~
 - Inside source: true
 *** True Line Result
-    end
-** Processing line: ~~
+  360,9840,540,9720
+** Processing line: ~  360,9840,360,9960~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~    def load_lava~
+  360,9840,360,9960
+** Processing line: ~  360,9960,360,10080~
 - Inside source: true
 *** True Line Result
-    def load_lava
-** Processing line: ~      load_lines 'data/level_lava.txt'~
+  360,9960,360,10080
+** Processing line: ~  360,10140,360,10080~
 - Inside source: true
 *** True Line Result
-      load_lines 'data/level_lava.txt'
-** Processing line: ~    end~
+  360,10140,360,10080
+** Processing line: ~  360,10140,360,10240~
 - Inside source: true
 *** True Line Result
-    end
-** Processing line: ~~
+  360,10140,360,10240
+** Processing line: ~  360,10240,420,10320~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~    def load_level force: false~
+  360,10240,420,10320
+** Processing line: ~  700,10300,820,10280~
 - Inside source: true
 *** True Line Result
-    def load_level force: false
-** Processing line: ~      if force~
+  700,10300,820,10280
+** Processing line: ~  820,10280,820,10280~
 - Inside source: true
 *** True Line Result
-      if force
-** Processing line: ~        state.snaps = {}~
+  820,10280,820,10280
+** Processing line: ~  820,10280,900,10320~
 - Inside source: true
 *** True Line Result
-        state.snaps = {}
-** Processing line: ~        state.terrain = load_terrain~
+  820,10280,900,10320
+** Processing line: ~  900,10320,1040,10300~
 - Inside source: true
 *** True Line Result
-        state.terrain = load_terrain
-** Processing line: ~        state.lava = load_lava~
+  900,10320,1040,10300
+** Processing line: ~  1040,10300,1200,10320~
 - Inside source: true
 *** True Line Result
-        state.lava = load_lava
-** Processing line: ~      else~
+  1040,10300,1200,10320
+** Processing line: ~  1200,10320,1380,10280~
 - Inside source: true
 *** True Line Result
-      else
-** Processing line: ~        state.terrain ||= load_terrain~
+  1200,10320,1380,10280
+** Processing line: ~  1380,10280,1500,10300~
 - Inside source: true
 *** True Line Result
-        state.terrain ||= load_terrain
-** Processing line: ~        state.lava ||= load_lava~
+  1380,10280,1500,10300
+** Processing line: ~  1500,10300,1760,10300~
 - Inside source: true
 *** True Line Result
-        state.lava ||= load_lava
-** Processing line: ~      end~
+  1500,10300,1760,10300
+** Processing line: ~  2800,10620,2840,10600~
 - Inside source: true
 *** True Line Result
-      end
-** Processing line: ~    end~
+  2800,10620,2840,10600
+** Processing line: ~  2840,10600,2900,10600~
 - Inside source: true
 *** True Line Result
-    end
-** Processing line: ~~
+  2840,10600,2900,10600
+** Processing line: ~  2900,10600,3000,10620~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~    def save_lines lines, file~
+  2900,10600,3000,10620
+** Processing line: ~  3000,10620,3080,10620~
 - Inside source: true
 *** True Line Result
-    def save_lines lines, file
-** Processing line: ~      s = lines.map do |l|~
+  3000,10620,3080,10620
+** Processing line: ~  3080,10620,3140,10600~
 - Inside source: true
 *** True Line Result
-      s = lines.map do |l|
-** Processing line: ~        "#{l.x1},#{l.y1},#{l.x2},#{l.y2}"~
+  3080,10620,3140,10600
+** Processing line: ~  3140,10540,3140,10600~
 - Inside source: true
 *** True Line Result
-        "#{l.x1},#{l.y1},#{l.x2},#{l.y2}"
-** Processing line: ~      end.join("\n")~
+  3140,10540,3140,10600
+** Processing line: ~  3140,10540,3140,10460~
 - Inside source: true
 *** True Line Result
-      end.join("\n")
-** Processing line: ~      gtk.write_file(file, s)~
+  3140,10540,3140,10460
+** Processing line: ~  3140,10460,3140,10360~
 - Inside source: true
 *** True Line Result
-      gtk.write_file(file, s)
-** Processing line: ~    end~
+  3140,10460,3140,10360
+** Processing line: ~  3140,10360,3140,10260~
 - Inside source: true
 *** True Line Result
-    end
-** Processing line: ~~
+  3140,10360,3140,10260
+** Processing line: ~  3140,10260,3140,10140~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~    def save_level~
+  3140,10260,3140,10140
+** Processing line: ~  3140,10140,3140,10000~
 - Inside source: true
 *** True Line Result
-    def save_level
-** Processing line: ~      save_lines(state.terrain, 'level.txt')~
+  3140,10140,3140,10000
+** Processing line: ~  3140,10000,3140,9860~
 - Inside source: true
 *** True Line Result
-      save_lines(state.terrain, 'level.txt')
-** Processing line: ~      save_lines(state.lava, 'level_lava.txt')~
+  3140,10000,3140,9860
+** Processing line: ~  3140,9860,3160,9720~
 - Inside source: true
 *** True Line Result
-      save_lines(state.lava, 'level_lava.txt')
-** Processing line: ~      load_level force: true~
+  3140,9860,3160,9720
+** Processing line: ~  3160,9720,3160,9580~
 - Inside source: true
 *** True Line Result
-      load_level force: true
-** Processing line: ~    end~
+  3160,9720,3160,9580
+** Processing line: ~  3160,9580,3160,9440~
 - Inside source: true
 *** True Line Result
-    end
-** Processing line: ~~
+  3160,9580,3160,9440
+** Processing line: ~  3160,9300,3160,9440~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~    def line_near_rect? rect, terrain~
+  3160,9300,3160,9440
+** Processing line: ~  3160,9300,3160,9140~
 - Inside source: true
 *** True Line Result
-    def line_near_rect? rect, terrain
-** Processing line: ~      geometry.intersect_rect?(rect, terrain[:rect])~
+  3160,9300,3160,9140
+** Processing line: ~  3160,9140,3160,8980~
 - Inside source: true
 *** True Line Result
-      geometry.intersect_rect?(rect, terrain[:rect])
-** Processing line: ~    end~
+  3160,9140,3160,8980
+** Processing line: ~  3160,8980,3160,8820~
 - Inside source: true
 *** True Line Result
-    end
-** Processing line: ~~
+  3160,8980,3160,8820
+** Processing line: ~  3160,8820,3160,8680~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~    def point_within_line? point, line~
+  3160,8820,3160,8680
+** Processing line: ~  3160,8680,3160,8520~
 - Inside source: true
 *** True Line Result
-    def point_within_line? point, line
-** Processing line: ~      return false if !point~
+  3160,8680,3160,8520
+** Processing line: ~  1760,10300,1880,10300~
 - Inside source: true
 *** True Line Result
-      return false if !point
-** Processing line: ~      return false if !line~
+  1760,10300,1880,10300
+** Processing line: ~  660,9500,960,9540~
 - Inside source: true
 *** True Line Result
-      return false if !line
-** Processing line: ~      return true~
+  660,9500,960,9540
+** Processing line: ~  640,9460,660,9500~
 - Inside source: true
 *** True Line Result
-      return true
-** Processing line: ~    end~
+  640,9460,660,9500
+** Processing line: ~  360,9460,640,9460~
 - Inside source: true
 *** True Line Result
-    end
-** Processing line: ~~
+  360,9460,640,9460
+** Processing line: ~  -480,10760,-440,10880~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~    def calc_impacts x, dx, y, dy, radius~
+  -480,10760,-440,10880
+** Processing line: ~  -480,11020,-440,10880~
 - Inside source: true
 *** True Line Result
-    def calc_impacts x, dx, y, dy, radius
-** Processing line: ~      results = { }~
+  -480,11020,-440,10880
+** Processing line: ~  -480,11160,-260,11240~
 - Inside source: true
 *** True Line Result
-      results = { }
-** Processing line: ~      results[:x] = x~
+  -480,11160,-260,11240
+** Processing line: ~  -480,11020,-480,11160~
 - Inside source: true
 *** True Line Result
-      results[:x] = x
-** Processing line: ~      results[:y] = y~
+  -480,11020,-480,11160
+** Processing line: ~  -600,11420,-380,11320~
 - Inside source: true
 *** True Line Result
-      results[:y] = y
-** Processing line: ~      results[:dx] = x~
+  -600,11420,-380,11320
+** Processing line: ~  -380,11320,-200,11340~
 - Inside source: true
 *** True Line Result
-      results[:dx] = x
-** Processing line: ~      results[:dy] = y~
+  -380,11320,-200,11340
+** Processing line: ~  -200,11340,0,11340~
 - Inside source: true
 *** True Line Result
-      results[:dy] = y
-** Processing line: ~      results[:point] = { x: x, y: y }~
+  -200,11340,0,11340
+** Processing line: ~  0,11340,180,11340~
 - Inside source: true
 *** True Line Result
-      results[:point] = { x: x, y: y }
-** Processing line: ~      results[:rect] = { x: x - radius, y: y - radius, w: radius * 2, h: radius * 2 }~
+  0,11340,180,11340
+** Processing line: ~  960,13420,960,13300~
 - Inside source: true
 *** True Line Result
-      results[:rect] = { x: x - radius, y: y - radius, w: radius * 2, h: radius * 2 }
-** Processing line: ~      results[:trajectory] = trajectory(results)~
+  960,13420,960,13300
+** Processing line: ~  960,13420,960,13520~
 - Inside source: true
 *** True Line Result
-      results[:trajectory] = trajectory(results)
-** Processing line: ~      results[:impacts] = terrain.find_all { |t| line_near_rect? results[:rect], t }.map do |t|~
+  960,13420,960,13520
+** Processing line: ~  960,13520,1000,13560~
 - Inside source: true
 *** True Line Result
-      results[:impacts] = terrain.find_all { |t| line_near_rect? results[:rect], t }.map do |t|
-** Processing line: ~        {~
+  960,13520,1000,13560
+** Processing line: ~  1000,13560,1040,13540~
 - Inside source: true
 *** True Line Result
-        {
-** Processing line: ~          terrain: t,~
+  1000,13560,1040,13540
+** Processing line: ~  1040,13540,1200,13440~
 - Inside source: true
 *** True Line Result
-          terrain: t,
-** Processing line: ~          point: geometry.line_intersect(results[:trajectory], t),~
+  1040,13540,1200,13440
+** Processing line: ~  1200,13440,1380,13380~
 - Inside source: true
 *** True Line Result
-          point: geometry.line_intersect(results[:trajectory], t),
-** Processing line: ~          type: :terrain~
+  1200,13440,1380,13380
+** Processing line: ~  1380,13380,1620,13300~
 - Inside source: true
 *** True Line Result
-          type: :terrain
-** Processing line: ~        }~
+  1380,13380,1620,13300
+** Processing line: ~  1620,13300,1820,13220~
 - Inside source: true
 *** True Line Result
-        }
-** Processing line: ~      end.reject { |t| !point_within_line? t[:point], t[:terrain] }~
+  1620,13300,1820,13220
+** Processing line: ~  1820,13220,2000,13200~
 - Inside source: true
 *** True Line Result
-      end.reject { |t| !point_within_line? t[:point], t[:terrain] }
-** Processing line: ~~
+  1820,13220,2000,13200
+** Processing line: ~  2000,13200,2240,13200~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~      results[:impacts] += lava.find_all { |t| line_near_rect? results[:rect], t }.map do |t|~
+  2000,13200,2240,13200
+** Processing line: ~  2240,13200,2440,13160~
 - Inside source: true
 *** True Line Result
-      results[:impacts] += lava.find_all { |t| line_near_rect? results[:rect], t }.map do |t|
-** Processing line: ~        {~
+  2240,13200,2440,13160
+** Processing line: ~  2440,13160,2640,13040~
 - Inside source: true
 *** True Line Result
-        {
-** Processing line: ~          terrain: t,~
+  2440,13160,2640,13040
+** Processing line: ~  -480,10760,-440,10620~
 - Inside source: true
 *** True Line Result
-          terrain: t,
-** Processing line: ~          point: geometry.line_intersect(results[:trajectory], t),~
+  -480,10760,-440,10620
+** Processing line: ~  -440,10620,-360,10560~
 - Inside source: true
 *** True Line Result
-          point: geometry.line_intersect(results[:trajectory], t),
-** Processing line: ~          type: :lava~
+  -440,10620,-360,10560
+** Processing line: ~  -380,10460,-360,10560~
 - Inside source: true
 *** True Line Result
-          type: :lava
-** Processing line: ~        }~
+  -380,10460,-360,10560
+** Processing line: ~  -380,10460,-360,10300~
 - Inside source: true
 *** True Line Result
-        }
-** Processing line: ~      end.reject { |t| !point_within_line? t[:point], t[:terrain] }~
+  -380,10460,-360,10300
+** Processing line: ~  -380,10140,-360,10300~
 - Inside source: true
 *** True Line Result
-      end.reject { |t| !point_within_line? t[:point], t[:terrain] }
-** Processing line: ~~
+  -380,10140,-360,10300
+** Processing line: ~  -380,10140,-380,10040~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~      results~
+  -380,10140,-380,10040
+** Processing line: ~  -380,9880,-380,10040~
 - Inside source: true
 *** True Line Result
-      results
-** Processing line: ~    end~
+  -380,9880,-380,10040
+** Processing line: ~  -380,9720,-380,9880~
 - Inside source: true
 *** True Line Result
-    end
-** Processing line: ~~
+  -380,9720,-380,9880
+** Processing line: ~  -380,9720,-380,9540~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~    def calc_potential_impacts~
+  -380,9720,-380,9540
+** Processing line: ~  -380,9360,-380,9540~
 - Inside source: true
 *** True Line Result
-    def calc_potential_impacts
-** Processing line: ~      impact_results = calc_impacts circle.x, circle.dx, circle.y, circle.dy, circle.radius~
+  -380,9360,-380,9540
+** Processing line: ~  -380,9180,-380,9360~
 - Inside source: true
 *** True Line Result
-      impact_results = calc_impacts circle.x, circle.dx, circle.y, circle.dy, circle.radius
-** Processing line: ~      circle.rect = impact_results[:rect]~
+  -380,9180,-380,9360
+** Processing line: ~  -380,9180,-380,9000~
 - Inside source: true
 *** True Line Result
-      circle.rect = impact_results[:rect]
-** Processing line: ~      circle.trajectory = impact_results[:trajectory]~
+  -380,9180,-380,9000
+** Processing line: ~  -380,8840,-380,9000~
 - Inside source: true
 *** True Line Result
-      circle.trajectory = impact_results[:trajectory]
-** Processing line: ~      circle.impacts = impact_results[:impacts]~
+  -380,8840,-380,9000
+** Processing line: ~  -380,8840,-380,8760~
 - Inside source: true
 *** True Line Result
-      circle.impacts = impact_results[:impacts]
-** Processing line: ~    end~
+  -380,8840,-380,8760
+** Processing line: ~  -380,8760,-380,8620~
 - Inside source: true
 *** True Line Result
-    end
-** Processing line: ~~
+  -380,8760,-380,8620
+** Processing line: ~  -380,8620,-380,8520~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~    def calc_terrains_to_monitor~
+  -380,8620,-380,8520
+** Processing line: ~  -380,8520,-360,8400~
 - Inside source: true
 *** True Line Result
-    def calc_terrains_to_monitor
-** Processing line: ~      circle.impact = nil~
+  -380,8520,-360,8400
+** Processing line: ~  -360,8400,-100,8400~
 - Inside source: true
 *** True Line Result
-      circle.impact = nil
-** Processing line: ~      circle.impacts.each do |i|~
+  -360,8400,-100,8400
+** Processing line: ~  -100,8400,-60,8420~
 - Inside source: true
 *** True Line Result
-      circle.impacts.each do |i|
-** Processing line: ~        circle.terrains_to_monitor[i[:terrain]] ||= {~
+  -100,8400,-60,8420
+** Processing line: ~  -60,8420,240,8440~
 - Inside source: true
 *** True Line Result
-        circle.terrains_to_monitor[i[:terrain]] ||= {
-** Processing line: ~          ray_start: geometry.ray_test(circle, i[:terrain]),~
+  -60,8420,240,8440
+** Processing line: ~  240,8440,240,8380~
 - Inside source: true
 *** True Line Result
-          ray_start: geometry.ray_test(circle, i[:terrain]),
-** Processing line: ~        }~
+  240,8440,240,8380
+** Processing line: ~  240,8380,500,8440~
 - Inside source: true
 *** True Line Result
-        }
-** Processing line: ~~
+  240,8380,500,8440
+** Processing line: ~  500,8440,760,8460~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~        circle.terrains_to_monitor[i[:terrain]][:ray_current] = geometry.ray_test(circle, i[:terrain])~
+  500,8440,760,8460
+** Processing line: ~  760,8460,1000,8400~
 - Inside source: true
 *** True Line Result
-        circle.terrains_to_monitor[i[:terrain]][:ray_current] = geometry.ray_test(circle, i[:terrain])
-** Processing line: ~        if circle.terrains_to_monitor[i[:terrain]][:ray_start] != circle.terrains_to_monitor[i[:terrain]][:ray_current]~
+  760,8460,1000,8400
+** Processing line: ~  1000,8400,1180,8420~
 - Inside source: true
 *** True Line Result
-        if circle.terrains_to_monitor[i[:terrain]][:ray_start] != circle.terrains_to_monitor[i[:terrain]][:ray_current]
-** Processing line: ~          if circle.x.between?(i[:terrain].x, i[:terrain].x2) || circle.y.between?(i[:terrain].y, i[:terrain].y2)~
+  1000,8400,1180,8420
+** Processing line: ~  1180,8420,1420,8400~
 - Inside source: true
 *** True Line Result
-          if circle.x.between?(i[:terrain].x, i[:terrain].x2) || circle.y.between?(i[:terrain].y, i[:terrain].y2)
-** Processing line: ~            circle.impact = i~
+  1180,8420,1420,8400
+** Processing line: ~  1940,8460,2140,8420~
 - Inside source: true
 *** True Line Result
-            circle.impact = i
-** Processing line: ~            circle.ray_current = circle.terrains_to_monitor[i[:terrain]][:ray_current]~
+  1940,8460,2140,8420
+** Processing line: ~  2140,8420,2200,8520~
 - Inside source: true
 *** True Line Result
-            circle.ray_current = circle.terrains_to_monitor[i[:terrain]][:ray_current]
-** Processing line: ~          end~
+  2140,8420,2200,8520
+** Processing line: ~  2200,8680,2200,8520~
 - Inside source: true
 *** True Line Result
-          end
-** Processing line: ~        end~
+  2200,8680,2200,8520
+** Processing line: ~  2140,8840,2200,8680~
 - Inside source: true
 *** True Line Result
-        end
-** Processing line: ~      end~
+  2140,8840,2200,8680
+** Processing line: ~  2140,8840,2140,9020~
 - Inside source: true
 *** True Line Result
-      end
-** Processing line: ~    end~
+  2140,8840,2140,9020
+** Processing line: ~  2140,9100,2140,9020~
 - Inside source: true
 *** True Line Result
-    end
-** Processing line: ~~
+  2140,9100,2140,9020
+** Processing line: ~  2140,9200,2140,9100~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~    def impact_result body, impact~
+  2140,9200,2140,9100
+** Processing line: ~  2140,9200,2200,9320~
 - Inside source: true
 *** True Line Result
-    def impact_result body, impact
-** Processing line: ~      infinity_alias = 1000~
+  2140,9200,2200,9320
+** Processing line: ~  2200,9320,2200,9440~
 - Inside source: true
 *** True Line Result
-      infinity_alias = 1000
-** Processing line: ~      r = {~
+  2200,9320,2200,9440
+** Processing line: ~  2140,9560,2200,9440~
 - Inside source: true
 *** True Line Result
-      r = {
-** Processing line: ~        body: {},~
+  2140,9560,2200,9440
+** Processing line: ~  1880,10300,2200,10280~
 - Inside source: true
 *** True Line Result
-        body: {},
-** Processing line: ~        terrain: {},~
+  1880,10300,2200,10280
+** Processing line: ~  2200,10280,2480,10260~
 - Inside source: true
 *** True Line Result
-        terrain: {},
-** Processing line: ~        impact: {}~
+  2200,10280,2480,10260
+** Processing line: ~  2480,10260,2700,10240~
 - Inside source: true
 *** True Line Result
-        impact: {}
-** Processing line: ~      }~
+  2480,10260,2700,10240
+** Processing line: ~  2700,10240,2840,10180~
 - Inside source: true
 *** True Line Result
-      }
-** Processing line: ~~
+  2700,10240,2840,10180
+** Processing line: ~  2840,10180,2900,10060~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~      r[:body][:line] = body.trajectory.dup~
+  2840,10180,2900,10060
+** Processing line: ~  2900,9860,2900,10060~
 - Inside source: true
 *** True Line Result
-      r[:body][:line] = body.trajectory.dup
-** Processing line: ~      r[:body][:slope] = geometry.line_slope(body.trajectory, replace_infinity: infinity_alias)~
+  2900,9860,2900,10060
+** Processing line: ~  2900,9640,2900,9860~
 - Inside source: true
 *** True Line Result
-      r[:body][:slope] = geometry.line_slope(body.trajectory, replace_infinity: infinity_alias)
-** Processing line: ~      r[:body][:slope_sign] = r[:body][:slope].sign~
+  2900,9640,2900,9860
+** Processing line: ~  2900,9640,2900,9500~
 - Inside source: true
 *** True Line Result
-      r[:body][:slope_sign] = r[:body][:slope].sign
-** Processing line: ~      r[:body][:x] = body.x~
+  2900,9640,2900,9500
+** Processing line: ~  2900,9460,2900,9500~
 - Inside source: true
 *** True Line Result
-      r[:body][:x] = body.x
-** Processing line: ~      r[:body][:y] = body.y~
+  2900,9460,2900,9500
+** Processing line: ~  2740,9460,2900,9460~
 - Inside source: true
 *** True Line Result
-      r[:body][:y] = body.y
-** Processing line: ~      r[:body][:dy] = body.dy~
+  2740,9460,2900,9460
+** Processing line: ~  2700,9460,2740,9460~
 - Inside source: true
 *** True Line Result
-      r[:body][:dy] = body.dy
-** Processing line: ~      r[:body][:dx] = body.dx~
+  2700,9460,2740,9460
+** Processing line: ~  2700,9360,2700,9460~
 - Inside source: true
 *** True Line Result
-      r[:body][:dx] = body.dx
-** Processing line: ~~
+  2700,9360,2700,9460
+** Processing line: ~  2700,9320,2700,9360~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~      r[:terrain][:line] = impact[:terrain].dup~
+  2700,9320,2700,9360
+** Processing line: ~  2600,9320,2700,9320~
 - Inside source: true
 *** True Line Result
-      r[:terrain][:line] = impact[:terrain].dup
-** Processing line: ~      r[:terrain][:slope] = geometry.line_slope(impact[:terrain], replace_infinity: infinity_alias)~
+  2600,9320,2700,9320
+** Processing line: ~  2600,9260,2600,9320~
 - Inside source: true
 *** True Line Result
-      r[:terrain][:slope] = geometry.line_slope(impact[:terrain], replace_infinity: infinity_alias)
-** Processing line: ~      r[:terrain][:slope_sign] = r[:terrain][:slope].sign~
+  2600,9260,2600,9320
+** Processing line: ~  2600,9200,2600,9260~
 - Inside source: true
 *** True Line Result
-      r[:terrain][:slope_sign] = r[:terrain][:slope].sign
-** Processing line: ~~
+  2600,9200,2600,9260
+** Processing line: ~  2480,9120,2600,9200~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~      r[:impact][:angle] = geometry.angle_between_lines(body.trajectory, impact[:terrain], replace_infinity: infinity_alias)~
+  2480,9120,2600,9200
+** Processing line: ~  2440,9080,2480,9120~
 - Inside source: true
 *** True Line Result
-      r[:impact][:angle] = geometry.angle_between_lines(body.trajectory, impact[:terrain], replace_infinity: infinity_alias)
-** Processing line: ~      r[:impact][:point] = { x: impact[:point].x, y: impact[:point].y }~
+  2440,9080,2480,9120
+** Processing line: ~  2380,9080,2440,9080~
 - Inside source: true
 *** True Line Result
-      r[:impact][:point] = { x: impact[:point].x, y: impact[:point].y }
-** Processing line: ~      r[:impact][:same_slope_sign] = r[:body][:slope_sign] == r[:terrain][:slope_sign]~
+  2380,9080,2440,9080
+** Processing line: ~  2320,9060,2380,9080~
 - Inside source: true
 *** True Line Result
-      r[:impact][:same_slope_sign] = r[:body][:slope_sign] == r[:terrain][:slope_sign]
-** Processing line: ~      r[:impact][:ray] = body.ray_current~
+  2320,9060,2380,9080
+** Processing line: ~  2320,8860,2320,9060~
 - Inside source: true
 *** True Line Result
-      r[:impact][:ray] = body.ray_current
-** Processing line: ~      r[:body][:new_on_floor] = body.on_floor~
+  2320,8860,2320,9060
+** Processing line: ~  2320,8860,2380,8840~
 - Inside source: true
 *** True Line Result
-      r[:body][:new_on_floor] = body.on_floor
-** Processing line: ~      r[:body][:new_floor] = r[:terrain][:line]~
+  2320,8860,2380,8840
+** Processing line: ~  2380,8840,2480,8860~
 - Inside source: true
 *** True Line Result
-      r[:body][:new_floor] = r[:terrain][:line]
-** Processing line: ~~
+  2380,8840,2480,8860
+** Processing line: ~  2480,8860,2600,8840~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~      if r[:impact][:angle].abs < 90 && r[:terrain][:slope].abs < 3~
+  2480,8860,2600,8840
+** Processing line: ~  2600,8840,2740,8840~
 - Inside source: true
 *** True Line Result
-      if r[:impact][:angle].abs < 90 && r[:terrain][:slope].abs < 3
-** Processing line: ~        play_sound~
+  2600,8840,2740,8840
+** Processing line: ~  2740,8840,2840,8800~
 - Inside source: true
 *** True Line Result
-        play_sound
-** Processing line: ~        r[:body][:new_dy] = r[:body][:dy] * circle.elasticity * -1~
+  2740,8840,2840,8800
+** Processing line: ~  2840,8800,2900,8700~
 - Inside source: true
 *** True Line Result
-        r[:body][:new_dy] = r[:body][:dy] * circle.elasticity * -1
-** Processing line: ~        r[:body][:new_dx] = r[:body][:dx] * circle.elasticity~
+  2840,8800,2900,8700
+** Processing line: ~  2900,8600,2900,8700~
 - Inside source: true
 *** True Line Result
-        r[:body][:new_dx] = r[:body][:dx] * circle.elasticity
-** Processing line: ~        r[:impact][:type] = :horizontal~
+  2900,8600,2900,8700
+** Processing line: ~  2900,8480,2900,8600~
 - Inside source: true
 *** True Line Result
-        r[:impact][:type] = :horizontal
-** Processing line: ~        r[:body][:new_reason] = "-"~
+  2900,8480,2900,8600
+** Processing line: ~  2900,8380,2900,8480~
 - Inside source: true
 *** True Line Result
-        r[:body][:new_reason] = "-"
-** Processing line: ~      elsif r[:impact][:angle].abs < 90 && r[:terrain][:slope].abs > 3~
+  2900,8380,2900,8480
+** Processing line: ~  2900,8380,2900,8260~
 - Inside source: true
 *** True Line Result
-      elsif r[:impact][:angle].abs < 90 && r[:terrain][:slope].abs > 3
-** Processing line: ~        play_sound~
+  2900,8380,2900,8260
+** Processing line: ~  2900,8260,2900,8140~
 - Inside source: true
 *** True Line Result
-        play_sound
-** Processing line: ~        r[:body][:new_dy] = r[:body][:dy] * 1.1~
+  2900,8260,2900,8140
+** Processing line: ~  2900,8140,2900,8020~
 - Inside source: true
 *** True Line Result
-        r[:body][:new_dy] = r[:body][:dy] * 1.1
-** Processing line: ~        r[:body][:new_dx] = r[:body][:dx] * -circle.elasticity~
+  2900,8140,2900,8020
+** Processing line: ~  2900,8020,2900,7900~
 - Inside source: true
 *** True Line Result
-        r[:body][:new_dx] = r[:body][:dx] * -circle.elasticity
-** Processing line: ~        r[:impact][:type] = :vertical~
+  2900,8020,2900,7900
+** Processing line: ~  2900,7820,2900,7900~
 - Inside source: true
 *** True Line Result
-        r[:impact][:type] = :vertical
-** Processing line: ~        r[:body][:new_reason] = "|"~
+  2900,7820,2900,7900
+** Processing line: ~  2900,7820,2900,7740~
 - Inside source: true
 *** True Line Result
-        r[:body][:new_reason] = "|"
-** Processing line: ~      else~
+  2900,7820,2900,7740
+** Processing line: ~  2900,7660,2900,7740~
 - Inside source: true
 *** True Line Result
-      else
-** Processing line: ~        play_sound~
+  2900,7660,2900,7740
+** Processing line: ~  2900,7560,2900,7660~
 - Inside source: true
 *** True Line Result
-        play_sound
-** Processing line: ~        r[:body][:new_dx] = r[:body][:dx] * -circle.elasticity~
+  2900,7560,2900,7660
+** Processing line: ~  2900,7460,2900,7560~
 - Inside source: true
 *** True Line Result
-        r[:body][:new_dx] = r[:body][:dx] * -circle.elasticity
-** Processing line: ~        r[:body][:new_dy] = r[:body][:dy] * -circle.elasticity~
+  2900,7460,2900,7560
+** Processing line: ~  2900,7460,2900,7360~
 - Inside source: true
 *** True Line Result
-        r[:body][:new_dy] = r[:body][:dy] * -circle.elasticity
-** Processing line: ~        r[:impact][:type] = :slanted~
+  2900,7460,2900,7360
+** Processing line: ~  2900,7260,2900,7360~
 - Inside source: true
 *** True Line Result
-        r[:impact][:type] = :slanted
-** Processing line: ~        r[:body][:new_reason] = "/"~
+  2900,7260,2900,7360
+** Processing line: ~  2840,7160,2900,7260~
 - Inside source: true
 *** True Line Result
-        r[:body][:new_reason] = "/"
-** Processing line: ~      end~
+  2840,7160,2900,7260
+** Processing line: ~  2800,7080,2840,7160~
 - Inside source: true
 *** True Line Result
-      end
-** Processing line: ~~
+  2800,7080,2840,7160
+** Processing line: ~  2700,7100,2800,7080~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~      r[:impact][:energy] = r[:body][:new_dx].abs + r[:body][:new_dy].abs~
+  2700,7100,2800,7080
+** Processing line: ~  2560,7120,2700,7100~
 - Inside source: true
 *** True Line Result
-      r[:impact][:energy] = r[:body][:new_dx].abs + r[:body][:new_dy].abs
-** Processing line: ~~
+  2560,7120,2700,7100
+** Processing line: ~  2400,7100,2560,7120~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~      if r[:impact][:energy] <= 0.3 && r[:terrain][:slope].abs < 4~
+  2400,7100,2560,7120
+** Processing line: ~  2320,7100,2400,7100~
 - Inside source: true
 *** True Line Result
-      if r[:impact][:energy] <= 0.3 && r[:terrain][:slope].abs < 4
-** Processing line: ~        r[:body][:new_dx] = 0~
+  2320,7100,2400,7100
+** Processing line: ~  2140,7100,2320,7100~
 - Inside source: true
 *** True Line Result
-        r[:body][:new_dx] = 0
-** Processing line: ~        r[:body][:new_dy] = 0~
+  2140,7100,2320,7100
+** Processing line: ~  2040,7080,2140,7100~
 - Inside source: true
 *** True Line Result
-        r[:body][:new_dy] = 0
-** Processing line: ~        r[:impact][:energy] = 0~
+  2040,7080,2140,7100
+** Processing line: ~  1940,7080,2040,7080~
 - Inside source: true
 *** True Line Result
-        r[:impact][:energy] = 0
-** Processing line: ~        r[:body][:new_on_floor] = true~
+  1940,7080,2040,7080
+** Processing line: ~  1820,7140,1940,7080~
 - Inside source: true
 *** True Line Result
-        r[:body][:new_on_floor] = true
-** Processing line: ~        r[:body][:new_floor] = r[:terrain][:line]~
+  1820,7140,1940,7080
+** Processing line: ~  1680,7140,1820,7140~
 - Inside source: true
 *** True Line Result
-        r[:body][:new_floor] = r[:terrain][:line]
-** Processing line: ~        r[:body][:new_reason] = "0"~
+  1680,7140,1820,7140
+** Processing line: ~  1540,7140,1680,7140~
 - Inside source: true
 *** True Line Result
-        r[:body][:new_reason] = "0"
-** Processing line: ~      end~
+  1540,7140,1680,7140
+** Processing line: ~  1420,7220,1540,7140~
 - Inside source: true
 *** True Line Result
-      end
-** Processing line: ~~
+  1420,7220,1540,7140
+** Processing line: ~  1280,7220,1380,7220~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~      r[:impact][:ray_next] = geometry.ray_test({ x: r[:body][:x] - (r[:body][:dx] * 1.1) + r[:body][:new_dx],~
+  1280,7220,1380,7220
+** Processing line: ~  1140,7200,1280,7220~
 - Inside source: true
 *** True Line Result
-      r[:impact][:ray_next] = geometry.ray_test({ x: r[:body][:x] - (r[:body][:dx] * 1.1) + r[:body][:new_dx],
-** Processing line: ~                                                  y: r[:body][:y] - (r[:body][:dy] * 1.1) + r[:body][:new_dy] + state.gravity },~
+  1140,7200,1280,7220
+** Processing line: ~  1000,7220,1140,7200~
 - Inside source: true
 *** True Line Result
-                                                  y: r[:body][:y] - (r[:body][:dy] * 1.1) + r[:body][:new_dy] + state.gravity },
-** Processing line: ~                                                r[:terrain][:line])~
+  1000,7220,1140,7200
+** Processing line: ~  760,7280,900,7320~
 - Inside source: true
 *** True Line Result
-                                                r[:terrain][:line])
-** Processing line: ~~
+  760,7280,900,7320
+** Processing line: ~  540,7220,760,7280~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~      if r[:impact][:ray_next] == r[:impact][:ray]~
+  540,7220,760,7280
+** Processing line: ~  300,7180,540,7220~
 - Inside source: true
 *** True Line Result
-      if r[:impact][:ray_next] == r[:impact][:ray]
-** Processing line: ~        r[:body][:new_dx] *= -1~
+  300,7180,540,7220
+** Processing line: ~  180,7120,180,7160~
 - Inside source: true
 *** True Line Result
-        r[:body][:new_dx] *= -1
-** Processing line: ~        r[:body][:new_dy] *= -1~
+  180,7120,180,7160
+** Processing line: ~  40,7140,180,7120~
 - Inside source: true
 *** True Line Result
-        r[:body][:new_dy] *= -1
-** Processing line: ~        r[:body][:new_reason] = "clip"~
+  40,7140,180,7120
+** Processing line: ~  -60,7160,40,7140~
 - Inside source: true
 *** True Line Result
-        r[:body][:new_reason] = "clip"
-** Processing line: ~      end~
+  -60,7160,40,7140
+** Processing line: ~  -200,7120,-60,7160~
 - Inside source: true
 *** True Line Result
-      end
-** Processing line: ~~
+  -200,7120,-60,7160
+** Processing line: ~  180,7160,300,7180~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~      r~
+  180,7160,300,7180
+** Processing line: ~  -260,7060,-200,7120~
 - Inside source: true
 *** True Line Result
-      r
-** Processing line: ~    end~
+  -260,7060,-200,7120
+** Processing line: ~  -260,6980,-260,7060~
 - Inside source: true
 *** True Line Result
-    end
-** Processing line: ~~
+  -260,6980,-260,7060
+** Processing line: ~  -260,6880,-260,6980~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~    def game_over!~
+  -260,6880,-260,6980
+** Processing line: ~  -260,6880,-260,6820~
 - Inside source: true
 *** True Line Result
-    def game_over!
-** Processing line: ~      circle.x = circle.check_point_x~
+  -260,6880,-260,6820
+** Processing line: ~  -260,6820,-200,6760~
 - Inside source: true
 *** True Line Result
-      circle.x = circle.check_point_x
-** Processing line: ~      circle.y = circle.check_point_y~
+  -260,6820,-200,6760
+** Processing line: ~  -200,6760,-100,6740~
 - Inside source: true
 *** True Line Result
-      circle.y = circle.check_point_y
-** Processing line: ~      circle.dx = 0~
+  -200,6760,-100,6740
+** Processing line: ~  -100,6740,-60,6740~
 - Inside source: true
 *** True Line Result
-      circle.dx = 0
-** Processing line: ~      circle.dy = 0~
+  -100,6740,-60,6740
+** Processing line: ~  -60,6740,40,6740~
 - Inside source: true
 *** True Line Result
-      circle.dy = 0
-** Processing line: ~      circle.game_over_at = state.tick_count~
+  -60,6740,40,6740
+** Processing line: ~  40,6740,300,6800~
 - Inside source: true
 *** True Line Result
-      circle.game_over_at = state.tick_count
-** Processing line: ~    end~
+  40,6740,300,6800
+** Processing line: ~  300,6800,420,6760~
 - Inside source: true
 *** True Line Result
-    end
-** Processing line: ~~
+  300,6800,420,6760
+** Processing line: ~  420,6760,500,6740~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~    def not_game_over!~
+  420,6760,500,6740
+** Processing line: ~  500,6740,540,6760~
 - Inside source: true
 *** True Line Result
-    def not_game_over!
-** Processing line: ~      impact_history_entry = impact_result circle, circle.impact~
+  500,6740,540,6760
+** Processing line: ~  540,6760,540,6760~
 - Inside source: true
 *** True Line Result
-      impact_history_entry = impact_result circle, circle.impact
-** Processing line: ~      circle.impact_history << impact_history_entry~
+  540,6760,540,6760
+** Processing line: ~  540,6760,640,6780~
 - Inside source: true
 *** True Line Result
-      circle.impact_history << impact_history_entry
-** Processing line: ~      circle.x -= circle.dx * 1.1~
+  540,6760,640,6780
+** Processing line: ~  640,6660,640,6780~
 - Inside source: true
 *** True Line Result
-      circle.x -= circle.dx * 1.1
-** Processing line: ~      circle.y -= circle.dy * 1.1~
+  640,6660,640,6780
+** Processing line: ~  580,6580,640,6660~
 - Inside source: true
 *** True Line Result
-      circle.y -= circle.dy * 1.1
-** Processing line: ~      circle.dx = impact_history_entry[:body][:new_dx]~
+  580,6580,640,6660
+** Processing line: ~  580,6440,580,6580~
 - Inside source: true
 *** True Line Result
-      circle.dx = impact_history_entry[:body][:new_dx]
-** Processing line: ~      circle.dy = impact_history_entry[:body][:new_dy]~
+  580,6440,580,6580
+** Processing line: ~  580,6440,640,6320~
 - Inside source: true
 *** True Line Result
-      circle.dy = impact_history_entry[:body][:new_dy]
-** Processing line: ~      circle.on_floor = impact_history_entry[:body][:new_on_floor]~
+  580,6440,640,6320
+** Processing line: ~  640,6320,640,6180~
 - Inside source: true
 *** True Line Result
-      circle.on_floor = impact_history_entry[:body][:new_on_floor]
-** Processing line: ~~
+  640,6320,640,6180
+** Processing line: ~  580,6080,640,6180~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~      if circle.on_floor~
+  580,6080,640,6180
+** Processing line: ~  580,6080,640,5960~
 - Inside source: true
 *** True Line Result
-      if circle.on_floor
-** Processing line: ~        circle.check_point_at = state.tick_count~
+  580,6080,640,5960
+** Processing line: ~  640,5960,640,5840~
 - Inside source: true
 *** True Line Result
-        circle.check_point_at = state.tick_count
-** Processing line: ~        circle.check_point_x = circle.x~
+  640,5960,640,5840
+** Processing line: ~  640,5840,640,5700~
 - Inside source: true
 *** True Line Result
-        circle.check_point_x = circle.x
-** Processing line: ~        circle.check_point_y = circle.y~
+  640,5840,640,5700
+** Processing line: ~  640,5700,660,5560~
 - Inside source: true
 *** True Line Result
-        circle.check_point_y = circle.y
-** Processing line: ~      end~
+  640,5700,660,5560
+** Processing line: ~  660,5560,660,5440~
 - Inside source: true
 *** True Line Result
-      end
-** Processing line: ~~
+  660,5560,660,5440
+** Processing line: ~  660,5440,660,5300~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~      circle.previous_floor = circle.floor || {}~
+  660,5440,660,5300
+** Processing line: ~  660,5140,660,5300~
 - Inside source: true
 *** True Line Result
-      circle.previous_floor = circle.floor || {}
-** Processing line: ~      circle.floor = impact_history_entry[:body][:new_floor] || {}~
+  660,5140,660,5300
+** Processing line: ~  660,5140,660,5000~
 - Inside source: true
 *** True Line Result
-      circle.floor = impact_history_entry[:body][:new_floor] || {}
-** Processing line: ~      circle.floor_point = impact_history_entry[:impact][:point]~
+  660,5140,660,5000
+** Processing line: ~  660,5000,660,4880~
 - Inside source: true
 *** True Line Result
-      circle.floor_point = impact_history_entry[:impact][:point]
-** Processing line: ~      if circle.floor.slice(:x, :y, :x2, :y2) != circle.previous_floor.slice(:x, :y, :x2, :y2)~
+  660,5000,660,4880
+** Processing line: ~  660,4880,820,4860~
 - Inside source: true
 *** True Line Result
-      if circle.floor.slice(:x, :y, :x2, :y2) != circle.previous_floor.slice(:x, :y, :x2, :y2)
-** Processing line: ~        new_relative_x = if circle.dx > 0~
+  660,4880,820,4860
+** Processing line: ~  820,4860,1000,4840~
 - Inside source: true
 *** True Line Result
-        new_relative_x = if circle.dx > 0
-** Processing line: ~                           :right~
+  820,4860,1000,4840
+** Processing line: ~  1000,4840,1100,4860~
 - Inside source: true
 *** True Line Result
-                           :right
-** Processing line: ~                         elsif circle.dx < 0~
+  1000,4840,1100,4860
+** Processing line: ~  1100,4860,1280,4860~
 - Inside source: true
 *** True Line Result
-                         elsif circle.dx < 0
-** Processing line: ~                           :left~
+  1100,4860,1280,4860
+** Processing line: ~  1280,4860,1420,4840~
 - Inside source: true
 *** True Line Result
-                           :left
-** Processing line: ~                         else~
+  1280,4860,1420,4840
+** Processing line: ~  1420,4840,1580,4860~
 - Inside source: true
 *** True Line Result
-                         else
-** Processing line: ~                           nil~
+  1420,4840,1580,4860
+** Processing line: ~  1580,4860,1720,4820~
 - Inside source: true
 *** True Line Result
-                           nil
-** Processing line: ~                         end~
+  1580,4860,1720,4820
+** Processing line: ~  1720,4820,1880,4860~
 - Inside source: true
 *** True Line Result
-                         end
-** Processing line: ~~
+  1720,4820,1880,4860
+** Processing line: ~  1880,4860,2000,4840~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~        new_relative_y = if circle.dy > 0~
+  1880,4860,2000,4840
+** Processing line: ~  2000,4840,2140,4840~
 - Inside source: true
 *** True Line Result
-        new_relative_y = if circle.dy > 0
-** Processing line: ~                           :above~
+  2000,4840,2140,4840
+** Processing line: ~  2140,4840,2320,4860~
 - Inside source: true
 *** True Line Result
-                           :above
-** Processing line: ~                         elsif circle.dy < 0~
+  2140,4840,2320,4860
+** Processing line: ~  2320,4860,2440,4880~
 - Inside source: true
 *** True Line Result
-                         elsif circle.dy < 0
-** Processing line: ~                           :below~
+  2320,4860,2440,4880
+** Processing line: ~  2440,4880,2600,4880~
 - Inside source: true
 *** True Line Result
-                           :below
-** Processing line: ~                         else~
+  2440,4880,2600,4880
+** Processing line: ~  2600,4880,2800,4880~
 - Inside source: true
 *** True Line Result
-                         else
-** Processing line: ~                           nil~
+  2600,4880,2800,4880
+** Processing line: ~  2800,4880,2900,4880~
 - Inside source: true
 *** True Line Result
-                           nil
-** Processing line: ~                         end~
+  2800,4880,2900,4880
+** Processing line: ~  2900,4880,2900,4820~
 - Inside source: true
 *** True Line Result
-                         end
-** Processing line: ~~
+  2900,4880,2900,4820
+** Processing line: ~  2900,4740,2900,4820~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~        circle.floor_relative_x = new_relative_x~
+  2900,4740,2900,4820
+** Processing line: ~  2800,4700,2900,4740~
 - Inside source: true
 *** True Line Result
-        circle.floor_relative_x = new_relative_x
-** Processing line: ~        circle.floor_relative_y = new_relative_y~
+  2800,4700,2900,4740
+** Processing line: ~  2520,4680,2800,4700~
 - Inside source: true
 *** True Line Result
-        circle.floor_relative_y = new_relative_y
-** Processing line: ~      end~
+  2520,4680,2800,4700
+** Processing line: ~  2240,4660,2520,4680~
 - Inside source: true
 *** True Line Result
-      end
-** Processing line: ~~
+  2240,4660,2520,4680
+** Processing line: ~  1940,4620,2240,4660~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~      circle.impact = nil~
+  1940,4620,2240,4660
+** Processing line: ~  1820,4580,1940,4620~
 - Inside source: true
 *** True Line Result
-      circle.impact = nil
-** Processing line: ~      circle.terrains_to_monitor.clear~
+  1820,4580,1940,4620
+** Processing line: ~  1820,4500,1820,4580~
 - Inside source: true
 *** True Line Result
-      circle.terrains_to_monitor.clear
-** Processing line: ~    end~
+  1820,4500,1820,4580
+** Processing line: ~  1820,4500,1880,4420~
 - Inside source: true
 *** True Line Result
-    end
-** Processing line: ~~
+  1820,4500,1880,4420
+** Processing line: ~  1880,4420,2000,4420~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~    def calc_physics~
+  1880,4420,2000,4420
+** Processing line: ~  2000,4420,2200,4420~
 - Inside source: true
 *** True Line Result
-    def calc_physics
-** Processing line: ~      if args.state.god_mode~
+  2000,4420,2200,4420
+** Processing line: ~  2200,4420,2400,4440~
 - Inside source: true
 *** True Line Result
-      if args.state.god_mode
-** Processing line: ~        calc_potential_impacts~
+  2200,4420,2400,4440
+** Processing line: ~  2400,4440,2600,4440~
 - Inside source: true
 *** True Line Result
-        calc_potential_impacts
-** Processing line: ~        calc_terrains_to_monitor~
+  2400,4440,2600,4440
+** Processing line: ~  2600,4440,2840,4440~
 - Inside source: true
 *** True Line Result
-        calc_terrains_to_monitor
-** Processing line: ~        return~
+  2600,4440,2840,4440
+** Processing line: ~  2840,4440,2900,4400~
 - Inside source: true
 *** True Line Result
-        return
-** Processing line: ~      end~
+  2840,4440,2900,4400
+** Processing line: ~  2740,4260,2900,4280~
 - Inside source: true
 *** True Line Result
-      end
-** Processing line: ~~
+  2740,4260,2900,4280
+** Processing line: ~  2600,4240,2740,4260~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~      if circle.y < -700~
+  2600,4240,2740,4260
+** Processing line: ~  2480,4280,2600,4240~
 - Inside source: true
 *** True Line Result
-      if circle.y < -700
-** Processing line: ~        game_over~
+  2480,4280,2600,4240
+** Processing line: ~  2320,4240,2480,4280~
 - Inside source: true
 *** True Line Result
-        game_over
-** Processing line: ~        return~
+  2320,4240,2480,4280
+** Processing line: ~  2140,4220,2320,4240~
 - Inside source: true
 *** True Line Result
-        return
-** Processing line: ~      end~
+  2140,4220,2320,4240
+** Processing line: ~  1940,4220,2140,4220~
 - Inside source: true
 *** True Line Result
-      end
-** Processing line: ~~
+  1940,4220,2140,4220
+** Processing line: ~  1880,4160,1940,4220~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~      return if state.game_over~
+  1880,4160,1940,4220
+** Processing line: ~  1880,4160,1880,4080~
 - Inside source: true
 *** True Line Result
-      return if state.game_over
-** Processing line: ~      return if circle.on_floor~
+  1880,4160,1880,4080
+** Processing line: ~  1880,4080,2040,4040~
 - Inside source: true
 *** True Line Result
-      return if circle.on_floor
-** Processing line: ~      circle.previous_dy = circle.dy~
+  1880,4080,2040,4040
+** Processing line: ~  2040,4040,2240,4060~
 - Inside source: true
 *** True Line Result
-      circle.previous_dy = circle.dy
-** Processing line: ~      circle.previous_dx = circle.dx~
+  2040,4040,2240,4060
+** Processing line: ~  2240,4060,2400,4040~
 - Inside source: true
 *** True Line Result
-      circle.previous_dx = circle.dx
-** Processing line: ~      circle.x  += circle.dx~
+  2240,4060,2400,4040
+** Processing line: ~  2400,4040,2600,4060~
 - Inside source: true
 *** True Line Result
-      circle.x  += circle.dx
-** Processing line: ~      circle.y  += circle.dy~
+  2400,4040,2600,4060
+** Processing line: ~  2600,4060,2740,4020~
 - Inside source: true
 *** True Line Result
-      circle.y  += circle.dy
-** Processing line: ~      args.state.distance_traveled ||= 0~
+  2600,4060,2740,4020
+** Processing line: ~  2740,4020,2840,3940~
 - Inside source: true
 *** True Line Result
-      args.state.distance_traveled ||= 0
-** Processing line: ~      args.state.distance_traveled += circle.dx.abs + circle.dy.abs~
+  2740,4020,2840,3940
+** Processing line: ~  2840,3780,2840,3940~
 - Inside source: true
 *** True Line Result
-      args.state.distance_traveled += circle.dx.abs + circle.dy.abs
-** Processing line: ~      circle.dy += state.gravity~
+  2840,3780,2840,3940
+** Processing line: ~  2740,3660,2840,3780~
 - Inside source: true
 *** True Line Result
-      circle.dy += state.gravity
-** Processing line: ~      calc_potential_impacts~
+  2740,3660,2840,3780
+** Processing line: ~  2700,3680,2740,3660~
 - Inside source: true
 *** True Line Result
-      calc_potential_impacts
-** Processing line: ~      calc_terrains_to_monitor~
+  2700,3680,2740,3660
+** Processing line: ~  2520,3700,2700,3680~
 - Inside source: true
 *** True Line Result
-      calc_terrains_to_monitor
-** Processing line: ~      return unless circle.impact~
+  2520,3700,2700,3680
+** Processing line: ~  2380,3700,2520,3700~
 - Inside source: true
 *** True Line Result
-      return unless circle.impact
-** Processing line: ~      if circle.impact && circle.impact[:type] == :lava~
+  2380,3700,2520,3700
+** Processing line: ~  2200,3720,2380,3700~
 - Inside source: true
 *** True Line Result
-      if circle.impact && circle.impact[:type] == :lava
-** Processing line: ~        game_over!~
+  2200,3720,2380,3700
+** Processing line: ~  2040,3720,2200,3720~
 - Inside source: true
 *** True Line Result
-        game_over!
-** Processing line: ~      else~
+  2040,3720,2200,3720
+** Processing line: ~  1880,3700,2040,3720~
 - Inside source: true
 *** True Line Result
-      else
-** Processing line: ~        not_game_over!~
+  1880,3700,2040,3720
+** Processing line: ~  1820,3680,1880,3700~
 - Inside source: true
 *** True Line Result
-        not_game_over!
-** Processing line: ~      end~
+  1820,3680,1880,3700
+** Processing line: ~  1760,3600,1820,3680~
 - Inside source: true
 *** True Line Result
-      end
-** Processing line: ~    end~
+  1760,3600,1820,3680
+** Processing line: ~  1760,3600,1820,3480~
 - Inside source: true
 *** True Line Result
-    end
-** Processing line: ~~
+  1760,3600,1820,3480
+** Processing line: ~  1820,3480,1880,3440~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~    def input_god_mode~
+  1820,3480,1880,3440
+** Processing line: ~  1880,3440,1960,3460~
 - Inside source: true
 *** True Line Result
-    def input_god_mode
-** Processing line: ~      state.debug_mode = !state.debug_mode if inputs.keyboard.key_down.forward_slash~
+  1880,3440,1960,3460
+** Processing line: ~  1960,3460,2140,3460~
 - Inside source: true
 *** True Line Result
-      state.debug_mode = !state.debug_mode if inputs.keyboard.key_down.forward_slash
-** Processing line: ~~
+  1960,3460,2140,3460
+** Processing line: ~  2140,3460,2380,3460~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~      # toggle god mode~
+  2140,3460,2380,3460
+** Processing line: ~  2380,3460,2640,3440~
 - Inside source: true
 *** True Line Result
-      # toggle god mode
-** Processing line: ~      if inputs.keyboard.key_down.g~
+  2380,3460,2640,3440
+** Processing line: ~  2640,3440,2900,3380~
 - Inside source: true
 *** True Line Result
-      if inputs.keyboard.key_down.g
-** Processing line: ~        state.god_mode = !state.god_mode~
+  2640,3440,2900,3380
+** Processing line: ~  2840,3280,2900,3380~
 - Inside source: true
 *** True Line Result
-        state.god_mode = !state.god_mode
-** Processing line: ~        state.potential_lift = 0~
+  2840,3280,2900,3380
+** Processing line: ~  2840,3280,2900,3200~
 - Inside source: true
 *** True Line Result
-        state.potential_lift = 0
-** Processing line: ~        circle.floor = nil~
+  2840,3280,2900,3200
+** Processing line: ~  2900,3200,2900,3140~
 - Inside source: true
 *** True Line Result
-        circle.floor = nil
-** Processing line: ~        circle.floor_point = nil~
+  2900,3200,2900,3140
+** Processing line: ~  2840,3020,2900,3140~
 - Inside source: true
 *** True Line Result
-        circle.floor_point = nil
-** Processing line: ~        circle.floor_relative_x = nil~
+  2840,3020,2900,3140
+** Processing line: ~  2800,2960,2840,3020~
 - Inside source: true
 *** True Line Result
-        circle.floor_relative_x = nil
-** Processing line: ~        circle.floor_relative_y = nil~
+  2800,2960,2840,3020
+** Processing line: ~  2700,3000,2800,2960~
 - Inside source: true
 *** True Line Result
-        circle.floor_relative_y = nil
-** Processing line: ~        circle.impact = nil~
+  2700,3000,2800,2960
+** Processing line: ~  2600,2980,2700,3000~
 - Inside source: true
 *** True Line Result
-        circle.impact = nil
-** Processing line: ~        circle.terrains_to_monitor.clear~
+  2600,2980,2700,3000
+** Processing line: ~  2380,3000,2600,2980~
 - Inside source: true
 *** True Line Result
-        circle.terrains_to_monitor.clear
-** Processing line: ~        return~
+  2380,3000,2600,2980
+** Processing line: ~  2140,3000,2380,3000~
 - Inside source: true
 *** True Line Result
-        return
-** Processing line: ~      end~
+  2140,3000,2380,3000
+** Processing line: ~  1880,3000,2140,3000~
 - Inside source: true
 *** True Line Result
-      end
-** Processing line: ~~
+  1880,3000,2140,3000
+** Processing line: ~  1720,3040,1880,3000~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~      return unless state.god_mode~
+  1720,3040,1880,3000
+** Processing line: ~  1640,2960,1720,3040~
 - Inside source: true
 *** True Line Result
-      return unless state.god_mode
-** Processing line: ~~
+  1640,2960,1720,3040
+** Processing line: ~  1500,2940,1640,2960~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~      circle.x = circle.x.to_i~
+  1500,2940,1640,2960
+** Processing line: ~  1340,3000,1500,2940~
 - Inside source: true
 *** True Line Result
-      circle.x = circle.x.to_i
-** Processing line: ~      circle.y = circle.y.to_i~
+  1340,3000,1500,2940
+** Processing line: ~  1240,3000,1340,3000~
 - Inside source: true
 *** True Line Result
-      circle.y = circle.y.to_i
-** Processing line: ~~
+  1240,3000,1340,3000
+** Processing line: ~  1140,3020,1240,3000~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~      # move god circle~
+  1140,3020,1240,3000
+** Processing line: ~  1040,3000,1140,3020~
 - Inside source: true
 *** True Line Result
-      # move god circle
-** Processing line: ~      if inputs.keyboard.left || inputs.keyboard.a~
+  1040,3000,1140,3020
+** Processing line: ~  960,2960,1040,3000~
 - Inside source: true
 *** True Line Result
-      if inputs.keyboard.left || inputs.keyboard.a
-** Processing line: ~        circle.x -= 20~
+  960,2960,1040,3000
+** Processing line: ~  900,2960,960,2960~
 - Inside source: true
 *** True Line Result
-        circle.x -= 20
-** Processing line: ~      elsif inputs.keyboard.right || inputs.keyboard.d || inputs.keyboard.f~
+  900,2960,960,2960
+** Processing line: ~  840,2840,900,2960~
 - Inside source: true
 *** True Line Result
-      elsif inputs.keyboard.right || inputs.keyboard.d || inputs.keyboard.f
-** Processing line: ~        circle.x += 20~
+  840,2840,900,2960
+** Processing line: ~  700,2820,840,2840~
 - Inside source: true
 *** True Line Result
-        circle.x += 20
-** Processing line: ~      end~
+  700,2820,840,2840
+** Processing line: ~  540,2820,700,2820~
 - Inside source: true
 *** True Line Result
-      end
-** Processing line: ~~
+  540,2820,700,2820
+** Processing line: ~  420,2820,540,2820~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~      if inputs.keyboard.up || inputs.keyboard.w~
+  420,2820,540,2820
+** Processing line: ~  180,2800,420,2820~
 - Inside source: true
 *** True Line Result
-      if inputs.keyboard.up || inputs.keyboard.w
-** Processing line: ~        circle.y += 20~
+  180,2800,420,2820
+** Processing line: ~  60,2780,180,2800~
 - Inside source: true
 *** True Line Result
-        circle.y += 20
-** Processing line: ~      elsif inputs.keyboard.down || inputs.keyboard.s~
+  60,2780,180,2800
+** Processing line: ~  -60,2800,60,2780~
 - Inside source: true
 *** True Line Result
-      elsif inputs.keyboard.down || inputs.keyboard.s
-** Processing line: ~        circle.y -= 20~
+  -60,2800,60,2780
+** Processing line: ~  -160,2760,-60,2800~
 - Inside source: true
 *** True Line Result
-        circle.y -= 20
-** Processing line: ~      end~
+  -160,2760,-60,2800
+** Processing line: ~  -260,2740,-160,2760~
 - Inside source: true
 *** True Line Result
-      end
-** Processing line: ~~
+  -260,2740,-160,2760
+** Processing line: ~  -300,2640,-260,2740~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~      # delete terrain~
+  -300,2640,-260,2740
+** Processing line: ~  -360,2560,-300,2640~
 - Inside source: true
 *** True Line Result
-      # delete terrain
-** Processing line: ~      if inputs.keyboard.key_down.x~
+  -360,2560,-300,2640
+** Processing line: ~  -380,2460,-360,2560~
 - Inside source: true
 *** True Line Result
-      if inputs.keyboard.key_down.x
-** Processing line: ~        calc_terrains_to_monitor~
+  -380,2460,-360,2560
+** Processing line: ~  -380,2460,-300,2380~
 - Inside source: true
 *** True Line Result
-        calc_terrains_to_monitor
-** Processing line: ~        state.terrain = state.terrain.reject do |t|~
+  -380,2460,-300,2380
+** Processing line: ~  -300,2300,-300,2380~
 - Inside source: true
 *** True Line Result
-        state.terrain = state.terrain.reject do |t|
-** Processing line: ~          t[:rect].intersect_rect? circle.rect~
+  -300,2300,-300,2380
+** Processing line: ~  -300,2300,-300,2220~
 - Inside source: true
 *** True Line Result
-          t[:rect].intersect_rect? circle.rect
-** Processing line: ~        end~
+  -300,2300,-300,2220
+** Processing line: ~  -300,2100,-300,2220~
 - Inside source: true
 *** True Line Result
-        end
-** Processing line: ~~
+  -300,2100,-300,2220
+** Processing line: ~  -300,2100,-300,2040~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~        state.lava = state.lava.reject do |t|~
+  -300,2100,-300,2040
+** Processing line: ~  -300,2040,-160,2040~
 - Inside source: true
 *** True Line Result
-        state.lava = state.lava.reject do |t|
-** Processing line: ~          t[:rect].intersect_rect? circle.rect~
+  -300,2040,-160,2040
+** Processing line: ~  -160,2040,-60,2040~
 - Inside source: true
 *** True Line Result
-          t[:rect].intersect_rect? circle.rect
-** Processing line: ~        end~
+  -160,2040,-60,2040
+** Processing line: ~  -60,2040,60,2040~
 - Inside source: true
 *** True Line Result
-        end
-** Processing line: ~~
+  -60,2040,60,2040
+** Processing line: ~  60,2040,180,2040~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~        calc_potential_impacts~
+  60,2040,180,2040
+** Processing line: ~  180,2040,360,2040~
 - Inside source: true
 *** True Line Result
-        calc_potential_impacts
-** Processing line: ~        save_level~
+  180,2040,360,2040
+** Processing line: ~  360,2040,540,2040~
 - Inside source: true
 *** True Line Result
-        save_level
-** Processing line: ~      end~
+  360,2040,540,2040
+** Processing line: ~  540,2040,700,2080~
 - Inside source: true
 *** True Line Result
-      end
-** Processing line: ~~
+  540,2040,700,2080
+** Processing line: ~  660,2160,700,2080~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~      # change terrain type~
+  660,2160,700,2080
+** Processing line: ~  660,2160,700,2260~
 - Inside source: true
 *** True Line Result
-      # change terrain type
-** Processing line: ~      if inputs.keyboard.key_down.l~
+  660,2160,700,2260
+** Processing line: ~  660,2380,700,2260~
 - Inside source: true
 *** True Line Result
-      if inputs.keyboard.key_down.l
-** Processing line: ~        if state.line_mode == :terrain~
+  660,2380,700,2260
+** Processing line: ~  500,2340,660,2380~
 - Inside source: true
 *** True Line Result
-        if state.line_mode == :terrain
-** Processing line: ~          state.line_mode = :lava~
+  500,2340,660,2380
+** Processing line: ~  360,2340,500,2340~
 - Inside source: true
 *** True Line Result
-          state.line_mode = :lava
-** Processing line: ~        else~
+  360,2340,500,2340
+** Processing line: ~  240,2340,360,2340~
 - Inside source: true
 *** True Line Result
-        else
-** Processing line: ~          state.line_mode = :terrain~
+  240,2340,360,2340
+** Processing line: ~  40,2320,240,2340~
 - Inside source: true
 *** True Line Result
-          state.line_mode = :terrain
-** Processing line: ~        end~
+  40,2320,240,2340
+** Processing line: ~  -60,2320,40,2320~
 - Inside source: true
 *** True Line Result
-        end
-** Processing line: ~      end~
+  -60,2320,40,2320
+** Processing line: ~  -100,2380,-60,2320~
 - Inside source: true
 *** True Line Result
-      end
-** Processing line: ~~
+  -100,2380,-60,2320
+** Processing line: ~  -100,2380,-100,2460~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~      if inputs.mouse.click && !state.point_one~
+  -100,2380,-100,2460
+** Processing line: ~  -100,2460,-100,2540~
 - Inside source: true
 *** True Line Result
-      if inputs.mouse.click && !state.point_one
-** Processing line: ~        state.point_one = inputs.mouse.click.point~
+  -100,2460,-100,2540
+** Processing line: ~  -100,2540,0,2560~
 - Inside source: true
 *** True Line Result
-        state.point_one = inputs.mouse.click.point
-** Processing line: ~      elsif inputs.mouse.click && state.point_one~
+  -100,2540,0,2560
+** Processing line: ~  0,2560,140,2600~
 - Inside source: true
 *** True Line Result
-      elsif inputs.mouse.click && state.point_one
-** Processing line: ~        l = [*state.point_one, *inputs.mouse.click.point]~
+  0,2560,140,2600
+** Processing line: ~  140,2600,300,2600~
 - Inside source: true
 *** True Line Result
-        l = [*state.point_one, *inputs.mouse.click.point]
-** Processing line: ~        l = [l.x  - state.camera.x,~
+  140,2600,300,2600
+** Processing line: ~  300,2600,460,2600~
 - Inside source: true
 *** True Line Result
-        l = [l.x  - state.camera.x,
-** Processing line: ~             l.y  - state.camera.y,~
+  300,2600,460,2600
+** Processing line: ~  460,2600,640,2600~
 - Inside source: true
 *** True Line Result
-             l.y  - state.camera.y,
-** Processing line: ~             l.x2 - state.camera.x,~
+  460,2600,640,2600
+** Processing line: ~  640,2600,760,2580~
 - Inside source: true
 *** True Line Result
-             l.x2 - state.camera.x,
-** Processing line: ~             l.y2 - state.camera.y].line.to_hash~
+  640,2600,760,2580
+** Processing line: ~  760,2580,820,2560~
 - Inside source: true
 *** True Line Result
-             l.y2 - state.camera.y].line.to_hash
-** Processing line: ~        l[:rect] = rect_for_line l~
+  760,2580,820,2560
+** Processing line: ~  820,2560,820,2500~
 - Inside source: true
 *** True Line Result
-        l[:rect] = rect_for_line l
-** Processing line: ~        if state.line_mode == :terrain~
+  820,2560,820,2500
+** Processing line: ~  820,2500,820,2400~
 - Inside source: true
 *** True Line Result
-        if state.line_mode == :terrain
-** Processing line: ~          state.terrain << l~
+  820,2500,820,2400
+** Processing line: ~  820,2400,840,2320~
 - Inside source: true
 *** True Line Result
-          state.terrain << l
-** Processing line: ~        else~
+  820,2400,840,2320
+** Processing line: ~  840,2320,840,2240~
 - Inside source: true
 *** True Line Result
-        else
-** Processing line: ~          state.lava << l~
+  840,2320,840,2240
+** Processing line: ~  820,2120,840,2240~
 - Inside source: true
 *** True Line Result
-          state.lava << l
-** Processing line: ~        end~
+  820,2120,840,2240
+** Processing line: ~  820,2020,820,2120~
 - Inside source: true
 *** True Line Result
-        end
-** Processing line: ~        save_level~
+  820,2020,820,2120
+** Processing line: ~  820,1900,820,2020~
 - Inside source: true
 *** True Line Result
-        save_level
-** Processing line: ~        next_x = inputs.mouse.click.point.x - 640~
+  820,1900,820,2020
+** Processing line: ~  760,1840,820,1900~
 - Inside source: true
 *** True Line Result
-        next_x = inputs.mouse.click.point.x - 640
-** Processing line: ~        next_y = inputs.mouse.click.point.y - 360~
+  760,1840,820,1900
+** Processing line: ~  640,1840,760,1840~
 - Inside source: true
 *** True Line Result
-        next_y = inputs.mouse.click.point.y - 360
-** Processing line: ~        circle.x += next_x~
+  640,1840,760,1840
+** Processing line: ~  500,1840,640,1840~
 - Inside source: true
 *** True Line Result
-        circle.x += next_x
-** Processing line: ~        circle.y += next_y~
+  500,1840,640,1840
+** Processing line: ~  300,1860,420,1880~
 - Inside source: true
 *** True Line Result
-        circle.y += next_y
-** Processing line: ~        state.point_one = nil~
+  300,1860,420,1880
+** Processing line: ~  180,1840,300,1860~
 - Inside source: true
 *** True Line Result
-        state.point_one = nil
-** Processing line: ~      elsif inputs.keyboard.one~
+  180,1840,300,1860
+** Processing line: ~  420,1880,500,1840~
 - Inside source: true
 *** True Line Result
-      elsif inputs.keyboard.one
-** Processing line: ~        state.point_one = [circle.x + camera.x, circle.y+ camera.y]~
+  420,1880,500,1840
+** Processing line: ~  0,1840,180,1840~
 - Inside source: true
 *** True Line Result
-        state.point_one = [circle.x + camera.x, circle.y+ camera.y]
-** Processing line: ~      end~
+  0,1840,180,1840
+** Processing line: ~  -60,1860,0,1840~
 - Inside source: true
 *** True Line Result
-      end
-** Processing line: ~~
+  -60,1860,0,1840
+** Processing line: ~  -160,1840,-60,1860~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~      # cancel chain lines~
+  -160,1840,-60,1860
+** Processing line: ~  -200,1800,-160,1840~
 - Inside source: true
 *** True Line Result
-      # cancel chain lines
-** Processing line: ~      if inputs.keyboard.key_down.nine || inputs.keyboard.key_down.escape || inputs.keyboard.key_up.six || inputs.keyboard.key_up.one~
+  -200,1800,-160,1840
+** Processing line: ~  -260,1760,-200,1800~
 - Inside source: true
 *** True Line Result
-      if inputs.keyboard.key_down.nine || inputs.keyboard.key_down.escape || inputs.keyboard.key_up.six || inputs.keyboard.key_up.one
-** Processing line: ~        state.point_one = nil~
+  -260,1760,-200,1800
+** Processing line: ~  -260,1680,-260,1760~
 - Inside source: true
 *** True Line Result
-        state.point_one = nil
-** Processing line: ~      end~
+  -260,1680,-260,1760
+** Processing line: ~  -260,1620,-260,1680~
 - Inside source: true
 *** True Line Result
-      end
-** Processing line: ~    end~
+  -260,1620,-260,1680
+** Processing line: ~  -260,1540,-260,1620~
 - Inside source: true
 *** True Line Result
-    end
-** Processing line: ~~
+  -260,1540,-260,1620
+** Processing line: ~  -260,1540,-260,1460~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~    def play_sound~
+  -260,1540,-260,1460
+** Processing line: ~  -300,1420,-260,1460~
 - Inside source: true
 *** True Line Result
-    def play_sound
-** Processing line: ~      return if state.sound_debounce > 0~
+  -300,1420,-260,1460
+** Processing line: ~  -300,1420,-300,1340~
 - Inside source: true
 *** True Line Result
-      return if state.sound_debounce > 0
-** Processing line: ~      state.sound_debounce = 5~
+  -300,1420,-300,1340
+** Processing line: ~  -300,1340,-260,1260~
 - Inside source: true
 *** True Line Result
-      state.sound_debounce = 5
-** Processing line: ~      outputs.sounds << "sounds/03#{"%02d" % state.sound_index}.wav"~
+  -300,1340,-260,1260
+** Processing line: ~  -260,1260,-260,1160~
 - Inside source: true
 *** True Line Result
-      outputs.sounds << "sounds/03#{"%02d" % state.sound_index}.wav"
-** Processing line: ~      state.sound_index += 1~
+  -260,1260,-260,1160
+** Processing line: ~  -260,1060,-260,1160~
 - Inside source: true
 *** True Line Result
-      state.sound_index += 1
-** Processing line: ~      if state.sound_index > 21~
+  -260,1060,-260,1160
+** Processing line: ~  -260,1060,-260,960~
 - Inside source: true
 *** True Line Result
-      if state.sound_index > 21
-** Processing line: ~        state.sound_index = 1~
+  -260,1060,-260,960
+** Processing line: ~  -260,880,-260,960~
 - Inside source: true
 *** True Line Result
-        state.sound_index = 1
-** Processing line: ~      end~
+  -260,880,-260,960
+** Processing line: ~  -260,880,-260,780~
 - Inside source: true
 *** True Line Result
-      end
-** Processing line: ~    end~
+  -260,880,-260,780
+** Processing line: ~  -260,780,-260,680~
 - Inside source: true
 *** True Line Result
-    end
-** Processing line: ~~
+  -260,780,-260,680
+** Processing line: ~  -300,580,-260,680~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~    def input_game~
+  -300,580,-260,680
+** Processing line: ~  -300,580,-300,480~
 - Inside source: true
 *** True Line Result
-    def input_game
-** Processing line: ~      if inputs.keyboard.down || inputs.keyboard.space~
+  -300,580,-300,480
+** Processing line: ~  -300,480,-260,400~
 - Inside source: true
 *** True Line Result
-      if inputs.keyboard.down || inputs.keyboard.space
-** Processing line: ~        circle.potential_lift += 0.03~
+  -300,480,-260,400
+** Processing line: ~  -300,320,-260,400~
 - Inside source: true
 *** True Line Result
-        circle.potential_lift += 0.03
-** Processing line: ~        circle.potential_lift = circle.potential_lift.lesser(10)~
+  -300,320,-260,400
+** Processing line: ~  -300,320,-300,240~
 - Inside source: true
 *** True Line Result
-        circle.potential_lift = circle.potential_lift.lesser(10)
-** Processing line: ~      elsif inputs.keyboard.key_up.down || inputs.keyboard.key_up.space~
+  -300,320,-300,240
+** Processing line: ~  -300,240,-200,220~
 - Inside source: true
 *** True Line Result
-      elsif inputs.keyboard.key_up.down || inputs.keyboard.key_up.space
-** Processing line: ~        play_sound~
+  -300,240,-200,220
+** Processing line: ~  -200,220,-200,160~
 - Inside source: true
 *** True Line Result
-        play_sound
-** Processing line: ~        circle.dy += circle.angle.vector_y circle.potential_lift~
+  -200,220,-200,160
+** Processing line: ~  -200,160,-100,140~
 - Inside source: true
 *** True Line Result
-        circle.dy += circle.angle.vector_y circle.potential_lift
-** Processing line: ~        circle.dx += circle.angle.vector_x circle.potential_lift~
+  -200,160,-100,140
+** Processing line: ~  -100,140,0,120~
 - Inside source: true
 *** True Line Result
-        circle.dx += circle.angle.vector_x circle.potential_lift
-** Processing line: ~~
+  -100,140,0,120
+** Processing line: ~  0,120,60,120~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~        if circle.on_floor~
+  0,120,60,120
+** Processing line: ~  60,120,180,120~
 - Inside source: true
 *** True Line Result
-        if circle.on_floor
-** Processing line: ~          if circle.floor_relative_y == :above~
+  60,120,180,120
+** Processing line: ~  180,120,300,120~
 - Inside source: true
 *** True Line Result
-          if circle.floor_relative_y == :above
-** Processing line: ~            circle.y += circle.potential_lift.abs * 2~
+  180,120,300,120
+** Processing line: ~  300,120,420,140~
 - Inside source: true
 *** True Line Result
-            circle.y += circle.potential_lift.abs * 2
-** Processing line: ~          elsif circle.floor_relative_y == :below~
+  300,120,420,140
+** Processing line: ~  420,140,580,180~
 - Inside source: true
 *** True Line Result
-          elsif circle.floor_relative_y == :below
-** Processing line: ~            circle.y -= circle.potential_lift.abs * 2~
+  420,140,580,180
+** Processing line: ~  580,180,760,180~
 - Inside source: true
 *** True Line Result
-            circle.y -= circle.potential_lift.abs * 2
-** Processing line: ~          end~
+  580,180,760,180
+** Processing line: ~  760,180,900,180~
 - Inside source: true
 *** True Line Result
-          end
-** Processing line: ~        end~
+  760,180,900,180
+** Processing line: ~  960,180,1100,180~
 - Inside source: true
 *** True Line Result
-        end
-** Processing line: ~~
+  960,180,1100,180
+** Processing line: ~  1100,180,1340,200~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~        circle.on_floor = false~
+  1100,180,1340,200
+** Processing line: ~  1340,200,1580,200~
 - Inside source: true
 *** True Line Result
-        circle.on_floor = false
-** Processing line: ~        circle.potential_lift = 0~
+  1340,200,1580,200
+** Processing line: ~  1580,200,1720,180~
 - Inside source: true
 *** True Line Result
-        circle.potential_lift = 0
-** Processing line: ~        circle.terrains_to_monitor.clear~
+  1580,200,1720,180
+** Processing line: ~  1720,180,2000,140~
 - Inside source: true
 *** True Line Result
-        circle.terrains_to_monitor.clear
-** Processing line: ~        circle.impact_history.clear~
+  1720,180,2000,140
+** Processing line: ~  2000,140,2240,140~
 - Inside source: true
 *** True Line Result
-        circle.impact_history.clear
-** Processing line: ~        circle.impact = nil~
+  2000,140,2240,140
+** Processing line: ~  2240,140,2480,140~
 - Inside source: true
 *** True Line Result
-        circle.impact = nil
-** Processing line: ~        calc_physics~
+  2240,140,2480,140
+** Processing line: ~  2520,140,2800,160~
 - Inside source: true
 *** True Line Result
-        calc_physics
-** Processing line: ~      end~
+  2520,140,2800,160
+** Processing line: ~  2800,160,3000,160~
 - Inside source: true
 *** True Line Result
-      end
-** Processing line: ~~
+  2800,160,3000,160
+** Processing line: ~  3000,160,3140,160~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~      # aim probe~
+  3000,160,3140,160
+** Processing line: ~  3140,260,3140,160~
 - Inside source: true
 *** True Line Result
-      # aim probe
-** Processing line: ~      if inputs.keyboard.right || inputs.keyboard.a~
+  3140,260,3140,160
+** Processing line: ~  3140,260,3140,380~
 - Inside source: true
 *** True Line Result
-      if inputs.keyboard.right || inputs.keyboard.a
-** Processing line: ~        circle.angle -= 2~
+  3140,260,3140,380
+** Processing line: ~  3080,500,3140,380~
 - Inside source: true
 *** True Line Result
-        circle.angle -= 2
-** Processing line: ~      elsif inputs.keyboard.left || inputs.keyboard.d~
+  3080,500,3140,380
+** Processing line: ~  3080,620,3080,500~
 - Inside source: true
 *** True Line Result
-      elsif inputs.keyboard.left || inputs.keyboard.d
-** Processing line: ~        circle.angle += 2~
+  3080,620,3080,500
+** Processing line: ~  3080,620,3080,740~
 - Inside source: true
 *** True Line Result
-        circle.angle += 2
-** Processing line: ~      end~
+  3080,620,3080,740
+** Processing line: ~  3080,740,3080,840~
 - Inside source: true
 *** True Line Result
-      end
-** Processing line: ~    end~
+  3080,740,3080,840
+** Processing line: ~  3080,960,3080,840~
 - Inside source: true
 *** True Line Result
-    end
-** Processing line: ~~
+  3080,960,3080,840
+** Processing line: ~  3080,1080,3080,960~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~    def input~
+  3080,1080,3080,960
+** Processing line: ~  3080,1080,3080,1200~
 - Inside source: true
 *** True Line Result
-    def input
-** Processing line: ~      input_god_mode~
+  3080,1080,3080,1200
+** Processing line: ~  3080,1200,3080,1340~
 - Inside source: true
 *** True Line Result
-      input_god_mode
-** Processing line: ~      input_game~
+  3080,1200,3080,1340
+** Processing line: ~  3080,1340,3080,1460~
 - Inside source: true
 *** True Line Result
-      input_game
-** Processing line: ~    end~
+  3080,1340,3080,1460
+** Processing line: ~  3080,1580,3080,1460~
 - Inside source: true
 *** True Line Result
-    end
-** Processing line: ~~
+  3080,1580,3080,1460
+** Processing line: ~  3080,1700,3080,1580~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~    def calc_camera~
+  3080,1700,3080,1580
+** Processing line: ~  3080,1700,3080,1760~
 - Inside source: true
 *** True Line Result
-    def calc_camera
-** Processing line: ~      state.camera.target_x = 640 - circle.x~
+  3080,1700,3080,1760
+** Processing line: ~  3080,1760,3200,1760~
 - Inside source: true
 *** True Line Result
-      state.camera.target_x = 640 - circle.x
-** Processing line: ~      state.camera.target_y = 360 - circle.y~
+  3080,1760,3200,1760
+** Processing line: ~  3200,1760,3320,1760~
 - Inside source: true
 *** True Line Result
-      state.camera.target_y = 360 - circle.y
-** Processing line: ~      xdiff = state.camera.target_x - state.camera.x~
+  3200,1760,3320,1760
+** Processing line: ~  3320,1760,3520,1760~
 - Inside source: true
 *** True Line Result
-      xdiff = state.camera.target_x - state.camera.x
-** Processing line: ~      ydiff = state.camera.target_y - state.camera.y~
+  3320,1760,3520,1760
+** Processing line: ~  3520,1760,3680,1740~
 - Inside source: true
 *** True Line Result
-      ydiff = state.camera.target_y - state.camera.y
-** Processing line: ~      state.camera.x += xdiff * camera.follow_speed~
+  3520,1760,3680,1740
+** Processing line: ~  3680,1740,3780,1700~
 - Inside source: true
 *** True Line Result
-      state.camera.x += xdiff * camera.follow_speed
-** Processing line: ~      state.camera.y += ydiff * camera.follow_speed~
+  3680,1740,3780,1700
+** Processing line: ~  3780,1700,3840,1620~
 - Inside source: true
 *** True Line Result
-      state.camera.y += ydiff * camera.follow_speed
-** Processing line: ~    end~
+  3780,1700,3840,1620
+** Processing line: ~  3840,1620,3840,1520~
 - Inside source: true
 *** True Line Result
-    end
-** Processing line: ~~
+  3840,1620,3840,1520
+** Processing line: ~  3840,1520,3840,1420~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~    def calc~
+  3840,1520,3840,1420
+** Processing line: ~  3840,1320,3840,1420~
 - Inside source: true
 *** True Line Result
-    def calc
-** Processing line: ~      state.sound_debounce ||= 0~
+  3840,1320,3840,1420
+** Processing line: ~  3840,1120,3840,1320~
 - Inside source: true
 *** True Line Result
-      state.sound_debounce ||= 0
-** Processing line: ~      state.sound_debounce -= 1~
+  3840,1120,3840,1320
+** Processing line: ~  3840,1120,3840,940~
 - Inside source: true
 *** True Line Result
-      state.sound_debounce -= 1
-** Processing line: ~      state.sound_debounce = 0 if state.sound_debounce < 0~
+  3840,1120,3840,940
+** Processing line: ~  3840,940,3840,760~
 - Inside source: true
 *** True Line Result
-      state.sound_debounce = 0 if state.sound_debounce < 0
-** Processing line: ~      if state.god_mode~
+  3840,940,3840,760
+** Processing line: ~  3780,600,3840,760~
 - Inside source: true
 *** True Line Result
-      if state.god_mode
-** Processing line: ~        circle.dy *= 0.1~
+  3780,600,3840,760
+** Processing line: ~  3780,600,3780,440~
 - Inside source: true
 *** True Line Result
-        circle.dy *= 0.1
-** Processing line: ~        circle.dx *= 0.1~
+  3780,600,3780,440
+** Processing line: ~  3780,320,3780,440~
 - Inside source: true
 *** True Line Result
-        circle.dx *= 0.1
-** Processing line: ~      end~
+  3780,320,3780,440
+** Processing line: ~  3780,320,3780,160~
 - Inside source: true
 *** True Line Result
-      end
-** Processing line: ~      calc_camera~
+  3780,320,3780,160
+** Processing line: ~  3780,60,3780,160~
 - Inside source: true
 *** True Line Result
-      calc_camera
-** Processing line: ~      state.whisp_queue ||= []~
+  3780,60,3780,160
+** Processing line: ~  3780,60,4020,60~
 - Inside source: true
 *** True Line Result
-      state.whisp_queue ||= []
-** Processing line: ~      if state.tick_count.mod_zero?(4)~
+  3780,60,4020,60
+** Processing line: ~  4020,60,4260,40~
 - Inside source: true
 *** True Line Result
-      if state.tick_count.mod_zero?(4)
-** Processing line: ~        state.whisp_queue << {~
+  4020,60,4260,40
+** Processing line: ~  4260,40,4500,40~
 - Inside source: true
 *** True Line Result
-        state.whisp_queue << {
-** Processing line: ~          x: -300,~
+  4260,40,4500,40
+** Processing line: ~  4500,40,4740,40~
 - Inside source: true
 *** True Line Result
-          x: -300,
-** Processing line: ~          y: 1400 * rand,~
+  4500,40,4740,40
+** Processing line: ~  4740,40,4840,20~
 - Inside source: true
 *** True Line Result
-          y: 1400 * rand,
-** Processing line: ~          speed: 2.randomize(:ratio) + 3,~
+  4740,40,4840,20
+** Processing line: ~  4840,20,4880,80~
 - Inside source: true
 *** True Line Result
-          speed: 2.randomize(:ratio) + 3,
-** Processing line: ~          w: 20,~
+  4840,20,4880,80
+** Processing line: ~  4880,80,5080,40~
 - Inside source: true
 *** True Line Result
-          w: 20,
-** Processing line: ~          h: 20, path: 'sprites/whisp.png',~
+  4880,80,5080,40
+** Processing line: ~  5080,40,5280,20~
 - Inside source: true
 *** True Line Result
-          h: 20, path: 'sprites/whisp.png',
-** Processing line: ~          a: 0,~
+  5080,40,5280,20
+** Processing line: ~  5280,20,5500,0~
 - Inside source: true
 *** True Line Result
-          a: 0,
-** Processing line: ~          created_at: state.tick_count,~
+  5280,20,5500,0
+** Processing line: ~  5500,0,5720,0~
 - Inside source: true
 *** True Line Result
-          created_at: state.tick_count,
-** Processing line: ~          angle: 0,~
+  5500,0,5720,0
+** Processing line: ~  5720,0,5940,60~
 - Inside source: true
 *** True Line Result
-          angle: 0,
-** Processing line: ~          r: 100,~
+  5720,0,5940,60
+** Processing line: ~  5940,60,6240,60~
 - Inside source: true
 *** True Line Result
-          r: 100,
-** Processing line: ~          g: 128 + 128 * rand,~
+  5940,60,6240,60
+** Processing line: ~  6240,60,6540,20~
 - Inside source: true
 *** True Line Result
-          g: 128 + 128 * rand,
-** Processing line: ~          b: 128 + 128 * rand~
+  6240,60,6540,20
+** Processing line: ~  6540,20,6840,20~
 - Inside source: true
 *** True Line Result
-          b: 128 + 128 * rand
-** Processing line: ~        }~
+  6540,20,6840,20
+** Processing line: ~  6840,20,7040,0~
 - Inside source: true
 *** True Line Result
-        }
-** Processing line: ~      end~
+  6840,20,7040,0
+** Processing line: ~  7040,0,7140,0~
 - Inside source: true
 *** True Line Result
-      end
-** Processing line: ~~
+  7040,0,7140,0
+** Processing line: ~  7140,0,7400,20~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~      state.whisp_queue.each do |w|~
+  7140,0,7400,20
+** Processing line: ~  7400,20,7680,0~
 - Inside source: true
 *** True Line Result
-      state.whisp_queue.each do |w|
-** Processing line: ~        w.x += w[:speed] * 2~
+  7400,20,7680,0
+** Processing line: ~  7680,0,7940,0~
 - Inside source: true
 *** True Line Result
-        w.x += w[:speed] * 2
-** Processing line: ~        w.x -= circle.dx * 0.3~
+  7680,0,7940,0
+** Processing line: ~  7940,0,8200,-20~
 - Inside source: true
 *** True Line Result
-        w.x -= circle.dx * 0.3
-** Processing line: ~        w.y -= w[:speed]~
+  7940,0,8200,-20
+** Processing line: ~  8200,-20,8360,20~
 - Inside source: true
 *** True Line Result
-        w.y -= w[:speed]
-** Processing line: ~        w.y -= circle.dy * 0.3~
+  8200,-20,8360,20
+** Processing line: ~  8360,20,8560,-40~
 - Inside source: true
 *** True Line Result
-        w.y -= circle.dy * 0.3
-** Processing line: ~        w.angle += w[:speed]~
+  8360,20,8560,-40
+** Processing line: ~  8560,-40,8760,0~
 - Inside source: true
 *** True Line Result
-        w.angle += w[:speed]
-** Processing line: ~        w.a = w[:created_at].ease(30) * 255~
+  8560,-40,8760,0
+** Processing line: ~  8760,0,8880,40~
 - Inside source: true
 *** True Line Result
-        w.a = w[:created_at].ease(30) * 255
-** Processing line: ~      end~
+  8760,0,8880,40
+** Processing line: ~  8880,120,8880,40~
 - Inside source: true
 *** True Line Result
-      end
-** Processing line: ~~
+  8880,120,8880,40
+** Processing line: ~  8840,220,8840,120~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~      state.whisp_queue = state.whisp_queue.reject { |w| w[:x] > 1280 }~
+  8840,220,8840,120
+** Processing line: ~  8620,240,8840,220~
 - Inside source: true
 *** True Line Result
-      state.whisp_queue = state.whisp_queue.reject { |w| w[:x] > 1280 }
-** Processing line: ~~
+  8620,240,8840,220
+** Processing line: ~  8420,260,8620,240~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~      if state.tick_count.mod_zero?(2) && (circle.dx != 0 || circle.dy != 0)~
+  8420,260,8620,240
+** Processing line: ~  8200,280,8420,260~
 - Inside source: true
 *** True Line Result
-      if state.tick_count.mod_zero?(2) && (circle.dx != 0 || circle.dy != 0)
-** Processing line: ~        circle.after_images << {~
+  8200,280,8420,260
+** Processing line: ~  7940,280,8200,280~
 - Inside source: true
 *** True Line Result
-        circle.after_images << {
-** Processing line: ~          x: circle.x,~
+  7940,280,8200,280
+** Processing line: ~  7760,240,7940,280~
 - Inside source: true
 *** True Line Result
-          x: circle.x,
-** Processing line: ~          y: circle.y,~
+  7760,240,7940,280
+** Processing line: ~  7560,220,7760,240~
 - Inside source: true
 *** True Line Result
-          y: circle.y,
-** Processing line: ~          w: circle.radius,~
+  7560,220,7760,240
+** Processing line: ~  7360,280,7560,220~
 - Inside source: true
 *** True Line Result
-          w: circle.radius,
-** Processing line: ~          h: circle.radius,~
+  7360,280,7560,220
+** Processing line: ~  7140,260,7360,280~
 - Inside source: true
 *** True Line Result
-          h: circle.radius,
-** Processing line: ~          a: 255,~
+  7140,260,7360,280
+** Processing line: ~  6940,240,7140,260~
 - Inside source: true
 *** True Line Result
-          a: 255,
-** Processing line: ~          created_at: state.tick_count~
+  6940,240,7140,260
+** Processing line: ~  6720,220,6940,240~
 - Inside source: true
 *** True Line Result
-          created_at: state.tick_count
-** Processing line: ~        }~
+  6720,220,6940,240
+** Processing line: ~  6480,220,6720,220~
 - Inside source: true
 *** True Line Result
-        }
-** Processing line: ~      end~
+  6480,220,6720,220
+** Processing line: ~  6360,300,6480,220~
 - Inside source: true
 *** True Line Result
-      end
-** Processing line: ~~
+  6360,300,6480,220
+** Processing line: ~  6240,300,6360,300~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~      circle.after_images.each do |ai|~
+  6240,300,6360,300
+** Processing line: ~  6200,500,6240,300~
 - Inside source: true
 *** True Line Result
-      circle.after_images.each do |ai|
-** Processing line: ~        ai.a = ai[:created_at].ease(10, :flip) * 255~
+  6200,500,6240,300
+** Processing line: ~  6200,500,6360,540~
 - Inside source: true
 *** True Line Result
-        ai.a = ai[:created_at].ease(10, :flip) * 255
-** Processing line: ~      end~
+  6200,500,6360,540
+** Processing line: ~  6360,540,6540,520~
 - Inside source: true
 *** True Line Result
-      end
-** Processing line: ~~
+  6360,540,6540,520
+** Processing line: ~  6540,520,6720,480~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~      circle.after_images = circle.after_images.reject { |ai| ai[:created_at].elapsed_time > 10 }~
+  6540,520,6720,480
+** Processing line: ~  6720,480,6880,460~
 - Inside source: true
 *** True Line Result
-      circle.after_images = circle.after_images.reject { |ai| ai[:created_at].elapsed_time > 10 }
-** Processing line: ~      calc_physics~
+  6720,480,6880,460
+** Processing line: ~  6880,460,7080,500~
 - Inside source: true
 *** True Line Result
-      calc_physics
-** Processing line: ~    end~
+  6880,460,7080,500
+** Processing line: ~  7080,500,7320,500~
 - Inside source: true
 *** True Line Result
-    end
-** Processing line: ~~
+  7080,500,7320,500
+** Processing line: ~  7320,500,7680,500~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~    def circle~
+  7320,500,7680,500
+** Processing line: ~  7680,620,7680,500~
 - Inside source: true
 *** True Line Result
-    def circle
-** Processing line: ~      state.circle~
+  7680,620,7680,500
+** Processing line: ~  7520,640,7680,620~
 - Inside source: true
 *** True Line Result
-      state.circle
-** Processing line: ~    end~
+  7520,640,7680,620
+** Processing line: ~  7360,640,7520,640~
 - Inside source: true
 *** True Line Result
-    end
-** Processing line: ~~
+  7360,640,7520,640
+** Processing line: ~  7200,640,7360,640~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~    def camera~
+  7200,640,7360,640
+** Processing line: ~  7040,660,7200,640~
 - Inside source: true
 *** True Line Result
-    def camera
-** Processing line: ~      state.camera~
+  7040,660,7200,640
+** Processing line: ~  6880,720,7040,660~
 - Inside source: true
 *** True Line Result
-      state.camera
-** Processing line: ~    end~
+  6880,720,7040,660
+** Processing line: ~  6720,700,6880,720~
 - Inside source: true
 *** True Line Result
-    end
-** Processing line: ~~
+  6720,700,6880,720
+** Processing line: ~  6540,700,6720,700~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~    def terrain~
+  6540,700,6720,700
+** Processing line: ~  6420,760,6540,700~
 - Inside source: true
 *** True Line Result
-    def terrain
-** Processing line: ~      state.terrain~
+  6420,760,6540,700
+** Processing line: ~  6280,740,6420,760~
 - Inside source: true
 *** True Line Result
-      state.terrain
-** Processing line: ~    end~
+  6280,740,6420,760
+** Processing line: ~  6240,760,6280,740~
 - Inside source: true
 *** True Line Result
-    end
-** Processing line: ~~
+  6240,760,6280,740
+** Processing line: ~  6200,920,6240,760~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~    def lava~
+  6200,920,6240,760
+** Processing line: ~  6200,920,6360,960~
 - Inside source: true
 *** True Line Result
-    def lava
-** Processing line: ~      state.lava~
+  6200,920,6360,960
+** Processing line: ~  6360,960,6540,960~
 - Inside source: true
 *** True Line Result
-      state.lava
-** Processing line: ~    end~
+  6360,960,6540,960
+** Processing line: ~  6540,960,6720,960~
 - Inside source: true
 *** True Line Result
-    end
-** Processing line: ~  end~
+  6540,960,6720,960
+** Processing line: ~  6720,960,6760,980~
 - Inside source: true
 *** True Line Result
-  end
-** Processing line: ~~
+  6720,960,6760,980
+** Processing line: ~  6760,980,6880,940~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~  # $gtk.reset~
+  6760,980,6880,940
+** Processing line: ~  6880,940,7080,940~
 - Inside source: true
 *** True Line Result
-  # $gtk.reset
-** Processing line: ~~
+  6880,940,7080,940
+** Processing line: ~  7080,940,7280,940~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~  def tick args~
+  7080,940,7280,940
+** Processing line: ~  7280,940,7520,920~
 - Inside source: true
 *** True Line Result
-  def tick args
-** Processing line: ~    args.outputs.background_color = [0, 0, 0]~
+  7280,940,7520,920
+** Processing line: ~  7520,920,7760,900~
 - Inside source: true
 *** True Line Result
-    args.outputs.background_color = [0, 0, 0]
-** Processing line: ~    if args.inputs.keyboard.r~
+  7520,920,7760,900
+** Processing line: ~  7760,900,7980,860~
 - Inside source: true
 *** True Line Result
-    if args.inputs.keyboard.r
-** Processing line: ~      args.gtk.reset~
+  7760,900,7980,860
+** Processing line: ~  7980,860,8100,880~
 - Inside source: true
 *** True Line Result
-      args.gtk.reset
-** Processing line: ~      return~
+  7980,860,8100,880
+** Processing line: ~  8100,880,8280,900~
 - Inside source: true
 *** True Line Result
-      return
-** Processing line: ~    end~
+  8100,880,8280,900
+** Processing line: ~  8280,900,8500,820~
 - Inside source: true
 *** True Line Result
-    end
-** Processing line: ~    # uncomment the line below to slow down the game so you~
+  8280,900,8500,820
+** Processing line: ~  8500,820,8700,820~
 - Inside source: true
 *** True Line Result
-    # uncomment the line below to slow down the game so you
-** Processing line: ~    # can see each tick as it passes~
+  8500,820,8700,820
+** Processing line: ~  8700,820,8760,840~
 - Inside source: true
 *** True Line Result
-    # can see each tick as it passes
-** Processing line: ~    # args.gtk.slowmo! 30~
+  8700,820,8760,840
+** Processing line: ~  8760,960,8760,840~
 - Inside source: true
 *** True Line Result
-    # args.gtk.slowmo! 30
-** Processing line: ~    $game ||= FallingCircle.new~
+  8760,960,8760,840
+** Processing line: ~  8700,1040,8760,960~
 - Inside source: true
 *** True Line Result
-    $game ||= FallingCircle.new
-** Processing line: ~    $game.args = args~
+  8700,1040,8760,960
+** Processing line: ~  8560,1060,8700,1040~
 - Inside source: true
 *** True Line Result
-    $game.args = args
-** Processing line: ~    $game.tick~
+  8560,1060,8700,1040
+** Processing line: ~  8460,1080,8560,1060~
 - Inside source: true
 *** True Line Result
-    $game.tick
-** Processing line: ~  end~
+  8460,1080,8560,1060
+** Processing line: ~  8360,1040,8460,1080~
 - Inside source: true
 *** True Line Result
-  end
-** Processing line: ~~
+  8360,1040,8460,1080
+** Processing line: ~  8280,1080,8360,1040~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~  def reset~
+  8280,1080,8360,1040
+** Processing line: ~  8160,1120,8280,1080~
 - Inside source: true
 *** True Line Result
-  def reset
-** Processing line: ~    $game = nil~
+  8160,1120,8280,1080
+** Processing line: ~  8040,1120,8160,1120~
 - Inside source: true
 *** True Line Result
-    $game = nil
-** Processing line: ~  end~
+  8040,1120,8160,1120
+** Processing line: ~  7940,1100,8040,1120~
 - Inside source: true
 *** True Line Result
-  end
-** Processing line: ~~
+  7940,1100,8040,1120
+** Processing line: ~  7800,1120,7940,1100~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~#+end_src~
-- Line was identified as the end of a code block.
+  7800,1120,7940,1100
+** Processing line: ~  7680,1120,7800,1120~
+- Inside source: true
 *** True Line Result
-#+end_src
-** Processing line: ~~
-- End of paragraph detected.
+  7680,1120,7800,1120
+** Processing line: ~  7520,1100,7680,1120~
+- Inside source: true
 *** True Line Result
-
-** Processing line: ~*** Platformer - The Little Probe - Data - level.txt~
-- Header detected.
+  7520,1100,7680,1120
+** Processing line: ~  7360,1100,7520,1100~
+- Inside source: true
 *** True Line Result
-
+  7360,1100,7520,1100
+** Processing line: ~  7200,1120,7360,1100~
+- Inside source: true
 *** True Line Result
-*** Platformer - The Little Probe - Data - level.txt
-** Processing line: ~#+begin_src ruby~
-- Line was identified as the beginning of a code block.
+  7200,1120,7360,1100
+** Processing line: ~  7040,1180,7200,1120~
+- Inside source: true
 *** True Line Result
-
+  7040,1180,7200,1120
+** Processing line: ~  6880,1160,7040,1180~
+- Inside source: true
 *** True Line Result
-#+begin_src ruby
-** Processing line: ~  # ./samples/99_genre_platformer/the_little_probe/data/level.txt~
+  6880,1160,7040,1180
+** Processing line: ~  6720,1160,6880,1160~
 - Inside source: true
 *** True Line Result
-  # ./samples/99_genre_platformer/the_little_probe/data/level.txt
-** Processing line: ~  640,8840,1180,8840~
+  6720,1160,6880,1160
+** Processing line: ~  6540,1160,6720,1160~
 - Inside source: true
 *** True Line Result
-  640,8840,1180,8840
-** Processing line: ~  -60,10220,0,9960~
+  6540,1160,6720,1160
+** Processing line: ~  6360,1160,6540,1160~
 - Inside source: true
 *** True Line Result
-  -60,10220,0,9960
-** Processing line: ~  -60,10220,0,10500~
+  6360,1160,6540,1160
+** Processing line: ~  6200,1160,6360,1160~
 - Inside source: true
 *** True Line Result
-  -60,10220,0,10500
-** Processing line: ~  0,10500,0,10780~
+  6200,1160,6360,1160
+** Processing line: ~  6040,1220,6200,1160~
 - Inside source: true
 *** True Line Result
-  0,10500,0,10780
-** Processing line: ~  0,10780,40,10900~
+  6040,1220,6200,1160
+** Processing line: ~  6040,1220,6040,1400~
 - Inside source: true
 *** True Line Result
-  0,10780,40,10900
-** Processing line: ~  500,10920,760,10960~
+  6040,1220,6040,1400
+** Processing line: ~  6040,1400,6200,1440~
 - Inside source: true
 *** True Line Result
-  500,10920,760,10960
-** Processing line: ~  300,10560,820,10600~
+  6040,1400,6200,1440
+** Processing line: ~  6200,1440,6320,1440~
 - Inside source: true
 *** True Line Result
-  300,10560,820,10600
-** Processing line: ~  420,10320,700,10300~
+  6200,1440,6320,1440
+** Processing line: ~  6320,1440,6440,1440~
 - Inside source: true
 *** True Line Result
-  420,10320,700,10300
-** Processing line: ~  820,10600,1500,10600~
+  6320,1440,6440,1440
+** Processing line: ~  6600,1440,6760,1440~
 - Inside source: true
 *** True Line Result
-  820,10600,1500,10600
-** Processing line: ~  1500,10600,1940,10600~
+  6600,1440,6760,1440
+** Processing line: ~  6760,1440,6940,1420~
 - Inside source: true
 *** True Line Result
-  1500,10600,1940,10600
-** Processing line: ~  1940,10600,2380,10580~
+  6760,1440,6940,1420
+** Processing line: ~  6440,1440,6600,1440~
 - Inside source: true
 *** True Line Result
-  1940,10600,2380,10580
-** Processing line: ~  2380,10580,2800,10620~
+  6440,1440,6600,1440
+** Processing line: ~  6940,1420,7280,1400~
 - Inside source: true
 *** True Line Result
-  2380,10580,2800,10620
-** Processing line: ~  2240,11080,2480,11020~
+  6940,1420,7280,1400
+** Processing line: ~  7280,1400,7560,1400~
 - Inside source: true
 *** True Line Result
-  2240,11080,2480,11020
-** Processing line: ~  2000,11120,2240,11080~
+  7280,1400,7560,1400
+** Processing line: ~  7560,1400,7760,1400~
 - Inside source: true
 *** True Line Result
-  2000,11120,2240,11080
-** Processing line: ~  1760,11180,2000,11120~
+  7560,1400,7760,1400
+** Processing line: ~  7760,1400,7940,1360~
 - Inside source: true
 *** True Line Result
-  1760,11180,2000,11120
-** Processing line: ~  1620,11180,1760,11180~
+  7760,1400,7940,1360
+** Processing line: ~  7940,1360,8100,1380~
 - Inside source: true
 *** True Line Result
-  1620,11180,1760,11180
-** Processing line: ~  1500,11220,1620,11180~
+  7940,1360,8100,1380
+** Processing line: ~  8100,1380,8280,1340~
 - Inside source: true
 *** True Line Result
-  1500,11220,1620,11180
-** Processing line: ~  1180,11280,1340,11220~
+  8100,1380,8280,1340
+** Processing line: ~  8280,1340,8460,1320~
 - Inside source: true
 *** True Line Result
-  1180,11280,1340,11220
-** Processing line: ~  1040,11240,1180,11280~
+  8280,1340,8460,1320
+** Processing line: ~  8660,1300,8760,1360~
 - Inside source: true
 *** True Line Result
-  1040,11240,1180,11280
-** Processing line: ~  840,11280,1040,11240~
+  8660,1300,8760,1360
+** Processing line: ~  8460,1320,8660,1300~
 - Inside source: true
 *** True Line Result
-  840,11280,1040,11240
-** Processing line: ~  640,11280,840,11280~
+  8460,1320,8660,1300
+** Processing line: ~  8760,1360,8800,1500~
 - Inside source: true
 *** True Line Result
-  640,11280,840,11280
-** Processing line: ~  500,11220,640,11280~
+  8760,1360,8800,1500
+** Processing line: ~  8800,1660,8800,1500~
 - Inside source: true
 *** True Line Result
-  500,11220,640,11280
-** Processing line: ~  420,11140,500,11220~
+  8800,1660,8800,1500
+** Processing line: ~  8800,1660,8800,1820~
 - Inside source: true
 *** True Line Result
-  420,11140,500,11220
-** Processing line: ~  240,11100,420,11140~
+  8800,1660,8800,1820
+** Processing line: ~  8700,1840,8800,1820~
 - Inside source: true
 *** True Line Result
-  240,11100,420,11140
-** Processing line: ~  100,11120,240,11100~
+  8700,1840,8800,1820
+** Processing line: ~  8620,1860,8700,1840~
 - Inside source: true
 *** True Line Result
-  100,11120,240,11100
-** Processing line: ~  0,11180,100,11120~
+  8620,1860,8700,1840
+** Processing line: ~  8560,1800,8620,1860~
 - Inside source: true
 *** True Line Result
-  0,11180,100,11120
-** Processing line: ~  -160,11220,0,11180~
+  8560,1800,8620,1860
+** Processing line: ~  8560,1800,8620,1680~
 - Inside source: true
 *** True Line Result
-  -160,11220,0,11180
-** Processing line: ~  -260,11240,-160,11220~
+  8560,1800,8620,1680
+** Processing line: ~  8500,1640,8620,1680~
 - Inside source: true
 *** True Line Result
-  -260,11240,-160,11220
-** Processing line: ~  1340,11220,1500,11220~
+  8500,1640,8620,1680
+** Processing line: ~  8420,1680,8500,1640~
 - Inside source: true
 *** True Line Result
-  1340,11220,1500,11220
-** Processing line: ~  960,13300,1280,13060~
+  8420,1680,8500,1640
+** Processing line: ~  8280,1680,8420,1680~
 - Inside source: true
 *** True Line Result
-  960,13300,1280,13060
-** Processing line: ~  1280,13060,1540,12860~
+  8280,1680,8420,1680
+** Processing line: ~  8160,1680,8280,1680~
 - Inside source: true
 *** True Line Result
-  1280,13060,1540,12860
-** Processing line: ~  1540,12860,1820,12700~
+  8160,1680,8280,1680
+** Processing line: ~  7900,1680,8160,1680~
 - Inside source: true
 *** True Line Result
-  1540,12860,1820,12700
-** Processing line: ~  1820,12700,2080,12520~
+  7900,1680,8160,1680
+** Processing line: ~  7680,1680,7900,1680~
 - Inside source: true
 *** True Line Result
-  1820,12700,2080,12520
-** Processing line: ~  2080,12520,2240,12400~
+  7680,1680,7900,1680
+** Processing line: ~  7400,1660,7680,1680~
 - Inside source: true
 *** True Line Result
-  2080,12520,2240,12400
-** Processing line: ~  2240,12400,2240,12240~
+  7400,1660,7680,1680
+** Processing line: ~  7140,1680,7400,1660~
 - Inside source: true
 *** True Line Result
-  2240,12400,2240,12240
-** Processing line: ~  2240,12240,2400,12080~
+  7140,1680,7400,1660
+** Processing line: ~  6880,1640,7140,1680~
 - Inside source: true
 *** True Line Result
-  2240,12240,2400,12080
-** Processing line: ~  2400,12080,2560,11920~
+  6880,1640,7140,1680
+** Processing line: ~  6040,1820,6320,1780~
 - Inside source: true
 *** True Line Result
-  2400,12080,2560,11920
-** Processing line: ~  2560,11920,2640,11740~
+  6040,1820,6320,1780
+** Processing line: ~  5900,1840,6040,1820~
 - Inside source: true
 *** True Line Result
-  2560,11920,2640,11740
-** Processing line: ~  2640,11740,2740,11580~
+  5900,1840,6040,1820
+** Processing line: ~  6640,1700,6880,1640~
 - Inside source: true
 *** True Line Result
-  2640,11740,2740,11580
-** Processing line: ~  2740,11580,2800,11400~
+  6640,1700,6880,1640
+** Processing line: ~  6320,1780,6640,1700~
 - Inside source: true
 *** True Line Result
-  2740,11580,2800,11400
-** Processing line: ~  2800,11400,2800,11240~
+  6320,1780,6640,1700
+** Processing line: ~  5840,2040,5900,1840~
 - Inside source: true
 *** True Line Result
-  2800,11400,2800,11240
-** Processing line: ~  2740,11140,2800,11240~
+  5840,2040,5900,1840
+** Processing line: ~  5840,2040,5840,2220~
 - Inside source: true
 *** True Line Result
-  2740,11140,2800,11240
-** Processing line: ~  2700,11040,2740,11140~
+  5840,2040,5840,2220
+** Processing line: ~  5840,2220,5840,2320~
 - Inside source: true
 *** True Line Result
-  2700,11040,2740,11140
-** Processing line: ~  2700,11040,2740,10960~
+  5840,2220,5840,2320
+** Processing line: ~  5840,2460,5840,2320~
 - Inside source: true
 *** True Line Result
-  2700,11040,2740,10960
-** Processing line: ~  2740,10960,2740,10920~
+  5840,2460,5840,2320
+** Processing line: ~  5840,2560,5840,2460~
 - Inside source: true
 *** True Line Result
-  2740,10960,2740,10920
-** Processing line: ~  2700,10900,2740,10920~
+  5840,2560,5840,2460
+** Processing line: ~  5840,2560,5960,2620~
 - Inside source: true
 *** True Line Result
-  2700,10900,2740,10920
-** Processing line: ~  2380,10900,2700,10900~
+  5840,2560,5960,2620
+** Processing line: ~  5960,2620,6200,2620~
 - Inside source: true
 *** True Line Result
-  2380,10900,2700,10900
-** Processing line: ~  2040,10920,2380,10900~
+  5960,2620,6200,2620
+** Processing line: ~  6200,2620,6380,2600~
 - Inside source: true
 *** True Line Result
-  2040,10920,2380,10900
-** Processing line: ~  1720,10940,2040,10920~
+  6200,2620,6380,2600
+** Processing line: ~  6380,2600,6600,2580~
 - Inside source: true
 *** True Line Result
-  1720,10940,2040,10920
-** Processing line: ~  1380,11000,1720,10940~
+  6380,2600,6600,2580
+** Processing line: ~  6600,2580,6800,2600~
 - Inside source: true
 *** True Line Result
-  1380,11000,1720,10940
-** Processing line: ~  1180,10980,1380,11000~
+  6600,2580,6800,2600
+** Processing line: ~  6800,2600,7040,2580~
 - Inside source: true
 *** True Line Result
-  1180,10980,1380,11000
-** Processing line: ~  900,10980,1180,10980~
+  6800,2600,7040,2580
+** Processing line: ~  7040,2580,7280,2580~
 - Inside source: true
 *** True Line Result
-  900,10980,1180,10980
-** Processing line: ~  760,10960,900,10980~
+  7040,2580,7280,2580
+** Processing line: ~  7280,2580,7480,2560~
 - Inside source: true
 *** True Line Result
-  760,10960,900,10980
-** Processing line: ~  240,10960,500,10920~
+  7280,2580,7480,2560
+** Processing line: ~  7760,2540,7980,2520~
 - Inside source: true
 *** True Line Result
-  240,10960,500,10920
-** Processing line: ~  40,10900,240,10960~
+  7760,2540,7980,2520
+** Processing line: ~  7980,2520,8160,2500~
 - Inside source: true
 *** True Line Result
-  40,10900,240,10960
-** Processing line: ~  0,9700,0,9960~
+  7980,2520,8160,2500
+** Processing line: ~  7480,2560,7760,2540~
 - Inside source: true
 *** True Line Result
-  0,9700,0,9960
-** Processing line: ~  -60,9500,0,9700~
+  7480,2560,7760,2540
+** Processing line: ~  8160,2500,8160,2420~
 - Inside source: true
 *** True Line Result
-  -60,9500,0,9700
-** Processing line: ~  -60,9420,-60,9500~
+  8160,2500,8160,2420
+** Processing line: ~  8160,2420,8160,2320~
 - Inside source: true
 *** True Line Result
-  -60,9420,-60,9500
-** Processing line: ~  -60,9420,-60,9340~
+  8160,2420,8160,2320
+** Processing line: ~  8160,2180,8160,2320~
 - Inside source: true
 *** True Line Result
-  -60,9420,-60,9340
-** Processing line: ~  -60,9340,-60,9280~
+  8160,2180,8160,2320
+** Processing line: ~  7980,2160,8160,2180~
 - Inside source: true
 *** True Line Result
-  -60,9340,-60,9280
-** Processing line: ~  -60,9120,-60,9280~
+  7980,2160,8160,2180
+** Processing line: ~  7800,2180,7980,2160~
 - Inside source: true
 *** True Line Result
-  -60,9120,-60,9280
-** Processing line: ~  -60,8940,-60,9120~
+  7800,2180,7980,2160
+** Processing line: ~  7600,2200,7800,2180~
 - Inside source: true
 *** True Line Result
-  -60,8940,-60,9120
-** Processing line: ~  -60,8940,-60,8780~
+  7600,2200,7800,2180
+** Processing line: ~  7400,2200,7600,2200~
 - Inside source: true
 *** True Line Result
-  -60,8940,-60,8780
-** Processing line: ~  -60,8780,0,8700~
+  7400,2200,7600,2200
+** Processing line: ~  6960,2200,7200,2200~
 - Inside source: true
 *** True Line Result
-  -60,8780,0,8700
-** Processing line: ~  0,8700,40,8680~
+  6960,2200,7200,2200
+** Processing line: ~  7200,2200,7400,2200~
 - Inside source: true
 *** True Line Result
-  0,8700,40,8680
-** Processing line: ~  40,8680,240,8700~
+  7200,2200,7400,2200
+** Processing line: ~  6720,2200,6960,2200~
 - Inside source: true
 *** True Line Result
-  40,8680,240,8700
-** Processing line: ~  240,8700,360,8780~
+  6720,2200,6960,2200
+** Processing line: ~  6540,2180,6720,2200~
 - Inside source: true
 *** True Line Result
-  240,8700,360,8780
-** Processing line: ~  360,8780,640,8840~
+  6540,2180,6720,2200
+** Processing line: ~  6320,2200,6540,2180~
 - Inside source: true
 *** True Line Result
-  360,8780,640,8840
-** Processing line: ~  1420,8400,1540,8480~
+  6320,2200,6540,2180
+** Processing line: ~  6240,2160,6320,2200~
 - Inside source: true
 *** True Line Result
-  1420,8400,1540,8480
-** Processing line: ~  1540,8480,1680,8500~
+  6240,2160,6320,2200
+** Processing line: ~  6240,2160,6240,2040~
 - Inside source: true
 *** True Line Result
-  1540,8480,1680,8500
-** Processing line: ~  1680,8500,1940,8460~
+  6240,2160,6240,2040
+** Processing line: ~  6240,2040,6240,1940~
 - Inside source: true
 *** True Line Result
-  1680,8500,1940,8460
-** Processing line: ~  1180,8840,1280,8880~
+  6240,2040,6240,1940
+** Processing line: ~  6240,1940,6440,1940~
 - Inside source: true
 *** True Line Result
-  1180,8840,1280,8880
-** Processing line: ~  1280,8880,1340,8860~
+  6240,1940,6440,1940
+** Processing line: ~  6440,1940,6720,1940~
 - Inside source: true
 *** True Line Result
-  1280,8880,1340,8860
-** Processing line: ~  1340,8860,1720,8860~
+  6440,1940,6720,1940
+** Processing line: ~  6720,1940,6940,1920~
 - Inside source: true
 *** True Line Result
-  1340,8860,1720,8860
-** Processing line: ~  1720,8860,1820,8920~
+  6720,1940,6940,1920
+** Processing line: ~  7520,1920,7760,1920~
 - Inside source: true
 *** True Line Result
-  1720,8860,1820,8920
-** Processing line: ~  1820,8920,1820,9140~
+  7520,1920,7760,1920
+** Processing line: ~  6940,1920,7280,1920~
 - Inside source: true
 *** True Line Result
-  1820,8920,1820,9140
-** Processing line: ~  1820,9140,1820,9280~
+  6940,1920,7280,1920
+** Processing line: ~  7280,1920,7520,1920~
 - Inside source: true
 *** True Line Result
-  1820,9140,1820,9280
-** Processing line: ~  1820,9460,1820,9280~
+  7280,1920,7520,1920
+** Processing line: ~  7760,1920,8100,1900~
 - Inside source: true
 *** True Line Result
-  1820,9460,1820,9280
-** Processing line: ~  1760,9480,1820,9460~
+  7760,1920,8100,1900
+** Processing line: ~  8100,1900,8420,1900~
 - Inside source: true
 *** True Line Result
-  1760,9480,1820,9460
-** Processing line: ~  1640,9480,1760,9480~
+  8100,1900,8420,1900
+** Processing line: ~  8420,1900,8460,1940~
 - Inside source: true
 *** True Line Result
-  1640,9480,1760,9480
-** Processing line: ~  1540,9500,1640,9480~
+  8420,1900,8460,1940
+** Processing line: ~  8460,2120,8460,1940~
 - Inside source: true
 *** True Line Result
-  1540,9500,1640,9480
-** Processing line: ~  1340,9500,1540,9500~
+  8460,2120,8460,1940
+** Processing line: ~  8460,2280,8460,2120~
 - Inside source: true
 *** True Line Result
-  1340,9500,1540,9500
-** Processing line: ~  1100,9500,1340,9500~
+  8460,2280,8460,2120
+** Processing line: ~  8460,2280,8560,2420~
 - Inside source: true
 *** True Line Result
-  1100,9500,1340,9500
-** Processing line: ~  1040,9540,1100,9500~
+  8460,2280,8560,2420
+** Processing line: ~  8560,2420,8660,2380~
 - Inside source: true
 *** True Line Result
-  1040,9540,1100,9500
-** Processing line: ~  960,9540,1040,9540~
+  8560,2420,8660,2380
+** Processing line: ~  8660,2380,8800,2340~
 - Inside source: true
 *** True Line Result
-  960,9540,1040,9540
-** Processing line: ~  300,9420,360,9460~
+  8660,2380,8800,2340
+** Processing line: ~  8800,2340,8840,2400~
 - Inside source: true
 *** True Line Result
-  300,9420,360,9460
-** Processing line: ~  240,9440,300,9420~
+  8800,2340,8840,2400
+** Processing line: ~  8840,2520,8840,2400~
 - Inside source: true
 *** True Line Result
-  240,9440,300,9420
-** Processing line: ~  180,9600,240,9440~
+  8840,2520,8840,2400
+** Processing line: ~  8800,2620,8840,2520~
 - Inside source: true
 *** True Line Result
-  180,9600,240,9440
-** Processing line: ~  120,9660,180,9600~
+  8800,2620,8840,2520
+** Processing line: ~  8800,2740,8800,2620~
 - Inside source: true
 *** True Line Result
-  120,9660,180,9600
-** Processing line: ~  100,9820,120,9660~
+  8800,2740,8800,2620
+** Processing line: ~  8800,2860,8800,2740~
 - Inside source: true
 *** True Line Result
-  100,9820,120,9660
-** Processing line: ~  100,9820,120,9860~
+  8800,2860,8800,2740
+** Processing line: ~  8800,2940,8800,2860~
 - Inside source: true
 *** True Line Result
-  100,9820,120,9860
-** Processing line: ~  120,9860,140,9900~
+  8800,2940,8800,2860
+** Processing line: ~  8760,2980,8800,2940~
 - Inside source: true
 *** True Line Result
-  120,9860,140,9900
-** Processing line: ~  140,9900,140,10000~
+  8760,2980,8800,2940
+** Processing line: ~  8660,2980,8760,2980~
 - Inside source: true
 *** True Line Result
-  140,9900,140,10000
-** Processing line: ~  140,10440,180,10540~
+  8660,2980,8760,2980
+** Processing line: ~  8620,2960,8660,2980~
 - Inside source: true
 *** True Line Result
-  140,10440,180,10540
-** Processing line: ~  100,10080,140,10000~
+  8620,2960,8660,2980
+** Processing line: ~  8560,2880,8620,2960~
 - Inside source: true
 *** True Line Result
-  100,10080,140,10000
-** Processing line: ~  100,10080,140,10100~
+  8560,2880,8620,2960
+** Processing line: ~  8560,2880,8560,2780~
 - Inside source: true
 *** True Line Result
-  100,10080,140,10100
-** Processing line: ~  140,10100,140,10440~
+  8560,2880,8560,2780
+** Processing line: ~  8500,2740,8560,2780~
 - Inside source: true
 *** True Line Result
-  140,10100,140,10440
-** Processing line: ~  180,10540,300,10560~
+  8500,2740,8560,2780
+** Processing line: ~  8420,2760,8500,2740~
 - Inside source: true
 *** True Line Result
-  180,10540,300,10560
-** Processing line: ~  2140,9560,2140,9640~
+  8420,2760,8500,2740
+** Processing line: ~  8420,2840,8420,2760~
 - Inside source: true
 *** True Line Result
-  2140,9560,2140,9640
-** Processing line: ~  2140,9720,2140,9640~
+  8420,2840,8420,2760
+** Processing line: ~  8420,2840,8420,2940~
 - Inside source: true
 *** True Line Result
-  2140,9720,2140,9640
-** Processing line: ~  1880,9780,2140,9720~
+  8420,2840,8420,2940
+** Processing line: ~  8420,3040,8420,2940~
 - Inside source: true
 *** True Line Result
-  1880,9780,2140,9720
-** Processing line: ~  1720,9780,1880,9780~
+  8420,3040,8420,2940
+** Processing line: ~  8420,3160,8420,3040~
 - Inside source: true
 *** True Line Result
-  1720,9780,1880,9780
-** Processing line: ~  1620,9740,1720,9780~
+  8420,3160,8420,3040
+** Processing line: ~  8420,3280,8420,3380~
 - Inside source: true
 *** True Line Result
-  1620,9740,1720,9780
-** Processing line: ~  1500,9780,1620,9740~
+  8420,3280,8420,3380
+** Processing line: ~  8420,3280,8420,3160~
 - Inside source: true
 *** True Line Result
-  1500,9780,1620,9740
-** Processing line: ~  1380,9780,1500,9780~
+  8420,3280,8420,3160
+** Processing line: ~  8420,3380,8620,3460~
 - Inside source: true
 *** True Line Result
-  1380,9780,1500,9780
-** Processing line: ~  1340,9820,1380,9780~
+  8420,3380,8620,3460
+** Processing line: ~  8620,3460,8760,3460~
 - Inside source: true
 *** True Line Result
-  1340,9820,1380,9780
-** Processing line: ~  1200,9820,1340,9820~
+  8620,3460,8760,3460
+** Processing line: ~  8760,3460,8840,3400~
 - Inside source: true
 *** True Line Result
-  1200,9820,1340,9820
-** Processing line: ~  1100,9780,1200,9820~
+  8760,3460,8840,3400
+** Processing line: ~  8840,3400,8960,3400~
 - Inside source: true
 *** True Line Result
-  1100,9780,1200,9820
-** Processing line: ~  900,9780,1100,9780~
+  8840,3400,8960,3400
+** Processing line: ~  8960,3400,9000,3500~
 - Inside source: true
 *** True Line Result
-  900,9780,1100,9780
-** Processing line: ~  820,9720,900,9780~
+  8960,3400,9000,3500
+** Processing line: ~  9000,3700,9000,3500~
 - Inside source: true
 *** True Line Result
-  820,9720,900,9780
-** Processing line: ~  540,9720,820,9720~
+  9000,3700,9000,3500
+** Processing line: ~  9000,3900,9000,3700~
 - Inside source: true
 *** True Line Result
-  540,9720,820,9720
-** Processing line: ~  360,9840,540,9720~
+  9000,3900,9000,3700
+** Processing line: ~  9000,4080,9000,3900~
 - Inside source: true
 *** True Line Result
-  360,9840,540,9720
-** Processing line: ~  360,9840,360,9960~
+  9000,4080,9000,3900
+** Processing line: ~  9000,4280,9000,4080~
 - Inside source: true
 *** True Line Result
-  360,9840,360,9960
-** Processing line: ~  360,9960,360,10080~
+  9000,4280,9000,4080
+** Processing line: ~  9000,4500,9000,4280~
 - Inside source: true
 *** True Line Result
-  360,9960,360,10080
-** Processing line: ~  360,10140,360,10080~
+  9000,4500,9000,4280
+** Processing line: ~  9000,4620,9000,4500~
 - Inside source: true
 *** True Line Result
-  360,10140,360,10080
-** Processing line: ~  360,10140,360,10240~
+  9000,4620,9000,4500
+** Processing line: ~  9000,4780,9000,4620~
 - Inside source: true
 *** True Line Result
-  360,10140,360,10240
-** Processing line: ~  360,10240,420,10320~
+  9000,4780,9000,4620
+** Processing line: ~  9000,4780,9000,4960~
 - Inside source: true
 *** True Line Result
-  360,10240,420,10320
-** Processing line: ~  700,10300,820,10280~
+  9000,4780,9000,4960
+** Processing line: ~  9000,5120,9000,4960~
 - Inside source: true
 *** True Line Result
-  700,10300,820,10280
-** Processing line: ~  820,10280,820,10280~
+  9000,5120,9000,4960
+** Processing line: ~  9000,5120,9000,5300~
 - Inside source: true
 *** True Line Result
-  820,10280,820,10280
-** Processing line: ~  820,10280,900,10320~
+  9000,5120,9000,5300
+** Processing line: ~  8960,5460,9000,5300~
 - Inside source: true
 *** True Line Result
-  820,10280,900,10320
-** Processing line: ~  900,10320,1040,10300~
+  8960,5460,9000,5300
+** Processing line: ~  8920,5620,8960,5460~
 - Inside source: true
 *** True Line Result
-  900,10320,1040,10300
-** Processing line: ~  1040,10300,1200,10320~
+  8920,5620,8960,5460
+** Processing line: ~  8920,5620,8920,5800~
 - Inside source: true
 *** True Line Result
-  1040,10300,1200,10320
-** Processing line: ~  1200,10320,1380,10280~
+  8920,5620,8920,5800
+** Processing line: ~  8920,5800,8920,5960~
 - Inside source: true
 *** True Line Result
-  1200,10320,1380,10280
-** Processing line: ~  1380,10280,1500,10300~
+  8920,5800,8920,5960
+** Processing line: ~  8920,5960,8920,6120~
 - Inside source: true
 *** True Line Result
-  1380,10280,1500,10300
-** Processing line: ~  1500,10300,1760,10300~
+  8920,5960,8920,6120
+** Processing line: ~  8920,6120,8960,6300~
 - Inside source: true
 *** True Line Result
-  1500,10300,1760,10300
-** Processing line: ~  2800,10620,2840,10600~
+  8920,6120,8960,6300
+** Processing line: ~  8960,6300,8960,6480~
 - Inside source: true
 *** True Line Result
-  2800,10620,2840,10600
-** Processing line: ~  2840,10600,2900,10600~
+  8960,6300,8960,6480
+** Processing line: ~  8960,6660,8960,6480~
 - Inside source: true
 *** True Line Result
-  2840,10600,2900,10600
-** Processing line: ~  2900,10600,3000,10620~
+  8960,6660,8960,6480
+** Processing line: ~  8960,6860,8960,6660~
 - Inside source: true
 *** True Line Result
-  2900,10600,3000,10620
-** Processing line: ~  3000,10620,3080,10620~
+  8960,6860,8960,6660
+** Processing line: ~  8960,7040,8960,6860~
 - Inside source: true
 *** True Line Result
-  3000,10620,3080,10620
-** Processing line: ~  3080,10620,3140,10600~
+  8960,7040,8960,6860
+** Processing line: ~  8920,7420,8920,7220~
 - Inside source: true
 *** True Line Result
-  3080,10620,3140,10600
-** Processing line: ~  3140,10540,3140,10600~
+  8920,7420,8920,7220
+** Processing line: ~  8920,7420,8960,7620~
 - Inside source: true
 *** True Line Result
-  3140,10540,3140,10600
-** Processing line: ~  3140,10540,3140,10460~
+  8920,7420,8960,7620
+** Processing line: ~  8960,7620,8960,7800~
 - Inside source: true
 *** True Line Result
-  3140,10540,3140,10460
-** Processing line: ~  3140,10460,3140,10360~
+  8960,7620,8960,7800
+** Processing line: ~  8960,7800,8960,8000~
 - Inside source: true
 *** True Line Result
-  3140,10460,3140,10360
-** Processing line: ~  3140,10360,3140,10260~
+  8960,7800,8960,8000
+** Processing line: ~  8960,8000,8960,8180~
 - Inside source: true
 *** True Line Result
-  3140,10360,3140,10260
-** Processing line: ~  3140,10260,3140,10140~
+  8960,8000,8960,8180
+** Processing line: ~  8960,8180,8960,8380~
 - Inside source: true
 *** True Line Result
-  3140,10260,3140,10140
-** Processing line: ~  3140,10140,3140,10000~
+  8960,8180,8960,8380
+** Processing line: ~  8960,8580,8960,8380~
 - Inside source: true
 *** True Line Result
-  3140,10140,3140,10000
-** Processing line: ~  3140,10000,3140,9860~
+  8960,8580,8960,8380
+** Processing line: ~  8920,8800,8960,8580~
 - Inside source: true
 *** True Line Result
-  3140,10000,3140,9860
-** Processing line: ~  3140,9860,3160,9720~
+  8920,8800,8960,8580
+** Processing line: ~  8880,9000,8920,8800~
 - Inside source: true
 *** True Line Result
-  3140,9860,3160,9720
-** Processing line: ~  3160,9720,3160,9580~
+  8880,9000,8920,8800
+** Processing line: ~  8840,9180,8880,9000~
 - Inside source: true
 *** True Line Result
-  3160,9720,3160,9580
-** Processing line: ~  3160,9580,3160,9440~
+  8840,9180,8880,9000
+** Processing line: ~  8800,9220,8840,9180~
 - Inside source: true
 *** True Line Result
-  3160,9580,3160,9440
-** Processing line: ~  3160,9300,3160,9440~
+  8800,9220,8840,9180
+** Processing line: ~  8800,9220,8840,9340~
 - Inside source: true
 *** True Line Result
-  3160,9300,3160,9440
-** Processing line: ~  3160,9300,3160,9140~
+  8800,9220,8840,9340
+** Processing line: ~  8760,9380,8840,9340~
 - Inside source: true
 *** True Line Result
-  3160,9300,3160,9140
-** Processing line: ~  3160,9140,3160,8980~
+  8760,9380,8840,9340
+** Processing line: ~  8560,9340,8760,9380~
 - Inside source: true
 *** True Line Result
-  3160,9140,3160,8980
-** Processing line: ~  3160,8980,3160,8820~
+  8560,9340,8760,9380
+** Processing line: ~  8360,9360,8560,9340~
 - Inside source: true
 *** True Line Result
-  3160,8980,3160,8820
-** Processing line: ~  3160,8820,3160,8680~
+  8360,9360,8560,9340
+** Processing line: ~  8160,9360,8360,9360~
 - Inside source: true
 *** True Line Result
-  3160,8820,3160,8680
-** Processing line: ~  3160,8680,3160,8520~
+  8160,9360,8360,9360
+** Processing line: ~  8040,9340,8160,9360~
 - Inside source: true
 *** True Line Result
-  3160,8680,3160,8520
-** Processing line: ~  1760,10300,1880,10300~
+  8040,9340,8160,9360
+** Processing line: ~  7860,9360,8040,9340~
 - Inside source: true
 *** True Line Result
-  1760,10300,1880,10300
-** Processing line: ~  660,9500,960,9540~
+  7860,9360,8040,9340
+** Processing line: ~  7680,9360,7860,9360~
 - Inside source: true
 *** True Line Result
-  660,9500,960,9540
-** Processing line: ~  640,9460,660,9500~
+  7680,9360,7860,9360
+** Processing line: ~  7520,9360,7680,9360~
 - Inside source: true
 *** True Line Result
-  640,9460,660,9500
-** Processing line: ~  360,9460,640,9460~
+  7520,9360,7680,9360
+** Processing line: ~  7420,9260,7520,9360~
 - Inside source: true
 *** True Line Result
-  360,9460,640,9460
-** Processing line: ~  -480,10760,-440,10880~
+  7420,9260,7520,9360
+** Processing line: ~  7400,9080,7420,9260~
 - Inside source: true
 *** True Line Result
-  -480,10760,-440,10880
-** Processing line: ~  -480,11020,-440,10880~
+  7400,9080,7420,9260
+** Processing line: ~  7400,9080,7420,8860~
 - Inside source: true
 *** True Line Result
-  -480,11020,-440,10880
-** Processing line: ~  -480,11160,-260,11240~
+  7400,9080,7420,8860
+** Processing line: ~  7420,8860,7440,8720~
 - Inside source: true
 *** True Line Result
-  -480,11160,-260,11240
-** Processing line: ~  -480,11020,-480,11160~
+  7420,8860,7440,8720
+** Processing line: ~  7440,8720,7480,8660~
 - Inside source: true
 *** True Line Result
-  -480,11020,-480,11160
-** Processing line: ~  -600,11420,-380,11320~
+  7440,8720,7480,8660
+** Processing line: ~  7480,8660,7520,8540~
 - Inside source: true
 *** True Line Result
-  -600,11420,-380,11320
-** Processing line: ~  -380,11320,-200,11340~
+  7480,8660,7520,8540
+** Processing line: ~  7520,8540,7600,8460~
 - Inside source: true
 *** True Line Result
-  -380,11320,-200,11340
-** Processing line: ~  -200,11340,0,11340~
+  7520,8540,7600,8460
+** Processing line: ~  7600,8460,7800,8480~
 - Inside source: true
 *** True Line Result
-  -200,11340,0,11340
-** Processing line: ~  0,11340,180,11340~
+  7600,8460,7800,8480
+** Processing line: ~  7800,8480,8040,8480~
 - Inside source: true
 *** True Line Result
-  0,11340,180,11340
-** Processing line: ~  960,13420,960,13300~
+  7800,8480,8040,8480
+** Processing line: ~  8040,8480,8280,8480~
 - Inside source: true
 *** True Line Result
-  960,13420,960,13300
-** Processing line: ~  960,13420,960,13520~
+  8040,8480,8280,8480
+** Processing line: ~  8280,8480,8500,8460~
 - Inside source: true
 *** True Line Result
-  960,13420,960,13520
-** Processing line: ~  960,13520,1000,13560~
+  8280,8480,8500,8460
+** Processing line: ~  8500,8460,8620,8440~
 - Inside source: true
 *** True Line Result
-  960,13520,1000,13560
-** Processing line: ~  1000,13560,1040,13540~
+  8500,8460,8620,8440
+** Processing line: ~  8620,8440,8660,8340~
 - Inside source: true
 *** True Line Result
-  1000,13560,1040,13540
-** Processing line: ~  1040,13540,1200,13440~
+  8620,8440,8660,8340
+** Processing line: ~  8660,8340,8660,8220~
 - Inside source: true
 *** True Line Result
-  1040,13540,1200,13440
-** Processing line: ~  1200,13440,1380,13380~
+  8660,8340,8660,8220
+** Processing line: ~  8660,8220,8700,8080~
 - Inside source: true
 *** True Line Result
-  1200,13440,1380,13380
-** Processing line: ~  1380,13380,1620,13300~
+  8660,8220,8700,8080
+** Processing line: ~  8700,8080,8700,7920~
 - Inside source: true
 *** True Line Result
-  1380,13380,1620,13300
-** Processing line: ~  1620,13300,1820,13220~
+  8700,8080,8700,7920
+** Processing line: ~  8700,7920,8700,7760~
 - Inside source: true
 *** True Line Result
-  1620,13300,1820,13220
-** Processing line: ~  1820,13220,2000,13200~
+  8700,7920,8700,7760
+** Processing line: ~  8700,7760,8700,7620~
 - Inside source: true
 *** True Line Result
-  1820,13220,2000,13200
-** Processing line: ~  2000,13200,2240,13200~
+  8700,7760,8700,7620
+** Processing line: ~  8700,7480,8700,7620~
 - Inside source: true
 *** True Line Result
-  2000,13200,2240,13200
-** Processing line: ~  2240,13200,2440,13160~
+  8700,7480,8700,7620
+** Processing line: ~  8700,7480,8700,7320~
 - Inside source: true
 *** True Line Result
-  2240,13200,2440,13160
-** Processing line: ~  2440,13160,2640,13040~
+  8700,7480,8700,7320
+** Processing line: ~  8700,7160,8700,7320~
 - Inside source: true
 *** True Line Result
-  2440,13160,2640,13040
-** Processing line: ~  -480,10760,-440,10620~
+  8700,7160,8700,7320
+** Processing line: ~  8920,7220,8960,7040~
 - Inside source: true
 *** True Line Result
-  -480,10760,-440,10620
-** Processing line: ~  -440,10620,-360,10560~
+  8920,7220,8960,7040
+** Processing line: ~  8660,7040,8700,7160~
 - Inside source: true
 *** True Line Result
-  -440,10620,-360,10560
-** Processing line: ~  -380,10460,-360,10560~
+  8660,7040,8700,7160
+** Processing line: ~  8660,7040,8700,6880~
 - Inside source: true
 *** True Line Result
-  -380,10460,-360,10560
-** Processing line: ~  -380,10460,-360,10300~
+  8660,7040,8700,6880
+** Processing line: ~  8660,6700,8700,6880~
 - Inside source: true
 *** True Line Result
-  -380,10460,-360,10300
-** Processing line: ~  -380,10140,-360,10300~
+  8660,6700,8700,6880
+** Processing line: ~  8660,6700,8700,6580~
 - Inside source: true
 *** True Line Result
-  -380,10140,-360,10300
-** Processing line: ~  -380,10140,-380,10040~
+  8660,6700,8700,6580
+** Processing line: ~  8700,6460,8700,6580~
 - Inside source: true
 *** True Line Result
-  -380,10140,-380,10040
-** Processing line: ~  -380,9880,-380,10040~
+  8700,6460,8700,6580
+** Processing line: ~  8700,6460,8700,6320~
 - Inside source: true
 *** True Line Result
-  -380,9880,-380,10040
-** Processing line: ~  -380,9720,-380,9880~
+  8700,6460,8700,6320
+** Processing line: ~  8700,6160,8700,6320~
 - Inside source: true
 *** True Line Result
-  -380,9720,-380,9880
-** Processing line: ~  -380,9720,-380,9540~
+  8700,6160,8700,6320
+** Processing line: ~  8700,6160,8760,6020~
 - Inside source: true
 *** True Line Result
-  -380,9720,-380,9540
-** Processing line: ~  -380,9360,-380,9540~
+  8700,6160,8760,6020
+** Processing line: ~  8760,6020,8760,5860~
 - Inside source: true
 *** True Line Result
-  -380,9360,-380,9540
-** Processing line: ~  -380,9180,-380,9360~
+  8760,6020,8760,5860
+** Processing line: ~  8760,5860,8760,5700~
 - Inside source: true
 *** True Line Result
-  -380,9180,-380,9360
-** Processing line: ~  -380,9180,-380,9000~
+  8760,5860,8760,5700
+** Processing line: ~  8760,5700,8760,5540~
 - Inside source: true
 *** True Line Result
-  -380,9180,-380,9000
-** Processing line: ~  -380,8840,-380,9000~
+  8760,5700,8760,5540
+** Processing line: ~  8760,5540,8760,5360~
 - Inside source: true
 *** True Line Result
-  -380,8840,-380,9000
-** Processing line: ~  -380,8840,-380,8760~
+  8760,5540,8760,5360
+** Processing line: ~  8760,5360,8760,5180~
 - Inside source: true
 *** True Line Result
-  -380,8840,-380,8760
-** Processing line: ~  -380,8760,-380,8620~
+  8760,5360,8760,5180
+** Processing line: ~  8760,5000,8760,5180~
 - Inside source: true
 *** True Line Result
-  -380,8760,-380,8620
-** Processing line: ~  -380,8620,-380,8520~
+  8760,5000,8760,5180
+** Processing line: ~  8700,4820,8760,5000~
 - Inside source: true
 *** True Line Result
-  -380,8620,-380,8520
-** Processing line: ~  -380,8520,-360,8400~
+  8700,4820,8760,5000
+** Processing line: ~  8560,4740,8700,4820~
 - Inside source: true
 *** True Line Result
-  -380,8520,-360,8400
-** Processing line: ~  -360,8400,-100,8400~
+  8560,4740,8700,4820
+** Processing line: ~  8420,4700,8560,4740~
 - Inside source: true
 *** True Line Result
-  -360,8400,-100,8400
-** Processing line: ~  -100,8400,-60,8420~
+  8420,4700,8560,4740
+** Processing line: ~  8280,4700,8420,4700~
 - Inside source: true
 *** True Line Result
-  -100,8400,-60,8420
-** Processing line: ~  -60,8420,240,8440~
+  8280,4700,8420,4700
+** Processing line: ~  8100,4700,8280,4700~
 - Inside source: true
 *** True Line Result
-  -60,8420,240,8440
-** Processing line: ~  240,8440,240,8380~
+  8100,4700,8280,4700
+** Processing line: ~  7980,4700,8100,4700~
 - Inside source: true
 *** True Line Result
-  240,8440,240,8380
-** Processing line: ~  240,8380,500,8440~
+  7980,4700,8100,4700
+** Processing line: ~  7820,4740,7980,4700~
 - Inside source: true
 *** True Line Result
-  240,8380,500,8440
-** Processing line: ~  500,8440,760,8460~
+  7820,4740,7980,4700
+** Processing line: ~  7800,4920,7820,4740~
 - Inside source: true
 *** True Line Result
-  500,8440,760,8460
-** Processing line: ~  760,8460,1000,8400~
+  7800,4920,7820,4740
+** Processing line: ~  7800,4920,7900,4960~
 - Inside source: true
 *** True Line Result
-  760,8460,1000,8400
-** Processing line: ~  1000,8400,1180,8420~
+  7800,4920,7900,4960
+** Processing line: ~  7900,4960,8060,4980~
 - Inside source: true
 *** True Line Result
-  1000,8400,1180,8420
-** Processing line: ~  1180,8420,1420,8400~
+  7900,4960,8060,4980
+** Processing line: ~  8060,4980,8220,5000~
 - Inside source: true
 *** True Line Result
-  1180,8420,1420,8400
-** Processing line: ~  1940,8460,2140,8420~
+  8060,4980,8220,5000
+** Processing line: ~  8220,5000,8420,5040~
 - Inside source: true
 *** True Line Result
-  1940,8460,2140,8420
-** Processing line: ~  2140,8420,2200,8520~
+  8220,5000,8420,5040
+** Processing line: ~  8420,5040,8460,5120~
 - Inside source: true
 *** True Line Result
-  2140,8420,2200,8520
-** Processing line: ~  2200,8680,2200,8520~
+  8420,5040,8460,5120
+** Processing line: ~  8460,5180,8460,5120~
 - Inside source: true
 *** True Line Result
-  2200,8680,2200,8520
-** Processing line: ~  2140,8840,2200,8680~
+  8460,5180,8460,5120
+** Processing line: ~  8360,5200,8460,5180~
 - Inside source: true
 *** True Line Result
-  2140,8840,2200,8680
-** Processing line: ~  2140,8840,2140,9020~
+  8360,5200,8460,5180
+** Processing line: ~  8360,5280,8360,5200~
 - Inside source: true
 *** True Line Result
-  2140,8840,2140,9020
-** Processing line: ~  2140,9100,2140,9020~
+  8360,5280,8360,5200
+** Processing line: ~  8160,5300,8360,5280~
 - Inside source: true
 *** True Line Result
-  2140,9100,2140,9020
-** Processing line: ~  2140,9200,2140,9100~
+  8160,5300,8360,5280
+** Processing line: ~  8040,5260,8160,5300~
 - Inside source: true
 *** True Line Result
-  2140,9200,2140,9100
-** Processing line: ~  2140,9200,2200,9320~
+  8040,5260,8160,5300
+** Processing line: ~  7860,5220,8040,5260~
 - Inside source: true
 *** True Line Result
-  2140,9200,2200,9320
-** Processing line: ~  2200,9320,2200,9440~
+  7860,5220,8040,5260
+** Processing line: ~  7720,5160,7860,5220~
 - Inside source: true
 *** True Line Result
-  2200,9320,2200,9440
-** Processing line: ~  2140,9560,2200,9440~
+  7720,5160,7860,5220
+** Processing line: ~  7640,5120,7720,5160~
 - Inside source: true
 *** True Line Result
-  2140,9560,2200,9440
-** Processing line: ~  1880,10300,2200,10280~
+  7640,5120,7720,5160
+** Processing line: ~  7480,5120,7640,5120~
 - Inside source: true
 *** True Line Result
-  1880,10300,2200,10280
-** Processing line: ~  2200,10280,2480,10260~
+  7480,5120,7640,5120
+** Processing line: ~  7240,5120,7480,5120~
 - Inside source: true
 *** True Line Result
-  2200,10280,2480,10260
-** Processing line: ~  2480,10260,2700,10240~
+  7240,5120,7480,5120
+** Processing line: ~  7000,5120,7240,5120~
 - Inside source: true
 *** True Line Result
-  2480,10260,2700,10240
-** Processing line: ~  2700,10240,2840,10180~
+  7000,5120,7240,5120
+** Processing line: ~  6800,5160,7000,5120~
 - Inside source: true
 *** True Line Result
-  2700,10240,2840,10180
-** Processing line: ~  2840,10180,2900,10060~
+  6800,5160,7000,5120
+** Processing line: ~  6640,5220,6800,5160~
 - Inside source: true
 *** True Line Result
-  2840,10180,2900,10060
-** Processing line: ~  2900,9860,2900,10060~
+  6640,5220,6800,5160
+** Processing line: ~  6600,5360,6640,5220~
 - Inside source: true
 *** True Line Result
-  2900,9860,2900,10060
-** Processing line: ~  2900,9640,2900,9860~
+  6600,5360,6640,5220
+** Processing line: ~  6600,5460,6600,5360~
 - Inside source: true
 *** True Line Result
-  2900,9640,2900,9860
-** Processing line: ~  2900,9640,2900,9500~
+  6600,5460,6600,5360
+** Processing line: ~  6480,5520,6600,5460~
 - Inside source: true
 *** True Line Result
-  2900,9640,2900,9500
-** Processing line: ~  2900,9460,2900,9500~
+  6480,5520,6600,5460
+** Processing line: ~  6240,5540,6480,5520~
 - Inside source: true
 *** True Line Result
-  2900,9460,2900,9500
-** Processing line: ~  2740,9460,2900,9460~
+  6240,5540,6480,5520
+** Processing line: ~  5980,5540,6240,5540~
 - Inside source: true
 *** True Line Result
-  2740,9460,2900,9460
-** Processing line: ~  2700,9460,2740,9460~
+  5980,5540,6240,5540
+** Processing line: ~  5740,5540,5980,5540~
 - Inside source: true
 *** True Line Result
-  2700,9460,2740,9460
-** Processing line: ~  2700,9360,2700,9460~
+  5740,5540,5980,5540
+** Processing line: ~  5500,5520,5740,5540~
 - Inside source: true
 *** True Line Result
-  2700,9360,2700,9460
-** Processing line: ~  2700,9320,2700,9360~
+  5500,5520,5740,5540
+** Processing line: ~  5400,5520,5500,5520~
 - Inside source: true
 *** True Line Result
-  2700,9320,2700,9360
-** Processing line: ~  2600,9320,2700,9320~
+  5400,5520,5500,5520
+** Processing line: ~  5280,5540,5400,5520~
 - Inside source: true
 *** True Line Result
-  2600,9320,2700,9320
-** Processing line: ~  2600,9260,2600,9320~
+  5280,5540,5400,5520
+** Processing line: ~  5080,5540,5280,5540~
 - Inside source: true
 *** True Line Result
-  2600,9260,2600,9320
-** Processing line: ~  2600,9200,2600,9260~
+  5080,5540,5280,5540
+** Processing line: ~  4940,5540,5080,5540~
 - Inside source: true
 *** True Line Result
-  2600,9200,2600,9260
-** Processing line: ~  2480,9120,2600,9200~
+  4940,5540,5080,5540
+** Processing line: ~  4760,5540,4940,5540~
 - Inside source: true
 *** True Line Result
-  2480,9120,2600,9200
-** Processing line: ~  2440,9080,2480,9120~
+  4760,5540,4940,5540
+** Processing line: ~  4600,5540,4760,5540~
 - Inside source: true
 *** True Line Result
-  2440,9080,2480,9120
-** Processing line: ~  2380,9080,2440,9080~
+  4600,5540,4760,5540
+** Processing line: ~  4440,5560,4600,5540~
 - Inside source: true
 *** True Line Result
-  2380,9080,2440,9080
-** Processing line: ~  2320,9060,2380,9080~
+  4440,5560,4600,5540
+** Processing line: ~  4040,5580,4120,5520~
 - Inside source: true
 *** True Line Result
-  2320,9060,2380,9080
-** Processing line: ~  2320,8860,2320,9060~
+  4040,5580,4120,5520
+** Processing line: ~  4260,5540,4440,5560~
 - Inside source: true
 *** True Line Result
-  2320,8860,2320,9060
-** Processing line: ~  2320,8860,2380,8840~
+  4260,5540,4440,5560
+** Processing line: ~  4120,5520,4260,5540~
 - Inside source: true
 *** True Line Result
-  2320,8860,2380,8840
-** Processing line: ~  2380,8840,2480,8860~
+  4120,5520,4260,5540
+** Processing line: ~  4020,5720,4040,5580~
 - Inside source: true
 *** True Line Result
-  2380,8840,2480,8860
-** Processing line: ~  2480,8860,2600,8840~
+  4020,5720,4040,5580
+** Processing line: ~  4020,5840,4020,5720~
 - Inside source: true
 *** True Line Result
-  2480,8860,2600,8840
-** Processing line: ~  2600,8840,2740,8840~
+  4020,5840,4020,5720
+** Processing line: ~  4020,5840,4080,5940~
 - Inside source: true
 *** True Line Result
-  2600,8840,2740,8840
-** Processing line: ~  2740,8840,2840,8800~
+  4020,5840,4080,5940
+** Processing line: ~  4080,5940,4120,6040~
 - Inside source: true
 *** True Line Result
-  2740,8840,2840,8800
-** Processing line: ~  2840,8800,2900,8700~
+  4080,5940,4120,6040
+** Processing line: ~  4120,6040,4200,6080~
 - Inside source: true
 *** True Line Result
-  2840,8800,2900,8700
-** Processing line: ~  2900,8600,2900,8700~
+  4120,6040,4200,6080
+** Processing line: ~  4200,6080,4340,6080~
 - Inside source: true
 *** True Line Result
-  2900,8600,2900,8700
-** Processing line: ~  2900,8480,2900,8600~
+  4200,6080,4340,6080
+** Processing line: ~  4340,6080,4500,6060~
 - Inside source: true
 *** True Line Result
-  2900,8480,2900,8600
-** Processing line: ~  2900,8380,2900,8480~
+  4340,6080,4500,6060
+** Processing line: ~  4500,6060,4700,6060~
 - Inside source: true
 *** True Line Result
-  2900,8380,2900,8480
-** Processing line: ~  2900,8380,2900,8260~
+  4500,6060,4700,6060
+** Processing line: ~  4700,6060,4880,6060~
 - Inside source: true
 *** True Line Result
-  2900,8380,2900,8260
-** Processing line: ~  2900,8260,2900,8140~
+  4700,6060,4880,6060
+** Processing line: ~  4880,6060,5080,6060~
 - Inside source: true
 *** True Line Result
-  2900,8260,2900,8140
-** Processing line: ~  2900,8140,2900,8020~
+  4880,6060,5080,6060
+** Processing line: ~  5080,6060,5280,6080~
 - Inside source: true
 *** True Line Result
-  2900,8140,2900,8020
-** Processing line: ~  2900,8020,2900,7900~
+  5080,6060,5280,6080
+** Processing line: ~  5280,6080,5440,6100~
 - Inside source: true
 *** True Line Result
-  2900,8020,2900,7900
-** Processing line: ~  2900,7820,2900,7900~
+  5280,6080,5440,6100
+** Processing line: ~  5440,6100,5660,6100~
 - Inside source: true
 *** True Line Result
-  2900,7820,2900,7900
-** Processing line: ~  2900,7820,2900,7740~
+  5440,6100,5660,6100
+** Processing line: ~  5660,6100,5900,6080~
 - Inside source: true
 *** True Line Result
-  2900,7820,2900,7740
-** Processing line: ~  2900,7660,2900,7740~
+  5660,6100,5900,6080
+** Processing line: ~  5900,6080,6120,6080~
 - Inside source: true
 *** True Line Result
-  2900,7660,2900,7740
-** Processing line: ~  2900,7560,2900,7660~
+  5900,6080,6120,6080
+** Processing line: ~  6120,6080,6360,6080~
 - Inside source: true
 *** True Line Result
-  2900,7560,2900,7660
-** Processing line: ~  2900,7460,2900,7560~
+  6120,6080,6360,6080
+** Processing line: ~  6360,6080,6480,6100~
 - Inside source: true
 *** True Line Result
-  2900,7460,2900,7560
-** Processing line: ~  2900,7460,2900,7360~
+  6360,6080,6480,6100
+** Processing line: ~  6480,6100,6540,6060~
 - Inside source: true
 *** True Line Result
-  2900,7460,2900,7360
-** Processing line: ~  2900,7260,2900,7360~
+  6480,6100,6540,6060
+** Processing line: ~  6540,6060,6720,6060~
 - Inside source: true
 *** True Line Result
-  2900,7260,2900,7360
-** Processing line: ~  2840,7160,2900,7260~
+  6540,6060,6720,6060
+** Processing line: ~  6720,6060,6940,6060~
 - Inside source: true
 *** True Line Result
-  2840,7160,2900,7260
-** Processing line: ~  2800,7080,2840,7160~
+  6720,6060,6940,6060
+** Processing line: ~  6940,6060,7140,6060~
 - Inside source: true
 *** True Line Result
-  2800,7080,2840,7160
-** Processing line: ~  2700,7100,2800,7080~
+  6940,6060,7140,6060
+** Processing line: ~  7400,6060,7600,6060~
 - Inside source: true
 *** True Line Result
-  2700,7100,2800,7080
-** Processing line: ~  2560,7120,2700,7100~
+  7400,6060,7600,6060
+** Processing line: ~  7140,6060,7400,6060~
 - Inside source: true
 *** True Line Result
-  2560,7120,2700,7100
-** Processing line: ~  2400,7100,2560,7120~
+  7140,6060,7400,6060
+** Processing line: ~  7600,6060,7800,6060~
 - Inside source: true
 *** True Line Result
-  2400,7100,2560,7120
-** Processing line: ~  2320,7100,2400,7100~
+  7600,6060,7800,6060
+** Processing line: ~  7800,6060,7860,6080~
 - Inside source: true
 *** True Line Result
-  2320,7100,2400,7100
-** Processing line: ~  2140,7100,2320,7100~
+  7800,6060,7860,6080
+** Processing line: ~  7860,6080,8060,6080~
 - Inside source: true
 *** True Line Result
-  2140,7100,2320,7100
-** Processing line: ~  2040,7080,2140,7100~
+  7860,6080,8060,6080
+** Processing line: ~  8060,6080,8220,6080~
 - Inside source: true
 *** True Line Result
-  2040,7080,2140,7100
-** Processing line: ~  1940,7080,2040,7080~
+  8060,6080,8220,6080
+** Processing line: ~  8220,6080,8320,6140~
 - Inside source: true
 *** True Line Result
-  1940,7080,2040,7080
-** Processing line: ~  1820,7140,1940,7080~
+  8220,6080,8320,6140
+** Processing line: ~  8320,6140,8360,6300~
 - Inside source: true
 *** True Line Result
-  1820,7140,1940,7080
-** Processing line: ~  1680,7140,1820,7140~
+  8320,6140,8360,6300
+** Processing line: ~  8320,6460,8360,6300~
 - Inside source: true
 *** True Line Result
-  1680,7140,1820,7140
-** Processing line: ~  1540,7140,1680,7140~
+  8320,6460,8360,6300
+** Processing line: ~  8320,6620,8320,6460~
 - Inside source: true
 *** True Line Result
-  1540,7140,1680,7140
-** Processing line: ~  1420,7220,1540,7140~
+  8320,6620,8320,6460
+** Processing line: ~  8320,6800,8320,6620~
 - Inside source: true
 *** True Line Result
-  1420,7220,1540,7140
-** Processing line: ~  1280,7220,1380,7220~
+  8320,6800,8320,6620
+** Processing line: ~  8320,6960,8320,6800~
 - Inside source: true
 *** True Line Result
-  1280,7220,1380,7220
-** Processing line: ~  1140,7200,1280,7220~
+  8320,6960,8320,6800
+** Processing line: ~  8320,6960,8360,7120~
 - Inside source: true
 *** True Line Result
-  1140,7200,1280,7220
-** Processing line: ~  1000,7220,1140,7200~
+  8320,6960,8360,7120
+** Processing line: ~  8320,7280,8360,7120~
 - Inside source: true
 *** True Line Result
-  1000,7220,1140,7200
-** Processing line: ~  760,7280,900,7320~
+  8320,7280,8360,7120
+** Processing line: ~  8320,7440,8320,7280~
 - Inside source: true
 *** True Line Result
-  760,7280,900,7320
-** Processing line: ~  540,7220,760,7280~
+  8320,7440,8320,7280
+** Processing line: ~  8320,7600,8320,7440~
 - Inside source: true
 *** True Line Result
-  540,7220,760,7280
-** Processing line: ~  300,7180,540,7220~
+  8320,7600,8320,7440
+** Processing line: ~  8100,7580,8220,7600~
 - Inside source: true
 *** True Line Result
-  300,7180,540,7220
-** Processing line: ~  180,7120,180,7160~
+  8100,7580,8220,7600
+** Processing line: ~  8220,7600,8320,7600~
 - Inside source: true
 *** True Line Result
-  180,7120,180,7160
-** Processing line: ~  40,7140,180,7120~
+  8220,7600,8320,7600
+** Processing line: ~  7900,7560,8100,7580~
 - Inside source: true
 *** True Line Result
-  40,7140,180,7120
-** Processing line: ~  -60,7160,40,7140~
+  7900,7560,8100,7580
+** Processing line: ~  7680,7560,7900,7560~
 - Inside source: true
 *** True Line Result
-  -60,7160,40,7140
-** Processing line: ~  -200,7120,-60,7160~
+  7680,7560,7900,7560
+** Processing line: ~  7480,7580,7680,7560~
 - Inside source: true
 *** True Line Result
-  -200,7120,-60,7160
-** Processing line: ~  180,7160,300,7180~
+  7480,7580,7680,7560
+** Processing line: ~  7280,7580,7480,7580~
 - Inside source: true
 *** True Line Result
-  180,7160,300,7180
-** Processing line: ~  -260,7060,-200,7120~
+  7280,7580,7480,7580
+** Processing line: ~  7080,7580,7280,7580~
 - Inside source: true
 *** True Line Result
-  -260,7060,-200,7120
-** Processing line: ~  -260,6980,-260,7060~
+  7080,7580,7280,7580
+** Processing line: ~  7000,7600,7080,7580~
 - Inside source: true
 *** True Line Result
-  -260,6980,-260,7060
-** Processing line: ~  -260,6880,-260,6980~
+  7000,7600,7080,7580
+** Processing line: ~  6880,7600,7000,7600~
 - Inside source: true
 *** True Line Result
-  -260,6880,-260,6980
-** Processing line: ~  -260,6880,-260,6820~
+  6880,7600,7000,7600
+** Processing line: ~  6800,7580,6880,7600~
 - Inside source: true
 *** True Line Result
-  -260,6880,-260,6820
-** Processing line: ~  -260,6820,-200,6760~
+  6800,7580,6880,7600
+** Processing line: ~  6640,7580,6800,7580~
 - Inside source: true
 *** True Line Result
-  -260,6820,-200,6760
-** Processing line: ~  -200,6760,-100,6740~
+  6640,7580,6800,7580
+** Processing line: ~  6540,7580,6640,7580~
 - Inside source: true
 *** True Line Result
-  -200,6760,-100,6740
-** Processing line: ~  -100,6740,-60,6740~
+  6540,7580,6640,7580
+** Processing line: ~  6380,7600,6540,7580~
 - Inside source: true
 *** True Line Result
-  -100,6740,-60,6740
-** Processing line: ~  -60,6740,40,6740~
+  6380,7600,6540,7580
+** Processing line: ~  6280,7620,6380,7600~
 - Inside source: true
 *** True Line Result
-  -60,6740,40,6740
-** Processing line: ~  40,6740,300,6800~
+  6280,7620,6380,7600
+** Processing line: ~  6240,7700,6280,7620~
 - Inside source: true
 *** True Line Result
-  40,6740,300,6800
-** Processing line: ~  300,6800,420,6760~
+  6240,7700,6280,7620
+** Processing line: ~  6240,7700,6240,7800~
 - Inside source: true
 *** True Line Result
-  300,6800,420,6760
-** Processing line: ~  420,6760,500,6740~
+  6240,7700,6240,7800
+** Processing line: ~  6240,7840,6240,7800~
 - Inside source: true
 *** True Line Result
-  420,6760,500,6740
-** Processing line: ~  500,6740,540,6760~
+  6240,7840,6240,7800
+** Processing line: ~  6080,7840,6240,7840~
 - Inside source: true
 *** True Line Result
-  500,6740,540,6760
-** Processing line: ~  540,6760,540,6760~
+  6080,7840,6240,7840
+** Processing line: ~  5960,7820,6080,7840~
 - Inside source: true
 *** True Line Result
-  540,6760,540,6760
-** Processing line: ~  540,6760,640,6780~
+  5960,7820,6080,7840
+** Processing line: ~  5660,7840,5800,7840~
 - Inside source: true
 *** True Line Result
-  540,6760,640,6780
-** Processing line: ~  640,6660,640,6780~
+  5660,7840,5800,7840
+** Processing line: ~  5500,7800,5660,7840~
 - Inside source: true
 *** True Line Result
-  640,6660,640,6780
-** Processing line: ~  580,6580,640,6660~
+  5500,7800,5660,7840
+** Processing line: ~  5440,7700,5500,7800~
 - Inside source: true
 *** True Line Result
-  580,6580,640,6660
-** Processing line: ~  580,6440,580,6580~
+  5440,7700,5500,7800
+** Processing line: ~  5800,7840,5960,7820~
 - Inside source: true
 *** True Line Result
-  580,6440,580,6580
-** Processing line: ~  580,6440,640,6320~
+  5800,7840,5960,7820
+** Processing line: ~  5440,7540,5440,7700~
 - Inside source: true
 *** True Line Result
-  580,6440,640,6320
-** Processing line: ~  640,6320,640,6180~
+  5440,7540,5440,7700
+** Processing line: ~  5440,7440,5440,7540~
 - Inside source: true
 *** True Line Result
-  640,6320,640,6180
-** Processing line: ~  580,6080,640,6180~
+  5440,7440,5440,7540
+** Processing line: ~  5440,7320,5440,7440~
 - Inside source: true
 *** True Line Result
-  580,6080,640,6180
-** Processing line: ~  580,6080,640,5960~
+  5440,7320,5440,7440
+** Processing line: ~  5400,7320,5440,7320~
 - Inside source: true
 *** True Line Result
-  580,6080,640,5960
-** Processing line: ~  640,5960,640,5840~
+  5400,7320,5440,7320
+** Processing line: ~  5340,7400,5400,7320~
 - Inside source: true
 *** True Line Result
-  640,5960,640,5840
-** Processing line: ~  640,5840,640,5700~
+  5340,7400,5400,7320
+** Processing line: ~  5340,7400,5340,7500~
 - Inside source: true
 *** True Line Result
-  640,5840,640,5700
-** Processing line: ~  640,5700,660,5560~
+  5340,7400,5340,7500
+** Processing line: ~  5340,7600,5340,7500~
 - Inside source: true
 *** True Line Result
-  640,5700,660,5560
-** Processing line: ~  660,5560,660,5440~
+  5340,7600,5340,7500
+** Processing line: ~  5340,7600,5340,7720~
 - Inside source: true
 *** True Line Result
-  660,5560,660,5440
-** Processing line: ~  660,5440,660,5300~
+  5340,7600,5340,7720
+** Processing line: ~  5340,7720,5340,7860~
 - Inside source: true
 *** True Line Result
-  660,5440,660,5300
-** Processing line: ~  660,5140,660,5300~
+  5340,7720,5340,7860
+** Processing line: ~  5340,7860,5340,7960~
 - Inside source: true
 *** True Line Result
-  660,5140,660,5300
-** Processing line: ~  660,5140,660,5000~
+  5340,7860,5340,7960
+** Processing line: ~  5340,7960,5440,8020~
 - Inside source: true
 *** True Line Result
-  660,5140,660,5000
-** Processing line: ~  660,5000,660,4880~
+  5340,7960,5440,8020
+** Processing line: ~  5440,8020,5560,8020~
 - Inside source: true
 *** True Line Result
-  660,5000,660,4880
-** Processing line: ~  660,4880,820,4860~
+  5440,8020,5560,8020
+** Processing line: ~  5560,8020,5720,8040~
 - Inside source: true
 *** True Line Result
-  660,4880,820,4860
-** Processing line: ~  820,4860,1000,4840~
+  5560,8020,5720,8040
+** Processing line: ~  5720,8040,5900,8060~
 - Inside source: true
 *** True Line Result
-  820,4860,1000,4840
-** Processing line: ~  1000,4840,1100,4860~
+  5720,8040,5900,8060
+** Processing line: ~  5900,8060,6080,8060~
 - Inside source: true
 *** True Line Result
-  1000,4840,1100,4860
-** Processing line: ~  1100,4860,1280,4860~
+  5900,8060,6080,8060
+** Processing line: ~  6080,8060,6240,8060~
 - Inside source: true
 *** True Line Result
-  1100,4860,1280,4860
-** Processing line: ~  1280,4860,1420,4840~
+  6080,8060,6240,8060
+** Processing line: ~  6720,8040,6840,8060~
 - Inside source: true
 *** True Line Result
-  1280,4860,1420,4840
-** Processing line: ~  1420,4840,1580,4860~
+  6720,8040,6840,8060
+** Processing line: ~  6240,8060,6480,8040~
 - Inside source: true
 *** True Line Result
-  1420,4840,1580,4860
-** Processing line: ~  1580,4860,1720,4820~
+  6240,8060,6480,8040
+** Processing line: ~  6480,8040,6720,8040~
 - Inside source: true
 *** True Line Result
-  1580,4860,1720,4820
-** Processing line: ~  1720,4820,1880,4860~
+  6480,8040,6720,8040
+** Processing line: ~  6840,8060,6940,8060~
 - Inside source: true
 *** True Line Result
-  1720,4820,1880,4860
-** Processing line: ~  1880,4860,2000,4840~
+  6840,8060,6940,8060
+** Processing line: ~  6940,8060,7080,8120~
 - Inside source: true
 *** True Line Result
-  1880,4860,2000,4840
-** Processing line: ~  2000,4840,2140,4840~
+  6940,8060,7080,8120
+** Processing line: ~  7080,8120,7140,8180~
 - Inside source: true
 *** True Line Result
-  2000,4840,2140,4840
-** Processing line: ~  2140,4840,2320,4860~
+  7080,8120,7140,8180
+** Processing line: ~  7140,8460,7140,8320~
 - Inside source: true
 *** True Line Result
-  2140,4840,2320,4860
-** Processing line: ~  2320,4860,2440,4880~
+  7140,8460,7140,8320
+** Processing line: ~  7140,8620,7140,8460~
 - Inside source: true
 *** True Line Result
-  2320,4860,2440,4880
-** Processing line: ~  2440,4880,2600,4880~
+  7140,8620,7140,8460
+** Processing line: ~  7140,8620,7140,8740~
 - Inside source: true
 *** True Line Result
-  2440,4880,2600,4880
-** Processing line: ~  2600,4880,2800,4880~
+  7140,8620,7140,8740
+** Processing line: ~  7140,8860,7140,8740~
 - Inside source: true
 *** True Line Result
-  2600,4880,2800,4880
-** Processing line: ~  2800,4880,2900,4880~
+  7140,8860,7140,8740
+** Processing line: ~  7140,8960,7140,8860~
 - Inside source: true
 *** True Line Result
-  2800,4880,2900,4880
-** Processing line: ~  2900,4880,2900,4820~
+  7140,8960,7140,8860
+** Processing line: ~  7140,8960,7200,9080~
 - Inside source: true
 *** True Line Result
-  2900,4880,2900,4820
-** Processing line: ~  2900,4740,2900,4820~
+  7140,8960,7200,9080
+** Processing line: ~  7140,9200,7200,9080~
 - Inside source: true
 *** True Line Result
-  2900,4740,2900,4820
-** Processing line: ~  2800,4700,2900,4740~
+  7140,9200,7200,9080
+** Processing line: ~  7140,9200,7200,9320~
 - Inside source: true
 *** True Line Result
-  2800,4700,2900,4740
-** Processing line: ~  2520,4680,2800,4700~
+  7140,9200,7200,9320
+** Processing line: ~  7200,9320,7200,9460~
 - Inside source: true
 *** True Line Result
-  2520,4680,2800,4700
-** Processing line: ~  2240,4660,2520,4680~
+  7200,9320,7200,9460
+** Processing line: ~  7200,9760,7200,9900~
 - Inside source: true
 *** True Line Result
-  2240,4660,2520,4680
-** Processing line: ~  1940,4620,2240,4660~
+  7200,9760,7200,9900
+** Processing line: ~  7200,9620,7200,9460~
 - Inside source: true
 *** True Line Result
-  1940,4620,2240,4660
-** Processing line: ~  1820,4580,1940,4620~
+  7200,9620,7200,9460
+** Processing line: ~  7200,9620,7200,9760~
 - Inside source: true
 *** True Line Result
-  1820,4580,1940,4620
-** Processing line: ~  1820,4500,1820,4580~
+  7200,9620,7200,9760
+** Processing line: ~  7200,9900,7200,10060~
 - Inside source: true
 *** True Line Result
-  1820,4500,1820,4580
-** Processing line: ~  1820,4500,1880,4420~
+  7200,9900,7200,10060
+** Processing line: ~  7200,10220,7200,10060~
 - Inside source: true
 *** True Line Result
-  1820,4500,1880,4420
-** Processing line: ~  1880,4420,2000,4420~
+  7200,10220,7200,10060
+** Processing line: ~  7200,10360,7200,10220~
 - Inside source: true
 *** True Line Result
-  1880,4420,2000,4420
-** Processing line: ~  2000,4420,2200,4420~
+  7200,10360,7200,10220
+** Processing line: ~  7140,10400,7200,10360~
 - Inside source: true
 *** True Line Result
-  2000,4420,2200,4420
-** Processing line: ~  2200,4420,2400,4440~
+  7140,10400,7200,10360
+** Processing line: ~  6880,10400,7140,10400~
 - Inside source: true
 *** True Line Result
-  2200,4420,2400,4440
-** Processing line: ~  2400,4440,2600,4440~
+  6880,10400,7140,10400
+** Processing line: ~  6640,10360,6880,10400~
 - Inside source: true
 *** True Line Result
-  2400,4440,2600,4440
-** Processing line: ~  2600,4440,2840,4440~
+  6640,10360,6880,10400
+** Processing line: ~  6420,10360,6640,10360~
 - Inside source: true
 *** True Line Result
-  2600,4440,2840,4440
-** Processing line: ~  2840,4440,2900,4400~
+  6420,10360,6640,10360
+** Processing line: ~  6160,10380,6420,10360~
 - Inside source: true
 *** True Line Result
-  2840,4440,2900,4400
-** Processing line: ~  2740,4260,2900,4280~
+  6160,10380,6420,10360
+** Processing line: ~  5940,10340,6160,10380~
 - Inside source: true
 *** True Line Result
-  2740,4260,2900,4280
-** Processing line: ~  2600,4240,2740,4260~
+  5940,10340,6160,10380
+** Processing line: ~  5720,10320,5940,10340~
 - Inside source: true
 *** True Line Result
-  2600,4240,2740,4260
-** Processing line: ~  2480,4280,2600,4240~
+  5720,10320,5940,10340
+** Processing line: ~  5500,10340,5720,10320~
 - Inside source: true
 *** True Line Result
-  2480,4280,2600,4240
-** Processing line: ~  2320,4240,2480,4280~
+  5500,10340,5720,10320
+** Processing line: ~  5280,10300,5500,10340~
 - Inside source: true
 *** True Line Result
-  2320,4240,2480,4280
-** Processing line: ~  2140,4220,2320,4240~
+  5280,10300,5500,10340
+** Processing line: ~  5080,10300,5280,10300~
 - Inside source: true
 *** True Line Result
-  2140,4220,2320,4240
-** Processing line: ~  1940,4220,2140,4220~
+  5080,10300,5280,10300
+** Processing line: ~  4840,10280,5080,10300~
 - Inside source: true
 *** True Line Result
-  1940,4220,2140,4220
-** Processing line: ~  1880,4160,1940,4220~
+  4840,10280,5080,10300
+** Processing line: ~  4700,10280,4840,10280~
 - Inside source: true
 *** True Line Result
-  1880,4160,1940,4220
-** Processing line: ~  1880,4160,1880,4080~
+  4700,10280,4840,10280
+** Processing line: ~  4540,10280,4700,10280~
 - Inside source: true
 *** True Line Result
-  1880,4160,1880,4080
-** Processing line: ~  1880,4080,2040,4040~
+  4540,10280,4700,10280
+** Processing line: ~  4360,10280,4540,10280~
 - Inside source: true
 *** True Line Result
-  1880,4080,2040,4040
-** Processing line: ~  2040,4040,2240,4060~
+  4360,10280,4540,10280
+** Processing line: ~  4200,10300,4360,10280~
 - Inside source: true
 *** True Line Result
-  2040,4040,2240,4060
-** Processing line: ~  2240,4060,2400,4040~
+  4200,10300,4360,10280
+** Processing line: ~  4040,10380,4200,10300~
 - Inside source: true
 *** True Line Result
-  2240,4060,2400,4040
-** Processing line: ~  2400,4040,2600,4060~
+  4040,10380,4200,10300
+** Processing line: ~  4020,10500,4040,10380~
 - Inside source: true
 *** True Line Result
-  2400,4040,2600,4060
-** Processing line: ~  2600,4060,2740,4020~
+  4020,10500,4040,10380
+** Processing line: ~  3980,10640,4020,10500~
 - Inside source: true
 *** True Line Result
-  2600,4060,2740,4020
-** Processing line: ~  2740,4020,2840,3940~
+  3980,10640,4020,10500
+** Processing line: ~  3980,10640,3980,10760~
 - Inside source: true
 *** True Line Result
-  2740,4020,2840,3940
-** Processing line: ~  2840,3780,2840,3940~
+  3980,10640,3980,10760
+** Processing line: ~  3980,10760,4020,10920~
 - Inside source: true
 *** True Line Result
-  2840,3780,2840,3940
-** Processing line: ~  2740,3660,2840,3780~
+  3980,10760,4020,10920
+** Processing line: ~  4020,10920,4080,11000~
 - Inside source: true
 *** True Line Result
-  2740,3660,2840,3780
-** Processing line: ~  2700,3680,2740,3660~
+  4020,10920,4080,11000
+** Processing line: ~  4080,11000,4340,11020~
 - Inside source: true
 *** True Line Result
-  2700,3680,2740,3660
-** Processing line: ~  2520,3700,2700,3680~
+  4080,11000,4340,11020
+** Processing line: ~  4340,11020,4600,11060~
 - Inside source: true
 *** True Line Result
-  2520,3700,2700,3680
-** Processing line: ~  2380,3700,2520,3700~
+  4340,11020,4600,11060
+** Processing line: ~  4600,11060,4840,11040~
 - Inside source: true
 *** True Line Result
-  2380,3700,2520,3700
-** Processing line: ~  2200,3720,2380,3700~
+  4600,11060,4840,11040
+** Processing line: ~  4840,11040,4880,10960~
 - Inside source: true
 *** True Line Result
-  2200,3720,2380,3700
-** Processing line: ~  2040,3720,2200,3720~
+  4840,11040,4880,10960
+** Processing line: ~  4880,10740,4880,10960~
 - Inside source: true
 *** True Line Result
-  2040,3720,2200,3720
-** Processing line: ~  1880,3700,2040,3720~
+  4880,10740,4880,10960
+** Processing line: ~  4880,10740,4880,10600~
 - Inside source: true
 *** True Line Result
-  1880,3700,2040,3720
-** Processing line: ~  1820,3680,1880,3700~
+  4880,10740,4880,10600
+** Processing line: ~  4880,10600,5080,10560~
 - Inside source: true
 *** True Line Result
-  1820,3680,1880,3700
-** Processing line: ~  1760,3600,1820,3680~
+  4880,10600,5080,10560
+** Processing line: ~  5080,10560,5340,10620~
 - Inside source: true
 *** True Line Result
-  1760,3600,1820,3680
-** Processing line: ~  1760,3600,1820,3480~
+  5080,10560,5340,10620
+** Processing line: ~  5340,10620,5660,10620~
 - Inside source: true
 *** True Line Result
-  1760,3600,1820,3480
-** Processing line: ~  1820,3480,1880,3440~
+  5340,10620,5660,10620
+** Processing line: ~  5660,10620,6040,10600~
 - Inside source: true
 *** True Line Result
-  1820,3480,1880,3440
-** Processing line: ~  1880,3440,1960,3460~
+  5660,10620,6040,10600
+** Processing line: ~  6040,10600,6120,10620~
 - Inside source: true
 *** True Line Result
-  1880,3440,1960,3460
-** Processing line: ~  1960,3460,2140,3460~
+  6040,10600,6120,10620
+** Processing line: ~  6120,10620,6240,10720~
 - Inside source: true
 *** True Line Result
-  1960,3460,2140,3460
-** Processing line: ~  2140,3460,2380,3460~
+  6120,10620,6240,10720
+** Processing line: ~  6240,10720,6420,10740~
 - Inside source: true
 *** True Line Result
-  2140,3460,2380,3460
-** Processing line: ~  2380,3460,2640,3440~
+  6240,10720,6420,10740
+** Processing line: ~  6420,10740,6640,10760~
 - Inside source: true
 *** True Line Result
-  2380,3460,2640,3440
-** Processing line: ~  2640,3440,2900,3380~
+  6420,10740,6640,10760
+** Processing line: ~  6640,10760,6880,10780~
 - Inside source: true
 *** True Line Result
-  2640,3440,2900,3380
-** Processing line: ~  2840,3280,2900,3380~
+  6640,10760,6880,10780
+** Processing line: ~  7140,10780,7400,10780~
 - Inside source: true
 *** True Line Result
-  2840,3280,2900,3380
-** Processing line: ~  2840,3280,2900,3200~
+  7140,10780,7400,10780
+** Processing line: ~  6880,10780,7140,10780~
 - Inside source: true
 *** True Line Result
-  2840,3280,2900,3200
-** Processing line: ~  2900,3200,2900,3140~
+  6880,10780,7140,10780
+** Processing line: ~  7400,10780,7680,10780~
 - Inside source: true
 *** True Line Result
-  2900,3200,2900,3140
-** Processing line: ~  2840,3020,2900,3140~
+  7400,10780,7680,10780
+** Processing line: ~  7680,10780,8100,10760~
 - Inside source: true
 *** True Line Result
-  2840,3020,2900,3140
-** Processing line: ~  2800,2960,2840,3020~
+  7680,10780,8100,10760
+** Processing line: ~  8100,10760,8460,10740~
 - Inside source: true
 *** True Line Result
-  2800,2960,2840,3020
-** Processing line: ~  2700,3000,2800,2960~
+  8100,10760,8460,10740
+** Processing line: ~  8460,10740,8700,10760~
 - Inside source: true
 *** True Line Result
-  2700,3000,2800,2960
-** Processing line: ~  2600,2980,2700,3000~
+  8460,10740,8700,10760
+** Processing line: ~  8800,10840,8800,10980~
 - Inside source: true
 *** True Line Result
-  2600,2980,2700,3000
-** Processing line: ~  2380,3000,2600,2980~
+  8800,10840,8800,10980
+** Processing line: ~  8700,10760,8800,10840~
 - Inside source: true
 *** True Line Result
-  2380,3000,2600,2980
-** Processing line: ~  2140,3000,2380,3000~
+  8700,10760,8800,10840
+** Processing line: ~  8760,11200,8800,10980~
 - Inside source: true
 *** True Line Result
-  2140,3000,2380,3000
-** Processing line: ~  1880,3000,2140,3000~
+  8760,11200,8800,10980
+** Processing line: ~  8760,11200,8760,11380~
 - Inside source: true
 *** True Line Result
-  1880,3000,2140,3000
-** Processing line: ~  1720,3040,1880,3000~
+  8760,11200,8760,11380
+** Processing line: ~  8760,11380,8800,11560~
 - Inside source: true
 *** True Line Result
-  1720,3040,1880,3000
-** Processing line: ~  1640,2960,1720,3040~
+  8760,11380,8800,11560
+** Processing line: ~  8760,11680,8800,11560~
 - Inside source: true
 *** True Line Result
-  1640,2960,1720,3040
-** Processing line: ~  1500,2940,1640,2960~
+  8760,11680,8800,11560
+** Processing line: ~  8760,11760,8760,11680~
 - Inside source: true
 *** True Line Result
-  1500,2940,1640,2960
-** Processing line: ~  1340,3000,1500,2940~
+  8760,11760,8760,11680
+** Processing line: ~  8760,11760,8760,11920~
 - Inside source: true
 *** True Line Result
-  1340,3000,1500,2940
-** Processing line: ~  1240,3000,1340,3000~
+  8760,11760,8760,11920
+** Processing line: ~  8760,11920,8800,12080~
 - Inside source: true
 *** True Line Result
-  1240,3000,1340,3000
-** Processing line: ~  1140,3020,1240,3000~
+  8760,11920,8800,12080
+** Processing line: ~  8800,12200,8800,12080~
 - Inside source: true
 *** True Line Result
-  1140,3020,1240,3000
-** Processing line: ~  1040,3000,1140,3020~
+  8800,12200,8800,12080
+** Processing line: ~  8700,12240,8800,12200~
 - Inside source: true
 *** True Line Result
-  1040,3000,1140,3020
-** Processing line: ~  960,2960,1040,3000~
+  8700,12240,8800,12200
+** Processing line: ~  8560,12220,8700,12240~
 - Inside source: true
 *** True Line Result
-  960,2960,1040,3000
-** Processing line: ~  900,2960,960,2960~
+  8560,12220,8700,12240
+** Processing line: ~  8360,12220,8560,12220~
 - Inside source: true
 *** True Line Result
-  900,2960,960,2960
-** Processing line: ~  840,2840,900,2960~
+  8360,12220,8560,12220
+** Processing line: ~  8160,12240,8360,12220~
 - Inside source: true
 *** True Line Result
-  840,2840,900,2960
-** Processing line: ~  700,2820,840,2840~
+  8160,12240,8360,12220
+** Processing line: ~  7720,12220,7980,12220~
 - Inside source: true
 *** True Line Result
-  700,2820,840,2840
-** Processing line: ~  540,2820,700,2820~
+  7720,12220,7980,12220
+** Processing line: ~  7980,12220,8160,12240~
 - Inside source: true
 *** True Line Result
-  540,2820,700,2820
-** Processing line: ~  420,2820,540,2820~
+  7980,12220,8160,12240
+** Processing line: ~  7400,12200,7720,12220~
 - Inside source: true
 *** True Line Result
-  420,2820,540,2820
-** Processing line: ~  180,2800,420,2820~
+  7400,12200,7720,12220
+** Processing line: ~  7200,12180,7400,12200~
 - Inside source: true
 *** True Line Result
-  180,2800,420,2820
-** Processing line: ~  60,2780,180,2800~
+  7200,12180,7400,12200
+** Processing line: ~  7000,12160,7200,12180~
 - Inside source: true
 *** True Line Result
-  60,2780,180,2800
-** Processing line: ~  -60,2800,60,2780~
+  7000,12160,7200,12180
+** Processing line: ~  6800,12160,7000,12160~
 - Inside source: true
 *** True Line Result
-  -60,2800,60,2780
-** Processing line: ~  -160,2760,-60,2800~
+  6800,12160,7000,12160
+** Processing line: ~  6280,12140,6380,12180~
 - Inside source: true
 *** True Line Result
-  -160,2760,-60,2800
-** Processing line: ~  -260,2740,-160,2760~
+  6280,12140,6380,12180
+** Processing line: ~  6120,12180,6280,12140~
 - Inside source: true
 *** True Line Result
-  -260,2740,-160,2760
-** Processing line: ~  -300,2640,-260,2740~
+  6120,12180,6280,12140
+** Processing line: ~  6540,12180,6800,12160~
 - Inside source: true
 *** True Line Result
-  -300,2640,-260,2740
-** Processing line: ~  -360,2560,-300,2640~
+  6540,12180,6800,12160
+** Processing line: ~  6380,12180,6540,12180~
 - Inside source: true
 *** True Line Result
-  -360,2560,-300,2640
-** Processing line: ~  -380,2460,-360,2560~
+  6380,12180,6540,12180
+** Processing line: ~  5900,12200,6120,12180~
 - Inside source: true
 *** True Line Result
-  -380,2460,-360,2560
-** Processing line: ~  -380,2460,-300,2380~
+  5900,12200,6120,12180
+** Processing line: ~  5620,12180,5900,12200~
 - Inside source: true
 *** True Line Result
-  -380,2460,-300,2380
-** Processing line: ~  -300,2300,-300,2380~
+  5620,12180,5900,12200
+** Processing line: ~  5340,12120,5620,12180~
 - Inside source: true
 *** True Line Result
-  -300,2300,-300,2380
-** Processing line: ~  -300,2300,-300,2220~
+  5340,12120,5620,12180
+** Processing line: ~  5140,12100,5340,12120~
 - Inside source: true
 *** True Line Result
-  -300,2300,-300,2220
-** Processing line: ~  -300,2100,-300,2220~
+  5140,12100,5340,12120
+** Processing line: ~  4980,12120,5140,12100~
 - Inside source: true
 *** True Line Result
-  -300,2100,-300,2220
-** Processing line: ~  -300,2100,-300,2040~
+  4980,12120,5140,12100
+** Processing line: ~  4840,12120,4980,12120~
 - Inside source: true
 *** True Line Result
-  -300,2100,-300,2040
-** Processing line: ~  -300,2040,-160,2040~
+  4840,12120,4980,12120
+** Processing line: ~  4700,12200,4840,12120~
 - Inside source: true
 *** True Line Result
-  -300,2040,-160,2040
-** Processing line: ~  -160,2040,-60,2040~
+  4700,12200,4840,12120
+** Processing line: ~  4700,12380,4700,12200~
 - Inside source: true
 *** True Line Result
-  -160,2040,-60,2040
-** Processing line: ~  -60,2040,60,2040~
+  4700,12380,4700,12200
+** Processing line: ~  4740,12480,4940,12520~
 - Inside source: true
 *** True Line Result
-  -60,2040,60,2040
-** Processing line: ~  60,2040,180,2040~
+  4740,12480,4940,12520
+** Processing line: ~  4700,12380,4740,12480~
 - Inside source: true
 *** True Line Result
-  60,2040,180,2040
-** Processing line: ~  180,2040,360,2040~
+  4700,12380,4740,12480
+** Processing line: ~  4940,12520,5160,12560~
 - Inside source: true
 *** True Line Result
-  180,2040,360,2040
-** Processing line: ~  360,2040,540,2040~
+  4940,12520,5160,12560
+** Processing line: ~  5160,12560,5340,12600~
 - Inside source: true
 *** True Line Result
-  360,2040,540,2040
-** Processing line: ~  540,2040,700,2080~
+  5160,12560,5340,12600
+** Processing line: ~  5340,12600,5400,12600~
 - Inside source: true
 *** True Line Result
-  540,2040,700,2080
-** Processing line: ~  660,2160,700,2080~
+  5340,12600,5400,12600
+** Processing line: ~  5400,12600,5500,12600~
 - Inside source: true
 *** True Line Result
-  660,2160,700,2080
-** Processing line: ~  660,2160,700,2260~
+  5400,12600,5500,12600
+** Processing line: ~  5500,12600,5620,12600~
 - Inside source: true
 *** True Line Result
-  660,2160,700,2260
-** Processing line: ~  660,2380,700,2260~
+  5500,12600,5620,12600
+** Processing line: ~  5620,12600,5720,12560~
 - Inside source: true
 *** True Line Result
-  660,2380,700,2260
-** Processing line: ~  500,2340,660,2380~
+  5620,12600,5720,12560
+** Processing line: ~  5720,12560,5800,12440~
 - Inside source: true
 *** True Line Result
-  500,2340,660,2380
-** Processing line: ~  360,2340,500,2340~
+  5720,12560,5800,12440
+** Processing line: ~  5800,12440,5900,12380~
 - Inside source: true
 *** True Line Result
-  360,2340,500,2340
-** Processing line: ~  240,2340,360,2340~
+  5800,12440,5900,12380
+** Processing line: ~  5900,12380,6120,12420~
 - Inside source: true
 *** True Line Result
-  240,2340,360,2340
-** Processing line: ~  40,2320,240,2340~
+  5900,12380,6120,12420
+** Processing line: ~  6120,12420,6380,12440~
 - Inside source: true
 *** True Line Result
-  40,2320,240,2340
-** Processing line: ~  -60,2320,40,2320~
+  6120,12420,6380,12440
+** Processing line: ~  6380,12440,6600,12460~
 - Inside source: true
 *** True Line Result
-  -60,2320,40,2320
-** Processing line: ~  -100,2380,-60,2320~
+  6380,12440,6600,12460
+** Processing line: ~  6720,12460,6840,12520~
 - Inside source: true
 *** True Line Result
-  -100,2380,-60,2320
-** Processing line: ~  -100,2380,-100,2460~
+  6720,12460,6840,12520
+** Processing line: ~  6840,12520,6960,12520~
 - Inside source: true
 *** True Line Result
-  -100,2380,-100,2460
-** Processing line: ~  -100,2460,-100,2540~
+  6840,12520,6960,12520
+** Processing line: ~  6600,12460,6720,12460~
 - Inside source: true
 *** True Line Result
-  -100,2460,-100,2540
-** Processing line: ~  -100,2540,0,2560~
+  6600,12460,6720,12460
+** Processing line: ~  6960,12520,7040,12500~
 - Inside source: true
 *** True Line Result
-  -100,2540,0,2560
-** Processing line: ~  0,2560,140,2600~
+  6960,12520,7040,12500
+** Processing line: ~  7040,12500,7140,12440~
 - Inside source: true
 *** True Line Result
-  0,2560,140,2600
-** Processing line: ~  140,2600,300,2600~
+  7040,12500,7140,12440
+** Processing line: ~  7200,12440,7360,12500~
 - Inside source: true
 *** True Line Result
-  140,2600,300,2600
-** Processing line: ~  300,2600,460,2600~
+  7200,12440,7360,12500
+** Processing line: ~  7360,12500,7600,12560~
 - Inside source: true
 *** True Line Result
-  300,2600,460,2600
-** Processing line: ~  460,2600,640,2600~
+  7360,12500,7600,12560
+** Processing line: ~  7600,12560,7860,12600~
 - Inside source: true
 *** True Line Result
-  460,2600,640,2600
-** Processing line: ~  640,2600,760,2580~
+  7600,12560,7860,12600
+** Processing line: ~  7860,12600,8060,12500~
 - Inside source: true
 *** True Line Result
-  640,2600,760,2580
-** Processing line: ~  760,2580,820,2560~
+  7860,12600,8060,12500
+** Processing line: ~  8100,12500,8200,12340~
 - Inside source: true
 *** True Line Result
-  760,2580,820,2560
-** Processing line: ~  820,2560,820,2500~
+  8100,12500,8200,12340
+** Processing line: ~  8200,12340,8360,12360~
 - Inside source: true
 *** True Line Result
-  820,2560,820,2500
-** Processing line: ~  820,2500,820,2400~
+  8200,12340,8360,12360
+** Processing line: ~  8360,12360,8560,12400~
 - Inside source: true
 *** True Line Result
-  820,2500,820,2400
-** Processing line: ~  820,2400,840,2320~
+  8360,12360,8560,12400
+** Processing line: ~  8560,12400,8660,12420~
 - Inside source: true
 *** True Line Result
-  820,2400,840,2320
-** Processing line: ~  840,2320,840,2240~
+  8560,12400,8660,12420
+** Processing line: ~  8660,12420,8840,12400~
 - Inside source: true
 *** True Line Result
-  840,2320,840,2240
-** Processing line: ~  820,2120,840,2240~
+  8660,12420,8840,12400
+** Processing line: ~  8840,12400,9000,12360~
 - Inside source: true
 *** True Line Result
-  820,2120,840,2240
-** Processing line: ~  820,2020,820,2120~
+  8840,12400,9000,12360
+** Processing line: ~  9000,12360,9000,12360~
 - Inside source: true
 *** True Line Result
-  820,2020,820,2120
-** Processing line: ~  820,1900,820,2020~
+  9000,12360,9000,12360
+** Processing line: ~  2900,4400,2900,4280~
 - Inside source: true
 *** True Line Result
-  820,1900,820,2020
-** Processing line: ~  760,1840,820,1900~
+  2900,4400,2900,4280
+** Processing line: ~  900,7320,1000,7220~
 - Inside source: true
 *** True Line Result
-  760,1840,820,1900
-** Processing line: ~  640,1840,760,1840~
+  900,7320,1000,7220
+** Processing line: ~  2640,13040,2900,12920~
 - Inside source: true
 *** True Line Result
-  640,1840,760,1840
-** Processing line: ~  500,1840,640,1840~
+  2640,13040,2900,12920
+** Processing line: ~  2900,12920,3160,12840~
 - Inside source: true
 *** True Line Result
-  500,1840,640,1840
-** Processing line: ~  300,1860,420,1880~
+  2900,12920,3160,12840
+** Processing line: ~  3480,12760,3780,12620~
 - Inside source: true
 *** True Line Result
-  300,1860,420,1880
-** Processing line: ~  180,1840,300,1860~
+  3480,12760,3780,12620
+** Processing line: ~  3780,12620,4020,12460~
 - Inside source: true
 *** True Line Result
-  180,1840,300,1860
-** Processing line: ~  420,1880,500,1840~
+  3780,12620,4020,12460
+** Processing line: ~  4300,12360,4440,12260~
 - Inside source: true
 *** True Line Result
-  420,1880,500,1840
-** Processing line: ~  0,1840,180,1840~
+  4300,12360,4440,12260
+** Processing line: ~  4020,12460,4300,12360~
 - Inside source: true
 *** True Line Result
-  0,1840,180,1840
-** Processing line: ~  -60,1860,0,1840~
+  4020,12460,4300,12360
+** Processing line: ~  3160,12840,3480,12760~
 - Inside source: true
 *** True Line Result
-  -60,1860,0,1840
-** Processing line: ~  -160,1840,-60,1860~
+  3160,12840,3480,12760
+** Processing line: ~  4440,12080,4440,12260~
 - Inside source: true
 *** True Line Result
-  -160,1840,-60,1860
-** Processing line: ~  -200,1800,-160,1840~
+  4440,12080,4440,12260
+** Processing line: ~  4440,12080,4440,11880~
 - Inside source: true
 *** True Line Result
-  -200,1800,-160,1840
-** Processing line: ~  -260,1760,-200,1800~
+  4440,12080,4440,11880
+** Processing line: ~  4440,11880,4440,11720~
 - Inside source: true
 *** True Line Result
-  -260,1760,-200,1800
-** Processing line: ~  -260,1680,-260,1760~
+  4440,11880,4440,11720
+** Processing line: ~  4440,11720,4600,11720~
 - Inside source: true
 *** True Line Result
-  -260,1680,-260,1760
-** Processing line: ~  -260,1620,-260,1680~
+  4440,11720,4600,11720
+** Processing line: ~  4600,11720,4760,11740~
 - Inside source: true
 *** True Line Result
-  -260,1620,-260,1680
-** Processing line: ~  -260,1540,-260,1620~
+  4600,11720,4760,11740
+** Processing line: ~  4760,11740,4980,11760~
 - Inside source: true
 *** True Line Result
-  -260,1540,-260,1620
-** Processing line: ~  -260,1540,-260,1460~
+  4760,11740,4980,11760
+** Processing line: ~  4980,11760,5160,11760~
 - Inside source: true
 *** True Line Result
-  -260,1540,-260,1460
-** Processing line: ~  -300,1420,-260,1460~
+  4980,11760,5160,11760
+** Processing line: ~  5160,11760,5340,11780~
 - Inside source: true
 *** True Line Result
-  -300,1420,-260,1460
-** Processing line: ~  -300,1420,-300,1340~
+  5160,11760,5340,11780
+** Processing line: ~  6000,11860,6120,11820~
 - Inside source: true
 *** True Line Result
-  -300,1420,-300,1340
-** Processing line: ~  -300,1340,-260,1260~
+  6000,11860,6120,11820
+** Processing line: ~  5340,11780,5620,11820~
 - Inside source: true
 *** True Line Result
-  -300,1340,-260,1260
-** Processing line: ~  -260,1260,-260,1160~
+  5340,11780,5620,11820
+** Processing line: ~  5620,11820,6000,11860~
 - Inside source: true
 *** True Line Result
-  -260,1260,-260,1160
-** Processing line: ~  -260,1060,-260,1160~
+  5620,11820,6000,11860
+** Processing line: ~  6120,11820,6360,11820~
 - Inside source: true
 *** True Line Result
-  -260,1060,-260,1160
-** Processing line: ~  -260,1060,-260,960~
+  6120,11820,6360,11820
+** Processing line: ~  6360,11820,6640,11860~
 - Inside source: true
 *** True Line Result
-  -260,1060,-260,960
-** Processing line: ~  -260,880,-260,960~
+  6360,11820,6640,11860
+** Processing line: ~  6940,11920,7240,11940~
 - Inside source: true
 *** True Line Result
-  -260,880,-260,960
-** Processing line: ~  -260,880,-260,780~
+  6940,11920,7240,11940
+** Processing line: ~  7240,11940,7520,11960~
 - Inside source: true
 *** True Line Result
-  -260,880,-260,780
-** Processing line: ~  -260,780,-260,680~
+  7240,11940,7520,11960
+** Processing line: ~  7520,11960,7860,11960~
 - Inside source: true
 *** True Line Result
-  -260,780,-260,680
-** Processing line: ~  -300,580,-260,680~
+  7520,11960,7860,11960
+** Processing line: ~  7860,11960,8100,11920~
 - Inside source: true
 *** True Line Result
-  -300,580,-260,680
-** Processing line: ~  -300,580,-300,480~
+  7860,11960,8100,11920
+** Processing line: ~  8100,11920,8420,11940~
 - Inside source: true
 *** True Line Result
-  -300,580,-300,480
-** Processing line: ~  -300,480,-260,400~
+  8100,11920,8420,11940
+** Processing line: ~  8420,11940,8460,11960~
 - Inside source: true
 *** True Line Result
-  -300,480,-260,400
-** Processing line: ~  -300,320,-260,400~
+  8420,11940,8460,11960
+** Processing line: ~  8460,11960,8500,11860~
 - Inside source: true
 *** True Line Result
-  -300,320,-260,400
-** Processing line: ~  -300,320,-300,240~
+  8460,11960,8500,11860
+** Processing line: ~  8460,11760,8500,11860~
 - Inside source: true
 *** True Line Result
-  -300,320,-300,240
-** Processing line: ~  -300,240,-200,220~
+  8460,11760,8500,11860
+** Processing line: ~  8320,11720,8460,11760~
 - Inside source: true
 *** True Line Result
-  -300,240,-200,220
-** Processing line: ~  -200,220,-200,160~
+  8320,11720,8460,11760
+** Processing line: ~  8160,11720,8320,11720~
 - Inside source: true
 *** True Line Result
-  -200,220,-200,160
-** Processing line: ~  -200,160,-100,140~
+  8160,11720,8320,11720
+** Processing line: ~  7940,11720,8160,11720~
 - Inside source: true
 *** True Line Result
-  -200,160,-100,140
-** Processing line: ~  -100,140,0,120~
+  7940,11720,8160,11720
+** Processing line: ~  7720,11700,7940,11720~
 - Inside source: true
 *** True Line Result
-  -100,140,0,120
-** Processing line: ~  0,120,60,120~
+  7720,11700,7940,11720
+** Processing line: ~  7520,11680,7720,11700~
 - Inside source: true
 *** True Line Result
-  0,120,60,120
-** Processing line: ~  60,120,180,120~
+  7520,11680,7720,11700
+** Processing line: ~  7320,11680,7520,11680~
 - Inside source: true
 *** True Line Result
-  60,120,180,120
-** Processing line: ~  180,120,300,120~
+  7320,11680,7520,11680
+** Processing line: ~  7200,11620,7320,11680~
 - Inside source: true
 *** True Line Result
-  180,120,300,120
-** Processing line: ~  300,120,420,140~
+  7200,11620,7320,11680
+** Processing line: ~  7200,11620,7200,11500~
 - Inside source: true
 *** True Line Result
-  300,120,420,140
-** Processing line: ~  420,140,580,180~
+  7200,11620,7200,11500
+** Processing line: ~  7200,11500,7280,11440~
 - Inside source: true
 *** True Line Result
-  420,140,580,180
-** Processing line: ~  580,180,760,180~
+  7200,11500,7280,11440
+** Processing line: ~  7280,11440,7420,11440~
 - Inside source: true
 *** True Line Result
-  580,180,760,180
-** Processing line: ~  760,180,900,180~
+  7280,11440,7420,11440
+** Processing line: ~  7420,11440,7600,11440~
 - Inside source: true
 *** True Line Result
-  760,180,900,180
-** Processing line: ~  960,180,1100,180~
+  7420,11440,7600,11440
+** Processing line: ~  7600,11440,7980,11460~
 - Inside source: true
 *** True Line Result
-  960,180,1100,180
-** Processing line: ~  1100,180,1340,200~
+  7600,11440,7980,11460
+** Processing line: ~  7980,11460,8160,11460~
 - Inside source: true
 *** True Line Result
-  1100,180,1340,200
-** Processing line: ~  1340,200,1580,200~
+  7980,11460,8160,11460
+** Processing line: ~  8160,11460,8360,11460~
 - Inside source: true
 *** True Line Result
-  1340,200,1580,200
-** Processing line: ~  1580,200,1720,180~
+  8160,11460,8360,11460
+** Processing line: ~  8360,11460,8460,11400~
 - Inside source: true
 *** True Line Result
-  1580,200,1720,180
-** Processing line: ~  1720,180,2000,140~
+  8360,11460,8460,11400
+** Processing line: ~  8420,11060,8500,11200~
 - Inside source: true
 *** True Line Result
-  1720,180,2000,140
-** Processing line: ~  2000,140,2240,140~
+  8420,11060,8500,11200
+** Processing line: ~  8280,11040,8420,11060~
 - Inside source: true
 *** True Line Result
-  2000,140,2240,140
-** Processing line: ~  2240,140,2480,140~
+  8280,11040,8420,11060
+** Processing line: ~  8100,11060,8280,11040~
 - Inside source: true
 *** True Line Result
-  2240,140,2480,140
-** Processing line: ~  2520,140,2800,160~
+  8100,11060,8280,11040
+** Processing line: ~  8460,11400,8500,11200~
 - Inside source: true
 *** True Line Result
-  2520,140,2800,160
-** Processing line: ~  2800,160,3000,160~
+  8460,11400,8500,11200
+** Processing line: ~  7800,11060,8100,11060~
 - Inside source: true
 *** True Line Result
-  2800,160,3000,160
-** Processing line: ~  3000,160,3140,160~
+  7800,11060,8100,11060
+** Processing line: ~  7520,11060,7800,11060~
 - Inside source: true
 *** True Line Result
-  3000,160,3140,160
-** Processing line: ~  3140,260,3140,160~
+  7520,11060,7800,11060
+** Processing line: ~  7240,11060,7520,11060~
 - Inside source: true
 *** True Line Result
-  3140,260,3140,160
-** Processing line: ~  3140,260,3140,380~
+  7240,11060,7520,11060
+** Processing line: ~  6940,11040,7240,11060~
 - Inside source: true
 *** True Line Result
-  3140,260,3140,380
-** Processing line: ~  3080,500,3140,380~
+  6940,11040,7240,11060
+** Processing line: ~  6640,11000,6940,11040~
 - Inside source: true
 *** True Line Result
-  3080,500,3140,380
-** Processing line: ~  3080,620,3080,500~
+  6640,11000,6940,11040
+** Processing line: ~  6420,10980,6640,11000~
 - Inside source: true
 *** True Line Result
-  3080,620,3080,500
-** Processing line: ~  3080,620,3080,740~
+  6420,10980,6640,11000
+** Processing line: ~  6360,11060,6420,10980~
 - Inside source: true
 *** True Line Result
-  3080,620,3080,740
-** Processing line: ~  3080,740,3080,840~
+  6360,11060,6420,10980
+** Processing line: ~  6360,11180,6360,11060~
 - Inside source: true
 *** True Line Result
-  3080,740,3080,840
-** Processing line: ~  3080,960,3080,840~
+  6360,11180,6360,11060
+** Processing line: ~  6200,11280,6360,11180~
 - Inside source: true
 *** True Line Result
-  3080,960,3080,840
-** Processing line: ~  3080,1080,3080,960~
+  6200,11280,6360,11180
+** Processing line: ~  5960,11300,6200,11280~
 - Inside source: true
 *** True Line Result
-  3080,1080,3080,960
-** Processing line: ~  3080,1080,3080,1200~
+  5960,11300,6200,11280
+** Processing line: ~  5720,11280,5960,11300~
 - Inside source: true
 *** True Line Result
-  3080,1080,3080,1200
-** Processing line: ~  3080,1200,3080,1340~
+  5720,11280,5960,11300
+** Processing line: ~  5500,11280,5720,11280~
 - Inside source: true
 *** True Line Result
-  3080,1200,3080,1340
-** Processing line: ~  3080,1340,3080,1460~
+  5500,11280,5720,11280
+** Processing line: ~  4940,11300,5200,11280~
 - Inside source: true
 *** True Line Result
-  3080,1340,3080,1460
-** Processing line: ~  3080,1580,3080,1460~
+  4940,11300,5200,11280
+** Processing line: ~  4660,11260,4940,11300~
 - Inside source: true
 *** True Line Result
-  3080,1580,3080,1460
-** Processing line: ~  3080,1700,3080,1580~
+  4660,11260,4940,11300
+** Processing line: ~  4440,11280,4660,11260~
 - Inside source: true
 *** True Line Result
-  3080,1700,3080,1580
-** Processing line: ~  3080,1700,3080,1760~
+  4440,11280,4660,11260
+** Processing line: ~  4260,11280,4440,11280~
 - Inside source: true
 *** True Line Result
-  3080,1700,3080,1760
-** Processing line: ~  3080,1760,3200,1760~
+  4260,11280,4440,11280
+** Processing line: ~  4220,11220,4260,11280~
 - Inside source: true
 *** True Line Result
-  3080,1760,3200,1760
-** Processing line: ~  3200,1760,3320,1760~
+  4220,11220,4260,11280
+** Processing line: ~  4080,11280,4220,11220~
 - Inside source: true
 *** True Line Result
-  3200,1760,3320,1760
-** Processing line: ~  3320,1760,3520,1760~
+  4080,11280,4220,11220
+** Processing line: ~  3980,11420,4080,11280~
 - Inside source: true
 *** True Line Result
-  3320,1760,3520,1760
-** Processing line: ~  3520,1760,3680,1740~
+  3980,11420,4080,11280
+** Processing line: ~  3980,11420,4040,11620~
 - Inside source: true
 *** True Line Result
-  3520,1760,3680,1740
-** Processing line: ~  3680,1740,3780,1700~
+  3980,11420,4040,11620
+** Processing line: ~  4040,11620,4040,11820~
 - Inside source: true
 *** True Line Result
-  3680,1740,3780,1700
-** Processing line: ~  3780,1700,3840,1620~
+  4040,11620,4040,11820
+** Processing line: ~  3980,11960,4040,11820~
 - Inside source: true
 *** True Line Result
-  3780,1700,3840,1620
-** Processing line: ~  3840,1620,3840,1520~
+  3980,11960,4040,11820
+** Processing line: ~  3840,12000,3980,11960~
 - Inside source: true
 *** True Line Result
-  3840,1620,3840,1520
-** Processing line: ~  3840,1520,3840,1420~
+  3840,12000,3980,11960
+** Processing line: ~  3720,11940,3840,12000~
 - Inside source: true
 *** True Line Result
-  3840,1520,3840,1420
-** Processing line: ~  3840,1320,3840,1420~
+  3720,11940,3840,12000
+** Processing line: ~  3680,11800,3720,11940~
 - Inside source: true
 *** True Line Result
-  3840,1320,3840,1420
-** Processing line: ~  3840,1120,3840,1320~
+  3680,11800,3720,11940
+** Processing line: ~  3680,11580,3680,11800~
 - Inside source: true
 *** True Line Result
-  3840,1120,3840,1320
-** Processing line: ~  3840,1120,3840,940~
+  3680,11580,3680,11800
+** Processing line: ~  3680,11360,3680,11580~
 - Inside source: true
 *** True Line Result
-  3840,1120,3840,940
-** Processing line: ~  3840,940,3840,760~
+  3680,11360,3680,11580
+** Processing line: ~  3680,11360,3680,11260~
 - Inside source: true
 *** True Line Result
-  3840,940,3840,760
-** Processing line: ~  3780,600,3840,760~
+  3680,11360,3680,11260
+** Processing line: ~  3680,11080,3680,11260~
 - Inside source: true
 *** True Line Result
-  3780,600,3840,760
-** Processing line: ~  3780,600,3780,440~
+  3680,11080,3680,11260
+** Processing line: ~  3680,11080,3680,10880~
 - Inside source: true
 *** True Line Result
-  3780,600,3780,440
-** Processing line: ~  3780,320,3780,440~
+  3680,11080,3680,10880
+** Processing line: ~  3680,10700,3680,10880~
 - Inside source: true
 *** True Line Result
-  3780,320,3780,440
-** Processing line: ~  3780,320,3780,160~
+  3680,10700,3680,10880
+** Processing line: ~  3680,10700,3680,10620~
 - Inside source: true
 *** True Line Result
-  3780,320,3780,160
-** Processing line: ~  3780,60,3780,160~
+  3680,10700,3680,10620
+** Processing line: ~  3680,10480,3680,10620~
 - Inside source: true
 *** True Line Result
-  3780,60,3780,160
-** Processing line: ~  3780,60,4020,60~
+  3680,10480,3680,10620
+** Processing line: ~  3680,10480,3680,10300~
 - Inside source: true
 *** True Line Result
-  3780,60,4020,60
-** Processing line: ~  4020,60,4260,40~
+  3680,10480,3680,10300
+** Processing line: ~  3680,10300,3680,10100~
 - Inside source: true
 *** True Line Result
-  4020,60,4260,40
-** Processing line: ~  4260,40,4500,40~
+  3680,10300,3680,10100
+** Processing line: ~  3680,10100,3680,9940~
 - Inside source: true
 *** True Line Result
-  4260,40,4500,40
-** Processing line: ~  4500,40,4740,40~
+  3680,10100,3680,9940
+** Processing line: ~  3680,9940,3720,9860~
 - Inside source: true
 *** True Line Result
-  4500,40,4740,40
-** Processing line: ~  4740,40,4840,20~
+  3680,9940,3720,9860
+** Processing line: ~  3720,9860,3920,9900~
 - Inside source: true
 *** True Line Result
-  4740,40,4840,20
-** Processing line: ~  4840,20,4880,80~
+  3720,9860,3920,9900
+** Processing line: ~  3920,9900,4220,9880~
 - Inside source: true
 *** True Line Result
-  4840,20,4880,80
-** Processing line: ~  4880,80,5080,40~
+  3920,9900,4220,9880
+** Processing line: ~  4980,9940,5340,9960~
 - Inside source: true
 *** True Line Result
-  4880,80,5080,40
-** Processing line: ~  5080,40,5280,20~
+  4980,9940,5340,9960
+** Processing line: ~  4220,9880,4540,9900~
 - Inside source: true
 *** True Line Result
-  5080,40,5280,20
-** Processing line: ~  5280,20,5500,0~
+  4220,9880,4540,9900
+** Processing line: ~  4540,9900,4980,9940~
 - Inside source: true
 *** True Line Result
-  5280,20,5500,0
-** Processing line: ~  5500,0,5720,0~
+  4540,9900,4980,9940
+** Processing line: ~  5340,9960,5620,9960~
 - Inside source: true
 *** True Line Result
-  5500,0,5720,0
-** Processing line: ~  5720,0,5940,60~
+  5340,9960,5620,9960
+** Processing line: ~  5620,9960,5900,9960~
 - Inside source: true
 *** True Line Result
-  5720,0,5940,60
-** Processing line: ~  5940,60,6240,60~
+  5620,9960,5900,9960
+** Processing line: ~  5900,9960,6160,10000~
 - Inside source: true
 *** True Line Result
-  5940,60,6240,60
-** Processing line: ~  6240,60,6540,20~
+  5900,9960,6160,10000
+** Processing line: ~  6160,10000,6480,10000~
 - Inside source: true
 *** True Line Result
-  6240,60,6540,20
-** Processing line: ~  6540,20,6840,20~
+  6160,10000,6480,10000
+** Processing line: ~  6480,10000,6720,10000~
 - Inside source: true
 *** True Line Result
-  6540,20,6840,20
-** Processing line: ~  6840,20,7040,0~
+  6480,10000,6720,10000
+** Processing line: ~  6720,10000,6880,9860~
 - Inside source: true
 *** True Line Result
-  6840,20,7040,0
-** Processing line: ~  7040,0,7140,0~
+  6720,10000,6880,9860
+** Processing line: ~  6880,9860,6880,9520~
 - Inside source: true
 *** True Line Result
-  7040,0,7140,0
-** Processing line: ~  7140,0,7400,20~
+  6880,9860,6880,9520
+** Processing line: ~  6880,9520,6940,9340~
 - Inside source: true
 *** True Line Result
-  7140,0,7400,20
-** Processing line: ~  7400,20,7680,0~
+  6880,9520,6940,9340
+** Processing line: ~  6940,9120,6940,9340~
 - Inside source: true
 *** True Line Result
-  7400,20,7680,0
-** Processing line: ~  7680,0,7940,0~
+  6940,9120,6940,9340
+** Processing line: ~  6940,9120,6940,8920~
 - Inside source: true
 *** True Line Result
-  7680,0,7940,0
-** Processing line: ~  7940,0,8200,-20~
+  6940,9120,6940,8920
+** Processing line: ~  6940,8700,6940,8920~
 - Inside source: true
 *** True Line Result
-  7940,0,8200,-20
-** Processing line: ~  8200,-20,8360,20~
+  6940,8700,6940,8920
+** Processing line: ~  6880,8500,6940,8700~
 - Inside source: true
 *** True Line Result
-  8200,-20,8360,20
-** Processing line: ~  8360,20,8560,-40~
+  6880,8500,6940,8700
+** Processing line: ~  6880,8320,6880,8500~
 - Inside source: true
 *** True Line Result
-  8360,20,8560,-40
-** Processing line: ~  8560,-40,8760,0~
+  6880,8320,6880,8500
+** Processing line: ~  7140,8320,7140,8180~
 - Inside source: true
 *** True Line Result
-  8560,-40,8760,0
-** Processing line: ~  8760,0,8880,40~
+  7140,8320,7140,8180
+** Processing line: ~  6760,8260,6880,8320~
 - Inside source: true
 *** True Line Result
-  8760,0,8880,40
-** Processing line: ~  8880,120,8880,40~
+  6760,8260,6880,8320
+** Processing line: ~  6540,8240,6760,8260~
 - Inside source: true
 *** True Line Result
-  8880,120,8880,40
-** Processing line: ~  8840,220,8840,120~
+  6540,8240,6760,8260
+** Processing line: ~  6420,8180,6540,8240~
 - Inside source: true
 *** True Line Result
-  8840,220,8840,120
-** Processing line: ~  8620,240,8840,220~
+  6420,8180,6540,8240
+** Processing line: ~  6280,8240,6420,8180~
 - Inside source: true
 *** True Line Result
-  8620,240,8840,220
-** Processing line: ~  8420,260,8620,240~
+  6280,8240,6420,8180
+** Processing line: ~  6160,8300,6280,8240~
 - Inside source: true
 *** True Line Result
-  8420,260,8620,240
-** Processing line: ~  8200,280,8420,260~
+  6160,8300,6280,8240
+** Processing line: ~  6120,8400,6160,8300~
 - Inside source: true
 *** True Line Result
-  8200,280,8420,260
-** Processing line: ~  7940,280,8200,280~
+  6120,8400,6160,8300
+** Processing line: ~  6080,8520,6120,8400~
 - Inside source: true
 *** True Line Result
-  7940,280,8200,280
-** Processing line: ~  7760,240,7940,280~
+  6080,8520,6120,8400
+** Processing line: ~  5840,8480,6080,8520~
 - Inside source: true
 *** True Line Result
-  7760,240,7940,280
-** Processing line: ~  7560,220,7760,240~
+  5840,8480,6080,8520
+** Processing line: ~  5620,8500,5840,8480~
 - Inside source: true
 *** True Line Result
-  7560,220,7760,240
-** Processing line: ~  7360,280,7560,220~
+  5620,8500,5840,8480
+** Processing line: ~  5500,8500,5620,8500~
 - Inside source: true
 *** True Line Result
-  7360,280,7560,220
-** Processing line: ~  7140,260,7360,280~
+  5500,8500,5620,8500
+** Processing line: ~  5340,8560,5500,8500~
 - Inside source: true
 *** True Line Result
-  7140,260,7360,280
-** Processing line: ~  6940,240,7140,260~
+  5340,8560,5500,8500
+** Processing line: ~  5160,8540,5340,8560~
 - Inside source: true
 *** True Line Result
-  6940,240,7140,260
-** Processing line: ~  6720,220,6940,240~
+  5160,8540,5340,8560
+** Processing line: ~  4620,8520,4880,8520~
 - Inside source: true
 *** True Line Result
-  6720,220,6940,240
-** Processing line: ~  6480,220,6720,220~
+  4620,8520,4880,8520
+** Processing line: ~  4360,8480,4620,8520~
 - Inside source: true
 *** True Line Result
-  6480,220,6720,220
-** Processing line: ~  6360,300,6480,220~
+  4360,8480,4620,8520
+** Processing line: ~  4880,8520,5160,8540~
 - Inside source: true
 *** True Line Result
-  6360,300,6480,220
-** Processing line: ~  6240,300,6360,300~
+  4880,8520,5160,8540
+** Processing line: ~  4140,8440,4360,8480~
 - Inside source: true
 *** True Line Result
-  6240,300,6360,300
-** Processing line: ~  6200,500,6240,300~
+  4140,8440,4360,8480
+** Processing line: ~  3920,8460,4140,8440~
 - Inside source: true
 *** True Line Result
-  6200,500,6240,300
-** Processing line: ~  6200,500,6360,540~
+  3920,8460,4140,8440
+** Processing line: ~  3720,8380,3920,8460~
 - Inside source: true
 *** True Line Result
-  6200,500,6360,540
-** Processing line: ~  6360,540,6540,520~
+  3720,8380,3920,8460
+** Processing line: ~  3680,8160,3720,8380~
 - Inside source: true
 *** True Line Result
-  6360,540,6540,520
-** Processing line: ~  6540,520,6720,480~
+  3680,8160,3720,8380
+** Processing line: ~  3680,8160,3720,7940~
 - Inside source: true
 *** True Line Result
-  6540,520,6720,480
-** Processing line: ~  6720,480,6880,460~
+  3680,8160,3720,7940
+** Processing line: ~  3720,7720,3720,7940~
 - Inside source: true
 *** True Line Result
-  6720,480,6880,460
-** Processing line: ~  6880,460,7080,500~
+  3720,7720,3720,7940
+** Processing line: ~  3680,7580,3720,7720~
 - Inside source: true
 *** True Line Result
-  6880,460,7080,500
-** Processing line: ~  7080,500,7320,500~
+  3680,7580,3720,7720
+** Processing line: ~  3680,7580,3720,7440~
 - Inside source: true
 *** True Line Result
-  7080,500,7320,500
-** Processing line: ~  7320,500,7680,500~
+  3680,7580,3720,7440
+** Processing line: ~  3720,7440,3720,7300~
 - Inside source: true
 *** True Line Result
-  7320,500,7680,500
-** Processing line: ~  7680,620,7680,500~
+  3720,7440,3720,7300
+** Processing line: ~  3720,7160,3720,7300~
 - Inside source: true
 *** True Line Result
-  7680,620,7680,500
-** Processing line: ~  7520,640,7680,620~
+  3720,7160,3720,7300
+** Processing line: ~  3720,7160,3720,7020~
 - Inside source: true
 *** True Line Result
-  7520,640,7680,620
-** Processing line: ~  7360,640,7520,640~
+  3720,7160,3720,7020
+** Processing line: ~  3720,7020,3780,6900~
 - Inside source: true
 *** True Line Result
-  7360,640,7520,640
-** Processing line: ~  7200,640,7360,640~
+  3720,7020,3780,6900
+** Processing line: ~  3780,6900,4080,6940~
 - Inside source: true
 *** True Line Result
-  7200,640,7360,640
-** Processing line: ~  7040,660,7200,640~
+  3780,6900,4080,6940
+** Processing line: ~  4080,6940,4340,6980~
 - Inside source: true
 *** True Line Result
-  7040,660,7200,640
-** Processing line: ~  6880,720,7040,660~
+  4080,6940,4340,6980
+** Processing line: ~  4340,6980,4600,6980~
 - Inside source: true
 *** True Line Result
-  6880,720,7040,660
-** Processing line: ~  6720,700,6880,720~
+  4340,6980,4600,6980
+** Processing line: ~  4600,6980,4880,6980~
 - Inside source: true
 *** True Line Result
-  6720,700,6880,720
-** Processing line: ~  6540,700,6720,700~
+  4600,6980,4880,6980
+** Processing line: ~  4880,6980,5160,6980~
 - Inside source: true
 *** True Line Result
-  6540,700,6720,700
-** Processing line: ~  6420,760,6540,700~
+  4880,6980,5160,6980
+** Processing line: ~  5160,6980,5400,7000~
 - Inside source: true
 *** True Line Result
-  6420,760,6540,700
-** Processing line: ~  6280,740,6420,760~
+  5160,6980,5400,7000
+** Processing line: ~  5400,7000,5560,7020~
 - Inside source: true
 *** True Line Result
-  6280,740,6420,760
-** Processing line: ~  6240,760,6280,740~
+  5400,7000,5560,7020
+** Processing line: ~  5560,7020,5660,7080~
 - Inside source: true
 *** True Line Result
-  6240,760,6280,740
-** Processing line: ~  6200,920,6240,760~
+  5560,7020,5660,7080
+** Processing line: ~  5660,7080,5660,7280~
 - Inside source: true
 *** True Line Result
-  6200,920,6240,760
-** Processing line: ~  6200,920,6360,960~
+  5660,7080,5660,7280
+** Processing line: ~  5660,7280,5660,7440~
 - Inside source: true
 *** True Line Result
-  6200,920,6360,960
-** Processing line: ~  6360,960,6540,960~
+  5660,7280,5660,7440
+** Processing line: ~  5660,7440,5740,7520~
 - Inside source: true
 *** True Line Result
-  6360,960,6540,960
-** Processing line: ~  6540,960,6720,960~
+  5660,7440,5740,7520
+** Processing line: ~  5740,7520,5740,7600~
 - Inside source: true
 *** True Line Result
-  6540,960,6720,960
-** Processing line: ~  6720,960,6760,980~
+  5740,7520,5740,7600
+** Processing line: ~  5740,7600,5900,7600~
 - Inside source: true
 *** True Line Result
-  6720,960,6760,980
-** Processing line: ~  6760,980,6880,940~
+  5740,7600,5900,7600
+** Processing line: ~  5900,7600,6040,7540~
 - Inside source: true
 *** True Line Result
-  6760,980,6880,940
-** Processing line: ~  6880,940,7080,940~
+  5900,7600,6040,7540
+** Processing line: ~  6040,7540,6040,7320~
 - Inside source: true
 *** True Line Result
-  6880,940,7080,940
-** Processing line: ~  7080,940,7280,940~
+  6040,7540,6040,7320
+** Processing line: ~  6040,7320,6120,7200~
 - Inside source: true
 *** True Line Result
-  7080,940,7280,940
-** Processing line: ~  7280,940,7520,920~
+  6040,7320,6120,7200
+** Processing line: ~  6120,7200,6120,7040~
 - Inside source: true
 *** True Line Result
-  7280,940,7520,920
-** Processing line: ~  7520,920,7760,900~
+  6120,7200,6120,7040
+** Processing line: ~  6120,7040,6240,7000~
 - Inside source: true
 *** True Line Result
-  7520,920,7760,900
-** Processing line: ~  7760,900,7980,860~
+  6120,7040,6240,7000
+** Processing line: ~  6240,7000,6480,7060~
 - Inside source: true
 *** True Line Result
-  7760,900,7980,860
-** Processing line: ~  7980,860,8100,880~
+  6240,7000,6480,7060
+** Processing line: ~  6480,7060,6800,7060~
 - Inside source: true
 *** True Line Result
-  7980,860,8100,880
-** Processing line: ~  8100,880,8280,900~
+  6480,7060,6800,7060
+** Processing line: ~  6800,7060,7080,7080~
 - Inside source: true
 *** True Line Result
-  8100,880,8280,900
-** Processing line: ~  8280,900,8500,820~
+  6800,7060,7080,7080
+** Processing line: ~  7080,7080,7320,7100~
 - Inside source: true
 *** True Line Result
-  8280,900,8500,820
-** Processing line: ~  8500,820,8700,820~
+  7080,7080,7320,7100
+** Processing line: ~  7940,7100,7980,6920~
 - Inside source: true
 *** True Line Result
-  8500,820,8700,820
-** Processing line: ~  8700,820,8760,840~
+  7940,7100,7980,6920
+** Processing line: ~  7860,6860,7980,6920~
 - Inside source: true
 *** True Line Result
-  8700,820,8760,840
-** Processing line: ~  8760,960,8760,840~
+  7860,6860,7980,6920
+** Processing line: ~  7640,6860,7860,6860~
 - Inside source: true
 *** True Line Result
-  8760,960,8760,840
-** Processing line: ~  8700,1040,8760,960~
+  7640,6860,7860,6860
+** Processing line: ~  7400,6840,7640,6860~
 - Inside source: true
 *** True Line Result
-  8700,1040,8760,960
-** Processing line: ~  8560,1060,8700,1040~
+  7400,6840,7640,6860
+** Processing line: ~  7320,7100,7560,7120~
 - Inside source: true
 *** True Line Result
-  8560,1060,8700,1040
-** Processing line: ~  8460,1080,8560,1060~
+  7320,7100,7560,7120
+** Processing line: ~  7560,7120,7760,7120~
 - Inside source: true
 *** True Line Result
-  8460,1080,8560,1060
-** Processing line: ~  8360,1040,8460,1080~
+  7560,7120,7760,7120
+** Processing line: ~  7760,7120,7940,7100~
 - Inside source: true
 *** True Line Result
-  8360,1040,8460,1080
-** Processing line: ~  8280,1080,8360,1040~
+  7760,7120,7940,7100
+** Processing line: ~  7200,6820,7400,6840~
 - Inside source: true
 *** True Line Result
-  8280,1080,8360,1040
-** Processing line: ~  8160,1120,8280,1080~
+  7200,6820,7400,6840
+** Processing line: ~  7040,6820,7200,6820~
 - Inside source: true
 *** True Line Result
-  8160,1120,8280,1080
-** Processing line: ~  8040,1120,8160,1120~
+  7040,6820,7200,6820
+** Processing line: ~  6600,6840,6840,6840~
 - Inside source: true
 *** True Line Result
-  8040,1120,8160,1120
-** Processing line: ~  7940,1100,8040,1120~
+  6600,6840,6840,6840
+** Processing line: ~  6380,6800,6600,6840~
 - Inside source: true
 *** True Line Result
-  7940,1100,8040,1120
-** Processing line: ~  7800,1120,7940,1100~
+  6380,6800,6600,6840
+** Processing line: ~  6120,6800,6380,6800~
 - Inside source: true
 *** True Line Result
-  7800,1120,7940,1100
-** Processing line: ~  7680,1120,7800,1120~
+  6120,6800,6380,6800
+** Processing line: ~  5900,6840,6120,6800~
 - Inside source: true
 *** True Line Result
-  7680,1120,7800,1120
-** Processing line: ~  7520,1100,7680,1120~
+  5900,6840,6120,6800
+** Processing line: ~  5620,6820,5900,6840~
 - Inside source: true
 *** True Line Result
-  7520,1100,7680,1120
-** Processing line: ~  7360,1100,7520,1100~
+  5620,6820,5900,6840
+** Processing line: ~  5400,6800,5620,6820~
 - Inside source: true
 *** True Line Result
-  7360,1100,7520,1100
-** Processing line: ~  7200,1120,7360,1100~
+  5400,6800,5620,6820
+** Processing line: ~  5140,6800,5400,6800~
 - Inside source: true
 *** True Line Result
-  7200,1120,7360,1100
-** Processing line: ~  7040,1180,7200,1120~
+  5140,6800,5400,6800
+** Processing line: ~  4880,6780,5140,6800~
 - Inside source: true
 *** True Line Result
-  7040,1180,7200,1120
-** Processing line: ~  6880,1160,7040,1180~
+  4880,6780,5140,6800
+** Processing line: ~  4600,6760,4880,6780~
 - Inside source: true
 *** True Line Result
-  6880,1160,7040,1180
-** Processing line: ~  6720,1160,6880,1160~
+  4600,6760,4880,6780
+** Processing line: ~  4340,6760,4600,6760~
 - Inside source: true
 *** True Line Result
-  6720,1160,6880,1160
-** Processing line: ~  6540,1160,6720,1160~
+  4340,6760,4600,6760
+** Processing line: ~  4080,6760,4340,6760~
 - Inside source: true
 *** True Line Result
-  6540,1160,6720,1160
-** Processing line: ~  6360,1160,6540,1160~
+  4080,6760,4340,6760
+** Processing line: ~  3840,6740,4080,6760~
 - Inside source: true
 *** True Line Result
-  6360,1160,6540,1160
-** Processing line: ~  6200,1160,6360,1160~
+  3840,6740,4080,6760
+** Processing line: ~  3680,6720,3840,6740~
 - Inside source: true
 *** True Line Result
-  6200,1160,6360,1160
-** Processing line: ~  6040,1220,6200,1160~
+  3680,6720,3840,6740
+** Processing line: ~  3680,6720,3680,6560~
 - Inside source: true
 *** True Line Result
-  6040,1220,6200,1160
-** Processing line: ~  6040,1220,6040,1400~
+  3680,6720,3680,6560
+** Processing line: ~  3680,6560,3720,6400~
 - Inside source: true
 *** True Line Result
-  6040,1220,6040,1400
-** Processing line: ~  6040,1400,6200,1440~
+  3680,6560,3720,6400
+** Processing line: ~  3720,6400,3720,6200~
 - Inside source: true
 *** True Line Result
-  6040,1400,6200,1440
-** Processing line: ~  6200,1440,6320,1440~
+  3720,6400,3720,6200
+** Processing line: ~  3720,6200,3780,6000~
 - Inside source: true
 *** True Line Result
-  6200,1440,6320,1440
-** Processing line: ~  6320,1440,6440,1440~
+  3720,6200,3780,6000
+** Processing line: ~  3720,5780,3780,6000~
 - Inside source: true
 *** True Line Result
-  6320,1440,6440,1440
-** Processing line: ~  6600,1440,6760,1440~
+  3720,5780,3780,6000
+** Processing line: ~  3720,5580,3720,5780~
 - Inside source: true
 *** True Line Result
-  6600,1440,6760,1440
-** Processing line: ~  6760,1440,6940,1420~
+  3720,5580,3720,5780
+** Processing line: ~  3720,5360,3720,5580~
 - Inside source: true
 *** True Line Result
-  6760,1440,6940,1420
-** Processing line: ~  6440,1440,6600,1440~
+  3720,5360,3720,5580
+** Processing line: ~  3720,5360,3840,5240~
 - Inside source: true
 *** True Line Result
-  6440,1440,6600,1440
-** Processing line: ~  6940,1420,7280,1400~
+  3720,5360,3840,5240
+** Processing line: ~  3840,5240,4200,5260~
 - Inside source: true
 *** True Line Result
-  6940,1420,7280,1400
-** Processing line: ~  7280,1400,7560,1400~
+  3840,5240,4200,5260
+** Processing line: ~  4200,5260,4600,5280~
 - Inside source: true
 *** True Line Result
-  7280,1400,7560,1400
-** Processing line: ~  7560,1400,7760,1400~
+  4200,5260,4600,5280
+** Processing line: ~  4600,5280,4880,5280~
 - Inside source: true
 *** True Line Result
-  7560,1400,7760,1400
-** Processing line: ~  7760,1400,7940,1360~
+  4600,5280,4880,5280
+** Processing line: ~  4880,5280,5140,5200~
 - Inside source: true
 *** True Line Result
-  7760,1400,7940,1360
-** Processing line: ~  7940,1360,8100,1380~
+  4880,5280,5140,5200
+** Processing line: ~  5140,5200,5220,5100~
 - Inside source: true
 *** True Line Result
-  7940,1360,8100,1380
-** Processing line: ~  8100,1380,8280,1340~
+  5140,5200,5220,5100
+** Processing line: ~  5220,5100,5280,4900~
 - Inside source: true
 *** True Line Result
-  8100,1380,8280,1340
-** Processing line: ~  8280,1340,8460,1320~
+  5220,5100,5280,4900
+** Processing line: ~  5280,4900,5340,4840~
 - Inside source: true
 *** True Line Result
-  8280,1340,8460,1320
-** Processing line: ~  8660,1300,8760,1360~
+  5280,4900,5340,4840
+** Processing line: ~  5340,4840,5720,4880~
 - Inside source: true
 *** True Line Result
-  8660,1300,8760,1360
-** Processing line: ~  8460,1320,8660,1300~
+  5340,4840,5720,4880
+** Processing line: ~  6120,4880,6480,4860~
 - Inside source: true
 *** True Line Result
-  8460,1320,8660,1300
-** Processing line: ~  8760,1360,8800,1500~
+  6120,4880,6480,4860
+** Processing line: ~  6880,4840,7200,4860~
 - Inside source: true
 *** True Line Result
-  8760,1360,8800,1500
-** Processing line: ~  8800,1660,8800,1500~
+  6880,4840,7200,4860
+** Processing line: ~  6480,4860,6880,4840~
 - Inside source: true
 *** True Line Result
-  8800,1660,8800,1500
-** Processing line: ~  8800,1660,8800,1820~
+  6480,4860,6880,4840
+** Processing line: ~  7200,4860,7320,4860~
 - Inside source: true
 *** True Line Result
-  8800,1660,8800,1820
-** Processing line: ~  8700,1840,8800,1820~
+  7200,4860,7320,4860
+** Processing line: ~  7320,4860,7360,4740~
 - Inside source: true
 *** True Line Result
-  8700,1840,8800,1820
-** Processing line: ~  8620,1860,8700,1840~
+  7320,4860,7360,4740
+** Processing line: ~  7360,4600,7440,4520~
 - Inside source: true
 *** True Line Result
-  8620,1860,8700,1840
-** Processing line: ~  8560,1800,8620,1860~
+  7360,4600,7440,4520
+** Processing line: ~  7360,4600,7360,4740~
 - Inside source: true
 *** True Line Result
-  8560,1800,8620,1860
-** Processing line: ~  8560,1800,8620,1680~
+  7360,4600,7360,4740
+** Processing line: ~  7440,4520,7640,4520~
 - Inside source: true
 *** True Line Result
-  8560,1800,8620,1680
-** Processing line: ~  8500,1640,8620,1680~
+  7440,4520,7640,4520
+** Processing line: ~  7640,4520,7800,4480~
 - Inside source: true
 *** True Line Result
-  8500,1640,8620,1680
-** Processing line: ~  8420,1680,8500,1640~
+  7640,4520,7800,4480
+** Processing line: ~  7800,4480,7800,4280~
 - Inside source: true
 *** True Line Result
-  8420,1680,8500,1640
-** Processing line: ~  8280,1680,8420,1680~
+  7800,4480,7800,4280
+** Processing line: ~  7800,4280,7800,4040~
 - Inside source: true
 *** True Line Result
-  8280,1680,8420,1680
-** Processing line: ~  8160,1680,8280,1680~
+  7800,4280,7800,4040
+** Processing line: ~  7800,4040,7800,3780~
 - Inside source: true
 *** True Line Result
-  8160,1680,8280,1680
-** Processing line: ~  7900,1680,8160,1680~
+  7800,4040,7800,3780
+** Processing line: ~  7800,3560,7800,3780~
 - Inside source: true
 *** True Line Result
-  7900,1680,8160,1680
-** Processing line: ~  7680,1680,7900,1680~
+  7800,3560,7800,3780
+** Processing line: ~  7800,3560,7860,3440~
 - Inside source: true
 *** True Line Result
-  7680,1680,7900,1680
-** Processing line: ~  7400,1660,7680,1680~
+  7800,3560,7860,3440
+** Processing line: ~  7860,3440,8060,3460~
 - Inside source: true
 *** True Line Result
-  7400,1660,7680,1680
-** Processing line: ~  7140,1680,7400,1660~
+  7860,3440,8060,3460
+** Processing line: ~  8060,3460,8160,3340~
 - Inside source: true
 *** True Line Result
-  7140,1680,7400,1660
-** Processing line: ~  6880,1640,7140,1680~
+  8060,3460,8160,3340
+** Processing line: ~  8160,3340,8160,3140~
 - Inside source: true
 *** True Line Result
-  6880,1640,7140,1680
-** Processing line: ~  6040,1820,6320,1780~
+  8160,3340,8160,3140
+** Processing line: ~  8160,3140,8160,2960~
 - Inside source: true
 *** True Line Result
-  6040,1820,6320,1780
-** Processing line: ~  5900,1840,6040,1820~
+  8160,3140,8160,2960
+** Processing line: ~  8000,2900,8160,2960~
 - Inside source: true
 *** True Line Result
-  5900,1840,6040,1820
-** Processing line: ~  6640,1700,6880,1640~
+  8000,2900,8160,2960
+** Processing line: ~  7860,2900,8000,2900~
 - Inside source: true
 *** True Line Result
-  6640,1700,6880,1640
-** Processing line: ~  6320,1780,6640,1700~
+  7860,2900,8000,2900
+** Processing line: ~  7640,2940,7860,2900~
 - Inside source: true
 *** True Line Result
-  6320,1780,6640,1700
-** Processing line: ~  5840,2040,5900,1840~
+  7640,2940,7860,2900
+** Processing line: ~  7400,2980,7640,2940~
 - Inside source: true
 *** True Line Result
-  5840,2040,5900,1840
-** Processing line: ~  5840,2040,5840,2220~
+  7400,2980,7640,2940
+** Processing line: ~  7100,2980,7400,2980~
 - Inside source: true
 *** True Line Result
-  5840,2040,5840,2220
-** Processing line: ~  5840,2220,5840,2320~
+  7100,2980,7400,2980
+** Processing line: ~  6840,3000,7100,2980~
 - Inside source: true
 *** True Line Result
-  5840,2220,5840,2320
-** Processing line: ~  5840,2460,5840,2320~
+  6840,3000,7100,2980
+** Processing line: ~  5620,2980,5840,2980~
 - Inside source: true
 *** True Line Result
-  5840,2460,5840,2320
-** Processing line: ~  5840,2560,5840,2460~
+  5620,2980,5840,2980
+** Processing line: ~  5840,2980,6500,3000~
 - Inside source: true
 *** True Line Result
-  5840,2560,5840,2460
-** Processing line: ~  5840,2560,5960,2620~
+  5840,2980,6500,3000
+** Processing line: ~  6500,3000,6840,3000~
 - Inside source: true
 *** True Line Result
-  5840,2560,5960,2620
-** Processing line: ~  5960,2620,6200,2620~
+  6500,3000,6840,3000
+** Processing line: ~  5560,2780,5620,2980~
 - Inside source: true
 *** True Line Result
-  5960,2620,6200,2620
-** Processing line: ~  6200,2620,6380,2600~
+  5560,2780,5620,2980
+** Processing line: ~  5560,2780,5560,2580~
 - Inside source: true
 *** True Line Result
-  6200,2620,6380,2600
-** Processing line: ~  6380,2600,6600,2580~
+  5560,2780,5560,2580
+** Processing line: ~  5560,2580,5560,2380~
 - Inside source: true
 *** True Line Result
-  6380,2600,6600,2580
-** Processing line: ~  6600,2580,6800,2600~
+  5560,2580,5560,2380
+** Processing line: ~  5560,2140,5560,2380~
 - Inside source: true
 *** True Line Result
-  6600,2580,6800,2600
-** Processing line: ~  6800,2600,7040,2580~
+  5560,2140,5560,2380
+** Processing line: ~  5560,2140,5560,1900~
 - Inside source: true
 *** True Line Result
-  6800,2600,7040,2580
-** Processing line: ~  7040,2580,7280,2580~
+  5560,2140,5560,1900
+** Processing line: ~  5560,1900,5620,1660~
 - Inside source: true
 *** True Line Result
-  7040,2580,7280,2580
-** Processing line: ~  7280,2580,7480,2560~
+  5560,1900,5620,1660
+** Processing line: ~  5620,1660,5660,1460~
 - Inside source: true
 *** True Line Result
-  7280,2580,7480,2560
-** Processing line: ~  7760,2540,7980,2520~
+  5620,1660,5660,1460
+** Processing line: ~  5660,1460,5660,1300~
 - Inside source: true
 *** True Line Result
-  7760,2540,7980,2520
-** Processing line: ~  7980,2520,8160,2500~
+  5660,1460,5660,1300
+** Processing line: ~  5500,1260,5660,1300~
 - Inside source: true
 *** True Line Result
-  7980,2520,8160,2500
-** Processing line: ~  7480,2560,7760,2540~
+  5500,1260,5660,1300
+** Processing line: ~  5340,1260,5500,1260~
 - Inside source: true
 *** True Line Result
-  7480,2560,7760,2540
-** Processing line: ~  8160,2500,8160,2420~
+  5340,1260,5500,1260
+** Processing line: ~  4600,1220,4840,1240~
 - Inside source: true
 *** True Line Result
-  8160,2500,8160,2420
-** Processing line: ~  8160,2420,8160,2320~
+  4600,1220,4840,1240
+** Processing line: ~  4440,1220,4600,1220~
 - Inside source: true
 *** True Line Result
-  8160,2420,8160,2320
-** Processing line: ~  8160,2180,8160,2320~
+  4440,1220,4600,1220
+** Processing line: ~  4440,1080,4440,1220~
 - Inside source: true
 *** True Line Result
-  8160,2180,8160,2320
-** Processing line: ~  7980,2160,8160,2180~
+  4440,1080,4440,1220
+** Processing line: ~  4440,1080,4600,1020~
 - Inside source: true
 *** True Line Result
-  7980,2160,8160,2180
-** Processing line: ~  7800,2180,7980,2160~
+  4440,1080,4600,1020
+** Processing line: ~  5080,1260,5340,1260~
 - Inside source: true
 *** True Line Result
-  7800,2180,7980,2160
-** Processing line: ~  7600,2200,7800,2180~
+  5080,1260,5340,1260
+** Processing line: ~  4840,1240,5080,1260~
 - Inside source: true
 *** True Line Result
-  7600,2200,7800,2180
-** Processing line: ~  7400,2200,7600,2200~
+  4840,1240,5080,1260
+** Processing line: ~  4600,1020,4940,1020~
 - Inside source: true
 *** True Line Result
-  7400,2200,7600,2200
-** Processing line: ~  6960,2200,7200,2200~
+  4600,1020,4940,1020
+** Processing line: ~  4940,1020,5220,1020~
 - Inside source: true
 *** True Line Result
-  6960,2200,7200,2200
-** Processing line: ~  7200,2200,7400,2200~
+  4940,1020,5220,1020
+** Processing line: ~  5220,1020,5560,960~
 - Inside source: true
 *** True Line Result
-  7200,2200,7400,2200
-** Processing line: ~  6720,2200,6960,2200~
+  5220,1020,5560,960
+** Processing line: ~  5560,960,5660,860~
 - Inside source: true
 *** True Line Result
-  6720,2200,6960,2200
-** Processing line: ~  6540,2180,6720,2200~
+  5560,960,5660,860
+** Processing line: ~  5660,740,5660,860~
 - Inside source: true
 *** True Line Result
-  6540,2180,6720,2200
-** Processing line: ~  6320,2200,6540,2180~
+  5660,740,5660,860
+** Processing line: ~  5280,740,5660,740~
 - Inside source: true
 *** True Line Result
-  6320,2200,6540,2180
-** Processing line: ~  6240,2160,6320,2200~
+  5280,740,5660,740
+** Processing line: ~  4940,780,5280,740~
 - Inside source: true
 *** True Line Result
-  6240,2160,6320,2200
-** Processing line: ~  6240,2160,6240,2040~
+  4940,780,5280,740
+** Processing line: ~  4660,760,4940,780~
 - Inside source: true
 *** True Line Result
-  6240,2160,6240,2040
-** Processing line: ~  6240,2040,6240,1940~
+  4660,760,4940,780
+** Processing line: ~  4500,700,4660,760~
 - Inside source: true
 *** True Line Result
-  6240,2040,6240,1940
-** Processing line: ~  6240,1940,6440,1940~
+  4500,700,4660,760
+** Processing line: ~  4500,520,4500,700~
 - Inside source: true
 *** True Line Result
-  6240,1940,6440,1940
-** Processing line: ~  6440,1940,6720,1940~
+  4500,520,4500,700
+** Processing line: ~  4500,520,4700,460~
 - Inside source: true
 *** True Line Result
-  6440,1940,6720,1940
-** Processing line: ~  6720,1940,6940,1920~
+  4500,520,4700,460
+** Processing line: ~  4700,460,5080,440~
 - Inside source: true
 *** True Line Result
-  6720,1940,6940,1920
-** Processing line: ~  7520,1920,7760,1920~
+  4700,460,5080,440
+** Processing line: ~  5440,420,5740,420~
 - Inside source: true
 *** True Line Result
-  7520,1920,7760,1920
-** Processing line: ~  6940,1920,7280,1920~
+  5440,420,5740,420
+** Processing line: ~  5080,440,5440,420~
 - Inside source: true
 *** True Line Result
-  6940,1920,7280,1920
-** Processing line: ~  7280,1920,7520,1920~
+  5080,440,5440,420
+** Processing line: ~  5740,420,5840,360~
 - Inside source: true
 *** True Line Result
-  7280,1920,7520,1920
-** Processing line: ~  7760,1920,8100,1900~
+  5740,420,5840,360
+** Processing line: ~  5800,280,5840,360~
 - Inside source: true
 *** True Line Result
-  7760,1920,8100,1900
-** Processing line: ~  8100,1900,8420,1900~
+  5800,280,5840,360
+** Processing line: ~  5560,280,5800,280~
 - Inside source: true
 *** True Line Result
-  8100,1900,8420,1900
-** Processing line: ~  8420,1900,8460,1940~
+  5560,280,5800,280
+** Processing line: ~  4980,300,5280,320~
 - Inside source: true
 *** True Line Result
-  8420,1900,8460,1940
-** Processing line: ~  8460,2120,8460,1940~
+  4980,300,5280,320
+** Processing line: ~  4360,320,4660,300~
 - Inside source: true
 *** True Line Result
-  8460,2120,8460,1940
-** Processing line: ~  8460,2280,8460,2120~
+  4360,320,4660,300
+** Processing line: ~  4200,360,4360,320~
 - Inside source: true
 *** True Line Result
-  8460,2280,8460,2120
-** Processing line: ~  8460,2280,8560,2420~
+  4200,360,4360,320
+** Processing line: ~  5280,320,5560,280~
 - Inside source: true
 *** True Line Result
-  8460,2280,8560,2420
-** Processing line: ~  8560,2420,8660,2380~
+  5280,320,5560,280
+** Processing line: ~  4660,300,4980,300~
 - Inside source: true
 *** True Line Result
-  8560,2420,8660,2380
-** Processing line: ~  8660,2380,8800,2340~
+  4660,300,4980,300
+** Processing line: ~  4140,480,4200,360~
 - Inside source: true
 *** True Line Result
-  8660,2380,8800,2340
-** Processing line: ~  8800,2340,8840,2400~
+  4140,480,4200,360
+** Processing line: ~  4140,480,4140,640~
 - Inside source: true
 *** True Line Result
-  8800,2340,8840,2400
-** Processing line: ~  8840,2520,8840,2400~
+  4140,480,4140,640
+** Processing line: ~  4140,640,4200,780~
 - Inside source: true
 *** True Line Result
-  8840,2520,8840,2400
-** Processing line: ~  8800,2620,8840,2520~
+  4140,640,4200,780
+** Processing line: ~  4200,780,4200,980~
 - Inside source: true
 *** True Line Result
-  8800,2620,8840,2520
-** Processing line: ~  8800,2740,8800,2620~
+  4200,780,4200,980
+** Processing line: ~  4200,980,4220,1180~
 - Inside source: true
 *** True Line Result
-  8800,2740,8800,2620
-** Processing line: ~  8800,2860,8800,2740~
+  4200,980,4220,1180
+** Processing line: ~  4220,1400,4220,1180~
 - Inside source: true
 *** True Line Result
-  8800,2860,8800,2740
-** Processing line: ~  8800,2940,8800,2860~
+  4220,1400,4220,1180
+** Processing line: ~  4220,1400,4260,1540~
 - Inside source: true
 *** True Line Result
-  8800,2940,8800,2860
-** Processing line: ~  8760,2980,8800,2940~
+  4220,1400,4260,1540
+** Processing line: ~  4260,1540,4500,1540~
 - Inside source: true
 *** True Line Result
-  8760,2980,8800,2940
-** Processing line: ~  8660,2980,8760,2980~
+  4260,1540,4500,1540
+** Processing line: ~  4500,1540,4700,1520~
 - Inside source: true
 *** True Line Result
-  8660,2980,8760,2980
-** Processing line: ~  8620,2960,8660,2980~
+  4500,1540,4700,1520
+** Processing line: ~  4700,1520,4980,1540~
 - Inside source: true
 *** True Line Result
-  8620,2960,8660,2980
-** Processing line: ~  8560,2880,8620,2960~
+  4700,1520,4980,1540
+** Processing line: ~  5280,1560,5400,1560~
 - Inside source: true
 *** True Line Result
-  8560,2880,8620,2960
-** Processing line: ~  8560,2880,8560,2780~
+  5280,1560,5400,1560
+** Processing line: ~  4980,1540,5280,1560~
 - Inside source: true
 *** True Line Result
-  8560,2880,8560,2780
-** Processing line: ~  8500,2740,8560,2780~
+  4980,1540,5280,1560
+** Processing line: ~  5400,1560,5400,1700~
 - Inside source: true
 *** True Line Result
-  8500,2740,8560,2780
-** Processing line: ~  8420,2760,8500,2740~
+  5400,1560,5400,1700
+** Processing line: ~  5400,1780,5400,1700~
 - Inside source: true
 *** True Line Result
-  8420,2760,8500,2740
-** Processing line: ~  8420,2840,8420,2760~
+  5400,1780,5400,1700
+** Processing line: ~  5340,1900,5400,1780~
 - Inside source: true
 *** True Line Result
-  8420,2840,8420,2760
-** Processing line: ~  8420,2840,8420,2940~
+  5340,1900,5400,1780
+** Processing line: ~  5340,2020,5340,1900~
 - Inside source: true
 *** True Line Result
-  8420,2840,8420,2940
-** Processing line: ~  8420,3040,8420,2940~
+  5340,2020,5340,1900
+** Processing line: ~  5340,2220,5340,2020~
 - Inside source: true
 *** True Line Result
-  8420,3040,8420,2940
-** Processing line: ~  8420,3160,8420,3040~
+  5340,2220,5340,2020
+** Processing line: ~  5340,2220,5340,2420~
 - Inside source: true
 *** True Line Result
-  8420,3160,8420,3040
-** Processing line: ~  8420,3280,8420,3380~
+  5340,2220,5340,2420
+** Processing line: ~  5340,2420,5340,2520~
 - Inside source: true
 *** True Line Result
-  8420,3280,8420,3380
-** Processing line: ~  8420,3280,8420,3160~
+  5340,2420,5340,2520
+** Processing line: ~  5080,2600,5220,2580~
 - Inside source: true
 *** True Line Result
-  8420,3280,8420,3160
-** Processing line: ~  8420,3380,8620,3460~
+  5080,2600,5220,2580
+** Processing line: ~  5220,2580,5340,2520~
 - Inside source: true
 *** True Line Result
-  8420,3380,8620,3460
-** Processing line: ~  8620,3460,8760,3460~
+  5220,2580,5340,2520
+** Processing line: ~  4900,2580,5080,2600~
 - Inside source: true
 *** True Line Result
-  8620,3460,8760,3460
-** Processing line: ~  8760,3460,8840,3400~
+  4900,2580,5080,2600
+** Processing line: ~  4700,2540,4900,2580~
 - Inside source: true
 *** True Line Result
-  8760,3460,8840,3400
-** Processing line: ~  8840,3400,8960,3400~
+  4700,2540,4900,2580
+** Processing line: ~  4500,2540,4700,2540~
 - Inside source: true
 *** True Line Result
-  8840,3400,8960,3400
-** Processing line: ~  8960,3400,9000,3500~
+  4500,2540,4700,2540
+** Processing line: ~  4220,2580,4340,2540~
 - Inside source: true
 *** True Line Result
-  8960,3400,9000,3500
-** Processing line: ~  9000,3700,9000,3500~
+  4220,2580,4340,2540
+** Processing line: ~  4200,2700,4220,2580~
 - Inside source: true
 *** True Line Result
-  9000,3700,9000,3500
-** Processing line: ~  9000,3900,9000,3700~
+  4200,2700,4220,2580
+** Processing line: ~  4340,2540,4500,2540~
 - Inside source: true
 *** True Line Result
-  9000,3900,9000,3700
-** Processing line: ~  9000,4080,9000,3900~
+  4340,2540,4500,2540
+** Processing line: ~  3980,2740,4200,2700~
 - Inside source: true
 *** True Line Result
-  9000,4080,9000,3900
-** Processing line: ~  9000,4280,9000,4080~
+  3980,2740,4200,2700
+** Processing line: ~  3840,2740,3980,2740~
 - Inside source: true
 *** True Line Result
-  9000,4280,9000,4080
-** Processing line: ~  9000,4500,9000,4280~
+  3840,2740,3980,2740
+** Processing line: ~  3780,2640,3840,2740~
 - Inside source: true
 *** True Line Result
-  9000,4500,9000,4280
-** Processing line: ~  9000,4620,9000,4500~
+  3780,2640,3840,2740
+** Processing line: ~  3780,2640,3780,2460~
 - Inside source: true
 *** True Line Result
-  9000,4620,9000,4500
-** Processing line: ~  9000,4780,9000,4620~
+  3780,2640,3780,2460
+** Processing line: ~  3780,2280,3780,2460~
 - Inside source: true
 *** True Line Result
-  9000,4780,9000,4620
-** Processing line: ~  9000,4780,9000,4960~
+  3780,2280,3780,2460
+** Processing line: ~  3620,2020,3780,2100~
 - Inside source: true
 *** True Line Result
-  9000,4780,9000,4960
-** Processing line: ~  9000,5120,9000,4960~
+  3620,2020,3780,2100
+** Processing line: ~  3780,2280,3780,2100~
 - Inside source: true
 *** True Line Result
-  9000,5120,9000,4960
-** Processing line: ~  9000,5120,9000,5300~
+  3780,2280,3780,2100
+** Processing line: ~  3360,2040,3620,2020~
 - Inside source: true
 *** True Line Result
-  9000,5120,9000,5300
-** Processing line: ~  8960,5460,9000,5300~
+  3360,2040,3620,2020
+** Processing line: ~  3080,2040,3360,2040~
 - Inside source: true
 *** True Line Result
-  8960,5460,9000,5300
-** Processing line: ~  8920,5620,8960,5460~
+  3080,2040,3360,2040
+** Processing line: ~  2840,2020,3080,2040~
 - Inside source: true
 *** True Line Result
-  8920,5620,8960,5460
-** Processing line: ~  8920,5620,8920,5800~
+  2840,2020,3080,2040
+** Processing line: ~  2740,1940,2840,2020~
 - Inside source: true
 *** True Line Result
-  8920,5620,8920,5800
-** Processing line: ~  8920,5800,8920,5960~
+  2740,1940,2840,2020
+** Processing line: ~  2740,1940,2800,1800~
 - Inside source: true
 *** True Line Result
-  8920,5800,8920,5960
-** Processing line: ~  8920,5960,8920,6120~
+  2740,1940,2800,1800
+** Processing line: ~  2800,1640,2800,1800~
 - Inside source: true
 *** True Line Result
-  8920,5960,8920,6120
-** Processing line: ~  8920,6120,8960,6300~
+  2800,1640,2800,1800
+** Processing line: ~  2800,1640,2800,1460~
 - Inside source: true
 *** True Line Result
-  8920,6120,8960,6300
-** Processing line: ~  8960,6300,8960,6480~
+  2800,1640,2800,1460
+** Processing line: ~  2800,1300,2800,1460~
 - Inside source: true
 *** True Line Result
-  8960,6300,8960,6480
-** Processing line: ~  8960,6660,8960,6480~
+  2800,1300,2800,1460
+** Processing line: ~  2700,1180,2800,1300~
 - Inside source: true
 *** True Line Result
-  8960,6660,8960,6480
-** Processing line: ~  8960,6860,8960,6660~
+  2700,1180,2800,1300
+** Processing line: ~  2480,1140,2700,1180~
 - Inside source: true
 *** True Line Result
-  8960,6860,8960,6660
-** Processing line: ~  8960,7040,8960,6860~
+  2480,1140,2700,1180
+** Processing line: ~  1580,1200,1720,1200~
 - Inside source: true
 *** True Line Result
-  8960,7040,8960,6860
-** Processing line: ~  8920,7420,8920,7220~
+  1580,1200,1720,1200
+** Processing line: ~  2240,1180,2480,1140~
 - Inside source: true
 *** True Line Result
-  8920,7420,8920,7220
-** Processing line: ~  8920,7420,8960,7620~
+  2240,1180,2480,1140
+** Processing line: ~  1960,1180,2240,1180~
 - Inside source: true
 *** True Line Result
-  8920,7420,8960,7620
-** Processing line: ~  8960,7620,8960,7800~
+  1960,1180,2240,1180
+** Processing line: ~  1720,1200,1960,1180~
 - Inside source: true
 *** True Line Result
-  8960,7620,8960,7800
-** Processing line: ~  8960,7800,8960,8000~
+  1720,1200,1960,1180
+** Processing line: ~  1500,1320,1580,1200~
 - Inside source: true
 *** True Line Result
-  8960,7800,8960,8000
-** Processing line: ~  8960,8000,8960,8180~
+  1500,1320,1580,1200
+** Processing line: ~  1500,1440,1500,1320~
 - Inside source: true
 *** True Line Result
-  8960,8000,8960,8180
-** Processing line: ~  8960,8180,8960,8380~
+  1500,1440,1500,1320
+** Processing line: ~  1500,1440,1760,1480~
 - Inside source: true
 *** True Line Result
-  8960,8180,8960,8380
-** Processing line: ~  8960,8580,8960,8380~
+  1500,1440,1760,1480
+** Processing line: ~  1760,1480,1940,1480~
 - Inside source: true
 *** True Line Result
-  8960,8580,8960,8380
-** Processing line: ~  8920,8800,8960,8580~
+  1760,1480,1940,1480
+** Processing line: ~  1940,1480,2140,1500~
 - Inside source: true
 *** True Line Result
-  8920,8800,8960,8580
-** Processing line: ~  8880,9000,8920,8800~
+  1940,1480,2140,1500
+** Processing line: ~  2140,1500,2320,1520~
 - Inside source: true
 *** True Line Result
-  8880,9000,8920,8800
-** Processing line: ~  8840,9180,8880,9000~
+  2140,1500,2320,1520
+** Processing line: ~  2400,1560,2400,1700~
 - Inside source: true
 *** True Line Result
-  8840,9180,8880,9000
-** Processing line: ~  8800,9220,8840,9180~
+  2400,1560,2400,1700
+** Processing line: ~  2280,1820,2380,1780~
 - Inside source: true
 *** True Line Result
-  8800,9220,8840,9180
-** Processing line: ~  8800,9220,8840,9340~
+  2280,1820,2380,1780
+** Processing line: ~  2320,1520,2400,1560~
 - Inside source: true
 *** True Line Result
-  8800,9220,8840,9340
-** Processing line: ~  8760,9380,8840,9340~
+  2320,1520,2400,1560
+** Processing line: ~  2380,1780,2400,1700~
 - Inside source: true
 *** True Line Result
-  8760,9380,8840,9340
-** Processing line: ~  8560,9340,8760,9380~
+  2380,1780,2400,1700
+** Processing line: ~  2080,1840,2280,1820~
 - Inside source: true
 *** True Line Result
-  8560,9340,8760,9380
-** Processing line: ~  8360,9360,8560,9340~
+  2080,1840,2280,1820
+** Processing line: ~  1720,1820,2080,1840~
 - Inside source: true
 *** True Line Result
-  8360,9360,8560,9340
-** Processing line: ~  8160,9360,8360,9360~
+  1720,1820,2080,1840
+** Processing line: ~  1420,1800,1720,1820~
 - Inside source: true
 *** True Line Result
-  8160,9360,8360,9360
-** Processing line: ~  8040,9340,8160,9360~
+  1420,1800,1720,1820
+** Processing line: ~  1280,1800,1420,1800~
 - Inside source: true
 *** True Line Result
-  8040,9340,8160,9360
-** Processing line: ~  7860,9360,8040,9340~
+  1280,1800,1420,1800
+** Processing line: ~  1240,1720,1280,1800~
 - Inside source: true
 *** True Line Result
-  7860,9360,8040,9340
-** Processing line: ~  7680,9360,7860,9360~
+  1240,1720,1280,1800
+** Processing line: ~  1240,1720,1240,1600~
 - Inside source: true
 *** True Line Result
-  7680,9360,7860,9360
-** Processing line: ~  7520,9360,7680,9360~
+  1240,1720,1240,1600
+** Processing line: ~  1240,1600,1280,1480~
 - Inside source: true
 *** True Line Result
-  7520,9360,7680,9360
-** Processing line: ~  7420,9260,7520,9360~
+  1240,1600,1280,1480
+** Processing line: ~  1280,1340,1280,1480~
 - Inside source: true
 *** True Line Result
-  7420,9260,7520,9360
-** Processing line: ~  7400,9080,7420,9260~
+  1280,1340,1280,1480
+** Processing line: ~  1180,1280,1280,1340~
 - Inside source: true
 *** True Line Result
-  7400,9080,7420,9260
-** Processing line: ~  7400,9080,7420,8860~
+  1180,1280,1280,1340
+** Processing line: ~  1000,1280,1180,1280~
 - Inside source: true
 *** True Line Result
-  7400,9080,7420,8860
-** Processing line: ~  7420,8860,7440,8720~
+  1000,1280,1180,1280
+** Processing line: ~  760,1280,1000,1280~
 - Inside source: true
 *** True Line Result
-  7420,8860,7440,8720
-** Processing line: ~  7440,8720,7480,8660~
+  760,1280,1000,1280
+** Processing line: ~  360,1240,540,1260~
 - Inside source: true
 *** True Line Result
-  7440,8720,7480,8660
-** Processing line: ~  7480,8660,7520,8540~
+  360,1240,540,1260
+** Processing line: ~  180,1220,360,1240~
 - Inside source: true
 *** True Line Result
-  7480,8660,7520,8540
-** Processing line: ~  7520,8540,7600,8460~
+  180,1220,360,1240
+** Processing line: ~  540,1260,760,1280~
 - Inside source: true
 *** True Line Result
-  7520,8540,7600,8460
-** Processing line: ~  7600,8460,7800,8480~
+  540,1260,760,1280
+** Processing line: ~  180,1080,180,1220~
 - Inside source: true
 *** True Line Result
-  7600,8460,7800,8480
-** Processing line: ~  7800,8480,8040,8480~
+  180,1080,180,1220
+** Processing line: ~  180,1080,180,1000~
 - Inside source: true
 *** True Line Result
-  7800,8480,8040,8480
-** Processing line: ~  8040,8480,8280,8480~
+  180,1080,180,1000
+** Processing line: ~  180,1000,360,940~
 - Inside source: true
 *** True Line Result
-  8040,8480,8280,8480
-** Processing line: ~  8280,8480,8500,8460~
+  180,1000,360,940
+** Processing line: ~  360,940,540,960~
 - Inside source: true
 *** True Line Result
-  8280,8480,8500,8460
-** Processing line: ~  8500,8460,8620,8440~
+  360,940,540,960
+** Processing line: ~  540,960,820,980~
 - Inside source: true
 *** True Line Result
-  8500,8460,8620,8440
-** Processing line: ~  8620,8440,8660,8340~
+  540,960,820,980
+** Processing line: ~  1100,980,1200,920~
 - Inside source: true
 *** True Line Result
-  8620,8440,8660,8340
-** Processing line: ~  8660,8340,8660,8220~
+  1100,980,1200,920
+** Processing line: ~  820,980,1100,980~
 - Inside source: true
 *** True Line Result
-  8660,8340,8660,8220
-** Processing line: ~  8660,8220,8700,8080~
+  820,980,1100,980
+** Processing line: ~  6640,11860,6940,11920~
 - Inside source: true
 *** True Line Result
-  8660,8220,8700,8080
-** Processing line: ~  8700,8080,8700,7920~
+  6640,11860,6940,11920
+** Processing line: ~  5200,11280,5500,11280~
 - Inside source: true
 *** True Line Result
-  8700,8080,8700,7920
-** Processing line: ~  8700,7920,8700,7760~
+  5200,11280,5500,11280
+** Processing line: ~  4120,7330,4120,7230~
 - Inside source: true
 *** True Line Result
-  8700,7920,8700,7760
-** Processing line: ~  8700,7760,8700,7620~
+  4120,7330,4120,7230
+** Processing line: ~  4120,7230,4660,7250~
 - Inside source: true
 *** True Line Result
-  8700,7760,8700,7620
-** Processing line: ~  8700,7480,8700,7620~
+  4120,7230,4660,7250
+** Processing line: ~  4660,7250,4940,7250~
 - Inside source: true
 *** True Line Result
-  8700,7480,8700,7620
-** Processing line: ~  8700,7480,8700,7320~
+  4660,7250,4940,7250
+** Processing line: ~  4940,7250,5050,7340~
 - Inside source: true
 *** True Line Result
-  8700,7480,8700,7320
-** Processing line: ~  8700,7160,8700,7320~
+  4940,7250,5050,7340
+** Processing line: ~  5010,7400,5050,7340~
 - Inside source: true
 *** True Line Result
-  8700,7160,8700,7320
-** Processing line: ~  8920,7220,8960,7040~
+  5010,7400,5050,7340
+** Processing line: ~  4680,7380,5010,7400~
 - Inside source: true
 *** True Line Result
-  8920,7220,8960,7040
-** Processing line: ~  8660,7040,8700,7160~
+  4680,7380,5010,7400
+** Processing line: ~  4380,7370,4680,7380~
 - Inside source: true
 *** True Line Result
-  8660,7040,8700,7160
-** Processing line: ~  8660,7040,8700,6880~
+  4380,7370,4680,7380
+** Processing line: ~  4120,7330,4360,7370~
 - Inside source: true
 *** True Line Result
-  8660,7040,8700,6880
-** Processing line: ~  8660,6700,8700,6880~
+  4120,7330,4360,7370
+** Processing line: ~  4120,7670,4120,7760~
 - Inside source: true
 *** True Line Result
-  8660,6700,8700,6880
-** Processing line: ~  8660,6700,8700,6580~
+  4120,7670,4120,7760
+** Processing line: ~  4120,7670,4280,7650~
 - Inside source: true
 *** True Line Result
-  8660,6700,8700,6580
-** Processing line: ~  8700,6460,8700,6580~
+  4120,7670,4280,7650
+** Processing line: ~  4280,7650,4540,7660~
 - Inside source: true
 *** True Line Result
-  8700,6460,8700,6580
-** Processing line: ~  8700,6460,8700,6320~
+  4280,7650,4540,7660
+** Processing line: ~  4550,7660,4820,7680~
 - Inside source: true
 *** True Line Result
-  8700,6460,8700,6320
-** Processing line: ~  8700,6160,8700,6320~
+  4550,7660,4820,7680
+** Processing line: ~  4820,7680,4900,7730~
 - Inside source: true
 *** True Line Result
-  8700,6160,8700,6320
-** Processing line: ~  8700,6160,8760,6020~
+  4820,7680,4900,7730
+** Processing line: ~  4880,7800,4900,7730~
 - Inside source: true
 *** True Line Result
-  8700,6160,8760,6020
-** Processing line: ~  8760,6020,8760,5860~
+  4880,7800,4900,7730
+** Processing line: ~  4620,7820,4880,7800~
 - Inside source: true
 *** True Line Result
-  8760,6020,8760,5860
-** Processing line: ~  8760,5860,8760,5700~
+  4620,7820,4880,7800
+** Processing line: ~  4360,7790,4620,7820~
 - Inside source: true
 *** True Line Result
-  8760,5860,8760,5700
-** Processing line: ~  8760,5700,8760,5540~
+  4360,7790,4620,7820
+** Processing line: ~  4120,7760,4360,7790~
 - Inside source: true
 *** True Line Result
-  8760,5700,8760,5540
-** Processing line: ~  8760,5540,8760,5360~
+  4120,7760,4360,7790
+** Processing line: ~  6840,6840,7040,6820~
 - Inside source: true
 *** True Line Result
-  8760,5540,8760,5360
-** Processing line: ~  8760,5360,8760,5180~
+  6840,6840,7040,6820
+** Processing line: ~  5720,4880,6120,4880~
 - Inside source: true
 *** True Line Result
-  8760,5360,8760,5180
-** Processing line: ~  8760,5000,8760,5180~
+  5720,4880,6120,4880
+** Processing line: ~  1200,920,1340,810~
 - Inside source: true
 *** True Line Result
-  8760,5000,8760,5180
-** Processing line: ~  8700,4820,8760,5000~
+  1200,920,1340,810
+** Processing line: ~  1340,810,1520,790~
 - Inside source: true
 *** True Line Result
-  8700,4820,8760,5000
-** Processing line: ~  8560,4740,8700,4820~
+  1340,810,1520,790
+** Processing line: ~  1520,790,1770,800~
 - Inside source: true
 *** True Line Result
-  8560,4740,8700,4820
-** Processing line: ~  8420,4700,8560,4740~
+  1520,790,1770,800
+** Processing line: ~  2400,790,2600,750~
 - Inside source: true
 *** True Line Result
-  8420,4700,8560,4740
-** Processing line: ~  8280,4700,8420,4700~
+  2400,790,2600,750
+** Processing line: ~  2600,750,2640,520~
 - Inside source: true
 *** True Line Result
-  8280,4700,8420,4700
-** Processing line: ~  8100,4700,8280,4700~
+  2600,750,2640,520
+** Processing line: ~  2520,470,2640,520~
 - Inside source: true
 *** True Line Result
-  8100,4700,8280,4700
-** Processing line: ~  7980,4700,8100,4700~
+  2520,470,2640,520
+** Processing line: ~  2140,470,2520,470~
 - Inside source: true
 *** True Line Result
-  7980,4700,8100,4700
-** Processing line: ~  7820,4740,7980,4700~
+  2140,470,2520,470
+** Processing line: ~  1760,800,2090,800~
 - Inside source: true
 *** True Line Result
-  7820,4740,7980,4700
-** Processing line: ~  7800,4920,7820,4740~
+  1760,800,2090,800
+** Processing line: ~  2080,800,2400,790~
 - Inside source: true
 *** True Line Result
-  7800,4920,7820,4740
-** Processing line: ~  7800,4920,7900,4960~
+  2080,800,2400,790
+** Processing line: ~  1760,450,2140,470~
 - Inside source: true
 *** True Line Result
-  7800,4920,7900,4960
-** Processing line: ~  7900,4960,8060,4980~
+  1760,450,2140,470
+** Processing line: ~  1420,450,1760,450~
 - Inside source: true
 *** True Line Result
-  7900,4960,8060,4980
-** Processing line: ~  8060,4980,8220,5000~
+  1420,450,1760,450
+** Processing line: ~  1180,440,1420,450~
 - Inside source: true
 *** True Line Result
-  8060,4980,8220,5000
-** Processing line: ~  8220,5000,8420,5040~
+  1180,440,1420,450
+** Processing line: ~  900,480,1180,440~
 - Inside source: true
 *** True Line Result
-  8220,5000,8420,5040
-** Processing line: ~  8420,5040,8460,5120~
+  900,480,1180,440
+** Processing line: ~  640,450,900,480~
 - Inside source: true
 *** True Line Result
-  8420,5040,8460,5120
-** Processing line: ~  8460,5180,8460,5120~
+  640,450,900,480
+** Processing line: ~  360,440,620,450~
 - Inside source: true
 *** True Line Result
-  8460,5180,8460,5120
-** Processing line: ~  8360,5200,8460,5180~
+  360,440,620,450
+** Processing line: ~  120,430,360,440~
 - Inside source: true
 *** True Line Result
-  8360,5200,8460,5180
-** Processing line: ~  8360,5280,8360,5200~
+  120,430,360,440
+** Processing line: ~  0,520,120,430~
 - Inside source: true
 *** True Line Result
-  8360,5280,8360,5200
-** Processing line: ~  8160,5300,8360,5280~
+  0,520,120,430
+** Processing line: ~  -20,780,0,520~
 - Inside source: true
 *** True Line Result
-  8160,5300,8360,5280
-** Processing line: ~  8040,5260,8160,5300~
+  -20,780,0,520
+** Processing line: ~  -20,780,-20,1020~
 - Inside source: true
 *** True Line Result
-  8040,5260,8160,5300
-** Processing line: ~  7860,5220,8040,5260~
+  -20,780,-20,1020
+** Processing line: ~  -20,1020,-20,1150~
 - Inside source: true
 *** True Line Result
-  7860,5220,8040,5260
-** Processing line: ~  7720,5160,7860,5220~
+  -20,1020,-20,1150
+** Processing line: ~  -20,1150,0,1300~
 - Inside source: true
 *** True Line Result
-  7720,5160,7860,5220
-** Processing line: ~  7640,5120,7720,5160~
+  -20,1150,0,1300
+** Processing line: ~  0,1470,60,1530~
 - Inside source: true
 *** True Line Result
-  7640,5120,7720,5160
-** Processing line: ~  7480,5120,7640,5120~
+  0,1470,60,1530
+** Processing line: ~  0,1300,0,1470~
 - Inside source: true
 *** True Line Result
-  7480,5120,7640,5120
-** Processing line: ~  7240,5120,7480,5120~
+  0,1300,0,1470
+** Processing line: ~  60,1530,360,1530~
 - Inside source: true
 *** True Line Result
-  7240,5120,7480,5120
-** Processing line: ~  7000,5120,7240,5120~
+  60,1530,360,1530
+** Processing line: ~  360,1530,660,1520~
 - Inside source: true
 *** True Line Result
-  7000,5120,7240,5120
-** Processing line: ~  6800,5160,7000,5120~
+  360,1530,660,1520
+** Processing line: ~  660,1520,980,1520~
 - Inside source: true
 *** True Line Result
-  6800,5160,7000,5120
-** Processing line: ~  6640,5220,6800,5160~
+  660,1520,980,1520
+** Processing line: ~  980,1520,1040,1520~
 - Inside source: true
 *** True Line Result
-  6640,5220,6800,5160
-** Processing line: ~  6600,5360,6640,5220~
+  980,1520,1040,1520
+** Processing line: ~  1040,1520,1070,1560~
 - Inside source: true
 *** True Line Result
-  6600,5360,6640,5220
-** Processing line: ~  6600,5460,6600,5360~
+  1040,1520,1070,1560
+** Processing line: ~  1070,1770,1070,1560~
 - Inside source: true
 *** True Line Result
-  6600,5460,6600,5360
-** Processing line: ~  6480,5520,6600,5460~
+  1070,1770,1070,1560
+** Processing line: ~  1070,1770,1100,2010~
 - Inside source: true
 *** True Line Result
-  6480,5520,6600,5460
-** Processing line: ~  6240,5540,6480,5520~
+  1070,1770,1100,2010
+** Processing line: ~  1070,2230,1100,2010~
 - Inside source: true
 *** True Line Result
-  6240,5540,6480,5520
-** Processing line: ~  5980,5540,6240,5540~
+  1070,2230,1100,2010
+** Processing line: ~  1070,2240,1180,2340~
 - Inside source: true
 *** True Line Result
-  5980,5540,6240,5540
-** Processing line: ~  5740,5540,5980,5540~
+  1070,2240,1180,2340
+** Processing line: ~  1180,2340,1580,2340~
 - Inside source: true
 *** True Line Result
-  5740,5540,5980,5540
-** Processing line: ~  5500,5520,5740,5540~
+  1180,2340,1580,2340
+** Processing line: ~  1580,2340,1940,2350~
 - Inside source: true
 *** True Line Result
-  5500,5520,5740,5540
-** Processing line: ~  5400,5520,5500,5520~
+  1580,2340,1940,2350
+** Processing line: ~  1940,2350,2440,2350~
 - Inside source: true
 *** True Line Result
-  5400,5520,5500,5520
-** Processing line: ~  5280,5540,5400,5520~
+  1940,2350,2440,2350
+** Processing line: ~  2440,2350,2560,2380~
 - Inside source: true
 *** True Line Result
-  5280,5540,5400,5520
-** Processing line: ~  5080,5540,5280,5540~
+  2440,2350,2560,2380
+** Processing line: ~  2560,2380,2600,2540~
 - Inside source: true
 *** True Line Result
-  5080,5540,5280,5540
-** Processing line: ~  4940,5540,5080,5540~
+  2560,2380,2600,2540
+** Processing line: ~  2810,2640,3140,2680~
 - Inside source: true
 *** True Line Result
-  4940,5540,5080,5540
-** Processing line: ~  4760,5540,4940,5540~
+  2810,2640,3140,2680
+** Processing line: ~  2600,2540,2810,2640~
 - Inside source: true
 *** True Line Result
-  4760,5540,4940,5540
-** Processing line: ~  4600,5540,4760,5540~
+  2600,2540,2810,2640
+** Processing line: ~  3140,2680,3230,2780~
 - Inside source: true
 *** True Line Result
-  4600,5540,4760,5540
-** Processing line: ~  4440,5560,4600,5540~
+  3140,2680,3230,2780
+** Processing line: ~  3230,2780,3260,2970~
 - Inside source: true
 *** True Line Result
-  4440,5560,4600,5540
-** Processing line: ~  4040,5580,4120,5520~
+  3230,2780,3260,2970
+** Processing line: ~  3230,3220,3260,2970~
 - Inside source: true
 *** True Line Result
-  4040,5580,4120,5520
-** Processing line: ~  4260,5540,4440,5560~
+  3230,3220,3260,2970
+** Processing line: ~  3200,3470,3230,3220~
 - Inside source: true
 *** True Line Result
-  4260,5540,4440,5560
-** Processing line: ~  4120,5520,4260,5540~
+  3200,3470,3230,3220
+** Processing line: ~  3200,3480,3210,3760~
 - Inside source: true
 *** True Line Result
-  4120,5520,4260,5540
-** Processing line: ~  4020,5720,4040,5580~
+  3200,3480,3210,3760
+** Processing line: ~  3210,3760,3210,4040~
 - Inside source: true
 *** True Line Result
-  4020,5720,4040,5580
-** Processing line: ~  4020,5840,4020,5720~
+  3210,3760,3210,4040
+** Processing line: ~  3200,4040,3230,4310~
 - Inside source: true
 *** True Line Result
-  4020,5840,4020,5720
-** Processing line: ~  4020,5840,4080,5940~
+  3200,4040,3230,4310
+** Processing line: ~  3210,4530,3230,4310~
 - Inside source: true
 *** True Line Result
-  4020,5840,4080,5940
-** Processing line: ~  4080,5940,4120,6040~
+  3210,4530,3230,4310
+** Processing line: ~  3210,4530,3230,4730~
 - Inside source: true
 *** True Line Result
-  4080,5940,4120,6040
-** Processing line: ~  4120,6040,4200,6080~
+  3210,4530,3230,4730
+** Processing line: ~  3230,4960,3230,4730~
 - Inside source: true
 *** True Line Result
-  4120,6040,4200,6080
-** Processing line: ~  4200,6080,4340,6080~
+  3230,4960,3230,4730
+** Processing line: ~  3230,4960,3260,5190~
 - Inside source: true
 *** True Line Result
-  4200,6080,4340,6080
-** Processing line: ~  4340,6080,4500,6060~
+  3230,4960,3260,5190
+** Processing line: ~  3170,5330,3260,5190~
 - Inside source: true
 *** True Line Result
-  4340,6080,4500,6060
-** Processing line: ~  4500,6060,4700,6060~
+  3170,5330,3260,5190
+** Processing line: ~  2920,5330,3170,5330~
 - Inside source: true
 *** True Line Result
-  4500,6060,4700,6060
-** Processing line: ~  4700,6060,4880,6060~
+  2920,5330,3170,5330
+** Processing line: ~  2660,5360,2920,5330~
 - Inside source: true
 *** True Line Result
-  4700,6060,4880,6060
-** Processing line: ~  4880,6060,5080,6060~
+  2660,5360,2920,5330
+** Processing line: ~  2420,5330,2660,5360~
 - Inside source: true
 *** True Line Result
-  4880,6060,5080,6060
-** Processing line: ~  5080,6060,5280,6080~
+  2420,5330,2660,5360
+** Processing line: ~  2200,5280,2400,5330~
 - Inside source: true
 *** True Line Result
-  5080,6060,5280,6080
-** Processing line: ~  5280,6080,5440,6100~
+  2200,5280,2400,5330
+** Processing line: ~  2020,5280,2200,5280~
 - Inside source: true
 *** True Line Result
-  5280,6080,5440,6100
-** Processing line: ~  5440,6100,5660,6100~
+  2020,5280,2200,5280
+** Processing line: ~  1840,5260,2020,5280~
 - Inside source: true
 *** True Line Result
-  5440,6100,5660,6100
-** Processing line: ~  5660,6100,5900,6080~
+  1840,5260,2020,5280
+** Processing line: ~  1660,5280,1840,5260~
 - Inside source: true
 *** True Line Result
-  5660,6100,5900,6080
-** Processing line: ~  5900,6080,6120,6080~
+  1660,5280,1840,5260
+** Processing line: ~  1500,5300,1660,5280~
 - Inside source: true
 *** True Line Result
-  5900,6080,6120,6080
-** Processing line: ~  6120,6080,6360,6080~
+  1500,5300,1660,5280
+** Processing line: ~  1360,5270,1500,5300~
 - Inside source: true
 *** True Line Result
-  6120,6080,6360,6080
-** Processing line: ~  6360,6080,6480,6100~
+  1360,5270,1500,5300
+** Processing line: ~  1200,5290,1340,5270~
 - Inside source: true
 *** True Line Result
-  6360,6080,6480,6100
-** Processing line: ~  6480,6100,6540,6060~
+  1200,5290,1340,5270
+** Processing line: ~  1070,5400,1200,5290~
 - Inside source: true
 *** True Line Result
-  6480,6100,6540,6060
-** Processing line: ~  6540,6060,6720,6060~
+  1070,5400,1200,5290
+** Processing line: ~  1040,5630,1070,5400~
 - Inside source: true
 *** True Line Result
-  6540,6060,6720,6060
-** Processing line: ~  6720,6060,6940,6060~
+  1040,5630,1070,5400
+** Processing line: ~  1000,5900,1040,5630~
 - Inside source: true
 *** True Line Result
-  6720,6060,6940,6060
-** Processing line: ~  6940,6060,7140,6060~
+  1000,5900,1040,5630
+** Processing line: ~  980,6170,1000,5900~
 - Inside source: true
 *** True Line Result
-  6940,6060,7140,6060
-** Processing line: ~  7400,6060,7600,6060~
+  980,6170,1000,5900
+** Processing line: ~  980,6280,980,6170~
 - Inside source: true
 *** True Line Result
-  7400,6060,7600,6060
-** Processing line: ~  7140,6060,7400,6060~
+  980,6280,980,6170
+** Processing line: ~  980,6540,980,6280~
 - Inside source: true
 *** True Line Result
-  7140,6060,7400,6060
-** Processing line: ~  7600,6060,7800,6060~
+  980,6540,980,6280
+** Processing line: ~  980,6540,1040,6720~
 - Inside source: true
 *** True Line Result
-  7600,6060,7800,6060
-** Processing line: ~  7800,6060,7860,6080~
+  980,6540,1040,6720
+** Processing line: ~  1040,6720,1360,6730~
 - Inside source: true
 *** True Line Result
-  7800,6060,7860,6080
-** Processing line: ~  7860,6080,8060,6080~
+  1040,6720,1360,6730
+** Processing line: ~  1360,6730,1760,6710~
 - Inside source: true
 *** True Line Result
-  7860,6080,8060,6080
-** Processing line: ~  8060,6080,8220,6080~
+  1360,6730,1760,6710
+** Processing line: ~  2110,6720,2420,6730~
 - Inside source: true
 *** True Line Result
-  8060,6080,8220,6080
-** Processing line: ~  8220,6080,8320,6140~
+  2110,6720,2420,6730
+** Processing line: ~  1760,6710,2110,6720~
 - Inside source: true
 *** True Line Result
-  8220,6080,8320,6140
-** Processing line: ~  8320,6140,8360,6300~
+  1760,6710,2110,6720
+** Processing line: ~  2420,6730,2640,6720~
 - Inside source: true
 *** True Line Result
-  8320,6140,8360,6300
-** Processing line: ~  8320,6460,8360,6300~
+  2420,6730,2640,6720
+** Processing line: ~  2640,6720,2970,6720~
 - Inside source: true
 *** True Line Result
-  8320,6460,8360,6300
-** Processing line: ~  8320,6620,8320,6460~
+  2640,6720,2970,6720
+** Processing line: ~  2970,6720,3160,6700~
 - Inside source: true
 *** True Line Result
-  8320,6620,8320,6460
-** Processing line: ~  8320,6800,8320,6620~
+  2970,6720,3160,6700
+** Processing line: ~  3160,6700,3240,6710~
 - Inside source: true
 *** True Line Result
-  8320,6800,8320,6620
-** Processing line: ~  8320,6960,8320,6800~
+  3160,6700,3240,6710
+** Processing line: ~  3240,6710,3260,6890~
 - Inside source: true
 *** True Line Result
-  8320,6960,8320,6800
-** Processing line: ~  8320,6960,8360,7120~
+  3240,6710,3260,6890
+** Processing line: ~  3260,7020,3260,6890~
 - Inside source: true
 *** True Line Result
-  8320,6960,8360,7120
-** Processing line: ~  8320,7280,8360,7120~
+  3260,7020,3260,6890
+** Processing line: ~  3230,7180,3260,7020~
 - Inside source: true
 *** True Line Result
-  8320,7280,8360,7120
-** Processing line: ~  8320,7440,8320,7280~
+  3230,7180,3260,7020
+** Processing line: ~  3230,7350,3230,7180~
 - Inside source: true
 *** True Line Result
-  8320,7440,8320,7280
-** Processing line: ~  8320,7600,8320,7440~
+  3230,7350,3230,7180
+** Processing line: ~  3210,7510,3230,7350~
 - Inside source: true
 *** True Line Result
-  8320,7600,8320,7440
-** Processing line: ~  8100,7580,8220,7600~
+  3210,7510,3230,7350
+** Processing line: ~  3210,7510,3210,7690~
 - Inside source: true
 *** True Line Result
-  8100,7580,8220,7600
-** Processing line: ~  8220,7600,8320,7600~
+  3210,7510,3210,7690
+** Processing line: ~  3210,7870,3210,7690~
 - Inside source: true
 *** True Line Result
-  8220,7600,8320,7600
-** Processing line: ~  7900,7560,8100,7580~
+  3210,7870,3210,7690
+** Processing line: ~  3210,7870,3210,7980~
 - Inside source: true
 *** True Line Result
-  7900,7560,8100,7580
-** Processing line: ~  7680,7560,7900,7560~
+  3210,7870,3210,7980
+** Processing line: ~  3200,8120,3210,7980~
 - Inside source: true
 *** True Line Result
-  7680,7560,7900,7560
-** Processing line: ~  7480,7580,7680,7560~
+  3200,8120,3210,7980
+** Processing line: ~  3200,8330,3200,8120~
 - Inside source: true
 *** True Line Result
-  7480,7580,7680,7560
-** Processing line: ~  7280,7580,7480,7580~
+  3200,8330,3200,8120
+** Processing line: ~  3160,8520,3200,8330~
 - Inside source: true
 *** True Line Result
-  7280,7580,7480,7580
-** Processing line: ~  7080,7580,7280,7580~
+  3160,8520,3200,8330
+** Processing line: ~  2460,11100,2480,11020~
 - Inside source: true
 *** True Line Result
-  7080,7580,7280,7580
-** Processing line: ~  7000,7600,7080,7580~
+  2460,11100,2480,11020
+** Processing line: ~  2200,11180,2460,11100~
 - Inside source: true
 *** True Line Result
-  7000,7600,7080,7580
-** Processing line: ~  6880,7600,7000,7600~
+  2200,11180,2460,11100
+** Processing line: ~  1260,11350,1600,11320~
 - Inside source: true
 *** True Line Result
-  6880,7600,7000,7600
-** Processing line: ~  6800,7580,6880,7600~
+  1260,11350,1600,11320
+** Processing line: ~  600,11430,930,11400~
 - Inside source: true
 *** True Line Result
-  6800,7580,6880,7600
-** Processing line: ~  6640,7580,6800,7580~
+  600,11430,930,11400
+** Processing line: ~  180,11340,620,11430~
 - Inside source: true
 *** True Line Result
-  6640,7580,6800,7580
-** Processing line: ~  6540,7580,6640,7580~
+  180,11340,620,11430
+** Processing line: ~  1600,11320,1910,11280~
 - Inside source: true
 *** True Line Result
-  6540,7580,6640,7580
-** Processing line: ~  6380,7600,6540,7580~
+  1600,11320,1910,11280
+** Processing line: ~  1910,11280,2200,11180~
 - Inside source: true
 *** True Line Result
-  6380,7600,6540,7580
-** Processing line: ~  6280,7620,6380,7600~
+  1910,11280,2200,11180
+** Processing line: ~  923.0029599285435,11398.99893503157,1264.002959928544,11351.99893503157~
 - Inside source: true
 *** True Line Result
-  6280,7620,6380,7600
-** Processing line: ~  6240,7700,6280,7620~
+  923.0029599285435,11398.99893503157,1264.002959928544,11351.99893503157
+** Processing line: ~#+end_src~
+- Line was identified as the end of a code block.
+*** True Line Result
+#+end_src
+** Processing line: ~~
+- End of paragraph detected.
+*** True Line Result
+
+** Processing line: ~*** Platformer - The Little Probe - Data - level_lava.txt~
+- Header detected.
+*** True Line Result
+
+*** True Line Result
+*** Platformer - The Little Probe - Data - level_lava.txt
+** Processing line: ~#+begin_src ruby~
+- Line was identified as the beginning of a code block.
+*** True Line Result
+
+*** True Line Result
+#+begin_src ruby
+** Processing line: ~  # ./samples/99_genre_platformer/the_little_probe/data/level_lava.txt~
 - Inside source: true
 *** True Line Result
-  6240,7700,6280,7620
-** Processing line: ~  6240,7700,6240,7800~
+  # ./samples/99_genre_platformer/the_little_probe/data/level_lava.txt
+** Processing line: ~  100,10740,500,10780~
 - Inside source: true
 *** True Line Result
-  6240,7700,6240,7800
-** Processing line: ~  6240,7840,6240,7800~
+  100,10740,500,10780
+** Processing line: ~  500,10780,960,10760~
 - Inside source: true
 *** True Line Result
-  6240,7840,6240,7800
-** Processing line: ~  6080,7840,6240,7840~
+  500,10780,960,10760
+** Processing line: ~  960,10760,1340,10760~
 - Inside source: true
 *** True Line Result
-  6080,7840,6240,7840
-** Processing line: ~  5960,7820,6080,7840~
+  960,10760,1340,10760
+** Processing line: ~  1380,10760,1820,10780~
 - Inside source: true
 *** True Line Result
-  5960,7820,6080,7840
-** Processing line: ~  5660,7840,5800,7840~
+  1380,10760,1820,10780
+** Processing line: ~  1820,10780,2240,10780~
 - Inside source: true
 *** True Line Result
-  5660,7840,5800,7840
-** Processing line: ~  5500,7800,5660,7840~
+  1820,10780,2240,10780
+** Processing line: ~  2280,10780,2740,10740~
 - Inside source: true
 *** True Line Result
-  5500,7800,5660,7840
-** Processing line: ~  5440,7700,5500,7800~
+  2280,10780,2740,10740
+** Processing line: ~  2740,10740,3000,10780~
 - Inside source: true
 *** True Line Result
-  5440,7700,5500,7800
-** Processing line: ~  5800,7840,5960,7820~
+  2740,10740,3000,10780
+** Processing line: ~  3000,10780,3140,11020~
 - Inside source: true
 *** True Line Result
-  5800,7840,5960,7820
-** Processing line: ~  5440,7540,5440,7700~
+  3000,10780,3140,11020
+** Processing line: ~  -520,8820,-480,9160~
 - Inside source: true
 *** True Line Result
-  5440,7540,5440,7700
-** Processing line: ~  5440,7440,5440,7540~
+  -520,8820,-480,9160
+** Processing line: ~  -520,8480,-520,8820~
 - Inside source: true
 *** True Line Result
-  5440,7440,5440,7540
-** Processing line: ~  5440,7320,5440,7440~
+  -520,8480,-520,8820
+** Processing line: ~  -520,8480,-480,8180~
 - Inside source: true
 *** True Line Result
-  5440,7320,5440,7440
-** Processing line: ~  5400,7320,5440,7320~
+  -520,8480,-480,8180
+** Processing line: ~  -480,8180,-200,8120~
 - Inside source: true
 *** True Line Result
-  5400,7320,5440,7320
-** Processing line: ~  5340,7400,5400,7320~
+  -480,8180,-200,8120
+** Processing line: ~  -200,8120,100,8220~
 - Inside source: true
 *** True Line Result
-  5340,7400,5400,7320
-** Processing line: ~  5340,7400,5340,7500~
+  -200,8120,100,8220
+** Processing line: ~  100,8220,420,8240~
 - Inside source: true
 *** True Line Result
-  5340,7400,5340,7500
-** Processing line: ~  5340,7600,5340,7500~
+  100,8220,420,8240
+** Processing line: ~  420,8240,760,8260~
 - Inside source: true
 *** True Line Result
-  5340,7600,5340,7500
-** Processing line: ~  5340,7600,5340,7720~
+  420,8240,760,8260
+** Processing line: ~  760,8260,1140,8280~
 - Inside source: true
 *** True Line Result
-  5340,7600,5340,7720
-** Processing line: ~  5340,7720,5340,7860~
+  760,8260,1140,8280
+** Processing line: ~  1140,8280,1500,8200~
 - Inside source: true
 *** True Line Result
-  5340,7720,5340,7860
-** Processing line: ~  5340,7860,5340,7960~
+  1140,8280,1500,8200
+** Processing line: ~  1500,8200,1880,8240~
 - Inside source: true
 *** True Line Result
-  5340,7860,5340,7960
-** Processing line: ~  5340,7960,5440,8020~
+  1500,8200,1880,8240
+** Processing line: ~  1880,8240,2240,8260~
 - Inside source: true
 *** True Line Result
-  5340,7960,5440,8020
-** Processing line: ~  5440,8020,5560,8020~
+  1880,8240,2240,8260
+** Processing line: ~  2240,8260,2320,8480~
 - Inside source: true
 *** True Line Result
-  5440,8020,5560,8020
-** Processing line: ~  5560,8020,5720,8040~
+  2240,8260,2320,8480
+** Processing line: ~  2320,8480,2380,8680~
 - Inside source: true
 *** True Line Result
-  5560,8020,5720,8040
-** Processing line: ~  5720,8040,5900,8060~
+  2320,8480,2380,8680
+** Processing line: ~  2240,8860,2380,8680~
 - Inside source: true
 *** True Line Result
-  5720,8040,5900,8060
-** Processing line: ~  5900,8060,6080,8060~
+  2240,8860,2380,8680
+** Processing line: ~  2240,9080,2240,8860~
 - Inside source: true
 *** True Line Result
-  5900,8060,6080,8060
-** Processing line: ~  6080,8060,6240,8060~
+  2240,9080,2240,8860
+** Processing line: ~  2240,9080,2320,9260~
 - Inside source: true
 *** True Line Result
-  6080,8060,6240,8060
-** Processing line: ~  6720,8040,6840,8060~
+  2240,9080,2320,9260
+** Processing line: ~  2320,9260,2480,9440~
 - Inside source: true
 *** True Line Result
-  6720,8040,6840,8060
-** Processing line: ~  6240,8060,6480,8040~
+  2320,9260,2480,9440
+** Processing line: ~  2480,9440,2600,9640~
 - Inside source: true
 *** True Line Result
-  6240,8060,6480,8040
-** Processing line: ~  6480,8040,6720,8040~
+  2480,9440,2600,9640
+** Processing line: ~  2480,9840,2600,9640~
 - Inside source: true
 *** True Line Result
-  6480,8040,6720,8040
-** Processing line: ~  6840,8060,6940,8060~
+  2480,9840,2600,9640
+** Processing line: ~  2400,10020,2480,9840~
 - Inside source: true
 *** True Line Result
-  6840,8060,6940,8060
-** Processing line: ~  6940,8060,7080,8120~
+  2400,10020,2480,9840
+** Processing line: ~  2240,10080,2400,10020~
 - Inside source: true
 *** True Line Result
-  6940,8060,7080,8120
-** Processing line: ~  7080,8120,7140,8180~
+  2240,10080,2400,10020
+** Processing line: ~  1960,10080,2240,10080~
 - Inside source: true
 *** True Line Result
-  7080,8120,7140,8180
-** Processing line: ~  7140,8460,7140,8320~
+  1960,10080,2240,10080
+** Processing line: ~  1720,10080,1960,10080~
 - Inside source: true
 *** True Line Result
-  7140,8460,7140,8320
-** Processing line: ~  7140,8620,7140,8460~
+  1720,10080,1960,10080
+** Processing line: ~  1460,10080,1720,10080~
 - Inside source: true
 *** True Line Result
-  7140,8620,7140,8460
-** Processing line: ~  7140,8620,7140,8740~
+  1460,10080,1720,10080
+** Processing line: ~  1180,10080,1420,10080~
 - Inside source: true
 *** True Line Result
-  7140,8620,7140,8740
-** Processing line: ~  7140,8860,7140,8740~
+  1180,10080,1420,10080
+** Processing line: ~  900,10080,1180,10080~
 - Inside source: true
 *** True Line Result
-  7140,8860,7140,8740
-** Processing line: ~  7140,8960,7140,8860~
+  900,10080,1180,10080
+** Processing line: ~  640,10080,900,10080~
 - Inside source: true
 *** True Line Result
-  7140,8960,7140,8860
-** Processing line: ~  7140,8960,7200,9080~
+  640,10080,900,10080
+** Processing line: ~  640,10080,640,9900~
 - Inside source: true
 *** True Line Result
-  7140,8960,7200,9080
-** Processing line: ~  7140,9200,7200,9080~
+  640,10080,640,9900
+** Processing line: ~  60,10520,100,10740~
 - Inside source: true
 *** True Line Result
-  7140,9200,7200,9080
-** Processing line: ~  7140,9200,7200,9320~
+  60,10520,100,10740
+** Processing line: ~  40,10240,60,10520~
 - Inside source: true
 *** True Line Result
-  7140,9200,7200,9320
-** Processing line: ~  7200,9320,7200,9460~
+  40,10240,60,10520
+** Processing line: ~  40,10240,40,9960~
 - Inside source: true
 *** True Line Result
-  7200,9320,7200,9460
-** Processing line: ~  7200,9760,7200,9900~
+  40,10240,40,9960
+** Processing line: ~  40,9960,40,9680~
 - Inside source: true
 *** True Line Result
-  7200,9760,7200,9900
-** Processing line: ~  7200,9620,7200,9460~
+  40,9960,40,9680
+** Processing line: ~  40,9680,40,9360~
 - Inside source: true
 *** True Line Result
-  7200,9620,7200,9460
-** Processing line: ~  7200,9620,7200,9760~
+  40,9680,40,9360
+** Processing line: ~  40,9360,60,9080~
 - Inside source: true
 *** True Line Result
-  7200,9620,7200,9760
-** Processing line: ~  7200,9900,7200,10060~
+  40,9360,60,9080
+** Processing line: ~  60,9080,100,8860~
 - Inside source: true
 *** True Line Result
-  7200,9900,7200,10060
-** Processing line: ~  7200,10220,7200,10060~
+  60,9080,100,8860
+** Processing line: ~  100,8860,460,9040~
 - Inside source: true
 *** True Line Result
-  7200,10220,7200,10060
-** Processing line: ~  7200,10360,7200,10220~
+  100,8860,460,9040
+** Processing line: ~  460,9040,760,9220~
 - Inside source: true
 *** True Line Result
-  7200,10360,7200,10220
-** Processing line: ~  7140,10400,7200,10360~
+  460,9040,760,9220
+** Processing line: ~  760,9220,1140,9220~
 - Inside source: true
 *** True Line Result
-  7140,10400,7200,10360
-** Processing line: ~  6880,10400,7140,10400~
+  760,9220,1140,9220
+** Processing line: ~  1140,9220,1720,9200~
 - Inside source: true
 *** True Line Result
-  6880,10400,7140,10400
-** Processing line: ~  6640,10360,6880,10400~
+  1140,9220,1720,9200
+** Processing line: ~  -660,11580,-600,11420~
 - Inside source: true
 *** True Line Result
-  6640,10360,6880,10400
-** Processing line: ~  6420,10360,6640,10360~
+  -660,11580,-600,11420
+** Processing line: ~  -660,11800,-660,11580~
 - Inside source: true
 *** True Line Result
-  6420,10360,6640,10360
-** Processing line: ~  6160,10380,6420,10360~
+  -660,11800,-660,11580
+** Processing line: ~  -660,12000,-660,11800~
 - Inside source: true
 *** True Line Result
-  6160,10380,6420,10360
-** Processing line: ~  5940,10340,6160,10380~
+  -660,12000,-660,11800
+** Processing line: ~  -660,12000,-600,12220~
 - Inside source: true
 *** True Line Result
-  5940,10340,6160,10380
-** Processing line: ~  5720,10320,5940,10340~
+  -660,12000,-600,12220
+** Processing line: ~  -600,12220,-600,12440~
 - Inside source: true
 *** True Line Result
-  5720,10320,5940,10340
-** Processing line: ~  5500,10340,5720,10320~
+  -600,12220,-600,12440
+** Processing line: ~  -600,12440,-600,12640~
 - Inside source: true
 *** True Line Result
-  5500,10340,5720,10320
-** Processing line: ~  5280,10300,5500,10340~
+  -600,12440,-600,12640
+** Processing line: ~  -600,11240,-260,11280~
 - Inside source: true
 *** True Line Result
-  5280,10300,5500,10340
-** Processing line: ~  5080,10300,5280,10300~
+  -600,11240,-260,11280
+** Processing line: ~  -260,11280,100,11240~
 - Inside source: true
 *** True Line Result
-  5080,10300,5280,10300
-** Processing line: ~  4840,10280,5080,10300~
+  -260,11280,100,11240
+** Processing line: ~  9000,12360,9020,12400~
 - Inside source: true
 *** True Line Result
-  4840,10280,5080,10300
-** Processing line: ~  4700,10280,4840,10280~
+  9000,12360,9020,12400
+** Processing line: ~  9020,12620,9020,12400~
 - Inside source: true
 *** True Line Result
-  4700,10280,4840,10280
-** Processing line: ~  4540,10280,4700,10280~
+  9020,12620,9020,12400
+** Processing line: ~  9020,12840,9020,12620~
 - Inside source: true
 *** True Line Result
-  4540,10280,4700,10280
-** Processing line: ~  4360,10280,4540,10280~
+  9020,12840,9020,12620
+** Processing line: ~  9020,13060,9020,12840~
 - Inside source: true
 *** True Line Result
-  4360,10280,4540,10280
-** Processing line: ~  4200,10300,4360,10280~
+  9020,13060,9020,12840
+** Processing line: ~  9020,13060,9020,13240~
 - Inside source: true
 *** True Line Result
-  4200,10300,4360,10280
-** Processing line: ~  4040,10380,4200,10300~
+  9020,13060,9020,13240
+** Processing line: ~  9020,13240,9020,13420~
 - Inside source: true
 *** True Line Result
-  4040,10380,4200,10300
-** Processing line: ~  4020,10500,4040,10380~
+  9020,13240,9020,13420
+** Processing line: ~  9020,13420,9020,13600~
 - Inside source: true
 *** True Line Result
-  4020,10500,4040,10380
-** Processing line: ~  3980,10640,4020,10500~
+  9020,13420,9020,13600
+** Processing line: ~  9020,13600,9020,13780~
 - Inside source: true
 *** True Line Result
-  3980,10640,4020,10500
-** Processing line: ~  3980,10640,3980,10760~
+  9020,13600,9020,13780
+** Processing line: ~  8880,13900,9020,13780~
 - Inside source: true
 *** True Line Result
-  3980,10640,3980,10760
-** Processing line: ~  3980,10760,4020,10920~
+  8880,13900,9020,13780
+** Processing line: ~  8560,13800,8880,13900~
 - Inside source: true
 *** True Line Result
-  3980,10760,4020,10920
-** Processing line: ~  4020,10920,4080,11000~
+  8560,13800,8880,13900
+** Processing line: ~  8220,13780,8560,13800~
 - Inside source: true
 *** True Line Result
-  4020,10920,4080,11000
-** Processing line: ~  4080,11000,4340,11020~
+  8220,13780,8560,13800
+** Processing line: ~  7860,13760,8220,13780~
 - Inside source: true
 *** True Line Result
-  4080,11000,4340,11020
-** Processing line: ~  4340,11020,4600,11060~
+  7860,13760,8220,13780
+** Processing line: ~  7640,13780,7860,13760~
 - Inside source: true
 *** True Line Result
-  4340,11020,4600,11060
-** Processing line: ~  4600,11060,4840,11040~
+  7640,13780,7860,13760
+** Processing line: ~  7360,13800,7640,13780~
 - Inside source: true
 *** True Line Result
-  4600,11060,4840,11040
-** Processing line: ~  4840,11040,4880,10960~
+  7360,13800,7640,13780
+** Processing line: ~  7100,13800,7360,13800~
 - Inside source: true
 *** True Line Result
-  4840,11040,4880,10960
-** Processing line: ~  4880,10740,4880,10960~
+  7100,13800,7360,13800
+** Processing line: ~  6540,13760,6800,13780~
 - Inside source: true
 *** True Line Result
-  4880,10740,4880,10960
-** Processing line: ~  4880,10740,4880,10600~
+  6540,13760,6800,13780
+** Processing line: ~  6800,13780,7100,13800~
 - Inside source: true
 *** True Line Result
-  4880,10740,4880,10600
-** Processing line: ~  4880,10600,5080,10560~
+  6800,13780,7100,13800
+** Processing line: ~  6280,13760,6540,13760~
 - Inside source: true
 *** True Line Result
-  4880,10600,5080,10560
-** Processing line: ~  5080,10560,5340,10620~
+  6280,13760,6540,13760
+** Processing line: ~  5760,13760,6280,13760~
 - Inside source: true
 *** True Line Result
-  5080,10560,5340,10620
-** Processing line: ~  5340,10620,5660,10620~
+  5760,13760,6280,13760
+** Processing line: ~  5220,13780,5760,13760~
 - Inside source: true
 *** True Line Result
-  5340,10620,5660,10620
-** Processing line: ~  5660,10620,6040,10600~
+  5220,13780,5760,13760
+** Processing line: ~  4700,13760,5220,13780~
 - Inside source: true
 *** True Line Result
-  5660,10620,6040,10600
-** Processing line: ~  6040,10600,6120,10620~
+  4700,13760,5220,13780
+** Processing line: ~  4200,13740,4700,13760~
 - Inside source: true
 *** True Line Result
-  6040,10600,6120,10620
-** Processing line: ~  6120,10620,6240,10720~
+  4200,13740,4700,13760
+** Processing line: ~  3680,13720,4200,13740~
 - Inside source: true
 *** True Line Result
-  6120,10620,6240,10720
-** Processing line: ~  6240,10720,6420,10740~
+  3680,13720,4200,13740
+** Processing line: ~  3140,13700,3680,13720~
 - Inside source: true
 *** True Line Result
-  6240,10720,6420,10740
-** Processing line: ~  6420,10740,6640,10760~
+  3140,13700,3680,13720
+** Processing line: ~  2600,13680,3140,13700~
 - Inside source: true
 *** True Line Result
-  6420,10740,6640,10760
-** Processing line: ~  6640,10760,6880,10780~
+  2600,13680,3140,13700
+** Processing line: ~  2040,13940,2600,13680~
 - Inside source: true
 *** True Line Result
-  6640,10760,6880,10780
-** Processing line: ~  7140,10780,7400,10780~
+  2040,13940,2600,13680
+** Processing line: ~  1640,13940,2040,13940~
 - Inside source: true
 *** True Line Result
-  7140,10780,7400,10780
-** Processing line: ~  6880,10780,7140,10780~
+  1640,13940,2040,13940
+** Processing line: ~  1200,13960,1640,13940~
 - Inside source: true
 *** True Line Result
-  6880,10780,7140,10780
-** Processing line: ~  7400,10780,7680,10780~
+  1200,13960,1640,13940
+** Processing line: ~  840,14000,1200,13960~
 - Inside source: true
 *** True Line Result
-  7400,10780,7680,10780
-** Processing line: ~  7680,10780,8100,10760~
+  840,14000,1200,13960
+** Processing line: ~  300,13960,840,14000~
 - Inside source: true
 *** True Line Result
-  7680,10780,8100,10760
-** Processing line: ~  8100,10760,8460,10740~
+  300,13960,840,14000
+** Processing line: ~  -200,13900,300,13960~
 - Inside source: true
 *** True Line Result
-  8100,10760,8460,10740
-** Processing line: ~  8460,10740,8700,10760~
+  -200,13900,300,13960
+** Processing line: ~  -600,12840,-600,12640~
 - Inside source: true
 *** True Line Result
-  8460,10740,8700,10760
-** Processing line: ~  8800,10840,8800,10980~
+  -600,12840,-600,12640
+** Processing line: ~  -600,13140,-600,12840~
 - Inside source: true
 *** True Line Result
-  8800,10840,8800,10980
-** Processing line: ~  8700,10760,8800,10840~
+  -600,13140,-600,12840
+** Processing line: ~  -600,13140,-600,13420~
 - Inside source: true
 *** True Line Result
-  8700,10760,8800,10840
-** Processing line: ~  8760,11200,8800,10980~
+  -600,13140,-600,13420
+** Processing line: ~  -600,13700,-600,13420~
 - Inside source: true
 *** True Line Result
-  8760,11200,8800,10980
-** Processing line: ~  8760,11200,8760,11380~
+  -600,13700,-600,13420
+** Processing line: ~  -600,13700,-600,13820~
 - Inside source: true
 *** True Line Result
-  8760,11200,8760,11380
-** Processing line: ~  8760,11380,8800,11560~
+  -600,13700,-600,13820
+** Processing line: ~  -600,13820,-200,13900~
 - Inside source: true
 *** True Line Result
-  8760,11380,8800,11560
-** Processing line: ~  8760,11680,8800,11560~
+  -600,13820,-200,13900
+** Processing line: ~  -600,11240,-560,11000~
 - Inside source: true
 *** True Line Result
-  8760,11680,8800,11560
-** Processing line: ~  8760,11760,8760,11680~
+  -600,11240,-560,11000
+** Processing line: ~  -560,11000,-480,10840~
 - Inside source: true
 *** True Line Result
-  8760,11760,8760,11680
-** Processing line: ~  8760,11760,8760,11920~
+  -560,11000,-480,10840
+** Processing line: ~  -520,10660,-480,10840~
 - Inside source: true
 *** True Line Result
-  8760,11760,8760,11920
-** Processing line: ~  8760,11920,8800,12080~
+  -520,10660,-480,10840
+** Processing line: ~  -520,10660,-520,10480~
 - Inside source: true
 *** True Line Result
-  8760,11920,8800,12080
-** Processing line: ~  8800,12200,8800,12080~
+  -520,10660,-520,10480
+** Processing line: ~  -520,10480,-520,10300~
 - Inside source: true
 *** True Line Result
-  8800,12200,8800,12080
-** Processing line: ~  8700,12240,8800,12200~
+  -520,10480,-520,10300
+** Processing line: ~  -520,10260,-480,10080~
 - Inside source: true
 *** True Line Result
-  8700,12240,8800,12200
-** Processing line: ~  8560,12220,8700,12240~
+  -520,10260,-480,10080
+** Processing line: ~  -480,9880,-440,10060~
 - Inside source: true
 *** True Line Result
-  8560,12220,8700,12240
-** Processing line: ~  8360,12220,8560,12220~
+  -480,9880,-440,10060
+** Processing line: ~  -520,9680,-480,9880~
 - Inside source: true
 *** True Line Result
-  8360,12220,8560,12220
-** Processing line: ~  8160,12240,8360,12220~
+  -520,9680,-480,9880
+** Processing line: ~  -520,9680,-480,9400~
 - Inside source: true
 *** True Line Result
-  8160,12240,8360,12220
-** Processing line: ~  7720,12220,7980,12220~
+  -520,9680,-480,9400
+** Processing line: ~  -480,9400,-480,9160~
 - Inside source: true
 *** True Line Result
-  7720,12220,7980,12220
-** Processing line: ~  7980,12220,8160,12240~
+  -480,9400,-480,9160
+** Processing line: ~  1820,9880,2140,9800~
 - Inside source: true
 *** True Line Result
-  7980,12220,8160,12240
-** Processing line: ~  7400,12200,7720,12220~
+  1820,9880,2140,9800
+** Processing line: ~  1540,9880,1820,9880~
 - Inside source: true
 *** True Line Result
-  7400,12200,7720,12220
-** Processing line: ~  7200,12180,7400,12200~
+  1540,9880,1820,9880
+** Processing line: ~  1200,9920,1500,9880~
 - Inside source: true
 *** True Line Result
-  7200,12180,7400,12200
-** Processing line: ~  7000,12160,7200,12180~
+  1200,9920,1500,9880
+** Processing line: ~  900,9880,1200,9920~
 - Inside source: true
 *** True Line Result
-  7000,12160,7200,12180
-** Processing line: ~  6800,12160,7000,12160~
+  900,9880,1200,9920
+** Processing line: ~  640,9900,840,9880~
 - Inside source: true
 *** True Line Result
-  6800,12160,7000,12160
-** Processing line: ~  6280,12140,6380,12180~
+  640,9900,840,9880
+** Processing line: ~  2380,8760,2800,8760~
 - Inside source: true
 *** True Line Result
-  6280,12140,6380,12180
-** Processing line: ~  6120,12180,6280,12140~
+  2380,8760,2800,8760
+** Processing line: ~  2800,8760,2840,8660~
 - Inside source: true
 *** True Line Result
-  6120,12180,6280,12140
-** Processing line: ~  6540,12180,6800,12160~
+  2800,8760,2840,8660
+** Processing line: ~  2840,8660,2840,8420~
 - Inside source: true
 *** True Line Result
-  6540,12180,6800,12160
-** Processing line: ~  6380,12180,6540,12180~
+  2840,8660,2840,8420
+** Processing line: ~  2840,8160,2840,8420~
 - Inside source: true
 *** True Line Result
-  6380,12180,6540,12180
-** Processing line: ~  5900,12200,6120,12180~
+  2840,8160,2840,8420
+** Processing line: ~  2800,7900,2840,8160~
 - Inside source: true
 *** True Line Result
-  5900,12200,6120,12180
-** Processing line: ~  5620,12180,5900,12200~
+  2800,7900,2840,8160
+** Processing line: ~  2800,7900,2800,7720~
 - Inside source: true
 *** True Line Result
-  5620,12180,5900,12200
-** Processing line: ~  5340,12120,5620,12180~
+  2800,7900,2800,7720
+** Processing line: ~  2800,7540,2800,7720~
 - Inside source: true
 *** True Line Result
-  5340,12120,5620,12180
-** Processing line: ~  5140,12100,5340,12120~
+  2800,7540,2800,7720
+** Processing line: ~  2800,7540,2800,7360~
 - Inside source: true
 *** True Line Result
-  5140,12100,5340,12120
-** Processing line: ~  4980,12120,5140,12100~
+  2800,7540,2800,7360
+** Processing line: ~  2700,7220,2800,7360~
 - Inside source: true
 *** True Line Result
-  4980,12120,5140,12100
-** Processing line: ~  4840,12120,4980,12120~
+  2700,7220,2800,7360
+** Processing line: ~  2400,7220,2700,7220~
 - Inside source: true
 *** True Line Result
-  4840,12120,4980,12120
-** Processing line: ~  4700,12200,4840,12120~
+  2400,7220,2700,7220
+** Processing line: ~  2080,7240,2400,7220~
 - Inside source: true
 *** True Line Result
-  4700,12200,4840,12120
-** Processing line: ~  4700,12380,4700,12200~
+  2080,7240,2400,7220
+** Processing line: ~  1760,7320,2080,7240~
 - Inside source: true
 *** True Line Result
-  4700,12380,4700,12200
-** Processing line: ~  4740,12480,4940,12520~
+  1760,7320,2080,7240
+** Processing line: ~  1380,7360,1720,7320~
 - Inside source: true
 *** True Line Result
-  4740,12480,4940,12520
-** Processing line: ~  4700,12380,4740,12480~
+  1380,7360,1720,7320
+** Processing line: ~  1040,7400,1340,7360~
 - Inside source: true
 *** True Line Result
-  4700,12380,4740,12480
-** Processing line: ~  4940,12520,5160,12560~
+  1040,7400,1340,7360
+** Processing line: ~  640,7400,1000,7420~
 - Inside source: true
 *** True Line Result
-  4940,12520,5160,12560
-** Processing line: ~  5160,12560,5340,12600~
+  640,7400,1000,7420
+** Processing line: ~  300,7380,640,7400~
 - Inside source: true
 *** True Line Result
-  5160,12560,5340,12600
-** Processing line: ~  5340,12600,5400,12600~
+  300,7380,640,7400
+** Processing line: ~  0,7300,240,7380~
 - Inside source: true
 *** True Line Result
-  5340,12600,5400,12600
-** Processing line: ~  5400,12600,5500,12600~
+  0,7300,240,7380
+** Processing line: ~  -300,7180,-60,7300~
 - Inside source: true
 *** True Line Result
-  5400,12600,5500,12600
-** Processing line: ~  5500,12600,5620,12600~
+  -300,7180,-60,7300
+** Processing line: ~  -380,6860,-360,7180~
 - Inside source: true
 *** True Line Result
-  5500,12600,5620,12600
-** Processing line: ~  5620,12600,5720,12560~
+  -380,6860,-360,7180
+** Processing line: ~  -380,6880,-360,6700~
 - Inside source: true
 *** True Line Result
-  5620,12600,5720,12560
-** Processing line: ~  5720,12560,5800,12440~
+  -380,6880,-360,6700
+** Processing line: ~  -360,6700,-260,6540~
 - Inside source: true
 *** True Line Result
-  5720,12560,5800,12440
-** Processing line: ~  5800,12440,5900,12380~
+  -360,6700,-260,6540
+** Processing line: ~  -260,6540,0,6520~
 - Inside source: true
 *** True Line Result
-  5800,12440,5900,12380
-** Processing line: ~  5900,12380,6120,12420~
+  -260,6540,0,6520
+** Processing line: ~  0,6520,240,6640~
 - Inside source: true
 *** True Line Result
-  5900,12380,6120,12420
-** Processing line: ~  6120,12420,6380,12440~
+  0,6520,240,6640
+** Processing line: ~  240,6640,460,6640~
 - Inside source: true
 *** True Line Result
-  6120,12420,6380,12440
-** Processing line: ~  6380,12440,6600,12460~
+  240,6640,460,6640
+** Processing line: ~  460,6640,500,6480~
 - Inside source: true
 *** True Line Result
-  6380,12440,6600,12460
-** Processing line: ~  6720,12460,6840,12520~
+  460,6640,500,6480
+** Processing line: ~  500,6260,500,6480~
 - Inside source: true
 *** True Line Result
-  6720,12460,6840,12520
-** Processing line: ~  6840,12520,6960,12520~
+  500,6260,500,6480
+** Processing line: ~  460,6060,500,6260~
 - Inside source: true
 *** True Line Result
-  6840,12520,6960,12520
-** Processing line: ~  6600,12460,6720,12460~
+  460,6060,500,6260
+** Processing line: ~  460,5860,460,6060~
 - Inside source: true
 *** True Line Result
-  6600,12460,6720,12460
-** Processing line: ~  6960,12520,7040,12500~
+  460,5860,460,6060
+** Processing line: ~  460,5860,500,5640~
 - Inside source: true
 *** True Line Result
-  6960,12520,7040,12500
-** Processing line: ~  7040,12500,7140,12440~
+  460,5860,500,5640
+** Processing line: ~  500,5640,540,5440~
 - Inside source: true
 *** True Line Result
-  7040,12500,7140,12440
-** Processing line: ~  7200,12440,7360,12500~
+  500,5640,540,5440
+** Processing line: ~  540,5440,580,5220~
 - Inside source: true
 *** True Line Result
-  7200,12440,7360,12500
-** Processing line: ~  7360,12500,7600,12560~
+  540,5440,580,5220
+** Processing line: ~  580,5220,580,5000~
 - Inside source: true
 *** True Line Result
-  7360,12500,7600,12560
-** Processing line: ~  7600,12560,7860,12600~
+  580,5220,580,5000
+** Processing line: ~  580,4960,580,4740~
 - Inside source: true
 *** True Line Result
-  7600,12560,7860,12600
-** Processing line: ~  7860,12600,8060,12500~
+  580,4960,580,4740
+** Processing line: ~  580,4740,960,4700~
 - Inside source: true
 *** True Line Result
-  7860,12600,8060,12500
-** Processing line: ~  8100,12500,8200,12340~
+  580,4740,960,4700
+** Processing line: ~  960,4700,1140,4760~
 - Inside source: true
 *** True Line Result
-  8100,12500,8200,12340
-** Processing line: ~  8200,12340,8360,12360~
+  960,4700,1140,4760
+** Processing line: ~  1140,4760,1420,4740~
 - Inside source: true
 *** True Line Result
-  8200,12340,8360,12360
-** Processing line: ~  8360,12360,8560,12400~
+  1140,4760,1420,4740
+** Processing line: ~  1420,4740,1720,4700~
 - Inside source: true
 *** True Line Result
-  8360,12360,8560,12400
-** Processing line: ~  8560,12400,8660,12420~
+  1420,4740,1720,4700
+** Processing line: ~  1720,4700,2000,4740~
 - Inside source: true
 *** True Line Result
-  8560,12400,8660,12420
-** Processing line: ~  8660,12420,8840,12400~
+  1720,4700,2000,4740
+** Processing line: ~  2000,4740,2380,4760~
 - Inside source: true
 *** True Line Result
-  8660,12420,8840,12400
-** Processing line: ~  8840,12400,9000,12360~
+  2000,4740,2380,4760
+** Processing line: ~  2380,4760,2700,4800~
 - Inside source: true
 *** True Line Result
-  8840,12400,9000,12360
-** Processing line: ~  9000,12360,9000,12360~
+  2380,4760,2700,4800
+** Processing line: ~  1720,4600,1760,4300~
 - Inside source: true
 *** True Line Result
-  9000,12360,9000,12360
-** Processing line: ~  2900,4400,2900,4280~
+  1720,4600,1760,4300
+** Processing line: ~  1760,4300,2200,4340~
 - Inside source: true
 *** True Line Result
-  2900,4400,2900,4280
-** Processing line: ~  900,7320,1000,7220~
+  1760,4300,2200,4340
+** Processing line: ~  2200,4340,2560,4340~
 - Inside source: true
 *** True Line Result
-  900,7320,1000,7220
-** Processing line: ~  2640,13040,2900,12920~
+  2200,4340,2560,4340
+** Processing line: ~  2560,4340,2740,4340~
 - Inside source: true
 *** True Line Result
-  2640,13040,2900,12920
-** Processing line: ~  2900,12920,3160,12840~
+  2560,4340,2740,4340
+** Processing line: ~  2160,12580,2440,12400~
 - Inside source: true
 *** True Line Result
-  2900,12920,3160,12840
-** Processing line: ~  3480,12760,3780,12620~
+  2160,12580,2440,12400
+** Processing line: ~  1820,12840,2160,12580~
 - Inside source: true
 *** True Line Result
-  3480,12760,3780,12620
-** Processing line: ~  3780,12620,4020,12460~
+  1820,12840,2160,12580
+** Processing line: ~  1500,13080,1820,12840~
 - Inside source: true
 *** True Line Result
-  3780,12620,4020,12460
-** Processing line: ~  4300,12360,4440,12260~
+  1500,13080,1820,12840
+** Processing line: ~  1140,13340,1500,13080~
 - Inside source: true
 *** True Line Result
-  4300,12360,4440,12260
-** Processing line: ~  4020,12460,4300,12360~
+  1140,13340,1500,13080
+** Processing line: ~  1140,13340,1580,13220~
 - Inside source: true
 *** True Line Result
-  4020,12460,4300,12360
-** Processing line: ~  3160,12840,3480,12760~
+  1140,13340,1580,13220
+** Processing line: ~  2110,13080,2520,13000~
 - Inside source: true
 *** True Line Result
-  3160,12840,3480,12760
-** Processing line: ~  4440,12080,4440,12260~
+  2110,13080,2520,13000
+** Processing line: ~  2520,13000,2900,12800~
 - Inside source: true
 *** True Line Result
-  4440,12080,4440,12260
-** Processing line: ~  4440,12080,4440,11880~
+  2520,13000,2900,12800
+** Processing line: ~  1580,13220,2110,13080~
 - Inside source: true
 *** True Line Result
-  4440,12080,4440,11880
-** Processing line: ~  4440,11880,4440,11720~
+  1580,13220,2110,13080
+** Processing line: ~  2900,12800,3200,12680~
 - Inside source: true
 *** True Line Result
-  4440,11880,4440,11720
-** Processing line: ~  4440,11720,4600,11720~
+  2900,12800,3200,12680
+** Processing line: ~  3200,12680,3440,12640~
 - Inside source: true
 *** True Line Result
-  4440,11720,4600,11720
-** Processing line: ~  4600,11720,4760,11740~
+  3200,12680,3440,12640
+** Processing line: ~  3440,12640,3720,12460~
 - Inside source: true
 *** True Line Result
-  4600,11720,4760,11740
-** Processing line: ~  4760,11740,4980,11760~
+  3440,12640,3720,12460
+** Processing line: ~  3720,12460,4040,12320~
 - Inside source: true
 *** True Line Result
-  4760,11740,4980,11760
-** Processing line: ~  4980,11760,5160,11760~
+  3720,12460,4040,12320
+** Processing line: ~  4040,12320,4360,12200~
 - Inside source: true
 *** True Line Result
-  4980,11760,5160,11760
-** Processing line: ~  5160,11760,5340,11780~
+  4040,12320,4360,12200
+** Processing line: ~  4360,11940,4380,12180~
 - Inside source: true
 *** True Line Result
-  5160,11760,5340,11780
-** Processing line: ~  6000,11860,6120,11820~
+  4360,11940,4380,12180
+** Processing line: ~  4360,11700,4360,11940~
 - Inside source: true
 *** True Line Result
-  6000,11860,6120,11820
-** Processing line: ~  5340,11780,5620,11820~
+  4360,11700,4360,11940
+** Processing line: ~  4360,11700,4540,11500~
 - Inside source: true
 *** True Line Result
-  5340,11780,5620,11820
-** Processing line: ~  5620,11820,6000,11860~
+  4360,11700,4540,11500
+** Processing line: ~  4540,11500,4880,11540~
 - Inside source: true
 *** True Line Result
-  5620,11820,6000,11860
-** Processing line: ~  6120,11820,6360,11820~
+  4540,11500,4880,11540
+** Processing line: ~  6000,11660,6280,11640~
 - Inside source: true
 *** True Line Result
-  6120,11820,6360,11820
-** Processing line: ~  6360,11820,6640,11860~
+  6000,11660,6280,11640
+** Processing line: ~  5440,11600,5720,11610~
 - Inside source: true
 *** True Line Result
-  6360,11820,6640,11860
-** Processing line: ~  6940,11920,7240,11940~
+  5440,11600,5720,11610
+** Processing line: ~  5720,11610,6000,11660~
 - Inside source: true
 *** True Line Result
-  6940,11920,7240,11940
-** Processing line: ~  7240,11940,7520,11960~
+  5720,11610,6000,11660
+** Processing line: ~  6280,11640,6760,11720~
 - Inside source: true
 *** True Line Result
-  7240,11940,7520,11960
-** Processing line: ~  7520,11960,7860,11960~
+  6280,11640,6760,11720
+** Processing line: ~  6760,11720,7060,11780~
 - Inside source: true
 *** True Line Result
-  7520,11960,7860,11960
-** Processing line: ~  7860,11960,8100,11920~
+  6760,11720,7060,11780
+** Processing line: ~  7060,11780,7360,11810~
 - Inside source: true
 *** True Line Result
-  7860,11960,8100,11920
-** Processing line: ~  8100,11920,8420,11940~
+  7060,11780,7360,11810
+** Processing line: ~  7360,11810,7640,11840~
 - Inside source: true
 *** True Line Result
-  8100,11920,8420,11940
-** Processing line: ~  8420,11940,8460,11960~
+  7360,11810,7640,11840
+** Processing line: ~  7640,11840,8000,11830~
 - Inside source: true
 *** True Line Result
-  8420,11940,8460,11960
-** Processing line: ~  8460,11960,8500,11860~
+  7640,11840,8000,11830
+** Processing line: ~  8000,11830,8320,11850~
 - Inside source: true
 *** True Line Result
-  8460,11960,8500,11860
-** Processing line: ~  8460,11760,8500,11860~
+  8000,11830,8320,11850
+** Processing line: ~  8320,11850,8390,11800~
 - Inside source: true
 *** True Line Result
-  8460,11760,8500,11860
-** Processing line: ~  8320,11720,8460,11760~
+  8320,11850,8390,11800
+** Processing line: ~  8330,11760,8390,11800~
 - Inside source: true
 *** True Line Result
-  8320,11720,8460,11760
-** Processing line: ~  8160,11720,8320,11720~
+  8330,11760,8390,11800
+** Processing line: ~  8160,11760,8330,11760~
 - Inside source: true
 *** True Line Result
-  8160,11720,8320,11720
-** Processing line: ~  7940,11720,8160,11720~
+  8160,11760,8330,11760
+** Processing line: ~  7910,11750,8160,11760~
 - Inside source: true
 *** True Line Result
-  7940,11720,8160,11720
-** Processing line: ~  7720,11700,7940,11720~
+  7910,11750,8160,11760
+** Processing line: ~  7660,11740,7900,11750~
 - Inside source: true
 *** True Line Result
-  7720,11700,7940,11720
-** Processing line: ~  7520,11680,7720,11700~
+  7660,11740,7900,11750
+** Processing line: ~  7400,11730,7660,11740~
 - Inside source: true
 *** True Line Result
-  7520,11680,7720,11700
-** Processing line: ~  7320,11680,7520,11680~
+  7400,11730,7660,11740
+** Processing line: ~  7160,11680,7400,11730~
 - Inside source: true
 *** True Line Result
-  7320,11680,7520,11680
-** Processing line: ~  7200,11620,7320,11680~
+  7160,11680,7400,11730
+** Processing line: ~  7080,11570,7160,11680~
 - Inside source: true
 *** True Line Result
-  7200,11620,7320,11680
-** Processing line: ~  7200,11620,7200,11500~
+  7080,11570,7160,11680
+** Processing line: ~  7080,11570,7100,11350~
 - Inside source: true
 *** True Line Result
-  7200,11620,7200,11500
-** Processing line: ~  7200,11500,7280,11440~
+  7080,11570,7100,11350
+** Processing line: ~  7100,11350,7440,11280~
 - Inside source: true
 *** True Line Result
-  7200,11500,7280,11440
-** Processing line: ~  7280,11440,7420,11440~
+  7100,11350,7440,11280
+** Processing line: ~  7440,11280,7940,11280~
 - Inside source: true
 *** True Line Result
-  7280,11440,7420,11440
-** Processing line: ~  7420,11440,7600,11440~
+  7440,11280,7940,11280
+** Processing line: ~  7960,11280,8360,11280~
 - Inside source: true
 *** True Line Result
-  7420,11440,7600,11440
-** Processing line: ~  7600,11440,7980,11460~
+  7960,11280,8360,11280
+** Processing line: ~  5840,11540,6650,11170~
 - Inside source: true
 *** True Line Result
-  7600,11440,7980,11460
-** Processing line: ~  7980,11460,8160,11460~
+  5840,11540,6650,11170
+** Processing line: ~  4880,11540,5440,11600~
 - Inside source: true
 *** True Line Result
-  7980,11460,8160,11460
-** Processing line: ~  8160,11460,8360,11460~
+  4880,11540,5440,11600
+** Processing line: ~  3410,11830,3420,11300~
 - Inside source: true
 *** True Line Result
-  8160,11460,8360,11460
-** Processing line: ~  8360,11460,8460,11400~
+  3410,11830,3420,11300
+** Processing line: ~  3410,11260,3520,10920~
 - Inside source: true
 *** True Line Result
-  8360,11460,8460,11400
-** Processing line: ~  8420,11060,8500,11200~
+  3410,11260,3520,10920
+** Processing line: ~  3520,10590,3520,10920~
 - Inside source: true
 *** True Line Result
-  8420,11060,8500,11200
-** Processing line: ~  8280,11040,8420,11060~
+  3520,10590,3520,10920
+** Processing line: ~  3520,10590,3540,10260~
 - Inside source: true
 *** True Line Result
-  8280,11040,8420,11060
-** Processing line: ~  8100,11060,8280,11040~
+  3520,10590,3540,10260
+** Processing line: ~  3520,9900,3540,10240~
 - Inside source: true
 *** True Line Result
-  8100,11060,8280,11040
-** Processing line: ~  8460,11400,8500,11200~
+  3520,9900,3540,10240
+** Processing line: ~  3520,9900,3640,9590~
 - Inside source: true
 *** True Line Result
-  8460,11400,8500,11200
-** Processing line: ~  7800,11060,8100,11060~
+  3520,9900,3640,9590
+** Processing line: ~  3640,9570,4120,9590~
 - Inside source: true
 *** True Line Result
-  7800,11060,8100,11060
-** Processing line: ~  7520,11060,7800,11060~
+  3640,9570,4120,9590
+** Processing line: ~  4140,9590,4600,9680~
 - Inside source: true
 *** True Line Result
-  7520,11060,7800,11060
-** Processing line: ~  7240,11060,7520,11060~
+  4140,9590,4600,9680
+** Processing line: ~  4620,9680,5030,9730~
 - Inside source: true
 *** True Line Result
-  7240,11060,7520,11060
-** Processing line: ~  6940,11040,7240,11060~
+  4620,9680,5030,9730
+** Processing line: ~  5120,9750,5520,9800~
 - Inside source: true
 *** True Line Result
-  6940,11040,7240,11060
-** Processing line: ~  6640,11000,6940,11040~
+  5120,9750,5520,9800
+** Processing line: ~  5620,9820,6080,9800~
 - Inside source: true
 *** True Line Result
-  6640,11000,6940,11040
-** Processing line: ~  6420,10980,6640,11000~
+  5620,9820,6080,9800
+** Processing line: ~  6130,9810,6580,9820~
 - Inside source: true
 *** True Line Result
-  6420,10980,6640,11000
-** Processing line: ~  6360,11060,6420,10980~
+  6130,9810,6580,9820
+** Processing line: ~  6640,9820,6800,9700~
 - Inside source: true
 *** True Line Result
-  6360,11060,6420,10980
-** Processing line: ~  6360,11180,6360,11060~
+  6640,9820,6800,9700
+** Processing line: ~  6780,9400,6800,9700~
 - Inside source: true
 *** True Line Result
-  6360,11180,6360,11060
-** Processing line: ~  6200,11280,6360,11180~
+  6780,9400,6800,9700
+** Processing line: ~  6780,9400,6840,9140~
 - Inside source: true
 *** True Line Result
-  6200,11280,6360,11180
-** Processing line: ~  5960,11300,6200,11280~
+  6780,9400,6840,9140
+** Processing line: ~  6820,8860,6840,9120~
 - Inside source: true
 *** True Line Result
-  5960,11300,6200,11280
-** Processing line: ~  5720,11280,5960,11300~
+  6820,8860,6840,9120
+** Processing line: ~  6780,8600,6820,8830~
 - Inside source: true
 *** True Line Result
-  5720,11280,5960,11300
-** Processing line: ~  5500,11280,5720,11280~
+  6780,8600,6820,8830
+** Processing line: ~  6720,8350,6780,8570~
 - Inside source: true
 *** True Line Result
-  5500,11280,5720,11280
-** Processing line: ~  4940,11300,5200,11280~
+  6720,8350,6780,8570
+** Processing line: ~  6480,8340,6720,8320~
 - Inside source: true
 *** True Line Result
-  4940,11300,5200,11280
-** Processing line: ~  4660,11260,4940,11300~
+  6480,8340,6720,8320
+** Processing line: ~  6260,8400,6480,8340~
 - Inside source: true
 *** True Line Result
-  4660,11260,4940,11300
-** Processing line: ~  4440,11280,4660,11260~
+  6260,8400,6480,8340
+** Processing line: ~  6050,8580,6240,8400~
 - Inside source: true
 *** True Line Result
-  4440,11280,4660,11260
-** Processing line: ~  4260,11280,4440,11280~
+  6050,8580,6240,8400
+** Processing line: ~  5760,8630,6040,8590~
 - Inside source: true
 *** True Line Result
-  4260,11280,4440,11280
-** Processing line: ~  4220,11220,4260,11280~
+  5760,8630,6040,8590
+** Processing line: ~  5520,8690,5740,8630~
 - Inside source: true
 *** True Line Result
-  4220,11220,4260,11280
-** Processing line: ~  4080,11280,4220,11220~
+  5520,8690,5740,8630
+** Processing line: ~  5120,8690,5450,8700~
 - Inside source: true
 *** True Line Result
-  4080,11280,4220,11220
-** Processing line: ~  3980,11420,4080,11280~
+  5120,8690,5450,8700
+** Processing line: ~  4570,8670,5080,8690~
 - Inside source: true
 *** True Line Result
-  3980,11420,4080,11280
-** Processing line: ~  3980,11420,4040,11620~
+  4570,8670,5080,8690
+** Processing line: ~  4020,8610,4540,8670~
 - Inside source: true
 *** True Line Result
-  3980,11420,4040,11620
-** Processing line: ~  4040,11620,4040,11820~
+  4020,8610,4540,8670
+** Processing line: ~  3540,8480,4020,8610~
 - Inside source: true
 *** True Line Result
-  4040,11620,4040,11820
-** Processing line: ~  3980,11960,4040,11820~
+  3540,8480,4020,8610
+** Processing line: ~  3520,8230,3520,8480~
 - Inside source: true
 *** True Line Result
-  3980,11960,4040,11820
-** Processing line: ~  3840,12000,3980,11960~
+  3520,8230,3520,8480
+** Processing line: ~  3520,7930,3520,8230~
 - Inside source: true
 *** True Line Result
-  3840,12000,3980,11960
-** Processing line: ~  3720,11940,3840,12000~
+  3520,7930,3520,8230
+** Processing line: ~  3520,7930,3540,7630~
 - Inside source: true
 *** True Line Result
-  3720,11940,3840,12000
-** Processing line: ~  3680,11800,3720,11940~
+  3520,7930,3540,7630
+** Processing line: ~  3480,7320,3540,7610~
 - Inside source: true
 *** True Line Result
-  3680,11800,3720,11940
-** Processing line: ~  3680,11580,3680,11800~
+  3480,7320,3540,7610
+** Processing line: ~  3480,7280,3500,7010~
 - Inside source: true
 *** True Line Result
-  3680,11580,3680,11800
-** Processing line: ~  3680,11360,3680,11580~
+  3480,7280,3500,7010
+** Processing line: ~  3500,6980,3680,6850~
 - Inside source: true
 *** True Line Result
-  3680,11360,3680,11580
-** Processing line: ~  3680,11360,3680,11260~
+  3500,6980,3680,6850
+** Processing line: ~  3680,6850,4220,6840~
 - Inside source: true
 *** True Line Result
-  3680,11360,3680,11260
-** Processing line: ~  3680,11080,3680,11260~
+  3680,6850,4220,6840
+** Processing line: ~  4230,6840,4760,6850~
 - Inside source: true
 *** True Line Result
-  3680,11080,3680,11260
-** Processing line: ~  3680,11080,3680,10880~
+  4230,6840,4760,6850
+** Processing line: ~  4780,6850,5310,6860~
 - Inside source: true
 *** True Line Result
-  3680,11080,3680,10880
-** Processing line: ~  3680,10700,3680,10880~
+  4780,6850,5310,6860
+** Processing line: ~  5310,6860,5720,6940~
 - Inside source: true
 *** True Line Result
-  3680,10700,3680,10880
-** Processing line: ~  3680,10700,3680,10620~
+  5310,6860,5720,6940
+** Processing line: ~  5720,6940,5880,7250~
 - Inside source: true
 *** True Line Result
-  3680,10700,3680,10620
-** Processing line: ~  3680,10480,3680,10620~
+  5720,6940,5880,7250
+** Processing line: ~  5880,7250,5900,7520~
 - Inside source: true
 *** True Line Result
-  3680,10480,3680,10620
-** Processing line: ~  3680,10480,3680,10300~
+  5880,7250,5900,7520
+** Processing line: ~  100,11240,440,11300~
 - Inside source: true
 *** True Line Result
-  3680,10480,3680,10300
-** Processing line: ~  3680,10300,3680,10100~
+  100,11240,440,11300
+** Processing line: ~  440,11300,760,11330~
 - Inside source: true
 *** True Line Result
-  3680,10300,3680,10100
-** Processing line: ~  3680,10100,3680,9940~
+  440,11300,760,11330
+** Processing line: ~  1480,11280,1840,11230~
 - Inside source: true
 *** True Line Result
-  3680,10100,3680,9940
-** Processing line: ~  3680,9940,3720,9860~
+  1480,11280,1840,11230
+** Processing line: ~  2200,11130,2360,11090~
 - Inside source: true
 *** True Line Result
-  3680,9940,3720,9860
-** Processing line: ~  3720,9860,3920,9900~
+  2200,11130,2360,11090
+** Processing line: ~  1840,11230,2200,11130~
 - Inside source: true
 *** True Line Result
-  3720,9860,3920,9900
-** Processing line: ~  3920,9900,4220,9880~
+  1840,11230,2200,11130
+** Processing line: ~#+end_src~
+- Line was identified as the end of a code block.
+*** True Line Result
+#+end_src
+** Processing line: ~~
+- End of paragraph detected.
+*** True Line Result
+
+** Processing line: ~*** Rpg Narrative - Choose Your Own Adventure - decision.rb~
+- Header detected.
+*** True Line Result
+
+*** True Line Result
+*** Rpg Narrative - Choose Your Own Adventure - decision.rb
+** Processing line: ~#+begin_src ruby~
+- Line was identified as the beginning of a code block.
+*** True Line Result
+
+*** True Line Result
+#+begin_src ruby
+** Processing line: ~  # ./samples/99_genre_rpg_narrative/choose_your_own_adventure/app/decision.rb~
 - Inside source: true
 *** True Line Result
-  3920,9900,4220,9880
-** Processing line: ~  4980,9940,5340,9960~
+  # ./samples/99_genre_rpg_narrative/choose_your_own_adventure/app/decision.rb
+** Processing line: ~  # Hey there! Welcome to Four Decisions. Here is how you~
 - Inside source: true
 *** True Line Result
-  4980,9940,5340,9960
-** Processing line: ~  4220,9880,4540,9900~
+  # Hey there! Welcome to Four Decisions. Here is how you
+** Processing line: ~  # create your decision tree. Remove =being and =end from the text to~
 - Inside source: true
 *** True Line Result
-  4220,9880,4540,9900
-** Processing line: ~  4540,9900,4980,9940~
+  # create your decision tree. Remove =being and =end from the text to
+** Processing line: ~  # enable the game (just save the file). Change stuff and see what happens!~
 - Inside source: true
 *** True Line Result
-  4540,9900,4980,9940
-** Processing line: ~  5340,9960,5620,9960~
+  # enable the game (just save the file). Change stuff and see what happens!
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-  5340,9960,5620,9960
-** Processing line: ~  5620,9960,5900,9960~
+
+** Processing line: ~  def game~
 - Inside source: true
 *** True Line Result
-  5620,9960,5900,9960
-** Processing line: ~  5900,9960,6160,10000~
+  def game
+** Processing line: ~    {~
 - Inside source: true
 *** True Line Result
-  5900,9960,6160,10000
-** Processing line: ~  6160,10000,6480,10000~
+    {
+** Processing line: ~      starting_decision: :stormy_night,~
 - Inside source: true
 *** True Line Result
-  6160,10000,6480,10000
-** Processing line: ~  6480,10000,6720,10000~
+      starting_decision: :stormy_night,
+** Processing line: ~      decisions: {~
 - Inside source: true
 *** True Line Result
-  6480,10000,6720,10000
-** Processing line: ~  6720,10000,6880,9860~
+      decisions: {
+** Processing line: ~        stormy_night: {~
 - Inside source: true
 *** True Line Result
-  6720,10000,6880,9860
-** Processing line: ~  6880,9860,6880,9520~
+        stormy_night: {
+** Processing line: ~          description: 'It was a dark and stormy night. (storyline located in decision.rb)',~
 - Inside source: true
 *** True Line Result
-  6880,9860,6880,9520
-** Processing line: ~  6880,9520,6940,9340~
+          description: 'It was a dark and stormy night. (storyline located in decision.rb)',
+** Processing line: ~          option_one: {~
 - Inside source: true
 *** True Line Result
-  6880,9520,6940,9340
-** Processing line: ~  6940,9120,6940,9340~
+          option_one: {
+** Processing line: ~            description: 'Go to sleep.',~
 - Inside source: true
 *** True Line Result
-  6940,9120,6940,9340
-** Processing line: ~  6940,9120,6940,8920~
+            description: 'Go to sleep.',
+** Processing line: ~            decision: :nap~
 - Inside source: true
 *** True Line Result
-  6940,9120,6940,8920
-** Processing line: ~  6940,8700,6940,8920~
+            decision: :nap
+** Processing line: ~          },~
 - Inside source: true
 *** True Line Result
-  6940,8700,6940,8920
-** Processing line: ~  6880,8500,6940,8700~
+          },
+** Processing line: ~          option_two: {~
 - Inside source: true
 *** True Line Result
-  6880,8500,6940,8700
-** Processing line: ~  6880,8320,6880,8500~
+          option_two: {
+** Processing line: ~            description: 'Watch a movie.',~
 - Inside source: true
 *** True Line Result
-  6880,8320,6880,8500
-** Processing line: ~  7140,8320,7140,8180~
+            description: 'Watch a movie.',
+** Processing line: ~            decision: :movie~
 - Inside source: true
 *** True Line Result
-  7140,8320,7140,8180
-** Processing line: ~  6760,8260,6880,8320~
+            decision: :movie
+** Processing line: ~          },~
 - Inside source: true
 *** True Line Result
-  6760,8260,6880,8320
-** Processing line: ~  6540,8240,6760,8260~
+          },
+** Processing line: ~          option_three: {~
 - Inside source: true
 *** True Line Result
-  6540,8240,6760,8260
-** Processing line: ~  6420,8180,6540,8240~
+          option_three: {
+** Processing line: ~            description: 'Go outside.',~
 - Inside source: true
 *** True Line Result
-  6420,8180,6540,8240
-** Processing line: ~  6280,8240,6420,8180~
+            description: 'Go outside.',
+** Processing line: ~            decision: :go_outside~
 - Inside source: true
 *** True Line Result
-  6280,8240,6420,8180
-** Processing line: ~  6160,8300,6280,8240~
+            decision: :go_outside
+** Processing line: ~          },~
 - Inside source: true
 *** True Line Result
-  6160,8300,6280,8240
-** Processing line: ~  6120,8400,6160,8300~
+          },
+** Processing line: ~          option_four: {~
 - Inside source: true
 *** True Line Result
-  6120,8400,6160,8300
-** Processing line: ~  6080,8520,6120,8400~
+          option_four: {
+** Processing line: ~            description: 'Get a snack.',~
 - Inside source: true
 *** True Line Result
-  6080,8520,6120,8400
-** Processing line: ~  5840,8480,6080,8520~
+            description: 'Get a snack.',
+** Processing line: ~            decision: :get_a_snack~
 - Inside source: true
 *** True Line Result
-  5840,8480,6080,8520
-** Processing line: ~  5620,8500,5840,8480~
+            decision: :get_a_snack
+** Processing line: ~          }~
 - Inside source: true
 *** True Line Result
-  5620,8500,5840,8480
-** Processing line: ~  5500,8500,5620,8500~
+          }
+** Processing line: ~        },~
 - Inside source: true
 *** True Line Result
-  5500,8500,5620,8500
-** Processing line: ~  5340,8560,5500,8500~
+        },
+** Processing line: ~        nap: {~
 - Inside source: true
 *** True Line Result
-  5340,8560,5500,8500
-** Processing line: ~  5160,8540,5340,8560~
+        nap: {
+** Processing line: ~          description: 'You took a nap. The end.',~
 - Inside source: true
 *** True Line Result
-  5160,8540,5340,8560
-** Processing line: ~  4620,8520,4880,8520~
+          description: 'You took a nap. The end.',
+** Processing line: ~          option_one: {~
 - Inside source: true
 *** True Line Result
-  4620,8520,4880,8520
-** Processing line: ~  4360,8480,4620,8520~
+          option_one: {
+** Processing line: ~            description: 'Start over.',~
 - Inside source: true
 *** True Line Result
-  4360,8480,4620,8520
-** Processing line: ~  4880,8520,5160,8540~
+            description: 'Start over.',
+** Processing line: ~            decision: :stormy_night~
 - Inside source: true
 *** True Line Result
-  4880,8520,5160,8540
-** Processing line: ~  4140,8440,4360,8480~
+            decision: :stormy_night
+** Processing line: ~          }~
 - Inside source: true
 *** True Line Result
-  4140,8440,4360,8480
-** Processing line: ~  3920,8460,4140,8440~
+          }
+** Processing line: ~        }~
 - Inside source: true
 *** True Line Result
-  3920,8460,4140,8440
-** Processing line: ~  3720,8380,3920,8460~
+        }
+** Processing line: ~      }~
 - Inside source: true
 *** True Line Result
-  3720,8380,3920,8460
-** Processing line: ~  3680,8160,3720,8380~
+      }
+** Processing line: ~    }~
 - Inside source: true
 *** True Line Result
-  3680,8160,3720,8380
-** Processing line: ~  3680,8160,3720,7940~
+    }
+** Processing line: ~  end~
 - Inside source: true
 *** True Line Result
-  3680,8160,3720,7940
-** Processing line: ~  3720,7720,3720,7940~
+  end
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-  3720,7720,3720,7940
-** Processing line: ~  3680,7580,3720,7720~
+
+** Processing line: ~#+end_src~
+- Line was identified as the end of a code block.
+*** True Line Result
+#+end_src
+** Processing line: ~~
+- End of paragraph detected.
+*** True Line Result
+
+** Processing line: ~*** Rpg Narrative - Choose Your Own Adventure - main.rb~
+- Header detected.
+*** True Line Result
+
+*** True Line Result
+*** Rpg Narrative - Choose Your Own Adventure - main.rb
+** Processing line: ~#+begin_src ruby~
+- Line was identified as the beginning of a code block.
+*** True Line Result
+
+*** True Line Result
+#+begin_src ruby
+** Processing line: ~  # ./samples/99_genre_rpg_narrative/choose_your_own_adventure/app/main.rb~
 - Inside source: true
 *** True Line Result
-  3680,7580,3720,7720
-** Processing line: ~  3680,7580,3720,7440~
+  # ./samples/99_genre_rpg_narrative/choose_your_own_adventure/app/main.rb
+** Processing line: ~  =begin~
 - Inside source: true
 *** True Line Result
-  3680,7580,3720,7440
-** Processing line: ~  3720,7440,3720,7300~
+  =begin
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-  3720,7440,3720,7300
-** Processing line: ~  3720,7160,3720,7300~
+
+** Processing line: ~   Reminders:~
 - Inside source: true
 *** True Line Result
-  3720,7160,3720,7300
-** Processing line: ~  3720,7160,3720,7020~
+   Reminders:
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-  3720,7160,3720,7020
-** Processing line: ~  3720,7020,3780,6900~
+
+** Processing line: ~   - Hashes: Collection of unique keys and their corresponding values. The values can be found~
 - Inside source: true
 *** True Line Result
-  3720,7020,3780,6900
-** Processing line: ~  3780,6900,4080,6940~
+   - Hashes: Collection of unique keys and their corresponding values. The values can be found
+** Processing line: ~     using their keys.~
 - Inside source: true
 *** True Line Result
-  3780,6900,4080,6940
-** Processing line: ~  4080,6940,4340,6980~
+     using their keys.
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-  4080,6940,4340,6980
-** Processing line: ~  4340,6980,4600,6980~
+
+** Processing line: ~     In this sample app, the decisions needed for the game are stored in a hash. In fact, the~
 - Inside source: true
 *** True Line Result
-  4340,6980,4600,6980
-** Processing line: ~  4600,6980,4880,6980~
+     In this sample app, the decisions needed for the game are stored in a hash. In fact, the
+** Processing line: ~     decision.rb file contains hashes inside of other hashes!~
 - Inside source: true
 *** True Line Result
-  4600,6980,4880,6980
-** Processing line: ~  4880,6980,5160,6980~
+     decision.rb file contains hashes inside of other hashes!
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-  4880,6980,5160,6980
-** Processing line: ~  5160,6980,5400,7000~
+
+** Processing line: ~     Each option is a key in the first hash, but also contains a hash (description and~
 - Inside source: true
 *** True Line Result
-  5160,6980,5400,7000
-** Processing line: ~  5400,7000,5560,7020~
+     Each option is a key in the first hash, but also contains a hash (description and
+** Processing line: ~     decision being its keys) as its value.~
 - Inside source: true
 *** True Line Result
-  5400,7000,5560,7020
-** Processing line: ~  5560,7020,5660,7080~
+     decision being its keys) as its value.
+** Processing line: ~     Go into the decision.rb file and take a look before diving into the code below.~
 - Inside source: true
 *** True Line Result
-  5560,7020,5660,7080
-** Processing line: ~  5660,7080,5660,7280~
+     Go into the decision.rb file and take a look before diving into the code below.
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-  5660,7080,5660,7280
-** Processing line: ~  5660,7280,5660,7440~
+
+** Processing line: ~   - args.outputs.labels: An array. The values generate a label.~
 - Inside source: true
 *** True Line Result
-  5660,7280,5660,7440
-** Processing line: ~  5660,7440,5740,7520~
+   - args.outputs.labels: An array. The values generate a label.
+** Processing line: ~     The parameters are [X, Y, TEXT, SIZE, ALIGNMENT, RED, GREEN, BLUE, ALPHA, FONT STYLE]~
 - Inside source: true
 *** True Line Result
-  5660,7440,5740,7520
-** Processing line: ~  5740,7520,5740,7600~
+     The parameters are [X, Y, TEXT, SIZE, ALIGNMENT, RED, GREEN, BLUE, ALPHA, FONT STYLE]
+** Processing line: ~     For more information about labels, go to mygame/documentation/02-labels.md.~
 - Inside source: true
 *** True Line Result
-  5740,7520,5740,7600
-** Processing line: ~  5740,7600,5900,7600~
+     For more information about labels, go to mygame/documentation/02-labels.md.
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-  5740,7600,5900,7600
-** Processing line: ~  5900,7600,6040,7540~
+
+** Processing line: ~   - args.keyboard.key_down.KEY: Determines if a key is in the down state or pressed down.~
 - Inside source: true
 *** True Line Result
-  5900,7600,6040,7540
-** Processing line: ~  6040,7540,6040,7320~
+   - args.keyboard.key_down.KEY: Determines if a key is in the down state or pressed down.
+** Processing line: ~     For more information about the keyboard, go to mygame/documentation/06-keyboard.md.~
 - Inside source: true
 *** True Line Result
-  6040,7540,6040,7320
-** Processing line: ~  6040,7320,6120,7200~
+     For more information about the keyboard, go to mygame/documentation/06-keyboard.md.
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-  6040,7320,6120,7200
-** Processing line: ~  6120,7200,6120,7040~
+
+** Processing line: ~   - String interpolation: uses #{} syntax; everything between the #{ and the } is evaluated~
 - Inside source: true
 *** True Line Result
-  6120,7200,6120,7040
-** Processing line: ~  6120,7040,6240,7000~
+   - String interpolation: uses #{} syntax; everything between the #{ and the } is evaluated
+** Processing line: ~     as Ruby code, and the placeholder is replaced with its corresponding value or result.~
 - Inside source: true
 *** True Line Result
-  6120,7040,6240,7000
-** Processing line: ~  6240,7000,6480,7060~
+     as Ruby code, and the placeholder is replaced with its corresponding value or result.
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-  6240,7000,6480,7060
-** Processing line: ~  6480,7060,6800,7060~
+
+** Processing line: ~  =end~
 - Inside source: true
 *** True Line Result
-  6480,7060,6800,7060
-** Processing line: ~  6800,7060,7080,7080~
+  =end
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-  6800,7060,7080,7080
-** Processing line: ~  7080,7080,7320,7100~
+
+** Processing line: ~  # This sample app provides users with a story and multiple decisions that they can choose to make.~
 - Inside source: true
 *** True Line Result
-  7080,7080,7320,7100
-** Processing line: ~  7940,7100,7980,6920~
+  # This sample app provides users with a story and multiple decisions that they can choose to make.
+** Processing line: ~  # Users can make a decision using their keyboard, and the story will move forward based on user choices.~
 - Inside source: true
 *** True Line Result
-  7940,7100,7980,6920
-** Processing line: ~  7860,6860,7980,6920~
+  # Users can make a decision using their keyboard, and the story will move forward based on user choices.
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-  7860,6860,7980,6920
-** Processing line: ~  7640,6860,7860,6860~
+
+** Processing line: ~  # The decisions available to users are stored in the decision.rb file.~
 - Inside source: true
 *** True Line Result
-  7640,6860,7860,6860
-** Processing line: ~  7400,6840,7640,6860~
+  # The decisions available to users are stored in the decision.rb file.
+** Processing line: ~  # We must have access to it for the game to function properly.~
 - Inside source: true
 *** True Line Result
-  7400,6840,7640,6860
-** Processing line: ~  7320,7100,7560,7120~
+  # We must have access to it for the game to function properly.
+** Processing line: ~  GAME_FILE = 'app/decision.rb' # found in app folder~
 - Inside source: true
 *** True Line Result
-  7320,7100,7560,7120
-** Processing line: ~  7560,7120,7760,7120~
+  GAME_FILE = 'app/decision.rb' # found in app folder
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-  7560,7120,7760,7120
-** Processing line: ~  7760,7120,7940,7100~
+
+** Processing line: ~  require GAME_FILE # require used to load another file, import class/method definitions~
 - Inside source: true
 *** True Line Result
-  7760,7120,7940,7100
-** Processing line: ~  7200,6820,7400,6840~
+  require GAME_FILE # require used to load another file, import class/method definitions
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-  7200,6820,7400,6840
-** Processing line: ~  7040,6820,7200,6820~
+
+** Processing line: ~  # Instructions are given using labels to users if they have not yet set up their story in the decision.rb file.~
 - Inside source: true
 *** True Line Result
-  7040,6820,7200,6820
-** Processing line: ~  6600,6840,6840,6840~
+  # Instructions are given using labels to users if they have not yet set up their story in the decision.rb file.
+** Processing line: ~  # Otherwise, the game is run.~
 - Inside source: true
 *** True Line Result
-  6600,6840,6840,6840
-** Processing line: ~  6380,6800,6600,6840~
+  # Otherwise, the game is run.
+** Processing line: ~  def tick args~
 - Inside source: true
 *** True Line Result
-  6380,6800,6600,6840
-** Processing line: ~  6120,6800,6380,6800~
+  def tick args
+** Processing line: ~    if !args.state.loaded && !respond_to?(:game) # if game is not loaded and not responding to game symbol's method~
 - Inside source: true
 *** True Line Result
-  6120,6800,6380,6800
-** Processing line: ~  5900,6840,6120,6800~
+    if !args.state.loaded && !respond_to?(:game) # if game is not loaded and not responding to game symbol's method
+** Processing line: ~      args.labels << [640, 370, 'Hey there! Welcome to Four Decisions.', 0, 1] # a welcome label is shown~
 - Inside source: true
 *** True Line Result
-  5900,6840,6120,6800
-** Processing line: ~  5620,6820,5900,6840~
+      args.labels << [640, 370, 'Hey there! Welcome to Four Decisions.', 0, 1] # a welcome label is shown
+** Processing line: ~      args.labels << [640, 340, 'Go to the file called decision.rb and tell me your story.', 0, 1]~
 - Inside source: true
 *** True Line Result
-  5620,6820,5900,6840
-** Processing line: ~  5400,6800,5620,6820~
+      args.labels << [640, 340, 'Go to the file called decision.rb and tell me your story.', 0, 1]
+** Processing line: ~    elsif respond_to?(:game) # otherwise, if responds to game~
 - Inside source: true
 *** True Line Result
-  5400,6800,5620,6820
-** Processing line: ~  5140,6800,5400,6800~
+    elsif respond_to?(:game) # otherwise, if responds to game
+** Processing line: ~      args.state.loaded = true~
 - Inside source: true
 *** True Line Result
-  5140,6800,5400,6800
-** Processing line: ~  4880,6780,5140,6800~
+      args.state.loaded = true
+** Processing line: ~      tick_game args # calls tick_game method, runs game~
 - Inside source: true
 *** True Line Result
-  4880,6780,5140,6800
-** Processing line: ~  4600,6760,4880,6780~
+      tick_game args # calls tick_game method, runs game
+** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
-  4600,6760,4880,6780
-** Processing line: ~  4340,6760,4600,6760~
+    end
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-  4340,6760,4600,6760
-** Processing line: ~  4080,6760,4340,6760~
+
+** Processing line: ~    if args.state.tick_count.mod_zero? 60 # update every 60 frames~
 - Inside source: true
 *** True Line Result
-  4080,6760,4340,6760
-** Processing line: ~  3840,6740,4080,6760~
+    if args.state.tick_count.mod_zero? 60 # update every 60 frames
+** Processing line: ~      t = args.gtk.ffi_file.mtime GAME_FILE # mtime returns modification time for named file~
 - Inside source: true
 *** True Line Result
-  3840,6740,4080,6760
-** Processing line: ~  3680,6720,3840,6740~
+      t = args.gtk.ffi_file.mtime GAME_FILE # mtime returns modification time for named file
+** Processing line: ~      if t != args.state.mtime~
 - Inside source: true
 *** True Line Result
-  3680,6720,3840,6740
-** Processing line: ~  3680,6720,3680,6560~
+      if t != args.state.mtime
+** Processing line: ~        args.state.mtime = t~
 - Inside source: true
 *** True Line Result
-  3680,6720,3680,6560
-** Processing line: ~  3680,6560,3720,6400~
+        args.state.mtime = t
+** Processing line: ~        require GAME_FILE # require used to load file~
 - Inside source: true
 *** True Line Result
-  3680,6560,3720,6400
-** Processing line: ~  3720,6400,3720,6200~
+        require GAME_FILE # require used to load file
+** Processing line: ~        args.state.game_definition = nil # game definition and decision are empty~
 - Inside source: true
 *** True Line Result
-  3720,6400,3720,6200
-** Processing line: ~  3720,6200,3780,6000~
+        args.state.game_definition = nil # game definition and decision are empty
+** Processing line: ~        args.state.decision_id = nil~
 - Inside source: true
 *** True Line Result
-  3720,6200,3780,6000
-** Processing line: ~  3720,5780,3780,6000~
+        args.state.decision_id = nil
+** Processing line: ~      end~
 - Inside source: true
 *** True Line Result
-  3720,5780,3780,6000
-** Processing line: ~  3720,5580,3720,5780~
+      end
+** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
-  3720,5580,3720,5780
-** Processing line: ~  3720,5360,3720,5580~
+    end
+** Processing line: ~  end~
 - Inside source: true
 *** True Line Result
-  3720,5360,3720,5580
-** Processing line: ~  3720,5360,3840,5240~
+  end
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-  3720,5360,3840,5240
-** Processing line: ~  3840,5240,4200,5260~
+
+** Processing line: ~  # Runs methods needed for game to function properly~
 - Inside source: true
 *** True Line Result
-  3840,5240,4200,5260
-** Processing line: ~  4200,5260,4600,5280~
+  # Runs methods needed for game to function properly
+** Processing line: ~  # Creates a rectangular border around the screen~
 - Inside source: true
 *** True Line Result
-  4200,5260,4600,5280
-** Processing line: ~  4600,5280,4880,5280~
+  # Creates a rectangular border around the screen
+** Processing line: ~  def tick_game args~
 - Inside source: true
 *** True Line Result
-  4600,5280,4880,5280
-** Processing line: ~  4880,5280,5140,5200~
+  def tick_game args
+** Processing line: ~    defaults args~
 - Inside source: true
 *** True Line Result
-  4880,5280,5140,5200
-** Processing line: ~  5140,5200,5220,5100~
+    defaults args
+** Processing line: ~    args.borders << args.grid.rect~
 - Inside source: true
 *** True Line Result
-  5140,5200,5220,5100
-** Processing line: ~  5220,5100,5280,4900~
+    args.borders << args.grid.rect
+** Processing line: ~    render_decision args~
 - Inside source: true
 *** True Line Result
-  5220,5100,5280,4900
-** Processing line: ~  5280,4900,5340,4840~
+    render_decision args
+** Processing line: ~    process_inputs args~
 - Inside source: true
 *** True Line Result
-  5280,4900,5340,4840
-** Processing line: ~  5340,4840,5720,4880~
+    process_inputs args
+** Processing line: ~  end~
 - Inside source: true
 *** True Line Result
-  5340,4840,5720,4880
-** Processing line: ~  6120,4880,6480,4860~
+  end
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-  6120,4880,6480,4860
-** Processing line: ~  6880,4840,7200,4860~
+
+** Processing line: ~  # Sets default values and uses decision.rb file to define game and decision_id~
 - Inside source: true
 *** True Line Result
-  6880,4840,7200,4860
-** Processing line: ~  6480,4860,6880,4840~
+  # Sets default values and uses decision.rb file to define game and decision_id
+** Processing line: ~  # variable using the starting decision~
 - Inside source: true
 *** True Line Result
-  6480,4860,6880,4840
-** Processing line: ~  7200,4860,7320,4860~
+  # variable using the starting decision
+** Processing line: ~  def defaults args~
 - Inside source: true
 *** True Line Result
-  7200,4860,7320,4860
-** Processing line: ~  7320,4860,7360,4740~
+  def defaults args
+** Processing line: ~    args.state.game_definition ||= game~
 - Inside source: true
 *** True Line Result
-  7320,4860,7360,4740
-** Processing line: ~  7360,4600,7440,4520~
+    args.state.game_definition ||= game
+** Processing line: ~    args.state.decision_id ||= args.state.game_definition[:starting_decision]~
 - Inside source: true
 *** True Line Result
-  7360,4600,7440,4520
-** Processing line: ~  7360,4600,7360,4740~
+    args.state.decision_id ||= args.state.game_definition[:starting_decision]
+** Processing line: ~  end~
 - Inside source: true
 *** True Line Result
-  7360,4600,7360,4740
-** Processing line: ~  7440,4520,7640,4520~
+  end
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-  7440,4520,7640,4520
-** Processing line: ~  7640,4520,7800,4480~
+
+** Processing line: ~  # Outputs the possible decision descriptions the user can choose onto the screen~
 - Inside source: true
 *** True Line Result
-  7640,4520,7800,4480
-** Processing line: ~  7800,4480,7800,4280~
+  # Outputs the possible decision descriptions the user can choose onto the screen
+** Processing line: ~  # as well as what key to press on their keyboard to make their decision~
 - Inside source: true
 *** True Line Result
-  7800,4480,7800,4280
-** Processing line: ~  7800,4280,7800,4040~
+  # as well as what key to press on their keyboard to make their decision
+** Processing line: ~  def render_decision args~
 - Inside source: true
 *** True Line Result
-  7800,4280,7800,4040
-** Processing line: ~  7800,4040,7800,3780~
+  def render_decision args
+** Processing line: ~    decision = current_decision args~
 - Inside source: true
 *** True Line Result
-  7800,4040,7800,3780
-** Processing line: ~  7800,3560,7800,3780~
+    decision = current_decision args
+** Processing line: ~    # text is either the value of decision's description key or warning that no description exists~
 - Inside source: true
 *** True Line Result
-  7800,3560,7800,3780
-** Processing line: ~  7800,3560,7860,3440~
+    # text is either the value of decision's description key or warning that no description exists
+** Processing line: ~    args.labels << [640, 360, decision[:description] || "No definition found for #{args.state.decision_id}. Please update decision.rb.", 0, 1] # uses string interpolation~
 - Inside source: true
 *** True Line Result
-  7800,3560,7860,3440
-** Processing line: ~  7860,3440,8060,3460~
+    args.labels << [640, 360, decision[:description] || "No definition found for #{args.state.decision_id}. Please update decision.rb.", 0, 1] # uses string interpolation
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-  7860,3440,8060,3460
-** Processing line: ~  8060,3460,8160,3340~
+
+** Processing line: ~    # All decisions are stored in a hash~
 - Inside source: true
 *** True Line Result
-  8060,3460,8160,3340
-** Processing line: ~  8160,3340,8160,3140~
+    # All decisions are stored in a hash
+** Processing line: ~    # The descriptions output onto the screen are the values for the description keys of the hash.~
 - Inside source: true
 *** True Line Result
-  8160,3340,8160,3140
-** Processing line: ~  8160,3140,8160,2960~
+    # The descriptions output onto the screen are the values for the description keys of the hash.
+** Processing line: ~    if decision[:option_one]~
 - Inside source: true
 *** True Line Result
-  8160,3140,8160,2960
-** Processing line: ~  8000,2900,8160,2960~
+    if decision[:option_one]
+** Processing line: ~      args.labels << [10, 360, decision[:option_one][:description], 0, 0] # option one's description label~
 - Inside source: true
 *** True Line Result
-  8000,2900,8160,2960
-** Processing line: ~  7860,2900,8000,2900~
+      args.labels << [10, 360, decision[:option_one][:description], 0, 0] # option one's description label
+** Processing line: ~      args.labels << [10, 335, "(Press 'left' on the keyboard to select this decision)", -5, 0] # label of what key to press to select the decision~
 - Inside source: true
 *** True Line Result
-  7860,2900,8000,2900
-** Processing line: ~  7640,2940,7860,2900~
+      args.labels << [10, 335, "(Press 'left' on the keyboard to select this decision)", -5, 0] # label of what key to press to select the decision
+** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
-  7640,2940,7860,2900
-** Processing line: ~  7400,2980,7640,2940~
+    end
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-  7400,2980,7640,2940
-** Processing line: ~  7100,2980,7400,2980~
+
+** Processing line: ~    if decision[:option_two]~
 - Inside source: true
 *** True Line Result
-  7100,2980,7400,2980
-** Processing line: ~  6840,3000,7100,2980~
+    if decision[:option_two]
+** Processing line: ~      args.labels << [1270, 360, decision[:option_two][:description], 0, 2] # option two's description~
 - Inside source: true
 *** True Line Result
-  6840,3000,7100,2980
-** Processing line: ~  5620,2980,5840,2980~
+      args.labels << [1270, 360, decision[:option_two][:description], 0, 2] # option two's description
+** Processing line: ~      args.labels << [1270, 335, "(Press 'right' on the keyboard to select this decision)", -5, 2]~
 - Inside source: true
 *** True Line Result
-  5620,2980,5840,2980
-** Processing line: ~  5840,2980,6500,3000~
+      args.labels << [1270, 335, "(Press 'right' on the keyboard to select this decision)", -5, 2]
+** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
-  5840,2980,6500,3000
-** Processing line: ~  6500,3000,6840,3000~
+    end
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-  6500,3000,6840,3000
-** Processing line: ~  5560,2780,5620,2980~
+
+** Processing line: ~    if decision[:option_three]~
 - Inside source: true
 *** True Line Result
-  5560,2780,5620,2980
-** Processing line: ~  5560,2780,5560,2580~
+    if decision[:option_three]
+** Processing line: ~      args.labels << [640, 45, decision[:option_three][:description], 0, 1] # option three's description~
 - Inside source: true
 *** True Line Result
-  5560,2780,5560,2580
-** Processing line: ~  5560,2580,5560,2380~
+      args.labels << [640, 45, decision[:option_three][:description], 0, 1] # option three's description
+** Processing line: ~      args.labels << [640, 20, "(Press 'down' on the keyboard to select this decision)", -5, 1]~
 - Inside source: true
 *** True Line Result
-  5560,2580,5560,2380
-** Processing line: ~  5560,2140,5560,2380~
+      args.labels << [640, 20, "(Press 'down' on the keyboard to select this decision)", -5, 1]
+** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
-  5560,2140,5560,2380
-** Processing line: ~  5560,2140,5560,1900~
+    end
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-  5560,2140,5560,1900
-** Processing line: ~  5560,1900,5620,1660~
+
+** Processing line: ~    if decision[:option_four]~
 - Inside source: true
 *** True Line Result
-  5560,1900,5620,1660
-** Processing line: ~  5620,1660,5660,1460~
+    if decision[:option_four]
+** Processing line: ~      args.labels << [640, 700, decision[:option_four][:description], 0, 1] # option four's description~
 - Inside source: true
 *** True Line Result
-  5620,1660,5660,1460
-** Processing line: ~  5660,1460,5660,1300~
+      args.labels << [640, 700, decision[:option_four][:description], 0, 1] # option four's description
+** Processing line: ~      args.labels << [640, 675, "(Press 'up' on the keyboard to select this decision)", -5, 1]~
 - Inside source: true
 *** True Line Result
-  5660,1460,5660,1300
-** Processing line: ~  5500,1260,5660,1300~
+      args.labels << [640, 675, "(Press 'up' on the keyboard to select this decision)", -5, 1]
+** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
-  5500,1260,5660,1300
-** Processing line: ~  5340,1260,5500,1260~
+    end
+** Processing line: ~  end~
 - Inside source: true
 *** True Line Result
-  5340,1260,5500,1260
-** Processing line: ~  4600,1220,4840,1240~
+  end
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-  4600,1220,4840,1240
-** Processing line: ~  4440,1220,4600,1220~
+
+** Processing line: ~  # Uses keyboard input from the user to make a decision~
 - Inside source: true
 *** True Line Result
-  4440,1220,4600,1220
-** Processing line: ~  4440,1080,4440,1220~
+  # Uses keyboard input from the user to make a decision
+** Processing line: ~  # Assigns the decision as the value of the decision_id variable~
 - Inside source: true
 *** True Line Result
-  4440,1080,4440,1220
-** Processing line: ~  4440,1080,4600,1020~
+  # Assigns the decision as the value of the decision_id variable
+** Processing line: ~  def process_inputs args~
 - Inside source: true
 *** True Line Result
-  4440,1080,4600,1020
-** Processing line: ~  5080,1260,5340,1260~
+  def process_inputs args
+** Processing line: ~    decision = current_decision args # calls current_decision method~
 - Inside source: true
 *** True Line Result
-  5080,1260,5340,1260
-** Processing line: ~  4840,1240,5080,1260~
+    decision = current_decision args # calls current_decision method
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-  4840,1240,5080,1260
-** Processing line: ~  4600,1020,4940,1020~
+
+** Processing line: ~    if args.keyboard.key_down.left! && decision[:option_one] # if left key pressed and option one exists~
 - Inside source: true
 *** True Line Result
-  4600,1020,4940,1020
-** Processing line: ~  4940,1020,5220,1020~
+    if args.keyboard.key_down.left! && decision[:option_one] # if left key pressed and option one exists
+** Processing line: ~      args.state.decision_id = decision[:option_one][:decision] # value of option one's decision hash key is set to decision_id~
 - Inside source: true
 *** True Line Result
-  4940,1020,5220,1020
-** Processing line: ~  5220,1020,5560,960~
+      args.state.decision_id = decision[:option_one][:decision] # value of option one's decision hash key is set to decision_id
+** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
-  5220,1020,5560,960
-** Processing line: ~  5560,960,5660,860~
+    end
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-  5560,960,5660,860
-** Processing line: ~  5660,740,5660,860~
+
+** Processing line: ~    if args.keyboard.key_down.right! && decision[:option_two] # if right key pressed and option two exists~
 - Inside source: true
 *** True Line Result
-  5660,740,5660,860
-** Processing line: ~  5280,740,5660,740~
+    if args.keyboard.key_down.right! && decision[:option_two] # if right key pressed and option two exists
+** Processing line: ~      args.state.decision_id = decision[:option_two][:decision] # value of option two's decision hash key is set to decision_id~
 - Inside source: true
 *** True Line Result
-  5280,740,5660,740
-** Processing line: ~  4940,780,5280,740~
+      args.state.decision_id = decision[:option_two][:decision] # value of option two's decision hash key is set to decision_id
+** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
-  4940,780,5280,740
-** Processing line: ~  4660,760,4940,780~
+    end
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-  4660,760,4940,780
-** Processing line: ~  4500,700,4660,760~
+
+** Processing line: ~    if args.keyboard.key_down.down! && decision[:option_three] # if down key pressed and option three exists~
 - Inside source: true
 *** True Line Result
-  4500,700,4660,760
-** Processing line: ~  4500,520,4500,700~
+    if args.keyboard.key_down.down! && decision[:option_three] # if down key pressed and option three exists
+** Processing line: ~      args.state.decision_id = decision[:option_three][:decision] # value of option three's decision hash key is set to decision_id~
 - Inside source: true
 *** True Line Result
-  4500,520,4500,700
-** Processing line: ~  4500,520,4700,460~
+      args.state.decision_id = decision[:option_three][:decision] # value of option three's decision hash key is set to decision_id
+** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
-  4500,520,4700,460
-** Processing line: ~  4700,460,5080,440~
+    end
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-  4700,460,5080,440
-** Processing line: ~  5440,420,5740,420~
+
+** Processing line: ~    if args.keyboard.key_down.up! && decision[:option_four] # if up key pressed and option four exists~
 - Inside source: true
 *** True Line Result
-  5440,420,5740,420
-** Processing line: ~  5080,440,5440,420~
+    if args.keyboard.key_down.up! && decision[:option_four] # if up key pressed and option four exists
+** Processing line: ~      args.state.decision_id = decision[:option_four][:decision] # value of option four's decision hash key is set to decision_id~
 - Inside source: true
 *** True Line Result
-  5080,440,5440,420
-** Processing line: ~  5740,420,5840,360~
+      args.state.decision_id = decision[:option_four][:decision] # value of option four's decision hash key is set to decision_id
+** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
-  5740,420,5840,360
-** Processing line: ~  5800,280,5840,360~
+    end
+** Processing line: ~  end~
 - Inside source: true
 *** True Line Result
-  5800,280,5840,360
-** Processing line: ~  5560,280,5800,280~
+  end
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-  5560,280,5800,280
-** Processing line: ~  4980,300,5280,320~
+
+** Processing line: ~  # Uses decision_id's value to keep track of current decision being made~
 - Inside source: true
 *** True Line Result
-  4980,300,5280,320
-** Processing line: ~  4360,320,4660,300~
+  # Uses decision_id's value to keep track of current decision being made
+** Processing line: ~  def current_decision args~
 - Inside source: true
 *** True Line Result
-  4360,320,4660,300
-** Processing line: ~  4200,360,4360,320~
+  def current_decision args
+** Processing line: ~    args.state.game_definition[:decisions][args.state.decision_id] || {} # either has value or is empty~
 - Inside source: true
 *** True Line Result
-  4200,360,4360,320
-** Processing line: ~  5280,320,5560,280~
+    args.state.game_definition[:decisions][args.state.decision_id] || {} # either has value or is empty
+** Processing line: ~  end~
 - Inside source: true
 *** True Line Result
-  5280,320,5560,280
-** Processing line: ~  4660,300,4980,300~
+  end
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-  4660,300,4980,300
-** Processing line: ~  4140,480,4200,360~
+
+** Processing line: ~  # Resets the game.~
 - Inside source: true
 *** True Line Result
-  4140,480,4200,360
-** Processing line: ~  4140,480,4140,640~
+  # Resets the game.
+** Processing line: ~  $gtk.reset~
 - Inside source: true
 *** True Line Result
-  4140,480,4140,640
-** Processing line: ~  4140,640,4200,780~
+  $gtk.reset
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-  4140,640,4200,780
-** Processing line: ~  4200,780,4200,980~
+
+** Processing line: ~#+end_src~
+- Line was identified as the end of a code block.
+*** True Line Result
+#+end_src
+** Processing line: ~~
+- End of paragraph detected.
+*** True Line Result
+
+** Processing line: ~*** Rpg Narrative - Return Of Serenity - lowrez_simulator.rb~
+- Header detected.
+*** True Line Result
+
+*** True Line Result
+*** Rpg Narrative - Return Of Serenity - lowrez_simulator.rb
+** Processing line: ~#+begin_src ruby~
+- Line was identified as the beginning of a code block.
+*** True Line Result
+
+*** True Line Result
+#+begin_src ruby
+** Processing line: ~  # ./samples/99_genre_rpg_narrative/return_of_serenity/app/lowrez_simulator.rb~
 - Inside source: true
 *** True Line Result
-  4200,780,4200,980
-** Processing line: ~  4200,980,4220,1180~
+  # ./samples/99_genre_rpg_narrative/return_of_serenity/app/lowrez_simulator.rb
+** Processing line: ~  ###################################################################################~
 - Inside source: true
 *** True Line Result
-  4200,980,4220,1180
-** Processing line: ~  4220,1400,4220,1180~
+  ###################################################################################
+** Processing line: ~  # YOU CAN PLAY AROUND WITH THE CODE BELOW, BUT USE CAUTION AS THIS IS WHAT EMULATES~
 - Inside source: true
 *** True Line Result
-  4220,1400,4220,1180
-** Processing line: ~  4220,1400,4260,1540~
+  # YOU CAN PLAY AROUND WITH THE CODE BELOW, BUT USE CAUTION AS THIS IS WHAT EMULATES
+** Processing line: ~  # THE 64x64 CANVAS.~
 - Inside source: true
 *** True Line Result
-  4220,1400,4260,1540
-** Processing line: ~  4260,1540,4500,1540~
+  # THE 64x64 CANVAS.
+** Processing line: ~  ###################################################################################~
 - Inside source: true
 *** True Line Result
-  4260,1540,4500,1540
-** Processing line: ~  4500,1540,4700,1520~
+  ###################################################################################
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-  4500,1540,4700,1520
-** Processing line: ~  4700,1520,4980,1540~
+
+** Processing line: ~  TINY_RESOLUTION       = 64~
 - Inside source: true
 *** True Line Result
-  4700,1520,4980,1540
-** Processing line: ~  5280,1560,5400,1560~
+  TINY_RESOLUTION       = 64
+** Processing line: ~  TINY_SCALE            = 720.fdiv(TINY_RESOLUTION + 5)~
 - Inside source: true
 *** True Line Result
-  5280,1560,5400,1560
-** Processing line: ~  4980,1540,5280,1560~
+  TINY_SCALE            = 720.fdiv(TINY_RESOLUTION + 5)
+** Processing line: ~  CENTER_OFFSET         = 10~
 - Inside source: true
 *** True Line Result
-  4980,1540,5280,1560
-** Processing line: ~  5400,1560,5400,1700~
+  CENTER_OFFSET         = 10
+** Processing line: ~  EMULATED_FONT_SIZE    = 20~
 - Inside source: true
 *** True Line Result
-  5400,1560,5400,1700
-** Processing line: ~  5400,1780,5400,1700~
+  EMULATED_FONT_SIZE    = 20
+** Processing line: ~  EMULATED_FONT_X_ZERO  = 0~
 - Inside source: true
 *** True Line Result
-  5400,1780,5400,1700
-** Processing line: ~  5340,1900,5400,1780~
+  EMULATED_FONT_X_ZERO  = 0
+** Processing line: ~  EMULATED_FONT_Y_ZERO  = 46~
 - Inside source: true
 *** True Line Result
-  5340,1900,5400,1780
-** Processing line: ~  5340,2020,5340,1900~
+  EMULATED_FONT_Y_ZERO  = 46
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-  5340,2020,5340,1900
-** Processing line: ~  5340,2220,5340,2020~
+
+** Processing line: ~  def tick args~
 - Inside source: true
 *** True Line Result
-  5340,2220,5340,2020
-** Processing line: ~  5340,2220,5340,2420~
+  def tick args
+** Processing line: ~    sprites = []~
 - Inside source: true
 *** True Line Result
-  5340,2220,5340,2420
-** Processing line: ~  5340,2420,5340,2520~
+    sprites = []
+** Processing line: ~    labels = []~
 - Inside source: true
 *** True Line Result
-  5340,2420,5340,2520
-** Processing line: ~  5080,2600,5220,2580~
+    labels = []
+** Processing line: ~    borders = []~
 - Inside source: true
 *** True Line Result
-  5080,2600,5220,2580
-** Processing line: ~  5220,2580,5340,2520~
+    borders = []
+** Processing line: ~    solids = []~
 - Inside source: true
 *** True Line Result
-  5220,2580,5340,2520
-** Processing line: ~  4900,2580,5080,2600~
+    solids = []
+** Processing line: ~    mouse = emulate_lowrez_mouse args~
 - Inside source: true
 *** True Line Result
-  4900,2580,5080,2600
-** Processing line: ~  4700,2540,4900,2580~
+    mouse = emulate_lowrez_mouse args
+** Processing line: ~    args.state.show_gridlines = false~
 - Inside source: true
 *** True Line Result
-  4700,2540,4900,2580
-** Processing line: ~  4500,2540,4700,2540~
+    args.state.show_gridlines = false
+** Processing line: ~    lowrez_tick args, sprites, labels, borders, solids, mouse~
 - Inside source: true
 *** True Line Result
-  4500,2540,4700,2540
-** Processing line: ~  4220,2580,4340,2540~
+    lowrez_tick args, sprites, labels, borders, solids, mouse
+** Processing line: ~    render_gridlines_if_needed args~
 - Inside source: true
 *** True Line Result
-  4220,2580,4340,2540
-** Processing line: ~  4200,2700,4220,2580~
+    render_gridlines_if_needed args
+** Processing line: ~    render_mouse_crosshairs args, mouse~
 - Inside source: true
 *** True Line Result
-  4200,2700,4220,2580
-** Processing line: ~  4340,2540,4500,2540~
+    render_mouse_crosshairs args, mouse
+** Processing line: ~    emulate_lowrez_scene args, sprites, labels, borders, solids, mouse~
 - Inside source: true
 *** True Line Result
-  4340,2540,4500,2540
-** Processing line: ~  3980,2740,4200,2700~
+    emulate_lowrez_scene args, sprites, labels, borders, solids, mouse
+** Processing line: ~  end~
 - Inside source: true
 *** True Line Result
-  3980,2740,4200,2700
-** Processing line: ~  3840,2740,3980,2740~
+  end
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-  3840,2740,3980,2740
-** Processing line: ~  3780,2640,3840,2740~
+
+** Processing line: ~  def emulate_lowrez_mouse args~
 - Inside source: true
 *** True Line Result
-  3780,2640,3840,2740
-** Processing line: ~  3780,2640,3780,2460~
+  def emulate_lowrez_mouse args
+** Processing line: ~    args.state.new_entity_strict(:lowrez_mouse) do |m|~
 - Inside source: true
 *** True Line Result
-  3780,2640,3780,2460
-** Processing line: ~  3780,2280,3780,2460~
+    args.state.new_entity_strict(:lowrez_mouse) do |m|
+** Processing line: ~      m.x = args.mouse.x.idiv(TINY_SCALE) - CENTER_OFFSET.idiv(TINY_SCALE) - 1~
 - Inside source: true
 *** True Line Result
-  3780,2280,3780,2460
-** Processing line: ~  3620,2020,3780,2100~
+      m.x = args.mouse.x.idiv(TINY_SCALE) - CENTER_OFFSET.idiv(TINY_SCALE) - 1
+** Processing line: ~      m.y = args.mouse.y.idiv(TINY_SCALE)~
 - Inside source: true
 *** True Line Result
-  3620,2020,3780,2100
-** Processing line: ~  3780,2280,3780,2100~
+      m.y = args.mouse.y.idiv(TINY_SCALE)
+** Processing line: ~      if args.mouse.click~
 - Inside source: true
 *** True Line Result
-  3780,2280,3780,2100
-** Processing line: ~  3360,2040,3620,2020~
+      if args.mouse.click
+** Processing line: ~        m.click = [~
 - Inside source: true
 *** True Line Result
-  3360,2040,3620,2020
-** Processing line: ~  3080,2040,3360,2040~
+        m.click = [
+** Processing line: ~          args.mouse.click.point.x.idiv(TINY_SCALE) - CENTER_OFFSET.idiv(TINY_SCALE) - 1,~
 - Inside source: true
 *** True Line Result
-  3080,2040,3360,2040
-** Processing line: ~  2840,2020,3080,2040~
+          args.mouse.click.point.x.idiv(TINY_SCALE) - CENTER_OFFSET.idiv(TINY_SCALE) - 1,
+** Processing line: ~          args.mouse.click.point.y.idiv(TINY_SCALE)~
 - Inside source: true
 *** True Line Result
-  2840,2020,3080,2040
-** Processing line: ~  2740,1940,2840,2020~
+          args.mouse.click.point.y.idiv(TINY_SCALE)
+** Processing line: ~        ]~
 - Inside source: true
 *** True Line Result
-  2740,1940,2840,2020
-** Processing line: ~  2740,1940,2800,1800~
+        ]
+** Processing line: ~        m.down = m.click~
 - Inside source: true
 *** True Line Result
-  2740,1940,2800,1800
-** Processing line: ~  2800,1640,2800,1800~
+        m.down = m.click
+** Processing line: ~      else~
 - Inside source: true
 *** True Line Result
-  2800,1640,2800,1800
-** Processing line: ~  2800,1640,2800,1460~
+      else
+** Processing line: ~        m.click = nil~
 - Inside source: true
 *** True Line Result
-  2800,1640,2800,1460
-** Processing line: ~  2800,1300,2800,1460~
+        m.click = nil
+** Processing line: ~        m.down = nil~
 - Inside source: true
 *** True Line Result
-  2800,1300,2800,1460
-** Processing line: ~  2700,1180,2800,1300~
+        m.down = nil
+** Processing line: ~      end~
 - Inside source: true
 *** True Line Result
-  2700,1180,2800,1300
-** Processing line: ~  2480,1140,2700,1180~
+      end
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-  2480,1140,2700,1180
-** Processing line: ~  1580,1200,1720,1200~
+
+** Processing line: ~      if args.mouse.up~
 - Inside source: true
 *** True Line Result
-  1580,1200,1720,1200
-** Processing line: ~  2240,1180,2480,1140~
+      if args.mouse.up
+** Processing line: ~        m.up = [~
 - Inside source: true
 *** True Line Result
-  2240,1180,2480,1140
-** Processing line: ~  1960,1180,2240,1180~
+        m.up = [
+** Processing line: ~          args.mouse.up.point.x.idiv(TINY_SCALE) - CENTER_OFFSET.idiv(TINY_SCALE) - 1,~
 - Inside source: true
 *** True Line Result
-  1960,1180,2240,1180
-** Processing line: ~  1720,1200,1960,1180~
+          args.mouse.up.point.x.idiv(TINY_SCALE) - CENTER_OFFSET.idiv(TINY_SCALE) - 1,
+** Processing line: ~          args.mouse.up.point.y.idiv(TINY_SCALE)~
 - Inside source: true
 *** True Line Result
-  1720,1200,1960,1180
-** Processing line: ~  1500,1320,1580,1200~
+          args.mouse.up.point.y.idiv(TINY_SCALE)
+** Processing line: ~        ]~
 - Inside source: true
 *** True Line Result
-  1500,1320,1580,1200
-** Processing line: ~  1500,1440,1500,1320~
+        ]
+** Processing line: ~      else~
 - Inside source: true
 *** True Line Result
-  1500,1440,1500,1320
-** Processing line: ~  1500,1440,1760,1480~
+      else
+** Processing line: ~        m.up = nil~
 - Inside source: true
 *** True Line Result
-  1500,1440,1760,1480
-** Processing line: ~  1760,1480,1940,1480~
+        m.up = nil
+** Processing line: ~      end~
 - Inside source: true
 *** True Line Result
-  1760,1480,1940,1480
-** Processing line: ~  1940,1480,2140,1500~
+      end
+** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
-  1940,1480,2140,1500
-** Processing line: ~  2140,1500,2320,1520~
+    end
+** Processing line: ~  end~
 - Inside source: true
 *** True Line Result
-  2140,1500,2320,1520
-** Processing line: ~  2400,1560,2400,1700~
+  end
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-  2400,1560,2400,1700
-** Processing line: ~  2280,1820,2380,1780~
+
+** Processing line: ~  def render_mouse_crosshairs args, mouse~
 - Inside source: true
 *** True Line Result
-  2280,1820,2380,1780
-** Processing line: ~  2320,1520,2400,1560~
+  def render_mouse_crosshairs args, mouse
+** Processing line: ~    return unless args.state.show_gridlines~
 - Inside source: true
 *** True Line Result
-  2320,1520,2400,1560
-** Processing line: ~  2380,1780,2400,1700~
+    return unless args.state.show_gridlines
+** Processing line: ~    args.labels << [10, 25, "mouse: #{mouse.x} #{mouse.y}", 255, 255, 255]~
 - Inside source: true
 *** True Line Result
-  2380,1780,2400,1700
-** Processing line: ~  2080,1840,2280,1820~
+    args.labels << [10, 25, "mouse: #{mouse.x} #{mouse.y}", 255, 255, 255]
+** Processing line: ~  end~
 - Inside source: true
 *** True Line Result
-  2080,1840,2280,1820
-** Processing line: ~  1720,1820,2080,1840~
+  end
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-  1720,1820,2080,1840
-** Processing line: ~  1420,1800,1720,1820~
+
+** Processing line: ~  def emulate_lowrez_scene args, sprites, labels, borders, solids, mouse~
 - Inside source: true
 *** True Line Result
-  1420,1800,1720,1820
-** Processing line: ~  1280,1800,1420,1800~
+  def emulate_lowrez_scene args, sprites, labels, borders, solids, mouse
+** Processing line: ~    args.render_target(:lowrez).solids  << [0, 0, 1280, 720]~
 - Inside source: true
 *** True Line Result
-  1280,1800,1420,1800
-** Processing line: ~  1240,1720,1280,1800~
+    args.render_target(:lowrez).solids  << [0, 0, 1280, 720]
+** Processing line: ~    args.render_target(:lowrez).sprites << sprites~
 - Inside source: true
 *** True Line Result
-  1240,1720,1280,1800
-** Processing line: ~  1240,1720,1240,1600~
+    args.render_target(:lowrez).sprites << sprites
+** Processing line: ~    args.render_target(:lowrez).borders << borders~
 - Inside source: true
 *** True Line Result
-  1240,1720,1240,1600
-** Processing line: ~  1240,1600,1280,1480~
+    args.render_target(:lowrez).borders << borders
+** Processing line: ~    args.render_target(:lowrez).solids  << solids~
 - Inside source: true
 *** True Line Result
-  1240,1600,1280,1480
-** Processing line: ~  1280,1340,1280,1480~
+    args.render_target(:lowrez).solids  << solids
+** Processing line: ~    args.outputs.primitives << labels.map do |l|~
 - Inside source: true
 *** True Line Result
-  1280,1340,1280,1480
-** Processing line: ~  1180,1280,1280,1340~
+    args.outputs.primitives << labels.map do |l|
+** Processing line: ~      as_label = l.label~
 - Inside source: true
 *** True Line Result
-  1180,1280,1280,1340
-** Processing line: ~  1000,1280,1180,1280~
+      as_label = l.label
+** Processing line: ~      l.text.each_char.each_with_index.map do |char, i|~
 - Inside source: true
 *** True Line Result
-  1000,1280,1180,1280
-** Processing line: ~  760,1280,1000,1280~
+      l.text.each_char.each_with_index.map do |char, i|
+** Processing line: ~        [CENTER_OFFSET + EMULATED_FONT_X_ZERO + (as_label.x * TINY_SCALE) + i * 5 * TINY_SCALE,~
 - Inside source: true
 *** True Line Result
-  760,1280,1000,1280
-** Processing line: ~  360,1240,540,1260~
+        [CENTER_OFFSET + EMULATED_FONT_X_ZERO + (as_label.x * TINY_SCALE) + i * 5 * TINY_SCALE,
+** Processing line: ~         EMULATED_FONT_Y_ZERO + (as_label.y * TINY_SCALE), char,~
 - Inside source: true
 *** True Line Result
-  360,1240,540,1260
-** Processing line: ~  180,1220,360,1240~
+         EMULATED_FONT_Y_ZERO + (as_label.y * TINY_SCALE), char,
+** Processing line: ~         EMULATED_FONT_SIZE, 0, as_label.r, as_label.g, as_label.b, as_label.a, 'fonts/dragonruby-gtk-4x4.ttf'].label~
 - Inside source: true
 *** True Line Result
-  180,1220,360,1240
-** Processing line: ~  540,1260,760,1280~
+         EMULATED_FONT_SIZE, 0, as_label.r, as_label.g, as_label.b, as_label.a, 'fonts/dragonruby-gtk-4x4.ttf'].label
+** Processing line: ~      end~
 - Inside source: true
 *** True Line Result
-  540,1260,760,1280
-** Processing line: ~  180,1080,180,1220~
+      end
+** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
-  180,1080,180,1220
-** Processing line: ~  180,1080,180,1000~
+    end
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-  180,1080,180,1000
-** Processing line: ~  180,1000,360,940~
+
+** Processing line: ~    args.sprites    << [CENTER_OFFSET, 0, 1280 * TINY_SCALE, 720 * TINY_SCALE, :lowrez]~
 - Inside source: true
 *** True Line Result
-  180,1000,360,940
-** Processing line: ~  360,940,540,960~
+    args.sprites    << [CENTER_OFFSET, 0, 1280 * TINY_SCALE, 720 * TINY_SCALE, :lowrez]
+** Processing line: ~  end~
 - Inside source: true
 *** True Line Result
-  360,940,540,960
-** Processing line: ~  540,960,820,980~
+  end
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-  540,960,820,980
-** Processing line: ~  1100,980,1200,920~
+
+** Processing line: ~  def render_gridlines_if_needed args~
 - Inside source: true
 *** True Line Result
-  1100,980,1200,920
-** Processing line: ~  820,980,1100,980~
+  def render_gridlines_if_needed args
+** Processing line: ~    if args.state.show_gridlines && args.static_lines.length == 0~
 - Inside source: true
 *** True Line Result
-  820,980,1100,980
-** Processing line: ~  6640,11860,6940,11920~
+    if args.state.show_gridlines && args.static_lines.length == 0
+** Processing line: ~      args.static_lines << 65.times.map do |i|~
 - Inside source: true
 *** True Line Result
-  6640,11860,6940,11920
-** Processing line: ~  5200,11280,5500,11280~
+      args.static_lines << 65.times.map do |i|
+** Processing line: ~        [~
 - Inside source: true
 *** True Line Result
-  5200,11280,5500,11280
-** Processing line: ~  4120,7330,4120,7230~
+        [
+** Processing line: ~          [CENTER_OFFSET + i * TINY_SCALE + 1,  0,~
 - Inside source: true
 *** True Line Result
-  4120,7330,4120,7230
-** Processing line: ~  4120,7230,4660,7250~
+          [CENTER_OFFSET + i * TINY_SCALE + 1,  0,
+** Processing line: ~           CENTER_OFFSET + i * TINY_SCALE + 1,  720,                128, 128, 128],~
 - Inside source: true
 *** True Line Result
-  4120,7230,4660,7250
-** Processing line: ~  4660,7250,4940,7250~
+           CENTER_OFFSET + i * TINY_SCALE + 1,  720,                128, 128, 128],
+** Processing line: ~          [CENTER_OFFSET + i * TINY_SCALE,      0,~
 - Inside source: true
 *** True Line Result
-  4660,7250,4940,7250
-** Processing line: ~  4940,7250,5050,7340~
+          [CENTER_OFFSET + i * TINY_SCALE,      0,
+** Processing line: ~           CENTER_OFFSET + i * TINY_SCALE,      720,                128, 128, 128],~
 - Inside source: true
 *** True Line Result
-  4940,7250,5050,7340
-** Processing line: ~  5010,7400,5050,7340~
+           CENTER_OFFSET + i * TINY_SCALE,      720,                128, 128, 128],
+** Processing line: ~          [CENTER_OFFSET,                       0 + i * TINY_SCALE,~
 - Inside source: true
 *** True Line Result
-  5010,7400,5050,7340
-** Processing line: ~  4680,7380,5010,7400~
+          [CENTER_OFFSET,                       0 + i * TINY_SCALE,
+** Processing line: ~           CENTER_OFFSET + 720,                 0 + i * TINY_SCALE, 128, 128, 128],~
 - Inside source: true
 *** True Line Result
-  4680,7380,5010,7400
-** Processing line: ~  4380,7370,4680,7380~
+           CENTER_OFFSET + 720,                 0 + i * TINY_SCALE, 128, 128, 128],
+** Processing line: ~          [CENTER_OFFSET,                       1 + i * TINY_SCALE,~
 - Inside source: true
 *** True Line Result
-  4380,7370,4680,7380
-** Processing line: ~  4120,7330,4360,7370~
+          [CENTER_OFFSET,                       1 + i * TINY_SCALE,
+** Processing line: ~           CENTER_OFFSET + 720,                 1 + i * TINY_SCALE, 128, 128, 128]~
 - Inside source: true
 *** True Line Result
-  4120,7330,4360,7370
-** Processing line: ~  4120,7670,4120,7760~
+           CENTER_OFFSET + 720,                 1 + i * TINY_SCALE, 128, 128, 128]
+** Processing line: ~        ]~
 - Inside source: true
 *** True Line Result
-  4120,7670,4120,7760
-** Processing line: ~  4120,7670,4280,7650~
+        ]
+** Processing line: ~      end~
 - Inside source: true
 *** True Line Result
-  4120,7670,4280,7650
-** Processing line: ~  4280,7650,4540,7660~
+      end
+** Processing line: ~    elsif !args.state.show_gridlines~
 - Inside source: true
 *** True Line Result
-  4280,7650,4540,7660
-** Processing line: ~  4550,7660,4820,7680~
+    elsif !args.state.show_gridlines
+** Processing line: ~      args.static_lines.clear~
 - Inside source: true
 *** True Line Result
-  4550,7660,4820,7680
-** Processing line: ~  4820,7680,4900,7730~
+      args.static_lines.clear
+** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
-  4820,7680,4900,7730
-** Processing line: ~  4880,7800,4900,7730~
+    end
+** Processing line: ~  end~
 - Inside source: true
 *** True Line Result
-  4880,7800,4900,7730
-** Processing line: ~  4620,7820,4880,7800~
+  end
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-  4620,7820,4880,7800
-** Processing line: ~  4360,7790,4620,7820~
+
+** Processing line: ~#+end_src~
+- Line was identified as the end of a code block.
+*** True Line Result
+#+end_src
+** Processing line: ~~
+- End of paragraph detected.
+*** True Line Result
+
+** Processing line: ~*** Rpg Narrative - Return Of Serenity - main.rb~
+- Header detected.
+*** True Line Result
+
+*** True Line Result
+*** Rpg Narrative - Return Of Serenity - main.rb
+** Processing line: ~#+begin_src ruby~
+- Line was identified as the beginning of a code block.
+*** True Line Result
+
+*** True Line Result
+#+begin_src ruby
+** Processing line: ~  # ./samples/99_genre_rpg_narrative/return_of_serenity/app/main.rb~
 - Inside source: true
 *** True Line Result
-  4360,7790,4620,7820
-** Processing line: ~  4120,7760,4360,7790~
+  # ./samples/99_genre_rpg_narrative/return_of_serenity/app/main.rb
+** Processing line: ~  require 'app/require.rb'~
 - Inside source: true
 *** True Line Result
-  4120,7760,4360,7790
-** Processing line: ~  6840,6840,7040,6820~
+  require 'app/require.rb'
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-  6840,6840,7040,6820
-** Processing line: ~  5720,4880,6120,4880~
+
+** Processing line: ~  def defaults args~
 - Inside source: true
 *** True Line Result
-  5720,4880,6120,4880
-** Processing line: ~  1200,920,1340,810~
+  def defaults args
+** Processing line: ~    args.outputs.background_color = [0, 0, 0]~
 - Inside source: true
 *** True Line Result
-  1200,920,1340,810
-** Processing line: ~  1340,810,1520,790~
+    args.outputs.background_color = [0, 0, 0]
+** Processing line: ~    args.state.last_story_line_text ||= ""~
 - Inside source: true
 *** True Line Result
-  1340,810,1520,790
-** Processing line: ~  1520,790,1770,800~
+    args.state.last_story_line_text ||= ""
+** Processing line: ~    args.state.scene_history ||= []~
 - Inside source: true
 *** True Line Result
-  1520,790,1770,800
-** Processing line: ~  2400,790,2600,750~
+    args.state.scene_history ||= []
+** Processing line: ~    args.state.storyline_history ||= []~
 - Inside source: true
 *** True Line Result
-  2400,790,2600,750
-** Processing line: ~  2600,750,2640,520~
+    args.state.storyline_history ||= []
+** Processing line: ~    args.state.word_delay ||= 8~
 - Inside source: true
 *** True Line Result
-  2600,750,2640,520
-** Processing line: ~  2520,470,2640,520~
+    args.state.word_delay ||= 8
+** Processing line: ~    if args.state.tick_count == 0~
 - Inside source: true
 *** True Line Result
-  2520,470,2640,520
-** Processing line: ~  2140,470,2520,470~
+    if args.state.tick_count == 0
+** Processing line: ~      args.gtk.stop_music~
 - Inside source: true
 *** True Line Result
-  2140,470,2520,470
-** Processing line: ~  1760,800,2090,800~
+      args.gtk.stop_music
+** Processing line: ~      args.outputs.sounds << 'sounds/static-loop.ogg'~
 - Inside source: true
 *** True Line Result
-  1760,800,2090,800
-** Processing line: ~  2080,800,2400,790~
+      args.outputs.sounds << 'sounds/static-loop.ogg'
+** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
-  2080,800,2400,790
-** Processing line: ~  1760,450,2140,470~
+    end
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-  1760,450,2140,470
-** Processing line: ~  1420,450,1760,450~
+
+** Processing line: ~    if args.state.last_story_line_text~
 - Inside source: true
 *** True Line Result
-  1420,450,1760,450
-** Processing line: ~  1180,440,1420,450~
+    if args.state.last_story_line_text
+** Processing line: ~      lines = args.state~
 - Inside source: true
 *** True Line Result
-  1180,440,1420,450
-** Processing line: ~  900,480,1180,440~
+      lines = args.state
+** Processing line: ~                  .last_story_line_text~
 - Inside source: true
 *** True Line Result
-  900,480,1180,440
-** Processing line: ~  640,450,900,480~
+                  .last_story_line_text
+** Processing line: ~                  .gsub("-", "")~
 - Inside source: true
 *** True Line Result
-  640,450,900,480
-** Processing line: ~  360,440,620,450~
+                  .gsub("-", "")
+** Processing line: ~                  .gsub("~", "")~
 - Inside source: true
 *** True Line Result
-  360,440,620,450
-** Processing line: ~  120,430,360,440~
+                  .gsub("~", "")
+** Processing line: ~                  .wrapped_lines(50)~
 - Inside source: true
 *** True Line Result
-  120,430,360,440
-** Processing line: ~  0,520,120,430~
+                  .wrapped_lines(50)
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-  0,520,120,430
-** Processing line: ~  -20,780,0,520~
+
+** Processing line: ~      args.outputs.labels << lines.map_with_index { |l, i| [690, 200 - (i * 25), l, 1, 0, 255, 255, 255] }~
 - Inside source: true
 *** True Line Result
-  -20,780,0,520
-** Processing line: ~  -20,780,-20,1020~
+      args.outputs.labels << lines.map_with_index { |l, i| [690, 200 - (i * 25), l, 1, 0, 255, 255, 255] }
+** Processing line: ~    elsif args.state.storyline_history[-1]~
 - Inside source: true
 *** True Line Result
-  -20,780,-20,1020
-** Processing line: ~  -20,1020,-20,1150~
+    elsif args.state.storyline_history[-1]
+** Processing line: ~      lines = args.state~
 - Inside source: true
 *** True Line Result
-  -20,1020,-20,1150
-** Processing line: ~  -20,1150,0,1300~
+      lines = args.state
+** Processing line: ~                  .storyline_history[-1]~
 - Inside source: true
 *** True Line Result
-  -20,1150,0,1300
-** Processing line: ~  0,1470,60,1530~
+                  .storyline_history[-1]
+** Processing line: ~                  .gsub("-", "")~
 - Inside source: true
 *** True Line Result
-  0,1470,60,1530
-** Processing line: ~  0,1300,0,1470~
+                  .gsub("-", "")
+** Processing line: ~                  .gsub("~", "")~
 - Inside source: true
 *** True Line Result
-  0,1300,0,1470
-** Processing line: ~  60,1530,360,1530~
+                  .gsub("~", "")
+** Processing line: ~                  .wrapped_lines(50)~
 - Inside source: true
 *** True Line Result
-  60,1530,360,1530
-** Processing line: ~  360,1530,660,1520~
+                  .wrapped_lines(50)
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-  360,1530,660,1520
-** Processing line: ~  660,1520,980,1520~
+
+** Processing line: ~      args.outputs.labels << lines.map_with_index { |l, i| [690, 200 - (i * 25), l, 1, 0, 255, 255, 255] }~
 - Inside source: true
 *** True Line Result
-  660,1520,980,1520
-** Processing line: ~  980,1520,1040,1520~
+      args.outputs.labels << lines.map_with_index { |l, i| [690, 200 - (i * 25), l, 1, 0, 255, 255, 255] }
+** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
-  980,1520,1040,1520
-** Processing line: ~  1040,1520,1070,1560~
+    end
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-  1040,1520,1070,1560
-** Processing line: ~  1070,1770,1070,1560~
+
+** Processing line: ~    return if args.state.current_scene~
 - Inside source: true
 *** True Line Result
-  1070,1770,1070,1560
-** Processing line: ~  1070,1770,1100,2010~
+    return if args.state.current_scene
+** Processing line: ~    set_scene(args, day_one_beginning(args))~
 - Inside source: true
 *** True Line Result
-  1070,1770,1100,2010
-** Processing line: ~  1070,2230,1100,2010~
+    set_scene(args, day_one_beginning(args))
+** Processing line: ~  end~
 - Inside source: true
 *** True Line Result
-  1070,2230,1100,2010
-** Processing line: ~  1070,2240,1180,2340~
+  end
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-  1070,2240,1180,2340
-** Processing line: ~  1180,2340,1580,2340~
+
+** Processing line: ~  def inputs_move_player args~
 - Inside source: true
 *** True Line Result
-  1180,2340,1580,2340
-** Processing line: ~  1580,2340,1940,2350~
+  def inputs_move_player args
+** Processing line: ~    if args.state.scene_changed_at.elapsed_time > 5~
 - Inside source: true
 *** True Line Result
-  1580,2340,1940,2350
-** Processing line: ~  1940,2350,2440,2350~
+    if args.state.scene_changed_at.elapsed_time > 5
+** Processing line: ~      if args.keyboard.down  || args.keyboard.s || args.keyboard.j~
 - Inside source: true
 *** True Line Result
-  1940,2350,2440,2350
-** Processing line: ~  2440,2350,2560,2380~
+      if args.keyboard.down  || args.keyboard.s || args.keyboard.j
+** Processing line: ~        args.state.player.y -= 0.25~
 - Inside source: true
 *** True Line Result
-  2440,2350,2560,2380
-** Processing line: ~  2560,2380,2600,2540~
+        args.state.player.y -= 0.25
+** Processing line: ~      elsif args.keyboard.up || args.keyboard.w || args.keyboard.k~
 - Inside source: true
 *** True Line Result
-  2560,2380,2600,2540
-** Processing line: ~  2810,2640,3140,2680~
+      elsif args.keyboard.up || args.keyboard.w || args.keyboard.k
+** Processing line: ~        args.state.player.y += 0.25~
 - Inside source: true
 *** True Line Result
-  2810,2640,3140,2680
-** Processing line: ~  2600,2540,2810,2640~
+        args.state.player.y += 0.25
+** Processing line: ~      end~
 - Inside source: true
 *** True Line Result
-  2600,2540,2810,2640
-** Processing line: ~  3140,2680,3230,2780~
+      end
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-  3140,2680,3230,2780
-** Processing line: ~  3230,2780,3260,2970~
+
+** Processing line: ~      if args.keyboard.left     || args.keyboard.a  || args.keyboard.h~
 - Inside source: true
 *** True Line Result
-  3230,2780,3260,2970
-** Processing line: ~  3230,3220,3260,2970~
+      if args.keyboard.left     || args.keyboard.a  || args.keyboard.h
+** Processing line: ~        args.state.player.x -= 0.25~
 - Inside source: true
 *** True Line Result
-  3230,3220,3260,2970
-** Processing line: ~  3200,3470,3230,3220~
+        args.state.player.x -= 0.25
+** Processing line: ~      elsif args.keyboard.right || args.keyboard.d  || args.keyboard.l~
 - Inside source: true
 *** True Line Result
-  3200,3470,3230,3220
-** Processing line: ~  3200,3480,3210,3760~
+      elsif args.keyboard.right || args.keyboard.d  || args.keyboard.l
+** Processing line: ~        args.state.player.x += 0.25~
 - Inside source: true
 *** True Line Result
-  3200,3480,3210,3760
-** Processing line: ~  3210,3760,3210,4040~
+        args.state.player.x += 0.25
+** Processing line: ~      end~
 - Inside source: true
 *** True Line Result
-  3210,3760,3210,4040
-** Processing line: ~  3200,4040,3230,4310~
+      end
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-  3200,4040,3230,4310
-** Processing line: ~  3210,4530,3230,4310~
+
+** Processing line: ~      args.state.player.y = 60 if args.state.player.y > 63~
 - Inside source: true
 *** True Line Result
-  3210,4530,3230,4310
-** Processing line: ~  3210,4530,3230,4730~
+      args.state.player.y = 60 if args.state.player.y > 63
+** Processing line: ~      args.state.player.y =  0 if args.state.player.y < -3~
 - Inside source: true
 *** True Line Result
-  3210,4530,3230,4730
-** Processing line: ~  3230,4960,3230,4730~
+      args.state.player.y =  0 if args.state.player.y < -3
+** Processing line: ~      args.state.player.x = 60 if args.state.player.x > 63~
 - Inside source: true
 *** True Line Result
-  3230,4960,3230,4730
-** Processing line: ~  3230,4960,3260,5190~
+      args.state.player.x = 60 if args.state.player.x > 63
+** Processing line: ~      args.state.player.x =  0 if args.state.player.x < -3~
 - Inside source: true
 *** True Line Result
-  3230,4960,3260,5190
-** Processing line: ~  3170,5330,3260,5190~
+      args.state.player.x =  0 if args.state.player.x < -3
+** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
-  3170,5330,3260,5190
-** Processing line: ~  2920,5330,3170,5330~
+    end
+** Processing line: ~  end~
 - Inside source: true
 *** True Line Result
-  2920,5330,3170,5330
-** Processing line: ~  2660,5360,2920,5330~
+  end
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-  2660,5360,2920,5330
-** Processing line: ~  2420,5330,2660,5360~
+
+** Processing line: ~  def null_or_empty? ary~
 - Inside source: true
 *** True Line Result
-  2420,5330,2660,5360
-** Processing line: ~  2200,5280,2400,5330~
+  def null_or_empty? ary
+** Processing line: ~    return true unless ary~
 - Inside source: true
 *** True Line Result
-  2200,5280,2400,5330
-** Processing line: ~  2020,5280,2200,5280~
+    return true unless ary
+** Processing line: ~    return true if ary.length == 0~
 - Inside source: true
 *** True Line Result
-  2020,5280,2200,5280
-** Processing line: ~  1840,5260,2020,5280~
+    return true if ary.length == 0
+** Processing line: ~    return false~
 - Inside source: true
 *** True Line Result
-  1840,5260,2020,5280
-** Processing line: ~  1660,5280,1840,5260~
+    return false
+** Processing line: ~  end~
 - Inside source: true
 *** True Line Result
-  1660,5280,1840,5260
-** Processing line: ~  1500,5300,1660,5280~
+  end
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-  1500,5300,1660,5280
-** Processing line: ~  1360,5270,1500,5300~
+
+** Processing line: ~  def calc_storyline_hotspot args~
 - Inside source: true
 *** True Line Result
-  1360,5270,1500,5300
-** Processing line: ~  1200,5290,1340,5270~
+  def calc_storyline_hotspot args
+** Processing line: ~    hotspots = args.state.storylines.find_all do |hs|~
 - Inside source: true
 *** True Line Result
-  1200,5290,1340,5270
-** Processing line: ~  1070,5400,1200,5290~
+    hotspots = args.state.storylines.find_all do |hs|
+** Processing line: ~      args.state.player.inside_rect?(hs.shift_rect(-2, 0))~
 - Inside source: true
 *** True Line Result
-  1070,5400,1200,5290
-** Processing line: ~  1040,5630,1070,5400~
+      args.state.player.inside_rect?(hs.shift_rect(-2, 0))
+** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
-  1040,5630,1070,5400
-** Processing line: ~  1000,5900,1040,5630~
+    end
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-  1000,5900,1040,5630
-** Processing line: ~  980,6170,1000,5900~
+
+** Processing line: ~    if !null_or_empty?(hotspots) && !args.state.inside_storyline_hotspot~
 - Inside source: true
 *** True Line Result
-  980,6170,1000,5900
-** Processing line: ~  980,6280,980,6170~
+    if !null_or_empty?(hotspots) && !args.state.inside_storyline_hotspot
+** Processing line: ~      _, _, _, _, storyline = hotspots.first~
 - Inside source: true
 *** True Line Result
-  980,6280,980,6170
-** Processing line: ~  980,6540,980,6280~
+      _, _, _, _, storyline = hotspots.first
+** Processing line: ~      queue_storyline_text(args, storyline)~
 - Inside source: true
 *** True Line Result
-  980,6540,980,6280
-** Processing line: ~  980,6540,1040,6720~
+      queue_storyline_text(args, storyline)
+** Processing line: ~      args.state.inside_storyline_hotspot = true~
 - Inside source: true
 *** True Line Result
-  980,6540,1040,6720
-** Processing line: ~  1040,6720,1360,6730~
+      args.state.inside_storyline_hotspot = true
+** Processing line: ~    elsif null_or_empty?(hotspots)~
 - Inside source: true
 *** True Line Result
-  1040,6720,1360,6730
-** Processing line: ~  1360,6730,1760,6710~
+    elsif null_or_empty?(hotspots)
+** Processing line: ~      args.state.inside_storyline_hotspot = false~
 - Inside source: true
 *** True Line Result
-  1360,6730,1760,6710
-** Processing line: ~  2110,6720,2420,6730~
+      args.state.inside_storyline_hotspot = false
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-  2110,6720,2420,6730
-** Processing line: ~  1760,6710,2110,6720~
+
+** Processing line: ~      args.state.storyline_queue_empty_at ||= args.state.tick_count~
 - Inside source: true
 *** True Line Result
-  1760,6710,2110,6720
-** Processing line: ~  2420,6730,2640,6720~
+      args.state.storyline_queue_empty_at ||= args.state.tick_count
+** Processing line: ~      args.state.is_storyline_dialog_active = false~
 - Inside source: true
 *** True Line Result
-  2420,6730,2640,6720
-** Processing line: ~  2640,6720,2970,6720~
+      args.state.is_storyline_dialog_active = false
+** Processing line: ~      args.state.scene_storyline_queue.clear~
 - Inside source: true
 *** True Line Result
-  2640,6720,2970,6720
-** Processing line: ~  2970,6720,3160,6700~
+      args.state.scene_storyline_queue.clear
+** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
-  2970,6720,3160,6700
-** Processing line: ~  3160,6700,3240,6710~
+    end
+** Processing line: ~  end~
 - Inside source: true
 *** True Line Result
-  3160,6700,3240,6710
-** Processing line: ~  3240,6710,3260,6890~
+  end
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-  3240,6710,3260,6890
-** Processing line: ~  3260,7020,3260,6890~
+
+** Processing line: ~  def calc_scenes args~
 - Inside source: true
 *** True Line Result
-  3260,7020,3260,6890
-** Processing line: ~  3230,7180,3260,7020~
+  def calc_scenes args
+** Processing line: ~    hotspots = args.state.scenes.find_all do |hs|~
 - Inside source: true
 *** True Line Result
-  3230,7180,3260,7020
-** Processing line: ~  3230,7350,3230,7180~
+    hotspots = args.state.scenes.find_all do |hs|
+** Processing line: ~      args.state.player.inside_rect?(hs.shift_rect(-2, 0))~
 - Inside source: true
 *** True Line Result
-  3230,7350,3230,7180
-** Processing line: ~  3210,7510,3230,7350~
+      args.state.player.inside_rect?(hs.shift_rect(-2, 0))
+** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
-  3210,7510,3230,7350
-** Processing line: ~  3210,7510,3210,7690~
+    end
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-  3210,7510,3210,7690
-** Processing line: ~  3210,7870,3210,7690~
+
+** Processing line: ~    if !null_or_empty?(hotspots) && !args.state.inside_scene_hotspot~
 - Inside source: true
 *** True Line Result
-  3210,7870,3210,7690
-** Processing line: ~  3210,7870,3210,7980~
+    if !null_or_empty?(hotspots) && !args.state.inside_scene_hotspot
+** Processing line: ~      _, _, _, _, scene_method_or_hash = hotspots.first~
 - Inside source: true
 *** True Line Result
-  3210,7870,3210,7980
-** Processing line: ~  3200,8120,3210,7980~
+      _, _, _, _, scene_method_or_hash = hotspots.first
+** Processing line: ~      if scene_method_or_hash.is_a? Symbol~
 - Inside source: true
 *** True Line Result
-  3200,8120,3210,7980
-** Processing line: ~  3200,8330,3200,8120~
+      if scene_method_or_hash.is_a? Symbol
+** Processing line: ~        set_scene(args, send(scene_method_or_hash, args))~
 - Inside source: true
 *** True Line Result
-  3200,8330,3200,8120
-** Processing line: ~  3160,8520,3200,8330~
+        set_scene(args, send(scene_method_or_hash, args))
+** Processing line: ~        args.state.last_hotspot_scene = scene_method_or_hash~
 - Inside source: true
 *** True Line Result
-  3160,8520,3200,8330
-** Processing line: ~  2460,11100,2480,11020~
+        args.state.last_hotspot_scene = scene_method_or_hash
+** Processing line: ~        args.state.scene_history << scene_method_or_hash~
 - Inside source: true
 *** True Line Result
-  2460,11100,2480,11020
-** Processing line: ~  2200,11180,2460,11100~
+        args.state.scene_history << scene_method_or_hash
+** Processing line: ~      else~
 - Inside source: true
 *** True Line Result
-  2200,11180,2460,11100
-** Processing line: ~  1260,11350,1600,11320~
+      else
+** Processing line: ~        set_scene(args, scene_method_or_hash)~
 - Inside source: true
 *** True Line Result
-  1260,11350,1600,11320
-** Processing line: ~  600,11430,930,11400~
+        set_scene(args, scene_method_or_hash)
+** Processing line: ~      end~
 - Inside source: true
 *** True Line Result
-  600,11430,930,11400
-** Processing line: ~  180,11340,620,11430~
+      end
+** Processing line: ~      args.state.inside_scene_hotspot = true~
 - Inside source: true
 *** True Line Result
-  180,11340,620,11430
-** Processing line: ~  1600,11320,1910,11280~
+      args.state.inside_scene_hotspot = true
+** Processing line: ~    elsif null_or_empty?(hotspots)~
 - Inside source: true
 *** True Line Result
-  1600,11320,1910,11280
-** Processing line: ~  1910,11280,2200,11180~
+    elsif null_or_empty?(hotspots)
+** Processing line: ~      args.state.inside_scene_hotspot = false~
 - Inside source: true
 *** True Line Result
-  1910,11280,2200,11180
-** Processing line: ~  923.0029599285435,11398.99893503157,1264.002959928544,11351.99893503157~
+      args.state.inside_scene_hotspot = false
+** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
-  923.0029599285435,11398.99893503157,1264.002959928544,11351.99893503157
-** Processing line: ~#+end_src~
-- Line was identified as the end of a code block.
+    end
+** Processing line: ~  end~
+- Inside source: true
 *** True Line Result
-#+end_src
+  end
 ** Processing line: ~~
-- End of paragraph detected.
-*** True Line Result
-
-** Processing line: ~*** Platformer - The Little Probe - Data - level_lava.txt~
-- Header detected.
-*** True Line Result
-
-*** True Line Result
-*** Platformer - The Little Probe - Data - level_lava.txt
-** Processing line: ~#+begin_src ruby~
-- Line was identified as the beginning of a code block.
+- Inside source: true
 *** True Line Result
 
-*** True Line Result
-#+begin_src ruby
-** Processing line: ~  # ./samples/99_genre_platformer/the_little_probe/data/level_lava.txt~
+** Processing line: ~  def null_or_whitespace? word~
 - Inside source: true
 *** True Line Result
-  # ./samples/99_genre_platformer/the_little_probe/data/level_lava.txt
-** Processing line: ~  100,10740,500,10780~
+  def null_or_whitespace? word
+** Processing line: ~    return true if !word~
 - Inside source: true
 *** True Line Result
-  100,10740,500,10780
-** Processing line: ~  500,10780,960,10760~
+    return true if !word
+** Processing line: ~    return true if word.strip.length == 0~
 - Inside source: true
 *** True Line Result
-  500,10780,960,10760
-** Processing line: ~  960,10760,1340,10760~
+    return true if word.strip.length == 0
+** Processing line: ~    return false~
 - Inside source: true
 *** True Line Result
-  960,10760,1340,10760
-** Processing line: ~  1380,10760,1820,10780~
+    return false
+** Processing line: ~  end~
 - Inside source: true
 *** True Line Result
-  1380,10760,1820,10780
-** Processing line: ~  1820,10780,2240,10780~
+  end
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-  1820,10780,2240,10780
-** Processing line: ~  2280,10780,2740,10740~
+
+** Processing line: ~  def calc_storyline_presentation args~
 - Inside source: true
 *** True Line Result
-  2280,10780,2740,10740
-** Processing line: ~  2740,10740,3000,10780~
+  def calc_storyline_presentation args
+** Processing line: ~    return unless args.state.tick_count > args.state.next_storyline~
 - Inside source: true
 *** True Line Result
-  2740,10740,3000,10780
-** Processing line: ~  3000,10780,3140,11020~
+    return unless args.state.tick_count > args.state.next_storyline
+** Processing line: ~    return unless args.state.scene_storyline_queue~
 - Inside source: true
 *** True Line Result
-  3000,10780,3140,11020
-** Processing line: ~  -520,8820,-480,9160~
+    return unless args.state.scene_storyline_queue
+** Processing line: ~    next_storyline = args.state.scene_storyline_queue.shift~
 - Inside source: true
 *** True Line Result
-  -520,8820,-480,9160
-** Processing line: ~  -520,8480,-520,8820~
+    next_storyline = args.state.scene_storyline_queue.shift
+** Processing line: ~    if null_or_whitespace? next_storyline~
 - Inside source: true
 *** True Line Result
-  -520,8480,-520,8820
-** Processing line: ~  -520,8480,-480,8180~
+    if null_or_whitespace? next_storyline
+** Processing line: ~      args.state.storyline_queue_empty_at ||= args.state.tick_count~
 - Inside source: true
 *** True Line Result
-  -520,8480,-480,8180
-** Processing line: ~  -480,8180,-200,8120~
+      args.state.storyline_queue_empty_at ||= args.state.tick_count
+** Processing line: ~      args.state.is_storyline_dialog_active = false~
 - Inside source: true
 *** True Line Result
-  -480,8180,-200,8120
-** Processing line: ~  -200,8120,100,8220~
+      args.state.is_storyline_dialog_active = false
+** Processing line: ~      return~
 - Inside source: true
 *** True Line Result
-  -200,8120,100,8220
-** Processing line: ~  100,8220,420,8240~
+      return
+** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
-  100,8220,420,8240
-** Processing line: ~  420,8240,760,8260~
+    end
+** Processing line: ~    args.state.storyline_to_show = next_storyline~
 - Inside source: true
 *** True Line Result
-  420,8240,760,8260
-** Processing line: ~  760,8260,1140,8280~
+    args.state.storyline_to_show = next_storyline
+** Processing line: ~    args.state.is_storyline_dialog_active = true~
 - Inside source: true
 *** True Line Result
-  760,8260,1140,8280
-** Processing line: ~  1140,8280,1500,8200~
+    args.state.is_storyline_dialog_active = true
+** Processing line: ~    args.state.storyline_queue_empty_at = nil~
 - Inside source: true
 *** True Line Result
-  1140,8280,1500,8200
-** Processing line: ~  1500,8200,1880,8240~
+    args.state.storyline_queue_empty_at = nil
+** Processing line: ~    if next_storyline.end_with?(".") || next_storyline.end_with?("!") || next_storyline.end_with?("?") || next_storyline.end_with?("\"")~
 - Inside source: true
 *** True Line Result
-  1500,8200,1880,8240
-** Processing line: ~  1880,8240,2240,8260~
+    if next_storyline.end_with?(".") || next_storyline.end_with?("!") || next_storyline.end_with?("?") || next_storyline.end_with?("\"")
+** Processing line: ~      args.state.next_storyline += 60~
 - Inside source: true
 *** True Line Result
-  1880,8240,2240,8260
-** Processing line: ~  2240,8260,2320,8480~
+      args.state.next_storyline += 60
+** Processing line: ~    elsif next_storyline.end_with?(",")~
 - Inside source: true
 *** True Line Result
-  2240,8260,2320,8480
-** Processing line: ~  2320,8480,2380,8680~
+    elsif next_storyline.end_with?(",")
+** Processing line: ~      args.state.next_storyline += 50~
 - Inside source: true
 *** True Line Result
-  2320,8480,2380,8680
-** Processing line: ~  2240,8860,2380,8680~
+      args.state.next_storyline += 50
+** Processing line: ~    elsif next_storyline.end_with?(":")~
 - Inside source: true
 *** True Line Result
-  2240,8860,2380,8680
-** Processing line: ~  2240,9080,2240,8860~
+    elsif next_storyline.end_with?(":")
+** Processing line: ~      args.state.next_storyline += 60~
 - Inside source: true
 *** True Line Result
-  2240,9080,2240,8860
-** Processing line: ~  2240,9080,2320,9260~
+      args.state.next_storyline += 60
+** Processing line: ~    else~
 - Inside source: true
 *** True Line Result
-  2240,9080,2320,9260
-** Processing line: ~  2320,9260,2480,9440~
+    else
+** Processing line: ~      default_word_delay = 13 + args.state.word_delay - 8~
 - Inside source: true
 *** True Line Result
-  2320,9260,2480,9440
-** Processing line: ~  2480,9440,2600,9640~
+      default_word_delay = 13 + args.state.word_delay - 8
+** Processing line: ~      if next_storyline.gsub("-", "").gsub("~", "").length <= 4~
 - Inside source: true
 *** True Line Result
-  2480,9440,2600,9640
-** Processing line: ~  2480,9840,2600,9640~
+      if next_storyline.gsub("-", "").gsub("~", "").length <= 4
+** Processing line: ~        default_word_delay = 11 + args.state.word_delay - 8~
 - Inside source: true
 *** True Line Result
-  2480,9840,2600,9640
-** Processing line: ~  2400,10020,2480,9840~
+        default_word_delay = 11 + args.state.word_delay - 8
+** Processing line: ~      end~
 - Inside source: true
 *** True Line Result
-  2400,10020,2480,9840
-** Processing line: ~  2240,10080,2400,10020~
+      end
+** Processing line: ~      number_of_syllabals = next_storyline.length - next_storyline.gsub("-", "").length~
 - Inside source: true
 *** True Line Result
-  2240,10080,2400,10020
-** Processing line: ~  1960,10080,2240,10080~
+      number_of_syllabals = next_storyline.length - next_storyline.gsub("-", "").length
+** Processing line: ~      args.state.next_storyline += default_word_delay + number_of_syllabals * (args.state.word_delay + 1)~
 - Inside source: true
 *** True Line Result
-  1960,10080,2240,10080
-** Processing line: ~  1720,10080,1960,10080~
+      args.state.next_storyline += default_word_delay + number_of_syllabals * (args.state.word_delay + 1)
+** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
-  1720,10080,1960,10080
-** Processing line: ~  1460,10080,1720,10080~
+    end
+** Processing line: ~  end~
 - Inside source: true
 *** True Line Result
-  1460,10080,1720,10080
-** Processing line: ~  1180,10080,1420,10080~
+  end
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-  1180,10080,1420,10080
-** Processing line: ~  900,10080,1180,10080~
+
+** Processing line: ~  def inputs_reload_current_scene args~
 - Inside source: true
 *** True Line Result
-  900,10080,1180,10080
-** Processing line: ~  640,10080,900,10080~
+  def inputs_reload_current_scene args
+** Processing line: ~    return~
 - Inside source: true
 *** True Line Result
-  640,10080,900,10080
-** Processing line: ~  640,10080,640,9900~
+    return
+** Processing line: ~    if args.inputs.keyboard.key_down.r!~
 - Inside source: true
 *** True Line Result
-  640,10080,640,9900
-** Processing line: ~  60,10520,100,10740~
+    if args.inputs.keyboard.key_down.r!
+** Processing line: ~      reload_current_scene~
 - Inside source: true
 *** True Line Result
-  60,10520,100,10740
-** Processing line: ~  40,10240,60,10520~
+      reload_current_scene
+** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
-  40,10240,60,10520
-** Processing line: ~  40,10240,40,9960~
+    end
+** Processing line: ~  end~
 - Inside source: true
 *** True Line Result
-  40,10240,40,9960
-** Processing line: ~  40,9960,40,9680~
+  end
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-  40,9960,40,9680
-** Processing line: ~  40,9680,40,9360~
+
+** Processing line: ~  def inputs_dismiss_current_storyline args~
 - Inside source: true
 *** True Line Result
-  40,9680,40,9360
-** Processing line: ~  40,9360,60,9080~
+  def inputs_dismiss_current_storyline args
+** Processing line: ~    if args.inputs.keyboard.key_down.x!~
 - Inside source: true
 *** True Line Result
-  40,9360,60,9080
-** Processing line: ~  60,9080,100,8860~
+    if args.inputs.keyboard.key_down.x!
+** Processing line: ~      args.state.scene_storyline_queue.clear~
 - Inside source: true
 *** True Line Result
-  60,9080,100,8860
-** Processing line: ~  100,8860,460,9040~
+      args.state.scene_storyline_queue.clear
+** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
-  100,8860,460,9040
-** Processing line: ~  460,9040,760,9220~
+    end
+** Processing line: ~  end~
 - Inside source: true
 *** True Line Result
-  460,9040,760,9220
-** Processing line: ~  760,9220,1140,9220~
+  end
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-  760,9220,1140,9220
-** Processing line: ~  1140,9220,1720,9200~
+
+** Processing line: ~  def inputs_restart_game args~
 - Inside source: true
 *** True Line Result
-  1140,9220,1720,9200
-** Processing line: ~  -660,11580,-600,11420~
+  def inputs_restart_game args
+** Processing line: ~    if args.inputs.keyboard.exclamation_point~
 - Inside source: true
 *** True Line Result
-  -660,11580,-600,11420
-** Processing line: ~  -660,11800,-660,11580~
+    if args.inputs.keyboard.exclamation_point
+** Processing line: ~      args.gtk.reset_state~
 - Inside source: true
 *** True Line Result
-  -660,11800,-660,11580
-** Processing line: ~  -660,12000,-660,11800~
+      args.gtk.reset_state
+** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
-  -660,12000,-660,11800
-** Processing line: ~  -660,12000,-600,12220~
+    end
+** Processing line: ~  end~
 - Inside source: true
 *** True Line Result
-  -660,12000,-600,12220
-** Processing line: ~  -600,12220,-600,12440~
+  end
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-  -600,12220,-600,12440
-** Processing line: ~  -600,12440,-600,12640~
+
+** Processing line: ~  def inputs_change_word_delay args~
 - Inside source: true
 *** True Line Result
-  -600,12440,-600,12640
-** Processing line: ~  -600,11240,-260,11280~
+  def inputs_change_word_delay args
+** Processing line: ~    if args.inputs.keyboard.key_down.plus || args.inputs.keyboard.key_down.equal_sign~
 - Inside source: true
 *** True Line Result
-  -600,11240,-260,11280
-** Processing line: ~  -260,11280,100,11240~
+    if args.inputs.keyboard.key_down.plus || args.inputs.keyboard.key_down.equal_sign
+** Processing line: ~      args.state.word_delay -= 2~
 - Inside source: true
 *** True Line Result
-  -260,11280,100,11240
-** Processing line: ~  9000,12360,9020,12400~
+      args.state.word_delay -= 2
+** Processing line: ~      if args.state.word_delay < 0~
 - Inside source: true
 *** True Line Result
-  9000,12360,9020,12400
-** Processing line: ~  9020,12620,9020,12400~
+      if args.state.word_delay < 0
+** Processing line: ~        args.state.word_delay = 0~
 - Inside source: true
 *** True Line Result
-  9020,12620,9020,12400
-** Processing line: ~  9020,12840,9020,12620~
+        args.state.word_delay = 0
+** Processing line: ~        # queue_storyline_text args, "Text speed at MAXIMUM. Geez, how fast do you read?"~
 - Inside source: true
 *** True Line Result
-  9020,12840,9020,12620
-** Processing line: ~  9020,13060,9020,12840~
+        # queue_storyline_text args, "Text speed at MAXIMUM. Geez, how fast do you read?"
+** Processing line: ~      else~
 - Inside source: true
 *** True Line Result
-  9020,13060,9020,12840
-** Processing line: ~  9020,13060,9020,13240~
+      else
+** Processing line: ~        # queue_storyline_text args, "Text speed INCREASED."~
 - Inside source: true
 *** True Line Result
-  9020,13060,9020,13240
-** Processing line: ~  9020,13240,9020,13420~
+        # queue_storyline_text args, "Text speed INCREASED."
+** Processing line: ~      end~
 - Inside source: true
 *** True Line Result
-  9020,13240,9020,13420
-** Processing line: ~  9020,13420,9020,13600~
+      end
+** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
-  9020,13420,9020,13600
-** Processing line: ~  9020,13600,9020,13780~
+    end
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-  9020,13600,9020,13780
-** Processing line: ~  8880,13900,9020,13780~
+
+** Processing line: ~    if args.inputs.keyboard.key_down.hyphen || args.inputs.keyboard.key_down.underscore~
 - Inside source: true
 *** True Line Result
-  8880,13900,9020,13780
-** Processing line: ~  8560,13800,8880,13900~
+    if args.inputs.keyboard.key_down.hyphen || args.inputs.keyboard.key_down.underscore
+** Processing line: ~      args.state.word_delay += 2~
 - Inside source: true
 *** True Line Result
-  8560,13800,8880,13900
-** Processing line: ~  8220,13780,8560,13800~
+      args.state.word_delay += 2
+** Processing line: ~      # queue_storyline_text args, "Text speed DECREASED."~
 - Inside source: true
 *** True Line Result
-  8220,13780,8560,13800
-** Processing line: ~  7860,13760,8220,13780~
+      # queue_storyline_text args, "Text speed DECREASED."
+** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
-  7860,13760,8220,13780
-** Processing line: ~  7640,13780,7860,13760~
+    end
+** Processing line: ~  end~
 - Inside source: true
 *** True Line Result
-  7640,13780,7860,13760
-** Processing line: ~  7360,13800,7640,13780~
+  end
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-  7360,13800,7640,13780
-** Processing line: ~  7100,13800,7360,13800~
+
+** Processing line: ~  def multiple_lines args, x, y, texts, size = 0, minimum_alpha = nil~
 - Inside source: true
 *** True Line Result
-  7100,13800,7360,13800
-** Processing line: ~  6540,13760,6800,13780~
+  def multiple_lines args, x, y, texts, size = 0, minimum_alpha = nil
+** Processing line: ~    texts.each_with_index.map do |t, i|~
 - Inside source: true
 *** True Line Result
-  6540,13760,6800,13780
-** Processing line: ~  6800,13780,7100,13800~
+    texts.each_with_index.map do |t, i|
+** Processing line: ~      [x, y - i * (25 + size * 2), t, size, 0, 255, 255, 255, adornments_alpha(args, 255, minimum_alpha)]~
 - Inside source: true
 *** True Line Result
-  6800,13780,7100,13800
-** Processing line: ~  6280,13760,6540,13760~
+      [x, y - i * (25 + size * 2), t, size, 0, 255, 255, 255, adornments_alpha(args, 255, minimum_alpha)]
+** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
-  6280,13760,6540,13760
-** Processing line: ~  5760,13760,6280,13760~
+    end
+** Processing line: ~  end~
 - Inside source: true
 *** True Line Result
-  5760,13760,6280,13760
-** Processing line: ~  5220,13780,5760,13760~
+  end
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-  5220,13780,5760,13760
-** Processing line: ~  4700,13760,5220,13780~
+
+** Processing line: ~  def lowrez_tick args, lowrez_sprites, lowrez_labels, lowrez_borders, lowrez_solids, lowrez_mouse~
 - Inside source: true
 *** True Line Result
-  4700,13760,5220,13780
-** Processing line: ~  4200,13740,4700,13760~
+  def lowrez_tick args, lowrez_sprites, lowrez_labels, lowrez_borders, lowrez_solids, lowrez_mouse
+** Processing line: ~    # args.state.show_gridlines = true~
 - Inside source: true
 *** True Line Result
-  4200,13740,4700,13760
-** Processing line: ~  3680,13720,4200,13740~
+    # args.state.show_gridlines = true
+** Processing line: ~    defaults args~
 - Inside source: true
 *** True Line Result
-  3680,13720,4200,13740
-** Processing line: ~  3140,13700,3680,13720~
+    defaults args
+** Processing line: ~    render_current_scene args, lowrez_sprites, lowrez_labels, lowrez_solids~
 - Inside source: true
 *** True Line Result
-  3140,13700,3680,13720
-** Processing line: ~  2600,13680,3140,13700~
+    render_current_scene args, lowrez_sprites, lowrez_labels, lowrez_solids
+** Processing line: ~    render_controller args, lowrez_borders~
 - Inside source: true
 *** True Line Result
-  2600,13680,3140,13700
-** Processing line: ~  2040,13940,2600,13680~
+    render_controller args, lowrez_borders
+** Processing line: ~    lowrez_solids << [0, 0, 64, 64, 0, 0, 0]~
 - Inside source: true
 *** True Line Result
-  2040,13940,2600,13680
-** Processing line: ~  1640,13940,2040,13940~
+    lowrez_solids << [0, 0, 64, 64, 0, 0, 0]
+** Processing line: ~    calc_storyline_presentation args~
 - Inside source: true
 *** True Line Result
-  1640,13940,2040,13940
-** Processing line: ~  1200,13960,1640,13940~
+    calc_storyline_presentation args
+** Processing line: ~    calc_scenes args~
 - Inside source: true
 *** True Line Result
-  1200,13960,1640,13940
-** Processing line: ~  840,14000,1200,13960~
+    calc_scenes args
+** Processing line: ~    calc_storyline_hotspot args~
 - Inside source: true
 *** True Line Result
-  840,14000,1200,13960
-** Processing line: ~  300,13960,840,14000~
+    calc_storyline_hotspot args
+** Processing line: ~    inputs_move_player args~
 - Inside source: true
 *** True Line Result
-  300,13960,840,14000
-** Processing line: ~  -200,13900,300,13960~
+    inputs_move_player args
+** Processing line: ~    inputs_print_mouse_rect args, lowrez_mouse~
 - Inside source: true
 *** True Line Result
-  -200,13900,300,13960
-** Processing line: ~  -600,12840,-600,12640~
+    inputs_print_mouse_rect args, lowrez_mouse
+** Processing line: ~    inputs_reload_current_scene args~
 - Inside source: true
 *** True Line Result
-  -600,12840,-600,12640
-** Processing line: ~  -600,13140,-600,12840~
+    inputs_reload_current_scene args
+** Processing line: ~    inputs_dismiss_current_storyline args~
 - Inside source: true
 *** True Line Result
-  -600,13140,-600,12840
-** Processing line: ~  -600,13140,-600,13420~
+    inputs_dismiss_current_storyline args
+** Processing line: ~    inputs_change_word_delay args~
 - Inside source: true
 *** True Line Result
-  -600,13140,-600,13420
-** Processing line: ~  -600,13700,-600,13420~
+    inputs_change_word_delay args
+** Processing line: ~    inputs_restart_game args~
 - Inside source: true
 *** True Line Result
-  -600,13700,-600,13420
-** Processing line: ~  -600,13700,-600,13820~
+    inputs_restart_game args
+** Processing line: ~  end~
 - Inside source: true
 *** True Line Result
-  -600,13700,-600,13820
-** Processing line: ~  -600,13820,-200,13900~
+  end
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-  -600,13820,-200,13900
-** Processing line: ~  -600,11240,-560,11000~
+
+** Processing line: ~  def render_controller args, lowrez_borders~
 - Inside source: true
 *** True Line Result
-  -600,11240,-560,11000
-** Processing line: ~  -560,11000,-480,10840~
+  def render_controller args, lowrez_borders
+** Processing line: ~    args.state.up_button    = [85, 40, 15, 15, 255, 255, 255]~
 - Inside source: true
 *** True Line Result
-  -560,11000,-480,10840
-** Processing line: ~  -520,10660,-480,10840~
+    args.state.up_button    = [85, 40, 15, 15, 255, 255, 255]
+** Processing line: ~    args.state.down_button  = [85, 20, 15, 15, 255, 255, 255]~
 - Inside source: true
 *** True Line Result
-  -520,10660,-480,10840
-** Processing line: ~  -520,10660,-520,10480~
+    args.state.down_button  = [85, 20, 15, 15, 255, 255, 255]
+** Processing line: ~    args.state.left_button  = [65, 20, 15, 15, 255, 255, 255]~
 - Inside source: true
 *** True Line Result
-  -520,10660,-520,10480
-** Processing line: ~  -520,10480,-520,10300~
+    args.state.left_button  = [65, 20, 15, 15, 255, 255, 255]
+** Processing line: ~    args.state.right_button = [105, 20, 15, 15, 255, 255, 255]~
 - Inside source: true
 *** True Line Result
-  -520,10480,-520,10300
-** Processing line: ~  -520,10260,-480,10080~
+    args.state.right_button = [105, 20, 15, 15, 255, 255, 255]
+** Processing line: ~    lowrez_borders << args.state.up_button~
 - Inside source: true
 *** True Line Result
-  -520,10260,-480,10080
-** Processing line: ~  -480,9880,-440,10060~
+    lowrez_borders << args.state.up_button
+** Processing line: ~    lowrez_borders << args.state.down_button~
 - Inside source: true
 *** True Line Result
-  -480,9880,-440,10060
-** Processing line: ~  -520,9680,-480,9880~
+    lowrez_borders << args.state.down_button
+** Processing line: ~    lowrez_borders << args.state.left_button~
 - Inside source: true
 *** True Line Result
-  -520,9680,-480,9880
-** Processing line: ~  -520,9680,-480,9400~
+    lowrez_borders << args.state.left_button
+** Processing line: ~    lowrez_borders << args.state.right_button~
 - Inside source: true
 *** True Line Result
-  -520,9680,-480,9400
-** Processing line: ~  -480,9400,-480,9160~
+    lowrez_borders << args.state.right_button
+** Processing line: ~  end~
 - Inside source: true
 *** True Line Result
-  -480,9400,-480,9160
-** Processing line: ~  1820,9880,2140,9800~
+  end
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-  1820,9880,2140,9800
-** Processing line: ~  1540,9880,1820,9880~
+
+** Processing line: ~  def inputs_print_mouse_rect args, lowrez_mouse~
 - Inside source: true
 *** True Line Result
-  1540,9880,1820,9880
-** Processing line: ~  1200,9920,1500,9880~
+  def inputs_print_mouse_rect args, lowrez_mouse
+** Processing line: ~    if lowrez_mouse.up~
 - Inside source: true
 *** True Line Result
-  1200,9920,1500,9880
-** Processing line: ~  900,9880,1200,9920~
+    if lowrez_mouse.up
+** Processing line: ~      args.state.mouse_held = false~
 - Inside source: true
 *** True Line Result
-  900,9880,1200,9920
-** Processing line: ~  640,9900,840,9880~
+      args.state.mouse_held = false
+** Processing line: ~    elsif lowrez_mouse.click~
 - Inside source: true
 *** True Line Result
-  640,9900,840,9880
-** Processing line: ~  2380,8760,2800,8760~
+    elsif lowrez_mouse.click
+** Processing line: ~      mouse_rect = [lowrez_mouse.x, lowrez_mouse.y, 1, 1]~
 - Inside source: true
 *** True Line Result
-  2380,8760,2800,8760
-** Processing line: ~  2800,8760,2840,8660~
+      mouse_rect = [lowrez_mouse.x, lowrez_mouse.y, 1, 1]
+** Processing line: ~      if args.state.up_button.intersect_rect? mouse_rect~
 - Inside source: true
 *** True Line Result
-  2800,8760,2840,8660
-** Processing line: ~  2840,8660,2840,8420~
+      if args.state.up_button.intersect_rect? mouse_rect
+** Processing line: ~        args.state.player.y += 1~
 - Inside source: true
 *** True Line Result
-  2840,8660,2840,8420
-** Processing line: ~  2840,8160,2840,8420~
+        args.state.player.y += 1
+** Processing line: ~      end~
 - Inside source: true
 *** True Line Result
-  2840,8160,2840,8420
-** Processing line: ~  2800,7900,2840,8160~
+      end
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-  2800,7900,2840,8160
-** Processing line: ~  2800,7900,2800,7720~
+
+** Processing line: ~      if args.state.down_button.intersect_rect? mouse_rect~
 - Inside source: true
 *** True Line Result
-  2800,7900,2800,7720
-** Processing line: ~  2800,7540,2800,7720~
+      if args.state.down_button.intersect_rect? mouse_rect
+** Processing line: ~        args.state.player.y -= 1~
 - Inside source: true
 *** True Line Result
-  2800,7540,2800,7720
-** Processing line: ~  2800,7540,2800,7360~
+        args.state.player.y -= 1
+** Processing line: ~      end~
 - Inside source: true
 *** True Line Result
-  2800,7540,2800,7360
-** Processing line: ~  2700,7220,2800,7360~
+      end
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-  2700,7220,2800,7360
-** Processing line: ~  2400,7220,2700,7220~
+
+** Processing line: ~      if args.state.left_button.intersect_rect? mouse_rect~
 - Inside source: true
 *** True Line Result
-  2400,7220,2700,7220
-** Processing line: ~  2080,7240,2400,7220~
+      if args.state.left_button.intersect_rect? mouse_rect
+** Processing line: ~        args.state.player.x -= 1~
 - Inside source: true
 *** True Line Result
-  2080,7240,2400,7220
-** Processing line: ~  1760,7320,2080,7240~
+        args.state.player.x -= 1
+** Processing line: ~      end~
 - Inside source: true
 *** True Line Result
-  1760,7320,2080,7240
-** Processing line: ~  1380,7360,1720,7320~
+      end
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-  1380,7360,1720,7320
-** Processing line: ~  1040,7400,1340,7360~
+
+** Processing line: ~      if args.state.right_button.intersect_rect? mouse_rect~
 - Inside source: true
 *** True Line Result
-  1040,7400,1340,7360
-** Processing line: ~  640,7400,1000,7420~
+      if args.state.right_button.intersect_rect? mouse_rect
+** Processing line: ~        args.state.player.x += 1~
 - Inside source: true
 *** True Line Result
-  640,7400,1000,7420
-** Processing line: ~  300,7380,640,7400~
+        args.state.player.x += 1
+** Processing line: ~      end~
 - Inside source: true
 *** True Line Result
-  300,7380,640,7400
-** Processing line: ~  0,7300,240,7380~
+      end
+** Processing line: ~      args.state.mouse_held = true~
 - Inside source: true
 *** True Line Result
-  0,7300,240,7380
-** Processing line: ~  -300,7180,-60,7300~
+      args.state.mouse_held = true
+** Processing line: ~    elsif args.state.mouse_held~
 - Inside source: true
 *** True Line Result
-  -300,7180,-60,7300
-** Processing line: ~  -380,6860,-360,7180~
+    elsif args.state.mouse_held
+** Processing line: ~      mouse_rect = [lowrez_mouse.x, lowrez_mouse.y, 1, 1]~
 - Inside source: true
 *** True Line Result
-  -380,6860,-360,7180
-** Processing line: ~  -380,6880,-360,6700~
+      mouse_rect = [lowrez_mouse.x, lowrez_mouse.y, 1, 1]
+** Processing line: ~      if args.state.up_button.intersect_rect? mouse_rect~
 - Inside source: true
 *** True Line Result
-  -380,6880,-360,6700
-** Processing line: ~  -360,6700,-260,6540~
+      if args.state.up_button.intersect_rect? mouse_rect
+** Processing line: ~        args.state.player.y += 0.25~
 - Inside source: true
 *** True Line Result
-  -360,6700,-260,6540
-** Processing line: ~  -260,6540,0,6520~
+        args.state.player.y += 0.25
+** Processing line: ~      end~
 - Inside source: true
 *** True Line Result
-  -260,6540,0,6520
-** Processing line: ~  0,6520,240,6640~
+      end
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-  0,6520,240,6640
-** Processing line: ~  240,6640,460,6640~
+
+** Processing line: ~      if args.state.down_button.intersect_rect? mouse_rect~
 - Inside source: true
 *** True Line Result
-  240,6640,460,6640
-** Processing line: ~  460,6640,500,6480~
+      if args.state.down_button.intersect_rect? mouse_rect
+** Processing line: ~        args.state.player.y -= 0.25~
 - Inside source: true
 *** True Line Result
-  460,6640,500,6480
-** Processing line: ~  500,6260,500,6480~
+        args.state.player.y -= 0.25
+** Processing line: ~      end~
 - Inside source: true
 *** True Line Result
-  500,6260,500,6480
-** Processing line: ~  460,6060,500,6260~
+      end
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-  460,6060,500,6260
-** Processing line: ~  460,5860,460,6060~
+
+** Processing line: ~      if args.state.left_button.intersect_rect? mouse_rect~
 - Inside source: true
 *** True Line Result
-  460,5860,460,6060
-** Processing line: ~  460,5860,500,5640~
+      if args.state.left_button.intersect_rect? mouse_rect
+** Processing line: ~        args.state.player.x -= 0.25~
 - Inside source: true
 *** True Line Result
-  460,5860,500,5640
-** Processing line: ~  500,5640,540,5440~
+        args.state.player.x -= 0.25
+** Processing line: ~      end~
 - Inside source: true
 *** True Line Result
-  500,5640,540,5440
-** Processing line: ~  540,5440,580,5220~
+      end
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-  540,5440,580,5220
-** Processing line: ~  580,5220,580,5000~
+
+** Processing line: ~      if args.state.right_button.intersect_rect? mouse_rect~
 - Inside source: true
 *** True Line Result
-  580,5220,580,5000
-** Processing line: ~  580,4960,580,4740~
+      if args.state.right_button.intersect_rect? mouse_rect
+** Processing line: ~        args.state.player.x += 0.25~
 - Inside source: true
 *** True Line Result
-  580,4960,580,4740
-** Processing line: ~  580,4740,960,4700~
+        args.state.player.x += 0.25
+** Processing line: ~      end~
 - Inside source: true
 *** True Line Result
-  580,4740,960,4700
-** Processing line: ~  960,4700,1140,4760~
+      end
+** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
-  960,4700,1140,4760
-** Processing line: ~  1140,4760,1420,4740~
+    end
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-  1140,4760,1420,4740
-** Processing line: ~  1420,4740,1720,4700~
+
+** Processing line: ~    if lowrez_mouse.click~
 - Inside source: true
 *** True Line Result
-  1420,4740,1720,4700
-** Processing line: ~  1720,4700,2000,4740~
+    if lowrez_mouse.click
+** Processing line: ~      dx = lowrez_mouse.click.x - args.state.previous_mouse_click.x~
 - Inside source: true
 *** True Line Result
-  1720,4700,2000,4740
-** Processing line: ~  2000,4740,2380,4760~
+      dx = lowrez_mouse.click.x - args.state.previous_mouse_click.x
+** Processing line: ~      dy = lowrez_mouse.click.y - args.state.previous_mouse_click.y~
 - Inside source: true
 *** True Line Result
-  2000,4740,2380,4760
-** Processing line: ~  2380,4760,2700,4800~
+      dy = lowrez_mouse.click.y - args.state.previous_mouse_click.y
+** Processing line: ~      x, y, w, h = args.state.previous_mouse_click.x, args.state.previous_mouse_click.y, dx, dy~
 - Inside source: true
 *** True Line Result
-  2380,4760,2700,4800
-** Processing line: ~  1720,4600,1760,4300~
+      x, y, w, h = args.state.previous_mouse_click.x, args.state.previous_mouse_click.y, dx, dy
+** Processing line: ~      puts "x #{lowrez_mouse.click.x}, y: #{lowrez_mouse.click.y}"~
 - Inside source: true
 *** True Line Result
-  1720,4600,1760,4300
-** Processing line: ~  1760,4300,2200,4340~
+      puts "x #{lowrez_mouse.click.x}, y: #{lowrez_mouse.click.y}"
+** Processing line: ~      if args.state.previous_mouse_click~
 - Inside source: true
 *** True Line Result
-  1760,4300,2200,4340
-** Processing line: ~  2200,4340,2560,4340~
+      if args.state.previous_mouse_click
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-  2200,4340,2560,4340
-** Processing line: ~  2560,4340,2740,4340~
+
+** Processing line: ~        if dx < 0 && dx < 0~
 - Inside source: true
 *** True Line Result
-  2560,4340,2740,4340
-** Processing line: ~  2160,12580,2440,12400~
+        if dx < 0 && dx < 0
+** Processing line: ~          x = x + w~
 - Inside source: true
 *** True Line Result
-  2160,12580,2440,12400
-** Processing line: ~  1820,12840,2160,12580~
+          x = x + w
+** Processing line: ~          w = w.abs~
 - Inside source: true
 *** True Line Result
-  1820,12840,2160,12580
-** Processing line: ~  1500,13080,1820,12840~
+          w = w.abs
+** Processing line: ~          y = y + h~
 - Inside source: true
 *** True Line Result
-  1500,13080,1820,12840
-** Processing line: ~  1140,13340,1500,13080~
+          y = y + h
+** Processing line: ~          h = h.abs~
 - Inside source: true
 *** True Line Result
-  1140,13340,1500,13080
-** Processing line: ~  1140,13340,1580,13220~
+          h = h.abs
+** Processing line: ~        end~
 - Inside source: true
 *** True Line Result
-  1140,13340,1580,13220
-** Processing line: ~  2110,13080,2520,13000~
+        end
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-  2110,13080,2520,13000
-** Processing line: ~  2520,13000,2900,12800~
+
+** Processing line: ~        w += 1~
 - Inside source: true
 *** True Line Result
-  2520,13000,2900,12800
-** Processing line: ~  1580,13220,2110,13080~
+        w += 1
+** Processing line: ~        h += 1~
 - Inside source: true
 *** True Line Result
-  1580,13220,2110,13080
-** Processing line: ~  2900,12800,3200,12680~
+        h += 1
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-  2900,12800,3200,12680
-** Processing line: ~  3200,12680,3440,12640~
+
+** Processing line: ~        args.state.previous_mouse_click = nil~
 - Inside source: true
 *** True Line Result
-  3200,12680,3440,12640
-** Processing line: ~  3440,12640,3720,12460~
+        args.state.previous_mouse_click = nil
+** Processing line: ~      else~
 - Inside source: true
 *** True Line Result
-  3440,12640,3720,12460
-** Processing line: ~  3720,12460,4040,12320~
+      else
+** Processing line: ~        args.state.previous_mouse_click = lowrez_mouse.click~
 - Inside source: true
 *** True Line Result
-  3720,12460,4040,12320
-** Processing line: ~  4040,12320,4360,12200~
+        args.state.previous_mouse_click = lowrez_mouse.click
+** Processing line: ~        square_x, square_y = lowrez_mouse.click~
 - Inside source: true
 *** True Line Result
-  4040,12320,4360,12200
-** Processing line: ~  4360,11940,4380,12180~
+        square_x, square_y = lowrez_mouse.click
+** Processing line: ~      end~
 - Inside source: true
 *** True Line Result
-  4360,11940,4380,12180
-** Processing line: ~  4360,11700,4360,11940~
+      end
+** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
-  4360,11700,4360,11940
-** Processing line: ~  4360,11700,4540,11500~
+    end
+** Processing line: ~  end~
 - Inside source: true
 *** True Line Result
-  4360,11700,4540,11500
-** Processing line: ~  4540,11500,4880,11540~
+  end
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-  4540,11500,4880,11540
-** Processing line: ~  6000,11660,6280,11640~
+
+** Processing line: ~  def try_centering! word~
 - Inside source: true
 *** True Line Result
-  6000,11660,6280,11640
-** Processing line: ~  5440,11600,5720,11610~
+  def try_centering! word
+** Processing line: ~    word ||= ""~
 - Inside source: true
 *** True Line Result
-  5440,11600,5720,11610
-** Processing line: ~  5720,11610,6000,11660~
+    word ||= ""
+** Processing line: ~    just_word = word.gsub("-", "").gsub(",", "").gsub(".", "").gsub("'", "").gsub('""', "\"-\"")~
 - Inside source: true
 *** True Line Result
-  5720,11610,6000,11660
-** Processing line: ~  6280,11640,6760,11720~
+    just_word = word.gsub("-", "").gsub(",", "").gsub(".", "").gsub("'", "").gsub('""', "\"-\"")
+** Processing line: ~    return word if just_word.strip.length == 0~
 - Inside source: true
 *** True Line Result
-  6280,11640,6760,11720
-** Processing line: ~  6760,11720,7060,11780~
+    return word if just_word.strip.length == 0
+** Processing line: ~    return word if just_word.include? "~"~
 - Inside source: true
 *** True Line Result
-  6760,11720,7060,11780
-** Processing line: ~  7060,11780,7360,11810~
+    return word if just_word.include? "~"
+** Processing line: ~    return "~#{word}" if just_word.length <= 2~
 - Inside source: true
 *** True Line Result
-  7060,11780,7360,11810
-** Processing line: ~  7360,11810,7640,11840~
+    return "~#{word}" if just_word.length <= 2
+** Processing line: ~    if just_word.length.mod_zero? 2~
 - Inside source: true
 *** True Line Result
-  7360,11810,7640,11840
-** Processing line: ~  7640,11840,8000,11830~
+    if just_word.length.mod_zero? 2
+** Processing line: ~      center_index = just_word.length.idiv(2) - 1~
 - Inside source: true
 *** True Line Result
-  7640,11840,8000,11830
-** Processing line: ~  8000,11830,8320,11850~
+      center_index = just_word.length.idiv(2) - 1
+** Processing line: ~    else~
 - Inside source: true
 *** True Line Result
-  8000,11830,8320,11850
-** Processing line: ~  8320,11850,8390,11800~
+    else
+** Processing line: ~      center_index = (just_word.length - 1).idiv(2)~
 - Inside source: true
 *** True Line Result
-  8320,11850,8390,11800
-** Processing line: ~  8330,11760,8390,11800~
+      center_index = (just_word.length - 1).idiv(2)
+** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
-  8330,11760,8390,11800
-** Processing line: ~  8160,11760,8330,11760~
+    end
+** Processing line: ~    return "#{word[0..center_index - 1]}~#{word[center_index]}#{word[center_index + 1..-1]}"~
 - Inside source: true
 *** True Line Result
-  8160,11760,8330,11760
-** Processing line: ~  7910,11750,8160,11760~
+    return "#{word[0..center_index - 1]}~#{word[center_index]}#{word[center_index + 1..-1]}"
+** Processing line: ~  end~
 - Inside source: true
 *** True Line Result
-  7910,11750,8160,11760
-** Processing line: ~  7660,11740,7900,11750~
+  end
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-  7660,11740,7900,11750
-** Processing line: ~  7400,11730,7660,11740~
+
+** Processing line: ~  def queue_storyline args, scene~
 - Inside source: true
 *** True Line Result
-  7400,11730,7660,11740
-** Processing line: ~  7160,11680,7400,11730~
+  def queue_storyline args, scene
+** Processing line: ~    queue_storyline_text args, scene[:storyline]~
 - Inside source: true
 *** True Line Result
-  7160,11680,7400,11730
-** Processing line: ~  7080,11570,7160,11680~
+    queue_storyline_text args, scene[:storyline]
+** Processing line: ~  end~
 - Inside source: true
 *** True Line Result
-  7080,11570,7160,11680
-** Processing line: ~  7080,11570,7100,11350~
+  end
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-  7080,11570,7100,11350
-** Processing line: ~  7100,11350,7440,11280~
+
+** Processing line: ~  def queue_storyline_text args, text~
 - Inside source: true
 *** True Line Result
-  7100,11350,7440,11280
-** Processing line: ~  7440,11280,7940,11280~
+  def queue_storyline_text args, text
+** Processing line: ~    args.state.last_story_line_text = text~
 - Inside source: true
 *** True Line Result
-  7440,11280,7940,11280
-** Processing line: ~  7960,11280,8360,11280~
+    args.state.last_story_line_text = text
+** Processing line: ~    args.state.storyline_history << text if text~
 - Inside source: true
 *** True Line Result
-  7960,11280,8360,11280
-** Processing line: ~  5840,11540,6650,11170~
+    args.state.storyline_history << text if text
+** Processing line: ~    words = (text || "").split(" ")~
 - Inside source: true
 *** True Line Result
-  5840,11540,6650,11170
-** Processing line: ~  4880,11540,5440,11600~
+    words = (text || "").split(" ")
+** Processing line: ~    words = words.map { |w| try_centering! w }~
 - Inside source: true
 *** True Line Result
-  4880,11540,5440,11600
-** Processing line: ~  3410,11830,3420,11300~
+    words = words.map { |w| try_centering! w }
+** Processing line: ~    args.state.scene_storyline_queue = words~
 - Inside source: true
 *** True Line Result
-  3410,11830,3420,11300
-** Processing line: ~  3410,11260,3520,10920~
+    args.state.scene_storyline_queue = words
+** Processing line: ~    if args.state.scene_storyline_queue.length != 0~
 - Inside source: true
 *** True Line Result
-  3410,11260,3520,10920
-** Processing line: ~  3520,10590,3520,10920~
+    if args.state.scene_storyline_queue.length != 0
+** Processing line: ~      args.state.scene_storyline_queue.unshift "~$--"~
 - Inside source: true
 *** True Line Result
-  3520,10590,3520,10920
-** Processing line: ~  3520,10590,3540,10260~
+      args.state.scene_storyline_queue.unshift "~$--"
+** Processing line: ~      args.state.storyline_to_show = "~."~
 - Inside source: true
 *** True Line Result
-  3520,10590,3540,10260
-** Processing line: ~  3520,9900,3540,10240~
+      args.state.storyline_to_show = "~."
+** Processing line: ~    else~
 - Inside source: true
 *** True Line Result
-  3520,9900,3540,10240
-** Processing line: ~  3520,9900,3640,9590~
+    else
+** Processing line: ~      args.state.storyline_to_show = ""~
 - Inside source: true
 *** True Line Result
-  3520,9900,3640,9590
-** Processing line: ~  3640,9570,4120,9590~
+      args.state.storyline_to_show = ""
+** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
-  3640,9570,4120,9590
-** Processing line: ~  4140,9590,4600,9680~
+    end
+** Processing line: ~    args.state.scene_storyline_queue << ""~
 - Inside source: true
 *** True Line Result
-  4140,9590,4600,9680
-** Processing line: ~  4620,9680,5030,9730~
+    args.state.scene_storyline_queue << ""
+** Processing line: ~    args.state.next_storyline = args.state.tick_count~
 - Inside source: true
 *** True Line Result
-  4620,9680,5030,9730
-** Processing line: ~  5120,9750,5520,9800~
+    args.state.next_storyline = args.state.tick_count
+** Processing line: ~  end~
 - Inside source: true
 *** True Line Result
-  5120,9750,5520,9800
-** Processing line: ~  5620,9820,6080,9800~
+  end
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-  5620,9820,6080,9800
-** Processing line: ~  6130,9810,6580,9820~
+
+** Processing line: ~  def set_scene args, scene~
 - Inside source: true
 *** True Line Result
-  6130,9810,6580,9820
-** Processing line: ~  6640,9820,6800,9700~
+  def set_scene args, scene
+** Processing line: ~    args.state.current_scene = scene~
 - Inside source: true
 *** True Line Result
-  6640,9820,6800,9700
-** Processing line: ~  6780,9400,6800,9700~
+    args.state.current_scene = scene
+** Processing line: ~    args.state.background = scene[:background] ||  'sprites/todo.png'~
 - Inside source: true
 *** True Line Result
-  6780,9400,6800,9700
-** Processing line: ~  6780,9400,6840,9140~
+    args.state.background = scene[:background] ||  'sprites/todo.png'
+** Processing line: ~    args.state.scene_fade = scene[:fade] || 0~
 - Inside source: true
 *** True Line Result
-  6780,9400,6840,9140
-** Processing line: ~  6820,8860,6840,9120~
+    args.state.scene_fade = scene[:fade] || 0
+** Processing line: ~    args.state.scenes = (scene[:scenes] || []).reject { |s| !s }~
 - Inside source: true
 *** True Line Result
-  6820,8860,6840,9120
-** Processing line: ~  6780,8600,6820,8830~
+    args.state.scenes = (scene[:scenes] || []).reject { |s| !s }
+** Processing line: ~    args.state.scene_render_override = scene[:render_override]~
 - Inside source: true
 *** True Line Result
-  6780,8600,6820,8830
-** Processing line: ~  6720,8350,6780,8570~
+    args.state.scene_render_override = scene[:render_override]
+** Processing line: ~    args.state.storylines = (scene[:storylines] || []).reject { |s| !s }~
 - Inside source: true
 *** True Line Result
-  6720,8350,6780,8570
-** Processing line: ~  6480,8340,6720,8320~
+    args.state.storylines = (scene[:storylines] || []).reject { |s| !s }
+** Processing line: ~    args.state.scene_changed_at = args.state.tick_count~
 - Inside source: true
 *** True Line Result
-  6480,8340,6720,8320
-** Processing line: ~  6260,8400,6480,8340~
+    args.state.scene_changed_at = args.state.tick_count
+** Processing line: ~    if scene[:player]~
 - Inside source: true
 *** True Line Result
-  6260,8400,6480,8340
-** Processing line: ~  6050,8580,6240,8400~
+    if scene[:player]
+** Processing line: ~      args.state.player = scene[:player]~
 - Inside source: true
 *** True Line Result
-  6050,8580,6240,8400
-** Processing line: ~  5760,8630,6040,8590~
+      args.state.player = scene[:player]
+** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
-  5760,8630,6040,8590
-** Processing line: ~  5520,8690,5740,8630~
+    end
+** Processing line: ~    args.state.inside_scene_hotspot = false~
 - Inside source: true
 *** True Line Result
-  5520,8690,5740,8630
-** Processing line: ~  5120,8690,5450,8700~
+    args.state.inside_scene_hotspot = false
+** Processing line: ~    args.state.inside_storyline_hotspot = false~
 - Inside source: true
 *** True Line Result
-  5120,8690,5450,8700
-** Processing line: ~  4570,8670,5080,8690~
+    args.state.inside_storyline_hotspot = false
+** Processing line: ~    queue_storyline args, scene~
 - Inside source: true
 *** True Line Result
-  4570,8670,5080,8690
-** Processing line: ~  4020,8610,4540,8670~
+    queue_storyline args, scene
+** Processing line: ~  end~
 - Inside source: true
 *** True Line Result
-  4020,8610,4540,8670
-** Processing line: ~  3540,8480,4020,8610~
+  end
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-  3540,8480,4020,8610
-** Processing line: ~  3520,8230,3520,8480~
+
+** Processing line: ~  def replay_storyline_rect~
 - Inside source: true
 *** True Line Result
-  3520,8230,3520,8480
-** Processing line: ~  3520,7930,3520,8230~
+  def replay_storyline_rect
+** Processing line: ~    [26, -1, 7, 4]~
 - Inside source: true
 *** True Line Result
-  3520,7930,3520,8230
-** Processing line: ~  3520,7930,3540,7630~
+    [26, -1, 7, 4]
+** Processing line: ~  end~
 - Inside source: true
 *** True Line Result
-  3520,7930,3540,7630
-** Processing line: ~  3480,7320,3540,7610~
+  end
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-  3480,7320,3540,7610
-** Processing line: ~  3480,7280,3500,7010~
+
+** Processing line: ~  def labels_for_word word~
 - Inside source: true
 *** True Line Result
-  3480,7280,3500,7010
-** Processing line: ~  3500,6980,3680,6850~
+  def labels_for_word word
+** Processing line: ~    left_side_of_word = ""~
 - Inside source: true
 *** True Line Result
-  3500,6980,3680,6850
-** Processing line: ~  3680,6850,4220,6840~
+    left_side_of_word = ""
+** Processing line: ~    center_letter = ""~
 - Inside source: true
 *** True Line Result
-  3680,6850,4220,6840
-** Processing line: ~  4230,6840,4760,6850~
+    center_letter = ""
+** Processing line: ~    right_side_of_word = ""~
 - Inside source: true
 *** True Line Result
-  4230,6840,4760,6850
-** Processing line: ~  4780,6850,5310,6860~
+    right_side_of_word = ""
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-  4780,6850,5310,6860
-** Processing line: ~  5310,6860,5720,6940~
+
+** Processing line: ~    if word[0] == "~"~
 - Inside source: true
 *** True Line Result
-  5310,6860,5720,6940
-** Processing line: ~  5720,6940,5880,7250~
+    if word[0] == "~"
+** Processing line: ~      left_side_of_word = ""~
 - Inside source: true
 *** True Line Result
-  5720,6940,5880,7250
-** Processing line: ~  5880,7250,5900,7520~
+      left_side_of_word = ""
+** Processing line: ~      center_letter = word[1]~
 - Inside source: true
 *** True Line Result
-  5880,7250,5900,7520
-** Processing line: ~  100,11240,440,11300~
+      center_letter = word[1]
+** Processing line: ~      right_side_of_word = word[2..-1]~
 - Inside source: true
 *** True Line Result
-  100,11240,440,11300
-** Processing line: ~  440,11300,760,11330~
+      right_side_of_word = word[2..-1]
+** Processing line: ~    elsif word.length > 0~
 - Inside source: true
 *** True Line Result
-  440,11300,760,11330
-** Processing line: ~  1480,11280,1840,11230~
+    elsif word.length > 0
+** Processing line: ~      left_side_of_word, right_side_of_word = word.split("~")~
 - Inside source: true
 *** True Line Result
-  1480,11280,1840,11230
-** Processing line: ~  2200,11130,2360,11090~
+      left_side_of_word, right_side_of_word = word.split("~")
+** Processing line: ~      center_letter = right_side_of_word[0]~
 - Inside source: true
 *** True Line Result
-  2200,11130,2360,11090
-** Processing line: ~  1840,11230,2200,11130~
+      center_letter = right_side_of_word[0]
+** Processing line: ~      right_side_of_word = right_side_of_word[1..-1]~
 - Inside source: true
 *** True Line Result
-  1840,11230,2200,11130
-** Processing line: ~#+end_src~
-- Line was identified as the end of a code block.
+      right_side_of_word = right_side_of_word[1..-1]
+** Processing line: ~    end~
+- Inside source: true
 *** True Line Result
-#+end_src
+    end
 ** Processing line: ~~
-- End of paragraph detected.
-*** True Line Result
-
-** Processing line: ~*** Rpg Narrative - Choose Your Own Adventure - decision.rb~
-- Header detected.
+- Inside source: true
 *** True Line Result
 
+** Processing line: ~    right_side_of_word = right_side_of_word.gsub("-", "")~
+- Inside source: true
 *** True Line Result
-*** Rpg Narrative - Choose Your Own Adventure - decision.rb
-** Processing line: ~#+begin_src ruby~
-- Line was identified as the beginning of a code block.
+    right_side_of_word = right_side_of_word.gsub("-", "")
+** Processing line: ~~
+- Inside source: true
 *** True Line Result
 
-*** True Line Result
-#+begin_src ruby
-** Processing line: ~  # ./samples/99_genre_rpg_narrative/choose_your_own_adventure/app/decision.rb~
+** Processing line: ~    {~
 - Inside source: true
 *** True Line Result
-  # ./samples/99_genre_rpg_narrative/choose_your_own_adventure/app/decision.rb
-** Processing line: ~  # Hey there! Welcome to Four Decisions. Here is how you~
+    {
+** Processing line: ~      left:   [29 - left_side_of_word.length * 4 - 1 * left_side_of_word.length, 2, left_side_of_word],~
 - Inside source: true
 *** True Line Result
-  # Hey there! Welcome to Four Decisions. Here is how you
-** Processing line: ~  # create your decision tree. Remove =being and =end from the text to~
+      left:   [29 - left_side_of_word.length * 4 - 1 * left_side_of_word.length, 2, left_side_of_word],
+** Processing line: ~      center: [29, 2, center_letter, 255, 0, 0],~
 - Inside source: true
 *** True Line Result
-  # create your decision tree. Remove =being and =end from the text to
-** Processing line: ~  # enable the game (just save the file). Change stuff and see what happens!~
+      center: [29, 2, center_letter, 255, 0, 0],
+** Processing line: ~      right:  [34, 2, right_side_of_word]~
 - Inside source: true
 *** True Line Result
-  # enable the game (just save the file). Change stuff and see what happens!
-** Processing line: ~~
+      right:  [34, 2, right_side_of_word]
+** Processing line: ~    }~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~  def game~
+    }
+** Processing line: ~  end~
 - Inside source: true
 *** True Line Result
-  def game
-** Processing line: ~    {~
+  end
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-    {
-** Processing line: ~      starting_decision: :stormy_night,~
+
+** Processing line: ~  def render_scenes args, lowrez_sprites~
 - Inside source: true
 *** True Line Result
-      starting_decision: :stormy_night,
-** Processing line: ~      decisions: {~
+  def render_scenes args, lowrez_sprites
+** Processing line: ~    lowrez_sprites << args.state.scenes.flat_map do |hs|~
 - Inside source: true
 *** True Line Result
-      decisions: {
-** Processing line: ~        stormy_night: {~
+    lowrez_sprites << args.state.scenes.flat_map do |hs|
+** Processing line: ~      hotspot_square args, hs.x, hs.y, hs.w, hs.h~
 - Inside source: true
 *** True Line Result
-        stormy_night: {
-** Processing line: ~          description: 'It was a dark and stormy night. (storyline located in decision.rb)',~
+      hotspot_square args, hs.x, hs.y, hs.w, hs.h
+** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
-          description: 'It was a dark and stormy night. (storyline located in decision.rb)',
-** Processing line: ~          option_one: {~
+    end
+** Processing line: ~  end~
 - Inside source: true
 *** True Line Result
-          option_one: {
-** Processing line: ~            description: 'Go to sleep.',~
+  end
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-            description: 'Go to sleep.',
-** Processing line: ~            decision: :nap~
+
+** Processing line: ~  def render_storylines args, lowrez_sprites~
 - Inside source: true
 *** True Line Result
-            decision: :nap
-** Processing line: ~          },~
+  def render_storylines args, lowrez_sprites
+** Processing line: ~    lowrez_sprites << args.state.storylines.flat_map do |hs|~
 - Inside source: true
 *** True Line Result
-          },
-** Processing line: ~          option_two: {~
+    lowrez_sprites << args.state.storylines.flat_map do |hs|
+** Processing line: ~      hotspot_square args, hs.x, hs.y, hs.w, hs.h~
 - Inside source: true
 *** True Line Result
-          option_two: {
-** Processing line: ~            description: 'Watch a movie.',~
+      hotspot_square args, hs.x, hs.y, hs.w, hs.h
+** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
-            description: 'Watch a movie.',
-** Processing line: ~            decision: :movie~
+    end
+** Processing line: ~  end~
 - Inside source: true
 *** True Line Result
-            decision: :movie
-** Processing line: ~          },~
+  end
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-          },
-** Processing line: ~          option_three: {~
+
+** Processing line: ~  def adornments_alpha args, target_alpha = nil, minimum_alpha = nil~
 - Inside source: true
 *** True Line Result
-          option_three: {
-** Processing line: ~            description: 'Go outside.',~
+  def adornments_alpha args, target_alpha = nil, minimum_alpha = nil
+** Processing line: ~    return (minimum_alpha || 80) unless args.state.storyline_queue_empty_at~
 - Inside source: true
 *** True Line Result
-            description: 'Go outside.',
-** Processing line: ~            decision: :go_outside~
+    return (minimum_alpha || 80) unless args.state.storyline_queue_empty_at
+** Processing line: ~    target_alpha ||= 255~
 - Inside source: true
 *** True Line Result
-            decision: :go_outside
-** Processing line: ~          },~
+    target_alpha ||= 255
+** Processing line: ~    target_alpha * args.state.storyline_queue_empty_at.ease(60)~
 - Inside source: true
 *** True Line Result
-          },
-** Processing line: ~          option_four: {~
+    target_alpha * args.state.storyline_queue_empty_at.ease(60)
+** Processing line: ~  end~
 - Inside source: true
 *** True Line Result
-          option_four: {
-** Processing line: ~            description: 'Get a snack.',~
+  end
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-            description: 'Get a snack.',
-** Processing line: ~            decision: :get_a_snack~
+
+** Processing line: ~  def hotspot_square args, x, y, w, h~
 - Inside source: true
 *** True Line Result
-            decision: :get_a_snack
-** Processing line: ~          }~
+  def hotspot_square args, x, y, w, h
+** Processing line: ~    if w >= 3 && h >= 3~
 - Inside source: true
 *** True Line Result
-          }
-** Processing line: ~        },~
+    if w >= 3 && h >= 3
+** Processing line: ~      [~
 - Inside source: true
 *** True Line Result
-        },
-** Processing line: ~        nap: {~
+      [
+** Processing line: ~        [x + w.idiv(2) + 1, y, w.idiv(2), h, 'sprites/label-background.png', 0, adornments_alpha(args, 50), 23, 23, 23],~
 - Inside source: true
 *** True Line Result
-        nap: {
-** Processing line: ~          description: 'You took a nap. The end.',~
+        [x + w.idiv(2) + 1, y, w.idiv(2), h, 'sprites/label-background.png', 0, adornments_alpha(args, 50), 23, 23, 23],
+** Processing line: ~        [x, y, w.idiv(2), h, 'sprites/label-background.png', 0, adornments_alpha(args, 100), 223, 223, 223],~
 - Inside source: true
 *** True Line Result
-          description: 'You took a nap. The end.',
-** Processing line: ~          option_one: {~
+        [x, y, w.idiv(2), h, 'sprites/label-background.png', 0, adornments_alpha(args, 100), 223, 223, 223],
+** Processing line: ~        [x + 1, y + 1, w - 2, h - 2, 'sprites/label-background.png', 0, adornments_alpha(args, 200), 40, 140, 40],~
 - Inside source: true
 *** True Line Result
-          option_one: {
-** Processing line: ~            description: 'Start over.',~
+        [x + 1, y + 1, w - 2, h - 2, 'sprites/label-background.png', 0, adornments_alpha(args, 200), 40, 140, 40],
+** Processing line: ~      ]~
 - Inside source: true
 *** True Line Result
-            description: 'Start over.',
-** Processing line: ~            decision: :stormy_night~
+      ]
+** Processing line: ~    else~
 - Inside source: true
 *** True Line Result
-            decision: :stormy_night
-** Processing line: ~          }~
+    else
+** Processing line: ~      [~
 - Inside source: true
 *** True Line Result
-          }
-** Processing line: ~        }~
+      [
+** Processing line: ~        [x, y, w, h, 'sprites/label-background.png', 0, adornments_alpha(args, 200), 0, 140, 0],~
 - Inside source: true
 *** True Line Result
-        }
-** Processing line: ~      }~
+        [x, y, w, h, 'sprites/label-background.png', 0, adornments_alpha(args, 200), 0, 140, 0],
+** Processing line: ~      ]~
 - Inside source: true
 *** True Line Result
-      }
-** Processing line: ~    }~
+      ]
+** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
-    }
+    end
 ** Processing line: ~  end~
 - Inside source: true
 *** True Line Result
@@ -134019,242 +139559,274 @@ Follows is a source code listing for all files that have been open sourced. This
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~#+end_src~
-- Line was identified as the end of a code block.
+** Processing line: ~  def render_storyline_dialog args, lowrez_labels, lowrez_sprites~
+- Inside source: true
 *** True Line Result
-#+end_src
-** Processing line: ~~
-- End of paragraph detected.
+  def render_storyline_dialog args, lowrez_labels, lowrez_sprites
+** Processing line: ~    return unless args.state.is_storyline_dialog_active~
+- Inside source: true
 *** True Line Result
-
-** Processing line: ~*** Rpg Narrative - Choose Your Own Adventure - main.rb~
-- Header detected.
+    return unless args.state.is_storyline_dialog_active
+** Processing line: ~    return unless args.state.storyline_to_show~
+- Inside source: true
 *** True Line Result
-
+    return unless args.state.storyline_to_show
+** Processing line: ~    labels = labels_for_word args.state.storyline_to_show~
+- Inside source: true
 *** True Line Result
-*** Rpg Narrative - Choose Your Own Adventure - main.rb
-** Processing line: ~#+begin_src ruby~
-- Line was identified as the beginning of a code block.
+    labels = labels_for_word args.state.storyline_to_show
+** Processing line: ~    if true # high rez version~
+- Inside source: true
 *** True Line Result
-
+    if true # high rez version
+** Processing line: ~      scale = 8.88~
+- Inside source: true
 *** True Line Result
-#+begin_src ruby
-** Processing line: ~  # ./samples/99_genre_rpg_narrative/choose_your_own_adventure/app/main.rb~
+      scale = 8.88
+** Processing line: ~      offset = 45~
 - Inside source: true
 *** True Line Result
-  # ./samples/99_genre_rpg_narrative/choose_your_own_adventure/app/main.rb
-** Processing line: ~  =begin~
+      offset = 45
+** Processing line: ~      size = 25~
 - Inside source: true
 *** True Line Result
-  =begin
-** Processing line: ~~
+      size = 25
+** Processing line: ~      args.outputs.labels << [offset + labels[:left].x.-(1) * scale,~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~   Reminders:~
+      args.outputs.labels << [offset + labels[:left].x.-(1) * scale,
+** Processing line: ~                              labels[:left].y * TINY_SCALE + 55,~
 - Inside source: true
 *** True Line Result
-   Reminders:
-** Processing line: ~~
+                              labels[:left].y * TINY_SCALE + 55,
+** Processing line: ~                              labels[:left].text, size, 0, 0, 0, 0, 255,~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~   - Hashes: Collection of unique keys and their corresponding values. The values can be found~
+                              labels[:left].text, size, 0, 0, 0, 0, 255,
+** Processing line: ~                              'fonts/manaspc.ttf']~
 - Inside source: true
 *** True Line Result
-   - Hashes: Collection of unique keys and their corresponding values. The values can be found
-** Processing line: ~     using their keys.~
+                              'fonts/manaspc.ttf']
+** Processing line: ~      center_text = labels[:center].text~
 - Inside source: true
 *** True Line Result
-     using their keys.
-** Processing line: ~~
+      center_text = labels[:center].text
+** Processing line: ~      center_text = "|" if center_text == "$"~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~     In this sample app, the decisions needed for the game are stored in a hash. In fact, the~
+      center_text = "|" if center_text == "$"
+** Processing line: ~      args.outputs.labels << [offset + labels[:center].x * scale,~
 - Inside source: true
 *** True Line Result
-     In this sample app, the decisions needed for the game are stored in a hash. In fact, the
-** Processing line: ~     decision.rb file contains hashes inside of other hashes!~
+      args.outputs.labels << [offset + labels[:center].x * scale,
+** Processing line: ~                              labels[:center].y * TINY_SCALE + 55,~
 - Inside source: true
 *** True Line Result
-     decision.rb file contains hashes inside of other hashes!
-** Processing line: ~~
+                              labels[:center].y * TINY_SCALE + 55,
+** Processing line: ~                              center_text, size, 0, 255, 0, 0, 255,~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~     Each option is a key in the first hash, but also contains a hash (description and~
+                              center_text, size, 0, 255, 0, 0, 255,
+** Processing line: ~                              'fonts/manaspc.ttf']~
 - Inside source: true
 *** True Line Result
-     Each option is a key in the first hash, but also contains a hash (description and
-** Processing line: ~     decision being its keys) as its value.~
+                              'fonts/manaspc.ttf']
+** Processing line: ~      args.outputs.labels << [offset + labels[:right].x * scale,~
 - Inside source: true
 *** True Line Result
-     decision being its keys) as its value.
-** Processing line: ~     Go into the decision.rb file and take a look before diving into the code below.~
+      args.outputs.labels << [offset + labels[:right].x * scale,
+** Processing line: ~                              labels[:right].y * TINY_SCALE + 55,~
 - Inside source: true
 *** True Line Result
-     Go into the decision.rb file and take a look before diving into the code below.
-** Processing line: ~~
+                              labels[:right].y * TINY_SCALE + 55,
+** Processing line: ~                              labels[:right].text, size, 0, 0, 0, 0, 255,~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~   - args.outputs.labels: An array. The values generate a label.~
+                              labels[:right].text, size, 0, 0, 0, 0, 255,
+** Processing line: ~                              'fonts/manaspc.ttf']~
 - Inside source: true
 *** True Line Result
-   - args.outputs.labels: An array. The values generate a label.
-** Processing line: ~     The parameters are [X, Y, TEXT, SIZE, ALIGNMENT, RED, GREEN, BLUE, ALPHA, FONT STYLE]~
+                              'fonts/manaspc.ttf']
+** Processing line: ~    else~
 - Inside source: true
 *** True Line Result
-     The parameters are [X, Y, TEXT, SIZE, ALIGNMENT, RED, GREEN, BLUE, ALPHA, FONT STYLE]
-** Processing line: ~     For more information about labels, go to mygame/documentation/02-labels.md.~
+    else
+** Processing line: ~      lowrez_labels << labels[:left]~
 - Inside source: true
 *** True Line Result
-     For more information about labels, go to mygame/documentation/02-labels.md.
-** Processing line: ~~
+      lowrez_labels << labels[:left]
+** Processing line: ~      lowrez_labels << labels[:center]~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~   - args.keyboard.key_down.KEY: Determines if a key is in the down state or pressed down.~
+      lowrez_labels << labels[:center]
+** Processing line: ~      lowrez_labels << labels[:right]~
 - Inside source: true
 *** True Line Result
-   - args.keyboard.key_down.KEY: Determines if a key is in the down state or pressed down.
-** Processing line: ~     For more information about the keyboard, go to mygame/documentation/06-keyboard.md.~
+      lowrez_labels << labels[:right]
+** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
-     For more information about the keyboard, go to mygame/documentation/06-keyboard.md.
-** Processing line: ~~
+    end
+** Processing line: ~    args.state.is_storyline_dialog_active = true~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~   - String interpolation: uses #{} syntax; everything between the #{ and the } is evaluated~
+    args.state.is_storyline_dialog_active = true
+** Processing line: ~    render_player args, lowrez_sprites~
 - Inside source: true
 *** True Line Result
-   - String interpolation: uses #{} syntax; everything between the #{ and the } is evaluated
-** Processing line: ~     as Ruby code, and the placeholder is replaced with its corresponding value or result.~
+    render_player args, lowrez_sprites
+** Processing line: ~    lowrez_sprites <<  [0, 0, 64, 8, 'sprites/label-background.png']~
 - Inside source: true
 *** True Line Result
-     as Ruby code, and the placeholder is replaced with its corresponding value or result.
+    lowrez_sprites <<  [0, 0, 64, 8, 'sprites/label-background.png']
+** Processing line: ~  end~
+- Inside source: true
+*** True Line Result
+  end
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~  =end~
+** Processing line: ~  def render_player args, lowrez_sprites~
 - Inside source: true
 *** True Line Result
-  =end
+  def render_player args, lowrez_sprites
+** Processing line: ~    lowrez_sprites << player_md_down(args, *args.state.player)~
+- Inside source: true
+*** True Line Result
+    lowrez_sprites << player_md_down(args, *args.state.player)
+** Processing line: ~  end~
+- Inside source: true
+*** True Line Result
+  end
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~  # This sample app provides users with a story and multiple decisions that they can choose to make.~
+** Processing line: ~  def render_adornments args, lowrez_sprites~
 - Inside source: true
 *** True Line Result
-  # This sample app provides users with a story and multiple decisions that they can choose to make.
-** Processing line: ~  # Users can make a decision using their keyboard, and the story will move forward based on user choices.~
+  def render_adornments args, lowrez_sprites
+** Processing line: ~    render_scenes args, lowrez_sprites~
 - Inside source: true
 *** True Line Result
-  # Users can make a decision using their keyboard, and the story will move forward based on user choices.
-** Processing line: ~~
+    render_scenes args, lowrez_sprites
+** Processing line: ~    render_storylines args, lowrez_sprites~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~  # The decisions available to users are stored in the decision.rb file.~
+    render_storylines args, lowrez_sprites
+** Processing line: ~    return if args.state.is_storyline_dialog_active~
 - Inside source: true
 *** True Line Result
-  # The decisions available to users are stored in the decision.rb file.
-** Processing line: ~  # We must have access to it for the game to function properly.~
+    return if args.state.is_storyline_dialog_active
+** Processing line: ~    lowrez_sprites << player_md_down(args, *args.state.player)~
 - Inside source: true
 *** True Line Result
-  # We must have access to it for the game to function properly.
-** Processing line: ~  GAME_FILE = 'app/decision.rb' # found in app folder~
+    lowrez_sprites << player_md_down(args, *args.state.player)
+** Processing line: ~  end~
 - Inside source: true
 *** True Line Result
-  GAME_FILE = 'app/decision.rb' # found in app folder
+  end
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~  require GAME_FILE # require used to load another file, import class/method definitions~
+** Processing line: ~  def global_alpha_percentage args, max_alpha = 255~
 - Inside source: true
 *** True Line Result
-  require GAME_FILE # require used to load another file, import class/method definitions
-** Processing line: ~~
+  def global_alpha_percentage args, max_alpha = 255
+** Processing line: ~    return 255 unless args.state.scene_changed_at~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~  # Instructions are given using labels to users if they have not yet set up their story in the decision.rb file.~
+    return 255 unless args.state.scene_changed_at
+** Processing line: ~    return 255 unless args.state.scene_fade~
 - Inside source: true
 *** True Line Result
-  # Instructions are given using labels to users if they have not yet set up their story in the decision.rb file.
-** Processing line: ~  # Otherwise, the game is run.~
+    return 255 unless args.state.scene_fade
+** Processing line: ~    return 255 unless args.state.scene_fade > 0~
 - Inside source: true
 *** True Line Result
-  # Otherwise, the game is run.
-** Processing line: ~  def tick args~
+    return 255 unless args.state.scene_fade > 0
+** Processing line: ~    return max_alpha * args.state.scene_changed_at.ease(args.state.scene_fade)~
 - Inside source: true
 *** True Line Result
-  def tick args
-** Processing line: ~    if !args.state.loaded && !respond_to?(:game) # if game is not loaded and not responding to game symbol's method~
+    return max_alpha * args.state.scene_changed_at.ease(args.state.scene_fade)
+** Processing line: ~  end~
 - Inside source: true
 *** True Line Result
-    if !args.state.loaded && !respond_to?(:game) # if game is not loaded and not responding to game symbol's method
-** Processing line: ~      args.labels << [640, 370, 'Hey there! Welcome to Four Decisions.', 0, 1] # a welcome label is shown~
+  end
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-      args.labels << [640, 370, 'Hey there! Welcome to Four Decisions.', 0, 1] # a welcome label is shown
-** Processing line: ~      args.labels << [640, 340, 'Go to the file called decision.rb and tell me your story.', 0, 1]~
+
+** Processing line: ~  def render_current_scene args, lowrez_sprites, lowrez_labels, lowrez_solids~
 - Inside source: true
 *** True Line Result
-      args.labels << [640, 340, 'Go to the file called decision.rb and tell me your story.', 0, 1]
-** Processing line: ~    elsif respond_to?(:game) # otherwise, if responds to game~
+  def render_current_scene args, lowrez_sprites, lowrez_labels, lowrez_solids
+** Processing line: ~    lowrez_sprites << [0, 0, 64, 64, args.state.background, 0, (global_alpha_percentage args)]~
 - Inside source: true
 *** True Line Result
-    elsif respond_to?(:game) # otherwise, if responds to game
-** Processing line: ~      args.state.loaded = true~
+    lowrez_sprites << [0, 0, 64, 64, args.state.background, 0, (global_alpha_percentage args)]
+** Processing line: ~    if args.state.scene_render_override~
 - Inside source: true
 *** True Line Result
-      args.state.loaded = true
-** Processing line: ~      tick_game args # calls tick_game method, runs game~
+    if args.state.scene_render_override
+** Processing line: ~      send args.state.scene_render_override, args, lowrez_sprites, lowrez_labels, lowrez_solids~
 - Inside source: true
 *** True Line Result
-      tick_game args # calls tick_game method, runs game
+      send args.state.scene_render_override, args, lowrez_sprites, lowrez_labels, lowrez_solids
 ** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
     end
+** Processing line: ~    storyline_to_show = args.state.storyline_to_show || ""~
+- Inside source: true
+*** True Line Result
+    storyline_to_show = args.state.storyline_to_show || ""
+** Processing line: ~    render_adornments args, lowrez_sprites~
+- Inside source: true
+*** True Line Result
+    render_adornments args, lowrez_sprites
+** Processing line: ~    render_storyline_dialog args, lowrez_labels, lowrez_sprites~
+- Inside source: true
+*** True Line Result
+    render_storyline_dialog args, lowrez_labels, lowrez_sprites
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~    if args.state.tick_count.mod_zero? 60 # update every 60 frames~
+** Processing line: ~    if args.state.background == 'sprites/tribute-game-over.png'~
 - Inside source: true
 *** True Line Result
-    if args.state.tick_count.mod_zero? 60 # update every 60 frames
-** Processing line: ~      t = args.gtk.ffi_file.mtime GAME_FILE # mtime returns modification time for named file~
+    if args.state.background == 'sprites/tribute-game-over.png'
+** Processing line: ~      lowrez_sprites << [0, 0, 64, 11, 'sprites/label-background.png', 0, adornments_alpha(args, 200), 0, 0, 0]~
 - Inside source: true
 *** True Line Result
-      t = args.gtk.ffi_file.mtime GAME_FILE # mtime returns modification time for named file
-** Processing line: ~      if t != args.state.mtime~
+      lowrez_sprites << [0, 0, 64, 11, 'sprites/label-background.png', 0, adornments_alpha(args, 200), 0, 0, 0]
+** Processing line: ~      lowrez_labels << [9, 6, 'Return of', 255, 255, 255]~
 - Inside source: true
 *** True Line Result
-      if t != args.state.mtime
-** Processing line: ~        args.state.mtime = t~
+      lowrez_labels << [9, 6, 'Return of', 255, 255, 255]
+** Processing line: ~      lowrez_labels << [9, 1, ' Serenity', 255, 255, 255]~
 - Inside source: true
 *** True Line Result
-        args.state.mtime = t
-** Processing line: ~        require GAME_FILE # require used to load file~
+      lowrez_labels << [9, 1, ' Serenity', 255, 255, 255]
+** Processing line: ~      if !args.state.ended~
 - Inside source: true
 *** True Line Result
-        require GAME_FILE # require used to load file
-** Processing line: ~        args.state.game_definition = nil # game definition and decision are empty~
+      if !args.state.ended
+** Processing line: ~        args.gtk.stop_music~
 - Inside source: true
 *** True Line Result
-        args.state.game_definition = nil # game definition and decision are empty
-** Processing line: ~        args.state.decision_id = nil~
+        args.gtk.stop_music
+** Processing line: ~        args.outputs.sounds << 'sounds/music-loop.ogg'~
 - Inside source: true
 *** True Line Result
-        args.state.decision_id = nil
+        args.outputs.sounds << 'sounds/music-loop.ogg'
+** Processing line: ~        args.state.ended = true~
+- Inside source: true
+*** True Line Result
+        args.state.ended = true
 ** Processing line: ~      end~
 - Inside source: true
 *** True Line Result
@@ -134271,34 +139843,30 @@ Follows is a source code listing for all files that have been open sourced. This
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~  # Runs methods needed for game to function properly~
-- Inside source: true
-*** True Line Result
-  # Runs methods needed for game to function properly
-** Processing line: ~  # Creates a rectangular border around the screen~
+** Processing line: ~  def player_md_right args, x, y~
 - Inside source: true
 *** True Line Result
-  # Creates a rectangular border around the screen
-** Processing line: ~  def tick_game args~
+  def player_md_right args, x, y
+** Processing line: ~    [x, y, 4, 11, 'sprites/player-right.png', 0, (global_alpha_percentage args)]~
 - Inside source: true
 *** True Line Result
-  def tick_game args
-** Processing line: ~    defaults args~
+    [x, y, 4, 11, 'sprites/player-right.png', 0, (global_alpha_percentage args)]
+** Processing line: ~  end~
 - Inside source: true
 *** True Line Result
-    defaults args
-** Processing line: ~    args.borders << args.grid.rect~
+  end
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-    args.borders << args.grid.rect
-** Processing line: ~    render_decision args~
+
+** Processing line: ~  def player_md_left args, x, y~
 - Inside source: true
 *** True Line Result
-    render_decision args
-** Processing line: ~    process_inputs args~
+  def player_md_left args, x, y
+** Processing line: ~    [x, y, 4, 11, 'sprites/player-left.png', 0, (global_alpha_percentage args)]~
 - Inside source: true
 *** True Line Result
-    process_inputs args
+    [x, y, 4, 11, 'sprites/player-left.png', 0, (global_alpha_percentage args)]
 ** Processing line: ~  end~
 - Inside source: true
 *** True Line Result
@@ -134307,26 +139875,30 @@ Follows is a source code listing for all files that have been open sourced. This
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~  # Sets default values and uses decision.rb file to define game and decision_id~
+** Processing line: ~  def player_md_up args, x, y~
 - Inside source: true
 *** True Line Result
-  # Sets default values and uses decision.rb file to define game and decision_id
-** Processing line: ~  # variable using the starting decision~
+  def player_md_up args, x, y
+** Processing line: ~    [x, y, 4, 11, 'sprites/player-up.png', 0, (global_alpha_percentage args)]~
 - Inside source: true
 *** True Line Result
-  # variable using the starting decision
-** Processing line: ~  def defaults args~
+    [x, y, 4, 11, 'sprites/player-up.png', 0, (global_alpha_percentage args)]
+** Processing line: ~  end~
 - Inside source: true
 *** True Line Result
-  def defaults args
-** Processing line: ~    args.state.game_definition ||= game~
+  end
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-    args.state.game_definition ||= game
-** Processing line: ~    args.state.decision_id ||= args.state.game_definition[:starting_decision]~
+
+** Processing line: ~  def player_md_down args, x, y~
 - Inside source: true
 *** True Line Result
-    args.state.decision_id ||= args.state.game_definition[:starting_decision]
+  def player_md_down args, x, y
+** Processing line: ~    [x, y, 4, 11, 'sprites/player-down.png', 0, (global_alpha_percentage args)]~
+- Inside source: true
+*** True Line Result
+    [x, y, 4, 11, 'sprites/player-down.png', 0, (global_alpha_percentage args)]
 ** Processing line: ~  end~
 - Inside source: true
 *** True Line Result
@@ -134335,118 +139907,158 @@ Follows is a source code listing for all files that have been open sourced. This
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~  # Outputs the possible decision descriptions the user can choose onto the screen~
+** Processing line: ~  def player_sm args, x, y~
 - Inside source: true
 *** True Line Result
-  # Outputs the possible decision descriptions the user can choose onto the screen
-** Processing line: ~  # as well as what key to press on their keyboard to make their decision~
+  def player_sm args, x, y
+** Processing line: ~    [x, y, 3, 7, 'sprites/player-zoomed-out.png', 0, (global_alpha_percentage args)]~
 - Inside source: true
 *** True Line Result
-  # as well as what key to press on their keyboard to make their decision
-** Processing line: ~  def render_decision args~
+    [x, y, 3, 7, 'sprites/player-zoomed-out.png', 0, (global_alpha_percentage args)]
+** Processing line: ~  end~
 - Inside source: true
 *** True Line Result
-  def render_decision args
-** Processing line: ~    decision = current_decision args~
+  end
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-    decision = current_decision args
-** Processing line: ~    # text is either the value of decision's description key or warning that no description exists~
+
+** Processing line: ~  def player_xs args, x, y~
 - Inside source: true
 *** True Line Result
-    # text is either the value of decision's description key or warning that no description exists
-** Processing line: ~    args.labels << [640, 360, decision[:description] || "No definition found for #{args.state.decision_id}. Please update decision.rb.", 0, 1] # uses string interpolation~
+  def player_xs args, x, y
+** Processing line: ~    [x, y, 1, 4, 'sprites/player-zoomed-out.png', 0, (global_alpha_percentage args)]~
 - Inside source: true
 *** True Line Result
-    args.labels << [640, 360, decision[:description] || "No definition found for #{args.state.decision_id}. Please update decision.rb.", 0, 1] # uses string interpolation
+    [x, y, 1, 4, 'sprites/player-zoomed-out.png', 0, (global_alpha_percentage args)]
+** Processing line: ~  end~
+- Inside source: true
+*** True Line Result
+  end
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~    # All decisions are stored in a hash~
+** Processing line: ~#+end_src~
+- Line was identified as the end of a code block.
+*** True Line Result
+#+end_src
+** Processing line: ~~
+- End of paragraph detected.
+*** True Line Result
+
+** Processing line: ~*** Rpg Narrative - Return Of Serenity - require.rb~
+- Header detected.
+*** True Line Result
+
+*** True Line Result
+*** Rpg Narrative - Return Of Serenity - require.rb
+** Processing line: ~#+begin_src ruby~
+- Line was identified as the beginning of a code block.
+*** True Line Result
+
+*** True Line Result
+#+begin_src ruby
+** Processing line: ~  # ./samples/99_genre_rpg_narrative/return_of_serenity/app/require.rb~
 - Inside source: true
 *** True Line Result
-    # All decisions are stored in a hash
-** Processing line: ~    # The descriptions output onto the screen are the values for the description keys of the hash.~
+  # ./samples/99_genre_rpg_narrative/return_of_serenity/app/require.rb
+** Processing line: ~  require 'app/lowrez_simulator.rb'~
 - Inside source: true
 *** True Line Result
-    # The descriptions output onto the screen are the values for the description keys of the hash.
-** Processing line: ~    if decision[:option_one]~
+  require 'app/lowrez_simulator.rb'
+** Processing line: ~  require 'app/storyline_day_one.rb'~
 - Inside source: true
 *** True Line Result
-    if decision[:option_one]
-** Processing line: ~      args.labels << [10, 360, decision[:option_one][:description], 0, 0] # option one's description label~
+  require 'app/storyline_day_one.rb'
+** Processing line: ~  require 'app/storyline_blinking_light.rb'~
 - Inside source: true
 *** True Line Result
-      args.labels << [10, 360, decision[:option_one][:description], 0, 0] # option one's description label
-** Processing line: ~      args.labels << [10, 335, "(Press 'left' on the keyboard to select this decision)", -5, 0] # label of what key to press to select the decision~
+  require 'app/storyline_blinking_light.rb'
+** Processing line: ~  require 'app/storyline_serenity_introduction.rb'~
 - Inside source: true
 *** True Line Result
-      args.labels << [10, 335, "(Press 'left' on the keyboard to select this decision)", -5, 0] # label of what key to press to select the decision
-** Processing line: ~    end~
+  require 'app/storyline_serenity_introduction.rb'
+** Processing line: ~  require 'app/storyline_speed_of_light.rb'~
 - Inside source: true
 *** True Line Result
-    end
-** Processing line: ~~
+  require 'app/storyline_speed_of_light.rb'
+** Processing line: ~  require 'app/storyline_serenity_alive.rb'~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~    if decision[:option_two]~
+  require 'app/storyline_serenity_alive.rb'
+** Processing line: ~  require 'app/storyline_serenity_bio.rb'~
 - Inside source: true
 *** True Line Result
-    if decision[:option_two]
-** Processing line: ~      args.labels << [1270, 360, decision[:option_two][:description], 0, 2] # option two's description~
+  require 'app/storyline_serenity_bio.rb'
+** Processing line: ~  require 'app/storyline_anka.rb'~
 - Inside source: true
 *** True Line Result
-      args.labels << [1270, 360, decision[:option_two][:description], 0, 2] # option two's description
-** Processing line: ~      args.labels << [1270, 335, "(Press 'right' on the keyboard to select this decision)", -5, 2]~
+  require 'app/storyline_anka.rb'
+** Processing line: ~  require 'app/storyline_final_message.rb'~
 - Inside source: true
 *** True Line Result
-      args.labels << [1270, 335, "(Press 'right' on the keyboard to select this decision)", -5, 2]
-** Processing line: ~    end~
+  require 'app/storyline_final_message.rb'
+** Processing line: ~  require 'app/storyline_final_decision.rb'~
 - Inside source: true
 *** True Line Result
-    end
+  require 'app/storyline_final_decision.rb'
+** Processing line: ~  require 'app/storyline.rb'~
+- Inside source: true
+*** True Line Result
+  require 'app/storyline.rb'
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~    if decision[:option_three]~
-- Inside source: true
+** Processing line: ~#+end_src~
+- Line was identified as the end of a code block.
 *** True Line Result
-    if decision[:option_three]
-** Processing line: ~      args.labels << [640, 45, decision[:option_three][:description], 0, 1] # option three's description~
-- Inside source: true
+#+end_src
+** Processing line: ~~
+- End of paragraph detected.
 *** True Line Result
-      args.labels << [640, 45, decision[:option_three][:description], 0, 1] # option three's description
-** Processing line: ~      args.labels << [640, 20, "(Press 'down' on the keyboard to select this decision)", -5, 1]~
+
+** Processing line: ~*** Rpg Narrative - Return Of Serenity - storyline.rb~
+- Header detected.
+*** True Line Result
+
+*** True Line Result
+*** Rpg Narrative - Return Of Serenity - storyline.rb
+** Processing line: ~#+begin_src ruby~
+- Line was identified as the beginning of a code block.
+*** True Line Result
+
+*** True Line Result
+#+begin_src ruby
+** Processing line: ~  # ./samples/99_genre_rpg_narrative/return_of_serenity/app/storyline.rb~
 - Inside source: true
 *** True Line Result
-      args.labels << [640, 20, "(Press 'down' on the keyboard to select this decision)", -5, 1]
-** Processing line: ~    end~
+  # ./samples/99_genre_rpg_narrative/return_of_serenity/app/storyline.rb
+** Processing line: ~  def hotspot_top~
 - Inside source: true
 *** True Line Result
-    end
-** Processing line: ~~
+  def hotspot_top
+** Processing line: ~    [4, 61, 56, 3]~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~    if decision[:option_four]~
+    [4, 61, 56, 3]
+** Processing line: ~  end~
 - Inside source: true
 *** True Line Result
-    if decision[:option_four]
-** Processing line: ~      args.labels << [640, 700, decision[:option_four][:description], 0, 1] # option four's description~
+  end
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-      args.labels << [640, 700, decision[:option_four][:description], 0, 1] # option four's description
-** Processing line: ~      args.labels << [640, 675, "(Press 'up' on the keyboard to select this decision)", -5, 1]~
+
+** Processing line: ~  def hotspot_bottom~
 - Inside source: true
 *** True Line Result
-      args.labels << [640, 675, "(Press 'up' on the keyboard to select this decision)", -5, 1]
-** Processing line: ~    end~
+  def hotspot_bottom
+** Processing line: ~    [4, 0, 56, 3]~
 - Inside source: true
 *** True Line Result
-    end
+    [4, 0, 56, 3]
 ** Processing line: ~  end~
 - Inside source: true
 *** True Line Result
@@ -134455,86 +140067,94 @@ Follows is a source code listing for all files that have been open sourced. This
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~  # Uses keyboard input from the user to make a decision~
-- Inside source: true
-*** True Line Result
-  # Uses keyboard input from the user to make a decision
-** Processing line: ~  # Assigns the decision as the value of the decision_id variable~
+** Processing line: ~  def hotspot_top_right~
 - Inside source: true
 *** True Line Result
-  # Assigns the decision as the value of the decision_id variable
-** Processing line: ~  def process_inputs args~
+  def hotspot_top_right
+** Processing line: ~    [62, 35, 3, 25]~
 - Inside source: true
 *** True Line Result
-  def process_inputs args
-** Processing line: ~    decision = current_decision args # calls current_decision method~
+    [62, 35, 3, 25]
+** Processing line: ~  end~
 - Inside source: true
 *** True Line Result
-    decision = current_decision args # calls current_decision method
+  end
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~    if args.keyboard.key_down.left! && decision[:option_one] # if left key pressed and option one exists~
+** Processing line: ~  def hotspot_bottom_right~
 - Inside source: true
 *** True Line Result
-    if args.keyboard.key_down.left! && decision[:option_one] # if left key pressed and option one exists
-** Processing line: ~      args.state.decision_id = decision[:option_one][:decision] # value of option one's decision hash key is set to decision_id~
+  def hotspot_bottom_right
+** Processing line: ~    [62, 0, 3, 25]~
 - Inside source: true
 *** True Line Result
-      args.state.decision_id = decision[:option_one][:decision] # value of option one's decision hash key is set to decision_id
-** Processing line: ~    end~
+    [62, 0, 3, 25]
+** Processing line: ~  end~
 - Inside source: true
 *** True Line Result
-    end
+  end
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~    if args.keyboard.key_down.right! && decision[:option_two] # if right key pressed and option two exists~
+** Processing line: ~  def storyline_history_include? args, text~
 - Inside source: true
 *** True Line Result
-    if args.keyboard.key_down.right! && decision[:option_two] # if right key pressed and option two exists
-** Processing line: ~      args.state.decision_id = decision[:option_two][:decision] # value of option two's decision hash key is set to decision_id~
+  def storyline_history_include? args, text
+** Processing line: ~    args.state.storyline_history.any? { |s| s.gsub("-", "").gsub(" ", "").include? text.gsub("-", "").gsub(" ", "") }~
 - Inside source: true
 *** True Line Result
-      args.state.decision_id = decision[:option_two][:decision] # value of option two's decision hash key is set to decision_id
-** Processing line: ~    end~
+    args.state.storyline_history.any? { |s| s.gsub("-", "").gsub(" ", "").include? text.gsub("-", "").gsub(" ", "") }
+** Processing line: ~  end~
 - Inside source: true
 *** True Line Result
-    end
+  end
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~    if args.keyboard.key_down.down! && decision[:option_three] # if down key pressed and option three exists~
+** Processing line: ~  def blinking_light_side_of_home_render args, lowrez_sprites, lowrez_labels, lowrez_solids~
 - Inside source: true
 *** True Line Result
-    if args.keyboard.key_down.down! && decision[:option_three] # if down key pressed and option three exists
-** Processing line: ~      args.state.decision_id = decision[:option_three][:decision] # value of option three's decision hash key is set to decision_id~
+  def blinking_light_side_of_home_render args, lowrez_sprites, lowrez_labels, lowrez_solids
+** Processing line: ~    lowrez_sprites << [48, 44, 5, 5, 'sprites/square.png', 0,  50 * (args.state.tick_count % 50).fdiv(50), 0, 255, 0]~
 - Inside source: true
 *** True Line Result
-      args.state.decision_id = decision[:option_three][:decision] # value of option three's decision hash key is set to decision_id
-** Processing line: ~    end~
+    lowrez_sprites << [48, 44, 5, 5, 'sprites/square.png', 0,  50 * (args.state.tick_count % 50).fdiv(50), 0, 255, 0]
+** Processing line: ~    lowrez_sprites << [49, 45, 3, 3, 'sprites/square.png', 0, 100 * (args.state.tick_count % 50).fdiv(50), 0, 255, 0]~
 - Inside source: true
 *** True Line Result
-    end
+    lowrez_sprites << [49, 45, 3, 3, 'sprites/square.png', 0, 100 * (args.state.tick_count % 50).fdiv(50), 0, 255, 0]
+** Processing line: ~    lowrez_sprites << [50, 46, 1, 1, 'sprites/square.png', 0, 255 * (args.state.tick_count % 50).fdiv(50), 0, 255, 0]~
+- Inside source: true
+*** True Line Result
+    lowrez_sprites << [50, 46, 1, 1, 'sprites/square.png', 0, 255 * (args.state.tick_count % 50).fdiv(50), 0, 255, 0]
+** Processing line: ~  end~
+- Inside source: true
+*** True Line Result
+  end
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~    if args.keyboard.key_down.up! && decision[:option_four] # if up key pressed and option four exists~
+** Processing line: ~  def blinking_light_mountain_pass_render args, lowrez_sprites, lowrez_labels, lowrez_solids~
 - Inside source: true
 *** True Line Result
-    if args.keyboard.key_down.up! && decision[:option_four] # if up key pressed and option four exists
-** Processing line: ~      args.state.decision_id = decision[:option_four][:decision] # value of option four's decision hash key is set to decision_id~
+  def blinking_light_mountain_pass_render args, lowrez_sprites, lowrez_labels, lowrez_solids
+** Processing line: ~    lowrez_sprites << [18, 47, 5, 5, 'sprites/square.png', 0,  50 * (args.state.tick_count % 50).fdiv(50), 0, 255, 0]~
 - Inside source: true
 *** True Line Result
-      args.state.decision_id = decision[:option_four][:decision] # value of option four's decision hash key is set to decision_id
-** Processing line: ~    end~
+    lowrez_sprites << [18, 47, 5, 5, 'sprites/square.png', 0,  50 * (args.state.tick_count % 50).fdiv(50), 0, 255, 0]
+** Processing line: ~    lowrez_sprites << [19, 48, 3, 3, 'sprites/square.png', 0, 100 * (args.state.tick_count % 50).fdiv(50), 0, 255, 0]~
 - Inside source: true
 *** True Line Result
-    end
+    lowrez_sprites << [19, 48, 3, 3, 'sprites/square.png', 0, 100 * (args.state.tick_count % 50).fdiv(50), 0, 255, 0]
+** Processing line: ~    lowrez_sprites << [20, 49, 1, 1, 'sprites/square.png', 0, 255 * (args.state.tick_count % 50).fdiv(50), 0, 255, 0]~
+- Inside source: true
+*** True Line Result
+    lowrez_sprites << [20, 49, 1, 1, 'sprites/square.png', 0, 255 * (args.state.tick_count % 50).fdiv(50), 0, 255, 0]
 ** Processing line: ~  end~
 - Inside source: true
 *** True Line Result
@@ -134543,18 +140163,22 @@ Follows is a source code listing for all files that have been open sourced. This
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~  # Uses decision_id's value to keep track of current decision being made~
+** Processing line: ~  def blinking_light_path_to_observatory_render args, lowrez_sprites, lowrez_labels, lowrez_solids~
 - Inside source: true
 *** True Line Result
-  # Uses decision_id's value to keep track of current decision being made
-** Processing line: ~  def current_decision args~
+  def blinking_light_path_to_observatory_render args, lowrez_sprites, lowrez_labels, lowrez_solids
+** Processing line: ~    lowrez_sprites << [0, 26, 5, 5, 'sprites/square.png', 0,  50 * (args.state.tick_count % 50).fdiv(50), 0, 255, 0]~
 - Inside source: true
 *** True Line Result
-  def current_decision args
-** Processing line: ~    args.state.game_definition[:decisions][args.state.decision_id] || {} # either has value or is empty~
+    lowrez_sprites << [0, 26, 5, 5, 'sprites/square.png', 0,  50 * (args.state.tick_count % 50).fdiv(50), 0, 255, 0]
+** Processing line: ~    lowrez_sprites << [1, 27, 3, 3, 'sprites/square.png', 0, 100 * (args.state.tick_count % 50).fdiv(50), 0, 255, 0]~
 - Inside source: true
 *** True Line Result
-    args.state.game_definition[:decisions][args.state.decision_id] || {} # either has value or is empty
+    lowrez_sprites << [1, 27, 3, 3, 'sprites/square.png', 0, 100 * (args.state.tick_count % 50).fdiv(50), 0, 255, 0]
+** Processing line: ~    lowrez_sprites << [2, 28, 1, 1, 'sprites/square.png', 0, 255 * (args.state.tick_count % 50).fdiv(50), 0, 255, 0]~
+- Inside source: true
+*** True Line Result
+    lowrez_sprites << [2, 28, 1, 1, 'sprites/square.png', 0, 255 * (args.state.tick_count % 50).fdiv(50), 0, 255, 0]
 ** Processing line: ~  end~
 - Inside source: true
 *** True Line Result
@@ -134563,326 +140187,354 @@ Follows is a source code listing for all files that have been open sourced. This
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~  # Resets the game.~
+** Processing line: ~  def blinking_light_observatory_render args, lowrez_sprites, lowrez_labels, lowrez_solids~
 - Inside source: true
 *** True Line Result
-  # Resets the game.
-** Processing line: ~  $gtk.reset~
+  def blinking_light_observatory_render args, lowrez_sprites, lowrez_labels, lowrez_solids
+** Processing line: ~    lowrez_sprites << [23, 59, 5, 5, 'sprites/square.png', 0,  50 * (args.state.tick_count % 50).fdiv(50), 0, 255, 0]~
 - Inside source: true
 *** True Line Result
-  $gtk.reset
-** Processing line: ~~
+    lowrez_sprites << [23, 59, 5, 5, 'sprites/square.png', 0,  50 * (args.state.tick_count % 50).fdiv(50), 0, 255, 0]
+** Processing line: ~    lowrez_sprites << [24, 60, 3, 3, 'sprites/square.png', 0, 100 * (args.state.tick_count % 50).fdiv(50), 0, 255, 0]~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~#+end_src~
-- Line was identified as the end of a code block.
+    lowrez_sprites << [24, 60, 3, 3, 'sprites/square.png', 0, 100 * (args.state.tick_count % 50).fdiv(50), 0, 255, 0]
+** Processing line: ~    lowrez_sprites << [25, 61, 1, 1, 'sprites/square.png', 0, 255 * (args.state.tick_count % 50).fdiv(50), 0, 255, 0]~
+- Inside source: true
 *** True Line Result
-#+end_src
+    lowrez_sprites << [25, 61, 1, 1, 'sprites/square.png', 0, 255 * (args.state.tick_count % 50).fdiv(50), 0, 255, 0]
+** Processing line: ~  end~
+- Inside source: true
+*** True Line Result
+  end
 ** Processing line: ~~
-- End of paragraph detected.
+- Inside source: true
 *** True Line Result
 
-** Processing line: ~*** Rpg Narrative - Return Of Serenity - lowrez_simulator.rb~
-- Header detected.
+** Processing line: ~  def blinking_light_inside_observatory_render args, lowrez_sprites, lowrez_labels, lowrez_solids~
+- Inside source: true
 *** True Line Result
-
+  def blinking_light_inside_observatory_render args, lowrez_sprites, lowrez_labels, lowrez_solids
+** Processing line: ~    lowrez_sprites << [30, 30, 5, 5, 'sprites/square.png', 0,  50 * (args.state.tick_count % 50).fdiv(50), 0, 255, 0]~
+- Inside source: true
 *** True Line Result
-*** Rpg Narrative - Return Of Serenity - lowrez_simulator.rb
-** Processing line: ~#+begin_src ruby~
-- Line was identified as the beginning of a code block.
+    lowrez_sprites << [30, 30, 5, 5, 'sprites/square.png', 0,  50 * (args.state.tick_count % 50).fdiv(50), 0, 255, 0]
+** Processing line: ~    lowrez_sprites << [31, 31, 3, 3, 'sprites/square.png', 0, 100 * (args.state.tick_count % 50).fdiv(50), 0, 255, 0]~
+- Inside source: true
 *** True Line Result
-
+    lowrez_sprites << [31, 31, 3, 3, 'sprites/square.png', 0, 100 * (args.state.tick_count % 50).fdiv(50), 0, 255, 0]
+** Processing line: ~    lowrez_sprites << [32, 32, 1, 1, 'sprites/square.png', 0, 255 * (args.state.tick_count % 50).fdiv(50), 0, 255, 0]~
+- Inside source: true
 *** True Line Result
-#+begin_src ruby
-** Processing line: ~  # ./samples/99_genre_rpg_narrative/return_of_serenity/app/lowrez_simulator.rb~
+    lowrez_sprites << [32, 32, 1, 1, 'sprites/square.png', 0, 255 * (args.state.tick_count % 50).fdiv(50), 0, 255, 0]
+** Processing line: ~  end~
+- Inside source: true
+*** True Line Result
+  end
+** Processing line: ~~
+- Inside source: true
+*** True Line Result
+
+** Processing line: ~  def decision_graph context_message, context_action, context_result_one, context_result_two, context_result_three = [], context_result_four = []~
 - Inside source: true
 *** True Line Result
-  # ./samples/99_genre_rpg_narrative/return_of_serenity/app/lowrez_simulator.rb
-** Processing line: ~  ###################################################################################~
+  def decision_graph context_message, context_action, context_result_one, context_result_two, context_result_three = [], context_result_four = []
+** Processing line: ~    result_one_scene, result_one_label, result_one_text = context_result_one~
 - Inside source: true
 *** True Line Result
-  ###################################################################################
-** Processing line: ~  # YOU CAN PLAY AROUND WITH THE CODE BELOW, BUT USE CAUTION AS THIS IS WHAT EMULATES~
+    result_one_scene, result_one_label, result_one_text = context_result_one
+** Processing line: ~    result_two_scene, result_two_label, result_two_text = context_result_two~
 - Inside source: true
 *** True Line Result
-  # YOU CAN PLAY AROUND WITH THE CODE BELOW, BUT USE CAUTION AS THIS IS WHAT EMULATES
-** Processing line: ~  # THE 64x64 CANVAS.~
+    result_two_scene, result_two_label, result_two_text = context_result_two
+** Processing line: ~    result_three_scene, result_three_label, result_three_text = context_result_three~
 - Inside source: true
 *** True Line Result
-  # THE 64x64 CANVAS.
-** Processing line: ~  ###################################################################################~
+    result_three_scene, result_three_label, result_three_text = context_result_three
+** Processing line: ~    result_four_scene, result_four_label, result_four_text = context_result_four~
 - Inside source: true
 *** True Line Result
-  ###################################################################################
+    result_four_scene, result_four_label, result_four_text = context_result_four
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~  TINY_RESOLUTION       = 64~
+** Processing line: ~    top_level_hash = {~
 - Inside source: true
 *** True Line Result
-  TINY_RESOLUTION       = 64
-** Processing line: ~  TINY_SCALE            = 720.fdiv(TINY_RESOLUTION + 5)~
+    top_level_hash = {
+** Processing line: ~      background: 'sprites/decision.png',~
 - Inside source: true
 *** True Line Result
-  TINY_SCALE            = 720.fdiv(TINY_RESOLUTION + 5)
-** Processing line: ~  CENTER_OFFSET         = 10~
+      background: 'sprites/decision.png',
+** Processing line: ~      fade: 60,~
 - Inside source: true
 *** True Line Result
-  CENTER_OFFSET         = 10
-** Processing line: ~  EMULATED_FONT_SIZE    = 20~
+      fade: 60,
+** Processing line: ~      player: [20, 36],~
 - Inside source: true
 *** True Line Result
-  EMULATED_FONT_SIZE    = 20
-** Processing line: ~  EMULATED_FONT_X_ZERO  = 0~
+      player: [20, 36],
+** Processing line: ~      storylines: [ ],~
 - Inside source: true
 *** True Line Result
-  EMULATED_FONT_X_ZERO  = 0
-** Processing line: ~  EMULATED_FONT_Y_ZERO  = 46~
+      storylines: [ ],
+** Processing line: ~      scenes: [ ]~
 - Inside source: true
 *** True Line Result
-  EMULATED_FONT_Y_ZERO  = 46
-** Processing line: ~~
+      scenes: [ ]
+** Processing line: ~    }~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~  def tick args~
+    }
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-  def tick args
-** Processing line: ~    sprites = []~
+
+** Processing line: ~    confirmation_result_one_hash = {~
 - Inside source: true
 *** True Line Result
-    sprites = []
-** Processing line: ~    labels = []~
+    confirmation_result_one_hash = {
+** Processing line: ~      background: 'sprites/decision.png',~
 - Inside source: true
 *** True Line Result
-    labels = []
-** Processing line: ~    borders = []~
+      background: 'sprites/decision.png',
+** Processing line: ~      scenes: [ ],~
 - Inside source: true
 *** True Line Result
-    borders = []
-** Processing line: ~    solids = []~
+      scenes: [ ],
+** Processing line: ~      storylines: [ ]~
 - Inside source: true
 *** True Line Result
-    solids = []
-** Processing line: ~    mouse = emulate_lowrez_mouse args~
+      storylines: [ ]
+** Processing line: ~    }~
 - Inside source: true
 *** True Line Result
-    mouse = emulate_lowrez_mouse args
-** Processing line: ~    args.state.show_gridlines = false~
+    }
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-    args.state.show_gridlines = false
-** Processing line: ~    lowrez_tick args, sprites, labels, borders, solids, mouse~
+
+** Processing line: ~    confirmation_result_two_hash = {~
 - Inside source: true
 *** True Line Result
-    lowrez_tick args, sprites, labels, borders, solids, mouse
-** Processing line: ~    render_gridlines_if_needed args~
+    confirmation_result_two_hash = {
+** Processing line: ~      background: 'sprites/decision.png',~
 - Inside source: true
 *** True Line Result
-    render_gridlines_if_needed args
-** Processing line: ~    render_mouse_crosshairs args, mouse~
+      background: 'sprites/decision.png',
+** Processing line: ~      scenes: [ ],~
 - Inside source: true
 *** True Line Result
-    render_mouse_crosshairs args, mouse
-** Processing line: ~    emulate_lowrez_scene args, sprites, labels, borders, solids, mouse~
+      scenes: [ ],
+** Processing line: ~      storylines: [ ]~
 - Inside source: true
 *** True Line Result
-    emulate_lowrez_scene args, sprites, labels, borders, solids, mouse
-** Processing line: ~  end~
+      storylines: [ ]
+** Processing line: ~    }~
 - Inside source: true
 *** True Line Result
-  end
+    }
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~  def emulate_lowrez_mouse args~
+** Processing line: ~    confirmation_result_three_hash = {~
 - Inside source: true
 *** True Line Result
-  def emulate_lowrez_mouse args
-** Processing line: ~    args.state.new_entity_strict(:lowrez_mouse) do |m|~
+    confirmation_result_three_hash = {
+** Processing line: ~      background: 'sprites/decision.png',~
 - Inside source: true
 *** True Line Result
-    args.state.new_entity_strict(:lowrez_mouse) do |m|
-** Processing line: ~      m.x = args.mouse.x.idiv(TINY_SCALE) - CENTER_OFFSET.idiv(TINY_SCALE) - 1~
+      background: 'sprites/decision.png',
+** Processing line: ~      scenes: [ ],~
 - Inside source: true
 *** True Line Result
-      m.x = args.mouse.x.idiv(TINY_SCALE) - CENTER_OFFSET.idiv(TINY_SCALE) - 1
-** Processing line: ~      m.y = args.mouse.y.idiv(TINY_SCALE)~
+      scenes: [ ],
+** Processing line: ~      storylines: [ ]~
 - Inside source: true
 *** True Line Result
-      m.y = args.mouse.y.idiv(TINY_SCALE)
-** Processing line: ~      if args.mouse.click~
+      storylines: [ ]
+** Processing line: ~    }~
 - Inside source: true
 *** True Line Result
-      if args.mouse.click
-** Processing line: ~        m.click = [~
+    }
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-        m.click = [
-** Processing line: ~          args.mouse.click.point.x.idiv(TINY_SCALE) - CENTER_OFFSET.idiv(TINY_SCALE) - 1,~
+
+** Processing line: ~    confirmation_result_four_hash = {~
 - Inside source: true
 *** True Line Result
-          args.mouse.click.point.x.idiv(TINY_SCALE) - CENTER_OFFSET.idiv(TINY_SCALE) - 1,
-** Processing line: ~          args.mouse.click.point.y.idiv(TINY_SCALE)~
+    confirmation_result_four_hash = {
+** Processing line: ~      background: 'sprites/decision.png',~
 - Inside source: true
 *** True Line Result
-          args.mouse.click.point.y.idiv(TINY_SCALE)
-** Processing line: ~        ]~
+      background: 'sprites/decision.png',
+** Processing line: ~      scenes: [ ],~
 - Inside source: true
 *** True Line Result
-        ]
-** Processing line: ~        m.down = m.click~
+      scenes: [ ],
+** Processing line: ~      storylines: [ ]~
 - Inside source: true
 *** True Line Result
-        m.down = m.click
-** Processing line: ~      else~
+      storylines: [ ]
+** Processing line: ~    }~
 - Inside source: true
 *** True Line Result
-      else
-** Processing line: ~        m.click = nil~
+    }
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-        m.click = nil
-** Processing line: ~        m.down = nil~
+
+** Processing line: ~    top_level_hash[:storylines] << [ 5, 35, 4, 4, context_message]~
 - Inside source: true
 *** True Line Result
-        m.down = nil
-** Processing line: ~      end~
+    top_level_hash[:storylines] << [ 5, 35, 4, 4, context_message]
+** Processing line: ~    top_level_hash[:storylines] << [20, 35, 4, 4, context_action]~
 - Inside source: true
 *** True Line Result
-      end
+    top_level_hash[:storylines] << [20, 35, 4, 4, context_action]
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~      if args.mouse.up~
+** Processing line: ~    confirmation_result_one_hash[:scenes]       << [20, 35, 4, 4, top_level_hash]~
 - Inside source: true
 *** True Line Result
-      if args.mouse.up
-** Processing line: ~        m.up = [~
+    confirmation_result_one_hash[:scenes]       << [20, 35, 4, 4, top_level_hash]
+** Processing line: ~    confirmation_result_one_hash[:scenes]       << [60, 50, 4, 4, result_one_scene]~
 - Inside source: true
 *** True Line Result
-        m.up = [
-** Processing line: ~          args.mouse.up.point.x.idiv(TINY_SCALE) - CENTER_OFFSET.idiv(TINY_SCALE) - 1,~
+    confirmation_result_one_hash[:scenes]       << [60, 50, 4, 4, result_one_scene]
+** Processing line: ~    confirmation_result_one_hash[:storylines]   << [40, 50, 4, 4, "#{result_one_label}: \"#{result_one_text}\""]~
 - Inside source: true
 *** True Line Result
-          args.mouse.up.point.x.idiv(TINY_SCALE) - CENTER_OFFSET.idiv(TINY_SCALE) - 1,
-** Processing line: ~          args.mouse.up.point.y.idiv(TINY_SCALE)~
+    confirmation_result_one_hash[:storylines]   << [40, 50, 4, 4, "#{result_one_label}: \"#{result_one_text}\""]
+** Processing line: ~    confirmation_result_one_hash[:scenes]       << [40, 40, 4, 4, confirmation_result_four_hash] if result_four_scene~
 - Inside source: true
 *** True Line Result
-          args.mouse.up.point.y.idiv(TINY_SCALE)
-** Processing line: ~        ]~
+    confirmation_result_one_hash[:scenes]       << [40, 40, 4, 4, confirmation_result_four_hash] if result_four_scene
+** Processing line: ~    confirmation_result_one_hash[:scenes]       << [40, 30, 4, 4, confirmation_result_three_hash] if result_three_scene~
 - Inside source: true
 *** True Line Result
-        ]
-** Processing line: ~      else~
+    confirmation_result_one_hash[:scenes]       << [40, 30, 4, 4, confirmation_result_three_hash] if result_three_scene
+** Processing line: ~    confirmation_result_one_hash[:scenes]       << [40, 20, 4, 4, confirmation_result_two_hash]~
 - Inside source: true
 *** True Line Result
-      else
-** Processing line: ~        m.up = nil~
+    confirmation_result_one_hash[:scenes]       << [40, 20, 4, 4, confirmation_result_two_hash]
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-        m.up = nil
-** Processing line: ~      end~
+
+** Processing line: ~    confirmation_result_two_hash[:scenes]       << [20, 35, 4, 4, top_level_hash]~
 - Inside source: true
 *** True Line Result
-      end
-** Processing line: ~    end~
+    confirmation_result_two_hash[:scenes]       << [20, 35, 4, 4, top_level_hash]
+** Processing line: ~    confirmation_result_two_hash[:scenes]       << [40, 50, 4, 4, confirmation_result_one_hash]~
 - Inside source: true
 *** True Line Result
-    end
-** Processing line: ~  end~
+    confirmation_result_two_hash[:scenes]       << [40, 50, 4, 4, confirmation_result_one_hash]
+** Processing line: ~    confirmation_result_two_hash[:scenes]       << [40, 40, 4, 4, confirmation_result_four_hash] if result_four_scene~
 - Inside source: true
 *** True Line Result
-  end
+    confirmation_result_two_hash[:scenes]       << [40, 40, 4, 4, confirmation_result_four_hash] if result_four_scene
+** Processing line: ~    confirmation_result_two_hash[:scenes]       << [40, 30, 4, 4, confirmation_result_three_hash] if result_three_scene~
+- Inside source: true
+*** True Line Result
+    confirmation_result_two_hash[:scenes]       << [40, 30, 4, 4, confirmation_result_three_hash] if result_three_scene
+** Processing line: ~    confirmation_result_two_hash[:scenes]       << [60, 20, 4, 4, result_two_scene]~
+- Inside source: true
+*** True Line Result
+    confirmation_result_two_hash[:scenes]       << [60, 20, 4, 4, result_two_scene]
+** Processing line: ~    confirmation_result_two_hash[:storylines]   << [40, 20, 4, 4, "#{result_two_label}: \"#{result_two_text}\""]~
+- Inside source: true
+*** True Line Result
+    confirmation_result_two_hash[:storylines]   << [40, 20, 4, 4, "#{result_two_label}: \"#{result_two_text}\""]
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~  def render_mouse_crosshairs args, mouse~
+** Processing line: ~    confirmation_result_three_hash[:scenes]     << [20, 35, 4, 4, top_level_hash]~
 - Inside source: true
 *** True Line Result
-  def render_mouse_crosshairs args, mouse
-** Processing line: ~    return unless args.state.show_gridlines~
+    confirmation_result_three_hash[:scenes]     << [20, 35, 4, 4, top_level_hash]
+** Processing line: ~    confirmation_result_three_hash[:scenes]     << [40, 50, 4, 4, confirmation_result_one_hash]~
 - Inside source: true
 *** True Line Result
-    return unless args.state.show_gridlines
-** Processing line: ~    args.labels << [10, 25, "mouse: #{mouse.x} #{mouse.y}", 255, 255, 255]~
+    confirmation_result_three_hash[:scenes]     << [40, 50, 4, 4, confirmation_result_one_hash]
+** Processing line: ~    confirmation_result_three_hash[:scenes]     << [40, 40, 4, 4, confirmation_result_four_hash]~
 - Inside source: true
 *** True Line Result
-    args.labels << [10, 25, "mouse: #{mouse.x} #{mouse.y}", 255, 255, 255]
-** Processing line: ~  end~
+    confirmation_result_three_hash[:scenes]     << [40, 40, 4, 4, confirmation_result_four_hash]
+** Processing line: ~    confirmation_result_three_hash[:scenes]     << [60, 30, 4, 4, result_three_scene]~
 - Inside source: true
 *** True Line Result
-  end
-** Processing line: ~~
+    confirmation_result_three_hash[:scenes]     << [60, 30, 4, 4, result_three_scene]
+** Processing line: ~    confirmation_result_three_hash[:storylines] << [40, 30, 4, 4, "#{result_three_label}: \"#{result_three_text}\""]~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~  def emulate_lowrez_scene args, sprites, labels, borders, solids, mouse~
+    confirmation_result_three_hash[:storylines] << [40, 30, 4, 4, "#{result_three_label}: \"#{result_three_text}\""]
+** Processing line: ~    confirmation_result_three_hash[:scenes]     << [40, 20, 4, 4, confirmation_result_two_hash]~
 - Inside source: true
 *** True Line Result
-  def emulate_lowrez_scene args, sprites, labels, borders, solids, mouse
-** Processing line: ~    args.render_target(:lowrez).solids  << [0, 0, 1280, 720]~
+    confirmation_result_three_hash[:scenes]     << [40, 20, 4, 4, confirmation_result_two_hash]
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-    args.render_target(:lowrez).solids  << [0, 0, 1280, 720]
-** Processing line: ~    args.render_target(:lowrez).sprites << sprites~
+
+** Processing line: ~    confirmation_result_four_hash[:scenes]      << [20, 35, 4, 4, top_level_hash]~
 - Inside source: true
 *** True Line Result
-    args.render_target(:lowrez).sprites << sprites
-** Processing line: ~    args.render_target(:lowrez).borders << borders~
+    confirmation_result_four_hash[:scenes]      << [20, 35, 4, 4, top_level_hash]
+** Processing line: ~    confirmation_result_four_hash[:scenes]      << [40, 50, 4, 4, confirmation_result_one_hash]~
 - Inside source: true
 *** True Line Result
-    args.render_target(:lowrez).borders << borders
-** Processing line: ~    args.render_target(:lowrez).solids  << solids~
+    confirmation_result_four_hash[:scenes]      << [40, 50, 4, 4, confirmation_result_one_hash]
+** Processing line: ~    confirmation_result_four_hash[:scenes]      << [60, 40, 4, 4, result_four_scene]~
 - Inside source: true
 *** True Line Result
-    args.render_target(:lowrez).solids  << solids
-** Processing line: ~    args.outputs.primitives << labels.map do |l|~
+    confirmation_result_four_hash[:scenes]      << [60, 40, 4, 4, result_four_scene]
+** Processing line: ~    confirmation_result_four_hash[:storylines]  << [40, 40, 4, 4, "#{result_four_label}: \"#{result_four_text}\""]~
 - Inside source: true
 *** True Line Result
-    args.outputs.primitives << labels.map do |l|
-** Processing line: ~      as_label = l.label~
+    confirmation_result_four_hash[:storylines]  << [40, 40, 4, 4, "#{result_four_label}: \"#{result_four_text}\""]
+** Processing line: ~    confirmation_result_four_hash[:scenes]      << [40, 30, 4, 4, confirmation_result_three_hash]~
 - Inside source: true
 *** True Line Result
-      as_label = l.label
-** Processing line: ~      l.text.each_char.each_with_index.map do |char, i|~
+    confirmation_result_four_hash[:scenes]      << [40, 30, 4, 4, confirmation_result_three_hash]
+** Processing line: ~    confirmation_result_four_hash[:scenes]      << [40, 20, 4, 4, confirmation_result_two_hash]~
 - Inside source: true
 *** True Line Result
-      l.text.each_char.each_with_index.map do |char, i|
-** Processing line: ~        [CENTER_OFFSET + EMULATED_FONT_X_ZERO + (as_label.x * TINY_SCALE) + i * 5 * TINY_SCALE,~
+    confirmation_result_four_hash[:scenes]      << [40, 20, 4, 4, confirmation_result_two_hash]
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-        [CENTER_OFFSET + EMULATED_FONT_X_ZERO + (as_label.x * TINY_SCALE) + i * 5 * TINY_SCALE,
-** Processing line: ~         EMULATED_FONT_Y_ZERO + (as_label.y * TINY_SCALE), char,~
+
+** Processing line: ~    top_level_hash[:scenes]     << [40, 50, 4, 4, confirmation_result_one_hash]~
 - Inside source: true
 *** True Line Result
-         EMULATED_FONT_Y_ZERO + (as_label.y * TINY_SCALE), char,
-** Processing line: ~         EMULATED_FONT_SIZE, 0, as_label.r, as_label.g, as_label.b, as_label.a, 'fonts/dragonruby-gtk-4x4.ttf'].label~
+    top_level_hash[:scenes]     << [40, 50, 4, 4, confirmation_result_one_hash]
+** Processing line: ~    top_level_hash[:scenes]     << [40, 40, 4, 4, confirmation_result_four_hash] if result_four_scene~
 - Inside source: true
 *** True Line Result
-         EMULATED_FONT_SIZE, 0, as_label.r, as_label.g, as_label.b, as_label.a, 'fonts/dragonruby-gtk-4x4.ttf'].label
-** Processing line: ~      end~
+    top_level_hash[:scenes]     << [40, 40, 4, 4, confirmation_result_four_hash] if result_four_scene
+** Processing line: ~    top_level_hash[:scenes]     << [40, 30, 4, 4, confirmation_result_three_hash] if result_three_scene~
 - Inside source: true
 *** True Line Result
-      end
-** Processing line: ~    end~
+    top_level_hash[:scenes]     << [40, 30, 4, 4, confirmation_result_three_hash] if result_three_scene
+** Processing line: ~    top_level_hash[:scenes]     << [40, 20, 4, 4, confirmation_result_two_hash]~
 - Inside source: true
 *** True Line Result
-    end
+    top_level_hash[:scenes]     << [40, 20, 4, 4, confirmation_result_two_hash]
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~    args.sprites    << [CENTER_OFFSET, 0, 1280 * TINY_SCALE, 720 * TINY_SCALE, :lowrez]~
+** Processing line: ~    top_level_hash~
 - Inside source: true
 *** True Line Result
-    args.sprites    << [CENTER_OFFSET, 0, 1280 * TINY_SCALE, 720 * TINY_SCALE, :lowrez]
+    top_level_hash
 ** Processing line: ~  end~
 - Inside source: true
 *** True Line Result
@@ -134891,74 +140543,78 @@ Follows is a source code listing for all files that have been open sourced. This
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~  def render_gridlines_if_needed args~
+** Processing line: ~  def ship_control_hotspot offset_x, offset_y, a, b, c, d~
 - Inside source: true
 *** True Line Result
-  def render_gridlines_if_needed args
-** Processing line: ~    if args.state.show_gridlines && args.static_lines.length == 0~
+  def ship_control_hotspot offset_x, offset_y, a, b, c, d
+** Processing line: ~    results = []~
 - Inside source: true
 *** True Line Result
-    if args.state.show_gridlines && args.static_lines.length == 0
-** Processing line: ~      args.static_lines << 65.times.map do |i|~
+    results = []
+** Processing line: ~    results << [ 6 + offset_x, 0 + offset_y, 4, 4, a]  if a~
 - Inside source: true
 *** True Line Result
-      args.static_lines << 65.times.map do |i|
-** Processing line: ~        [~
+    results << [ 6 + offset_x, 0 + offset_y, 4, 4, a]  if a
+** Processing line: ~    results << [ 1 + offset_x, 5 + offset_y, 4, 4, b]  if b~
 - Inside source: true
 *** True Line Result
-        [
-** Processing line: ~          [CENTER_OFFSET + i * TINY_SCALE + 1,  0,~
+    results << [ 1 + offset_x, 5 + offset_y, 4, 4, b]  if b
+** Processing line: ~    results << [ 6 + offset_x, 5 + offset_y, 4, 4, c]  if c~
 - Inside source: true
 *** True Line Result
-          [CENTER_OFFSET + i * TINY_SCALE + 1,  0,
-** Processing line: ~           CENTER_OFFSET + i * TINY_SCALE + 1,  720,                128, 128, 128],~
+    results << [ 6 + offset_x, 5 + offset_y, 4, 4, c]  if c
+** Processing line: ~    results << [ 11 + offset_x, 5 + offset_y, 4, 4, d] if d~
 - Inside source: true
 *** True Line Result
-           CENTER_OFFSET + i * TINY_SCALE + 1,  720,                128, 128, 128],
-** Processing line: ~          [CENTER_OFFSET + i * TINY_SCALE,      0,~
+    results << [ 11 + offset_x, 5 + offset_y, 4, 4, d] if d
+** Processing line: ~    results~
 - Inside source: true
 *** True Line Result
-          [CENTER_OFFSET + i * TINY_SCALE,      0,
-** Processing line: ~           CENTER_OFFSET + i * TINY_SCALE,      720,                128, 128, 128],~
+    results
+** Processing line: ~  end~
 - Inside source: true
 *** True Line Result
-           CENTER_OFFSET + i * TINY_SCALE,      720,                128, 128, 128],
-** Processing line: ~          [CENTER_OFFSET,                       0 + i * TINY_SCALE,~
+  end
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-          [CENTER_OFFSET,                       0 + i * TINY_SCALE,
-** Processing line: ~           CENTER_OFFSET + 720,                 0 + i * TINY_SCALE, 128, 128, 128],~
+
+** Processing line: ~  def reload_current_scene~
 - Inside source: true
 *** True Line Result
-           CENTER_OFFSET + 720,                 0 + i * TINY_SCALE, 128, 128, 128],
-** Processing line: ~          [CENTER_OFFSET,                       1 + i * TINY_SCALE,~
+  def reload_current_scene
+** Processing line: ~    if $gtk.args.state.last_hotspot_scene~
 - Inside source: true
 *** True Line Result
-          [CENTER_OFFSET,                       1 + i * TINY_SCALE,
-** Processing line: ~           CENTER_OFFSET + 720,                 1 + i * TINY_SCALE, 128, 128, 128]~
+    if $gtk.args.state.last_hotspot_scene
+** Processing line: ~      set_scene $gtk.args, send($gtk.args.state.last_hotspot_scene, $gtk.args)~
 - Inside source: true
 *** True Line Result
-           CENTER_OFFSET + 720,                 1 + i * TINY_SCALE, 128, 128, 128]
-** Processing line: ~        ]~
+      set_scene $gtk.args, send($gtk.args.state.last_hotspot_scene, $gtk.args)
+** Processing line: ~      tick $gtk.args~
 - Inside source: true
 *** True Line Result
-        ]
-** Processing line: ~      end~
+      tick $gtk.args
+** Processing line: ~    elsif respond_to? :set_scene~
 - Inside source: true
 *** True Line Result
-      end
-** Processing line: ~    elsif !args.state.show_gridlines~
+    elsif respond_to? :set_scene
+** Processing line: ~      set_scene $gtk.args, (replied_to_serenity_alive_firmly $gtk.args)~
 - Inside source: true
 *** True Line Result
-    elsif !args.state.show_gridlines
-** Processing line: ~      args.static_lines.clear~
+      set_scene $gtk.args, (replied_to_serenity_alive_firmly $gtk.args)
+** Processing line: ~      tick $gtk.args~
 - Inside source: true
 *** True Line Result
-      args.static_lines.clear
+      tick $gtk.args
 ** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
     end
+** Processing line: ~    $gtk.console.close~
+- Inside source: true
+*** True Line Result
+    $gtk.console.close
 ** Processing line: ~  end~
 - Inside source: true
 *** True Line Result
@@ -134975,234 +140631,242 @@ Follows is a source code listing for all files that have been open sourced. This
 - End of paragraph detected.
 *** True Line Result
 
-** Processing line: ~*** Rpg Narrative - Return Of Serenity - main.rb~
+** Processing line: ~*** Rpg Narrative - Return Of Serenity - storyline_anka.rb~
 - Header detected.
 *** True Line Result
 
 *** True Line Result
-*** Rpg Narrative - Return Of Serenity - main.rb
+*** Rpg Narrative - Return Of Serenity - storyline_anka.rb
 ** Processing line: ~#+begin_src ruby~
 - Line was identified as the beginning of a code block.
 *** True Line Result
 
 *** True Line Result
 #+begin_src ruby
-** Processing line: ~  # ./samples/99_genre_rpg_narrative/return_of_serenity/app/main.rb~
+** Processing line: ~  # ./samples/99_genre_rpg_narrative/return_of_serenity/app/storyline_anka.rb~
 - Inside source: true
 *** True Line Result
-  # ./samples/99_genre_rpg_narrative/return_of_serenity/app/main.rb
-** Processing line: ~  require 'app/require.rb'~
+  # ./samples/99_genre_rpg_narrative/return_of_serenity/app/storyline_anka.rb
+** Processing line: ~  def anka_inside_room args~
 - Inside source: true
 *** True Line Result
-  require 'app/require.rb'
-** Processing line: ~~
+  def anka_inside_room args
+** Processing line: ~    {~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~  def defaults args~
+    {
+** Processing line: ~      background: 'sprites/inside-home.png',~
 - Inside source: true
 *** True Line Result
-  def defaults args
-** Processing line: ~    args.outputs.background_color = [0, 0, 0]~
+      background: 'sprites/inside-home.png',
+** Processing line: ~      player: [34, 35],~
 - Inside source: true
 *** True Line Result
-    args.outputs.background_color = [0, 0, 0]
-** Processing line: ~    args.state.last_story_line_text ||= ""~
+      player: [34, 35],
+** Processing line: ~      storylines: [~
 - Inside source: true
 *** True Line Result
-    args.state.last_story_line_text ||= ""
-** Processing line: ~    args.state.scene_history ||= []~
+      storylines: [
+** Processing line: ~        [34, 34, 4, 4, "Ahhhh!!! Oh god, it was just- a nightmare."],~
 - Inside source: true
 *** True Line Result
-    args.state.scene_history ||= []
-** Processing line: ~    args.state.storyline_history ||= []~
+        [34, 34, 4, 4, "Ahhhh!!! Oh god, it was just- a nightmare."],
+** Processing line: ~      ],~
 - Inside source: true
 *** True Line Result
-    args.state.storyline_history ||= []
-** Processing line: ~    args.state.word_delay ||= 8~
+      ],
+** Processing line: ~      scenes: [~
 - Inside source: true
 *** True Line Result
-    args.state.word_delay ||= 8
-** Processing line: ~    if args.state.tick_count == 0~
+      scenes: [
+** Processing line: ~        [32, -1, 8, 3, :anka_observatory]~
 - Inside source: true
 *** True Line Result
-    if args.state.tick_count == 0
-** Processing line: ~      args.gtk.stop_music~
+        [32, -1, 8, 3, :anka_observatory]
+** Processing line: ~      ]~
 - Inside source: true
 *** True Line Result
-      args.gtk.stop_music
-** Processing line: ~      args.outputs.sounds << 'sounds/static-loop.ogg'~
+      ]
+** Processing line: ~    }~
 - Inside source: true
 *** True Line Result
-      args.outputs.sounds << 'sounds/static-loop.ogg'
-** Processing line: ~    end~
+    }
+** Processing line: ~  end~
 - Inside source: true
 *** True Line Result
-    end
+  end
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~    if args.state.last_story_line_text~
+** Processing line: ~  def anka_observatory args~
 - Inside source: true
 *** True Line Result
-    if args.state.last_story_line_text
-** Processing line: ~      lines = args.state~
+  def anka_observatory args
+** Processing line: ~    {~
 - Inside source: true
 *** True Line Result
-      lines = args.state
-** Processing line: ~                  .last_story_line_text~
+    {
+** Processing line: ~      background: 'sprites/inside-observatory.png',~
 - Inside source: true
 *** True Line Result
-                  .last_story_line_text
-** Processing line: ~                  .gsub("-", "")~
+      background: 'sprites/inside-observatory.png',
+** Processing line: ~      fade: 60,~
 - Inside source: true
 *** True Line Result
-                  .gsub("-", "")
-** Processing line: ~                  .gsub("~", "")~
+      fade: 60,
+** Processing line: ~      player: [51, 12],~
 - Inside source: true
 *** True Line Result
-                  .gsub("~", "")
-** Processing line: ~                  .wrapped_lines(50)~
+      player: [51, 12],
+** Processing line: ~      storylines: [~
 - Inside source: true
 *** True Line Result
-                  .wrapped_lines(50)
-** Processing line: ~~
+      storylines: [
+** Processing line: ~        [50, 10, 4, 4,   "Breathe, Hiro. Just see what's there... everything--- will- be okay."]~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~      args.outputs.labels << lines.map_with_index { |l, i| [690, 200 - (i * 25), l, 1, 0, 255, 255, 255] }~
+        [50, 10, 4, 4,   "Breathe, Hiro. Just see what's there... everything--- will- be okay."]
+** Processing line: ~      ],~
 - Inside source: true
 *** True Line Result
-      args.outputs.labels << lines.map_with_index { |l, i| [690, 200 - (i * 25), l, 1, 0, 255, 255, 255] }
-** Processing line: ~    elsif args.state.storyline_history[-1]~
+      ],
+** Processing line: ~      scenes: [~
 - Inside source: true
 *** True Line Result
-    elsif args.state.storyline_history[-1]
-** Processing line: ~      lines = args.state~
+      scenes: [
+** Processing line: ~        [30, 18, 5, 12, :anka_inside_mainframe]~
 - Inside source: true
 *** True Line Result
-      lines = args.state
-** Processing line: ~                  .storyline_history[-1]~
+        [30, 18, 5, 12, :anka_inside_mainframe]
+** Processing line: ~      ],~
 - Inside source: true
 *** True Line Result
-                  .storyline_history[-1]
-** Processing line: ~                  .gsub("-", "")~
+      ],
+** Processing line: ~      render_override: :blinking_light_inside_observatory_render~
 - Inside source: true
 *** True Line Result
-                  .gsub("-", "")
-** Processing line: ~                  .gsub("~", "")~
+      render_override: :blinking_light_inside_observatory_render
+** Processing line: ~    }~
 - Inside source: true
 *** True Line Result
-                  .gsub("~", "")
-** Processing line: ~                  .wrapped_lines(50)~
+    }
+** Processing line: ~  end~
 - Inside source: true
 *** True Line Result
-                  .wrapped_lines(50)
+  end
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~      args.outputs.labels << lines.map_with_index { |l, i| [690, 200 - (i * 25), l, 1, 0, 255, 255, 255] }~
+** Processing line: ~  def anka_inside_mainframe args~
 - Inside source: true
 *** True Line Result
-      args.outputs.labels << lines.map_with_index { |l, i| [690, 200 - (i * 25), l, 1, 0, 255, 255, 255] }
-** Processing line: ~    end~
+  def anka_inside_mainframe args
+** Processing line: ~    {~
 - Inside source: true
 *** True Line Result
-    end
-** Processing line: ~~
+    {
+** Processing line: ~      player: [32, 4],~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~    return if args.state.current_scene~
+      player: [32, 4],
+** Processing line: ~      background: 'sprites/mainframe.png',~
 - Inside source: true
 *** True Line Result
-    return if args.state.current_scene
-** Processing line: ~    set_scene(args, day_one_beginning(args))~
+      background: 'sprites/mainframe.png',
+** Processing line: ~      fade: 60,~
 - Inside source: true
 *** True Line Result
-    set_scene(args, day_one_beginning(args))
-** Processing line: ~  end~
+      fade: 60,
+** Processing line: ~      storylines: [~
 - Inside source: true
 *** True Line Result
-  end
-** Processing line: ~~
+      storylines: [
+** Processing line: ~        [22, 45, 17, 4, (anka_last_reply args)],~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~  def inputs_move_player args~
+        [22, 45, 17, 4, (anka_last_reply args)],
+** Processing line: ~        [45, 45,  4, 4, (anka_current_reply args)],~
 - Inside source: true
 *** True Line Result
-  def inputs_move_player args
-** Processing line: ~    if args.state.scene_changed_at.elapsed_time > 5~
+        [45, 45,  4, 4, (anka_current_reply args)],
+** Processing line: ~      ],~
 - Inside source: true
 *** True Line Result
-    if args.state.scene_changed_at.elapsed_time > 5
-** Processing line: ~      if args.keyboard.down  || args.keyboard.s || args.keyboard.j~
+      ],
+** Processing line: ~      scenes: [~
 - Inside source: true
 *** True Line Result
-      if args.keyboard.down  || args.keyboard.s || args.keyboard.j
-** Processing line: ~        args.state.player.y -= 0.25~
+      scenes: [
+** Processing line: ~        [*hotspot_top_right, :reply_to_anka]~
 - Inside source: true
 *** True Line Result
-        args.state.player.y -= 0.25
-** Processing line: ~      elsif args.keyboard.up || args.keyboard.w || args.keyboard.k~
+        [*hotspot_top_right, :reply_to_anka]
+** Processing line: ~      ]~
 - Inside source: true
 *** True Line Result
-      elsif args.keyboard.up || args.keyboard.w || args.keyboard.k
-** Processing line: ~        args.state.player.y += 0.25~
+      ]
+** Processing line: ~    }~
 - Inside source: true
 *** True Line Result
-        args.state.player.y += 0.25
-** Processing line: ~      end~
+    }
+** Processing line: ~  end~
 - Inside source: true
 *** True Line Result
-      end
+  end
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~      if args.keyboard.left     || args.keyboard.a  || args.keyboard.h~
+** Processing line: ~  def reply_to_anka args~
 - Inside source: true
 *** True Line Result
-      if args.keyboard.left     || args.keyboard.a  || args.keyboard.h
-** Processing line: ~        args.state.player.x -= 0.25~
+  def reply_to_anka args
+** Processing line: ~    decision_graph anka_current_reply(args),~
 - Inside source: true
 *** True Line Result
-        args.state.player.x -= 0.25
-** Processing line: ~      elsif args.keyboard.right || args.keyboard.d  || args.keyboard.l~
+    decision_graph anka_current_reply(args),
+** Processing line: ~                   "Matthew's-- wife is doing-- well. What's-- even-- better-- is that he's-- a dad, and he didn't-- even-- know it. Should- I- leave- out the part about-- the crew- being-- in hibernation-- for 20-- years? They- should- enter-- statis-- on a high- note... Right?",~
 - Inside source: true
 *** True Line Result
-      elsif args.keyboard.right || args.keyboard.d  || args.keyboard.l
-** Processing line: ~        args.state.player.x += 0.25~
+                   "Matthew's-- wife is doing-- well. What's-- even-- better-- is that he's-- a dad, and he didn't-- even-- know it. Should- I- leave- out the part about-- the crew- being-- in hibernation-- for 20-- years? They- should- enter-- statis-- on a high- note... Right?",
+** Processing line: ~                   [:replied_with_whole_truth, "Whole-- Truth--", anka_reply_whole_truth],~
 - Inside source: true
 *** True Line Result
-        args.state.player.x += 0.25
-** Processing line: ~      end~
+                   [:replied_with_whole_truth, "Whole-- Truth--", anka_reply_whole_truth],
+** Processing line: ~                   [:replied_with_half_truth, "Half-- Truth--", anka_reply_half_truth]~
 - Inside source: true
 *** True Line Result
-      end
+                   [:replied_with_half_truth, "Half-- Truth--", anka_reply_half_truth]
+** Processing line: ~  end~
+- Inside source: true
+*** True Line Result
+  end
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~      args.state.player.y = 60 if args.state.player.y > 63~
+** Processing line: ~  def anka_last_reply args~
 - Inside source: true
 *** True Line Result
-      args.state.player.y = 60 if args.state.player.y > 63
-** Processing line: ~      args.state.player.y =  0 if args.state.player.y < -3~
+  def anka_last_reply args
+** Processing line: ~    if args.state.scene_history.include? :replied_to_serenity_alive_firmly~
 - Inside source: true
 *** True Line Result
-      args.state.player.y =  0 if args.state.player.y < -3
-** Processing line: ~      args.state.player.x = 60 if args.state.player.x > 63~
+    if args.state.scene_history.include? :replied_to_serenity_alive_firmly
+** Processing line: ~      return "Buffer--: #{serenity_alive_firm_reply.quote}"~
 - Inside source: true
 *** True Line Result
-      args.state.player.x = 60 if args.state.player.x > 63
-** Processing line: ~      args.state.player.x =  0 if args.state.player.x < -3~
+      return "Buffer--: #{serenity_alive_firm_reply.quote}"
+** Processing line: ~    else~
 - Inside source: true
 *** True Line Result
-      args.state.player.x =  0 if args.state.player.x < -3
+    else
+** Processing line: ~      return "Buffer--: #{serenity_alive_sugarcoated_reply.quote}"~
+- Inside source: true
+*** True Line Result
+      return "Buffer--: #{serenity_alive_sugarcoated_reply.quote}"
 ** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
@@ -135215,22 +140879,14 @@ Follows is a source code listing for all files that have been open sourced. This
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~  def null_or_empty? ary~
-- Inside source: true
-*** True Line Result
-  def null_or_empty? ary
-** Processing line: ~    return true unless ary~
-- Inside source: true
-*** True Line Result
-    return true unless ary
-** Processing line: ~    return true if ary.length == 0~
+** Processing line: ~  def anka_reply_whole_truth~
 - Inside source: true
 *** True Line Result
-    return true if ary.length == 0
-** Processing line: ~    return false~
+  def anka_reply_whole_truth
+** Processing line: ~    "Matthew's wife is doing-- very-- well. In fact, she was pregnant. Matthew-- is a dad. He has a son. But, I need- all-- of-- you-- to brace-- yourselves. You've-- been in statis-- for 20 years. A lot has changed. Most of Earth's-- population--- didn't-- survive. Tell- Matthew-- that I'm-- sorry he didn't-- get to see- his- son grow- up."~
 - Inside source: true
 *** True Line Result
-    return false
+    "Matthew's wife is doing-- very-- well. In fact, she was pregnant. Matthew-- is a dad. He has a son. But, I need- all-- of-- you-- to brace-- yourselves. You've-- been in statis-- for 20 years. A lot has changed. Most of Earth's-- population--- didn't-- survive. Tell- Matthew-- that I'm-- sorry he didn't-- get to see- his- son grow- up."
 ** Processing line: ~  end~
 - Inside source: true
 *** True Line Result
@@ -135239,70 +140895,66 @@ Follows is a source code listing for all files that have been open sourced. This
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~  def calc_storyline_hotspot args~
-- Inside source: true
-*** True Line Result
-  def calc_storyline_hotspot args
-** Processing line: ~    hotspots = args.state.storylines.find_all do |hs|~
+** Processing line: ~  def anka_reply_half_truth~
 - Inside source: true
 *** True Line Result
-    hotspots = args.state.storylines.find_all do |hs|
-** Processing line: ~      args.state.player.inside_rect?(hs.shift_rect(-2, 0))~
+  def anka_reply_half_truth
+** Processing line: ~    "Matthew's--- wife- is doing-- very-- well. In fact, she was pregnant. Matthew is a dad! It's a boy! Tell- Matthew-- congrats-- for me. Hope-- to see- all of you- soon."~
 - Inside source: true
 *** True Line Result
-      args.state.player.inside_rect?(hs.shift_rect(-2, 0))
-** Processing line: ~    end~
+    "Matthew's--- wife- is doing-- very-- well. In fact, she was pregnant. Matthew is a dad! It's a boy! Tell- Matthew-- congrats-- for me. Hope-- to see- all of you- soon."
+** Processing line: ~  end~
 - Inside source: true
 *** True Line Result
-    end
+  end
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~    if !null_or_empty?(hotspots) && !args.state.inside_storyline_hotspot~
+** Processing line: ~  def replied_with_whole_truth args~
 - Inside source: true
 *** True Line Result
-    if !null_or_empty?(hotspots) && !args.state.inside_storyline_hotspot
-** Processing line: ~      _, _, _, _, storyline = hotspots.first~
+  def replied_with_whole_truth args
+** Processing line: ~    {~
 - Inside source: true
 *** True Line Result
-      _, _, _, _, storyline = hotspots.first
-** Processing line: ~      queue_storyline_text(args, storyline)~
+    {
+** Processing line: ~      background: 'sprites/inside-observatory.png',~
 - Inside source: true
 *** True Line Result
-      queue_storyline_text(args, storyline)
-** Processing line: ~      args.state.inside_storyline_hotspot = true~
+      background: 'sprites/inside-observatory.png',
+** Processing line: ~      fade: 60,~
 - Inside source: true
 *** True Line Result
-      args.state.inside_storyline_hotspot = true
-** Processing line: ~    elsif null_or_empty?(hotspots)~
+      fade: 60,
+** Processing line: ~      player: [32, 21],~
 - Inside source: true
 *** True Line Result
-    elsif null_or_empty?(hotspots)
-** Processing line: ~      args.state.inside_storyline_hotspot = false~
+      player: [32, 21],
+** Processing line: ~      scenes: [[60, 0, 4, 32, :replied_to_anka_back_home]],~
 - Inside source: true
 *** True Line Result
-      args.state.inside_storyline_hotspot = false
-** Processing line: ~~
+      scenes: [[60, 0, 4, 32, :replied_to_anka_back_home]],
+** Processing line: ~      storylines: [~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~      args.state.storyline_queue_empty_at ||= args.state.tick_count~
+      storylines: [
+** Processing line: ~        [30, 18, 5, 12, "Buffer-- has been set to: #{anka_reply_whole_truth.quote}"],~
 - Inside source: true
 *** True Line Result
-      args.state.storyline_queue_empty_at ||= args.state.tick_count
-** Processing line: ~      args.state.is_storyline_dialog_active = false~
+        [30, 18, 5, 12, "Buffer-- has been set to: #{anka_reply_whole_truth.quote}"],
+** Processing line: ~        [30, 10, 5, 4, "I- hope- I- did the right- thing- by laying-- it all- out- there."],~
 - Inside source: true
 *** True Line Result
-      args.state.is_storyline_dialog_active = false
-** Processing line: ~      args.state.scene_storyline_queue.clear~
+        [30, 10, 5, 4, "I- hope- I- did the right- thing- by laying-- it all- out- there."],
+** Processing line: ~      ]~
 - Inside source: true
 *** True Line Result
-      args.state.scene_storyline_queue.clear
-** Processing line: ~    end~
+      ]
+** Processing line: ~    }~
 - Inside source: true
 *** True Line Result
-    end
+    }
 ** Processing line: ~  end~
 - Inside source: true
 *** True Line Result
@@ -135311,74 +140963,78 @@ Follows is a source code listing for all files that have been open sourced. This
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~  def calc_scenes args~
+** Processing line: ~  def replied_with_half_truth args~
 - Inside source: true
 *** True Line Result
-  def calc_scenes args
-** Processing line: ~    hotspots = args.state.scenes.find_all do |hs|~
+  def replied_with_half_truth args
+** Processing line: ~    {~
 - Inside source: true
 *** True Line Result
-    hotspots = args.state.scenes.find_all do |hs|
-** Processing line: ~      args.state.player.inside_rect?(hs.shift_rect(-2, 0))~
+    {
+** Processing line: ~      background: 'sprites/inside-observatory.png',~
 - Inside source: true
 *** True Line Result
-      args.state.player.inside_rect?(hs.shift_rect(-2, 0))
-** Processing line: ~    end~
+      background: 'sprites/inside-observatory.png',
+** Processing line: ~      fade: 60,~
 - Inside source: true
 *** True Line Result
-    end
-** Processing line: ~~
+      fade: 60,
+** Processing line: ~      player: [32, 21],~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~    if !null_or_empty?(hotspots) && !args.state.inside_scene_hotspot~
+      player: [32, 21],
+** Processing line: ~      scenes: [[60, 0, 4, 32, :replied_to_anka_back_home]],~
 - Inside source: true
 *** True Line Result
-    if !null_or_empty?(hotspots) && !args.state.inside_scene_hotspot
-** Processing line: ~      _, _, _, _, scene_method_or_hash = hotspots.first~
+      scenes: [[60, 0, 4, 32, :replied_to_anka_back_home]],
+** Processing line: ~      storylines: [~
 - Inside source: true
 *** True Line Result
-      _, _, _, _, scene_method_or_hash = hotspots.first
-** Processing line: ~      if scene_method_or_hash.is_a? Symbol~
+      storylines: [
+** Processing line: ~        [30, 18, 5, 12, "Buffer-- has been set to: #{anka_reply_half_truth.quote}"],~
 - Inside source: true
 *** True Line Result
-      if scene_method_or_hash.is_a? Symbol
-** Processing line: ~        set_scene(args, send(scene_method_or_hash, args))~
+        [30, 18, 5, 12, "Buffer-- has been set to: #{anka_reply_half_truth.quote}"],
+** Processing line: ~        [30, 10, 5, 4, "I- hope- I- did the right- thing- by not giving-- them- the whole- truth."],~
 - Inside source: true
 *** True Line Result
-        set_scene(args, send(scene_method_or_hash, args))
-** Processing line: ~        args.state.last_hotspot_scene = scene_method_or_hash~
+        [30, 10, 5, 4, "I- hope- I- did the right- thing- by not giving-- them- the whole- truth."],
+** Processing line: ~      ]~
 - Inside source: true
 *** True Line Result
-        args.state.last_hotspot_scene = scene_method_or_hash
-** Processing line: ~        args.state.scene_history << scene_method_or_hash~
+      ]
+** Processing line: ~    }~
 - Inside source: true
 *** True Line Result
-        args.state.scene_history << scene_method_or_hash
-** Processing line: ~      else~
+    }
+** Processing line: ~  end~
 - Inside source: true
 *** True Line Result
-      else
-** Processing line: ~        set_scene(args, scene_method_or_hash)~
+  end
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-        set_scene(args, scene_method_or_hash)
-** Processing line: ~      end~
+
+** Processing line: ~  def anka_current_reply args~
 - Inside source: true
 *** True Line Result
-      end
-** Processing line: ~      args.state.inside_scene_hotspot = true~
+  def anka_current_reply args
+** Processing line: ~    if args.state.scene_history.include? :replied_to_serenity_alive_firmly~
 - Inside source: true
 *** True Line Result
-      args.state.inside_scene_hotspot = true
-** Processing line: ~    elsif null_or_empty?(hotspots)~
+    if args.state.scene_history.include? :replied_to_serenity_alive_firmly
+** Processing line: ~      return "Hello. This is, Aanka. Sasha-- is still- trying-- to gather-- her wits about-- her, given- the gravity--- of your- last- reply. Thank- you- for being-- honest, and thank- you- for the help- with the ship- diagnostics. I was able-- to retrieve-- all of the navigation--- information---- after-- the battery--- swap. We- are ready-- to head back to Earth. Before-- we go- back- into-- statis, Matthew--- wanted-- to know- how his- wife- is doing. Please- reply-- as soon- as you can. He's-- not going-- to get- into-- the statis-- chamber-- until-- he knows- his wife is okay."~
 - Inside source: true
 *** True Line Result
-    elsif null_or_empty?(hotspots)
-** Processing line: ~      args.state.inside_scene_hotspot = false~
+      return "Hello. This is, Aanka. Sasha-- is still- trying-- to gather-- her wits about-- her, given- the gravity--- of your- last- reply. Thank- you- for being-- honest, and thank- you- for the help- with the ship- diagnostics. I was able-- to retrieve-- all of the navigation--- information---- after-- the battery--- swap. We- are ready-- to head back to Earth. Before-- we go- back- into-- statis, Matthew--- wanted-- to know- how his- wife- is doing. Please- reply-- as soon- as you can. He's-- not going-- to get- into-- the statis-- chamber-- until-- he knows- his wife is okay."
+** Processing line: ~    else~
 - Inside source: true
 *** True Line Result
-      args.state.inside_scene_hotspot = false
+    else
+** Processing line: ~      return "Hello. This is, Aanka. Thank- you for the help- with the ship's-- diagnostics. I was able-- to retrieve-- all of the navigation--- information--- after-- the battery-- swap. I- know-- that- you didn't-- tell- the whole truth- about-- how far we are from- Earth. Don't-- worry. I understand-- why you did it. We- are ready-- to head back to Earth. Before-- we go- back- into-- statis, Matthew--- wanted-- to know- how his- wife- is doing. Please- reply-- as soon- as you can. He's-- not going-- to get- into-- the statis-- chamber-- until-- he knows- his wife is okay."~
+- Inside source: true
+*** True Line Result
+      return "Hello. This is, Aanka. Thank- you for the help- with the ship's-- diagnostics. I was able-- to retrieve-- all of the navigation--- information--- after-- the battery-- swap. I- know-- that- you didn't-- tell- the whole truth- about-- how far we are from- Earth. Don't-- worry. I understand-- why you did it. We- are ready-- to head back to Earth. Before-- we go- back- into-- statis, Matthew--- wanted-- to know- how his- wife- is doing. Please- reply-- as soon- as you can. He's-- not going-- to get- into-- the statis-- chamber-- until-- he knows- his wife is okay."
 ** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
@@ -135391,162 +141047,182 @@ Follows is a source code listing for all files that have been open sourced. This
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~  def null_or_whitespace? word~
+** Processing line: ~  def replied_to_anka_back_home args~
 - Inside source: true
 *** True Line Result
-  def null_or_whitespace? word
-** Processing line: ~    return true if !word~
+  def replied_to_anka_back_home args
+** Processing line: ~    if args.state.scene_history.include? :replied_with_whole_truth~
 - Inside source: true
 *** True Line Result
-    return true if !word
-** Processing line: ~    return true if word.strip.length == 0~
+    if args.state.scene_history.include? :replied_with_whole_truth
+** Processing line: ~      return {~
 - Inside source: true
 *** True Line Result
-    return true if word.strip.length == 0
-** Processing line: ~    return false~
+      return {
+** Processing line: ~        fade: 60,~
 - Inside source: true
 *** True Line Result
-    return false
-** Processing line: ~  end~
+        fade: 60,
+** Processing line: ~        background: 'sprites/inside-home.png',~
 - Inside source: true
 *** True Line Result
-  end
-** Processing line: ~~
+        background: 'sprites/inside-home.png',
+** Processing line: ~        player: [34, 4],~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~  def calc_storyline_presentation args~
+        player: [34, 4],
+** Processing line: ~        storylines: [~
 - Inside source: true
 *** True Line Result
-  def calc_storyline_presentation args
-** Processing line: ~    return unless args.state.tick_count > args.state.next_storyline~
+        storylines: [
+** Processing line: ~          [34, 4, 4, 4, "I- hope-- this pit in my stomach-- is gone-- by tomorrow---."],~
 - Inside source: true
 *** True Line Result
-    return unless args.state.tick_count > args.state.next_storyline
-** Processing line: ~    return unless args.state.scene_storyline_queue~
+          [34, 4, 4, 4, "I- hope-- this pit in my stomach-- is gone-- by tomorrow---."],
+** Processing line: ~        ],~
 - Inside source: true
 *** True Line Result
-    return unless args.state.scene_storyline_queue
-** Processing line: ~    next_storyline = args.state.scene_storyline_queue.shift~
+        ],
+** Processing line: ~        scenes: [~
 - Inside source: true
 *** True Line Result
-    next_storyline = args.state.scene_storyline_queue.shift
-** Processing line: ~    if null_or_whitespace? next_storyline~
+        scenes: [
+** Processing line: ~          [30, 38, 12, 13, :final_message_sad],~
 - Inside source: true
 *** True Line Result
-    if null_or_whitespace? next_storyline
-** Processing line: ~      args.state.storyline_queue_empty_at ||= args.state.tick_count~
+          [30, 38, 12, 13, :final_message_sad],
+** Processing line: ~        ]~
 - Inside source: true
 *** True Line Result
-      args.state.storyline_queue_empty_at ||= args.state.tick_count
-** Processing line: ~      args.state.is_storyline_dialog_active = false~
+        ]
+** Processing line: ~      }~
 - Inside source: true
 *** True Line Result
-      args.state.is_storyline_dialog_active = false
-** Processing line: ~      return~
+      }
+** Processing line: ~    else~
 - Inside source: true
 *** True Line Result
-      return
-** Processing line: ~    end~
+    else
+** Processing line: ~      return {~
 - Inside source: true
 *** True Line Result
-    end
-** Processing line: ~    args.state.storyline_to_show = next_storyline~
+      return {
+** Processing line: ~        fade: 60,~
 - Inside source: true
 *** True Line Result
-    args.state.storyline_to_show = next_storyline
-** Processing line: ~    args.state.is_storyline_dialog_active = true~
+        fade: 60,
+** Processing line: ~        background: 'sprites/inside-home.png',~
 - Inside source: true
 *** True Line Result
-    args.state.is_storyline_dialog_active = true
-** Processing line: ~    args.state.storyline_queue_empty_at = nil~
+        background: 'sprites/inside-home.png',
+** Processing line: ~        player: [34, 4],~
 - Inside source: true
 *** True Line Result
-    args.state.storyline_queue_empty_at = nil
-** Processing line: ~    if next_storyline.end_with?(".") || next_storyline.end_with?("!") || next_storyline.end_with?("?") || next_storyline.end_with?("\"")~
+        player: [34, 4],
+** Processing line: ~        storylines: [~
 - Inside source: true
 *** True Line Result
-    if next_storyline.end_with?(".") || next_storyline.end_with?("!") || next_storyline.end_with?("?") || next_storyline.end_with?("\"")
-** Processing line: ~      args.state.next_storyline += 60~
+        storylines: [
+** Processing line: ~          [34, 4, 4, 4, "I- get the feeling-- I'm going-- to sleep real well tonight--."],~
 - Inside source: true
 *** True Line Result
-      args.state.next_storyline += 60
-** Processing line: ~    elsif next_storyline.end_with?(",")~
+          [34, 4, 4, 4, "I- get the feeling-- I'm going-- to sleep real well tonight--."],
+** Processing line: ~        ],~
 - Inside source: true
 *** True Line Result
-    elsif next_storyline.end_with?(",")
-** Processing line: ~      args.state.next_storyline += 50~
+        ],
+** Processing line: ~        scenes: [~
 - Inside source: true
 *** True Line Result
-      args.state.next_storyline += 50
-** Processing line: ~    elsif next_storyline.end_with?(":")~
+        scenes: [
+** Processing line: ~          [30, 38, 12, 13, :final_message_happy],~
 - Inside source: true
 *** True Line Result
-    elsif next_storyline.end_with?(":")
-** Processing line: ~      args.state.next_storyline += 60~
+          [30, 38, 12, 13, :final_message_happy],
+** Processing line: ~        ]~
 - Inside source: true
 *** True Line Result
-      args.state.next_storyline += 60
-** Processing line: ~    else~
+        ]
+** Processing line: ~      }~
 - Inside source: true
 *** True Line Result
-    else
-** Processing line: ~      default_word_delay = 13 + args.state.word_delay - 8~
+      }
+** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
-      default_word_delay = 13 + args.state.word_delay - 8
-** Processing line: ~      if next_storyline.gsub("-", "").gsub("~", "").length <= 4~
+    end
+** Processing line: ~  end~
 - Inside source: true
 *** True Line Result
-      if next_storyline.gsub("-", "").gsub("~", "").length <= 4
-** Processing line: ~        default_word_delay = 11 + args.state.word_delay - 8~
+  end
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-        default_word_delay = 11 + args.state.word_delay - 8
-** Processing line: ~      end~
+
+** Processing line: ~#+end_src~
+- Line was identified as the end of a code block.
+*** True Line Result
+#+end_src
+** Processing line: ~~
+- End of paragraph detected.
+*** True Line Result
+
+** Processing line: ~*** Rpg Narrative - Return Of Serenity - storyline_blinking_light.rb~
+- Header detected.
+*** True Line Result
+
+*** True Line Result
+*** Rpg Narrative - Return Of Serenity - storyline_blinking_light.rb
+** Processing line: ~#+begin_src ruby~
+- Line was identified as the beginning of a code block.
+*** True Line Result
+
+*** True Line Result
+#+begin_src ruby
+** Processing line: ~  # ./samples/99_genre_rpg_narrative/return_of_serenity/app/storyline_blinking_light.rb~
 - Inside source: true
 *** True Line Result
-      end
-** Processing line: ~      number_of_syllabals = next_storyline.length - next_storyline.gsub("-", "").length~
+  # ./samples/99_genre_rpg_narrative/return_of_serenity/app/storyline_blinking_light.rb
+** Processing line: ~  def the_blinking_light args~
 - Inside source: true
 *** True Line Result
-      number_of_syllabals = next_storyline.length - next_storyline.gsub("-", "").length
-** Processing line: ~      args.state.next_storyline += default_word_delay + number_of_syllabals * (args.state.word_delay + 1)~
+  def the_blinking_light args
+** Processing line: ~    {~
 - Inside source: true
 *** True Line Result
-      args.state.next_storyline += default_word_delay + number_of_syllabals * (args.state.word_delay + 1)
-** Processing line: ~    end~
+    {
+** Processing line: ~      fade: 60,~
 - Inside source: true
 *** True Line Result
-    end
-** Processing line: ~  end~
+      fade: 60,
+** Processing line: ~      background: 'sprites/side-of-home.png',~
 - Inside source: true
 *** True Line Result
-  end
-** Processing line: ~~
+      background: 'sprites/side-of-home.png',
+** Processing line: ~      player: [16, 13],~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~  def inputs_reload_current_scene args~
+      player: [16, 13],
+** Processing line: ~      scenes: [~
 - Inside source: true
 *** True Line Result
-  def inputs_reload_current_scene args
-** Processing line: ~    return~
+      scenes: [
+** Processing line: ~        [52, 24, 11, 5, :blinking_light_mountain_pass],~
 - Inside source: true
 *** True Line Result
-    return
-** Processing line: ~    if args.inputs.keyboard.key_down.r!~
+        [52, 24, 11, 5, :blinking_light_mountain_pass],
+** Processing line: ~      ],~
 - Inside source: true
 *** True Line Result
-    if args.inputs.keyboard.key_down.r!
-** Processing line: ~      reload_current_scene~
+      ],
+** Processing line: ~      render_override: :blinking_light_side_of_home_render~
 - Inside source: true
 *** True Line Result
-      reload_current_scene
-** Processing line: ~    end~
+      render_override: :blinking_light_side_of_home_render
+** Processing line: ~    }~
 - Inside source: true
 *** True Line Result
-    end
+    }
 ** Processing line: ~  end~
 - Inside source: true
 *** True Line Result
@@ -135555,22 +141231,42 @@ Follows is a source code listing for all files that have been open sourced. This
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~  def inputs_dismiss_current_storyline args~
+** Processing line: ~  def blinking_light_mountain_pass args~
 - Inside source: true
 *** True Line Result
-  def inputs_dismiss_current_storyline args
-** Processing line: ~    if args.inputs.keyboard.key_down.x!~
+  def blinking_light_mountain_pass args
+** Processing line: ~    {~
 - Inside source: true
 *** True Line Result
-    if args.inputs.keyboard.key_down.x!
-** Processing line: ~      args.state.scene_storyline_queue.clear~
+    {
+** Processing line: ~      background: 'sprites/mountain-pass-zoomed-out.png',~
 - Inside source: true
 *** True Line Result
-      args.state.scene_storyline_queue.clear
-** Processing line: ~    end~
+      background: 'sprites/mountain-pass-zoomed-out.png',
+** Processing line: ~      player: [4, 4],~
 - Inside source: true
 *** True Line Result
-    end
+      player: [4, 4],
+** Processing line: ~      scenes: [~
+- Inside source: true
+*** True Line Result
+      scenes: [
+** Processing line: ~        [18, 47, 5, 5, :blinking_light_path_to_observatory]~
+- Inside source: true
+*** True Line Result
+        [18, 47, 5, 5, :blinking_light_path_to_observatory]
+** Processing line: ~      ],~
+- Inside source: true
+*** True Line Result
+      ],
+** Processing line: ~      render_override: :blinking_light_mountain_pass_render~
+- Inside source: true
+*** True Line Result
+      render_override: :blinking_light_mountain_pass_render
+** Processing line: ~    }~
+- Inside source: true
+*** True Line Result
+    }
 ** Processing line: ~  end~
 - Inside source: true
 *** True Line Result
@@ -135579,22 +141275,42 @@ Follows is a source code listing for all files that have been open sourced. This
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~  def inputs_restart_game args~
+** Processing line: ~  def blinking_light_path_to_observatory args~
 - Inside source: true
 *** True Line Result
-  def inputs_restart_game args
-** Processing line: ~    if args.inputs.keyboard.exclamation_point~
+  def blinking_light_path_to_observatory args
+** Processing line: ~    {~
 - Inside source: true
 *** True Line Result
-    if args.inputs.keyboard.exclamation_point
-** Processing line: ~      args.gtk.reset_state~
+    {
+** Processing line: ~      background: 'sprites/path-to-observatory.png',~
 - Inside source: true
 *** True Line Result
-      args.gtk.reset_state
-** Processing line: ~    end~
+      background: 'sprites/path-to-observatory.png',
+** Processing line: ~      player: [60, 4],~
 - Inside source: true
 *** True Line Result
-    end
+      player: [60, 4],
+** Processing line: ~      scenes: [~
+- Inside source: true
+*** True Line Result
+      scenes: [
+** Processing line: ~        [0, 26, 5, 5, :blinking_light_observatory]~
+- Inside source: true
+*** True Line Result
+        [0, 26, 5, 5, :blinking_light_observatory]
+** Processing line: ~      ],~
+- Inside source: true
+*** True Line Result
+      ],
+** Processing line: ~      render_override: :blinking_light_path_to_observatory_render~
+- Inside source: true
+*** True Line Result
+      render_override: :blinking_light_path_to_observatory_render
+** Processing line: ~    }~
+- Inside source: true
+*** True Line Result
+    }
 ** Processing line: ~  end~
 - Inside source: true
 *** True Line Result
@@ -135603,90 +141319,98 @@ Follows is a source code listing for all files that have been open sourced. This
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~  def inputs_change_word_delay args~
+** Processing line: ~  def blinking_light_observatory args~
 - Inside source: true
 *** True Line Result
-  def inputs_change_word_delay args
-** Processing line: ~    if args.inputs.keyboard.key_down.plus || args.inputs.keyboard.key_down.equal_sign~
+  def blinking_light_observatory args
+** Processing line: ~    {~
 - Inside source: true
 *** True Line Result
-    if args.inputs.keyboard.key_down.plus || args.inputs.keyboard.key_down.equal_sign
-** Processing line: ~      args.state.word_delay -= 2~
+    {
+** Processing line: ~      background: 'sprites/observatory.png',~
 - Inside source: true
 *** True Line Result
-      args.state.word_delay -= 2
-** Processing line: ~      if args.state.word_delay < 0~
+      background: 'sprites/observatory.png',
+** Processing line: ~      player: [60, 2],~
 - Inside source: true
 *** True Line Result
-      if args.state.word_delay < 0
-** Processing line: ~        args.state.word_delay = 0~
+      player: [60, 2],
+** Processing line: ~      scenes: [~
 - Inside source: true
 *** True Line Result
-        args.state.word_delay = 0
-** Processing line: ~        # queue_storyline_text args, "Text speed at MAXIMUM. Geez, how fast do you read?"~
+      scenes: [
+** Processing line: ~        [28, 39, 4, 10, :blinking_light_inside_observatory]~
 - Inside source: true
 *** True Line Result
-        # queue_storyline_text args, "Text speed at MAXIMUM. Geez, how fast do you read?"
-** Processing line: ~      else~
+        [28, 39, 4, 10, :blinking_light_inside_observatory]
+** Processing line: ~      ],~
 - Inside source: true
 *** True Line Result
-      else
-** Processing line: ~        # queue_storyline_text args, "Text speed INCREASED."~
+      ],
+** Processing line: ~      render_override: :blinking_light_observatory_render~
 - Inside source: true
 *** True Line Result
-        # queue_storyline_text args, "Text speed INCREASED."
-** Processing line: ~      end~
+      render_override: :blinking_light_observatory_render
+** Processing line: ~    }~
 - Inside source: true
 *** True Line Result
-      end
-** Processing line: ~    end~
+    }
+** Processing line: ~  end~
 - Inside source: true
 *** True Line Result
-    end
+  end
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~    if args.inputs.keyboard.key_down.hyphen || args.inputs.keyboard.key_down.underscore~
+** Processing line: ~  def blinking_light_inside_observatory args~
 - Inside source: true
 *** True Line Result
-    if args.inputs.keyboard.key_down.hyphen || args.inputs.keyboard.key_down.underscore
-** Processing line: ~      args.state.word_delay += 2~
+  def blinking_light_inside_observatory args
+** Processing line: ~    {~
 - Inside source: true
 *** True Line Result
-      args.state.word_delay += 2
-** Processing line: ~      # queue_storyline_text args, "Text speed DECREASED."~
+    {
+** Processing line: ~      background: 'sprites/inside-observatory.png',~
 - Inside source: true
 *** True Line Result
-      # queue_storyline_text args, "Text speed DECREASED."
-** Processing line: ~    end~
+      background: 'sprites/inside-observatory.png',
+** Processing line: ~      player: [60, 2],~
 - Inside source: true
 *** True Line Result
-    end
-** Processing line: ~  end~
+      player: [60, 2],
+** Processing line: ~      storylines: [~
 - Inside source: true
 *** True Line Result
-  end
-** Processing line: ~~
+      storylines: [
+** Processing line: ~        [50, 2, 4, 8,   "That's weird. I thought- this- mainframe-- was broken--."]~
+- Inside source: true
+*** True Line Result
+        [50, 2, 4, 8,   "That's weird. I thought- this- mainframe-- was broken--."]
+** Processing line: ~      ],~
+- Inside source: true
+*** True Line Result
+      ],
+** Processing line: ~      scenes: [~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~  def multiple_lines args, x, y, texts, size = 0, minimum_alpha = nil~
+      scenes: [
+** Processing line: ~        [30, 18, 5, 12, :blinking_light_inside_mainframe]~
 - Inside source: true
 *** True Line Result
-  def multiple_lines args, x, y, texts, size = 0, minimum_alpha = nil
-** Processing line: ~    texts.each_with_index.map do |t, i|~
+        [30, 18, 5, 12, :blinking_light_inside_mainframe]
+** Processing line: ~      ],~
 - Inside source: true
 *** True Line Result
-    texts.each_with_index.map do |t, i|
-** Processing line: ~      [x, y - i * (25 + size * 2), t, size, 0, 255, 255, 255, adornments_alpha(args, 255, minimum_alpha)]~
+      ],
+** Processing line: ~      render_override: :blinking_light_inside_observatory_render~
 - Inside source: true
 *** True Line Result
-      [x, y - i * (25 + size * 2), t, size, 0, 255, 255, 255, adornments_alpha(args, 255, minimum_alpha)]
-** Processing line: ~    end~
+      render_override: :blinking_light_inside_observatory_render
+** Processing line: ~    }~
 - Inside source: true
 *** True Line Result
-    end
+    }
 ** Processing line: ~  end~
 - Inside source: true
 *** True Line Result
@@ -135695,66 +141419,66 @@ Follows is a source code listing for all files that have been open sourced. This
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~  def lowrez_tick args, lowrez_sprites, lowrez_labels, lowrez_borders, lowrez_solids, lowrez_mouse~
+** Processing line: ~  def blinking_light_inside_mainframe args~
 - Inside source: true
 *** True Line Result
-  def lowrez_tick args, lowrez_sprites, lowrez_labels, lowrez_borders, lowrez_solids, lowrez_mouse
-** Processing line: ~    # args.state.show_gridlines = true~
+  def blinking_light_inside_mainframe args
+** Processing line: ~    {~
 - Inside source: true
 *** True Line Result
-    # args.state.show_gridlines = true
-** Processing line: ~    defaults args~
+    {
+** Processing line: ~      background: 'sprites/mainframe.png',~
 - Inside source: true
 *** True Line Result
-    defaults args
-** Processing line: ~    render_current_scene args, lowrez_sprites, lowrez_labels, lowrez_solids~
+      background: 'sprites/mainframe.png',
+** Processing line: ~      fade: 60,~
 - Inside source: true
 *** True Line Result
-    render_current_scene args, lowrez_sprites, lowrez_labels, lowrez_solids
-** Processing line: ~    render_controller args, lowrez_borders~
+      fade: 60,
+** Processing line: ~      player: [30, 4],~
 - Inside source: true
 *** True Line Result
-    render_controller args, lowrez_borders
-** Processing line: ~    lowrez_solids << [0, 0, 64, 64, 0, 0, 0]~
+      player: [30, 4],
+** Processing line: ~      scenes: [~
 - Inside source: true
 *** True Line Result
-    lowrez_solids << [0, 0, 64, 64, 0, 0, 0]
-** Processing line: ~    calc_storyline_presentation args~
+      scenes: [
+** Processing line: ~        [62, 32, 4, 32, :reply_to_introduction]~
 - Inside source: true
 *** True Line Result
-    calc_storyline_presentation args
-** Processing line: ~    calc_scenes args~
+        [62, 32, 4, 32, :reply_to_introduction]
+** Processing line: ~      ],~
 - Inside source: true
 *** True Line Result
-    calc_scenes args
-** Processing line: ~    calc_storyline_hotspot args~
+      ],
+** Processing line: ~      storylines: [~
 - Inside source: true
 *** True Line Result
-    calc_storyline_hotspot args
-** Processing line: ~    inputs_move_player args~
+      storylines: [
+** Processing line: ~        [43, 43,  8, 8, "\"Mission-- control--, your- main- comm-- channels-- seem-- to be down. My apologies-- for- using-- this low- level-- exploit--. What's-- going-- on down there? We are ready-- for reentry--.\" Message--- Timestamp---: 4- hours-- 23--- minutes-- ago--."],~
 - Inside source: true
 *** True Line Result
-    inputs_move_player args
-** Processing line: ~    inputs_print_mouse_rect args, lowrez_mouse~
+        [43, 43,  8, 8, "\"Mission-- control--, your- main- comm-- channels-- seem-- to be down. My apologies-- for- using-- this low- level-- exploit--. What's-- going-- on down there? We are ready-- for reentry--.\" Message--- Timestamp---: 4- hours-- 23--- minutes-- ago--."],
+** Processing line: ~        [30, 30,  4, 4, "There's-- a low- level-- message-- here... NANI.T.F?"],~
 - Inside source: true
 *** True Line Result
-    inputs_print_mouse_rect args, lowrez_mouse
-** Processing line: ~    inputs_reload_current_scene args~
+        [30, 30,  4, 4, "There's-- a low- level-- message-- here... NANI.T.F?"],
+** Processing line: ~        [14, 10, 24, 4, "Oh interesting---. This transistor--- needed-- to be activated--- for the- mainframe-- to work."],~
 - Inside source: true
 *** True Line Result
-    inputs_reload_current_scene args
-** Processing line: ~    inputs_dismiss_current_storyline args~
+        [14, 10, 24, 4, "Oh interesting---. This transistor--- needed-- to be activated--- for the- mainframe-- to work."],
+** Processing line: ~        [14, 20, 24, 4, "What the heck activated--- this thing- though?"]~
 - Inside source: true
 *** True Line Result
-    inputs_dismiss_current_storyline args
-** Processing line: ~    inputs_change_word_delay args~
+        [14, 20, 24, 4, "What the heck activated--- this thing- though?"]
+** Processing line: ~      ]~
 - Inside source: true
 *** True Line Result
-    inputs_change_word_delay args
-** Processing line: ~    inputs_restart_game args~
+      ]
+** Processing line: ~    }~
 - Inside source: true
 *** True Line Result
-    inputs_restart_game args
+    }
 ** Processing line: ~  end~
 - Inside source: true
 *** True Line Result
@@ -135763,42 +141487,74 @@ Follows is a source code listing for all files that have been open sourced. This
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~  def render_controller args, lowrez_borders~
+** Processing line: ~#+end_src~
+- Line was identified as the end of a code block.
+*** True Line Result
+#+end_src
+** Processing line: ~~
+- End of paragraph detected.
+*** True Line Result
+
+** Processing line: ~*** Rpg Narrative - Return Of Serenity - storyline_day_one.rb~
+- Header detected.
+*** True Line Result
+
+*** True Line Result
+*** Rpg Narrative - Return Of Serenity - storyline_day_one.rb
+** Processing line: ~#+begin_src ruby~
+- Line was identified as the beginning of a code block.
+*** True Line Result
+
+*** True Line Result
+#+begin_src ruby
+** Processing line: ~  # ./samples/99_genre_rpg_narrative/return_of_serenity/app/storyline_day_one.rb~
 - Inside source: true
 *** True Line Result
-  def render_controller args, lowrez_borders
-** Processing line: ~    args.state.up_button    = [85, 40, 15, 15, 255, 255, 255]~
+  # ./samples/99_genre_rpg_narrative/return_of_serenity/app/storyline_day_one.rb
+** Processing line: ~  def day_one_beginning args~
 - Inside source: true
 *** True Line Result
-    args.state.up_button    = [85, 40, 15, 15, 255, 255, 255]
-** Processing line: ~    args.state.down_button  = [85, 20, 15, 15, 255, 255, 255]~
+  def day_one_beginning args
+** Processing line: ~    {~
 - Inside source: true
 *** True Line Result
-    args.state.down_button  = [85, 20, 15, 15, 255, 255, 255]
-** Processing line: ~    args.state.left_button  = [65, 20, 15, 15, 255, 255, 255]~
+    {
+** Processing line: ~      background: 'sprites/side-of-home.png',~
 - Inside source: true
 *** True Line Result
-    args.state.left_button  = [65, 20, 15, 15, 255, 255, 255]
-** Processing line: ~    args.state.right_button = [105, 20, 15, 15, 255, 255, 255]~
+      background: 'sprites/side-of-home.png',
+** Processing line: ~      player: [16, 13],~
 - Inside source: true
 *** True Line Result
-    args.state.right_button = [105, 20, 15, 15, 255, 255, 255]
-** Processing line: ~    lowrez_borders << args.state.up_button~
+      player: [16, 13],
+** Processing line: ~      scenes: [~
 - Inside source: true
 *** True Line Result
-    lowrez_borders << args.state.up_button
-** Processing line: ~    lowrez_borders << args.state.down_button~
+      scenes: [
+** Processing line: ~        [0, 0, 64, 2, :day_one_infront_of_home],~
 - Inside source: true
 *** True Line Result
-    lowrez_borders << args.state.down_button
-** Processing line: ~    lowrez_borders << args.state.left_button~
+        [0, 0, 64, 2, :day_one_infront_of_home],
+** Processing line: ~      ],~
 - Inside source: true
 *** True Line Result
-    lowrez_borders << args.state.left_button
-** Processing line: ~    lowrez_borders << args.state.right_button~
+      ],
+** Processing line: ~      storylines: [~
 - Inside source: true
 *** True Line Result
-    lowrez_borders << args.state.right_button
+      storylines: [
+** Processing line: ~        [35, 10, 6, 6,  "Man. Hard to believe- that today- is the 20th--- anniversary-- of The Impact."]~
+- Inside source: true
+*** True Line Result
+        [35, 10, 6, 6,  "Man. Hard to believe- that today- is the 20th--- anniversary-- of The Impact."]
+** Processing line: ~      ]~
+- Inside source: true
+*** True Line Result
+      ]
+** Processing line: ~    }~
+- Inside source: true
+*** True Line Result
+    }
 ** Processing line: ~  end~
 - Inside source: true
 *** True Line Result
@@ -135807,258 +141563,266 @@ Follows is a source code listing for all files that have been open sourced. This
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~  def inputs_print_mouse_rect args, lowrez_mouse~
+** Processing line: ~  def day_one_infront_of_home args~
 - Inside source: true
 *** True Line Result
-  def inputs_print_mouse_rect args, lowrez_mouse
-** Processing line: ~    if lowrez_mouse.up~
+  def day_one_infront_of_home args
+** Processing line: ~    {~
 - Inside source: true
 *** True Line Result
-    if lowrez_mouse.up
-** Processing line: ~      args.state.mouse_held = false~
+    {
+** Processing line: ~      background: 'sprites/front-of-home.png',~
 - Inside source: true
 *** True Line Result
-      args.state.mouse_held = false
-** Processing line: ~    elsif lowrez_mouse.click~
+      background: 'sprites/front-of-home.png',
+** Processing line: ~      player: [56, 23],~
 - Inside source: true
 *** True Line Result
-    elsif lowrez_mouse.click
-** Processing line: ~      mouse_rect = [lowrez_mouse.x, lowrez_mouse.y, 1, 1]~
+      player: [56, 23],
+** Processing line: ~      scenes: [~
 - Inside source: true
 *** True Line Result
-      mouse_rect = [lowrez_mouse.x, lowrez_mouse.y, 1, 1]
-** Processing line: ~      if args.state.up_button.intersect_rect? mouse_rect~
+      scenes: [
+** Processing line: ~        [43, 34, 10, 16, :day_one_home],~
 - Inside source: true
 *** True Line Result
-      if args.state.up_button.intersect_rect? mouse_rect
-** Processing line: ~        args.state.player.y += 1~
+        [43, 34, 10, 16, :day_one_home],
+** Processing line: ~        [62, 0,  3, 40, :day_one_beginning],~
 - Inside source: true
 *** True Line Result
-        args.state.player.y += 1
-** Processing line: ~      end~
+        [62, 0,  3, 40, :day_one_beginning],
+** Processing line: ~        [0, 4, 3, 20, :day_one_ceremony]~
 - Inside source: true
 *** True Line Result
-      end
-** Processing line: ~~
+        [0, 4, 3, 20, :day_one_ceremony]
+** Processing line: ~      ],~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~      if args.state.down_button.intersect_rect? mouse_rect~
+      ],
+** Processing line: ~      storylines: [~
 - Inside source: true
 *** True Line Result
-      if args.state.down_button.intersect_rect? mouse_rect
-** Processing line: ~        args.state.player.y -= 1~
+      storylines: [
+** Processing line: ~        [40, 20, 4, 4, "It looks like everyone- is already- at the rememberance-- ceremony."],~
 - Inside source: true
 *** True Line Result
-        args.state.player.y -= 1
-** Processing line: ~      end~
+        [40, 20, 4, 4, "It looks like everyone- is already- at the rememberance-- ceremony."],
+** Processing line: ~      ]~
 - Inside source: true
 *** True Line Result
-      end
+      ]
+** Processing line: ~    }~
+- Inside source: true
+*** True Line Result
+    }
+** Processing line: ~  end~
+- Inside source: true
+*** True Line Result
+  end
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~      if args.state.left_button.intersect_rect? mouse_rect~
+** Processing line: ~  def day_one_home args~
 - Inside source: true
 *** True Line Result
-      if args.state.left_button.intersect_rect? mouse_rect
-** Processing line: ~        args.state.player.x -= 1~
+  def day_one_home args
+** Processing line: ~    {~
 - Inside source: true
 *** True Line Result
-        args.state.player.x -= 1
-** Processing line: ~      end~
+    {
+** Processing line: ~      background: 'sprites/inside-home.png',~
 - Inside source: true
 *** True Line Result
-      end
-** Processing line: ~~
+      background: 'sprites/inside-home.png',
+** Processing line: ~      player: [34, 3],~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~      if args.state.right_button.intersect_rect? mouse_rect~
+      player: [34, 3],
+** Processing line: ~      scenes: [~
 - Inside source: true
 *** True Line Result
-      if args.state.right_button.intersect_rect? mouse_rect
-** Processing line: ~        args.state.player.x += 1~
+      scenes: [
+** Processing line: ~        [28, 0, 12, 2, :day_one_infront_of_home]~
 - Inside source: true
 *** True Line Result
-        args.state.player.x += 1
-** Processing line: ~      end~
+        [28, 0, 12, 2, :day_one_infront_of_home]
+** Processing line: ~      ],~
 - Inside source: true
 *** True Line Result
-      end
-** Processing line: ~      args.state.mouse_held = true~
+      ],
+** Processing line: ~      storylines: [~
 - Inside source: true
 *** True Line Result
-      args.state.mouse_held = true
-** Processing line: ~    elsif args.state.mouse_held~
+      storylines: [
+** Processing line: ~        [~
 - Inside source: true
 *** True Line Result
-    elsif args.state.mouse_held
-** Processing line: ~      mouse_rect = [lowrez_mouse.x, lowrez_mouse.y, 1, 1]~
+        [
+** Processing line: ~          38, 4, 4, 4, "My mansion- in all its glory! Okay yea, it's just a shipping- container-. Apparently-, it's nothing- like the luxuries- of the 2040's. But it's- all we have- in- this day and age. And it'll suffice."~
 - Inside source: true
 *** True Line Result
-      mouse_rect = [lowrez_mouse.x, lowrez_mouse.y, 1, 1]
-** Processing line: ~      if args.state.up_button.intersect_rect? mouse_rect~
+          38, 4, 4, 4, "My mansion- in all its glory! Okay yea, it's just a shipping- container-. Apparently-, it's nothing- like the luxuries- of the 2040's. But it's- all we have- in- this day and age. And it'll suffice."
+** Processing line: ~        ],~
 - Inside source: true
 *** True Line Result
-      if args.state.up_button.intersect_rect? mouse_rect
-** Processing line: ~        args.state.player.y += 0.25~
+        ],
+** Processing line: ~        [~
 - Inside source: true
 *** True Line Result
-        args.state.player.y += 0.25
-** Processing line: ~      end~
+        [
+** Processing line: ~          28, 7, 4, 7,~
 - Inside source: true
 *** True Line Result
-      end
-** Processing line: ~~
+          28, 7, 4, 7,
+** Processing line: ~          "Ahhh. My reading- couch. It's so comfortable--."~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~      if args.state.down_button.intersect_rect? mouse_rect~
+          "Ahhh. My reading- couch. It's so comfortable--."
+** Processing line: ~        ],~
 - Inside source: true
 *** True Line Result
-      if args.state.down_button.intersect_rect? mouse_rect
-** Processing line: ~        args.state.player.y -= 0.25~
+        ],
+** Processing line: ~        [~
 - Inside source: true
 *** True Line Result
-        args.state.player.y -= 0.25
-** Processing line: ~      end~
+        [
+** Processing line: ~          38, 21, 4, 4,~
 - Inside source: true
 *** True Line Result
-      end
-** Processing line: ~~
+          38, 21, 4, 4,
+** Processing line: ~          "I'm- lucky- to have a computer--. I'm- one of the few people- with- the skills to put this- thing to good use."~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~      if args.state.left_button.intersect_rect? mouse_rect~
+          "I'm- lucky- to have a computer--. I'm- one of the few people- with- the skills to put this- thing to good use."
+** Processing line: ~        ],~
 - Inside source: true
 *** True Line Result
-      if args.state.left_button.intersect_rect? mouse_rect
-** Processing line: ~        args.state.player.x -= 0.25~
+        ],
+** Processing line: ~        [~
 - Inside source: true
 *** True Line Result
-        args.state.player.x -= 0.25
-** Processing line: ~      end~
+        [
+** Processing line: ~          45, 37, 4, 8,~
 - Inside source: true
 *** True Line Result
-      end
-** Processing line: ~~
+          45, 37, 4, 8,
+** Processing line: ~          "This corner- of my home- is always- warmer-. It's cause of the ref~lected-- light- from the solar-- panels--, just on the other- side- of this wall. It's hard- to believe- there was o~nce-- an unlimited- amount- of electricity--."~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~      if args.state.right_button.intersect_rect? mouse_rect~
+          "This corner- of my home- is always- warmer-. It's cause of the ref~lected-- light- from the solar-- panels--, just on the other- side- of this wall. It's hard- to believe- there was o~nce-- an unlimited- amount- of electricity--."
+** Processing line: ~        ],~
 - Inside source: true
 *** True Line Result
-      if args.state.right_button.intersect_rect? mouse_rect
-** Processing line: ~        args.state.player.x += 0.25~
+        ],
+** Processing line: ~        [~
 - Inside source: true
 *** True Line Result
-        args.state.player.x += 0.25
-** Processing line: ~      end~
+        [
+** Processing line: ~          32, 40, 8, 10,~
 - Inside source: true
 *** True Line Result
-      end
-** Processing line: ~    end~
+          32, 40, 8, 10,
+** Processing line: ~          "This isn't- a good time- to sleep. I- should probably- head to the ceremony-."~
 - Inside source: true
 *** True Line Result
-    end
-** Processing line: ~~
+          "This isn't- a good time- to sleep. I- should probably- head to the ceremony-."
+** Processing line: ~        ],~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~    if lowrez_mouse.click~
+        ],
+** Processing line: ~        [~
 - Inside source: true
 *** True Line Result
-    if lowrez_mouse.click
-** Processing line: ~      dx = lowrez_mouse.click.x - args.state.previous_mouse_click.x~
+        [
+** Processing line: ~          25, 21, 5, 12,~
 - Inside source: true
 *** True Line Result
-      dx = lowrez_mouse.click.x - args.state.previous_mouse_click.x
-** Processing line: ~      dy = lowrez_mouse.click.y - args.state.previous_mouse_click.y~
+          25, 21, 5, 12,
+** Processing line: ~          "Fifteen-- years- of computer-- science-- notes, neatly-- organized. Compiler--- Theory--, Linear--- Algebra---, Game-- Development---... Every-- subject-- imaginable--."~
 - Inside source: true
 *** True Line Result
-      dy = lowrez_mouse.click.y - args.state.previous_mouse_click.y
-** Processing line: ~      x, y, w, h = args.state.previous_mouse_click.x, args.state.previous_mouse_click.y, dx, dy~
+          "Fifteen-- years- of computer-- science-- notes, neatly-- organized. Compiler--- Theory--, Linear--- Algebra---, Game-- Development---... Every-- subject-- imaginable--."
+** Processing line: ~        ]~
 - Inside source: true
 *** True Line Result
-      x, y, w, h = args.state.previous_mouse_click.x, args.state.previous_mouse_click.y, dx, dy
-** Processing line: ~      puts "x #{lowrez_mouse.click.x}, y: #{lowrez_mouse.click.y}"~
+        ]
+** Processing line: ~      ]~
 - Inside source: true
 *** True Line Result
-      puts "x #{lowrez_mouse.click.x}, y: #{lowrez_mouse.click.y}"
-** Processing line: ~      if args.state.previous_mouse_click~
+      ]
+** Processing line: ~    }~
 - Inside source: true
 *** True Line Result
-      if args.state.previous_mouse_click
-** Processing line: ~~
+    }
+** Processing line: ~  end~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~        if dx < 0 && dx < 0~
+  end
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-        if dx < 0 && dx < 0
-** Processing line: ~          x = x + w~
+
+** Processing line: ~  def day_one_ceremony args~
 - Inside source: true
 *** True Line Result
-          x = x + w
-** Processing line: ~          w = w.abs~
+  def day_one_ceremony args
+** Processing line: ~    {~
 - Inside source: true
 *** True Line Result
-          w = w.abs
-** Processing line: ~          y = y + h~
+    {
+** Processing line: ~      background: 'sprites/tribute.png',~
 - Inside source: true
 *** True Line Result
-          y = y + h
-** Processing line: ~          h = h.abs~
+      background: 'sprites/tribute.png',
+** Processing line: ~      player: [57, 21],~
 - Inside source: true
 *** True Line Result
-          h = h.abs
-** Processing line: ~        end~
+      player: [57, 21],
+** Processing line: ~      scenes: [~
 - Inside source: true
 *** True Line Result
-        end
-** Processing line: ~~
+      scenes: [
+** Processing line: ~        [62, 0, 2, 40, :day_one_infront_of_home],~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~        w += 1~
+        [62, 0, 2, 40, :day_one_infront_of_home],
+** Processing line: ~        [0, 24, 2, 40, :day_one_infront_of_library]~
 - Inside source: true
 *** True Line Result
-        w += 1
-** Processing line: ~        h += 1~
+        [0, 24, 2, 40, :day_one_infront_of_library]
+** Processing line: ~      ],~
 - Inside source: true
 *** True Line Result
-        h += 1
-** Processing line: ~~
+      ],
+** Processing line: ~      storylines: [~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~        args.state.previous_mouse_click = nil~
+      storylines: [
+** Processing line: ~        [53, 12, 3,  8,  "It's- been twenty- years since The Impact. Twenty- years, since Halley's-- Comet-- set Earth's- blue- sky on fire."],~
 - Inside source: true
 *** True Line Result
-        args.state.previous_mouse_click = nil
-** Processing line: ~      else~
+        [53, 12, 3,  8,  "It's- been twenty- years since The Impact. Twenty- years, since Halley's-- Comet-- set Earth's- blue- sky on fire."],
+** Processing line: ~        [45, 12, 3,  8,  "The space mission- sent to prevent- Earth's- total- destruction--, was a success. Only- 99.9%------ of the world's- population-- died-- that day. Hey, it's- better-- than 100%---- of humanity-- dying."],~
 - Inside source: true
 *** True Line Result
-      else
-** Processing line: ~        args.state.previous_mouse_click = lowrez_mouse.click~
+        [45, 12, 3,  8,  "The space mission- sent to prevent- Earth's- total- destruction--, was a success. Only- 99.9%------ of the world's- population-- died-- that day. Hey, it's- better-- than 100%---- of humanity-- dying."],
+** Processing line: ~        [20, 12, 23, 4, "The monument--- reads:---- Here- stands- the tribute-- to Space- Mission-- Serenity--- and- its- crew. You- have- given-- humanity--- a second-- chance."],~
 - Inside source: true
 *** True Line Result
-        args.state.previous_mouse_click = lowrez_mouse.click
-** Processing line: ~        square_x, square_y = lowrez_mouse.click~
+        [20, 12, 23, 4, "The monument--- reads:---- Here- stands- the tribute-- to Space- Mission-- Serenity--- and- its- crew. You- have- given-- humanity--- a second-- chance."],
+** Processing line: ~        [15, 12, 3,  8, "Rest- in- peace--- Matthew----, Sasha----, Aanka----"],~
 - Inside source: true
 *** True Line Result
-        square_x, square_y = lowrez_mouse.click
-** Processing line: ~      end~
+        [15, 12, 3,  8, "Rest- in- peace--- Matthew----, Sasha----, Aanka----"],
+** Processing line: ~      ]~
 - Inside source: true
 *** True Line Result
-      end
-** Processing line: ~    end~
+      ]
+** Processing line: ~    }~
 - Inside source: true
 *** True Line Result
-    end
+    }
 ** Processing line: ~  end~
 - Inside source: true
 *** True Line Result
@@ -136067,54 +141831,54 @@ Follows is a source code listing for all files that have been open sourced. This
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~  def try_centering! word~
+** Processing line: ~  def day_one_infront_of_library args~
 - Inside source: true
 *** True Line Result
-  def try_centering! word
-** Processing line: ~    word ||= ""~
+  def day_one_infront_of_library args
+** Processing line: ~    {~
 - Inside source: true
 *** True Line Result
-    word ||= ""
-** Processing line: ~    just_word = word.gsub("-", "").gsub(",", "").gsub(".", "").gsub("'", "").gsub('""', "\"-\"")~
+    {
+** Processing line: ~      background: 'sprites/outside-library.png',~
 - Inside source: true
 *** True Line Result
-    just_word = word.gsub("-", "").gsub(",", "").gsub(".", "").gsub("'", "").gsub('""', "\"-\"")
-** Processing line: ~    return word if just_word.strip.length == 0~
+      background: 'sprites/outside-library.png',
+** Processing line: ~      player: [57, 21],~
 - Inside source: true
 *** True Line Result
-    return word if just_word.strip.length == 0
-** Processing line: ~    return word if just_word.include? "~"~
+      player: [57, 21],
+** Processing line: ~      scenes: [~
 - Inside source: true
 *** True Line Result
-    return word if just_word.include? "~"
-** Processing line: ~    return "~#{word}" if just_word.length <= 2~
+      scenes: [
+** Processing line: ~        [62, 0, 2, 40, :day_one_ceremony],~
 - Inside source: true
 *** True Line Result
-    return "~#{word}" if just_word.length <= 2
-** Processing line: ~    if just_word.length.mod_zero? 2~
+        [62, 0, 2, 40, :day_one_ceremony],
+** Processing line: ~        [49, 39, 6, 9, :day_one_library]~
 - Inside source: true
 *** True Line Result
-    if just_word.length.mod_zero? 2
-** Processing line: ~      center_index = just_word.length.idiv(2) - 1~
+        [49, 39, 6, 9, :day_one_library]
+** Processing line: ~      ],~
 - Inside source: true
 *** True Line Result
-      center_index = just_word.length.idiv(2) - 1
-** Processing line: ~    else~
+      ],
+** Processing line: ~      storylines: [~
 - Inside source: true
 *** True Line Result
-    else
-** Processing line: ~      center_index = (just_word.length - 1).idiv(2)~
+      storylines: [
+** Processing line: ~        [50, 20, 4, 8,  "Shipping- containers-- as far- as the eye- can see. It's- rather- beautiful-- if you ask me. Even- though-- this- view- represents-- all- that's-- left- of humanity-."]~
 - Inside source: true
 *** True Line Result
-      center_index = (just_word.length - 1).idiv(2)
-** Processing line: ~    end~
+        [50, 20, 4, 8,  "Shipping- containers-- as far- as the eye- can see. It's- rather- beautiful-- if you ask me. Even- though-- this- view- represents-- all- that's-- left- of humanity-."]
+** Processing line: ~      ]~
 - Inside source: true
 *** True Line Result
-    end
-** Processing line: ~    return "#{word[0..center_index - 1]}~#{word[center_index]}#{word[center_index + 1..-1]}"~
+      ]
+** Processing line: ~    }~
 - Inside source: true
 *** True Line Result
-    return "#{word[0..center_index - 1]}~#{word[center_index]}#{word[center_index + 1..-1]}"
+    }
 ** Processing line: ~  end~
 - Inside source: true
 *** True Line Result
@@ -136123,158 +141887,162 @@ Follows is a source code listing for all files that have been open sourced. This
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~  def queue_storyline args, scene~
+** Processing line: ~  def day_one_library args~
 - Inside source: true
 *** True Line Result
-  def queue_storyline args, scene
-** Processing line: ~    queue_storyline_text args, scene[:storyline]~
+  def day_one_library args
+** Processing line: ~    {~
 - Inside source: true
 *** True Line Result
-    queue_storyline_text args, scene[:storyline]
-** Processing line: ~  end~
+    {
+** Processing line: ~      background: 'sprites/library.png',~
 - Inside source: true
 *** True Line Result
-  end
-** Processing line: ~~
+      background: 'sprites/library.png',
+** Processing line: ~      player: [27, 4],~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~  def queue_storyline_text args, text~
+      player: [27, 4],
+** Processing line: ~      scenes: [~
 - Inside source: true
 *** True Line Result
-  def queue_storyline_text args, text
-** Processing line: ~    args.state.last_story_line_text = text~
+      scenes: [
+** Processing line: ~        [0, 0, 64, 2, :end_day_one_infront_of_library]~
 - Inside source: true
 *** True Line Result
-    args.state.last_story_line_text = text
-** Processing line: ~    args.state.storyline_history << text if text~
+        [0, 0, 64, 2, :end_day_one_infront_of_library]
+** Processing line: ~      ],~
 - Inside source: true
 *** True Line Result
-    args.state.storyline_history << text if text
-** Processing line: ~    words = (text || "").split(" ")~
+      ],
+** Processing line: ~      storylines: [~
 - Inside source: true
 *** True Line Result
-    words = (text || "").split(" ")
-** Processing line: ~    words = words.map { |w| try_centering! w }~
+      storylines: [
+** Processing line: ~        [28, 22, 8, 4,  "I grew- up- in this library. I've- read every- book- here. My favorites-- were- of course-- anything- computer-- related."],~
 - Inside source: true
 *** True Line Result
-    words = words.map { |w| try_centering! w }
-** Processing line: ~    args.state.scene_storyline_queue = words~
+        [28, 22, 8, 4,  "I grew- up- in this library. I've- read every- book- here. My favorites-- were- of course-- anything- computer-- related."],
+** Processing line: ~        [6, 32, 10, 6, "My favorite-- area--- of the library. The Science-- Section."]~
 - Inside source: true
 *** True Line Result
-    args.state.scene_storyline_queue = words
-** Processing line: ~    if args.state.scene_storyline_queue.length != 0~
+        [6, 32, 10, 6, "My favorite-- area--- of the library. The Science-- Section."]
+** Processing line: ~      ]~
 - Inside source: true
 *** True Line Result
-    if args.state.scene_storyline_queue.length != 0
-** Processing line: ~      args.state.scene_storyline_queue.unshift "~$--"~
+      ]
+** Processing line: ~    }~
 - Inside source: true
 *** True Line Result
-      args.state.scene_storyline_queue.unshift "~$--"
-** Processing line: ~      args.state.storyline_to_show = "~."~
+    }
+** Processing line: ~  end~
 - Inside source: true
 *** True Line Result
-      args.state.storyline_to_show = "~."
-** Processing line: ~    else~
+  end
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-    else
-** Processing line: ~      args.state.storyline_to_show = ""~
+
+** Processing line: ~  def end_day_one_infront_of_library args~
 - Inside source: true
 *** True Line Result
-      args.state.storyline_to_show = ""
-** Processing line: ~    end~
+  def end_day_one_infront_of_library args
+** Processing line: ~    {~
 - Inside source: true
 *** True Line Result
-    end
-** Processing line: ~    args.state.scene_storyline_queue << ""~
+    {
+** Processing line: ~      background: 'sprites/outside-library.png',~
 - Inside source: true
 *** True Line Result
-    args.state.scene_storyline_queue << ""
-** Processing line: ~    args.state.next_storyline = args.state.tick_count~
+      background: 'sprites/outside-library.png',
+** Processing line: ~      player: [51, 33],~
 - Inside source: true
 *** True Line Result
-    args.state.next_storyline = args.state.tick_count
-** Processing line: ~  end~
+      player: [51, 33],
+** Processing line: ~      scenes: [~
 - Inside source: true
 *** True Line Result
-  end
-** Processing line: ~~
+      scenes: [
+** Processing line: ~        [49, 39, 6, 9, :day_one_library],~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~  def set_scene args, scene~
+        [49, 39, 6, 9, :day_one_library],
+** Processing line: ~        [62, 0, 2, 40, :end_day_one_monument],~
 - Inside source: true
 *** True Line Result
-  def set_scene args, scene
-** Processing line: ~    args.state.current_scene = scene~
+        [62, 0, 2, 40, :end_day_one_monument],
+** Processing line: ~      ],~
 - Inside source: true
 *** True Line Result
-    args.state.current_scene = scene
-** Processing line: ~    args.state.background = scene[:background] ||  'sprites/todo.png'~
+      ],
+** Processing line: ~      storylines: [~
 - Inside source: true
 *** True Line Result
-    args.state.background = scene[:background] ||  'sprites/todo.png'
-** Processing line: ~    args.state.scene_fade = scene[:fade] || 0~
+      storylines: [
+** Processing line: ~        [50, 27, 4, 4, "It's getting late. Better get some sleep."]~
 - Inside source: true
 *** True Line Result
-    args.state.scene_fade = scene[:fade] || 0
-** Processing line: ~    args.state.scenes = (scene[:scenes] || []).reject { |s| !s }~
+        [50, 27, 4, 4, "It's getting late. Better get some sleep."]
+** Processing line: ~      ]~
 - Inside source: true
 *** True Line Result
-    args.state.scenes = (scene[:scenes] || []).reject { |s| !s }
-** Processing line: ~    args.state.scene_render_override = scene[:render_override]~
+      ]
+** Processing line: ~    }~
 - Inside source: true
 *** True Line Result
-    args.state.scene_render_override = scene[:render_override]
-** Processing line: ~    args.state.storylines = (scene[:storylines] || []).reject { |s| !s }~
+    }
+** Processing line: ~  end~
 - Inside source: true
 *** True Line Result
-    args.state.storylines = (scene[:storylines] || []).reject { |s| !s }
-** Processing line: ~    args.state.scene_changed_at = args.state.tick_count~
+  end
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-    args.state.scene_changed_at = args.state.tick_count
-** Processing line: ~    if scene[:player]~
+
+** Processing line: ~  def end_day_one_monument args~
 - Inside source: true
 *** True Line Result
-    if scene[:player]
-** Processing line: ~      args.state.player = scene[:player]~
+  def end_day_one_monument args
+** Processing line: ~    {~
 - Inside source: true
 *** True Line Result
-      args.state.player = scene[:player]
-** Processing line: ~    end~
+    {
+** Processing line: ~      background: 'sprites/tribute.png',~
 - Inside source: true
 *** True Line Result
-    end
-** Processing line: ~    args.state.inside_scene_hotspot = false~
+      background: 'sprites/tribute.png',
+** Processing line: ~      player: [2, 36],~
 - Inside source: true
 *** True Line Result
-    args.state.inside_scene_hotspot = false
-** Processing line: ~    args.state.inside_storyline_hotspot = false~
+      player: [2, 36],
+** Processing line: ~      scenes: [~
 - Inside source: true
 *** True Line Result
-    args.state.inside_storyline_hotspot = false
-** Processing line: ~    queue_storyline args, scene~
+      scenes: [
+** Processing line: ~        [62, 0, 2, 40, :end_day_one_infront_of_home],~
 - Inside source: true
 *** True Line Result
-    queue_storyline args, scene
-** Processing line: ~  end~
+        [62, 0, 2, 40, :end_day_one_infront_of_home],
+** Processing line: ~      ],~
 - Inside source: true
 *** True Line Result
-  end
-** Processing line: ~~
+      ],
+** Processing line: ~      storylines: [~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~  def replay_storyline_rect~
+      storylines: [
+** Processing line: ~        [50, 27, 4, 4, "It's getting late. Better get some sleep."],~
 - Inside source: true
 *** True Line Result
-  def replay_storyline_rect
-** Processing line: ~    [26, -1, 7, 4]~
+        [50, 27, 4, 4, "It's getting late. Better get some sleep."],
+** Processing line: ~      ]~
 - Inside source: true
 *** True Line Result
-    [26, -1, 7, 4]
+      ]
+** Processing line: ~    }~
+- Inside source: true
+*** True Line Result
+    }
 ** Processing line: ~  end~
 - Inside source: true
 *** True Line Result
@@ -136283,90 +142051,98 @@ Follows is a source code listing for all files that have been open sourced. This
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~  def labels_for_word word~
+** Processing line: ~  def end_day_one_infront_of_home args~
 - Inside source: true
 *** True Line Result
-  def labels_for_word word
-** Processing line: ~    left_side_of_word = ""~
+  def end_day_one_infront_of_home args
+** Processing line: ~    {~
 - Inside source: true
 *** True Line Result
-    left_side_of_word = ""
-** Processing line: ~    center_letter = ""~
+    {
+** Processing line: ~      background: 'sprites/front-of-home.png',~
 - Inside source: true
 *** True Line Result
-    center_letter = ""
-** Processing line: ~    right_side_of_word = ""~
+      background: 'sprites/front-of-home.png',
+** Processing line: ~      player: [1, 17],~
 - Inside source: true
 *** True Line Result
-    right_side_of_word = ""
-** Processing line: ~~
+      player: [1, 17],
+** Processing line: ~      scenes: [~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~    if word[0] == "~"~
+      scenes: [
+** Processing line: ~        [43, 34, 10, 16, :end_day_one_home],~
 - Inside source: true
 *** True Line Result
-    if word[0] == "~"
-** Processing line: ~      left_side_of_word = ""~
+        [43, 34, 10, 16, :end_day_one_home],
+** Processing line: ~      ],~
 - Inside source: true
 *** True Line Result
-      left_side_of_word = ""
-** Processing line: ~      center_letter = word[1]~
+      ],
+** Processing line: ~      storylines: [~
 - Inside source: true
 *** True Line Result
-      center_letter = word[1]
-** Processing line: ~      right_side_of_word = word[2..-1]~
+      storylines: [
+** Processing line: ~        [20, 10, 4, 4, "It's getting late. Better get some sleep."],~
 - Inside source: true
 *** True Line Result
-      right_side_of_word = word[2..-1]
-** Processing line: ~    elsif word.length > 0~
+        [20, 10, 4, 4, "It's getting late. Better get some sleep."],
+** Processing line: ~      ]~
 - Inside source: true
 *** True Line Result
-    elsif word.length > 0
-** Processing line: ~      left_side_of_word, right_side_of_word = word.split("~")~
+      ]
+** Processing line: ~    }~
 - Inside source: true
 *** True Line Result
-      left_side_of_word, right_side_of_word = word.split("~")
-** Processing line: ~      center_letter = right_side_of_word[0]~
+    }
+** Processing line: ~  end~
 - Inside source: true
 *** True Line Result
-      center_letter = right_side_of_word[0]
-** Processing line: ~      right_side_of_word = right_side_of_word[1..-1]~
+  end
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-      right_side_of_word = right_side_of_word[1..-1]
-** Processing line: ~    end~
+
+** Processing line: ~  def end_day_one_home args~
 - Inside source: true
 *** True Line Result
-    end
-** Processing line: ~~
+  def end_day_one_home args
+** Processing line: ~    {~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~    right_side_of_word = right_side_of_word.gsub("-", "")~
+    {
+** Processing line: ~      background: 'sprites/inside-home.png',~
 - Inside source: true
 *** True Line Result
-    right_side_of_word = right_side_of_word.gsub("-", "")
-** Processing line: ~~
+      background: 'sprites/inside-home.png',
+** Processing line: ~      player: [34, 3],~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~    {~
+      player: [34, 3],
+** Processing line: ~      scenes: [~
 - Inside source: true
 *** True Line Result
-    {
-** Processing line: ~      left:   [29 - left_side_of_word.length * 4 - 1 * left_side_of_word.length, 2, left_side_of_word],~
+      scenes: [
+** Processing line: ~        [32, 40, 8, 10, :end_day_one_dream],~
 - Inside source: true
 *** True Line Result
-      left:   [29 - left_side_of_word.length * 4 - 1 * left_side_of_word.length, 2, left_side_of_word],
-** Processing line: ~      center: [29, 2, center_letter, 255, 0, 0],~
+        [32, 40, 8, 10, :end_day_one_dream],
+** Processing line: ~      ],~
 - Inside source: true
 *** True Line Result
-      center: [29, 2, center_letter, 255, 0, 0],
-** Processing line: ~      right:  [34, 2, right_side_of_word]~
+      ],
+** Processing line: ~      storylines: [~
 - Inside source: true
 *** True Line Result
-      right:  [34, 2, right_side_of_word]
+      storylines: [
+** Processing line: ~        [38, 4, 4, 4, "It's getting late. Better get some sleep."],~
+- Inside source: true
+*** True Line Result
+        [38, 4, 4, 4, "It's getting late. Better get some sleep."],
+** Processing line: ~      ]~
+- Inside source: true
+*** True Line Result
+      ]
 ** Processing line: ~    }~
 - Inside source: true
 *** True Line Result
@@ -136379,70 +142155,62 @@ Follows is a source code listing for all files that have been open sourced. This
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~  def render_scenes args, lowrez_sprites~
-- Inside source: true
-*** True Line Result
-  def render_scenes args, lowrez_sprites
-** Processing line: ~    lowrez_sprites << args.state.scenes.flat_map do |hs|~
-- Inside source: true
-*** True Line Result
-    lowrez_sprites << args.state.scenes.flat_map do |hs|
-** Processing line: ~      hotspot_square args, hs.x, hs.y, hs.w, hs.h~
+** Processing line: ~  def end_day_one_dream args~
 - Inside source: true
 *** True Line Result
-      hotspot_square args, hs.x, hs.y, hs.w, hs.h
-** Processing line: ~    end~
+  def end_day_one_dream args
+** Processing line: ~    {~
 - Inside source: true
 *** True Line Result
-    end
-** Processing line: ~  end~
+    {
+** Processing line: ~      background: 'sprites/dream.png',~
 - Inside source: true
 *** True Line Result
-  end
-** Processing line: ~~
+      background: 'sprites/dream.png',
+** Processing line: ~      fade: 60,~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~  def render_storylines args, lowrez_sprites~
+      fade: 60,
+** Processing line: ~      player: [4, 4],~
 - Inside source: true
 *** True Line Result
-  def render_storylines args, lowrez_sprites
-** Processing line: ~    lowrez_sprites << args.state.storylines.flat_map do |hs|~
+      player: [4, 4],
+** Processing line: ~      scenes: [~
 - Inside source: true
 *** True Line Result
-    lowrez_sprites << args.state.storylines.flat_map do |hs|
-** Processing line: ~      hotspot_square args, hs.x, hs.y, hs.w, hs.h~
+      scenes: [
+** Processing line: ~        [62, 0, 2, 64, :explaining_the_special_power]~
 - Inside source: true
 *** True Line Result
-      hotspot_square args, hs.x, hs.y, hs.w, hs.h
-** Processing line: ~    end~
+        [62, 0, 2, 64, :explaining_the_special_power]
+** Processing line: ~      ],~
 - Inside source: true
 *** True Line Result
-    end
-** Processing line: ~  end~
+      ],
+** Processing line: ~      storylines: [~
 - Inside source: true
 *** True Line Result
-  end
-** Processing line: ~~
+      storylines: [
+** Processing line: ~        [10, 10, 4, 4, "Why- does this- moment-- always- haunt- my dreams?"],~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~  def adornments_alpha args, target_alpha = nil, minimum_alpha = nil~
+        [10, 10, 4, 4, "Why- does this- moment-- always- haunt- my dreams?"],
+** Processing line: ~        [20, 10, 4, 4, "This kid- reads these computer--- science--- books- nonstop-. What's- wrong with him?"],~
 - Inside source: true
 *** True Line Result
-  def adornments_alpha args, target_alpha = nil, minimum_alpha = nil
-** Processing line: ~    return (minimum_alpha || 80) unless args.state.storyline_queue_empty_at~
+        [20, 10, 4, 4, "This kid- reads these computer--- science--- books- nonstop-. What's- wrong with him?"],
+** Processing line: ~        [30, 10, 4, 4, "There- is nothing-- wrong- with him. This behavior-- should be encouraged---! In fact-, I think- he's- special---. Have- you seen- him use- a computer---? It's-- almost-- as if he can- speak-- to it."]~
 - Inside source: true
 *** True Line Result
-    return (minimum_alpha || 80) unless args.state.storyline_queue_empty_at
-** Processing line: ~    target_alpha ||= 255~
+        [30, 10, 4, 4, "There- is nothing-- wrong- with him. This behavior-- should be encouraged---! In fact-, I think- he's- special---. Have- you seen- him use- a computer---? It's-- almost-- as if he can- speak-- to it."]
+** Processing line: ~      ]~
 - Inside source: true
 *** True Line Result
-    target_alpha ||= 255
-** Processing line: ~    target_alpha * args.state.storyline_queue_empty_at.ease(60)~
+      ]
+** Processing line: ~    }~
 - Inside source: true
 *** True Line Result
-    target_alpha * args.state.storyline_queue_empty_at.ease(60)
+    }
 ** Processing line: ~  end~
 - Inside source: true
 *** True Line Result
@@ -136451,54 +142219,50 @@ Follows is a source code listing for all files that have been open sourced. This
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~  def hotspot_square args, x, y, w, h~
-- Inside source: true
-*** True Line Result
-  def hotspot_square args, x, y, w, h
-** Processing line: ~    if w >= 3 && h >= 3~
+** Processing line: ~  def explaining_the_special_power args~
 - Inside source: true
 *** True Line Result
-    if w >= 3 && h >= 3
-** Processing line: ~      [~
+  def explaining_the_special_power args
+** Processing line: ~    {~
 - Inside source: true
 *** True Line Result
-      [
-** Processing line: ~        [x + w.idiv(2) + 1, y, w.idiv(2), h, 'sprites/label-background.png', 0, adornments_alpha(args, 50), 23, 23, 23],~
+    {
+** Processing line: ~      fade: 60,~
 - Inside source: true
 *** True Line Result
-        [x + w.idiv(2) + 1, y, w.idiv(2), h, 'sprites/label-background.png', 0, adornments_alpha(args, 50), 23, 23, 23],
-** Processing line: ~        [x, y, w.idiv(2), h, 'sprites/label-background.png', 0, adornments_alpha(args, 100), 223, 223, 223],~
+      fade: 60,
+** Processing line: ~      background: 'sprites/inside-home.png',~
 - Inside source: true
 *** True Line Result
-        [x, y, w.idiv(2), h, 'sprites/label-background.png', 0, adornments_alpha(args, 100), 223, 223, 223],
-** Processing line: ~        [x + 1, y + 1, w - 2, h - 2, 'sprites/label-background.png', 0, adornments_alpha(args, 200), 40, 140, 40],~
+      background: 'sprites/inside-home.png',
+** Processing line: ~      player: [32, 30],~
 - Inside source: true
 *** True Line Result
-        [x + 1, y + 1, w - 2, h - 2, 'sprites/label-background.png', 0, adornments_alpha(args, 200), 40, 140, 40],
-** Processing line: ~      ]~
+      player: [32, 30],
+** Processing line: ~      scenes: [~
 - Inside source: true
 *** True Line Result
-      ]
-** Processing line: ~    else~
+      scenes: [
+** Processing line: ~        [~
 - Inside source: true
 *** True Line Result
-    else
-** Processing line: ~      [~
+        [
+** Processing line: ~          38, 21, 4, 4, :explaining_the_special_power_inside_computer~
 - Inside source: true
 *** True Line Result
-      [
-** Processing line: ~        [x, y, w, h, 'sprites/label-background.png', 0, adornments_alpha(args, 200), 0, 140, 0],~
+          38, 21, 4, 4, :explaining_the_special_power_inside_computer
+** Processing line: ~        ],~
 - Inside source: true
 *** True Line Result
-        [x, y, w, h, 'sprites/label-background.png', 0, adornments_alpha(args, 200), 0, 140, 0],
+        ],
 ** Processing line: ~      ]~
 - Inside source: true
 *** True Line Result
       ]
-** Processing line: ~    end~
+** Processing line: ~    }~
 - Inside source: true
 *** True Line Result
-    end
+    }
 ** Processing line: ~  end~
 - Inside source: true
 *** True Line Result
@@ -136507,126 +142271,150 @@ Follows is a source code listing for all files that have been open sourced. This
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~  def render_storyline_dialog args, lowrez_labels, lowrez_sprites~
+** Processing line: ~  def explaining_the_special_power_inside_computer args~
 - Inside source: true
 *** True Line Result
-  def render_storyline_dialog args, lowrez_labels, lowrez_sprites
-** Processing line: ~    return unless args.state.is_storyline_dialog_active~
+  def explaining_the_special_power_inside_computer args
+** Processing line: ~    {~
 - Inside source: true
 *** True Line Result
-    return unless args.state.is_storyline_dialog_active
-** Processing line: ~    return unless args.state.storyline_to_show~
+    {
+** Processing line: ~      background: 'sprites/pc.png',~
 - Inside source: true
 *** True Line Result
-    return unless args.state.storyline_to_show
-** Processing line: ~    labels = labels_for_word args.state.storyline_to_show~
+      background: 'sprites/pc.png',
+** Processing line: ~      fade: 60,~
 - Inside source: true
 *** True Line Result
-    labels = labels_for_word args.state.storyline_to_show
-** Processing line: ~    if true # high rez version~
+      fade: 60,
+** Processing line: ~      player: [34, 4],~
 - Inside source: true
 *** True Line Result
-    if true # high rez version
-** Processing line: ~      scale = 8.88~
+      player: [34, 4],
+** Processing line: ~      scenes: [~
 - Inside source: true
 *** True Line Result
-      scale = 8.88
-** Processing line: ~      offset = 45~
+      scenes: [
+** Processing line: ~        [0, 62, 64, 3, :the_blinking_light]~
 - Inside source: true
 *** True Line Result
-      offset = 45
-** Processing line: ~      size = 25~
+        [0, 62, 64, 3, :the_blinking_light]
+** Processing line: ~      ],~
 - Inside source: true
 *** True Line Result
-      size = 25
-** Processing line: ~      args.outputs.labels << [offset + labels[:left].x.-(1) * scale,~
+      ],
+** Processing line: ~      storylines: [~
 - Inside source: true
 *** True Line Result
-      args.outputs.labels << [offset + labels[:left].x.-(1) * scale,
-** Processing line: ~                              labels[:left].y * TINY_SCALE + 55,~
+      storylines: [
+** Processing line: ~        [14, 20, 24, 4, "So... I have a special-- power--. I don't-- need a mouse-, keyboard--, or even-- a monitor--- to control-- a computer--."],~
 - Inside source: true
 *** True Line Result
-                              labels[:left].y * TINY_SCALE + 55,
-** Processing line: ~                              labels[:left].text, size, 0, 0, 0, 0, 255,~
+        [14, 20, 24, 4, "So... I have a special-- power--. I don't-- need a mouse-, keyboard--, or even-- a monitor--- to control-- a computer--."],
+** Processing line: ~        [14, 25, 24, 4, "I only-- pretend-- to use peripherals---, so as not- to freak- anyone--- out."],~
 - Inside source: true
 *** True Line Result
-                              labels[:left].text, size, 0, 0, 0, 0, 255,
-** Processing line: ~                              'fonts/manaspc.ttf']~
+        [14, 25, 24, 4, "I only-- pretend-- to use peripherals---, so as not- to freak- anyone--- out."],
+** Processing line: ~        [14, 30, 24, 4, "Inside-- this silicon--- Universe---, is the only-- place I- feel- at peace."],~
 - Inside source: true
 *** True Line Result
-                              'fonts/manaspc.ttf']
-** Processing line: ~      center_text = labels[:center].text~
+        [14, 30, 24, 4, "Inside-- this silicon--- Universe---, is the only-- place I- feel- at peace."],
+** Processing line: ~        [14, 35, 24, 4, "It's-- the only-- place where I don't-- feel alone."]~
 - Inside source: true
 *** True Line Result
-      center_text = labels[:center].text
-** Processing line: ~      center_text = "|" if center_text == "$"~
+        [14, 35, 24, 4, "It's-- the only-- place where I don't-- feel alone."]
+** Processing line: ~      ]~
 - Inside source: true
 *** True Line Result
-      center_text = "|" if center_text == "$"
-** Processing line: ~      args.outputs.labels << [offset + labels[:center].x * scale,~
+      ]
+** Processing line: ~    }~
 - Inside source: true
 *** True Line Result
-      args.outputs.labels << [offset + labels[:center].x * scale,
-** Processing line: ~                              labels[:center].y * TINY_SCALE + 55,~
+    }
+** Processing line: ~  end~
 - Inside source: true
 *** True Line Result
-                              labels[:center].y * TINY_SCALE + 55,
-** Processing line: ~                              center_text, size, 0, 255, 0, 0, 255,~
+  end
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-                              center_text, size, 0, 255, 0, 0, 255,
-** Processing line: ~                              'fonts/manaspc.ttf']~
+
+** Processing line: ~#+end_src~
+- Line was identified as the end of a code block.
+*** True Line Result
+#+end_src
+** Processing line: ~~
+- End of paragraph detected.
+*** True Line Result
+
+** Processing line: ~*** Rpg Narrative - Return Of Serenity - storyline_final_decision.rb~
+- Header detected.
+*** True Line Result
+
+*** True Line Result
+*** Rpg Narrative - Return Of Serenity - storyline_final_decision.rb
+** Processing line: ~#+begin_src ruby~
+- Line was identified as the beginning of a code block.
+*** True Line Result
+
+*** True Line Result
+#+begin_src ruby
+** Processing line: ~  # ./samples/99_genre_rpg_narrative/return_of_serenity/app/storyline_final_decision.rb~
 - Inside source: true
 *** True Line Result
-                              'fonts/manaspc.ttf']
-** Processing line: ~      args.outputs.labels << [offset + labels[:right].x * scale,~
+  # ./samples/99_genre_rpg_narrative/return_of_serenity/app/storyline_final_decision.rb
+** Processing line: ~  def final_decision_side_of_home args~
 - Inside source: true
 *** True Line Result
-      args.outputs.labels << [offset + labels[:right].x * scale,
-** Processing line: ~                              labels[:right].y * TINY_SCALE + 55,~
+  def final_decision_side_of_home args
+** Processing line: ~    {~
 - Inside source: true
 *** True Line Result
-                              labels[:right].y * TINY_SCALE + 55,
-** Processing line: ~                              labels[:right].text, size, 0, 0, 0, 0, 255,~
+    {
+** Processing line: ~      fade: 120,~
 - Inside source: true
 *** True Line Result
-                              labels[:right].text, size, 0, 0, 0, 0, 255,
-** Processing line: ~                              'fonts/manaspc.ttf']~
+      fade: 120,
+** Processing line: ~      background: 'sprites/side-of-home.png',~
 - Inside source: true
 *** True Line Result
-                              'fonts/manaspc.ttf']
-** Processing line: ~    else~
+      background: 'sprites/side-of-home.png',
+** Processing line: ~      player: [16, 13],~
 - Inside source: true
 *** True Line Result
-    else
-** Processing line: ~      lowrez_labels << labels[:left]~
+      player: [16, 13],
+** Processing line: ~      scenes: [~
 - Inside source: true
 *** True Line Result
-      lowrez_labels << labels[:left]
-** Processing line: ~      lowrez_labels << labels[:center]~
+      scenes: [
+** Processing line: ~        [52, 24, 11, 5, :final_decision_mountain_pass],~
 - Inside source: true
 *** True Line Result
-      lowrez_labels << labels[:center]
-** Processing line: ~      lowrez_labels << labels[:right]~
+        [52, 24, 11, 5, :final_decision_mountain_pass],
+** Processing line: ~      ],~
 - Inside source: true
 *** True Line Result
-      lowrez_labels << labels[:right]
-** Processing line: ~    end~
+      ],
+** Processing line: ~      render_override: :blinking_light_side_of_home_render,~
 - Inside source: true
 *** True Line Result
-    end
-** Processing line: ~    args.state.is_storyline_dialog_active = true~
+      render_override: :blinking_light_side_of_home_render,
+** Processing line: ~      storylines: [~
 - Inside source: true
 *** True Line Result
-    args.state.is_storyline_dialog_active = true
-** Processing line: ~    render_player args, lowrez_sprites~
+      storylines: [
+** Processing line: ~        [28, 13, 8, 4,  "Man. Hard to believe- that today- is the 21st--- anniversary-- of The Impact. Serenity--- will- be- home- soon."]~
 - Inside source: true
 *** True Line Result
-    render_player args, lowrez_sprites
-** Processing line: ~    lowrez_sprites <<  [0, 0, 64, 8, 'sprites/label-background.png']~
+        [28, 13, 8, 4,  "Man. Hard to believe- that today- is the 21st--- anniversary-- of The Impact. Serenity--- will- be- home- soon."]
+** Processing line: ~      ]~
 - Inside source: true
 *** True Line Result
-    lowrez_sprites <<  [0, 0, 64, 8, 'sprites/label-background.png']
+      ]
+** Processing line: ~    }~
+- Inside source: true
+*** True Line Result
+    }
 ** Processing line: ~  end~
 - Inside source: true
 *** True Line Result
@@ -136635,42 +142423,42 @@ Follows is a source code listing for all files that have been open sourced. This
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~  def render_player args, lowrez_sprites~
+** Processing line: ~  def final_decision_mountain_pass args~
 - Inside source: true
 *** True Line Result
-  def render_player args, lowrez_sprites
-** Processing line: ~    lowrez_sprites << player_md_down(args, *args.state.player)~
+  def final_decision_mountain_pass args
+** Processing line: ~    {~
 - Inside source: true
 *** True Line Result
-    lowrez_sprites << player_md_down(args, *args.state.player)
-** Processing line: ~  end~
+    {
+** Processing line: ~      background: 'sprites/mountain-pass-zoomed-out.png',~
 - Inside source: true
 *** True Line Result
-  end
-** Processing line: ~~
+      background: 'sprites/mountain-pass-zoomed-out.png',
+** Processing line: ~      player: [4, 4],~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~  def render_adornments args, lowrez_sprites~
+      player: [4, 4],
+** Processing line: ~      scenes: [~
 - Inside source: true
 *** True Line Result
-  def render_adornments args, lowrez_sprites
-** Processing line: ~    render_scenes args, lowrez_sprites~
+      scenes: [
+** Processing line: ~        [18, 47, 5, 5, :final_decision_path_to_observatory]~
 - Inside source: true
 *** True Line Result
-    render_scenes args, lowrez_sprites
-** Processing line: ~    render_storylines args, lowrez_sprites~
+        [18, 47, 5, 5, :final_decision_path_to_observatory]
+** Processing line: ~      ],~
 - Inside source: true
 *** True Line Result
-    render_storylines args, lowrez_sprites
-** Processing line: ~    return if args.state.is_storyline_dialog_active~
+      ],
+** Processing line: ~      render_override: :blinking_light_mountain_pass_render~
 - Inside source: true
 *** True Line Result
-    return if args.state.is_storyline_dialog_active
-** Processing line: ~    lowrez_sprites << player_md_down(args, *args.state.player)~
+      render_override: :blinking_light_mountain_pass_render
+** Processing line: ~    }~
 - Inside source: true
 *** True Line Result
-    lowrez_sprites << player_md_down(args, *args.state.player)
+    }
 ** Processing line: ~  end~
 - Inside source: true
 *** True Line Result
@@ -136679,26 +142467,42 @@ Follows is a source code listing for all files that have been open sourced. This
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~  def global_alpha_percentage args, max_alpha = 255~
+** Processing line: ~  def final_decision_path_to_observatory args~
 - Inside source: true
 *** True Line Result
-  def global_alpha_percentage args, max_alpha = 255
-** Processing line: ~    return 255 unless args.state.scene_changed_at~
+  def final_decision_path_to_observatory args
+** Processing line: ~    {~
 - Inside source: true
 *** True Line Result
-    return 255 unless args.state.scene_changed_at
-** Processing line: ~    return 255 unless args.state.scene_fade~
+    {
+** Processing line: ~      background: 'sprites/path-to-observatory.png',~
 - Inside source: true
 *** True Line Result
-    return 255 unless args.state.scene_fade
-** Processing line: ~    return 255 unless args.state.scene_fade > 0~
+      background: 'sprites/path-to-observatory.png',
+** Processing line: ~      player: [60, 4],~
 - Inside source: true
 *** True Line Result
-    return 255 unless args.state.scene_fade > 0
-** Processing line: ~    return max_alpha * args.state.scene_changed_at.ease(args.state.scene_fade)~
+      player: [60, 4],
+** Processing line: ~      scenes: [~
 - Inside source: true
 *** True Line Result
-    return max_alpha * args.state.scene_changed_at.ease(args.state.scene_fade)
+      scenes: [
+** Processing line: ~        [0, 26, 5, 5, :final_decision_observatory]~
+- Inside source: true
+*** True Line Result
+        [0, 26, 5, 5, :final_decision_observatory]
+** Processing line: ~      ],~
+- Inside source: true
+*** True Line Result
+      ],
+** Processing line: ~      render_override: :blinking_light_path_to_observatory_render~
+- Inside source: true
+*** True Line Result
+      render_override: :blinking_light_path_to_observatory_render
+** Processing line: ~    }~
+- Inside source: true
+*** True Line Result
+    }
 ** Processing line: ~  end~
 - Inside source: true
 *** True Line Result
@@ -136707,82 +142511,90 @@ Follows is a source code listing for all files that have been open sourced. This
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~  def render_current_scene args, lowrez_sprites, lowrez_labels, lowrez_solids~
+** Processing line: ~  def final_decision_observatory args~
 - Inside source: true
 *** True Line Result
-  def render_current_scene args, lowrez_sprites, lowrez_labels, lowrez_solids
-** Processing line: ~    lowrez_sprites << [0, 0, 64, 64, args.state.background, 0, (global_alpha_percentage args)]~
+  def final_decision_observatory args
+** Processing line: ~    {~
 - Inside source: true
 *** True Line Result
-    lowrez_sprites << [0, 0, 64, 64, args.state.background, 0, (global_alpha_percentage args)]
-** Processing line: ~    if args.state.scene_render_override~
+    {
+** Processing line: ~      background: 'sprites/observatory.png',~
 - Inside source: true
 *** True Line Result
-    if args.state.scene_render_override
-** Processing line: ~      send args.state.scene_render_override, args, lowrez_sprites, lowrez_labels, lowrez_solids~
+      background: 'sprites/observatory.png',
+** Processing line: ~      player: [60, 2],~
 - Inside source: true
 *** True Line Result
-      send args.state.scene_render_override, args, lowrez_sprites, lowrez_labels, lowrez_solids
-** Processing line: ~    end~
+      player: [60, 2],
+** Processing line: ~      scenes: [~
 - Inside source: true
 *** True Line Result
-    end
-** Processing line: ~    storyline_to_show = args.state.storyline_to_show || ""~
+      scenes: [
+** Processing line: ~        [28, 39, 4, 10, :final_decision_inside_observatory]~
 - Inside source: true
 *** True Line Result
-    storyline_to_show = args.state.storyline_to_show || ""
-** Processing line: ~    render_adornments args, lowrez_sprites~
+        [28, 39, 4, 10, :final_decision_inside_observatory]
+** Processing line: ~      ],~
 - Inside source: true
 *** True Line Result
-    render_adornments args, lowrez_sprites
-** Processing line: ~    render_storyline_dialog args, lowrez_labels, lowrez_sprites~
+      ],
+** Processing line: ~      render_override: :blinking_light_observatory_render~
 - Inside source: true
 *** True Line Result
-    render_storyline_dialog args, lowrez_labels, lowrez_sprites
+      render_override: :blinking_light_observatory_render
+** Processing line: ~    }~
+- Inside source: true
+*** True Line Result
+    }
+** Processing line: ~  end~
+- Inside source: true
+*** True Line Result
+  end
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~    if args.state.background == 'sprites/tribute-game-over.png'~
+** Processing line: ~  def final_decision_inside_observatory args~
 - Inside source: true
 *** True Line Result
-    if args.state.background == 'sprites/tribute-game-over.png'
-** Processing line: ~      lowrez_sprites << [0, 0, 64, 11, 'sprites/label-background.png', 0, adornments_alpha(args, 200), 0, 0, 0]~
+  def final_decision_inside_observatory args
+** Processing line: ~    {~
 - Inside source: true
 *** True Line Result
-      lowrez_sprites << [0, 0, 64, 11, 'sprites/label-background.png', 0, adornments_alpha(args, 200), 0, 0, 0]
-** Processing line: ~      lowrez_labels << [9, 6, 'Return of', 255, 255, 255]~
+    {
+** Processing line: ~      background: 'sprites/inside-observatory.png',~
 - Inside source: true
 *** True Line Result
-      lowrez_labels << [9, 6, 'Return of', 255, 255, 255]
-** Processing line: ~      lowrez_labels << [9, 1, ' Serenity', 255, 255, 255]~
+      background: 'sprites/inside-observatory.png',
+** Processing line: ~      player: [60, 2],~
 - Inside source: true
 *** True Line Result
-      lowrez_labels << [9, 1, ' Serenity', 255, 255, 255]
-** Processing line: ~      if !args.state.ended~
+      player: [60, 2],
+** Processing line: ~      storylines: [],~
 - Inside source: true
 *** True Line Result
-      if !args.state.ended
-** Processing line: ~        args.gtk.stop_music~
+      storylines: [],
+** Processing line: ~      scenes: [~
 - Inside source: true
 *** True Line Result
-        args.gtk.stop_music
-** Processing line: ~        args.outputs.sounds << 'sounds/music-loop.ogg'~
+      scenes: [
+** Processing line: ~        [30, 18, 5, 12, :final_decision_inside_mainframe]~
 - Inside source: true
 *** True Line Result
-        args.outputs.sounds << 'sounds/music-loop.ogg'
-** Processing line: ~        args.state.ended = true~
+        [30, 18, 5, 12, :final_decision_inside_mainframe]
+** Processing line: ~      ],~
 - Inside source: true
 *** True Line Result
-        args.state.ended = true
-** Processing line: ~      end~
+      ],
+** Processing line: ~      render_override: :blinking_light_inside_observatory_render~
 - Inside source: true
 *** True Line Result
-      end
-** Processing line: ~    end~
+      render_override: :blinking_light_inside_observatory_render
+** Processing line: ~    }~
 - Inside source: true
 *** True Line Result
-    end
+    }
 ** Processing line: ~  end~
 - Inside source: true
 *** True Line Result
@@ -136791,46 +142603,42 @@ Follows is a source code listing for all files that have been open sourced. This
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~  def player_md_right args, x, y~
-- Inside source: true
-*** True Line Result
-  def player_md_right args, x, y
-** Processing line: ~    [x, y, 4, 11, 'sprites/player-right.png', 0, (global_alpha_percentage args)]~
+** Processing line: ~  def final_decision_inside_mainframe args~
 - Inside source: true
 *** True Line Result
-    [x, y, 4, 11, 'sprites/player-right.png', 0, (global_alpha_percentage args)]
-** Processing line: ~  end~
+  def final_decision_inside_mainframe args
+** Processing line: ~    {~
 - Inside source: true
 *** True Line Result
-  end
-** Processing line: ~~
+    {
+** Processing line: ~      player: [32, 4],~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~  def player_md_left args, x, y~
+      player: [32, 4],
+** Processing line: ~      background: 'sprites/mainframe.png',~
 - Inside source: true
 *** True Line Result
-  def player_md_left args, x, y
-** Processing line: ~    [x, y, 4, 11, 'sprites/player-left.png', 0, (global_alpha_percentage args)]~
+      background: 'sprites/mainframe.png',
+** Processing line: ~      storylines: [],~
 - Inside source: true
 *** True Line Result
-    [x, y, 4, 11, 'sprites/player-left.png', 0, (global_alpha_percentage args)]
-** Processing line: ~  end~
+      storylines: [],
+** Processing line: ~      scenes: [~
 - Inside source: true
 *** True Line Result
-  end
-** Processing line: ~~
+      scenes: [
+** Processing line: ~        [*hotspot_top, :final_decision_ship_status],~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~  def player_md_up args, x, y~
+        [*hotspot_top, :final_decision_ship_status],
+** Processing line: ~      ]~
 - Inside source: true
 *** True Line Result
-  def player_md_up args, x, y
-** Processing line: ~    [x, y, 4, 11, 'sprites/player-up.png', 0, (global_alpha_percentage args)]~
+      ]
+** Processing line: ~    }~
 - Inside source: true
 *** True Line Result
-    [x, y, 4, 11, 'sprites/player-up.png', 0, (global_alpha_percentage args)]
+    }
 ** Processing line: ~  end~
 - Inside source: true
 *** True Line Result
@@ -136839,158 +142647,158 @@ Follows is a source code listing for all files that have been open sourced. This
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~  def player_md_down args, x, y~
+** Processing line: ~  def final_decision_ship_status args~
 - Inside source: true
 *** True Line Result
-  def player_md_down args, x, y
-** Processing line: ~    [x, y, 4, 11, 'sprites/player-down.png', 0, (global_alpha_percentage args)]~
+  def final_decision_ship_status args
+** Processing line: ~    {~
 - Inside source: true
 *** True Line Result
-    [x, y, 4, 11, 'sprites/player-down.png', 0, (global_alpha_percentage args)]
-** Processing line: ~  end~
+    {
+** Processing line: ~      background: 'sprites/serenity.png',~
 - Inside source: true
 *** True Line Result
-  end
-** Processing line: ~~
+      background: 'sprites/serenity.png',
+** Processing line: ~      fade: 60,~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~  def player_sm args, x, y~
+      fade: 60,
+** Processing line: ~      player: [30, 10],~
 - Inside source: true
 *** True Line Result
-  def player_sm args, x, y
-** Processing line: ~    [x, y, 3, 7, 'sprites/player-zoomed-out.png', 0, (global_alpha_percentage args)]~
+      player: [30, 10],
+** Processing line: ~      scenes: [~
 - Inside source: true
 *** True Line Result
-    [x, y, 3, 7, 'sprites/player-zoomed-out.png', 0, (global_alpha_percentage args)]
-** Processing line: ~  end~
+      scenes: [
+** Processing line: ~        [*hotspot_top_right, :final_decision]~
 - Inside source: true
 *** True Line Result
-  end
-** Processing line: ~~
+        [*hotspot_top_right, :final_decision]
+** Processing line: ~      ],~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~  def player_xs args, x, y~
+      ],
+** Processing line: ~      storylines: [~
 - Inside source: true
 *** True Line Result
-  def player_xs args, x, y
-** Processing line: ~    [x, y, 1, 4, 'sprites/player-zoomed-out.png', 0, (global_alpha_percentage args)]~
+      storylines: [
+** Processing line: ~        [30,  8, 4, 4, "????"],~
 - Inside source: true
 *** True Line Result
-    [x, y, 1, 4, 'sprites/player-zoomed-out.png', 0, (global_alpha_percentage args)]
-** Processing line: ~  end~
+        [30,  8, 4, 4, "????"],
+** Processing line: ~        *final_decision_ship_status_shared(args)~
 - Inside source: true
 *** True Line Result
-  end
-** Processing line: ~~
+        *final_decision_ship_status_shared(args)
+** Processing line: ~      ]~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~#+end_src~
-- Line was identified as the end of a code block.
+      ]
+** Processing line: ~    }~
+- Inside source: true
 *** True Line Result
-#+end_src
-** Processing line: ~~
-- End of paragraph detected.
+    }
+** Processing line: ~  end~
+- Inside source: true
 *** True Line Result
-
-** Processing line: ~*** Rpg Narrative - Return Of Serenity - require.rb~
-- Header detected.
+  end
+** Processing line: ~~
+- Inside source: true
 *** True Line Result
 
+** Processing line: ~  def final_decision args~
+- Inside source: true
 *** True Line Result
-*** Rpg Narrative - Return Of Serenity - require.rb
-** Processing line: ~#+begin_src ruby~
-- Line was identified as the beginning of a code block.
-*** True Line Result
-
+  def final_decision args
+** Processing line: ~    decision_graph  "Stasis-- Chambers--: UNDERPOWERED, Life- forms-- will be terminated---- unless-- equilibrium----- is reached.",~
+- Inside source: true
 *** True Line Result
-#+begin_src ruby
-** Processing line: ~  # ./samples/99_genre_rpg_narrative/return_of_serenity/app/require.rb~
+    decision_graph  "Stasis-- Chambers--: UNDERPOWERED, Life- forms-- will be terminated---- unless-- equilibrium----- is reached.",
+** Processing line: ~                    "I CAN'T DO THIS... But... If-- I-- don't--- bring-- the- chambers--- to- equilibrium-----, they all die...",~
 - Inside source: true
 *** True Line Result
-  # ./samples/99_genre_rpg_narrative/return_of_serenity/app/require.rb
-** Processing line: ~  require 'app/lowrez_simulator.rb'~
+                    "I CAN'T DO THIS... But... If-- I-- don't--- bring-- the- chambers--- to- equilibrium-----, they all die...",
+** Processing line: ~                    [:final_decision_game_over_noone, "Kill--- Everyone---", "DO--- NOTHING?"],~
 - Inside source: true
 *** True Line Result
-  require 'app/lowrez_simulator.rb'
-** Processing line: ~  require 'app/storyline_day_one.rb'~
+                    [:final_decision_game_over_noone, "Kill--- Everyone---", "DO--- NOTHING?"],
+** Processing line: ~                    [:final_decision_game_over_matthew, "Kill--- Sasha---", "KILL--- SASHA?"],~
 - Inside source: true
 *** True Line Result
-  require 'app/storyline_day_one.rb'
-** Processing line: ~  require 'app/storyline_blinking_light.rb'~
+                    [:final_decision_game_over_matthew, "Kill--- Sasha---", "KILL--- SASHA?"],
+** Processing line: ~                    [:final_decision_game_over_anka, "Kill--- Aanka---", "KILL--- AANKA?"],~
 - Inside source: true
 *** True Line Result
-  require 'app/storyline_blinking_light.rb'
-** Processing line: ~  require 'app/storyline_serenity_introduction.rb'~
+                    [:final_decision_game_over_anka, "Kill--- Aanka---", "KILL--- AANKA?"],
+** Processing line: ~                    [:final_decision_game_over_sasha, "Kill--- Matthew---", "KILL--- MATTHEW?"]~
 - Inside source: true
 *** True Line Result
-  require 'app/storyline_serenity_introduction.rb'
-** Processing line: ~  require 'app/storyline_speed_of_light.rb'~
+                    [:final_decision_game_over_sasha, "Kill--- Matthew---", "KILL--- MATTHEW?"]
+** Processing line: ~  end~
 - Inside source: true
 *** True Line Result
-  require 'app/storyline_speed_of_light.rb'
-** Processing line: ~  require 'app/storyline_serenity_alive.rb'~
+  end
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-  require 'app/storyline_serenity_alive.rb'
-** Processing line: ~  require 'app/storyline_serenity_bio.rb'~
+
+** Processing line: ~  def final_decision_game_over_noone args~
 - Inside source: true
 *** True Line Result
-  require 'app/storyline_serenity_bio.rb'
-** Processing line: ~  require 'app/storyline_anka.rb'~
+  def final_decision_game_over_noone args
+** Processing line: ~    {~
 - Inside source: true
 *** True Line Result
-  require 'app/storyline_anka.rb'
-** Processing line: ~  require 'app/storyline_final_message.rb'~
+    {
+** Processing line: ~      background: 'sprites/tribute-game-over.png',~
 - Inside source: true
 *** True Line Result
-  require 'app/storyline_final_message.rb'
-** Processing line: ~  require 'app/storyline_final_decision.rb'~
+      background: 'sprites/tribute-game-over.png',
+** Processing line: ~      player: [53, 14],~
 - Inside source: true
 *** True Line Result
-  require 'app/storyline_final_decision.rb'
-** Processing line: ~  require 'app/storyline.rb'~
+      player: [53, 14],
+** Processing line: ~      fade: 600~
 - Inside source: true
 *** True Line Result
-  require 'app/storyline.rb'
-** Processing line: ~~
+      fade: 600
+** Processing line: ~    }~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~#+end_src~
-- Line was identified as the end of a code block.
+    }
+** Processing line: ~  end~
+- Inside source: true
 *** True Line Result
-#+end_src
+  end
 ** Processing line: ~~
-- End of paragraph detected.
-*** True Line Result
-
-** Processing line: ~*** Rpg Narrative - Return Of Serenity - storyline.rb~
-- Header detected.
+- Inside source: true
 *** True Line Result
 
+** Processing line: ~  def final_decision_game_over_matthew args~
+- Inside source: true
 *** True Line Result
-*** Rpg Narrative - Return Of Serenity - storyline.rb
-** Processing line: ~#+begin_src ruby~
-- Line was identified as the beginning of a code block.
+  def final_decision_game_over_matthew args
+** Processing line: ~    {~
+- Inside source: true
 *** True Line Result
-
+    {
+** Processing line: ~      background: 'sprites/tribute-game-over.png',~
+- Inside source: true
 *** True Line Result
-#+begin_src ruby
-** Processing line: ~  # ./samples/99_genre_rpg_narrative/return_of_serenity/app/storyline.rb~
+      background: 'sprites/tribute-game-over.png',
+** Processing line: ~      player: [53, 14],~
 - Inside source: true
 *** True Line Result
-  # ./samples/99_genre_rpg_narrative/return_of_serenity/app/storyline.rb
-** Processing line: ~  def hotspot_top~
+      player: [53, 14],
+** Processing line: ~      fade: 600~
 - Inside source: true
 *** True Line Result
-  def hotspot_top
-** Processing line: ~    [4, 61, 56, 3]~
+      fade: 600
+** Processing line: ~    }~
 - Inside source: true
 *** True Line Result
-    [4, 61, 56, 3]
+    }
 ** Processing line: ~  end~
 - Inside source: true
 *** True Line Result
@@ -136999,30 +142807,30 @@ Follows is a source code listing for all files that have been open sourced. This
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~  def hotspot_bottom~
+** Processing line: ~  def final_decision_game_over_anka args~
 - Inside source: true
 *** True Line Result
-  def hotspot_bottom
-** Processing line: ~    [4, 0, 56, 3]~
+  def final_decision_game_over_anka args
+** Processing line: ~    {~
 - Inside source: true
 *** True Line Result
-    [4, 0, 56, 3]
-** Processing line: ~  end~
+    {
+** Processing line: ~      background: 'sprites/tribute-game-over.png',~
 - Inside source: true
 *** True Line Result
-  end
-** Processing line: ~~
+      background: 'sprites/tribute-game-over.png',
+** Processing line: ~      player: [53, 14],~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~  def hotspot_top_right~
+      player: [53, 14],
+** Processing line: ~      fade: 600~
 - Inside source: true
 *** True Line Result
-  def hotspot_top_right
-** Processing line: ~    [62, 35, 3, 25]~
+      fade: 600
+** Processing line: ~    }~
 - Inside source: true
 *** True Line Result
-    [62, 35, 3, 25]
+    }
 ** Processing line: ~  end~
 - Inside source: true
 *** True Line Result
@@ -137031,30 +142839,30 @@ Follows is a source code listing for all files that have been open sourced. This
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~  def hotspot_bottom_right~
+** Processing line: ~  def final_decision_game_over_sasha args~
 - Inside source: true
 *** True Line Result
-  def hotspot_bottom_right
-** Processing line: ~    [62, 0, 3, 25]~
+  def final_decision_game_over_sasha args
+** Processing line: ~    {~
 - Inside source: true
 *** True Line Result
-    [62, 0, 3, 25]
-** Processing line: ~  end~
+    {
+** Processing line: ~      background: 'sprites/tribute-game-over.png',~
 - Inside source: true
 *** True Line Result
-  end
-** Processing line: ~~
+      background: 'sprites/tribute-game-over.png',
+** Processing line: ~      player: [53, 14],~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~  def storyline_history_include? args, text~
+      player: [53, 14],
+** Processing line: ~      fade: 600~
 - Inside source: true
 *** True Line Result
-  def storyline_history_include? args, text
-** Processing line: ~    args.state.storyline_history.any? { |s| s.gsub("-", "").gsub(" ", "").include? text.gsub("-", "").gsub(" ", "") }~
+      fade: 600
+** Processing line: ~    }~
 - Inside source: true
 *** True Line Result
-    args.state.storyline_history.any? { |s| s.gsub("-", "").gsub(" ", "").include? text.gsub("-", "").gsub(" ", "") }
+    }
 ** Processing line: ~  end~
 - Inside source: true
 *** True Line Result
@@ -137063,46 +142871,38 @@ Follows is a source code listing for all files that have been open sourced. This
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~  def blinking_light_side_of_home_render args, lowrez_sprites, lowrez_labels, lowrez_solids~
-- Inside source: true
-*** True Line Result
-  def blinking_light_side_of_home_render args, lowrez_sprites, lowrez_labels, lowrez_solids
-** Processing line: ~    lowrez_sprites << [48, 44, 5, 5, 'sprites/square.png', 0,  50 * (args.state.tick_count % 50).fdiv(50), 0, 255, 0]~
-- Inside source: true
-*** True Line Result
-    lowrez_sprites << [48, 44, 5, 5, 'sprites/square.png', 0,  50 * (args.state.tick_count % 50).fdiv(50), 0, 255, 0]
-** Processing line: ~    lowrez_sprites << [49, 45, 3, 3, 'sprites/square.png', 0, 100 * (args.state.tick_count % 50).fdiv(50), 0, 255, 0]~
+** Processing line: ~  def final_decision_ship_status_shared args~
 - Inside source: true
 *** True Line Result
-    lowrez_sprites << [49, 45, 3, 3, 'sprites/square.png', 0, 100 * (args.state.tick_count % 50).fdiv(50), 0, 255, 0]
-** Processing line: ~    lowrez_sprites << [50, 46, 1, 1, 'sprites/square.png', 0, 255 * (args.state.tick_count % 50).fdiv(50), 0, 255, 0]~
+  def final_decision_ship_status_shared args
+** Processing line: ~    [~
 - Inside source: true
 *** True Line Result
-    lowrez_sprites << [50, 46, 1, 1, 'sprites/square.png', 0, 255 * (args.state.tick_count % 50).fdiv(50), 0, 255, 0]
-** Processing line: ~  end~
+    [
+** Processing line: ~      *ship_control_hotspot(24, 22,~
 - Inside source: true
 *** True Line Result
-  end
-** Processing line: ~~
+      *ship_control_hotspot(24, 22,
+** Processing line: ~                             "Stasis-- Chambers--: UNDERPOWERED, Life- forms-- will be terminated---- unless-- equilibrium----- is reached. WHAT?! NO!",~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~  def blinking_light_mountain_pass_render args, lowrez_sprites, lowrez_labels, lowrez_solids~
+                             "Stasis-- Chambers--: UNDERPOWERED, Life- forms-- will be terminated---- unless-- equilibrium----- is reached. WHAT?! NO!",
+** Processing line: ~                             "Matthew's--- Chamber--: UNDER-- THREAT-- OF-- TERMINATION. WHAT?! NO!",~
 - Inside source: true
 *** True Line Result
-  def blinking_light_mountain_pass_render args, lowrez_sprites, lowrez_labels, lowrez_solids
-** Processing line: ~    lowrez_sprites << [18, 47, 5, 5, 'sprites/square.png', 0,  50 * (args.state.tick_count % 50).fdiv(50), 0, 255, 0]~
+                             "Matthew's--- Chamber--: UNDER-- THREAT-- OF-- TERMINATION. WHAT?! NO!",
+** Processing line: ~                             "Aanka's--- Chamber--: UNDER-- THREAT-- OF-- TERMINATION.  WHAT?! NO!",~
 - Inside source: true
 *** True Line Result
-    lowrez_sprites << [18, 47, 5, 5, 'sprites/square.png', 0,  50 * (args.state.tick_count % 50).fdiv(50), 0, 255, 0]
-** Processing line: ~    lowrez_sprites << [19, 48, 3, 3, 'sprites/square.png', 0, 100 * (args.state.tick_count % 50).fdiv(50), 0, 255, 0]~
+                             "Aanka's--- Chamber--: UNDER-- THREAT-- OF-- TERMINATION.  WHAT?! NO!",
+** Processing line: ~                             "Sasha's--- Chamber--: UNDER-- THREAT-- OF-- TERMINATION. WHAT?! NO!"),~
 - Inside source: true
 *** True Line Result
-    lowrez_sprites << [19, 48, 3, 3, 'sprites/square.png', 0, 100 * (args.state.tick_count % 50).fdiv(50), 0, 255, 0]
-** Processing line: ~    lowrez_sprites << [20, 49, 1, 1, 'sprites/square.png', 0, 255 * (args.state.tick_count % 50).fdiv(50), 0, 255, 0]~
+                             "Sasha's--- Chamber--: UNDER-- THREAT-- OF-- TERMINATION. WHAT?! NO!"),
+** Processing line: ~    ]~
 - Inside source: true
 *** True Line Result
-    lowrez_sprites << [20, 49, 1, 1, 'sprites/square.png', 0, 255 * (args.state.tick_count % 50).fdiv(50), 0, 255, 0]
+    ]
 ** Processing line: ~  end~
 - Inside source: true
 *** True Line Result
@@ -137111,70 +142911,78 @@ Follows is a source code listing for all files that have been open sourced. This
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~  def blinking_light_path_to_observatory_render args, lowrez_sprites, lowrez_labels, lowrez_solids~
-- Inside source: true
+** Processing line: ~#+end_src~
+- Line was identified as the end of a code block.
 *** True Line Result
-  def blinking_light_path_to_observatory_render args, lowrez_sprites, lowrez_labels, lowrez_solids
-** Processing line: ~    lowrez_sprites << [0, 26, 5, 5, 'sprites/square.png', 0,  50 * (args.state.tick_count % 50).fdiv(50), 0, 255, 0]~
-- Inside source: true
+#+end_src
+** Processing line: ~~
+- End of paragraph detected.
 *** True Line Result
-    lowrez_sprites << [0, 26, 5, 5, 'sprites/square.png', 0,  50 * (args.state.tick_count % 50).fdiv(50), 0, 255, 0]
-** Processing line: ~    lowrez_sprites << [1, 27, 3, 3, 'sprites/square.png', 0, 100 * (args.state.tick_count % 50).fdiv(50), 0, 255, 0]~
-- Inside source: true
+
+** Processing line: ~*** Rpg Narrative - Return Of Serenity - storyline_final_message.rb~
+- Header detected.
 *** True Line Result
-    lowrez_sprites << [1, 27, 3, 3, 'sprites/square.png', 0, 100 * (args.state.tick_count % 50).fdiv(50), 0, 255, 0]
-** Processing line: ~    lowrez_sprites << [2, 28, 1, 1, 'sprites/square.png', 0, 255 * (args.state.tick_count % 50).fdiv(50), 0, 255, 0]~
+
+*** True Line Result
+*** Rpg Narrative - Return Of Serenity - storyline_final_message.rb
+** Processing line: ~#+begin_src ruby~
+- Line was identified as the beginning of a code block.
+*** True Line Result
+
+*** True Line Result
+#+begin_src ruby
+** Processing line: ~  # ./samples/99_genre_rpg_narrative/return_of_serenity/app/storyline_final_message.rb~
 - Inside source: true
 *** True Line Result
-    lowrez_sprites << [2, 28, 1, 1, 'sprites/square.png', 0, 255 * (args.state.tick_count % 50).fdiv(50), 0, 255, 0]
-** Processing line: ~  end~
+  # ./samples/99_genre_rpg_narrative/return_of_serenity/app/storyline_final_message.rb
+** Processing line: ~  def final_message_sad args~
 - Inside source: true
 *** True Line Result
-  end
-** Processing line: ~~
+  def final_message_sad args
+** Processing line: ~    {~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~  def blinking_light_observatory_render args, lowrez_sprites, lowrez_labels, lowrez_solids~
+    {
+** Processing line: ~      fade: 60,~
 - Inside source: true
 *** True Line Result
-  def blinking_light_observatory_render args, lowrez_sprites, lowrez_labels, lowrez_solids
-** Processing line: ~    lowrez_sprites << [23, 59, 5, 5, 'sprites/square.png', 0,  50 * (args.state.tick_count % 50).fdiv(50), 0, 255, 0]~
+      fade: 60,
+** Processing line: ~      background: 'sprites/inside-home.png',~
 - Inside source: true
 *** True Line Result
-    lowrez_sprites << [23, 59, 5, 5, 'sprites/square.png', 0,  50 * (args.state.tick_count % 50).fdiv(50), 0, 255, 0]
-** Processing line: ~    lowrez_sprites << [24, 60, 3, 3, 'sprites/square.png', 0, 100 * (args.state.tick_count % 50).fdiv(50), 0, 255, 0]~
+      background: 'sprites/inside-home.png',
+** Processing line: ~      player: [34, 35],~
 - Inside source: true
 *** True Line Result
-    lowrez_sprites << [24, 60, 3, 3, 'sprites/square.png', 0, 100 * (args.state.tick_count % 50).fdiv(50), 0, 255, 0]
-** Processing line: ~    lowrez_sprites << [25, 61, 1, 1, 'sprites/square.png', 0, 255 * (args.state.tick_count % 50).fdiv(50), 0, 255, 0]~
+      player: [34, 35],
+** Processing line: ~      storylines: [~
 - Inside source: true
 *** True Line Result
-    lowrez_sprites << [25, 61, 1, 1, 'sprites/square.png', 0, 255 * (args.state.tick_count % 50).fdiv(50), 0, 255, 0]
-** Processing line: ~  end~
+      storylines: [
+** Processing line: ~        [34, 34, 4, 4, "Another-- sleepless-- night..."],~
 - Inside source: true
 *** True Line Result
-  end
-** Processing line: ~~
+        [34, 34, 4, 4, "Another-- sleepless-- night..."],
+** Processing line: ~      ],~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~  def blinking_light_inside_observatory_render args, lowrez_sprites, lowrez_labels, lowrez_solids~
+      ],
+** Processing line: ~      scenes: [~
 - Inside source: true
 *** True Line Result
-  def blinking_light_inside_observatory_render args, lowrez_sprites, lowrez_labels, lowrez_solids
-** Processing line: ~    lowrez_sprites << [30, 30, 5, 5, 'sprites/square.png', 0,  50 * (args.state.tick_count % 50).fdiv(50), 0, 255, 0]~
+      scenes: [
+** Processing line: ~        [32, -1, 8, 3, :final_message_observatory]~
 - Inside source: true
 *** True Line Result
-    lowrez_sprites << [30, 30, 5, 5, 'sprites/square.png', 0,  50 * (args.state.tick_count % 50).fdiv(50), 0, 255, 0]
-** Processing line: ~    lowrez_sprites << [31, 31, 3, 3, 'sprites/square.png', 0, 100 * (args.state.tick_count % 50).fdiv(50), 0, 255, 0]~
+        [32, -1, 8, 3, :final_message_observatory]
+** Processing line: ~      ]~
 - Inside source: true
 *** True Line Result
-    lowrez_sprites << [31, 31, 3, 3, 'sprites/square.png', 0, 100 * (args.state.tick_count % 50).fdiv(50), 0, 255, 0]
-** Processing line: ~    lowrez_sprites << [32, 32, 1, 1, 'sprites/square.png', 0, 255 * (args.state.tick_count % 50).fdiv(50), 0, 255, 0]~
+      ]
+** Processing line: ~    }~
 - Inside source: true
 *** True Line Result
-    lowrez_sprites << [32, 32, 1, 1, 'sprites/square.png', 0, 255 * (args.state.tick_count % 50).fdiv(50), 0, 255, 0]
+    }
 ** Processing line: ~  end~
 - Inside source: true
 *** True Line Result
@@ -137183,342 +142991,334 @@ Follows is a source code listing for all files that have been open sourced. This
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~  def decision_graph context_message, context_action, context_result_one, context_result_two, context_result_three = [], context_result_four = []~
-- Inside source: true
-*** True Line Result
-  def decision_graph context_message, context_action, context_result_one, context_result_two, context_result_three = [], context_result_four = []
-** Processing line: ~    result_one_scene, result_one_label, result_one_text = context_result_one~
+** Processing line: ~  def final_message_happy args~
 - Inside source: true
 *** True Line Result
-    result_one_scene, result_one_label, result_one_text = context_result_one
-** Processing line: ~    result_two_scene, result_two_label, result_two_text = context_result_two~
+  def final_message_happy args
+** Processing line: ~    {~
 - Inside source: true
 *** True Line Result
-    result_two_scene, result_two_label, result_two_text = context_result_two
-** Processing line: ~    result_three_scene, result_three_label, result_three_text = context_result_three~
+    {
+** Processing line: ~      fade: 60,~
 - Inside source: true
 *** True Line Result
-    result_three_scene, result_three_label, result_three_text = context_result_three
-** Processing line: ~    result_four_scene, result_four_label, result_four_text = context_result_four~
+      fade: 60,
+** Processing line: ~      background: 'sprites/inside-home.png',~
 - Inside source: true
 *** True Line Result
-    result_four_scene, result_four_label, result_four_text = context_result_four
-** Processing line: ~~
+      background: 'sprites/inside-home.png',
+** Processing line: ~      player: [34, 35],~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~    top_level_hash = {~
+      player: [34, 35],
+** Processing line: ~      storylines: [~
 - Inside source: true
 *** True Line Result
-    top_level_hash = {
-** Processing line: ~      background: 'sprites/decision.png',~
+      storylines: [
+** Processing line: ~        [34, 34, 4, 4, "Oh man, I slept like rock!"],~
 - Inside source: true
 *** True Line Result
-      background: 'sprites/decision.png',
-** Processing line: ~      fade: 60,~
+        [34, 34, 4, 4, "Oh man, I slept like rock!"],
+** Processing line: ~      ],~
 - Inside source: true
 *** True Line Result
-      fade: 60,
-** Processing line: ~      player: [20, 36],~
+      ],
+** Processing line: ~      scenes: [~
 - Inside source: true
 *** True Line Result
-      player: [20, 36],
-** Processing line: ~      storylines: [ ],~
+      scenes: [
+** Processing line: ~        [32, -1, 8, 3, :final_message_observatory]~
 - Inside source: true
 *** True Line Result
-      storylines: [ ],
-** Processing line: ~      scenes: [ ]~
+        [32, -1, 8, 3, :final_message_observatory]
+** Processing line: ~      ]~
 - Inside source: true
 *** True Line Result
-      scenes: [ ]
+      ]
 ** Processing line: ~    }~
 - Inside source: true
 *** True Line Result
     }
-** Processing line: ~~
+** Processing line: ~  end~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~    confirmation_result_one_hash = {~
+  end
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-    confirmation_result_one_hash = {
-** Processing line: ~      background: 'sprites/decision.png',~
+
+** Processing line: ~  def final_message_side_of_home args~
 - Inside source: true
 *** True Line Result
-      background: 'sprites/decision.png',
-** Processing line: ~      scenes: [ ],~
+  def final_message_side_of_home args
+** Processing line: ~    {~
 - Inside source: true
 *** True Line Result
-      scenes: [ ],
-** Processing line: ~      storylines: [ ]~
+    {
+** Processing line: ~      fade: 60,~
 - Inside source: true
 *** True Line Result
-      storylines: [ ]
-** Processing line: ~    }~
+      fade: 60,
+** Processing line: ~      background: 'sprites/side-of-home.png',~
 - Inside source: true
 *** True Line Result
-    }
-** Processing line: ~~
+      background: 'sprites/side-of-home.png',
+** Processing line: ~      player: [16, 13],~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~    confirmation_result_two_hash = {~
+      player: [16, 13],
+** Processing line: ~      scenes: [~
 - Inside source: true
 *** True Line Result
-    confirmation_result_two_hash = {
-** Processing line: ~      background: 'sprites/decision.png',~
+      scenes: [
+** Processing line: ~        [52, 24, 11, 5, :final_message_mountain_pass],~
 - Inside source: true
 *** True Line Result
-      background: 'sprites/decision.png',
-** Processing line: ~      scenes: [ ],~
+        [52, 24, 11, 5, :final_message_mountain_pass],
+** Processing line: ~      ],~
 - Inside source: true
 *** True Line Result
-      scenes: [ ],
-** Processing line: ~      storylines: [ ]~
+      ],
+** Processing line: ~      render_override: :blinking_light_side_of_home_render~
 - Inside source: true
 *** True Line Result
-      storylines: [ ]
+      render_override: :blinking_light_side_of_home_render
 ** Processing line: ~    }~
 - Inside source: true
 *** True Line Result
     }
-** Processing line: ~~
+** Processing line: ~  end~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~    confirmation_result_three_hash = {~
+  end
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-    confirmation_result_three_hash = {
-** Processing line: ~      background: 'sprites/decision.png',~
+
+** Processing line: ~  def final_message_mountain_pass args~
 - Inside source: true
 *** True Line Result
-      background: 'sprites/decision.png',
-** Processing line: ~      scenes: [ ],~
+  def final_message_mountain_pass args
+** Processing line: ~    {~
 - Inside source: true
 *** True Line Result
-      scenes: [ ],
-** Processing line: ~      storylines: [ ]~
+    {
+** Processing line: ~      background: 'sprites/mountain-pass-zoomed-out.png',~
 - Inside source: true
 *** True Line Result
-      storylines: [ ]
-** Processing line: ~    }~
+      background: 'sprites/mountain-pass-zoomed-out.png',
+** Processing line: ~      player: [4, 4],~
 - Inside source: true
 *** True Line Result
-    }
-** Processing line: ~~
+      player: [4, 4],
+** Processing line: ~      scenes: [~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~    confirmation_result_four_hash = {~
+      scenes: [
+** Processing line: ~        [18, 47, 5, 5, :final_message_path_to_observatory],~
 - Inside source: true
 *** True Line Result
-    confirmation_result_four_hash = {
-** Processing line: ~      background: 'sprites/decision.png',~
+        [18, 47, 5, 5, :final_message_path_to_observatory],
+** Processing line: ~      ],~
 - Inside source: true
 *** True Line Result
-      background: 'sprites/decision.png',
-** Processing line: ~      scenes: [ ],~
+      ],
+** Processing line: ~      storylines: [~
 - Inside source: true
 *** True Line Result
-      scenes: [ ],
-** Processing line: ~      storylines: [ ]~
+      storylines: [
+** Processing line: ~        [18, 13, 5, 5, "Hnnnnnnnggg. My legs-- are still sore- from yesterday."]~
 - Inside source: true
 *** True Line Result
-      storylines: [ ]
-** Processing line: ~    }~
+        [18, 13, 5, 5, "Hnnnnnnnggg. My legs-- are still sore- from yesterday."]
+** Processing line: ~      ],~
 - Inside source: true
 *** True Line Result
-    }
-** Processing line: ~~
+      ],
+** Processing line: ~      render_override: :blinking_light_mountain_pass_render~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~    top_level_hash[:storylines] << [ 5, 35, 4, 4, context_message]~
+      render_override: :blinking_light_mountain_pass_render
+** Processing line: ~    }~
 - Inside source: true
 *** True Line Result
-    top_level_hash[:storylines] << [ 5, 35, 4, 4, context_message]
-** Processing line: ~    top_level_hash[:storylines] << [20, 35, 4, 4, context_action]~
+    }
+** Processing line: ~  end~
 - Inside source: true
 *** True Line Result
-    top_level_hash[:storylines] << [20, 35, 4, 4, context_action]
+  end
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~    confirmation_result_one_hash[:scenes]       << [20, 35, 4, 4, top_level_hash]~
+** Processing line: ~  def final_message_path_to_observatory args~
 - Inside source: true
 *** True Line Result
-    confirmation_result_one_hash[:scenes]       << [20, 35, 4, 4, top_level_hash]
-** Processing line: ~    confirmation_result_one_hash[:scenes]       << [60, 50, 4, 4, result_one_scene]~
+  def final_message_path_to_observatory args
+** Processing line: ~    {~
 - Inside source: true
 *** True Line Result
-    confirmation_result_one_hash[:scenes]       << [60, 50, 4, 4, result_one_scene]
-** Processing line: ~    confirmation_result_one_hash[:storylines]   << [40, 50, 4, 4, "#{result_one_label}: \"#{result_one_text}\""]~
+    {
+** Processing line: ~      background: 'sprites/path-to-observatory.png',~
 - Inside source: true
 *** True Line Result
-    confirmation_result_one_hash[:storylines]   << [40, 50, 4, 4, "#{result_one_label}: \"#{result_one_text}\""]
-** Processing line: ~    confirmation_result_one_hash[:scenes]       << [40, 40, 4, 4, confirmation_result_four_hash] if result_four_scene~
+      background: 'sprites/path-to-observatory.png',
+** Processing line: ~      player: [60, 4],~
 - Inside source: true
 *** True Line Result
-    confirmation_result_one_hash[:scenes]       << [40, 40, 4, 4, confirmation_result_four_hash] if result_four_scene
-** Processing line: ~    confirmation_result_one_hash[:scenes]       << [40, 30, 4, 4, confirmation_result_three_hash] if result_three_scene~
+      player: [60, 4],
+** Processing line: ~      scenes: [~
 - Inside source: true
 *** True Line Result
-    confirmation_result_one_hash[:scenes]       << [40, 30, 4, 4, confirmation_result_three_hash] if result_three_scene
-** Processing line: ~    confirmation_result_one_hash[:scenes]       << [40, 20, 4, 4, confirmation_result_two_hash]~
+      scenes: [
+** Processing line: ~        [0, 26, 5, 5, :final_message_observatory]~
 - Inside source: true
 *** True Line Result
-    confirmation_result_one_hash[:scenes]       << [40, 20, 4, 4, confirmation_result_two_hash]
-** Processing line: ~~
+        [0, 26, 5, 5, :final_message_observatory]
+** Processing line: ~      ],~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~    confirmation_result_two_hash[:scenes]       << [20, 35, 4, 4, top_level_hash]~
+      ],
+** Processing line: ~      storylines: [~
 - Inside source: true
 *** True Line Result
-    confirmation_result_two_hash[:scenes]       << [20, 35, 4, 4, top_level_hash]
-** Processing line: ~    confirmation_result_two_hash[:scenes]       << [40, 50, 4, 4, confirmation_result_one_hash]~
+      storylines: [
+** Processing line: ~        [22, 20, 10, 10, "This spot--, on the mountain, right here, it's-- perfect. This- is where- I'll-- yeet-- the person-- who is playing-- this- prank- on me."]~
 - Inside source: true
 *** True Line Result
-    confirmation_result_two_hash[:scenes]       << [40, 50, 4, 4, confirmation_result_one_hash]
-** Processing line: ~    confirmation_result_two_hash[:scenes]       << [40, 40, 4, 4, confirmation_result_four_hash] if result_four_scene~
+        [22, 20, 10, 10, "This spot--, on the mountain, right here, it's-- perfect. This- is where- I'll-- yeet-- the person-- who is playing-- this- prank- on me."]
+** Processing line: ~      ],~
 - Inside source: true
 *** True Line Result
-    confirmation_result_two_hash[:scenes]       << [40, 40, 4, 4, confirmation_result_four_hash] if result_four_scene
-** Processing line: ~    confirmation_result_two_hash[:scenes]       << [40, 30, 4, 4, confirmation_result_three_hash] if result_three_scene~
+      ],
+** Processing line: ~      render_override: :blinking_light_path_to_observatory_render~
 - Inside source: true
 *** True Line Result
-    confirmation_result_two_hash[:scenes]       << [40, 30, 4, 4, confirmation_result_three_hash] if result_three_scene
-** Processing line: ~    confirmation_result_two_hash[:scenes]       << [60, 20, 4, 4, result_two_scene]~
+      render_override: :blinking_light_path_to_observatory_render
+** Processing line: ~    }~
 - Inside source: true
 *** True Line Result
-    confirmation_result_two_hash[:scenes]       << [60, 20, 4, 4, result_two_scene]
-** Processing line: ~    confirmation_result_two_hash[:storylines]   << [40, 20, 4, 4, "#{result_two_label}: \"#{result_two_text}\""]~
+    }
+** Processing line: ~  end~
 - Inside source: true
 *** True Line Result
-    confirmation_result_two_hash[:storylines]   << [40, 20, 4, 4, "#{result_two_label}: \"#{result_two_text}\""]
+  end
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~    confirmation_result_three_hash[:scenes]     << [20, 35, 4, 4, top_level_hash]~
-- Inside source: true
-*** True Line Result
-    confirmation_result_three_hash[:scenes]     << [20, 35, 4, 4, top_level_hash]
-** Processing line: ~    confirmation_result_three_hash[:scenes]     << [40, 50, 4, 4, confirmation_result_one_hash]~
+** Processing line: ~  def final_message_observatory args~
 - Inside source: true
 *** True Line Result
-    confirmation_result_three_hash[:scenes]     << [40, 50, 4, 4, confirmation_result_one_hash]
-** Processing line: ~    confirmation_result_three_hash[:scenes]     << [40, 40, 4, 4, confirmation_result_four_hash]~
+  def final_message_observatory args
+** Processing line: ~    if args.state.scene_history.include? :replied_with_whole_truth~
 - Inside source: true
 *** True Line Result
-    confirmation_result_three_hash[:scenes]     << [40, 40, 4, 4, confirmation_result_four_hash]
-** Processing line: ~    confirmation_result_three_hash[:scenes]     << [60, 30, 4, 4, result_three_scene]~
+    if args.state.scene_history.include? :replied_with_whole_truth
+** Processing line: ~      return {~
 - Inside source: true
 *** True Line Result
-    confirmation_result_three_hash[:scenes]     << [60, 30, 4, 4, result_three_scene]
-** Processing line: ~    confirmation_result_three_hash[:storylines] << [40, 30, 4, 4, "#{result_three_label}: \"#{result_three_text}\""]~
+      return {
+** Processing line: ~        background: 'sprites/inside-observatory.png',~
 - Inside source: true
 *** True Line Result
-    confirmation_result_three_hash[:storylines] << [40, 30, 4, 4, "#{result_three_label}: \"#{result_three_text}\""]
-** Processing line: ~    confirmation_result_three_hash[:scenes]     << [40, 20, 4, 4, confirmation_result_two_hash]~
+        background: 'sprites/inside-observatory.png',
+** Processing line: ~        fade: 60,~
 - Inside source: true
 *** True Line Result
-    confirmation_result_three_hash[:scenes]     << [40, 20, 4, 4, confirmation_result_two_hash]
-** Processing line: ~~
+        fade: 60,
+** Processing line: ~        player: [51, 12],~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~    confirmation_result_four_hash[:scenes]      << [20, 35, 4, 4, top_level_hash]~
+        player: [51, 12],
+** Processing line: ~        storylines: [~
 - Inside source: true
 *** True Line Result
-    confirmation_result_four_hash[:scenes]      << [20, 35, 4, 4, top_level_hash]
-** Processing line: ~    confirmation_result_four_hash[:scenes]      << [40, 50, 4, 4, confirmation_result_one_hash]~
+        storylines: [
+** Processing line: ~          [50, 10, 4, 4, "Here-- we- go..."]~
 - Inside source: true
 *** True Line Result
-    confirmation_result_four_hash[:scenes]      << [40, 50, 4, 4, confirmation_result_one_hash]
-** Processing line: ~    confirmation_result_four_hash[:scenes]      << [60, 40, 4, 4, result_four_scene]~
+          [50, 10, 4, 4, "Here-- we- go..."]
+** Processing line: ~        ],~
 - Inside source: true
 *** True Line Result
-    confirmation_result_four_hash[:scenes]      << [60, 40, 4, 4, result_four_scene]
-** Processing line: ~    confirmation_result_four_hash[:storylines]  << [40, 40, 4, 4, "#{result_four_label}: \"#{result_four_text}\""]~
+        ],
+** Processing line: ~        scenes: [~
 - Inside source: true
 *** True Line Result
-    confirmation_result_four_hash[:storylines]  << [40, 40, 4, 4, "#{result_four_label}: \"#{result_four_text}\""]
-** Processing line: ~    confirmation_result_four_hash[:scenes]      << [40, 30, 4, 4, confirmation_result_three_hash]~
+        scenes: [
+** Processing line: ~          [30, 18, 5, 12, :final_message_inside_mainframe]~
 - Inside source: true
 *** True Line Result
-    confirmation_result_four_hash[:scenes]      << [40, 30, 4, 4, confirmation_result_three_hash]
-** Processing line: ~    confirmation_result_four_hash[:scenes]      << [40, 20, 4, 4, confirmation_result_two_hash]~
+          [30, 18, 5, 12, :final_message_inside_mainframe]
+** Processing line: ~        ],~
 - Inside source: true
 *** True Line Result
-    confirmation_result_four_hash[:scenes]      << [40, 20, 4, 4, confirmation_result_two_hash]
-** Processing line: ~~
+        ],
+** Processing line: ~        render_override: :blinking_light_inside_observatory_render~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~    top_level_hash[:scenes]     << [40, 50, 4, 4, confirmation_result_one_hash]~
+        render_override: :blinking_light_inside_observatory_render
+** Processing line: ~      }~
 - Inside source: true
 *** True Line Result
-    top_level_hash[:scenes]     << [40, 50, 4, 4, confirmation_result_one_hash]
-** Processing line: ~    top_level_hash[:scenes]     << [40, 40, 4, 4, confirmation_result_four_hash] if result_four_scene~
+      }
+** Processing line: ~    else~
 - Inside source: true
 *** True Line Result
-    top_level_hash[:scenes]     << [40, 40, 4, 4, confirmation_result_four_hash] if result_four_scene
-** Processing line: ~    top_level_hash[:scenes]     << [40, 30, 4, 4, confirmation_result_three_hash] if result_three_scene~
+    else
+** Processing line: ~      return {~
 - Inside source: true
 *** True Line Result
-    top_level_hash[:scenes]     << [40, 30, 4, 4, confirmation_result_three_hash] if result_three_scene
-** Processing line: ~    top_level_hash[:scenes]     << [40, 20, 4, 4, confirmation_result_two_hash]~
+      return {
+** Processing line: ~        background: 'sprites/inside-observatory.png',~
 - Inside source: true
 *** True Line Result
-    top_level_hash[:scenes]     << [40, 20, 4, 4, confirmation_result_two_hash]
-** Processing line: ~~
+        background: 'sprites/inside-observatory.png',
+** Processing line: ~        fade: 60,~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~    top_level_hash~
+        fade: 60,
+** Processing line: ~        player: [51, 12],~
 - Inside source: true
 *** True Line Result
-    top_level_hash
-** Processing line: ~  end~
+        player: [51, 12],
+** Processing line: ~        storylines: [~
 - Inside source: true
 *** True Line Result
-  end
-** Processing line: ~~
+        storylines: [
+** Processing line: ~          [50, 10, 4, 4, "I feel like I'm-- walking-- on sunshine!"]~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~  def ship_control_hotspot offset_x, offset_y, a, b, c, d~
+          [50, 10, 4, 4, "I feel like I'm-- walking-- on sunshine!"]
+** Processing line: ~        ],~
 - Inside source: true
 *** True Line Result
-  def ship_control_hotspot offset_x, offset_y, a, b, c, d
-** Processing line: ~    results = []~
+        ],
+** Processing line: ~        scenes: [~
 - Inside source: true
 *** True Line Result
-    results = []
-** Processing line: ~    results << [ 6 + offset_x, 0 + offset_y, 4, 4, a]  if a~
+        scenes: [
+** Processing line: ~          [30, 18, 5, 12, :final_message_inside_mainframe]~
 - Inside source: true
 *** True Line Result
-    results << [ 6 + offset_x, 0 + offset_y, 4, 4, a]  if a
-** Processing line: ~    results << [ 1 + offset_x, 5 + offset_y, 4, 4, b]  if b~
+          [30, 18, 5, 12, :final_message_inside_mainframe]
+** Processing line: ~        ],~
 - Inside source: true
 *** True Line Result
-    results << [ 1 + offset_x, 5 + offset_y, 4, 4, b]  if b
-** Processing line: ~    results << [ 6 + offset_x, 5 + offset_y, 4, 4, c]  if c~
+        ],
+** Processing line: ~        render_override: :blinking_light_inside_observatory_render~
 - Inside source: true
 *** True Line Result
-    results << [ 6 + offset_x, 5 + offset_y, 4, 4, c]  if c
-** Processing line: ~    results << [ 11 + offset_x, 5 + offset_y, 4, 4, d] if d~
+        render_override: :blinking_light_inside_observatory_render
+** Processing line: ~      }~
 - Inside source: true
 *** True Line Result
-    results << [ 11 + offset_x, 5 + offset_y, 4, 4, d] if d
-** Processing line: ~    results~
+      }
+** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
-    results
+    end
 ** Processing line: ~  end~
 - Inside source: true
 *** True Line Result
@@ -137527,42 +143327,34 @@ Follows is a source code listing for all files that have been open sourced. This
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~  def reload_current_scene~
-- Inside source: true
-*** True Line Result
-  def reload_current_scene
-** Processing line: ~    if $gtk.args.state.last_hotspot_scene~
-- Inside source: true
-*** True Line Result
-    if $gtk.args.state.last_hotspot_scene
-** Processing line: ~      set_scene $gtk.args, send($gtk.args.state.last_hotspot_scene, $gtk.args)~
+** Processing line: ~  def final_message_inside_mainframe args~
 - Inside source: true
 *** True Line Result
-      set_scene $gtk.args, send($gtk.args.state.last_hotspot_scene, $gtk.args)
-** Processing line: ~      tick $gtk.args~
+  def final_message_inside_mainframe args
+** Processing line: ~    {~
 - Inside source: true
 *** True Line Result
-      tick $gtk.args
-** Processing line: ~    elsif respond_to? :set_scene~
+    {
+** Processing line: ~      player: [32, 4],~
 - Inside source: true
 *** True Line Result
-    elsif respond_to? :set_scene
-** Processing line: ~      set_scene $gtk.args, (replied_to_serenity_alive_firmly $gtk.args)~
+      player: [32, 4],
+** Processing line: ~      background: 'sprites/mainframe.png',~
 - Inside source: true
 *** True Line Result
-      set_scene $gtk.args, (replied_to_serenity_alive_firmly $gtk.args)
-** Processing line: ~      tick $gtk.args~
+      background: 'sprites/mainframe.png',
+** Processing line: ~      fade: 60,~
 - Inside source: true
 *** True Line Result
-      tick $gtk.args
-** Processing line: ~    end~
+      fade: 60,
+** Processing line: ~      scenes: [[45, 45,  4, 4, :final_message_check_ship_status]]~
 - Inside source: true
 *** True Line Result
-    end
-** Processing line: ~    $gtk.console.close~
+      scenes: [[45, 45,  4, 4, :final_message_check_ship_status]]
+** Processing line: ~    }~
 - Inside source: true
 *** True Line Result
-    $gtk.console.close
+    }
 ** Processing line: ~  end~
 - Inside source: true
 *** True Line Result
@@ -137571,54 +143363,26 @@ Follows is a source code listing for all files that have been open sourced. This
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~#+end_src~
-- Line was identified as the end of a code block.
-*** True Line Result
-#+end_src
-** Processing line: ~~
-- End of paragraph detected.
-*** True Line Result
-
-** Processing line: ~*** Rpg Narrative - Return Of Serenity - storyline_anka.rb~
-- Header detected.
-*** True Line Result
-
-*** True Line Result
-*** Rpg Narrative - Return Of Serenity - storyline_anka.rb
-** Processing line: ~#+begin_src ruby~
-- Line was identified as the beginning of a code block.
-*** True Line Result
-
-*** True Line Result
-#+begin_src ruby
-** Processing line: ~  # ./samples/99_genre_rpg_narrative/return_of_serenity/app/storyline_anka.rb~
-- Inside source: true
-*** True Line Result
-  # ./samples/99_genre_rpg_narrative/return_of_serenity/app/storyline_anka.rb
-** Processing line: ~  def anka_inside_room args~
+** Processing line: ~  def final_message_check_ship_status args~
 - Inside source: true
 *** True Line Result
-  def anka_inside_room args
+  def final_message_check_ship_status args
 ** Processing line: ~    {~
 - Inside source: true
 *** True Line Result
     {
-** Processing line: ~      background: 'sprites/inside-home.png',~
-- Inside source: true
-*** True Line Result
-      background: 'sprites/inside-home.png',
-** Processing line: ~      player: [34, 35],~
+** Processing line: ~      background: 'sprites/mainframe.png',~
 - Inside source: true
 *** True Line Result
-      player: [34, 35],
+      background: 'sprites/mainframe.png',
 ** Processing line: ~      storylines: [~
 - Inside source: true
 *** True Line Result
       storylines: [
-** Processing line: ~        [34, 34, 4, 4, "Ahhhh!!! Oh god, it was just- a nightmare."],~
+** Processing line: ~        [45, 45, 4, 4, (final_message_current args)],~
 - Inside source: true
 *** True Line Result
-        [34, 34, 4, 4, "Ahhhh!!! Oh god, it was just- a nightmare."],
+        [45, 45, 4, 4, (final_message_current args)],
 ** Processing line: ~      ],~
 - Inside source: true
 *** True Line Result
@@ -137627,10 +143391,10 @@ Follows is a source code listing for all files that have been open sourced. This
 - Inside source: true
 *** True Line Result
       scenes: [
-** Processing line: ~        [32, -1, 8, 3, :anka_observatory]~
+** Processing line: ~        [*hotspot_top, :final_message_ship_status],~
 - Inside source: true
 *** True Line Result
-        [32, -1, 8, 3, :anka_observatory]
+        [*hotspot_top, :final_message_ship_status],
 ** Processing line: ~      ]~
 - Inside source: true
 *** True Line Result
@@ -137647,54 +143411,54 @@ Follows is a source code listing for all files that have been open sourced. This
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~  def anka_observatory args~
+** Processing line: ~  def final_message_ship_status args~
 - Inside source: true
 *** True Line Result
-  def anka_observatory args
+  def final_message_ship_status args
 ** Processing line: ~    {~
 - Inside source: true
 *** True Line Result
     {
-** Processing line: ~      background: 'sprites/inside-observatory.png',~
+** Processing line: ~      background: 'sprites/serenity.png',~
 - Inside source: true
 *** True Line Result
-      background: 'sprites/inside-observatory.png',
+      background: 'sprites/serenity.png',
 ** Processing line: ~      fade: 60,~
 - Inside source: true
 *** True Line Result
       fade: 60,
-** Processing line: ~      player: [51, 12],~
+** Processing line: ~      player: [30, 10],~
 - Inside source: true
 *** True Line Result
-      player: [51, 12],
-** Processing line: ~      storylines: [~
+      player: [30, 10],
+** Processing line: ~      scenes: [~
 - Inside source: true
 *** True Line Result
-      storylines: [
-** Processing line: ~        [50, 10, 4, 4,   "Breathe, Hiro. Just see what's there... everything--- will- be okay."]~
+      scenes: [
+** Processing line: ~        [30, 50, 4, 4, :final_message_ship_status_reviewed]~
 - Inside source: true
 *** True Line Result
-        [50, 10, 4, 4,   "Breathe, Hiro. Just see what's there... everything--- will- be okay."]
+        [30, 50, 4, 4, :final_message_ship_status_reviewed]
 ** Processing line: ~      ],~
 - Inside source: true
 *** True Line Result
       ],
-** Processing line: ~      scenes: [~
+** Processing line: ~      storylines: [~
 - Inside source: true
 *** True Line Result
-      scenes: [
-** Processing line: ~        [30, 18, 5, 12, :anka_inside_mainframe]~
+      storylines: [
+** Processing line: ~        [30,  8, 4, 4, "Let me make- sure- everything--- looks good. It'll-- give me peace- of mind."],~
 - Inside source: true
 *** True Line Result
-        [30, 18, 5, 12, :anka_inside_mainframe]
-** Processing line: ~      ],~
+        [30,  8, 4, 4, "Let me make- sure- everything--- looks good. It'll-- give me peace- of mind."],
+** Processing line: ~        *final_message_ship_status_shared(args)~
 - Inside source: true
 *** True Line Result
-      ],
-** Processing line: ~      render_override: :blinking_light_inside_observatory_render~
+        *final_message_ship_status_shared(args)
+** Processing line: ~      ]~
 - Inside source: true
 *** True Line Result
-      render_override: :blinking_light_inside_observatory_render
+      ]
 ** Processing line: ~    }~
 - Inside source: true
 *** True Line Result
@@ -137707,50 +143471,42 @@ Follows is a source code listing for all files that have been open sourced. This
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~  def anka_inside_mainframe args~
+** Processing line: ~  def final_message_ship_status_reviewed args~
 - Inside source: true
 *** True Line Result
-  def anka_inside_mainframe args
+  def final_message_ship_status_reviewed args
 ** Processing line: ~    {~
 - Inside source: true
 *** True Line Result
     {
-** Processing line: ~      player: [32, 4],~
-- Inside source: true
-*** True Line Result
-      player: [32, 4],
-** Processing line: ~      background: 'sprites/mainframe.png',~
+** Processing line: ~      background: 'sprites/serenity.png',~
 - Inside source: true
 *** True Line Result
-      background: 'sprites/mainframe.png',
+      background: 'sprites/serenity.png',
 ** Processing line: ~      fade: 60,~
 - Inside source: true
 *** True Line Result
       fade: 60,
-** Processing line: ~      storylines: [~
-- Inside source: true
-*** True Line Result
-      storylines: [
-** Processing line: ~        [22, 45, 17, 4, (anka_last_reply args)],~
+** Processing line: ~      scenes: [~
 - Inside source: true
 *** True Line Result
-        [22, 45, 17, 4, (anka_last_reply args)],
-** Processing line: ~        [45, 45,  4, 4, (anka_current_reply args)],~
+      scenes: [
+** Processing line: ~        [*hotspot_bottom, :final_message_summary]~
 - Inside source: true
 *** True Line Result
-        [45, 45,  4, 4, (anka_current_reply args)],
+        [*hotspot_bottom, :final_message_summary]
 ** Processing line: ~      ],~
 - Inside source: true
 *** True Line Result
       ],
-** Processing line: ~      scenes: [~
+** Processing line: ~      storylines: [~
 - Inside source: true
 *** True Line Result
-      scenes: [
-** Processing line: ~        [*hotspot_top_right, :reply_to_anka]~
+      storylines: [
+** Processing line: ~        [0, 62, 62, 3, "Whew. Everyone-- is in their- chambers. The engines-- are roaring-- and Serenity-- is coming-- home."],~
 - Inside source: true
 *** True Line Result
-        [*hotspot_top_right, :reply_to_anka]
+        [0, 62, 62, 3, "Whew. Everyone-- is in their- chambers. The engines-- are roaring-- and Serenity-- is coming-- home."],
 ** Processing line: ~      ]~
 - Inside source: true
 *** True Line Result
@@ -137767,194 +143523,150 @@ Follows is a source code listing for all files that have been open sourced. This
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~  def reply_to_anka args~
-- Inside source: true
-*** True Line Result
-  def reply_to_anka args
-** Processing line: ~    decision_graph anka_current_reply(args),~
-- Inside source: true
-*** True Line Result
-    decision_graph anka_current_reply(args),
-** Processing line: ~                   "Matthew's-- wife is doing-- well. What's-- even-- better-- is that he's-- a dad, and he didn't-- even-- know it. Should- I- leave- out the part about-- the crew- being-- in hibernation-- for 20-- years? They- should- enter-- statis-- on a high- note... Right?",~
-- Inside source: true
-*** True Line Result
-                   "Matthew's-- wife is doing-- well. What's-- even-- better-- is that he's-- a dad, and he didn't-- even-- know it. Should- I- leave- out the part about-- the crew- being-- in hibernation-- for 20-- years? They- should- enter-- statis-- on a high- note... Right?",
-** Processing line: ~                   [:replied_with_whole_truth, "Whole-- Truth--", anka_reply_whole_truth],~
-- Inside source: true
-*** True Line Result
-                   [:replied_with_whole_truth, "Whole-- Truth--", anka_reply_whole_truth],
-** Processing line: ~                   [:replied_with_half_truth, "Half-- Truth--", anka_reply_half_truth]~
-- Inside source: true
-*** True Line Result
-                   [:replied_with_half_truth, "Half-- Truth--", anka_reply_half_truth]
-** Processing line: ~  end~
-- Inside source: true
-*** True Line Result
-  end
-** Processing line: ~~
-- Inside source: true
-*** True Line Result
-
-** Processing line: ~  def anka_last_reply args~
-- Inside source: true
-*** True Line Result
-  def anka_last_reply args
-** Processing line: ~    if args.state.scene_history.include? :replied_to_serenity_alive_firmly~
-- Inside source: true
-*** True Line Result
-    if args.state.scene_history.include? :replied_to_serenity_alive_firmly
-** Processing line: ~      return "Buffer--: #{serenity_alive_firm_reply.quote}"~
-- Inside source: true
-*** True Line Result
-      return "Buffer--: #{serenity_alive_firm_reply.quote}"
-** Processing line: ~    else~
-- Inside source: true
-*** True Line Result
-    else
-** Processing line: ~      return "Buffer--: #{serenity_alive_sugarcoated_reply.quote}"~
+** Processing line: ~  def final_message_ship_status_shared args~
 - Inside source: true
 *** True Line Result
-      return "Buffer--: #{serenity_alive_sugarcoated_reply.quote}"
-** Processing line: ~    end~
+  def final_message_ship_status_shared args
+** Processing line: ~    [~
 - Inside source: true
 *** True Line Result
-    end
-** Processing line: ~  end~
+    [
+** Processing line: ~      *ship_control_hotspot( 0, 50,~
 - Inside source: true
 *** True Line Result
-  end
-** Processing line: ~~
+      *ship_control_hotspot( 0, 50,
+** Processing line: ~                             "Stasis-- Chambers--: Online, All chambers-- are powered. Battery--- Allocation---: 3--- of-- 3--.",~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~  def anka_reply_whole_truth~
+                             "Stasis-- Chambers--: Online, All chambers-- are powered. Battery--- Allocation---: 3--- of-- 3--.",
+** Processing line: ~                             "Matthew's--- Chamber--: OCCUPIED----",~
 - Inside source: true
 *** True Line Result
-  def anka_reply_whole_truth
-** Processing line: ~    "Matthew's wife is doing-- very-- well. In fact, she was pregnant. Matthew-- is a dad. He has a son. But, I need- all-- of-- you-- to brace-- yourselves. You've-- been in statis-- for 20 years. A lot has changed. Most of Earth's-- population--- didn't-- survive. Tell- Matthew-- that I'm-- sorry he didn't-- get to see- his- son grow- up."~
+                             "Matthew's--- Chamber--: OCCUPIED----",
+** Processing line: ~                             "Aanka's--- Chamber--: OCCUPIED----",~
 - Inside source: true
 *** True Line Result
-    "Matthew's wife is doing-- very-- well. In fact, she was pregnant. Matthew-- is a dad. He has a son. But, I need- all-- of-- you-- to brace-- yourselves. You've-- been in statis-- for 20 years. A lot has changed. Most of Earth's-- population--- didn't-- survive. Tell- Matthew-- that I'm-- sorry he didn't-- get to see- his- son grow- up."
-** Processing line: ~  end~
+                             "Aanka's--- Chamber--: OCCUPIED----",
+** Processing line: ~                             "Sasha's--- Chamber--: OCCUPIED----"),~
 - Inside source: true
 *** True Line Result
-  end
-** Processing line: ~~
+                             "Sasha's--- Chamber--: OCCUPIED----"),
+** Processing line: ~      *ship_control_hotspot(12, 35,~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~  def anka_reply_half_truth~
+      *ship_control_hotspot(12, 35,
+** Processing line: ~                            "Life- Support--: Not-- Needed---",~
 - Inside source: true
 *** True Line Result
-  def anka_reply_half_truth
-** Processing line: ~    "Matthew's--- wife- is doing-- very-- well. In fact, she was pregnant. Matthew is a dad! It's a boy! Tell- Matthew-- congrats-- for me. Hope-- to see- all of you- soon."~
+                            "Life- Support--: Not-- Needed---",
+** Processing line: ~                            "O2--- Production---: OFF---",~
 - Inside source: true
 *** True Line Result
-    "Matthew's--- wife- is doing-- very-- well. In fact, she was pregnant. Matthew is a dad! It's a boy! Tell- Matthew-- congrats-- for me. Hope-- to see- all of you- soon."
-** Processing line: ~  end~
+                            "O2--- Production---: OFF---",
+** Processing line: ~                            "CO2--- Scrubbers---: OFF---",~
 - Inside source: true
 *** True Line Result
-  end
-** Processing line: ~~
+                            "CO2--- Scrubbers---: OFF---",
+** Processing line: ~                            "H2O--- Production---: OFF---"),~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~  def replied_with_whole_truth args~
+                            "H2O--- Production---: OFF---"),
+** Processing line: ~      *ship_control_hotspot(24, 20,~
 - Inside source: true
 *** True Line Result
-  def replied_with_whole_truth args
-** Processing line: ~    {~
+      *ship_control_hotspot(24, 20,
+** Processing line: ~                            "Navigation: Offline---",~
 - Inside source: true
 *** True Line Result
-    {
-** Processing line: ~      background: 'sprites/inside-observatory.png',~
+                            "Navigation: Offline---",
+** Processing line: ~                            "Sensor: OFF---",~
 - Inside source: true
 *** True Line Result
-      background: 'sprites/inside-observatory.png',
-** Processing line: ~      fade: 60,~
+                            "Sensor: OFF---",
+** Processing line: ~                            "Heads- Up- Display: DAMAGED---",~
 - Inside source: true
 *** True Line Result
-      fade: 60,
-** Processing line: ~      player: [32, 21],~
+                            "Heads- Up- Display: DAMAGED---",
+** Processing line: ~                            "Arithmetic--- Unit: DAMAGED----"),~
 - Inside source: true
 *** True Line Result
-      player: [32, 21],
-** Processing line: ~      scenes: [[60, 0, 4, 32, :replied_to_anka_back_home]],~
+                            "Arithmetic--- Unit: DAMAGED----"),
+** Processing line: ~      *ship_control_hotspot(36, 35,~
 - Inside source: true
 *** True Line Result
-      scenes: [[60, 0, 4, 32, :replied_to_anka_back_home]],
-** Processing line: ~      storylines: [~
+      *ship_control_hotspot(36, 35,
+** Processing line: ~                            "COMM: Underpowered----",~
 - Inside source: true
 *** True Line Result
-      storylines: [
-** Processing line: ~        [30, 18, 5, 12, "Buffer-- has been set to: #{anka_reply_whole_truth.quote}"],~
+                            "COMM: Underpowered----",
+** Processing line: ~                            "Text: ON---",~
 - Inside source: true
 *** True Line Result
-        [30, 18, 5, 12, "Buffer-- has been set to: #{anka_reply_whole_truth.quote}"],
-** Processing line: ~        [30, 10, 5, 4, "I- hope- I- did the right- thing- by laying-- it all- out- there."],~
+                            "Text: ON---",
+** Processing line: ~                            "Audio: SEGFAULT---",~
 - Inside source: true
 *** True Line Result
-        [30, 10, 5, 4, "I- hope- I- did the right- thing- by laying-- it all- out- there."],
-** Processing line: ~      ]~
+                            "Audio: SEGFAULT---",
+** Processing line: ~                            "Video: DAMAGED---"),~
 - Inside source: true
 *** True Line Result
-      ]
-** Processing line: ~    }~
+                            "Video: DAMAGED---"),
+** Processing line: ~      *ship_control_hotspot(48, 50,~
 - Inside source: true
 *** True Line Result
-    }
-** Processing line: ~  end~
+      *ship_control_hotspot(48, 50,
+** Processing line: ~                            "Engine: Online, Coordinates--- Set- for Earth. Battery--- Allocation---: 3--- of-- 3---",~
 - Inside source: true
 *** True Line Result
-  end
-** Processing line: ~~
+                            "Engine: Online, Coordinates--- Set- for Earth. Battery--- Allocation---: 3--- of-- 3---",
+** Processing line: ~                            "Engine I: ON---",~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~  def replied_with_half_truth args~
+                            "Engine I: ON---",
+** Processing line: ~                            "Engine II: ON---",~
 - Inside source: true
 *** True Line Result
-  def replied_with_half_truth args
-** Processing line: ~    {~
+                            "Engine II: ON---",
+** Processing line: ~                            "Engine III: ON---")~
 - Inside source: true
 *** True Line Result
-    {
-** Processing line: ~      background: 'sprites/inside-observatory.png',~
+                            "Engine III: ON---")
+** Processing line: ~    ]~
 - Inside source: true
 *** True Line Result
-      background: 'sprites/inside-observatory.png',
-** Processing line: ~      fade: 60,~
+    ]
+** Processing line: ~  end~
 - Inside source: true
 *** True Line Result
-      fade: 60,
-** Processing line: ~      player: [32, 21],~
+  end
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-      player: [32, 21],
-** Processing line: ~      scenes: [[60, 0, 4, 32, :replied_to_anka_back_home]],~
+
+** Processing line: ~  def final_message_last_reply args~
 - Inside source: true
 *** True Line Result
-      scenes: [[60, 0, 4, 32, :replied_to_anka_back_home]],
-** Processing line: ~      storylines: [~
+  def final_message_last_reply args
+** Processing line: ~    if args.state.scene_history.include? :replied_with_whole_truth~
 - Inside source: true
 *** True Line Result
-      storylines: [
-** Processing line: ~        [30, 18, 5, 12, "Buffer-- has been set to: #{anka_reply_half_truth.quote}"],~
+    if args.state.scene_history.include? :replied_with_whole_truth
+** Processing line: ~      return "Buffer--: #{anka_reply_whole_truth.quote}"~
 - Inside source: true
 *** True Line Result
-        [30, 18, 5, 12, "Buffer-- has been set to: #{anka_reply_half_truth.quote}"],
-** Processing line: ~        [30, 10, 5, 4, "I- hope- I- did the right- thing- by not giving-- them- the whole- truth."],~
+      return "Buffer--: #{anka_reply_whole_truth.quote}"
+** Processing line: ~    else~
 - Inside source: true
 *** True Line Result
-        [30, 10, 5, 4, "I- hope- I- did the right- thing- by not giving-- them- the whole- truth."],
-** Processing line: ~      ]~
+    else
+** Processing line: ~      return "Buffer--: #{anka_reply_half_truth.quote}"~
 - Inside source: true
 *** True Line Result
-      ]
-** Processing line: ~    }~
+      return "Buffer--: #{anka_reply_half_truth.quote}"
+** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
-    }
+    end
 ** Processing line: ~  end~
 - Inside source: true
 *** True Line Result
@@ -137963,26 +143675,26 @@ Follows is a source code listing for all files that have been open sourced. This
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~  def anka_current_reply args~
+** Processing line: ~  def final_message_current args~
 - Inside source: true
 *** True Line Result
-  def anka_current_reply args
-** Processing line: ~    if args.state.scene_history.include? :replied_to_serenity_alive_firmly~
+  def final_message_current args
+** Processing line: ~    if args.state.scene_history.include? :replied_with_whole_truth~
 - Inside source: true
 *** True Line Result
-    if args.state.scene_history.include? :replied_to_serenity_alive_firmly
-** Processing line: ~      return "Hello. This is, Aanka. Sasha-- is still- trying-- to gather-- her wits about-- her, given- the gravity--- of your- last- reply. Thank- you- for being-- honest, and thank- you- for the help- with the ship- diagnostics. I was able-- to retrieve-- all of the navigation--- information---- after-- the battery--- swap. We- are ready-- to head back to Earth. Before-- we go- back- into-- statis, Matthew--- wanted-- to know- how his- wife- is doing. Please- reply-- as soon- as you can. He's-- not going-- to get- into-- the statis-- chamber-- until-- he knows- his wife is okay."~
+    if args.state.scene_history.include? :replied_with_whole_truth
+** Processing line: ~      return "Hey... It's-- me Sasha. Aanka-- is trying-- her best to comfort-- Matthew. This- is the first- time- I've-- ever-- seen-- Matthew-- cry. We'll-- probably-- be in stasis-- by the time you get this message--. Thank- you- again-- for all your help. I look forward-- to meeting-- you in person."~
 - Inside source: true
 *** True Line Result
-      return "Hello. This is, Aanka. Sasha-- is still- trying-- to gather-- her wits about-- her, given- the gravity--- of your- last- reply. Thank- you- for being-- honest, and thank- you- for the help- with the ship- diagnostics. I was able-- to retrieve-- all of the navigation--- information---- after-- the battery--- swap. We- are ready-- to head back to Earth. Before-- we go- back- into-- statis, Matthew--- wanted-- to know- how his- wife- is doing. Please- reply-- as soon- as you can. He's-- not going-- to get- into-- the statis-- chamber-- until-- he knows- his wife is okay."
+      return "Hey... It's-- me Sasha. Aanka-- is trying-- her best to comfort-- Matthew. This- is the first- time- I've-- ever-- seen-- Matthew-- cry. We'll-- probably-- be in stasis-- by the time you get this message--. Thank- you- again-- for all your help. I look forward-- to meeting-- you in person."
 ** Processing line: ~    else~
 - Inside source: true
 *** True Line Result
     else
-** Processing line: ~      return "Hello. This is, Aanka. Thank- you for the help- with the ship's-- diagnostics. I was able-- to retrieve-- all of the navigation--- information--- after-- the battery-- swap. I- know-- that- you didn't-- tell- the whole truth- about-- how far we are from- Earth. Don't-- worry. I understand-- why you did it. We- are ready-- to head back to Earth. Before-- we go- back- into-- statis, Matthew--- wanted-- to know- how his- wife- is doing. Please- reply-- as soon- as you can. He's-- not going-- to get- into-- the statis-- chamber-- until-- he knows- his wife is okay."~
+** Processing line: ~      return "Hey! It's-- me Sasha! LOL! Aanka-- and Matthew-- are dancing-- around-- like- goofballs--! They- are both- so adorable! Only-- this- tiny-- little-- genius-- can make-- a battle-- hardened-- general--- put- on a tiara-- and dance- around-- like a fairy-- princess-- XD------ Anyways, we are heading-- back into-- the chambers--. I hope our welcome-- home- parade-- has fireworks!"~
 - Inside source: true
 *** True Line Result
-      return "Hello. This is, Aanka. Thank- you for the help- with the ship's-- diagnostics. I was able-- to retrieve-- all of the navigation--- information--- after-- the battery-- swap. I- know-- that- you didn't-- tell- the whole truth- about-- how far we are from- Earth. Don't-- worry. I understand-- why you did it. We- are ready-- to head back to Earth. Before-- we go- back- into-- statis, Matthew--- wanted-- to know- how his- wife- is doing. Please- reply-- as soon- as you can. He's-- not going-- to get- into-- the statis-- chamber-- until-- he knows- his wife is okay."
+      return "Hey! It's-- me Sasha! LOL! Aanka-- and Matthew-- are dancing-- around-- like- goofballs--! They- are both- so adorable! Only-- this- tiny-- little-- genius-- can make-- a battle-- hardened-- general--- put- on a tiara-- and dance- around-- like a fairy-- princess-- XD------ Anyways, we are heading-- back into-- the chambers--. I hope our welcome-- home- parade-- has fireworks!"
 ** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
@@ -137995,10 +143707,10 @@ Follows is a source code listing for all files that have been open sourced. This
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~  def replied_to_anka_back_home args~
+** Processing line: ~  def final_message_summary args~
 - Inside source: true
 *** True Line Result
-  def replied_to_anka_back_home args
+  def final_message_summary args
 ** Processing line: ~    if args.state.scene_history.include? :replied_with_whole_truth~
 - Inside source: true
 *** True Line Result
@@ -138007,38 +143719,30 @@ Follows is a source code listing for all files that have been open sourced. This
 - Inside source: true
 *** True Line Result
       return {
+** Processing line: ~        background: 'sprites/inside-observatory.png',~
+- Inside source: true
+*** True Line Result
+        background: 'sprites/inside-observatory.png',
 ** Processing line: ~        fade: 60,~
 - Inside source: true
 *** True Line Result
         fade: 60,
-** Processing line: ~        background: 'sprites/inside-home.png',~
+** Processing line: ~        player: [31, 11],~
 - Inside source: true
 *** True Line Result
-        background: 'sprites/inside-home.png',
-** Processing line: ~        player: [34, 4],~
+        player: [31, 11],
+** Processing line: ~        scenes: [[60, 0, 4, 32, :final_decision_side_of_home]],~
 - Inside source: true
 *** True Line Result
-        player: [34, 4],
+        scenes: [[60, 0, 4, 32, :final_decision_side_of_home]],
 ** Processing line: ~        storylines: [~
 - Inside source: true
 *** True Line Result
         storylines: [
-** Processing line: ~          [34, 4, 4, 4, "I- hope-- this pit in my stomach-- is gone-- by tomorrow---."],~
-- Inside source: true
-*** True Line Result
-          [34, 4, 4, 4, "I- hope-- this pit in my stomach-- is gone-- by tomorrow---."],
-** Processing line: ~        ],~
-- Inside source: true
-*** True Line Result
-        ],
-** Processing line: ~        scenes: [~
-- Inside source: true
-*** True Line Result
-        scenes: [
-** Processing line: ~          [30, 38, 12, 13, :final_message_sad],~
+** Processing line: ~          [30, 10, 5, 4, "I can't-- imagine-- what they are feeling-- right now. But at least- they- know everything---, and we can- concentrate-- on rebuilding--- this world-- right- off the bat. I can't-- wait to see the future-- they'll-- help- build."],~
 - Inside source: true
 *** True Line Result
-          [30, 38, 12, 13, :final_message_sad],
+          [30, 10, 5, 4, "I can't-- imagine-- what they are feeling-- right now. But at least- they- know everything---, and we can- concentrate-- on rebuilding--- this world-- right- off the bat. I can't-- wait to see the future-- they'll-- help- build."],
 ** Processing line: ~        ]~
 - Inside source: true
 *** True Line Result
@@ -138055,38 +143759,30 @@ Follows is a source code listing for all files that have been open sourced. This
 - Inside source: true
 *** True Line Result
       return {
+** Processing line: ~        background: 'sprites/inside-observatory.png',~
+- Inside source: true
+*** True Line Result
+        background: 'sprites/inside-observatory.png',
 ** Processing line: ~        fade: 60,~
 - Inside source: true
 *** True Line Result
         fade: 60,
-** Processing line: ~        background: 'sprites/inside-home.png',~
+** Processing line: ~        player: [31, 11],~
 - Inside source: true
 *** True Line Result
-        background: 'sprites/inside-home.png',
-** Processing line: ~        player: [34, 4],~
+        player: [31, 11],
+** Processing line: ~        scenes: [[60, 0, 4, 32, :final_decision_side_of_home]],~
 - Inside source: true
 *** True Line Result
-        player: [34, 4],
+        scenes: [[60, 0, 4, 32, :final_decision_side_of_home]],
 ** Processing line: ~        storylines: [~
 - Inside source: true
 *** True Line Result
         storylines: [
-** Processing line: ~          [34, 4, 4, 4, "I- get the feeling-- I'm going-- to sleep real well tonight--."],~
-- Inside source: true
-*** True Line Result
-          [34, 4, 4, 4, "I- get the feeling-- I'm going-- to sleep real well tonight--."],
-** Processing line: ~        ],~
-- Inside source: true
-*** True Line Result
-        ],
-** Processing line: ~        scenes: [~
-- Inside source: true
-*** True Line Result
-        scenes: [
-** Processing line: ~          [30, 38, 12, 13, :final_message_happy],~
+** Processing line: ~          [30, 10, 5, 4, "They all sounded-- so happy. I know- they'll-- be in for a tough- dose- of reality--- when they- arrive. But- at least- they'll-- be around-- all- of us. We'll-- help them- cope."],~
 - Inside source: true
 *** True Line Result
-          [30, 38, 12, 13, :final_message_happy],
+          [30, 10, 5, 4, "They all sounded-- so happy. I know- they'll-- be in for a tough- dose- of reality--- when they- arrive. But- at least- they'll-- be around-- all- of us. We'll-- help them- cope."],
 ** Processing line: ~        ]~
 - Inside source: true
 *** True Line Result
@@ -138115,26 +143811,26 @@ Follows is a source code listing for all files that have been open sourced. This
 - End of paragraph detected.
 *** True Line Result
 
-** Processing line: ~*** Rpg Narrative - Return Of Serenity - storyline_blinking_light.rb~
+** Processing line: ~*** Rpg Narrative - Return Of Serenity - storyline_serenity_alive.rb~
 - Header detected.
 *** True Line Result
 
 *** True Line Result
-*** Rpg Narrative - Return Of Serenity - storyline_blinking_light.rb
+*** Rpg Narrative - Return Of Serenity - storyline_serenity_alive.rb
 ** Processing line: ~#+begin_src ruby~
 - Line was identified as the beginning of a code block.
 *** True Line Result
 
 *** True Line Result
 #+begin_src ruby
-** Processing line: ~  # ./samples/99_genre_rpg_narrative/return_of_serenity/app/storyline_blinking_light.rb~
+** Processing line: ~  # ./samples/99_genre_rpg_narrative/return_of_serenity/app/storyline_serenity_alive.rb~
 - Inside source: true
 *** True Line Result
-  # ./samples/99_genre_rpg_narrative/return_of_serenity/app/storyline_blinking_light.rb
-** Processing line: ~  def the_blinking_light args~
+  # ./samples/99_genre_rpg_narrative/return_of_serenity/app/storyline_serenity_alive.rb
+** Processing line: ~  def serenity_alive_side_of_home args~
 - Inside source: true
 *** True Line Result
-  def the_blinking_light args
+  def serenity_alive_side_of_home args
 ** Processing line: ~    {~
 - Inside source: true
 *** True Line Result
@@ -138155,10 +143851,10 @@ Follows is a source code listing for all files that have been open sourced. This
 - Inside source: true
 *** True Line Result
       scenes: [
-** Processing line: ~        [52, 24, 11, 5, :blinking_light_mountain_pass],~
+** Processing line: ~        [52, 24, 11, 5, :serenity_alive_mountain_pass],~
 - Inside source: true
 *** True Line Result
-        [52, 24, 11, 5, :blinking_light_mountain_pass],
+        [52, 24, 11, 5, :serenity_alive_mountain_pass],
 ** Processing line: ~      ],~
 - Inside source: true
 *** True Line Result
@@ -138179,10 +143875,10 @@ Follows is a source code listing for all files that have been open sourced. This
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~  def blinking_light_mountain_pass args~
+** Processing line: ~  def serenity_alive_mountain_pass args~
 - Inside source: true
 *** True Line Result
-  def blinking_light_mountain_pass args
+  def serenity_alive_mountain_pass args
 ** Processing line: ~    {~
 - Inside source: true
 *** True Line Result
@@ -138199,10 +143895,22 @@ Follows is a source code listing for all files that have been open sourced. This
 - Inside source: true
 *** True Line Result
       scenes: [
-** Processing line: ~        [18, 47, 5, 5, :blinking_light_path_to_observatory]~
+** Processing line: ~        [18, 47, 5, 5, :serenity_alive_path_to_observatory],~
 - Inside source: true
 *** True Line Result
-        [18, 47, 5, 5, :blinking_light_path_to_observatory]
+        [18, 47, 5, 5, :serenity_alive_path_to_observatory],
+** Processing line: ~      ],~
+- Inside source: true
+*** True Line Result
+      ],
+** Processing line: ~      storylines: [~
+- Inside source: true
+*** True Line Result
+      storylines: [
+** Processing line: ~        [18, 13, 5, 5, "Hnnnnnnnggg. My legs-- are still sore- from yesterday."]~
+- Inside source: true
+*** True Line Result
+        [18, 13, 5, 5, "Hnnnnnnnggg. My legs-- are still sore- from yesterday."]
 ** Processing line: ~      ],~
 - Inside source: true
 *** True Line Result
@@ -138223,10 +143931,10 @@ Follows is a source code listing for all files that have been open sourced. This
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~  def blinking_light_path_to_observatory args~
+** Processing line: ~  def serenity_alive_path_to_observatory args~
 - Inside source: true
 *** True Line Result
-  def blinking_light_path_to_observatory args
+  def serenity_alive_path_to_observatory args
 ** Processing line: ~    {~
 - Inside source: true
 *** True Line Result
@@ -138243,10 +143951,22 @@ Follows is a source code listing for all files that have been open sourced. This
 - Inside source: true
 *** True Line Result
       scenes: [
-** Processing line: ~        [0, 26, 5, 5, :blinking_light_observatory]~
+** Processing line: ~        [0, 26, 5, 5, :serenity_alive_observatory]~
 - Inside source: true
 *** True Line Result
-        [0, 26, 5, 5, :blinking_light_observatory]
+        [0, 26, 5, 5, :serenity_alive_observatory]
+** Processing line: ~      ],~
+- Inside source: true
+*** True Line Result
+      ],
+** Processing line: ~      storylines: [~
+- Inside source: true
+*** True Line Result
+      storylines: [
+** Processing line: ~        [22, 20, 10, 10, "This spot--, on the mountain, right here, it's-- perfect. This- is where- I'll-- yeet-- the person-- who is playing-- this- prank- on me."]~
+- Inside source: true
+*** True Line Result
+        [22, 20, 10, 10, "This spot--, on the mountain, right here, it's-- perfect. This- is where- I'll-- yeet-- the person-- who is playing-- this- prank- on me."]
 ** Processing line: ~      ],~
 - Inside source: true
 *** True Line Result
@@ -138267,10 +143987,10 @@ Follows is a source code listing for all files that have been open sourced. This
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~  def blinking_light_observatory args~
+** Processing line: ~  def serenity_alive_observatory args~
 - Inside source: true
 *** True Line Result
-  def blinking_light_observatory args
+  def serenity_alive_observatory args
 ** Processing line: ~    {~
 - Inside source: true
 *** True Line Result
@@ -138287,10 +144007,10 @@ Follows is a source code listing for all files that have been open sourced. This
 - Inside source: true
 *** True Line Result
       scenes: [
-** Processing line: ~        [28, 39, 4, 10, :blinking_light_inside_observatory]~
+** Processing line: ~        [28, 39, 4, 10, :serenity_alive_inside_observatory]~
 - Inside source: true
 *** True Line Result
-        [28, 39, 4, 10, :blinking_light_inside_observatory]
+        [28, 39, 4, 10, :serenity_alive_inside_observatory]
 ** Processing line: ~      ],~
 - Inside source: true
 *** True Line Result
@@ -138311,10 +144031,10 @@ Follows is a source code listing for all files that have been open sourced. This
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~  def blinking_light_inside_observatory args~
+** Processing line: ~  def serenity_alive_inside_observatory args~
 - Inside source: true
 *** True Line Result
-  def blinking_light_inside_observatory args
+  def serenity_alive_inside_observatory args
 ** Processing line: ~    {~
 - Inside source: true
 *** True Line Result
@@ -138327,26 +144047,18 @@ Follows is a source code listing for all files that have been open sourced. This
 - Inside source: true
 *** True Line Result
       player: [60, 2],
-** Processing line: ~      storylines: [~
-- Inside source: true
-*** True Line Result
-      storylines: [
-** Processing line: ~        [50, 2, 4, 8,   "That's weird. I thought- this- mainframe-- was broken--."]~
-- Inside source: true
-*** True Line Result
-        [50, 2, 4, 8,   "That's weird. I thought- this- mainframe-- was broken--."]
-** Processing line: ~      ],~
+** Processing line: ~      storylines: [],~
 - Inside source: true
 *** True Line Result
-      ],
+      storylines: [],
 ** Processing line: ~      scenes: [~
 - Inside source: true
 *** True Line Result
       scenes: [
-** Processing line: ~        [30, 18, 5, 12, :blinking_light_inside_mainframe]~
+** Processing line: ~        [30, 18, 5, 12, :serenity_alive_inside_mainframe]~
 - Inside source: true
 *** True Line Result
-        [30, 18, 5, 12, :blinking_light_inside_mainframe]
+        [30, 18, 5, 12, :serenity_alive_inside_mainframe]
 ** Processing line: ~      ],~
 - Inside source: true
 *** True Line Result
@@ -138367,10 +144079,10 @@ Follows is a source code listing for all files that have been open sourced. This
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~  def blinking_light_inside_mainframe args~
+** Processing line: ~  def serenity_alive_inside_mainframe args~
 - Inside source: true
 *** True Line Result
-  def blinking_light_inside_mainframe args
+  def serenity_alive_inside_mainframe args
 ** Processing line: ~    {~
 - Inside source: true
 *** True Line Result
@@ -138391,10 +144103,10 @@ Follows is a source code listing for all files that have been open sourced. This
 - Inside source: true
 *** True Line Result
       scenes: [
-** Processing line: ~        [62, 32, 4, 32, :reply_to_introduction]~
+** Processing line: ~        [*hotspot_top, :serenity_alive_ship_status],~
 - Inside source: true
 *** True Line Result
-        [62, 32, 4, 32, :reply_to_introduction]
+        [*hotspot_top, :serenity_alive_ship_status],
 ** Processing line: ~      ],~
 - Inside source: true
 *** True Line Result
@@ -138403,22 +144115,14 @@ Follows is a source code listing for all files that have been open sourced. This
 - Inside source: true
 *** True Line Result
       storylines: [
-** Processing line: ~        [43, 43,  8, 8, "\"Mission-- control--, your- main- comm-- channels-- seem-- to be down. My apologies-- for- using-- this low- level-- exploit--. What's-- going-- on down there? We are ready-- for reentry--.\" Message--- Timestamp---: 4- hours-- 23--- minutes-- ago--."],~
-- Inside source: true
-*** True Line Result
-        [43, 43,  8, 8, "\"Mission-- control--, your- main- comm-- channels-- seem-- to be down. My apologies-- for- using-- this low- level-- exploit--. What's-- going-- on down there? We are ready-- for reentry--.\" Message--- Timestamp---: 4- hours-- 23--- minutes-- ago--."],
-** Processing line: ~        [30, 30,  4, 4, "There's-- a low- level-- message-- here... NANI.T.F?"],~
-- Inside source: true
-*** True Line Result
-        [30, 30,  4, 4, "There's-- a low- level-- message-- here... NANI.T.F?"],
-** Processing line: ~        [14, 10, 24, 4, "Oh interesting---. This transistor--- needed-- to be activated--- for the- mainframe-- to work."],~
+** Processing line: ~        [22, 45, 17, 4, (serenity_alive_last_reply args)],~
 - Inside source: true
 *** True Line Result
-        [14, 10, 24, 4, "Oh interesting---. This transistor--- needed-- to be activated--- for the- mainframe-- to work."],
-** Processing line: ~        [14, 20, 24, 4, "What the heck activated--- this thing- though?"]~
+        [22, 45, 17, 4, (serenity_alive_last_reply args)],
+** Processing line: ~        [45, 45,  4, 4, (serenity_alive_current_message args)],~
 - Inside source: true
 *** True Line Result
-        [14, 20, 24, 4, "What the heck activated--- this thing- though?"]
+        [45, 45,  4, 4, (serenity_alive_current_message args)],
 ** Processing line: ~      ]~
 - Inside source: true
 *** True Line Result
@@ -138435,54 +144139,34 @@ Follows is a source code listing for all files that have been open sourced. This
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~#+end_src~
-- Line was identified as the end of a code block.
-*** True Line Result
-#+end_src
-** Processing line: ~~
-- End of paragraph detected.
-*** True Line Result
-
-** Processing line: ~*** Rpg Narrative - Return Of Serenity - storyline_day_one.rb~
-- Header detected.
-*** True Line Result
-
-*** True Line Result
-*** Rpg Narrative - Return Of Serenity - storyline_day_one.rb
-** Processing line: ~#+begin_src ruby~
-- Line was identified as the beginning of a code block.
-*** True Line Result
-
-*** True Line Result
-#+begin_src ruby
-** Processing line: ~  # ./samples/99_genre_rpg_narrative/return_of_serenity/app/storyline_day_one.rb~
-- Inside source: true
-*** True Line Result
-  # ./samples/99_genre_rpg_narrative/return_of_serenity/app/storyline_day_one.rb
-** Processing line: ~  def day_one_beginning args~
+** Processing line: ~  def serenity_alive_ship_status args~
 - Inside source: true
 *** True Line Result
-  def day_one_beginning args
+  def serenity_alive_ship_status args
 ** Processing line: ~    {~
 - Inside source: true
 *** True Line Result
     {
-** Processing line: ~      background: 'sprites/side-of-home.png',~
+** Processing line: ~      background: 'sprites/serenity.png',~
 - Inside source: true
 *** True Line Result
-      background: 'sprites/side-of-home.png',
-** Processing line: ~      player: [16, 13],~
+      background: 'sprites/serenity.png',
+** Processing line: ~      fade: 60,~
 - Inside source: true
 *** True Line Result
-      player: [16, 13],
+      fade: 60,
+** Processing line: ~      player: [30, 10],~
+- Inside source: true
+*** True Line Result
+      player: [30, 10],
 ** Processing line: ~      scenes: [~
 - Inside source: true
 *** True Line Result
       scenes: [
-** Processing line: ~        [0, 0, 64, 2, :day_one_infront_of_home],~
+** Processing line: ~        [30, 50, 4, 4, :serenity_alive_ship_status_reviewed]~
 - Inside source: true
 *** True Line Result
-        [0, 0, 64, 2, :day_one_infront_of_home],
+        [30, 50, 4, 4, :serenity_alive_ship_status_reviewed]
 ** Processing line: ~      ],~
 - Inside source: true
 *** True Line Result
@@ -138491,10 +144175,18 @@ Follows is a source code listing for all files that have been open sourced. This
 - Inside source: true
 *** True Line Result
       storylines: [
-** Processing line: ~        [35, 10, 6, 6,  "Man. Hard to believe- that today- is the 20th--- anniversary-- of The Impact."]~
+** Processing line: ~        [30,  8, 4, 4, "Serenity? THE--- Mission-- Serenity?! How is that possible? They- are supposed-- to be dead."],~
 - Inside source: true
 *** True Line Result
-        [35, 10, 6, 6,  "Man. Hard to believe- that today- is the 20th--- anniversary-- of The Impact."]
+        [30,  8, 4, 4, "Serenity? THE--- Mission-- Serenity?! How is that possible? They- are supposed-- to be dead."],
+** Processing line: ~        [30, 10, 4, 4, "I... can't-- believe-- it. I- can access-- Serenity's-- computer? I- guess my \"superpower----\" isn't limited-- by proximity-- to- a machine--."],~
+- Inside source: true
+*** True Line Result
+        [30, 10, 4, 4, "I... can't-- believe-- it. I- can access-- Serenity's-- computer? I- guess my \"superpower----\" isn't limited-- by proximity-- to- a machine--."],
+** Processing line: ~        *serenity_alive_shared_ship_status(args)~
+- Inside source: true
+*** True Line Result
+        *serenity_alive_shared_ship_status(args)
 ** Processing line: ~      ]~
 - Inside source: true
 *** True Line Result
@@ -138511,38 +144203,30 @@ Follows is a source code listing for all files that have been open sourced. This
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~  def day_one_infront_of_home args~
+** Processing line: ~  def serenity_alive_ship_status_reviewed args~
 - Inside source: true
 *** True Line Result
-  def day_one_infront_of_home args
+  def serenity_alive_ship_status_reviewed args
 ** Processing line: ~    {~
 - Inside source: true
 *** True Line Result
     {
-** Processing line: ~      background: 'sprites/front-of-home.png',~
+** Processing line: ~      background: 'sprites/serenity.png',~
 - Inside source: true
 *** True Line Result
-      background: 'sprites/front-of-home.png',
-** Processing line: ~      player: [56, 23],~
+      background: 'sprites/serenity.png',
+** Processing line: ~      fade: 60,~
 - Inside source: true
 *** True Line Result
-      player: [56, 23],
+      fade: 60,
 ** Processing line: ~      scenes: [~
 - Inside source: true
 *** True Line Result
       scenes: [
-** Processing line: ~        [43, 34, 10, 16, :day_one_home],~
-- Inside source: true
-*** True Line Result
-        [43, 34, 10, 16, :day_one_home],
-** Processing line: ~        [62, 0,  3, 40, :day_one_beginning],~
-- Inside source: true
-*** True Line Result
-        [62, 0,  3, 40, :day_one_beginning],
-** Processing line: ~        [0, 4, 3, 20, :day_one_ceremony]~
+** Processing line: ~        [*hotspot_bottom, :serenity_alive_time_to_reply]~
 - Inside source: true
 *** True Line Result
-        [0, 4, 3, 20, :day_one_ceremony]
+        [*hotspot_bottom, :serenity_alive_time_to_reply]
 ** Processing line: ~      ],~
 - Inside source: true
 *** True Line Result
@@ -138551,10 +144235,10 @@ Follows is a source code listing for all files that have been open sourced. This
 - Inside source: true
 *** True Line Result
       storylines: [
-** Processing line: ~        [40, 20, 4, 4, "It looks like everyone- is already- at the rememberance-- ceremony."],~
+** Processing line: ~        [0, 62, 62, 3, "Okay. Reviewing-- everything--, it looks- like- I- can- take- the batteries--- from the Stasis--- Chambers--- and- Engine--- to keep- the crew-- alive-- and-- their-- location--- pinpointed---."],~
 - Inside source: true
 *** True Line Result
-        [40, 20, 4, 4, "It looks like everyone- is already- at the rememberance-- ceremony."],
+        [0, 62, 62, 3, "Okay. Reviewing-- everything--, it looks- like- I- can- take- the batteries--- from the Stasis--- Chambers--- and- Engine--- to keep- the crew-- alive-- and-- their-- location--- pinpointed---."],
 ** Processing line: ~      ]~
 - Inside source: true
 *** True Line Result
@@ -138571,138 +144255,146 @@ Follows is a source code listing for all files that have been open sourced. This
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~  def day_one_home args~
+** Processing line: ~  def serenity_alive_time_to_reply args~
 - Inside source: true
 *** True Line Result
-  def day_one_home args
-** Processing line: ~    {~
+  def serenity_alive_time_to_reply args
+** Processing line: ~    decision_graph serenity_alive_current_message(args),~
 - Inside source: true
 *** True Line Result
-    {
-** Processing line: ~      background: 'sprites/inside-home.png',~
+    decision_graph serenity_alive_current_message(args),
+** Processing line: ~                    "Okay... time to deliver the bad news...",~
 - Inside source: true
 *** True Line Result
-      background: 'sprites/inside-home.png',
-** Processing line: ~      player: [34, 3],~
+                    "Okay... time to deliver the bad news...",
+** Processing line: ~                    [:replied_to_serenity_alive_firmly, "Firm-- Reply", serenity_alive_firm_reply],~
 - Inside source: true
 *** True Line Result
-      player: [34, 3],
-** Processing line: ~      scenes: [~
+                    [:replied_to_serenity_alive_firmly, "Firm-- Reply", serenity_alive_firm_reply],
+** Processing line: ~                    [:replied_to_serenity_alive_kindly, "Sugar-- Coated---- Reply", serenity_alive_sugarcoated_reply]~
 - Inside source: true
 *** True Line Result
-      scenes: [
-** Processing line: ~        [28, 0, 12, 2, :day_one_infront_of_home]~
+                    [:replied_to_serenity_alive_kindly, "Sugar-- Coated---- Reply", serenity_alive_sugarcoated_reply]
+** Processing line: ~  end~
 - Inside source: true
 *** True Line Result
-        [28, 0, 12, 2, :day_one_infront_of_home]
-** Processing line: ~      ],~
+  end
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-      ],
-** Processing line: ~      storylines: [~
+
+** Processing line: ~  def serenity_alive_shared_ship_status args~
 - Inside source: true
 *** True Line Result
-      storylines: [
-** Processing line: ~        [~
+  def serenity_alive_shared_ship_status args
+** Processing line: ~    [~
 - Inside source: true
 *** True Line Result
-        [
-** Processing line: ~          38, 4, 4, 4, "My mansion- in all its glory! Okay yea, it's just a shipping- container-. Apparently-, it's nothing- like the luxuries- of the 2040's. But it's- all we have- in- this day and age. And it'll suffice."~
+    [
+** Processing line: ~      *ship_control_hotspot( 0, 50,~
 - Inside source: true
 *** True Line Result
-          38, 4, 4, 4, "My mansion- in all its glory! Okay yea, it's just a shipping- container-. Apparently-, it's nothing- like the luxuries- of the 2040's. But it's- all we have- in- this day and age. And it'll suffice."
-** Processing line: ~        ],~
+      *ship_control_hotspot( 0, 50,
+** Processing line: ~                             "Stasis-- Chambers--: Online, All chambers-- are powered. Battery--- Allocation---: 3--- of-- 3--, Hmmm. They don't-- need this to be powered-- right- now. Everyone-- is awake.",~
 - Inside source: true
 *** True Line Result
-        ],
-** Processing line: ~        [~
+                             "Stasis-- Chambers--: Online, All chambers-- are powered. Battery--- Allocation---: 3--- of-- 3--, Hmmm. They don't-- need this to be powered-- right- now. Everyone-- is awake.",
+** Processing line: ~                             nil,~
 - Inside source: true
 *** True Line Result
-        [
-** Processing line: ~          28, 7, 4, 7,~
+                             nil,
+** Processing line: ~                             nil,~
 - Inside source: true
 *** True Line Result
-          28, 7, 4, 7,
-** Processing line: ~          "Ahhh. My reading- couch. It's so comfortable--."~
+                             nil,
+** Processing line: ~                             nil),~
 - Inside source: true
 *** True Line Result
-          "Ahhh. My reading- couch. It's so comfortable--."
-** Processing line: ~        ],~
+                             nil),
+** Processing line: ~      *ship_control_hotspot(12, 35,~
 - Inside source: true
 *** True Line Result
-        ],
-** Processing line: ~        [~
+      *ship_control_hotspot(12, 35,
+** Processing line: ~                            "Life- Support--: Offline, Unable--- to- Sustain-- Life. Battery--- Allocation---: 0--- of-- 3---, Okay. That is definitely---- not a good thing.",~
 - Inside source: true
 *** True Line Result
-        [
-** Processing line: ~          38, 21, 4, 4,~
+                            "Life- Support--: Offline, Unable--- to- Sustain-- Life. Battery--- Allocation---: 0--- of-- 3---, Okay. That is definitely---- not a good thing.",
+** Processing line: ~                            nil,~
 - Inside source: true
 *** True Line Result
-          38, 21, 4, 4,
-** Processing line: ~          "I'm- lucky- to have a computer--. I'm- one of the few people- with- the skills to put this- thing to good use."~
+                            nil,
+** Processing line: ~                            nil,~
 - Inside source: true
 *** True Line Result
-          "I'm- lucky- to have a computer--. I'm- one of the few people- with- the skills to put this- thing to good use."
-** Processing line: ~        ],~
+                            nil,
+** Processing line: ~                            nil),~
 - Inside source: true
 *** True Line Result
-        ],
-** Processing line: ~        [~
+                            nil),
+** Processing line: ~      *ship_control_hotspot(24, 20,~
 - Inside source: true
 *** True Line Result
-        [
-** Processing line: ~          45, 37, 4, 8,~
+      *ship_control_hotspot(24, 20,
+** Processing line: ~                            "Navigation: Offline, Unable--- to- Calculate--- Location. Battery--- Allocation---: 0--- of-- 3---, Whelp. No wonder-- Sasha-- can't-- get- any-- readings. Their- Navigation--- is completely--- offline.",~
 - Inside source: true
 *** True Line Result
-          45, 37, 4, 8,
-** Processing line: ~          "This corner- of my home- is always- warmer-. It's cause of the ref~lected-- light- from the solar-- panels--, just on the other- side- of this wall. It's hard- to believe- there was o~nce-- an unlimited- amount- of electricity--."~
+                            "Navigation: Offline, Unable--- to- Calculate--- Location. Battery--- Allocation---: 0--- of-- 3---, Whelp. No wonder-- Sasha-- can't-- get- any-- readings. Their- Navigation--- is completely--- offline.",
+** Processing line: ~                            nil,~
 - Inside source: true
 *** True Line Result
-          "This corner- of my home- is always- warmer-. It's cause of the ref~lected-- light- from the solar-- panels--, just on the other- side- of this wall. It's hard- to believe- there was o~nce-- an unlimited- amount- of electricity--."
-** Processing line: ~        ],~
+                            nil,
+** Processing line: ~                            nil,~
 - Inside source: true
 *** True Line Result
-        ],
-** Processing line: ~        [~
+                            nil,
+** Processing line: ~                            nil),~
 - Inside source: true
 *** True Line Result
-        [
-** Processing line: ~          32, 40, 8, 10,~
+                            nil),
+** Processing line: ~      *ship_control_hotspot(36, 35,~
 - Inside source: true
 *** True Line Result
-          32, 40, 8, 10,
-** Processing line: ~          "This isn't- a good time- to sleep. I- should probably- head to the ceremony-."~
+      *ship_control_hotspot(36, 35,
+** Processing line: ~                            "COMM: Underpowered----, Limited--- to- Text-- Based-- COMM. Battery--- Allocation---: 1--- of-- 3---, It's-- lucky- that- their- COMM---- system was able to survive-- twenty-- years--. Just- barely-- it seems.",~
 - Inside source: true
 *** True Line Result
-          "This isn't- a good time- to sleep. I- should probably- head to the ceremony-."
-** Processing line: ~        ],~
+                            "COMM: Underpowered----, Limited--- to- Text-- Based-- COMM. Battery--- Allocation---: 1--- of-- 3---, It's-- lucky- that- their- COMM---- system was able to survive-- twenty-- years--. Just- barely-- it seems.",
+** Processing line: ~                            nil,~
 - Inside source: true
 *** True Line Result
-        ],
-** Processing line: ~        [~
+                            nil,
+** Processing line: ~                            nil,~
 - Inside source: true
 *** True Line Result
-        [
-** Processing line: ~          25, 21, 5, 12,~
+                            nil,
+** Processing line: ~                            nil),~
 - Inside source: true
 *** True Line Result
-          25, 21, 5, 12,
-** Processing line: ~          "Fifteen-- years- of computer-- science-- notes, neatly-- organized. Compiler--- Theory--, Linear--- Algebra---, Game-- Development---... Every-- subject-- imaginable--."~
+                            nil),
+** Processing line: ~      *ship_control_hotspot(48, 50,~
 - Inside source: true
 *** True Line Result
-          "Fifteen-- years- of computer-- science-- notes, neatly-- organized. Compiler--- Theory--, Linear--- Algebra---, Game-- Development---... Every-- subject-- imaginable--."
-** Processing line: ~        ]~
+      *ship_control_hotspot(48, 50,
+** Processing line: ~                            "Engine: Online, Full- Control-- Available. Battery--- Allocation---: 3--- of-- 3---, Hmmm. No point of having an engine-- online--, if you don't- know- where you're-- going.",~
 - Inside source: true
 *** True Line Result
-        ]
-** Processing line: ~      ]~
+                            "Engine: Online, Full- Control-- Available. Battery--- Allocation---: 3--- of-- 3---, Hmmm. No point of having an engine-- online--, if you don't- know- where you're-- going.",
+** Processing line: ~                            nil,~
 - Inside source: true
 *** True Line Result
-      ]
-** Processing line: ~    }~
+                            nil,
+** Processing line: ~                            nil,~
 - Inside source: true
 *** True Line Result
-    }
+                            nil,
+** Processing line: ~                            nil)~
+- Inside source: true
+*** True Line Result
+                            nil)
+** Processing line: ~    ]~
+- Inside source: true
+*** True Line Result
+    ]
 ** Processing line: ~  end~
 - Inside source: true
 *** True Line Result
@@ -138711,34 +144403,66 @@ Follows is a source code listing for all files that have been open sourced. This
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~  def day_one_ceremony args~
+** Processing line: ~  def serenity_alive_firm_reply~
 - Inside source: true
 *** True Line Result
-  def day_one_ceremony args
+  def serenity_alive_firm_reply
+** Processing line: ~    "Serenity, you are at a distance-- farther-- than- Neptune. All- of the ship's-- systems-- are failing. Please- move the batteries---- from- the Stasis-- Chambers-- over- to- Life-- Support--. I also-- need- you to move-- the batteries---- from- the Engines--- to your Navigation---- System."~
+- Inside source: true
+*** True Line Result
+    "Serenity, you are at a distance-- farther-- than- Neptune. All- of the ship's-- systems-- are failing. Please- move the batteries---- from- the Stasis-- Chambers-- over- to- Life-- Support--. I also-- need- you to move-- the batteries---- from- the Engines--- to your Navigation---- System."
+** Processing line: ~  end~
+- Inside source: true
+*** True Line Result
+  end
+** Processing line: ~~
+- Inside source: true
+*** True Line Result
+
+** Processing line: ~  def serenity_alive_sugarcoated_reply~
+- Inside source: true
+*** True Line Result
+  def serenity_alive_sugarcoated_reply
+** Processing line: ~    "So... you- are- a teeny--- tiny--- bit--- farther-- from Earth- than you think. And you have a teeny--- tiny--- problem-- with your ship. Please-- move the batteries--- from the Stasis--- Chambers--- over to Life--- Support---. I also need you to move the batteries--- from the Engines--- to your- Navigation--- System. Don't-- worry-- Sasha. I'll-- get y'all-- home."~
+- Inside source: true
+*** True Line Result
+    "So... you- are- a teeny--- tiny--- bit--- farther-- from Earth- than you think. And you have a teeny--- tiny--- problem-- with your ship. Please-- move the batteries--- from the Stasis--- Chambers--- over to Life--- Support---. I also need you to move the batteries--- from the Engines--- to your- Navigation--- System. Don't-- worry-- Sasha. I'll-- get y'all-- home."
+** Processing line: ~  end~
+- Inside source: true
+*** True Line Result
+  end
+** Processing line: ~~
+- Inside source: true
+*** True Line Result
+
+** Processing line: ~  def replied_to_serenity_alive_firmly args~
+- Inside source: true
+*** True Line Result
+  def replied_to_serenity_alive_firmly args
 ** Processing line: ~    {~
 - Inside source: true
 *** True Line Result
     {
-** Processing line: ~      background: 'sprites/tribute.png',~
+** Processing line: ~      background: 'sprites/inside-observatory.png',~
 - Inside source: true
 *** True Line Result
-      background: 'sprites/tribute.png',
-** Processing line: ~      player: [57, 21],~
+      background: 'sprites/inside-observatory.png',
+** Processing line: ~      fade: 60,~
 - Inside source: true
 *** True Line Result
-      player: [57, 21],
-** Processing line: ~      scenes: [~
+      fade: 60,
+** Processing line: ~      player: [32, 21],~
 - Inside source: true
 *** True Line Result
-      scenes: [
-** Processing line: ~        [62, 0, 2, 40, :day_one_infront_of_home],~
+      player: [32, 21],
+** Processing line: ~      scenes: [~
 - Inside source: true
 *** True Line Result
-        [62, 0, 2, 40, :day_one_infront_of_home],
-** Processing line: ~        [0, 24, 2, 40, :day_one_infront_of_library]~
+      scenes: [
+** Processing line: ~        [*hotspot_bottom_right, :serenity_alive_path_from_observatory]~
 - Inside source: true
 *** True Line Result
-        [0, 24, 2, 40, :day_one_infront_of_library]
+        [*hotspot_bottom_right, :serenity_alive_path_from_observatory]
 ** Processing line: ~      ],~
 - Inside source: true
 *** True Line Result
@@ -138747,22 +144471,14 @@ Follows is a source code listing for all files that have been open sourced. This
 - Inside source: true
 *** True Line Result
       storylines: [
-** Processing line: ~        [53, 12, 3,  8,  "It's- been twenty- years since The Impact. Twenty- years, since Halley's-- Comet-- set Earth's- blue- sky on fire."],~
-- Inside source: true
-*** True Line Result
-        [53, 12, 3,  8,  "It's- been twenty- years since The Impact. Twenty- years, since Halley's-- Comet-- set Earth's- blue- sky on fire."],
-** Processing line: ~        [45, 12, 3,  8,  "The space mission- sent to prevent- Earth's- total- destruction--, was a success. Only- 99.9%------ of the world's- population-- died-- that day. Hey, it's- better-- than 100%---- of humanity-- dying."],~
-- Inside source: true
-*** True Line Result
-        [45, 12, 3,  8,  "The space mission- sent to prevent- Earth's- total- destruction--, was a success. Only- 99.9%------ of the world's- population-- died-- that day. Hey, it's- better-- than 100%---- of humanity-- dying."],
-** Processing line: ~        [20, 12, 23, 4, "The monument--- reads:---- Here- stands- the tribute-- to Space- Mission-- Serenity--- and- its- crew. You- have- given-- humanity--- a second-- chance."],~
+** Processing line: ~        [30, 18, 5, 12, "Buffer-- has been set to: #{serenity_alive_firm_reply.quote}"],~
 - Inside source: true
 *** True Line Result
-        [20, 12, 23, 4, "The monument--- reads:---- Here- stands- the tribute-- to Space- Mission-- Serenity--- and- its- crew. You- have- given-- humanity--- a second-- chance."],
-** Processing line: ~        [15, 12, 3,  8, "Rest- in- peace--- Matthew----, Sasha----, Aanka----"],~
+        [30, 18, 5, 12, "Buffer-- has been set to: #{serenity_alive_firm_reply.quote}"],
+** Processing line: ~        *serenity_alive_reply_completed_shared_hotspots(args),~
 - Inside source: true
 *** True Line Result
-        [15, 12, 3,  8, "Rest- in- peace--- Matthew----, Sasha----, Aanka----"],
+        *serenity_alive_reply_completed_shared_hotspots(args),
 ** Processing line: ~      ]~
 - Inside source: true
 *** True Line Result
@@ -138779,34 +144495,34 @@ Follows is a source code listing for all files that have been open sourced. This
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~  def day_one_infront_of_library args~
+** Processing line: ~  def replied_to_serenity_alive_kindly args~
 - Inside source: true
 *** True Line Result
-  def day_one_infront_of_library args
+  def replied_to_serenity_alive_kindly args
 ** Processing line: ~    {~
 - Inside source: true
 *** True Line Result
     {
-** Processing line: ~      background: 'sprites/outside-library.png',~
+** Processing line: ~      background: 'sprites/inside-observatory.png',~
 - Inside source: true
 *** True Line Result
-      background: 'sprites/outside-library.png',
-** Processing line: ~      player: [57, 21],~
+      background: 'sprites/inside-observatory.png',
+** Processing line: ~      fade: 60,~
 - Inside source: true
 *** True Line Result
-      player: [57, 21],
-** Processing line: ~      scenes: [~
+      fade: 60,
+** Processing line: ~      player: [32, 21],~
 - Inside source: true
 *** True Line Result
-      scenes: [
-** Processing line: ~        [62, 0, 2, 40, :day_one_ceremony],~
+      player: [32, 21],
+** Processing line: ~      scenes: [~
 - Inside source: true
 *** True Line Result
-        [62, 0, 2, 40, :day_one_ceremony],
-** Processing line: ~        [49, 39, 6, 9, :day_one_library]~
+      scenes: [
+** Processing line: ~        [*hotspot_bottom_right, :serenity_alive_path_from_observatory]~
 - Inside source: true
 *** True Line Result
-        [49, 39, 6, 9, :day_one_library]
+        [*hotspot_bottom_right, :serenity_alive_path_from_observatory]
 ** Processing line: ~      ],~
 - Inside source: true
 *** True Line Result
@@ -138815,10 +144531,14 @@ Follows is a source code listing for all files that have been open sourced. This
 - Inside source: true
 *** True Line Result
       storylines: [
-** Processing line: ~        [50, 20, 4, 8,  "Shipping- containers-- as far- as the eye- can see. It's- rather- beautiful-- if you ask me. Even- though-- this- view- represents-- all- that's-- left- of humanity-."]~
+** Processing line: ~        [30, 18, 5, 12, "Buffer-- has been set to: #{serenity_alive_sugarcoated_reply.quote}"],~
 - Inside source: true
 *** True Line Result
-        [50, 20, 4, 8,  "Shipping- containers-- as far- as the eye- can see. It's- rather- beautiful-- if you ask me. Even- though-- this- view- represents-- all- that's-- left- of humanity-."]
+        [30, 18, 5, 12, "Buffer-- has been set to: #{serenity_alive_sugarcoated_reply.quote}"],
+** Processing line: ~        *serenity_alive_reply_completed_shared_hotspots(args),~
+- Inside source: true
+*** True Line Result
+        *serenity_alive_reply_completed_shared_hotspots(args),
 ** Processing line: ~      ]~
 - Inside source: true
 *** True Line Result
@@ -138835,30 +144555,34 @@ Follows is a source code listing for all files that have been open sourced. This
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~  def day_one_library args~
+** Processing line: ~  def serenity_alive_path_from_observatory args~
 - Inside source: true
 *** True Line Result
-  def day_one_library args
+  def serenity_alive_path_from_observatory args
 ** Processing line: ~    {~
 - Inside source: true
 *** True Line Result
     {
-** Processing line: ~      background: 'sprites/library.png',~
+** Processing line: ~      fade: 60,~
 - Inside source: true
 *** True Line Result
-      background: 'sprites/library.png',
-** Processing line: ~      player: [27, 4],~
+      fade: 60,
+** Processing line: ~      background: 'sprites/path-to-observatory.png',~
 - Inside source: true
 *** True Line Result
-      player: [27, 4],
+      background: 'sprites/path-to-observatory.png',
+** Processing line: ~      player: [4, 21],~
+- Inside source: true
+*** True Line Result
+      player: [4, 21],
 ** Processing line: ~      scenes: [~
 - Inside source: true
 *** True Line Result
       scenes: [
-** Processing line: ~        [0, 0, 64, 2, :end_day_one_infront_of_library]~
+** Processing line: ~        [*hotspot_bottom_right, :serenity_bio_infront_of_home]~
 - Inside source: true
 *** True Line Result
-        [0, 0, 64, 2, :end_day_one_infront_of_library]
+        [*hotspot_bottom_right, :serenity_bio_infront_of_home]
 ** Processing line: ~      ],~
 - Inside source: true
 *** True Line Result
@@ -138867,14 +144591,10 @@ Follows is a source code listing for all files that have been open sourced. This
 - Inside source: true
 *** True Line Result
       storylines: [
-** Processing line: ~        [28, 22, 8, 4,  "I grew- up- in this library. I've- read every- book- here. My favorites-- were- of course-- anything- computer-- related."],~
-- Inside source: true
-*** True Line Result
-        [28, 22, 8, 4,  "I grew- up- in this library. I've- read every- book- here. My favorites-- were- of course-- anything- computer-- related."],
-** Processing line: ~        [6, 32, 10, 6, "My favorite-- area--- of the library. The Science-- Section."]~
+** Processing line: ~        [22, 20, 10, 10, "I'm not sure what's-- worse. Waiting-- for Sasha's-- reply. Or jumping-- off- from- right- here."]~
 - Inside source: true
 *** True Line Result
-        [6, 32, 10, 6, "My favorite-- area--- of the library. The Science-- Section."]
+        [22, 20, 10, 10, "I'm not sure what's-- worse. Waiting-- for Sasha's-- reply. Or jumping-- off- from- right- here."]
 ** Processing line: ~      ]~
 - Inside source: true
 *** True Line Result
@@ -138891,54 +144611,62 @@ Follows is a source code listing for all files that have been open sourced. This
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~  def end_day_one_infront_of_library args~
+** Processing line: ~  def serenity_alive_reply_completed_shared_hotspots args~
 - Inside source: true
 *** True Line Result
-  def end_day_one_infront_of_library args
-** Processing line: ~    {~
+  def serenity_alive_reply_completed_shared_hotspots args
+** Processing line: ~    [~
 - Inside source: true
 *** True Line Result
-    {
-** Processing line: ~      background: 'sprites/outside-library.png',~
+    [
+** Processing line: ~      [30, 10, 5, 4, "I guess it wasn't-- a joke- after-- all."],~
 - Inside source: true
 *** True Line Result
-      background: 'sprites/outside-library.png',
-** Processing line: ~      player: [51, 33],~
+      [30, 10, 5, 4, "I guess it wasn't-- a joke- after-- all."],
+** Processing line: ~      [40, 10, 5, 4, "I barely-- remember--- the- history----- of the crew."],~
 - Inside source: true
 *** True Line Result
-      player: [51, 33],
-** Processing line: ~      scenes: [~
+      [40, 10, 5, 4, "I barely-- remember--- the- history----- of the crew."],
+** Processing line: ~      [50, 10, 5, 4, "It probably--- wouldn't-- hurt- to- refresh-- my memory--."]~
 - Inside source: true
 *** True Line Result
-      scenes: [
-** Processing line: ~        [49, 39, 6, 9, :day_one_library],~
+      [50, 10, 5, 4, "It probably--- wouldn't-- hurt- to- refresh-- my memory--."]
+** Processing line: ~    ]~
 - Inside source: true
 *** True Line Result
-        [49, 39, 6, 9, :day_one_library],
-** Processing line: ~        [62, 0, 2, 40, :end_day_one_monument],~
+    ]
+** Processing line: ~  end~
 - Inside source: true
 *** True Line Result
-        [62, 0, 2, 40, :end_day_one_monument],
-** Processing line: ~      ],~
+  end
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-      ],
-** Processing line: ~      storylines: [~
+
+** Processing line: ~  def serenity_alive_last_reply args~
 - Inside source: true
 *** True Line Result
-      storylines: [
-** Processing line: ~        [50, 27, 4, 4, "It's getting late. Better get some sleep."]~
+  def serenity_alive_last_reply args
+** Processing line: ~    if args.state.scene_history.include? :replied_to_introduction_seriously~
 - Inside source: true
 *** True Line Result
-        [50, 27, 4, 4, "It's getting late. Better get some sleep."]
-** Processing line: ~      ]~
+    if args.state.scene_history.include? :replied_to_introduction_seriously
+** Processing line: ~      return "Buffer--: \"Hello, Who- is sending-- this message--?\""~
 - Inside source: true
 *** True Line Result
-      ]
-** Processing line: ~    }~
+      return "Buffer--: \"Hello, Who- is sending-- this message--?\""
+** Processing line: ~    else~
 - Inside source: true
 *** True Line Result
-    }
+    else
+** Processing line: ~      return "Buffer--: \"New- phone. Who dis?\""~
+- Inside source: true
+*** True Line Result
+      return "Buffer--: \"New- phone. Who dis?\""
+** Processing line: ~    end~
+- Inside source: true
+*** True Line Result
+    end
 ** Processing line: ~  end~
 - Inside source: true
 *** True Line Result
@@ -138947,42 +144675,94 @@ Follows is a source code listing for all files that have been open sourced. This
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~  def end_day_one_monument args~
+** Processing line: ~  def serenity_alive_current_message args~
 - Inside source: true
 *** True Line Result
-  def end_day_one_monument args
-** Processing line: ~    {~
+  def serenity_alive_current_message args
+** Processing line: ~    if args.state.scene_history.include? :replied_to_introduction_seriously~
 - Inside source: true
 *** True Line Result
-    {
-** Processing line: ~      background: 'sprites/tribute.png',~
+    if args.state.scene_history.include? :replied_to_introduction_seriously
+** Processing line: ~      "This- is Sasha. The Serenity--- crew-- is out of hibernation---- and ready-- for Earth reentry--. But, it seems like we are having-- trouble-- with our Navigation---- systems. Please advise.".quote~
 - Inside source: true
 *** True Line Result
-      background: 'sprites/tribute.png',
-** Processing line: ~      player: [2, 36],~
+      "This- is Sasha. The Serenity--- crew-- is out of hibernation---- and ready-- for Earth reentry--. But, it seems like we are having-- trouble-- with our Navigation---- systems. Please advise.".quote
+** Processing line: ~    else~
 - Inside source: true
 *** True Line Result
-      player: [2, 36],
-** Processing line: ~      scenes: [~
+    else
+** Processing line: ~      "LOL! Thanks for the laugh. I needed that. This- is Sasha. The Serenity--- crew-- is out of hibernation---- and ready-- for Earth reentry--. But, it seems like we are having-- trouble-- with our Navigation---- systems. Can you help me out- babe?".quote~
 - Inside source: true
 *** True Line Result
-      scenes: [
-** Processing line: ~        [62, 0, 2, 40, :end_day_one_infront_of_home],~
+      "LOL! Thanks for the laugh. I needed that. This- is Sasha. The Serenity--- crew-- is out of hibernation---- and ready-- for Earth reentry--. But, it seems like we are having-- trouble-- with our Navigation---- systems. Can you help me out- babe?".quote
+** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
-        [62, 0, 2, 40, :end_day_one_infront_of_home],
-** Processing line: ~      ],~
+    end
+** Processing line: ~  end~
 - Inside source: true
 *** True Line Result
-      ],
-** Processing line: ~      storylines: [~
+  end
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-      storylines: [
-** Processing line: ~        [50, 27, 4, 4, "It's getting late. Better get some sleep."],~
+
+** Processing line: ~#+end_src~
+- Line was identified as the end of a code block.
+*** True Line Result
+#+end_src
+** Processing line: ~~
+- End of paragraph detected.
+*** True Line Result
+
+** Processing line: ~*** Rpg Narrative - Return Of Serenity - storyline_serenity_bio.rb~
+- Header detected.
+*** True Line Result
+
+*** True Line Result
+*** Rpg Narrative - Return Of Serenity - storyline_serenity_bio.rb
+** Processing line: ~#+begin_src ruby~
+- Line was identified as the beginning of a code block.
+*** True Line Result
+
+*** True Line Result
+#+begin_src ruby
+** Processing line: ~  # ./samples/99_genre_rpg_narrative/return_of_serenity/app/storyline_serenity_bio.rb~
 - Inside source: true
 *** True Line Result
-        [50, 27, 4, 4, "It's getting late. Better get some sleep."],
+  # ./samples/99_genre_rpg_narrative/return_of_serenity/app/storyline_serenity_bio.rb
+** Processing line: ~  def serenity_bio_infront_of_home args~
+- Inside source: true
+*** True Line Result
+  def serenity_bio_infront_of_home args
+** Processing line: ~    {~
+- Inside source: true
+*** True Line Result
+    {
+** Processing line: ~      fade: 60,~
+- Inside source: true
+*** True Line Result
+      fade: 60,
+** Processing line: ~      background: 'sprites/front-of-home.png',~
+- Inside source: true
+*** True Line Result
+      background: 'sprites/front-of-home.png',
+** Processing line: ~      player: [54, 23],~
+- Inside source: true
+*** True Line Result
+      player: [54, 23],
+** Processing line: ~      scenes: [~
+- Inside source: true
+*** True Line Result
+      scenes: [
+** Processing line: ~        [44, 34, 8, 14, :serenity_bio_inside_home],~
+- Inside source: true
+*** True Line Result
+        [44, 34, 8, 14, :serenity_bio_inside_home],
+** Processing line: ~        [0, 3, 3, 22, :serenity_bio_library]~
+- Inside source: true
+*** True Line Result
+        [0, 3, 3, 22, :serenity_bio_library]
 ** Processing line: ~      ]~
 - Inside source: true
 *** True Line Result
@@ -138999,42 +144779,46 @@ Follows is a source code listing for all files that have been open sourced. This
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~  def end_day_one_infront_of_home args~
+** Processing line: ~  def serenity_bio_inside_home args~
 - Inside source: true
 *** True Line Result
-  def end_day_one_infront_of_home args
+  def serenity_bio_inside_home args
 ** Processing line: ~    {~
 - Inside source: true
 *** True Line Result
     {
-** Processing line: ~      background: 'sprites/front-of-home.png',~
+** Processing line: ~      background: 'sprites/inside-home.png',~
 - Inside source: true
 *** True Line Result
-      background: 'sprites/front-of-home.png',
-** Processing line: ~      player: [1, 17],~
+      background: 'sprites/inside-home.png',
+** Processing line: ~      player: [34, 4],~
 - Inside source: true
 *** True Line Result
-      player: [1, 17],
-** Processing line: ~      scenes: [~
+      player: [34, 4],
+** Processing line: ~      storylines: [~
 - Inside source: true
 *** True Line Result
-      scenes: [
-** Processing line: ~        [43, 34, 10, 16, :end_day_one_home],~
+      storylines: [
+** Processing line: ~        [34, 4, 4, 4, "I'm--- completely--- exhausted."],~
 - Inside source: true
 *** True Line Result
-        [43, 34, 10, 16, :end_day_one_home],
+        [34, 4, 4, 4, "I'm--- completely--- exhausted."],
 ** Processing line: ~      ],~
 - Inside source: true
 *** True Line Result
       ],
-** Processing line: ~      storylines: [~
+** Processing line: ~      scenes: [~
 - Inside source: true
 *** True Line Result
-      storylines: [
-** Processing line: ~        [20, 10, 4, 4, "It's getting late. Better get some sleep."],~
+      scenes: [
+** Processing line: ~        [30, 38, 12, 13, :serenity_bio_restless_sleep],~
 - Inside source: true
 *** True Line Result
-        [20, 10, 4, 4, "It's getting late. Better get some sleep."],
+        [30, 38, 12, 13, :serenity_bio_restless_sleep],
+** Processing line: ~        [32, 0, 8, 3, :serenity_bio_infront_of_home],~
+- Inside source: true
+*** True Line Result
+        [32, 0, 8, 3, :serenity_bio_infront_of_home],
 ** Processing line: ~      ]~
 - Inside source: true
 *** True Line Result
@@ -139051,42 +144835,42 @@ Follows is a source code listing for all files that have been open sourced. This
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~  def end_day_one_home args~
+** Processing line: ~  def serenity_bio_restless_sleep args~
 - Inside source: true
 *** True Line Result
-  def end_day_one_home args
+  def serenity_bio_restless_sleep args
 ** Processing line: ~    {~
 - Inside source: true
 *** True Line Result
     {
-** Processing line: ~      background: 'sprites/inside-home.png',~
+** Processing line: ~      fade: 60,~
 - Inside source: true
 *** True Line Result
-      background: 'sprites/inside-home.png',
-** Processing line: ~      player: [34, 3],~
+      fade: 60,
+** Processing line: ~      background: 'sprites/inside-home.png',~
 - Inside source: true
 *** True Line Result
-      player: [34, 3],
-** Processing line: ~      scenes: [~
+      background: 'sprites/inside-home.png',
+** Processing line: ~      storylines: [~
 - Inside source: true
 *** True Line Result
-      scenes: [
-** Processing line: ~        [32, 40, 8, 10, :end_day_one_dream],~
+      storylines: [
+** Processing line: ~        [32, 38, 10, 13, "I can't-- seem to sleep. I know nothing-- about the- crew-. Maybe- I- should- go read- up- on- them."],~
 - Inside source: true
 *** True Line Result
-        [32, 40, 8, 10, :end_day_one_dream],
+        [32, 38, 10, 13, "I can't-- seem to sleep. I know nothing-- about the- crew-. Maybe- I- should- go read- up- on- them."],
 ** Processing line: ~      ],~
 - Inside source: true
 *** True Line Result
       ],
-** Processing line: ~      storylines: [~
+** Processing line: ~      scenes: [~
 - Inside source: true
 *** True Line Result
-      storylines: [
-** Processing line: ~        [38, 4, 4, 4, "It's getting late. Better get some sleep."],~
+      scenes: [
+** Processing line: ~        [32, 0, 8, 3, :serenity_bio_infront_of_home],~
 - Inside source: true
 *** True Line Result
-        [38, 4, 4, 4, "It's getting late. Better get some sleep."],
+        [32, 0, 8, 3, :serenity_bio_infront_of_home],
 ** Processing line: ~      ]~
 - Inside source: true
 *** True Line Result
@@ -139103,54 +144887,34 @@ Follows is a source code listing for all files that have been open sourced. This
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~  def end_day_one_dream args~
+** Processing line: ~  def serenity_bio_library args~
 - Inside source: true
 *** True Line Result
-  def end_day_one_dream args
+  def serenity_bio_library args
 ** Processing line: ~    {~
 - Inside source: true
 *** True Line Result
     {
-** Processing line: ~      background: 'sprites/dream.png',~
+** Processing line: ~      background: 'sprites/library.png',~
 - Inside source: true
 *** True Line Result
-      background: 'sprites/dream.png',
+      background: 'sprites/library.png',
 ** Processing line: ~      fade: 60,~
 - Inside source: true
 *** True Line Result
       fade: 60,
-** Processing line: ~      player: [4, 4],~
+** Processing line: ~      player: [30, 7],~
 - Inside source: true
 *** True Line Result
-      player: [4, 4],
+      player: [30, 7],
 ** Processing line: ~      scenes: [~
 - Inside source: true
 *** True Line Result
       scenes: [
-** Processing line: ~        [62, 0, 2, 64, :explaining_the_special_power]~
-- Inside source: true
-*** True Line Result
-        [62, 0, 2, 64, :explaining_the_special_power]
-** Processing line: ~      ],~
-- Inside source: true
-*** True Line Result
-      ],
-** Processing line: ~      storylines: [~
-- Inside source: true
-*** True Line Result
-      storylines: [
-** Processing line: ~        [10, 10, 4, 4, "Why- does this- moment-- always- haunt- my dreams?"],~
-- Inside source: true
-*** True Line Result
-        [10, 10, 4, 4, "Why- does this- moment-- always- haunt- my dreams?"],
-** Processing line: ~        [20, 10, 4, 4, "This kid- reads these computer--- science--- books- nonstop-. What's- wrong with him?"],~
-- Inside source: true
-*** True Line Result
-        [20, 10, 4, 4, "This kid- reads these computer--- science--- books- nonstop-. What's- wrong with him?"],
-** Processing line: ~        [30, 10, 4, 4, "There- is nothing-- wrong- with him. This behavior-- should be encouraged---! In fact-, I think- he's- special---. Have- you seen- him use- a computer---? It's-- almost-- as if he can- speak-- to it."]~
+** Processing line: ~        [21, 35, 3, 18, :serenity_bio_book]~
 - Inside source: true
 *** True Line Result
-        [30, 10, 4, 4, "There- is nothing-- wrong- with him. This behavior-- should be encouraged---! In fact-, I think- he's- special---. Have- you seen- him use- a computer---? It's-- almost-- as if he can- speak-- to it."]
+        [21, 35, 3, 18, :serenity_bio_book]
 ** Processing line: ~      ]~
 - Inside source: true
 *** True Line Result
@@ -139167,42 +144931,82 @@ Follows is a source code listing for all files that have been open sourced. This
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~  def explaining_the_special_power args~
+** Processing line: ~  def serenity_bio_book args~
 - Inside source: true
 *** True Line Result
-  def explaining_the_special_power args
+  def serenity_bio_book args
 ** Processing line: ~    {~
 - Inside source: true
 *** True Line Result
     {
+** Processing line: ~      background: 'sprites/book.png',~
+- Inside source: true
+*** True Line Result
+      background: 'sprites/book.png',
 ** Processing line: ~      fade: 60,~
 - Inside source: true
 *** True Line Result
       fade: 60,
-** Processing line: ~      background: 'sprites/inside-home.png',~
+** Processing line: ~      player: [6, 52],~
 - Inside source: true
 *** True Line Result
-      background: 'sprites/inside-home.png',
-** Processing line: ~      player: [32, 30],~
+      player: [6, 52],
+** Processing line: ~      storylines: [~
 - Inside source: true
 *** True Line Result
-      player: [32, 30],
-** Processing line: ~      scenes: [~
+      storylines: [
+** Processing line: ~        [ 4, 50, 56, 4, "The Title-- Reads: Never-- Forget-- Mission-- Serenity---"],~
 - Inside source: true
 *** True Line Result
-      scenes: [
-** Processing line: ~        [~
+        [ 4, 50, 56, 4, "The Title-- Reads: Never-- Forget-- Mission-- Serenity---"],
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-        [
-** Processing line: ~          38, 21, 4, 4, :explaining_the_special_power_inside_computer~
+
+** Processing line: ~        [ 4, 38,  8, 8, "Name: Matthew--- R. Sex: Male--- Age-- at-- Departure: 36-----"],~
 - Inside source: true
 *** True Line Result
-          38, 21, 4, 4, :explaining_the_special_power_inside_computer
-** Processing line: ~        ],~
+        [ 4, 38,  8, 8, "Name: Matthew--- R. Sex: Male--- Age-- at-- Departure: 36-----"],
+** Processing line: ~        [14, 38, 46, 8, "Tribute-- Text: Matthew graduated-- Magna-- Cum-- Laude-- from MIT--- with-- a- PHD---- in Aero-- Nautical--- Engineering. He was immensely--- competitive, and had an insatiable---- thirst- for aerial-- battle. From the age of twenty, he remained-- undefeated--- in the Israeli-- Air- Force- \"Blue Flag\" combat-- exercises. By the age of 29--- he had already-- risen through- the ranks, and became-- the Lieutenant--- General--- of Lufwaffe. Matthew-- volenteered-- to- pilot-- Mission-- Serenity. To- this day, his wife- and son- are pillars-- of strength- for us. Rest- in Peace- Matthew, we are sorry-- that- news of the pregancy-- never-- reached- you. Please forgive us."],~
 - Inside source: true
 *** True Line Result
-        ],
+        [14, 38, 46, 8, "Tribute-- Text: Matthew graduated-- Magna-- Cum-- Laude-- from MIT--- with-- a- PHD---- in Aero-- Nautical--- Engineering. He was immensely--- competitive, and had an insatiable---- thirst- for aerial-- battle. From the age of twenty, he remained-- undefeated--- in the Israeli-- Air- Force- \"Blue Flag\" combat-- exercises. By the age of 29--- he had already-- risen through- the ranks, and became-- the Lieutenant--- General--- of Lufwaffe. Matthew-- volenteered-- to- pilot-- Mission-- Serenity. To- this day, his wife- and son- are pillars-- of strength- for us. Rest- in Peace- Matthew, we are sorry-- that- news of the pregancy-- never-- reached- you. Please forgive us."],
+** Processing line: ~~
+- Inside source: true
+*** True Line Result
+
+** Processing line: ~        [4,  26,  8, 8, "Name: Aanka--- P. Sex: Female--- Age-- at-- Departure: 9-----"],~
+- Inside source: true
+*** True Line Result
+        [4,  26,  8, 8, "Name: Aanka--- P. Sex: Female--- Age-- at-- Departure: 9-----"],
+** Processing line: ~        [14, 26, 46, 8, "Tribute-- Text: Aanka--- gratuated--- Magna-- Cum- Laude-- from MIT, at- the- age- of eight, with a- PHD---- in Astro-- Physics. Her-- IQ--- was over 390, the highest-- ever- recorded--- IQ-- in- human-- history. She changed- the landscape-- of Physics-- with her efforts- in- unravelling--- the mysteries--- of- Dark- Matter--. Anka discovered-- the threat- of Halley's-- Comet-- collision--- with Earth. She spear headed-- the global-- effort-- for Misson-- Serenity. Her- multilingual--- address-- to- the world-- brought- us all hope."],~
+- Inside source: true
+*** True Line Result
+        [14, 26, 46, 8, "Tribute-- Text: Aanka--- gratuated--- Magna-- Cum- Laude-- from MIT, at- the- age- of eight, with a- PHD---- in Astro-- Physics. Her-- IQ--- was over 390, the highest-- ever- recorded--- IQ-- in- human-- history. She changed- the landscape-- of Physics-- with her efforts- in- unravelling--- the mysteries--- of- Dark- Matter--. Anka discovered-- the threat- of Halley's-- Comet-- collision--- with Earth. She spear headed-- the global-- effort-- for Misson-- Serenity. Her- multilingual--- address-- to- the world-- brought- us all hope."],
+** Processing line: ~~
+- Inside source: true
+*** True Line Result
+
+** Processing line: ~        [4,  14,  8, 8, "Name: Sasha--- N. Sex: Female--- Age-- at-- Departure: 29-----"],~
+- Inside source: true
+*** True Line Result
+        [4,  14,  8, 8, "Name: Sasha--- N. Sex: Female--- Age-- at-- Departure: 29-----"],
+** Processing line: ~        [14, 14, 46, 8, "Tribute-- Text: Sasha gratuated-- Magna-- Cum- Laude-- from MIT--- with-- a- PHD---- in Computer---- Science----. She-- was-- brilliant--, strong- willed--, and-- a-- stunningly--- beautiful--- woman---. Sasha---- is- the- creator--- of the world's--- first- Ruby--- Quantum-- Machine---. After-- much- critical--- acclaim--, the Quantum-- Computer-- was placed in MIT's---- Museam-- next- to- Richard--- G. and Thomas--- K.'s---- Lisp-- Machine---. Her- engineering--- skills-- were-- paramount--- for Mission--- Serenity's--- success. Humanity-- misses-- you-- dearly,-- Sasha--. Life-- shines-- a dimmer-- light-- now- that- your- angelic- voice-- can never- be heard- again."],~
+- Inside source: true
+*** True Line Result
+        [14, 14, 46, 8, "Tribute-- Text: Sasha gratuated-- Magna-- Cum- Laude-- from MIT--- with-- a- PHD---- in Computer---- Science----. She-- was-- brilliant--, strong- willed--, and-- a-- stunningly--- beautiful--- woman---. Sasha---- is- the- creator--- of the world's--- first- Ruby--- Quantum-- Machine---. After-- much- critical--- acclaim--, the Quantum-- Computer-- was placed in MIT's---- Museam-- next- to- Richard--- G. and Thomas--- K.'s---- Lisp-- Machine---. Her- engineering--- skills-- were-- paramount--- for Mission--- Serenity's--- success. Humanity-- misses-- you-- dearly,-- Sasha--. Life-- shines-- a dimmer-- light-- now- that- your- angelic- voice-- can never- be heard- again."],
+** Processing line: ~      ],~
+- Inside source: true
+*** True Line Result
+      ],
+** Processing line: ~      scenes: [~
+- Inside source: true
+*** True Line Result
+      scenes: [
+** Processing line: ~        [*hotspot_bottom, :serenity_bio_finally_to_bed]~
+- Inside source: true
+*** True Line Result
+        [*hotspot_bottom, :serenity_bio_finally_to_bed]
 ** Processing line: ~      ]~
 - Inside source: true
 *** True Line Result
@@ -139219,58 +145023,46 @@ Follows is a source code listing for all files that have been open sourced. This
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~  def explaining_the_special_power_inside_computer args~
+** Processing line: ~  def serenity_bio_finally_to_bed args~
 - Inside source: true
 *** True Line Result
-  def explaining_the_special_power_inside_computer args
+  def serenity_bio_finally_to_bed args
 ** Processing line: ~    {~
 - Inside source: true
 *** True Line Result
     {
-** Processing line: ~      background: 'sprites/pc.png',~
-- Inside source: true
-*** True Line Result
-      background: 'sprites/pc.png',
 ** Processing line: ~      fade: 60,~
 - Inside source: true
 *** True Line Result
       fade: 60,
-** Processing line: ~      player: [34, 4],~
-- Inside source: true
-*** True Line Result
-      player: [34, 4],
-** Processing line: ~      scenes: [~
-- Inside source: true
-*** True Line Result
-      scenes: [
-** Processing line: ~        [0, 62, 64, 3, :the_blinking_light]~
+** Processing line: ~      background: 'sprites/inside-home.png',~
 - Inside source: true
 *** True Line Result
-        [0, 62, 64, 3, :the_blinking_light]
-** Processing line: ~      ],~
+      background: 'sprites/inside-home.png',
+** Processing line: ~      player: [35, 3],~
 - Inside source: true
 *** True Line Result
-      ],
+      player: [35, 3],
 ** Processing line: ~      storylines: [~
 - Inside source: true
 *** True Line Result
       storylines: [
-** Processing line: ~        [14, 20, 24, 4, "So... I have a special-- power--. I don't-- need a mouse-, keyboard--, or even-- a monitor--- to control-- a computer--."],~
+** Processing line: ~        [34, 4, 4, 4, "Maybe-- I'll-- be able-- to sleep- now..."],~
 - Inside source: true
 *** True Line Result
-        [14, 20, 24, 4, "So... I have a special-- power--. I don't-- need a mouse-, keyboard--, or even-- a monitor--- to control-- a computer--."],
-** Processing line: ~        [14, 25, 24, 4, "I only-- pretend-- to use peripherals---, so as not- to freak- anyone--- out."],~
+        [34, 4, 4, 4, "Maybe-- I'll-- be able-- to sleep- now..."],
+** Processing line: ~      ],~
 - Inside source: true
 *** True Line Result
-        [14, 25, 24, 4, "I only-- pretend-- to use peripherals---, so as not- to freak- anyone--- out."],
-** Processing line: ~        [14, 30, 24, 4, "Inside-- this silicon--- Universe---, is the only-- place I- feel- at peace."],~
+      ],
+** Processing line: ~      scenes: [~
 - Inside source: true
 *** True Line Result
-        [14, 30, 24, 4, "Inside-- this silicon--- Universe---, is the only-- place I- feel- at peace."],
-** Processing line: ~        [14, 35, 24, 4, "It's-- the only-- place where I don't-- feel alone."]~
+      scenes: [
+** Processing line: ~        [32, 38, 10, 13, :bad_dream],~
 - Inside source: true
 *** True Line Result
-        [14, 35, 24, 4, "It's-- the only-- place where I don't-- feel alone."]
+        [32, 38, 10, 13, :bad_dream],
 ** Processing line: ~      ]~
 - Inside source: true
 *** True Line Result
@@ -139287,78 +145079,110 @@ Follows is a source code listing for all files that have been open sourced. This
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~#+end_src~
-- Line was identified as the end of a code block.
+** Processing line: ~  def bad_dream args~
+- Inside source: true
 *** True Line Result
-#+end_src
-** Processing line: ~~
-- End of paragraph detected.
+  def bad_dream args
+** Processing line: ~    {~
+- Inside source: true
 *** True Line Result
-
-** Processing line: ~*** Rpg Narrative - Return Of Serenity - storyline_final_decision.rb~
-- Header detected.
+    {
+** Processing line: ~      fade: 120,~
+- Inside source: true
 *** True Line Result
-
+      fade: 120,
+** Processing line: ~      background: 'sprites/inside-home.png',~
+- Inside source: true
 *** True Line Result
-*** Rpg Narrative - Return Of Serenity - storyline_final_decision.rb
-** Processing line: ~#+begin_src ruby~
-- Line was identified as the beginning of a code block.
+      background: 'sprites/inside-home.png',
+** Processing line: ~      player: [34, 35],~
+- Inside source: true
+*** True Line Result
+      player: [34, 35],
+** Processing line: ~      storylines: [~
+- Inside source: true
+*** True Line Result
+      storylines: [
+** Processing line: ~        [34, 34, 4, 4, "Man. I did not- sleep- well- at all..."],~
+- Inside source: true
+*** True Line Result
+        [34, 34, 4, 4, "Man. I did not- sleep- well- at all..."],
+** Processing line: ~      ],~
+- Inside source: true
+*** True Line Result
+      ],
+** Processing line: ~      scenes: [~
+- Inside source: true
+*** True Line Result
+      scenes: [
+** Processing line: ~        [32, -1, 8, 3, :bad_dream_observatory]~
+- Inside source: true
+*** True Line Result
+        [32, -1, 8, 3, :bad_dream_observatory]
+** Processing line: ~      ]~
+- Inside source: true
+*** True Line Result
+      ]
+** Processing line: ~    }~
+- Inside source: true
 *** True Line Result
-
+    }
+** Processing line: ~  end~
+- Inside source: true
 *** True Line Result
-#+begin_src ruby
-** Processing line: ~  # ./samples/99_genre_rpg_narrative/return_of_serenity/app/storyline_final_decision.rb~
+  end
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-  # ./samples/99_genre_rpg_narrative/return_of_serenity/app/storyline_final_decision.rb
-** Processing line: ~  def final_decision_side_of_home args~
+
+** Processing line: ~  def bad_dream_observatory args~
 - Inside source: true
 *** True Line Result
-  def final_decision_side_of_home args
+  def bad_dream_observatory args
 ** Processing line: ~    {~
 - Inside source: true
 *** True Line Result
     {
-** Processing line: ~      fade: 120,~
+** Processing line: ~      background: 'sprites/inside-observatory.png',~
 - Inside source: true
 *** True Line Result
-      fade: 120,
-** Processing line: ~      background: 'sprites/side-of-home.png',~
+      background: 'sprites/inside-observatory.png',
+** Processing line: ~      fade: 120,~
 - Inside source: true
 *** True Line Result
-      background: 'sprites/side-of-home.png',
-** Processing line: ~      player: [16, 13],~
+      fade: 120,
+** Processing line: ~      player: [51, 12],~
 - Inside source: true
 *** True Line Result
-      player: [16, 13],
-** Processing line: ~      scenes: [~
+      player: [51, 12],
+** Processing line: ~      storylines: [~
 - Inside source: true
 *** True Line Result
-      scenes: [
-** Processing line: ~        [52, 24, 11, 5, :final_decision_mountain_pass],~
+      storylines: [
+** Processing line: ~        [50, 10, 4, 4,   "Breathe, Hiro. Just see what's there... everything--- will- be okay."]~
 - Inside source: true
 *** True Line Result
-        [52, 24, 11, 5, :final_decision_mountain_pass],
+        [50, 10, 4, 4,   "Breathe, Hiro. Just see what's there... everything--- will- be okay."]
 ** Processing line: ~      ],~
 - Inside source: true
 *** True Line Result
       ],
-** Processing line: ~      render_override: :blinking_light_side_of_home_render,~
+** Processing line: ~      scenes: [~
 - Inside source: true
 *** True Line Result
-      render_override: :blinking_light_side_of_home_render,
-** Processing line: ~      storylines: [~
+      scenes: [
+** Processing line: ~        [30, 18, 5, 12, :bad_dream_inside_mainframe]~
 - Inside source: true
 *** True Line Result
-      storylines: [
-** Processing line: ~        [28, 13, 8, 4,  "Man. Hard to believe- that today- is the 21st--- anniversary-- of The Impact. Serenity--- will- be- home- soon."]~
+        [30, 18, 5, 12, :bad_dream_inside_mainframe]
+** Processing line: ~      ],~
 - Inside source: true
 *** True Line Result
-        [28, 13, 8, 4,  "Man. Hard to believe- that today- is the 21st--- anniversary-- of The Impact. Serenity--- will- be- home- soon."]
-** Processing line: ~      ]~
+      ],
+** Processing line: ~      render_override: :blinking_light_inside_observatory_render~
 - Inside source: true
 *** True Line Result
-      ]
+      render_override: :blinking_light_inside_observatory_render
 ** Processing line: ~    }~
 - Inside source: true
 *** True Line Result
@@ -139371,38 +145195,50 @@ Follows is a source code listing for all files that have been open sourced. This
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~  def final_decision_mountain_pass args~
+** Processing line: ~  def bad_dream_inside_mainframe args~
 - Inside source: true
 *** True Line Result
-  def final_decision_mountain_pass args
+  def bad_dream_inside_mainframe args
 ** Processing line: ~    {~
 - Inside source: true
 *** True Line Result
     {
-** Processing line: ~      background: 'sprites/mountain-pass-zoomed-out.png',~
+** Processing line: ~      player: [32, 4],~
 - Inside source: true
 *** True Line Result
-      background: 'sprites/mountain-pass-zoomed-out.png',
-** Processing line: ~      player: [4, 4],~
+      player: [32, 4],
+** Processing line: ~      background: 'sprites/mainframe.png',~
 - Inside source: true
 *** True Line Result
-      player: [4, 4],
-** Processing line: ~      scenes: [~
+      background: 'sprites/mainframe.png',
+** Processing line: ~      fade: 120,~
 - Inside source: true
 *** True Line Result
-      scenes: [
-** Processing line: ~        [18, 47, 5, 5, :final_decision_path_to_observatory]~
+      fade: 120,
+** Processing line: ~      storylines: [~
 - Inside source: true
 *** True Line Result
-        [18, 47, 5, 5, :final_decision_path_to_observatory]
+      storylines: [
+** Processing line: ~        [22, 45, 17, 4, (bad_dream_last_reply args)],~
+- Inside source: true
+*** True Line Result
+        [22, 45, 17, 4, (bad_dream_last_reply args)],
 ** Processing line: ~      ],~
 - Inside source: true
 *** True Line Result
       ],
-** Processing line: ~      render_override: :blinking_light_mountain_pass_render~
+** Processing line: ~      scenes: [~
 - Inside source: true
 *** True Line Result
-      render_override: :blinking_light_mountain_pass_render
+      scenes: [
+** Processing line: ~        [45, 45,  4, 4, :bad_dream_everyone_dead],~
+- Inside source: true
+*** True Line Result
+        [45, 45,  4, 4, :bad_dream_everyone_dead],
+** Processing line: ~      ]~
+- Inside source: true
+*** True Line Result
+      ]
 ** Processing line: ~    }~
 - Inside source: true
 *** True Line Result
@@ -139415,38 +145251,50 @@ Follows is a source code listing for all files that have been open sourced. This
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~  def final_decision_path_to_observatory args~
+** Processing line: ~  def bad_dream_everyone_dead args~
 - Inside source: true
 *** True Line Result
-  def final_decision_path_to_observatory args
+  def bad_dream_everyone_dead args
 ** Processing line: ~    {~
 - Inside source: true
 *** True Line Result
     {
-** Processing line: ~      background: 'sprites/path-to-observatory.png',~
+** Processing line: ~      background: 'sprites/mainframe.png',~
 - Inside source: true
 *** True Line Result
-      background: 'sprites/path-to-observatory.png',
-** Processing line: ~      player: [60, 4],~
+      background: 'sprites/mainframe.png',
+** Processing line: ~      storylines: [~
 - Inside source: true
 *** True Line Result
-      player: [60, 4],
-** Processing line: ~      scenes: [~
+      storylines: [
+** Processing line: ~        [22, 45, 17, 4, (bad_dream_last_reply args)],~
 - Inside source: true
 *** True Line Result
-      scenes: [
-** Processing line: ~        [0, 26, 5, 5, :final_decision_observatory]~
+        [22, 45, 17, 4, (bad_dream_last_reply args)],
+** Processing line: ~        [45, 45,  4, 4, "Hi-- Hiro. This is Sasha. By the time- you get this- message, chances-- are we will- already-- be- dead. The batteries--- got- damaged-- during-- removal. And- we don't-- have enough-- power-- for Life-- Support. The air-- is- already--- starting-- to taste- bad. It... would- have been- nice... to go- on a date--- with- you-- when-- I- got- back- to Earth. Anyways, good-- bye-- Hiro-- XOXOXO----"],~
 - Inside source: true
 *** True Line Result
-        [0, 26, 5, 5, :final_decision_observatory]
+        [45, 45,  4, 4, "Hi-- Hiro. This is Sasha. By the time- you get this- message, chances-- are we will- already-- be- dead. The batteries--- got- damaged-- during-- removal. And- we don't-- have enough-- power-- for Life-- Support. The air-- is- already--- starting-- to taste- bad. It... would- have been- nice... to go- on a date--- with- you-- when-- I- got- back- to Earth. Anyways, good-- bye-- Hiro-- XOXOXO----"],
+** Processing line: ~        [22,  5, 17, 4, "Meh. Whatever, I didn't-- want to save them anyways. What- a pain- in my ass."],~
+- Inside source: true
+*** True Line Result
+        [22,  5, 17, 4, "Meh. Whatever, I didn't-- want to save them anyways. What- a pain- in my ass."],
 ** Processing line: ~      ],~
 - Inside source: true
 *** True Line Result
       ],
-** Processing line: ~      render_override: :blinking_light_path_to_observatory_render~
+** Processing line: ~      scenes: [~
 - Inside source: true
 *** True Line Result
-      render_override: :blinking_light_path_to_observatory_render
+      scenes: [
+** Processing line: ~        [*hotspot_bottom, :anka_inside_room]~
+- Inside source: true
+*** True Line Result
+        [*hotspot_bottom, :anka_inside_room]
+** Processing line: ~      ]~
+- Inside source: true
+*** True Line Result
+      ]
 ** Processing line: ~    }~
 - Inside source: true
 *** True Line Result
@@ -139459,42 +145307,30 @@ Follows is a source code listing for all files that have been open sourced. This
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~  def final_decision_observatory args~
-- Inside source: true
-*** True Line Result
-  def final_decision_observatory args
-** Processing line: ~    {~
-- Inside source: true
-*** True Line Result
-    {
-** Processing line: ~      background: 'sprites/observatory.png',~
-- Inside source: true
-*** True Line Result
-      background: 'sprites/observatory.png',
-** Processing line: ~      player: [60, 2],~
+** Processing line: ~  def bad_dream_last_reply args~
 - Inside source: true
 *** True Line Result
-      player: [60, 2],
-** Processing line: ~      scenes: [~
+  def bad_dream_last_reply args
+** Processing line: ~    if args.state.scene_history.include? :replied_to_serenity_alive_firmly~
 - Inside source: true
 *** True Line Result
-      scenes: [
-** Processing line: ~        [28, 39, 4, 10, :final_decision_inside_observatory]~
+    if args.state.scene_history.include? :replied_to_serenity_alive_firmly
+** Processing line: ~      return "Buffer--: #{serenity_alive_firm_reply.quote}"~
 - Inside source: true
 *** True Line Result
-        [28, 39, 4, 10, :final_decision_inside_observatory]
-** Processing line: ~      ],~
+      return "Buffer--: #{serenity_alive_firm_reply.quote}"
+** Processing line: ~    else~
 - Inside source: true
 *** True Line Result
-      ],
-** Processing line: ~      render_override: :blinking_light_observatory_render~
+    else
+** Processing line: ~      return "Buffer--: #{serenity_alive_sugarcoated_reply.quote}"~
 - Inside source: true
 *** True Line Result
-      render_override: :blinking_light_observatory_render
-** Processing line: ~    }~
+      return "Buffer--: #{serenity_alive_sugarcoated_reply.quote}"
+** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
-    }
+    end
 ** Processing line: ~  end~
 - Inside source: true
 *** True Line Result
@@ -139503,46 +145339,66 @@ Follows is a source code listing for all files that have been open sourced. This
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~  def final_decision_inside_observatory args~
+** Processing line: ~#+end_src~
+- Line was identified as the end of a code block.
+*** True Line Result
+#+end_src
+** Processing line: ~~
+- End of paragraph detected.
+*** True Line Result
+
+** Processing line: ~*** Rpg Narrative - Return Of Serenity - storyline_serenity_introduction.rb~
+- Header detected.
+*** True Line Result
+
+*** True Line Result
+*** Rpg Narrative - Return Of Serenity - storyline_serenity_introduction.rb
+** Processing line: ~#+begin_src ruby~
+- Line was identified as the beginning of a code block.
+*** True Line Result
+
+*** True Line Result
+#+begin_src ruby
+** Processing line: ~  # ./samples/99_genre_rpg_narrative/return_of_serenity/app/storyline_serenity_introduction.rb~
 - Inside source: true
 *** True Line Result
-  def final_decision_inside_observatory args
-** Processing line: ~    {~
+  # ./samples/99_genre_rpg_narrative/return_of_serenity/app/storyline_serenity_introduction.rb
+** Processing line: ~  # decision_graph "Message from Sasha",~
 - Inside source: true
 *** True Line Result
-    {
-** Processing line: ~      background: 'sprites/inside-observatory.png',~
+  # decision_graph "Message from Sasha",
+** Processing line: ~  #                "I should reply.",~
 - Inside source: true
 *** True Line Result
-      background: 'sprites/inside-observatory.png',
-** Processing line: ~      player: [60, 2],~
+  #                "I should reply.",
+** Processing line: ~  #                [:replied_to_introduction_seriously,  "Reply Seriously", "Who is this?"],~
 - Inside source: true
 *** True Line Result
-      player: [60, 2],
-** Processing line: ~      storylines: [],~
+  #                [:replied_to_introduction_seriously,  "Reply Seriously", "Who is this?"],
+** Processing line: ~  # [:replied_to_introduction_humorously, "Reply Humorously", "New phone who dis?"]~
 - Inside source: true
 *** True Line Result
-      storylines: [],
-** Processing line: ~      scenes: [~
+  # [:replied_to_introduction_humorously, "Reply Humorously", "New phone who dis?"]
+** Processing line: ~  def reply_to_introduction args~
 - Inside source: true
 *** True Line Result
-      scenes: [
-** Processing line: ~        [30, 18, 5, 12, :final_decision_inside_mainframe]~
+  def reply_to_introduction args
+** Processing line: ~    decision_graph  "\"Mission-- control--, your- main- comm-- channels-- seem-- to be down. My apologies-- for- using-- this low- level-- exploit--. What's-- going-- on down there? We are ready-- for reentry--.\" Message--- Timestamp---: 4- hours-- 23--- minutes-- ago--.",~
 - Inside source: true
 *** True Line Result
-        [30, 18, 5, 12, :final_decision_inside_mainframe]
-** Processing line: ~      ],~
+    decision_graph  "\"Mission-- control--, your- main- comm-- channels-- seem-- to be down. My apologies-- for- using-- this low- level-- exploit--. What's-- going-- on down there? We are ready-- for reentry--.\" Message--- Timestamp---: 4- hours-- 23--- minutes-- ago--.",
+** Processing line: ~                    "Whoever-- pulled- off this exploit-- knows their stuff. I should reply--.",~
 - Inside source: true
 *** True Line Result
-      ],
-** Processing line: ~      render_override: :blinking_light_inside_observatory_render~
+                    "Whoever-- pulled- off this exploit-- knows their stuff. I should reply--.",
+** Processing line: ~                    [:replied_to_introduction_seriously,  "Serious Reply",  "Hello, Who- is sending-- this message--?"],~
 - Inside source: true
 *** True Line Result
-      render_override: :blinking_light_inside_observatory_render
-** Processing line: ~    }~
+                    [:replied_to_introduction_seriously,  "Serious Reply",  "Hello, Who- is sending-- this message--?"],
+** Processing line: ~                    [:replied_to_introduction_humorously, "Humorous Reply", "New phone, who dis?"]~
 - Inside source: true
 *** True Line Result
-    }
+                    [:replied_to_introduction_humorously, "Humorous Reply", "New phone, who dis?"]
 ** Processing line: ~  end~
 - Inside source: true
 *** True Line Result
@@ -139551,34 +145407,50 @@ Follows is a source code listing for all files that have been open sourced. This
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~  def final_decision_inside_mainframe args~
+** Processing line: ~  def replied_to_introduction_seriously args~
 - Inside source: true
 *** True Line Result
-  def final_decision_inside_mainframe args
+  def replied_to_introduction_seriously args
 ** Processing line: ~    {~
 - Inside source: true
 *** True Line Result
     {
-** Processing line: ~      player: [32, 4],~
+** Processing line: ~      background: 'sprites/inside-observatory.png',~
 - Inside source: true
 *** True Line Result
-      player: [32, 4],
-** Processing line: ~      background: 'sprites/mainframe.png',~
+      background: 'sprites/inside-observatory.png',
+** Processing line: ~      fade: 60,~
 - Inside source: true
 *** True Line Result
-      background: 'sprites/mainframe.png',
-** Processing line: ~      storylines: [],~
+      fade: 60,
+** Processing line: ~      player: [32, 21],~
 - Inside source: true
 *** True Line Result
-      storylines: [],
+      player: [32, 21],
 ** Processing line: ~      scenes: [~
 - Inside source: true
 *** True Line Result
       scenes: [
-** Processing line: ~        [*hotspot_top, :final_decision_ship_status],~
+** Processing line: ~        *replied_to_introduction_shared_scenes(args)~
 - Inside source: true
 *** True Line Result
-        [*hotspot_top, :final_decision_ship_status],
+        *replied_to_introduction_shared_scenes(args)
+** Processing line: ~      ],~
+- Inside source: true
+*** True Line Result
+      ],
+** Processing line: ~      storylines: [~
+- Inside source: true
+*** True Line Result
+      storylines: [
+** Processing line: ~        [30, 18, 5, 12, "Buffer-- has been set to: \"Hello, Who- is sending-- this message--?\""],~
+- Inside source: true
+*** True Line Result
+        [30, 18, 5, 12, "Buffer-- has been set to: \"Hello, Who- is sending-- this message--?\""],
+** Processing line: ~        *replied_to_introduction_shared_storylines(args)~
+- Inside source: true
+*** True Line Result
+        *replied_to_introduction_shared_storylines(args)
 ** Processing line: ~      ]~
 - Inside source: true
 *** True Line Result
@@ -139595,34 +145467,34 @@ Follows is a source code listing for all files that have been open sourced. This
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~  def final_decision_ship_status args~
+** Processing line: ~  def replied_to_introduction_humorously args~
 - Inside source: true
 *** True Line Result
-  def final_decision_ship_status args
+  def replied_to_introduction_humorously args
 ** Processing line: ~    {~
 - Inside source: true
 *** True Line Result
     {
-** Processing line: ~      background: 'sprites/serenity.png',~
+** Processing line: ~      background: 'sprites/inside-observatory.png',~
 - Inside source: true
 *** True Line Result
-      background: 'sprites/serenity.png',
+      background: 'sprites/inside-observatory.png',
 ** Processing line: ~      fade: 60,~
 - Inside source: true
 *** True Line Result
       fade: 60,
-** Processing line: ~      player: [30, 10],~
+** Processing line: ~      player: [32, 21],~
 - Inside source: true
 *** True Line Result
-      player: [30, 10],
+      player: [32, 21],
 ** Processing line: ~      scenes: [~
 - Inside source: true
 *** True Line Result
       scenes: [
-** Processing line: ~        [*hotspot_top_right, :final_decision]~
+** Processing line: ~        *replied_to_introduction_shared_scenes(args)~
 - Inside source: true
 *** True Line Result
-        [*hotspot_top_right, :final_decision]
+        *replied_to_introduction_shared_scenes(args)
 ** Processing line: ~      ],~
 - Inside source: true
 *** True Line Result
@@ -139631,14 +145503,14 @@ Follows is a source code listing for all files that have been open sourced. This
 - Inside source: true
 *** True Line Result
       storylines: [
-** Processing line: ~        [30,  8, 4, 4, "????"],~
+** Processing line: ~        [30, 18, 5, 12, "Buffer-- has been set to: \"New- phone. Who dis?\""],~
 - Inside source: true
 *** True Line Result
-        [30,  8, 4, 4, "????"],
-** Processing line: ~        *final_decision_ship_status_shared(args)~
+        [30, 18, 5, 12, "Buffer-- has been set to: \"New- phone. Who dis?\""],
+** Processing line: ~        *replied_to_introduction_shared_storylines(args)~
 - Inside source: true
 *** True Line Result
-        *final_decision_ship_status_shared(args)
+        *replied_to_introduction_shared_storylines(args)
 ** Processing line: ~      ]~
 - Inside source: true
 *** True Line Result
@@ -139655,34 +145527,30 @@ Follows is a source code listing for all files that have been open sourced. This
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~  def final_decision args~
-- Inside source: true
-*** True Line Result
-  def final_decision args
-** Processing line: ~    decision_graph  "Stasis-- Chambers--: UNDERPOWERED, Life- forms-- will be terminated---- unless-- equilibrium----- is reached.",~
+** Processing line: ~  def replied_to_introduction_shared_storylines args~
 - Inside source: true
 *** True Line Result
-    decision_graph  "Stasis-- Chambers--: UNDERPOWERED, Life- forms-- will be terminated---- unless-- equilibrium----- is reached.",
-** Processing line: ~                    "I CAN'T DO THIS... But... If-- I-- don't--- bring-- the- chambers--- to- equilibrium-----, they all die...",~
+  def replied_to_introduction_shared_storylines args
+** Processing line: ~    [~
 - Inside source: true
 *** True Line Result
-                    "I CAN'T DO THIS... But... If-- I-- don't--- bring-- the- chambers--- to- equilibrium-----, they all die...",
-** Processing line: ~                    [:final_decision_game_over_noone, "Kill--- Everyone---", "DO--- NOTHING?"],~
+    [
+** Processing line: ~      [30, 10, 5, 4, "It's-- going-- to take a while-- for this reply-- to make it's-- way back."],~
 - Inside source: true
 *** True Line Result
-                    [:final_decision_game_over_noone, "Kill--- Everyone---", "DO--- NOTHING?"],
-** Processing line: ~                    [:final_decision_game_over_matthew, "Kill--- Sasha---", "KILL--- SASHA?"],~
+      [30, 10, 5, 4, "It's-- going-- to take a while-- for this reply-- to make it's-- way back."],
+** Processing line: ~      [40, 10, 5, 4, "4- hours-- to send a message-- at light speed?! How far away-- is the sender--?"],~
 - Inside source: true
 *** True Line Result
-                    [:final_decision_game_over_matthew, "Kill--- Sasha---", "KILL--- SASHA?"],
-** Processing line: ~                    [:final_decision_game_over_anka, "Kill--- Aanka---", "KILL--- AANKA?"],~
+      [40, 10, 5, 4, "4- hours-- to send a message-- at light speed?! How far away-- is the sender--?"],
+** Processing line: ~      [50, 10, 5, 4, "I know- I've-- read about-- light- speed- travel-- before--. Maybe-- the library--- still has that- poster."]~
 - Inside source: true
 *** True Line Result
-                    [:final_decision_game_over_anka, "Kill--- Aanka---", "KILL--- AANKA?"],
-** Processing line: ~                    [:final_decision_game_over_sasha, "Kill--- Matthew---", "KILL--- MATTHEW?"]~
+      [50, 10, 5, 4, "I know- I've-- read about-- light- speed- travel-- before--. Maybe-- the library--- still has that- poster."]
+** Processing line: ~    ]~
 - Inside source: true
 *** True Line Result
-                    [:final_decision_game_over_sasha, "Kill--- Matthew---", "KILL--- MATTHEW?"]
+    ]
 ** Processing line: ~  end~
 - Inside source: true
 *** True Line Result
@@ -139691,30 +145559,14 @@ Follows is a source code listing for all files that have been open sourced. This
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~  def final_decision_game_over_noone args~
-- Inside source: true
-*** True Line Result
-  def final_decision_game_over_noone args
-** Processing line: ~    {~
-- Inside source: true
-*** True Line Result
-    {
-** Processing line: ~      background: 'sprites/tribute-game-over.png',~
-- Inside source: true
-*** True Line Result
-      background: 'sprites/tribute-game-over.png',
-** Processing line: ~      player: [53, 14],~
-- Inside source: true
-*** True Line Result
-      player: [53, 14],
-** Processing line: ~      fade: 600~
+** Processing line: ~  def replied_to_introduction_shared_scenes args~
 - Inside source: true
 *** True Line Result
-      fade: 600
-** Processing line: ~    }~
+  def replied_to_introduction_shared_scenes args
+** Processing line: ~    [[60, 0, 4, 32, :replied_to_introduction_observatory]]~
 - Inside source: true
 *** True Line Result
-    }
+    [[60, 0, 4, 32, :replied_to_introduction_observatory]]
 ** Processing line: ~  end~
 - Inside source: true
 *** True Line Result
@@ -139723,26 +145575,34 @@ Follows is a source code listing for all files that have been open sourced. This
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~  def final_decision_game_over_matthew args~
+** Processing line: ~  def replied_to_introduction_observatory args~
 - Inside source: true
 *** True Line Result
-  def final_decision_game_over_matthew args
+  def replied_to_introduction_observatory args
 ** Processing line: ~    {~
 - Inside source: true
 *** True Line Result
     {
-** Processing line: ~      background: 'sprites/tribute-game-over.png',~
+** Processing line: ~      background: 'sprites/observatory.png',~
 - Inside source: true
 *** True Line Result
-      background: 'sprites/tribute-game-over.png',
-** Processing line: ~      player: [53, 14],~
+      background: 'sprites/observatory.png',
+** Processing line: ~      player: [28, 39],~
 - Inside source: true
 *** True Line Result
-      player: [53, 14],
-** Processing line: ~      fade: 600~
+      player: [28, 39],
+** Processing line: ~      scenes: [~
 - Inside source: true
 *** True Line Result
-      fade: 600
+      scenes: [
+** Processing line: ~        [60, 0, 4, 32, :replied_to_introduction_path_to_observatory]~
+- Inside source: true
+*** True Line Result
+        [60, 0, 4, 32, :replied_to_introduction_path_to_observatory]
+** Processing line: ~      ]~
+- Inside source: true
+*** True Line Result
+      ]
 ** Processing line: ~    }~
 - Inside source: true
 *** True Line Result
@@ -139755,26 +145615,34 @@ Follows is a source code listing for all files that have been open sourced. This
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~  def final_decision_game_over_anka args~
+** Processing line: ~  def replied_to_introduction_path_to_observatory args~
 - Inside source: true
 *** True Line Result
-  def final_decision_game_over_anka args
+  def replied_to_introduction_path_to_observatory args
 ** Processing line: ~    {~
 - Inside source: true
 *** True Line Result
     {
-** Processing line: ~      background: 'sprites/tribute-game-over.png',~
+** Processing line: ~      background: 'sprites/path-to-observatory.png',~
 - Inside source: true
 *** True Line Result
-      background: 'sprites/tribute-game-over.png',
-** Processing line: ~      player: [53, 14],~
+      background: 'sprites/path-to-observatory.png',
+** Processing line: ~      player: [0, 26],~
 - Inside source: true
 *** True Line Result
-      player: [53, 14],
-** Processing line: ~      fade: 600~
+      player: [0, 26],
+** Processing line: ~      scenes: [~
 - Inside source: true
 *** True Line Result
-      fade: 600
+      scenes: [
+** Processing line: ~        [60, 0, 4, 20, :replied_to_introduction_mountain_pass]~
+- Inside source: true
+*** True Line Result
+        [60, 0, 4, 20, :replied_to_introduction_mountain_pass]
+** Processing line: ~      ],~
+- Inside source: true
+*** True Line Result
+      ],
 ** Processing line: ~    }~
 - Inside source: true
 *** True Line Result
@@ -139787,26 +145655,46 @@ Follows is a source code listing for all files that have been open sourced. This
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~  def final_decision_game_over_sasha args~
+** Processing line: ~  def replied_to_introduction_mountain_pass args~
 - Inside source: true
 *** True Line Result
-  def final_decision_game_over_sasha args
+  def replied_to_introduction_mountain_pass args
 ** Processing line: ~    {~
 - Inside source: true
 *** True Line Result
     {
-** Processing line: ~      background: 'sprites/tribute-game-over.png',~
+** Processing line: ~      background: 'sprites/mountain-pass-zoomed-out.png',~
 - Inside source: true
 *** True Line Result
-      background: 'sprites/tribute-game-over.png',
-** Processing line: ~      player: [53, 14],~
+      background: 'sprites/mountain-pass-zoomed-out.png',
+** Processing line: ~      player: [21, 48],~
 - Inside source: true
 *** True Line Result
-      player: [53, 14],
-** Processing line: ~      fade: 600~
+      player: [21, 48],
+** Processing line: ~      scenes: [~
 - Inside source: true
 *** True Line Result
-      fade: 600
+      scenes: [
+** Processing line: ~        [0, 0, 15, 4, :replied_to_introduction_side_of_home]~
+- Inside source: true
+*** True Line Result
+        [0, 0, 15, 4, :replied_to_introduction_side_of_home]
+** Processing line: ~      ],~
+- Inside source: true
+*** True Line Result
+      ],
+** Processing line: ~      storylines: [~
+- Inside source: true
+*** True Line Result
+      storylines: [
+** Processing line: ~        [15, 28, 5, 3, "At least I'm-- getting-- my- exercise-- in- for- today--."]~
+- Inside source: true
+*** True Line Result
+        [15, 28, 5, 3, "At least I'm-- getting-- my- exercise-- in- for- today--."]
+** Processing line: ~      ]~
+- Inside source: true
+*** True Line Result
+      ]
 ** Processing line: ~    }~
 - Inside source: true
 *** True Line Result
@@ -139819,38 +145707,38 @@ Follows is a source code listing for all files that have been open sourced. This
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~  def final_decision_ship_status_shared args~
+** Processing line: ~  def replied_to_introduction_side_of_home args~
 - Inside source: true
 *** True Line Result
-  def final_decision_ship_status_shared args
-** Processing line: ~    [~
+  def replied_to_introduction_side_of_home args
+** Processing line: ~    {~
 - Inside source: true
 *** True Line Result
-    [
-** Processing line: ~      *ship_control_hotspot(24, 22,~
+    {
+** Processing line: ~      background: 'sprites/side-of-home.png',~
 - Inside source: true
 *** True Line Result
-      *ship_control_hotspot(24, 22,
-** Processing line: ~                             "Stasis-- Chambers--: UNDERPOWERED, Life- forms-- will be terminated---- unless-- equilibrium----- is reached. WHAT?! NO!",~
+      background: 'sprites/side-of-home.png',
+** Processing line: ~      player: [58, 29],~
 - Inside source: true
 *** True Line Result
-                             "Stasis-- Chambers--: UNDERPOWERED, Life- forms-- will be terminated---- unless-- equilibrium----- is reached. WHAT?! NO!",
-** Processing line: ~                             "Matthew's--- Chamber--: UNDER-- THREAT-- OF-- TERMINATION. WHAT?! NO!",~
+      player: [58, 29],
+** Processing line: ~      scenes: [~
 - Inside source: true
 *** True Line Result
-                             "Matthew's--- Chamber--: UNDER-- THREAT-- OF-- TERMINATION. WHAT?! NO!",
-** Processing line: ~                             "Aanka's--- Chamber--: UNDER-- THREAT-- OF-- TERMINATION.  WHAT?! NO!",~
+      scenes: [
+** Processing line: ~        [2, 0, 61, 2, :speed_of_light_front_of_home]~
 - Inside source: true
 *** True Line Result
-                             "Aanka's--- Chamber--: UNDER-- THREAT-- OF-- TERMINATION.  WHAT?! NO!",
-** Processing line: ~                             "Sasha's--- Chamber--: UNDER-- THREAT-- OF-- TERMINATION. WHAT?! NO!"),~
+        [2, 0, 61, 2, :speed_of_light_front_of_home]
+** Processing line: ~      ],~
 - Inside source: true
 *** True Line Result
-                             "Sasha's--- Chamber--: UNDER-- THREAT-- OF-- TERMINATION. WHAT?! NO!"),
-** Processing line: ~    ]~
+      ],
+** Processing line: ~    }~
 - Inside source: true
 *** True Line Result
-    ]
+    }
 ** Processing line: ~  end~
 - Inside source: true
 *** True Line Result
@@ -139867,62 +145755,50 @@ Follows is a source code listing for all files that have been open sourced. This
 - End of paragraph detected.
 *** True Line Result
 
-** Processing line: ~*** Rpg Narrative - Return Of Serenity - storyline_final_message.rb~
+** Processing line: ~*** Rpg Narrative - Return Of Serenity - storyline_speed_of_light.rb~
 - Header detected.
 *** True Line Result
 
 *** True Line Result
-*** Rpg Narrative - Return Of Serenity - storyline_final_message.rb
+*** Rpg Narrative - Return Of Serenity - storyline_speed_of_light.rb
 ** Processing line: ~#+begin_src ruby~
 - Line was identified as the beginning of a code block.
 *** True Line Result
 
 *** True Line Result
 #+begin_src ruby
-** Processing line: ~  # ./samples/99_genre_rpg_narrative/return_of_serenity/app/storyline_final_message.rb~
+** Processing line: ~  # ./samples/99_genre_rpg_narrative/return_of_serenity/app/storyline_speed_of_light.rb~
 - Inside source: true
 *** True Line Result
-  # ./samples/99_genre_rpg_narrative/return_of_serenity/app/storyline_final_message.rb
-** Processing line: ~  def final_message_sad args~
+  # ./samples/99_genre_rpg_narrative/return_of_serenity/app/storyline_speed_of_light.rb
+** Processing line: ~  def speed_of_light_front_of_home args~
 - Inside source: true
 *** True Line Result
-  def final_message_sad args
+  def speed_of_light_front_of_home args
 ** Processing line: ~    {~
 - Inside source: true
 *** True Line Result
     {
-** Processing line: ~      fade: 60,~
-- Inside source: true
-*** True Line Result
-      fade: 60,
-** Processing line: ~      background: 'sprites/inside-home.png',~
-- Inside source: true
-*** True Line Result
-      background: 'sprites/inside-home.png',
-** Processing line: ~      player: [34, 35],~
-- Inside source: true
-*** True Line Result
-      player: [34, 35],
-** Processing line: ~      storylines: [~
-- Inside source: true
-*** True Line Result
-      storylines: [
-** Processing line: ~        [34, 34, 4, 4, "Another-- sleepless-- night..."],~
+** Processing line: ~      background: 'sprites/front-of-home.png',~
 - Inside source: true
 *** True Line Result
-        [34, 34, 4, 4, "Another-- sleepless-- night..."],
-** Processing line: ~      ],~
+      background: 'sprites/front-of-home.png',
+** Processing line: ~      player: [54, 23],~
 - Inside source: true
 *** True Line Result
-      ],
+      player: [54, 23],
 ** Processing line: ~      scenes: [~
 - Inside source: true
 *** True Line Result
       scenes: [
-** Processing line: ~        [32, -1, 8, 3, :final_message_observatory]~
+** Processing line: ~        [44, 34, 8, 14, :speed_of_light_inside_home],~
 - Inside source: true
 *** True Line Result
-        [32, -1, 8, 3, :final_message_observatory]
+        [44, 34, 8, 14, :speed_of_light_inside_home],
+** Processing line: ~        [0, 3, 3, 22, :speed_of_light_outside_library]~
+- Inside source: true
+*** True Line Result
+        [0, 3, 3, 22, :speed_of_light_outside_library]
 ** Processing line: ~      ]~
 - Inside source: true
 *** True Line Result
@@ -139939,34 +145815,30 @@ Follows is a source code listing for all files that have been open sourced. This
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~  def final_message_happy args~
+** Processing line: ~  def speed_of_light_inside_home args~
 - Inside source: true
 *** True Line Result
-  def final_message_happy args
+  def speed_of_light_inside_home args
 ** Processing line: ~    {~
 - Inside source: true
 *** True Line Result
     {
-** Processing line: ~      fade: 60,~
-- Inside source: true
-*** True Line Result
-      fade: 60,
 ** Processing line: ~      background: 'sprites/inside-home.png',~
 - Inside source: true
 *** True Line Result
       background: 'sprites/inside-home.png',
-** Processing line: ~      player: [34, 35],~
+** Processing line: ~      player: [35, 4],~
 - Inside source: true
 *** True Line Result
-      player: [34, 35],
+      player: [35, 4],
 ** Processing line: ~      storylines: [~
 - Inside source: true
 *** True Line Result
       storylines: [
-** Processing line: ~        [34, 34, 4, 4, "Oh man, I slept like rock!"],~
+** Processing line: ~        [30, 38, 12, 13, "Can't- sleep right now. I have to- find- out- why- it took- over-- 4- hours-- to receive-- that message."]~
 - Inside source: true
 *** True Line Result
-        [34, 34, 4, 4, "Oh man, I slept like rock!"],
+        [30, 38, 12, 13, "Can't- sleep right now. I have to- find- out- why- it took- over-- 4- hours-- to receive-- that message."]
 ** Processing line: ~      ],~
 - Inside source: true
 *** True Line Result
@@ -139975,10 +145847,10 @@ Follows is a source code listing for all files that have been open sourced. This
 - Inside source: true
 *** True Line Result
       scenes: [
-** Processing line: ~        [32, -1, 8, 3, :final_message_observatory]~
+** Processing line: ~        [32, 0, 8, 3, :speed_of_light_front_of_home],~
 - Inside source: true
 *** True Line Result
-        [32, -1, 8, 3, :final_message_observatory]
+        [32, 0, 8, 3, :speed_of_light_front_of_home],
 ** Processing line: ~      ]~
 - Inside source: true
 *** True Line Result
@@ -139995,42 +145867,38 @@ Follows is a source code listing for all files that have been open sourced. This
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~  def final_message_side_of_home args~
+** Processing line: ~  def speed_of_light_outside_library args~
 - Inside source: true
 *** True Line Result
-  def final_message_side_of_home args
+  def speed_of_light_outside_library args
 ** Processing line: ~    {~
 - Inside source: true
 *** True Line Result
     {
-** Processing line: ~      fade: 60,~
-- Inside source: true
-*** True Line Result
-      fade: 60,
-** Processing line: ~      background: 'sprites/side-of-home.png',~
+** Processing line: ~      background: 'sprites/outside-library.png',~
 - Inside source: true
 *** True Line Result
-      background: 'sprites/side-of-home.png',
-** Processing line: ~      player: [16, 13],~
+      background: 'sprites/outside-library.png',
+** Processing line: ~      player: [55, 19],~
 - Inside source: true
 *** True Line Result
-      player: [16, 13],
+      player: [55, 19],
 ** Processing line: ~      scenes: [~
 - Inside source: true
 *** True Line Result
       scenes: [
-** Processing line: ~        [52, 24, 11, 5, :final_message_mountain_pass],~
+** Processing line: ~        [49, 39, 6, 10, :speed_of_light_library],~
 - Inside source: true
 *** True Line Result
-        [52, 24, 11, 5, :final_message_mountain_pass],
-** Processing line: ~      ],~
+        [49, 39, 6, 10, :speed_of_light_library],
+** Processing line: ~        [61, 11, 3, 20, :speed_of_light_front_of_home]~
 - Inside source: true
 *** True Line Result
-      ],
-** Processing line: ~      render_override: :blinking_light_side_of_home_render~
+        [61, 11, 3, 20, :speed_of_light_front_of_home]
+** Processing line: ~      ]~
 - Inside source: true
 *** True Line Result
-      render_override: :blinking_light_side_of_home_render
+      ]
 ** Processing line: ~    }~
 - Inside source: true
 *** True Line Result
@@ -140043,50 +145911,34 @@ Follows is a source code listing for all files that have been open sourced. This
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~  def final_message_mountain_pass args~
+** Processing line: ~  def speed_of_light_library args~
 - Inside source: true
 *** True Line Result
-  def final_message_mountain_pass args
+  def speed_of_light_library args
 ** Processing line: ~    {~
 - Inside source: true
 *** True Line Result
     {
-** Processing line: ~      background: 'sprites/mountain-pass-zoomed-out.png',~
+** Processing line: ~      background: 'sprites/library.png',~
 - Inside source: true
 *** True Line Result
-      background: 'sprites/mountain-pass-zoomed-out.png',
-** Processing line: ~      player: [4, 4],~
+      background: 'sprites/library.png',
+** Processing line: ~      player: [30, 7],~
 - Inside source: true
 *** True Line Result
-      player: [4, 4],
+      player: [30, 7],
 ** Processing line: ~      scenes: [~
 - Inside source: true
 *** True Line Result
       scenes: [
-** Processing line: ~        [18, 47, 5, 5, :final_message_path_to_observatory],~
-- Inside source: true
-*** True Line Result
-        [18, 47, 5, 5, :final_message_path_to_observatory],
-** Processing line: ~      ],~
-- Inside source: true
-*** True Line Result
-      ],
-** Processing line: ~      storylines: [~
-- Inside source: true
-*** True Line Result
-      storylines: [
-** Processing line: ~        [18, 13, 5, 5, "Hnnnnnnnggg. My legs-- are still sore- from yesterday."]~
-- Inside source: true
-*** True Line Result
-        [18, 13, 5, 5, "Hnnnnnnnggg. My legs-- are still sore- from yesterday."]
-** Processing line: ~      ],~
+** Processing line: ~        [3, 50, 10, 3, :speed_of_light_celestial_bodies_diagram]~
 - Inside source: true
 *** True Line Result
-      ],
-** Processing line: ~      render_override: :blinking_light_mountain_pass_render~
+        [3, 50, 10, 3, :speed_of_light_celestial_bodies_diagram]
+** Processing line: ~      ]~
 - Inside source: true
 *** True Line Result
-      render_override: :blinking_light_mountain_pass_render
+      ]
 ** Processing line: ~    }~
 - Inside source: true
 *** True Line Result
@@ -140099,30 +145951,34 @@ Follows is a source code listing for all files that have been open sourced. This
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~  def final_message_path_to_observatory args~
+** Processing line: ~  def speed_of_light_celestial_bodies_diagram args~
 - Inside source: true
 *** True Line Result
-  def final_message_path_to_observatory args
+  def speed_of_light_celestial_bodies_diagram args
 ** Processing line: ~    {~
 - Inside source: true
 *** True Line Result
     {
-** Processing line: ~      background: 'sprites/path-to-observatory.png',~
+** Processing line: ~      background: 'sprites/planets.png',~
 - Inside source: true
 *** True Line Result
-      background: 'sprites/path-to-observatory.png',
-** Processing line: ~      player: [60, 4],~
+      background: 'sprites/planets.png',
+** Processing line: ~      fade: 60,~
 - Inside source: true
 *** True Line Result
-      player: [60, 4],
+      fade: 60,
+** Processing line: ~      player: [30, 3],~
+- Inside source: true
+*** True Line Result
+      player: [30, 3],
 ** Processing line: ~      scenes: [~
 - Inside source: true
 *** True Line Result
       scenes: [
-** Processing line: ~        [0, 26, 5, 5, :final_message_observatory]~
+** Processing line: ~        [56 - 2, 10, 5, 5, :speed_of_light_distance_discovered]~
 - Inside source: true
 *** True Line Result
-        [0, 26, 5, 5, :final_message_observatory]
+        [56 - 2, 10, 5, 5, :speed_of_light_distance_discovered]
 ** Processing line: ~      ],~
 - Inside source: true
 *** True Line Result
@@ -140131,142 +145987,146 @@ Follows is a source code listing for all files that have been open sourced. This
 - Inside source: true
 *** True Line Result
       storylines: [
-** Processing line: ~        [22, 20, 10, 10, "This spot--, on the mountain, right here, it's-- perfect. This- is where- I'll-- yeet-- the person-- who is playing-- this- prank- on me."]~
+** Processing line: ~        [30, 2, 4, 4, "Here- it is! This is a diagram--- of the solar-- system--. It was printed-- over-- fifty-- years- ago. Geez-- that's-- old."],~
 - Inside source: true
 *** True Line Result
-        [22, 20, 10, 10, "This spot--, on the mountain, right here, it's-- perfect. This- is where- I'll-- yeet-- the person-- who is playing-- this- prank- on me."]
-** Processing line: ~      ],~
+        [30, 2, 4, 4, "Here- it is! This is a diagram--- of the solar-- system--. It was printed-- over-- fifty-- years- ago. Geez-- that's-- old."],
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-      ],
-** Processing line: ~      render_override: :blinking_light_path_to_observatory_render~
+
+** Processing line: ~        [ 0 - 2, 10, 5, 5, "The label- reads: Sun. The length- of the Astronomical-------- Unit-- (AU), is the distance-- from the Sun- to the Earth. Which is about 150--- million--- kilometers----."],~
 - Inside source: true
 *** True Line Result
-      render_override: :blinking_light_path_to_observatory_render
-** Processing line: ~    }~
+        [ 0 - 2, 10, 5, 5, "The label- reads: Sun. The length- of the Astronomical-------- Unit-- (AU), is the distance-- from the Sun- to the Earth. Which is about 150--- million--- kilometers----."],
+** Processing line: ~        [ 7 - 2, 10, 5, 5, "The label- reads: Mercury. Distance from Sun: 0.39AU------------ or- 3----- light-- minutes--."],~
 - Inside source: true
 *** True Line Result
-    }
-** Processing line: ~  end~
+        [ 7 - 2, 10, 5, 5, "The label- reads: Mercury. Distance from Sun: 0.39AU------------ or- 3----- light-- minutes--."],
+** Processing line: ~        [14 - 2, 10, 5, 5, "The label- reads: Venus. Distance from Sun: 0.72AU------------ or- 6----- light-- minutes--."],~
 - Inside source: true
 *** True Line Result
-  end
-** Processing line: ~~
+        [14 - 2, 10, 5, 5, "The label- reads: Venus. Distance from Sun: 0.72AU------------ or- 6----- light-- minutes--."],
+** Processing line: ~        [21 - 2, 10, 5, 5, "The label- reads: Earth. Distance from Sun: 1.00AU------------ or- 8----- light-- minutes--."],~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~  def final_message_observatory args~
+        [21 - 2, 10, 5, 5, "The label- reads: Earth. Distance from Sun: 1.00AU------------ or- 8----- light-- minutes--."],
+** Processing line: ~        [28 - 2, 10, 5, 5, "The label- reads: Mars. Distance from Sun: 1.52AU------------ or- 12----- light-- minutes--."],~
 - Inside source: true
 *** True Line Result
-  def final_message_observatory args
-** Processing line: ~    if args.state.scene_history.include? :replied_with_whole_truth~
+        [28 - 2, 10, 5, 5, "The label- reads: Mars. Distance from Sun: 1.52AU------------ or- 12----- light-- minutes--."],
+** Processing line: ~        [35 - 2, 10, 5, 5, "The label- reads: Jupiter. Distance from Sun: 5.20AU------------ or- 45----- light-- minutes--."],~
 - Inside source: true
 *** True Line Result
-    if args.state.scene_history.include? :replied_with_whole_truth
-** Processing line: ~      return {~
+        [35 - 2, 10, 5, 5, "The label- reads: Jupiter. Distance from Sun: 5.20AU------------ or- 45----- light-- minutes--."],
+** Processing line: ~        [42 - 2, 10, 5, 5, "The label- reads: Saturn. Distance from Sun: 9.53AU------------ or- 79----- light-- minutes--."],~
 - Inside source: true
 *** True Line Result
-      return {
-** Processing line: ~        background: 'sprites/inside-observatory.png',~
+        [42 - 2, 10, 5, 5, "The label- reads: Saturn. Distance from Sun: 9.53AU------------ or- 79----- light-- minutes--."],
+** Processing line: ~        [49 - 2, 10, 5, 5, "The label- reads: Uranus. Distance from Sun: 19.81AU------------ or- 159----- light-- minutes--."],~
 - Inside source: true
 *** True Line Result
-        background: 'sprites/inside-observatory.png',
-** Processing line: ~        fade: 60,~
+        [49 - 2, 10, 5, 5, "The label- reads: Uranus. Distance from Sun: 19.81AU------------ or- 159----- light-- minutes--."],
+** Processing line: ~        # [56 - 2, 15, 4, 4, "The label- reads: Neptune. Distance from Sun: 30.05AU------------ or- 4.1----- light-- hours--."],~
 - Inside source: true
 *** True Line Result
-        fade: 60,
-** Processing line: ~        player: [51, 12],~
+        # [56 - 2, 15, 4, 4, "The label- reads: Neptune. Distance from Sun: 30.05AU------------ or- 4.1----- light-- hours--."],
+** Processing line: ~        [63 - 2, 10, 5, 5, "The label- reads: Pluto. Wait. WTF? Pluto-- isn't-- a planet."],~
 - Inside source: true
 *** True Line Result
-        player: [51, 12],
-** Processing line: ~        storylines: [~
+        [63 - 2, 10, 5, 5, "The label- reads: Pluto. Wait. WTF? Pluto-- isn't-- a planet."],
+** Processing line: ~      ]~
 - Inside source: true
 *** True Line Result
-        storylines: [
-** Processing line: ~          [50, 10, 4, 4, "Here-- we- go..."]~
+      ]
+** Processing line: ~    }~
 - Inside source: true
 *** True Line Result
-          [50, 10, 4, 4, "Here-- we- go..."]
-** Processing line: ~        ],~
+    }
+** Processing line: ~  end~
 - Inside source: true
 *** True Line Result
-        ],
-** Processing line: ~        scenes: [~
+  end
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-        scenes: [
-** Processing line: ~          [30, 18, 5, 12, :final_message_inside_mainframe]~
+
+** Processing line: ~  def speed_of_light_distance_discovered args~
 - Inside source: true
 *** True Line Result
-          [30, 18, 5, 12, :final_message_inside_mainframe]
-** Processing line: ~        ],~
+  def speed_of_light_distance_discovered args
+** Processing line: ~    {~
 - Inside source: true
 *** True Line Result
-        ],
-** Processing line: ~        render_override: :blinking_light_inside_observatory_render~
+    {
+** Processing line: ~      background: 'sprites/planets.png',~
 - Inside source: true
 *** True Line Result
-        render_override: :blinking_light_inside_observatory_render
-** Processing line: ~      }~
+      background: 'sprites/planets.png',
+** Processing line: ~      scenes: [~
 - Inside source: true
 *** True Line Result
-      }
-** Processing line: ~    else~
+      scenes: [
+** Processing line: ~        [13, 0, 44, 3, :speed_of_light_end_of_day]~
 - Inside source: true
 *** True Line Result
-    else
-** Processing line: ~      return {~
+        [13, 0, 44, 3, :speed_of_light_end_of_day]
+** Processing line: ~      ],~
 - Inside source: true
 *** True Line Result
-      return {
-** Processing line: ~        background: 'sprites/inside-observatory.png',~
+      ],
+** Processing line: ~      storylines: [~
 - Inside source: true
 *** True Line Result
-        background: 'sprites/inside-observatory.png',
-** Processing line: ~        fade: 60,~
+      storylines: [
+** Processing line: ~        [ 0 - 2, 10, 5, 5, "The label- reads: Sun. The length- of the Astronomical-------- Unit-- (AU), is the distance-- from the Sun- to the Earth. Which is about 150--- million--- kilometers----."],~
 - Inside source: true
 *** True Line Result
-        fade: 60,
-** Processing line: ~        player: [51, 12],~
+        [ 0 - 2, 10, 5, 5, "The label- reads: Sun. The length- of the Astronomical-------- Unit-- (AU), is the distance-- from the Sun- to the Earth. Which is about 150--- million--- kilometers----."],
+** Processing line: ~        [ 7 - 2, 10, 5, 5, "The label- reads: Mercury. Distance from Sun: 0.39AU------------ or- 3----- light-- minutes--."],~
 - Inside source: true
 *** True Line Result
-        player: [51, 12],
-** Processing line: ~        storylines: [~
+        [ 7 - 2, 10, 5, 5, "The label- reads: Mercury. Distance from Sun: 0.39AU------------ or- 3----- light-- minutes--."],
+** Processing line: ~        [14 - 2, 10, 5, 5, "The label- reads: Venus. Distance from Sun: 0.72AU------------ or- 6----- light-- minutes--."],~
 - Inside source: true
 *** True Line Result
-        storylines: [
-** Processing line: ~          [50, 10, 4, 4, "I feel like I'm-- walking-- on sunshine!"]~
+        [14 - 2, 10, 5, 5, "The label- reads: Venus. Distance from Sun: 0.72AU------------ or- 6----- light-- minutes--."],
+** Processing line: ~        [21 - 2, 10, 5, 5, "The label- reads: Earth. Distance from Sun: 1.00AU------------ or- 8----- light-- minutes--."],~
 - Inside source: true
 *** True Line Result
-          [50, 10, 4, 4, "I feel like I'm-- walking-- on sunshine!"]
-** Processing line: ~        ],~
+        [21 - 2, 10, 5, 5, "The label- reads: Earth. Distance from Sun: 1.00AU------------ or- 8----- light-- minutes--."],
+** Processing line: ~        [28 - 2, 10, 5, 5, "The label- reads: Mars. Distance from Sun: 1.52AU------------ or- 12----- light-- minutes--."],~
 - Inside source: true
 *** True Line Result
-        ],
-** Processing line: ~        scenes: [~
+        [28 - 2, 10, 5, 5, "The label- reads: Mars. Distance from Sun: 1.52AU------------ or- 12----- light-- minutes--."],
+** Processing line: ~        [35 - 2, 10, 5, 5, "The label- reads: Jupiter. Distance from Sun: 5.20AU------------ or- 45----- light-- minutes--."],~
 - Inside source: true
 *** True Line Result
-        scenes: [
-** Processing line: ~          [30, 18, 5, 12, :final_message_inside_mainframe]~
+        [35 - 2, 10, 5, 5, "The label- reads: Jupiter. Distance from Sun: 5.20AU------------ or- 45----- light-- minutes--."],
+** Processing line: ~        [42 - 2, 10, 5, 5, "The label- reads: Saturn. Distance from Sun: 9.53AU------------ or- 79----- light-- minutes--."],~
 - Inside source: true
 *** True Line Result
-          [30, 18, 5, 12, :final_message_inside_mainframe]
-** Processing line: ~        ],~
+        [42 - 2, 10, 5, 5, "The label- reads: Saturn. Distance from Sun: 9.53AU------------ or- 79----- light-- minutes--."],
+** Processing line: ~        [49 - 2, 10, 5, 5, "The label- reads: Uranus. Distance from Sun: 19.81AU------------ or- 159----- light-- minutes--."],~
 - Inside source: true
 *** True Line Result
-        ],
-** Processing line: ~        render_override: :blinking_light_inside_observatory_render~
+        [49 - 2, 10, 5, 5, "The label- reads: Uranus. Distance from Sun: 19.81AU------------ or- 159----- light-- minutes--."],
+** Processing line: ~        [56 - 2, 10, 5, 5, "The label- reads: Neptune. Distance from Sun: 30.05AU------------ or- 4.1----- light-- hours--. What?! The message--- I received-- was from a source-- farther-- than-- Neptune?!"],~
 - Inside source: true
 *** True Line Result
-        render_override: :blinking_light_inside_observatory_render
-** Processing line: ~      }~
+        [56 - 2, 10, 5, 5, "The label- reads: Neptune. Distance from Sun: 30.05AU------------ or- 4.1----- light-- hours--. What?! The message--- I received-- was from a source-- farther-- than-- Neptune?!"],
+** Processing line: ~        [63 - 2, 10, 5, 5, "The label- reads: Pluto. Dista- Wait... Pluto-- isn't-- a planet. People-- thought- Pluto-- was a planet-- back- then?--"],~
 - Inside source: true
 *** True Line Result
-      }
-** Processing line: ~    end~
+        [63 - 2, 10, 5, 5, "The label- reads: Pluto. Dista- Wait... Pluto-- isn't-- a planet. People-- thought- Pluto-- was a planet-- back- then?--"],
+** Processing line: ~      ]~
 - Inside source: true
 *** True Line Result
-    end
+      ]
+** Processing line: ~    }~
+- Inside source: true
+*** True Line Result
+    }
 ** Processing line: ~  end~
 - Inside source: true
 *** True Line Result
@@ -140275,30 +146135,50 @@ Follows is a source code listing for all files that have been open sourced. This
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~  def final_message_inside_mainframe args~
+** Processing line: ~  def speed_of_light_end_of_day args~
 - Inside source: true
 *** True Line Result
-  def final_message_inside_mainframe args
+  def speed_of_light_end_of_day args
 ** Processing line: ~    {~
 - Inside source: true
 *** True Line Result
     {
-** Processing line: ~      player: [32, 4],~
+** Processing line: ~      fade: 60,~
 - Inside source: true
 *** True Line Result
-      player: [32, 4],
-** Processing line: ~      background: 'sprites/mainframe.png',~
+      fade: 60,
+** Processing line: ~      background: 'sprites/inside-home.png',~
 - Inside source: true
 *** True Line Result
-      background: 'sprites/mainframe.png',
-** Processing line: ~      fade: 60,~
+      background: 'sprites/inside-home.png',
+** Processing line: ~      player: [35, 0],~
 - Inside source: true
 *** True Line Result
-      fade: 60,
-** Processing line: ~      scenes: [[45, 45,  4, 4, :final_message_check_ship_status]]~
+      player: [35, 0],
+** Processing line: ~      storylines: [~
 - Inside source: true
 *** True Line Result
-      scenes: [[45, 45,  4, 4, :final_message_check_ship_status]]
+      storylines: [
+** Processing line: ~        [35, 10, 4, 4, "Wonder-- what the reply-- will be. Who- the hell is contacting--- me from beyond-- Neptune? This- has to be some- kind- of- joke."]~
+- Inside source: true
+*** True Line Result
+        [35, 10, 4, 4, "Wonder-- what the reply-- will be. Who- the hell is contacting--- me from beyond-- Neptune? This- has to be some- kind- of- joke."]
+** Processing line: ~      ],~
+- Inside source: true
+*** True Line Result
+      ],
+** Processing line: ~      scenes: [~
+- Inside source: true
+*** True Line Result
+      scenes: [
+** Processing line: ~        [31, 38, 10, 12, :serenity_alive_side_of_home]~
+- Inside source: true
+*** True Line Result
+        [31, 38, 10, 12, :serenity_alive_side_of_home]
+** Processing line: ~      ]~
+- Inside source: true
+*** True Line Result
+      ]
 ** Processing line: ~    }~
 - Inside source: true
 *** True Line Result
@@ -140311,278 +146191,406 @@ Follows is a source code listing for all files that have been open sourced. This
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~  def final_message_check_ship_status args~
+** Processing line: ~#+end_src~
+- Line was identified as the end of a code block.
+*** True Line Result
+#+end_src
+** Processing line: ~~
+- End of paragraph detected.
+*** True Line Result
+
+** Processing line: ~*** Rpg Roguelike - Roguelike Starting Point - constants.rb~
+- Header detected.
+*** True Line Result
+
+*** True Line Result
+*** Rpg Roguelike - Roguelike Starting Point - constants.rb
+** Processing line: ~#+begin_src ruby~
+- Line was identified as the beginning of a code block.
+*** True Line Result
+
+*** True Line Result
+#+begin_src ruby
+** Processing line: ~  # ./samples/99_genre_rpg_roguelike/01_roguelike_starting_point/app/constants.rb~
 - Inside source: true
 *** True Line Result
-  def final_message_check_ship_status args
-** Processing line: ~    {~
+  # ./samples/99_genre_rpg_roguelike/01_roguelike_starting_point/app/constants.rb
+** Processing line: ~  SHOW_LEGEND = true~
 - Inside source: true
 *** True Line Result
-    {
-** Processing line: ~      background: 'sprites/mainframe.png',~
+  SHOW_LEGEND = true
+** Processing line: ~  SOURCE_TILE_SIZE = 16~
 - Inside source: true
 *** True Line Result
-      background: 'sprites/mainframe.png',
-** Processing line: ~      storylines: [~
+  SOURCE_TILE_SIZE = 16
+** Processing line: ~  DESTINATION_TILE_SIZE = 16~
 - Inside source: true
 *** True Line Result
-      storylines: [
-** Processing line: ~        [45, 45, 4, 4, (final_message_current args)],~
+  DESTINATION_TILE_SIZE = 16
+** Processing line: ~  TILE_SHEET_SIZE = 256~
 - Inside source: true
 *** True Line Result
-        [45, 45, 4, 4, (final_message_current args)],
-** Processing line: ~      ],~
+  TILE_SHEET_SIZE = 256
+** Processing line: ~  TILE_R = 0~
 - Inside source: true
 *** True Line Result
-      ],
-** Processing line: ~      scenes: [~
+  TILE_R = 0
+** Processing line: ~  TILE_G = 0~
 - Inside source: true
 *** True Line Result
-      scenes: [
-** Processing line: ~        [*hotspot_top, :final_message_ship_status],~
+  TILE_G = 0
+** Processing line: ~  TILE_B = 0~
 - Inside source: true
 *** True Line Result
-        [*hotspot_top, :final_message_ship_status],
-** Processing line: ~      ]~
+  TILE_B = 0
+** Processing line: ~  TILE_A = 255~
 - Inside source: true
 *** True Line Result
-      ]
-** Processing line: ~    }~
+  TILE_A = 255
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-    }
-** Processing line: ~  end~
+
+** Processing line: ~#+end_src~
+- Line was identified as the end of a code block.
+*** True Line Result
+#+end_src
+** Processing line: ~~
+- End of paragraph detected.
+*** True Line Result
+
+** Processing line: ~*** Rpg Roguelike - Roguelike Starting Point - legend.rb~
+- Header detected.
+*** True Line Result
+
+*** True Line Result
+*** Rpg Roguelike - Roguelike Starting Point - legend.rb
+** Processing line: ~#+begin_src ruby~
+- Line was identified as the beginning of a code block.
+*** True Line Result
+
+*** True Line Result
+#+begin_src ruby
+** Processing line: ~  # ./samples/99_genre_rpg_roguelike/01_roguelike_starting_point/app/legend.rb~
 - Inside source: true
 *** True Line Result
-  end
+  # ./samples/99_genre_rpg_roguelike/01_roguelike_starting_point/app/legend.rb
+** Processing line: ~  def tick_legend args~
+- Inside source: true
+*** True Line Result
+  def tick_legend args
+** Processing line: ~    return unless SHOW_LEGEND~
+- Inside source: true
+*** True Line Result
+    return unless SHOW_LEGEND
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~  def final_message_ship_status args~
+** Processing line: ~    legend_padding = 16~
 - Inside source: true
 *** True Line Result
-  def final_message_ship_status args
-** Processing line: ~    {~
+    legend_padding = 16
+** Processing line: ~    legend_x = 1280 - TILE_SHEET_SIZE - legend_padding~
 - Inside source: true
 *** True Line Result
-    {
-** Processing line: ~      background: 'sprites/serenity.png',~
+    legend_x = 1280 - TILE_SHEET_SIZE - legend_padding
+** Processing line: ~    legend_y =  720 - TILE_SHEET_SIZE - legend_padding~
 - Inside source: true
 *** True Line Result
-      background: 'sprites/serenity.png',
-** Processing line: ~      fade: 60,~
+    legend_y =  720 - TILE_SHEET_SIZE - legend_padding
+** Processing line: ~    tile_sheet_sprite = [legend_x,~
 - Inside source: true
 *** True Line Result
-      fade: 60,
-** Processing line: ~      player: [30, 10],~
+    tile_sheet_sprite = [legend_x,
+** Processing line: ~                         legend_y,~
 - Inside source: true
 *** True Line Result
-      player: [30, 10],
-** Processing line: ~      scenes: [~
+                         legend_y,
+** Processing line: ~                         TILE_SHEET_SIZE,~
 - Inside source: true
 *** True Line Result
-      scenes: [
-** Processing line: ~        [30, 50, 4, 4, :final_message_ship_status_reviewed]~
+                         TILE_SHEET_SIZE,
+** Processing line: ~                         TILE_SHEET_SIZE,~
 - Inside source: true
 *** True Line Result
-        [30, 50, 4, 4, :final_message_ship_status_reviewed]
-** Processing line: ~      ],~
+                         TILE_SHEET_SIZE,
+** Processing line: ~                         'sprites/simple-mood-16x16.png', 0,~
 - Inside source: true
 *** True Line Result
-      ],
-** Processing line: ~      storylines: [~
+                         'sprites/simple-mood-16x16.png', 0,
+** Processing line: ~                         TILE_A,~
 - Inside source: true
 *** True Line Result
-      storylines: [
-** Processing line: ~        [30,  8, 4, 4, "Let me make- sure- everything--- looks good. It'll-- give me peace- of mind."],~
+                         TILE_A,
+** Processing line: ~                         TILE_R,~
 - Inside source: true
 *** True Line Result
-        [30,  8, 4, 4, "Let me make- sure- everything--- looks good. It'll-- give me peace- of mind."],
-** Processing line: ~        *final_message_ship_status_shared(args)~
+                         TILE_R,
+** Processing line: ~                         TILE_G,~
 - Inside source: true
 *** True Line Result
-        *final_message_ship_status_shared(args)
-** Processing line: ~      ]~
+                         TILE_G,
+** Processing line: ~                         TILE_B]~
 - Inside source: true
 *** True Line Result
-      ]
-** Processing line: ~    }~
+                         TILE_B]
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-    }
-** Processing line: ~  end~
+
+** Processing line: ~    if args.inputs.mouse.point.inside_rect? tile_sheet_sprite~
 - Inside source: true
 *** True Line Result
-  end
+    if args.inputs.mouse.point.inside_rect? tile_sheet_sprite
+** Processing line: ~      mouse_row = args.inputs.mouse.point.y.idiv(SOURCE_TILE_SIZE)~
+- Inside source: true
+*** True Line Result
+      mouse_row = args.inputs.mouse.point.y.idiv(SOURCE_TILE_SIZE)
+** Processing line: ~      tile_row = 15 - (mouse_row - legend_y.idiv(SOURCE_TILE_SIZE))~
+- Inside source: true
+*** True Line Result
+      tile_row = 15 - (mouse_row - legend_y.idiv(SOURCE_TILE_SIZE))
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~  def final_message_ship_status_reviewed args~
+** Processing line: ~      mouse_col = args.inputs.mouse.point.x.idiv(SOURCE_TILE_SIZE)~
 - Inside source: true
 *** True Line Result
-  def final_message_ship_status_reviewed args
-** Processing line: ~    {~
+      mouse_col = args.inputs.mouse.point.x.idiv(SOURCE_TILE_SIZE)
+** Processing line: ~      tile_col = (mouse_col - legend_x.idiv(SOURCE_TILE_SIZE))~
 - Inside source: true
 *** True Line Result
-    {
-** Processing line: ~      background: 'sprites/serenity.png',~
+      tile_col = (mouse_col - legend_x.idiv(SOURCE_TILE_SIZE))
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-      background: 'sprites/serenity.png',
-** Processing line: ~      fade: 60,~
+
+** Processing line: ~      args.outputs.primitives << [legend_x - legend_padding * 2,~
 - Inside source: true
 *** True Line Result
-      fade: 60,
-** Processing line: ~      scenes: [~
+      args.outputs.primitives << [legend_x - legend_padding * 2,
+** Processing line: ~                                  mouse_row * SOURCE_TILE_SIZE, 256 + legend_padding * 2, 16, 128, 128, 128, 64].solid~
 - Inside source: true
 *** True Line Result
-      scenes: [
-** Processing line: ~        [*hotspot_bottom, :final_message_summary]~
+                                  mouse_row * SOURCE_TILE_SIZE, 256 + legend_padding * 2, 16, 128, 128, 128, 64].solid
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-        [*hotspot_bottom, :final_message_summary]
-** Processing line: ~      ],~
+
+** Processing line: ~      args.outputs.primitives << [mouse_col * SOURCE_TILE_SIZE,~
 - Inside source: true
 *** True Line Result
-      ],
-** Processing line: ~      storylines: [~
+      args.outputs.primitives << [mouse_col * SOURCE_TILE_SIZE,
+** Processing line: ~                                  legend_y - legend_padding * 2, 16, 256 + legend_padding * 2, 128, 128, 128, 64].solid~
 - Inside source: true
 *** True Line Result
-      storylines: [
-** Processing line: ~        [0, 62, 62, 3, "Whew. Everyone-- is in their- chambers. The engines-- are roaring-- and Serenity-- is coming-- home."],~
+                                  legend_y - legend_padding * 2, 16, 256 + legend_padding * 2, 128, 128, 128, 64].solid
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-        [0, 62, 62, 3, "Whew. Everyone-- is in their- chambers. The engines-- are roaring-- and Serenity-- is coming-- home."],
-** Processing line: ~      ]~
+
+** Processing line: ~      sprite_key = sprite_lookup.find { |k, v| v == [tile_row, tile_col] }~
+- Inside source: true
+*** True Line Result
+      sprite_key = sprite_lookup.find { |k, v| v == [tile_row, tile_col] }
+** Processing line: ~      if sprite_key~
+- Inside source: true
+*** True Line Result
+      if sprite_key
+** Processing line: ~        member_name, _ = sprite_key~
+- Inside source: true
+*** True Line Result
+        member_name, _ = sprite_key
+** Processing line: ~        member_name = member_name_as_code member_name~
+- Inside source: true
+*** True Line Result
+        member_name = member_name_as_code member_name
+** Processing line: ~        args.outputs.labels << [660, 70, "# CODE SAMPLE (place in the tick_game method located in main.rb)", -1, 0]~
+- Inside source: true
+*** True Line Result
+        args.outputs.labels << [660, 70, "# CODE SAMPLE (place in the tick_game method located in main.rb)", -1, 0]
+** Processing line: ~        args.outputs.labels << [660, 50, "#                                    GRID_X, GRID_Y, TILE_KEY", -1, 0]~
+- Inside source: true
+*** True Line Result
+        args.outputs.labels << [660, 50, "#                                    GRID_X, GRID_Y, TILE_KEY", -1, 0]
+** Processing line: ~        args.outputs.labels << [660, 30, "args.outputs.sprites << tile_in_game(     5,      6, #{member_name}    )", -1, 0]~
+- Inside source: true
+*** True Line Result
+        args.outputs.labels << [660, 30, "args.outputs.sprites << tile_in_game(     5,      6, #{member_name}    )", -1, 0]
+** Processing line: ~      else~
+- Inside source: true
+*** True Line Result
+      else
+** Processing line: ~        args.outputs.labels << [660, 50, "Tile [#{tile_row}, #{tile_col}] not found. Add a key and value to app/sprite_lookup.rb:", -1, 0]~
+- Inside source: true
+*** True Line Result
+        args.outputs.labels << [660, 50, "Tile [#{tile_row}, #{tile_col}] not found. Add a key and value to app/sprite_lookup.rb:", -1, 0]
+** Processing line: ~        args.outputs.labels << [660, 30, "{ \"some_string\" => [#{tile_row}, #{tile_col}] } OR { some_symbol: [#{tile_row}, #{tile_col}] }.", -1, 0]~
+- Inside source: true
+*** True Line Result
+        args.outputs.labels << [660, 30, "{ \"some_string\" => [#{tile_row}, #{tile_col}] } OR { some_symbol: [#{tile_row}, #{tile_col}] }.", -1, 0]
+** Processing line: ~      end~
+- Inside source: true
+*** True Line Result
+      end
+** Processing line: ~~
+- Inside source: true
+*** True Line Result
+
+** Processing line: ~    end~
+- Inside source: true
+*** True Line Result
+    end
+** Processing line: ~~
+- Inside source: true
+*** True Line Result
+
+** Processing line: ~    # render the sprite in the top right with a padding to the top and right so it's~
 - Inside source: true
 *** True Line Result
-      ]
-** Processing line: ~    }~
+    # render the sprite in the top right with a padding to the top and right so it's
+** Processing line: ~    # not flush against the edge~
 - Inside source: true
 *** True Line Result
-    }
-** Processing line: ~  end~
+    # not flush against the edge
+** Processing line: ~    args.outputs.sprites << tile_sheet_sprite~
 - Inside source: true
 *** True Line Result
-  end
+    args.outputs.sprites << tile_sheet_sprite
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~  def final_message_ship_status_shared args~
+** Processing line: ~    # carefully place some ascii arrows to show the legend labels~
 - Inside source: true
 *** True Line Result
-  def final_message_ship_status_shared args
-** Processing line: ~    [~
+    # carefully place some ascii arrows to show the legend labels
+** Processing line: ~    args.outputs.labels  <<  [895, 707, "ROW --->"]~
 - Inside source: true
 *** True Line Result
-    [
-** Processing line: ~      *ship_control_hotspot( 0, 50,~
+    args.outputs.labels  <<  [895, 707, "ROW --->"]
+** Processing line: ~    args.outputs.labels  <<  [943, 412, "       ^"]~
 - Inside source: true
 *** True Line Result
-      *ship_control_hotspot( 0, 50,
-** Processing line: ~                             "Stasis-- Chambers--: Online, All chambers-- are powered. Battery--- Allocation---: 3--- of-- 3--.",~
+    args.outputs.labels  <<  [943, 412, "       ^"]
+** Processing line: ~    args.outputs.labels  <<  [943, 412, "       |"]~
 - Inside source: true
 *** True Line Result
-                             "Stasis-- Chambers--: Online, All chambers-- are powered. Battery--- Allocation---: 3--- of-- 3--.",
-** Processing line: ~                             "Matthew's--- Chamber--: OCCUPIED----",~
+    args.outputs.labels  <<  [943, 412, "       |"]
+** Processing line: ~    args.outputs.labels  <<  [943, 394, "COL ---+"]~
 - Inside source: true
 *** True Line Result
-                             "Matthew's--- Chamber--: OCCUPIED----",
-** Processing line: ~                             "Aanka's--- Chamber--: OCCUPIED----",~
+    args.outputs.labels  <<  [943, 394, "COL ---+"]
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-                             "Aanka's--- Chamber--: OCCUPIED----",
-** Processing line: ~                             "Sasha's--- Chamber--: OCCUPIED----"),~
+
+** Processing line: ~    # use the tile sheet to print out row and column numbers~
 - Inside source: true
 *** True Line Result
-                             "Sasha's--- Chamber--: OCCUPIED----"),
-** Processing line: ~      *ship_control_hotspot(12, 35,~
+    # use the tile sheet to print out row and column numbers
+** Processing line: ~    args.outputs.sprites << 16.map_with_index do |i|~
 - Inside source: true
 *** True Line Result
-      *ship_control_hotspot(12, 35,
-** Processing line: ~                            "Life- Support--: Not-- Needed---",~
+    args.outputs.sprites << 16.map_with_index do |i|
+** Processing line: ~      sprite_key = i % 10~
 - Inside source: true
 *** True Line Result
-                            "Life- Support--: Not-- Needed---",
-** Processing line: ~                            "O2--- Production---: OFF---",~
+      sprite_key = i % 10
+** Processing line: ~      [~
 - Inside source: true
 *** True Line Result
-                            "O2--- Production---: OFF---",
-** Processing line: ~                            "CO2--- Scrubbers---: OFF---",~
+      [
+** Processing line: ~        tile(1280 - TILE_SHEET_SIZE - legend_padding * 2 - SOURCE_TILE_SIZE,~
 - Inside source: true
 *** True Line Result
-                            "CO2--- Scrubbers---: OFF---",
-** Processing line: ~                            "H2O--- Production---: OFF---"),~
+        tile(1280 - TILE_SHEET_SIZE - legend_padding * 2 - SOURCE_TILE_SIZE,
+** Processing line: ~              720 - legend_padding * 2 - (SOURCE_TILE_SIZE * i),~
 - Inside source: true
 *** True Line Result
-                            "H2O--- Production---: OFF---"),
-** Processing line: ~      *ship_control_hotspot(24, 20,~
+              720 - legend_padding * 2 - (SOURCE_TILE_SIZE * i),
+** Processing line: ~              sprite(sprite_key)),~
 - Inside source: true
 *** True Line Result
-      *ship_control_hotspot(24, 20,
-** Processing line: ~                            "Navigation: Offline---",~
+              sprite(sprite_key)),
+** Processing line: ~        tile(1280 - TILE_SHEET_SIZE - SOURCE_TILE_SIZE + (SOURCE_TILE_SIZE * i),~
 - Inside source: true
 *** True Line Result
-                            "Navigation: Offline---",
-** Processing line: ~                            "Sensor: OFF---",~
+        tile(1280 - TILE_SHEET_SIZE - SOURCE_TILE_SIZE + (SOURCE_TILE_SIZE * i),
+** Processing line: ~              720 - TILE_SHEET_SIZE - legend_padding * 3, sprite(sprite_key))~
 - Inside source: true
 *** True Line Result
-                            "Sensor: OFF---",
-** Processing line: ~                            "Heads- Up- Display: DAMAGED---",~
+              720 - TILE_SHEET_SIZE - legend_padding * 3, sprite(sprite_key))
+** Processing line: ~      ]~
 - Inside source: true
 *** True Line Result
-                            "Heads- Up- Display: DAMAGED---",
-** Processing line: ~                            "Arithmetic--- Unit: DAMAGED----"),~
+      ]
+** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
-                            "Arithmetic--- Unit: DAMAGED----"),
-** Processing line: ~      *ship_control_hotspot(36, 35,~
+    end
+** Processing line: ~  end~
 - Inside source: true
 *** True Line Result
-      *ship_control_hotspot(36, 35,
-** Processing line: ~                            "COMM: Underpowered----",~
+  end
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-                            "COMM: Underpowered----",
-** Processing line: ~                            "Text: ON---",~
-- Inside source: true
+
+** Processing line: ~#+end_src~
+- Line was identified as the end of a code block.
 *** True Line Result
-                            "Text: ON---",
-** Processing line: ~                            "Audio: SEGFAULT---",~
+#+end_src
+** Processing line: ~~
+- End of paragraph detected.
+*** True Line Result
+
+** Processing line: ~*** Rpg Roguelike - Roguelike Starting Point - main.rb~
+- Header detected.
+*** True Line Result
+
+*** True Line Result
+*** Rpg Roguelike - Roguelike Starting Point - main.rb
+** Processing line: ~#+begin_src ruby~
+- Line was identified as the beginning of a code block.
+*** True Line Result
+
+*** True Line Result
+#+begin_src ruby
+** Processing line: ~  # ./samples/99_genre_rpg_roguelike/01_roguelike_starting_point/app/main.rb~
 - Inside source: true
 *** True Line Result
-                            "Audio: SEGFAULT---",
-** Processing line: ~                            "Video: DAMAGED---"),~
+  # ./samples/99_genre_rpg_roguelike/01_roguelike_starting_point/app/main.rb
+** Processing line: ~  require 'app/constants.rb'~
 - Inside source: true
 *** True Line Result
-                            "Video: DAMAGED---"),
-** Processing line: ~      *ship_control_hotspot(48, 50,~
+  require 'app/constants.rb'
+** Processing line: ~  require 'app/sprite_lookup.rb'~
 - Inside source: true
 *** True Line Result
-      *ship_control_hotspot(48, 50,
-** Processing line: ~                            "Engine: Online, Coordinates--- Set- for Earth. Battery--- Allocation---: 3--- of-- 3---",~
+  require 'app/sprite_lookup.rb'
+** Processing line: ~  require 'app/legend.rb'~
 - Inside source: true
 *** True Line Result
-                            "Engine: Online, Coordinates--- Set- for Earth. Battery--- Allocation---: 3--- of-- 3---",
-** Processing line: ~                            "Engine I: ON---",~
+  require 'app/legend.rb'
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-                            "Engine I: ON---",
-** Processing line: ~                            "Engine II: ON---",~
+
+** Processing line: ~  def tick args~
 - Inside source: true
 *** True Line Result
-                            "Engine II: ON---",
-** Processing line: ~                            "Engine III: ON---")~
+  def tick args
+** Processing line: ~    tick_game args~
 - Inside source: true
 *** True Line Result
-                            "Engine III: ON---")
-** Processing line: ~    ]~
+    tick_game args
+** Processing line: ~    tick_legend args~
 - Inside source: true
 *** True Line Result
-    ]
+    tick_legend args
 ** Processing line: ~  end~
 - Inside source: true
 *** True Line Result
@@ -140591,342 +146599,354 @@ Follows is a source code listing for all files that have been open sourced. This
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~  def final_message_last_reply args~
+** Processing line: ~  def tick_game args~
 - Inside source: true
 *** True Line Result
-  def final_message_last_reply args
-** Processing line: ~    if args.state.scene_history.include? :replied_with_whole_truth~
+  def tick_game args
+** Processing line: ~    # setup the grid~
 - Inside source: true
 *** True Line Result
-    if args.state.scene_history.include? :replied_with_whole_truth
-** Processing line: ~      return "Buffer--: #{anka_reply_whole_truth.quote}"~
+    # setup the grid
+** Processing line: ~    args.state.grid.padding = 104~
 - Inside source: true
 *** True Line Result
-      return "Buffer--: #{anka_reply_whole_truth.quote}"
-** Processing line: ~    else~
+    args.state.grid.padding = 104
+** Processing line: ~    args.state.grid.size = 512~
 - Inside source: true
 *** True Line Result
-    else
-** Processing line: ~      return "Buffer--: #{anka_reply_half_truth.quote}"~
+    args.state.grid.size = 512
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-      return "Buffer--: #{anka_reply_half_truth.quote}"
-** Processing line: ~    end~
+
+** Processing line: ~    # set up your game~
 - Inside source: true
 *** True Line Result
-    end
-** Processing line: ~  end~
+    # set up your game
+** Processing line: ~    # initialize the game/game defaults. ||= means that you only initialize it if~
 - Inside source: true
 *** True Line Result
-  end
-** Processing line: ~~
+    # initialize the game/game defaults. ||= means that you only initialize it if
+** Processing line: ~    # the value isn't alread initialized~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~  def final_message_current args~
+    # the value isn't alread initialized
+** Processing line: ~    args.state.player.x ||= 0~
 - Inside source: true
 *** True Line Result
-  def final_message_current args
-** Processing line: ~    if args.state.scene_history.include? :replied_with_whole_truth~
+    args.state.player.x ||= 0
+** Processing line: ~    args.state.player.y ||= 0~
 - Inside source: true
 *** True Line Result
-    if args.state.scene_history.include? :replied_with_whole_truth
-** Processing line: ~      return "Hey... It's-- me Sasha. Aanka-- is trying-- her best to comfort-- Matthew. This- is the first- time- I've-- ever-- seen-- Matthew-- cry. We'll-- probably-- be in stasis-- by the time you get this message--. Thank- you- again-- for all your help. I look forward-- to meeting-- you in person."~
+    args.state.player.y ||= 0
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-      return "Hey... It's-- me Sasha. Aanka-- is trying-- her best to comfort-- Matthew. This- is the first- time- I've-- ever-- seen-- Matthew-- cry. We'll-- probably-- be in stasis-- by the time you get this message--. Thank- you- again-- for all your help. I look forward-- to meeting-- you in person."
-** Processing line: ~    else~
+
+** Processing line: ~    args.state.enemies ||= [~
 - Inside source: true
 *** True Line Result
-    else
-** Processing line: ~      return "Hey! It's-- me Sasha! LOL! Aanka-- and Matthew-- are dancing-- around-- like- goofballs--! They- are both- so adorable! Only-- this- tiny-- little-- genius-- can make-- a battle-- hardened-- general--- put- on a tiara-- and dance- around-- like a fairy-- princess-- XD------ Anyways, we are heading-- back into-- the chambers--. I hope our welcome-- home- parade-- has fireworks!"~
+    args.state.enemies ||= [
+** Processing line: ~      { x: 10, y: 10, type: :goblin, tile_key: :G },~
 - Inside source: true
 *** True Line Result
-      return "Hey! It's-- me Sasha! LOL! Aanka-- and Matthew-- are dancing-- around-- like- goofballs--! They- are both- so adorable! Only-- this- tiny-- little-- genius-- can make-- a battle-- hardened-- general--- put- on a tiara-- and dance- around-- like a fairy-- princess-- XD------ Anyways, we are heading-- back into-- the chambers--. I hope our welcome-- home- parade-- has fireworks!"
-** Processing line: ~    end~
+      { x: 10, y: 10, type: :goblin, tile_key: :G },
+** Processing line: ~      { x: 15, y: 30, type: :rat,    tile_key: :R }~
 - Inside source: true
 *** True Line Result
-    end
-** Processing line: ~  end~
+      { x: 15, y: 30, type: :rat,    tile_key: :R }
+** Processing line: ~    ]~
 - Inside source: true
 *** True Line Result
-  end
+    ]
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~  def final_message_summary args~
+** Processing line: ~    args.state.info_message ||= "Use arrow keys to move around."~
 - Inside source: true
 *** True Line Result
-  def final_message_summary args
-** Processing line: ~    if args.state.scene_history.include? :replied_with_whole_truth~
+    args.state.info_message ||= "Use arrow keys to move around."
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-    if args.state.scene_history.include? :replied_with_whole_truth
-** Processing line: ~      return {~
+
+** Processing line: ~    # handle keyboard input~
 - Inside source: true
 *** True Line Result
-      return {
-** Processing line: ~        background: 'sprites/inside-observatory.png',~
+    # handle keyboard input
+** Processing line: ~    # keyboard input (arrow keys to move player)~
 - Inside source: true
 *** True Line Result
-        background: 'sprites/inside-observatory.png',
-** Processing line: ~        fade: 60,~
+    # keyboard input (arrow keys to move player)
+** Processing line: ~    new_player_x = args.state.player.x~
 - Inside source: true
 *** True Line Result
-        fade: 60,
-** Processing line: ~        player: [31, 11],~
+    new_player_x = args.state.player.x
+** Processing line: ~    new_player_y = args.state.player.y~
 - Inside source: true
 *** True Line Result
-        player: [31, 11],
-** Processing line: ~        scenes: [[60, 0, 4, 32, :final_decision_side_of_home]],~
+    new_player_y = args.state.player.y
+** Processing line: ~    player_direction = ""~
 - Inside source: true
 *** True Line Result
-        scenes: [[60, 0, 4, 32, :final_decision_side_of_home]],
-** Processing line: ~        storylines: [~
+    player_direction = ""
+** Processing line: ~    player_moved = false~
 - Inside source: true
 *** True Line Result
-        storylines: [
-** Processing line: ~          [30, 10, 5, 4, "I can't-- imagine-- what they are feeling-- right now. But at least- they- know everything---, and we can- concentrate-- on rebuilding--- this world-- right- off the bat. I can't-- wait to see the future-- they'll-- help- build."],~
+    player_moved = false
+** Processing line: ~    if args.inputs.keyboard.key_down.up~
 - Inside source: true
 *** True Line Result
-          [30, 10, 5, 4, "I can't-- imagine-- what they are feeling-- right now. But at least- they- know everything---, and we can- concentrate-- on rebuilding--- this world-- right- off the bat. I can't-- wait to see the future-- they'll-- help- build."],
-** Processing line: ~        ]~
+    if args.inputs.keyboard.key_down.up
+** Processing line: ~      new_player_y += 1~
 - Inside source: true
 *** True Line Result
-        ]
-** Processing line: ~      }~
+      new_player_y += 1
+** Processing line: ~      player_direction = "north"~
 - Inside source: true
 *** True Line Result
-      }
-** Processing line: ~    else~
+      player_direction = "north"
+** Processing line: ~      player_moved = true~
 - Inside source: true
 *** True Line Result
-    else
-** Processing line: ~      return {~
+      player_moved = true
+** Processing line: ~    elsif args.inputs.keyboard.key_down.down~
 - Inside source: true
 *** True Line Result
-      return {
-** Processing line: ~        background: 'sprites/inside-observatory.png',~
+    elsif args.inputs.keyboard.key_down.down
+** Processing line: ~      new_player_y -= 1~
 - Inside source: true
 *** True Line Result
-        background: 'sprites/inside-observatory.png',
-** Processing line: ~        fade: 60,~
+      new_player_y -= 1
+** Processing line: ~      player_direction = "south"~
 - Inside source: true
 *** True Line Result
-        fade: 60,
-** Processing line: ~        player: [31, 11],~
+      player_direction = "south"
+** Processing line: ~      player_moved = true~
 - Inside source: true
 *** True Line Result
-        player: [31, 11],
-** Processing line: ~        scenes: [[60, 0, 4, 32, :final_decision_side_of_home]],~
+      player_moved = true
+** Processing line: ~    elsif args.inputs.keyboard.key_down.right~
 - Inside source: true
 *** True Line Result
-        scenes: [[60, 0, 4, 32, :final_decision_side_of_home]],
-** Processing line: ~        storylines: [~
+    elsif args.inputs.keyboard.key_down.right
+** Processing line: ~      new_player_x += 1~
 - Inside source: true
 *** True Line Result
-        storylines: [
-** Processing line: ~          [30, 10, 5, 4, "They all sounded-- so happy. I know- they'll-- be in for a tough- dose- of reality--- when they- arrive. But- at least- they'll-- be around-- all- of us. We'll-- help them- cope."],~
+      new_player_x += 1
+** Processing line: ~      player_direction = "east"~
 - Inside source: true
 *** True Line Result
-          [30, 10, 5, 4, "They all sounded-- so happy. I know- they'll-- be in for a tough- dose- of reality--- when they- arrive. But- at least- they'll-- be around-- all- of us. We'll-- help them- cope."],
-** Processing line: ~        ]~
+      player_direction = "east"
+** Processing line: ~      player_moved = true~
 - Inside source: true
 *** True Line Result
-        ]
-** Processing line: ~      }~
+      player_moved = true
+** Processing line: ~    elsif args.inputs.keyboard.key_down.left~
 - Inside source: true
 *** True Line Result
-      }
-** Processing line: ~    end~
+    elsif args.inputs.keyboard.key_down.left
+** Processing line: ~      new_player_x -= 1~
 - Inside source: true
 *** True Line Result
-    end
-** Processing line: ~  end~
+      new_player_x -= 1
+** Processing line: ~      player_direction = "west"~
 - Inside source: true
 *** True Line Result
-  end
-** Processing line: ~~
+      player_direction = "west"
+** Processing line: ~      player_moved = true~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~#+end_src~
-- Line was identified as the end of a code block.
+      player_moved = true
+** Processing line: ~    end~
+- Inside source: true
 *** True Line Result
-#+end_src
+    end
 ** Processing line: ~~
-- End of paragraph detected.
+- Inside source: true
 *** True Line Result
 
-** Processing line: ~*** Rpg Narrative - Return Of Serenity - storyline_serenity_alive.rb~
-- Header detected.
+** Processing line: ~    #handle game logic~
+- Inside source: true
 *** True Line Result
-
+    #handle game logic
+** Processing line: ~    # determine if there is an enemy on that square,~
+- Inside source: true
 *** True Line Result
-*** Rpg Narrative - Return Of Serenity - storyline_serenity_alive.rb
-** Processing line: ~#+begin_src ruby~
-- Line was identified as the beginning of a code block.
+    # determine if there is an enemy on that square,
+** Processing line: ~    # if so, don't let the player move there~
+- Inside source: true
 *** True Line Result
-
+    # if so, don't let the player move there
+** Processing line: ~    if player_moved~
+- Inside source: true
 *** True Line Result
-#+begin_src ruby
-** Processing line: ~  # ./samples/99_genre_rpg_narrative/return_of_serenity/app/storyline_serenity_alive.rb~
+    if player_moved
+** Processing line: ~      found_enemy = args.state.enemies.find do |e|~
 - Inside source: true
 *** True Line Result
-  # ./samples/99_genre_rpg_narrative/return_of_serenity/app/storyline_serenity_alive.rb
-** Processing line: ~  def serenity_alive_side_of_home args~
+      found_enemy = args.state.enemies.find do |e|
+** Processing line: ~        e[:x] == new_player_x && e[:y] == new_player_y~
 - Inside source: true
 *** True Line Result
-  def serenity_alive_side_of_home args
-** Processing line: ~    {~
+        e[:x] == new_player_x && e[:y] == new_player_y
+** Processing line: ~      end~
 - Inside source: true
 *** True Line Result
-    {
-** Processing line: ~      fade: 60,~
+      end
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-      fade: 60,
-** Processing line: ~      background: 'sprites/side-of-home.png',~
+
+** Processing line: ~      if !found_enemy~
 - Inside source: true
 *** True Line Result
-      background: 'sprites/side-of-home.png',
-** Processing line: ~      player: [16, 13],~
+      if !found_enemy
+** Processing line: ~        args.state.player.x = new_player_x~
 - Inside source: true
 *** True Line Result
-      player: [16, 13],
-** Processing line: ~      scenes: [~
+        args.state.player.x = new_player_x
+** Processing line: ~        args.state.player.y = new_player_y~
 - Inside source: true
 *** True Line Result
-      scenes: [
-** Processing line: ~        [52, 24, 11, 5, :serenity_alive_mountain_pass],~
+        args.state.player.y = new_player_y
+** Processing line: ~        args.state.info_message = "You moved #{player_direction}."~
 - Inside source: true
 *** True Line Result
-        [52, 24, 11, 5, :serenity_alive_mountain_pass],
-** Processing line: ~      ],~
+        args.state.info_message = "You moved #{player_direction}."
+** Processing line: ~      else~
 - Inside source: true
 *** True Line Result
-      ],
-** Processing line: ~      render_override: :blinking_light_side_of_home_render~
+      else
+** Processing line: ~        args.state.info_message = "You cannot move into a square an enemy occupies."~
 - Inside source: true
 *** True Line Result
-      render_override: :blinking_light_side_of_home_render
-** Processing line: ~    }~
+        args.state.info_message = "You cannot move into a square an enemy occupies."
+** Processing line: ~      end~
 - Inside source: true
 *** True Line Result
-    }
-** Processing line: ~  end~
+      end
+** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
-  end
+    end
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~  def serenity_alive_mountain_pass args~
+** Processing line: ~    args.outputs.sprites << tile_in_game(args.state.player.x,~
 - Inside source: true
 *** True Line Result
-  def serenity_alive_mountain_pass args
-** Processing line: ~    {~
+    args.outputs.sprites << tile_in_game(args.state.player.x,
+** Processing line: ~                                         args.state.player.y, '@')~
 - Inside source: true
 *** True Line Result
-    {
-** Processing line: ~      background: 'sprites/mountain-pass-zoomed-out.png',~
+                                         args.state.player.y, '@')
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-      background: 'sprites/mountain-pass-zoomed-out.png',
-** Processing line: ~      player: [4, 4],~
+
+** Processing line: ~    # render game~
 - Inside source: true
 *** True Line Result
-      player: [4, 4],
-** Processing line: ~      scenes: [~
+    # render game
+** Processing line: ~    # render enemies at locations~
 - Inside source: true
 *** True Line Result
-      scenes: [
-** Processing line: ~        [18, 47, 5, 5, :serenity_alive_path_to_observatory],~
+    # render enemies at locations
+** Processing line: ~    args.outputs.sprites << args.state.enemies.map do |e|~
 - Inside source: true
 *** True Line Result
-        [18, 47, 5, 5, :serenity_alive_path_to_observatory],
-** Processing line: ~      ],~
+    args.outputs.sprites << args.state.enemies.map do |e|
+** Processing line: ~      tile_in_game(e[:x], e[:y], e[:tile_key])~
 - Inside source: true
 *** True Line Result
-      ],
-** Processing line: ~      storylines: [~
+      tile_in_game(e[:x], e[:y], e[:tile_key])
+** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
-      storylines: [
-** Processing line: ~        [18, 13, 5, 5, "Hnnnnnnnggg. My legs-- are still sore- from yesterday."]~
+    end
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-        [18, 13, 5, 5, "Hnnnnnnnggg. My legs-- are still sore- from yesterday."]
-** Processing line: ~      ],~
+
+** Processing line: ~    # render the border~
 - Inside source: true
 *** True Line Result
-      ],
-** Processing line: ~      render_override: :blinking_light_mountain_pass_render~
+    # render the border
+** Processing line: ~    border_x = args.state.grid.padding - DESTINATION_TILE_SIZE~
 - Inside source: true
 *** True Line Result
-      render_override: :blinking_light_mountain_pass_render
-** Processing line: ~    }~
+    border_x = args.state.grid.padding - DESTINATION_TILE_SIZE
+** Processing line: ~    border_y = args.state.grid.padding - DESTINATION_TILE_SIZE~
 - Inside source: true
 *** True Line Result
-    }
-** Processing line: ~  end~
+    border_y = args.state.grid.padding - DESTINATION_TILE_SIZE
+** Processing line: ~    border_size = args.state.grid.size + DESTINATION_TILE_SIZE * 2~
 - Inside source: true
 *** True Line Result
-  end
+    border_size = args.state.grid.size + DESTINATION_TILE_SIZE * 2
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~  def serenity_alive_path_to_observatory args~
+** Processing line: ~    args.outputs.borders << [border_x,~
 - Inside source: true
 *** True Line Result
-  def serenity_alive_path_to_observatory args
-** Processing line: ~    {~
+    args.outputs.borders << [border_x,
+** Processing line: ~                             border_y,~
 - Inside source: true
 *** True Line Result
-    {
-** Processing line: ~      background: 'sprites/path-to-observatory.png',~
+                             border_y,
+** Processing line: ~                             border_size,~
 - Inside source: true
 *** True Line Result
-      background: 'sprites/path-to-observatory.png',
-** Processing line: ~      player: [60, 4],~
+                             border_size,
+** Processing line: ~                             border_size]~
 - Inside source: true
 *** True Line Result
-      player: [60, 4],
-** Processing line: ~      scenes: [~
+                             border_size]
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-      scenes: [
-** Processing line: ~        [0, 26, 5, 5, :serenity_alive_observatory]~
+
+** Processing line: ~    # render label stuff~
 - Inside source: true
 *** True Line Result
-        [0, 26, 5, 5, :serenity_alive_observatory]
-** Processing line: ~      ],~
+    # render label stuff
+** Processing line: ~    args.outputs.labels << [border_x, border_y - 10, "Current player location is: #{args.state.player.x}, #{args.state.player.y}"]~
 - Inside source: true
 *** True Line Result
-      ],
-** Processing line: ~      storylines: [~
+    args.outputs.labels << [border_x, border_y - 10, "Current player location is: #{args.state.player.x}, #{args.state.player.y}"]
+** Processing line: ~    args.outputs.labels << [border_x, border_y + 25 + border_size, args.state.info_message]~
 - Inside source: true
 *** True Line Result
-      storylines: [
-** Processing line: ~        [22, 20, 10, 10, "This spot--, on the mountain, right here, it's-- perfect. This- is where- I'll-- yeet-- the person-- who is playing-- this- prank- on me."]~
+    args.outputs.labels << [border_x, border_y + 25 + border_size, args.state.info_message]
+** Processing line: ~  end~
 - Inside source: true
 *** True Line Result
-        [22, 20, 10, 10, "This spot--, on the mountain, right here, it's-- perfect. This- is where- I'll-- yeet-- the person-- who is playing-- this- prank- on me."]
-** Processing line: ~      ],~
+  end
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-      ],
-** Processing line: ~      render_override: :blinking_light_path_to_observatory_render~
+
+** Processing line: ~  def tile_in_game x, y, tile_key~
 - Inside source: true
 *** True Line Result
-      render_override: :blinking_light_path_to_observatory_render
-** Processing line: ~    }~
+  def tile_in_game x, y, tile_key
+** Processing line: ~    tile($gtk.args.state.grid.padding + x * DESTINATION_TILE_SIZE,~
 - Inside source: true
 *** True Line Result
-    }
+    tile($gtk.args.state.grid.padding + x * DESTINATION_TILE_SIZE,
+** Processing line: ~         $gtk.args.state.grid.padding + y * DESTINATION_TILE_SIZE,~
+- Inside source: true
+*** True Line Result
+         $gtk.args.state.grid.padding + y * DESTINATION_TILE_SIZE,
+** Processing line: ~         tile_key)~
+- Inside source: true
+*** True Line Result
+         tile_key)
 ** Processing line: ~  end~
 - Inside source: true
 *** True Line Result
@@ -140935,262 +146955,294 @@ Follows is a source code listing for all files that have been open sourced. This
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~  def serenity_alive_observatory args~
+** Processing line: ~#+end_src~
+- Line was identified as the end of a code block.
+*** True Line Result
+#+end_src
+** Processing line: ~~
+- End of paragraph detected.
+*** True Line Result
+
+** Processing line: ~*** Rpg Roguelike - Roguelike Starting Point - sprite_lookup.rb~
+- Header detected.
+*** True Line Result
+
+*** True Line Result
+*** Rpg Roguelike - Roguelike Starting Point - sprite_lookup.rb
+** Processing line: ~#+begin_src ruby~
+- Line was identified as the beginning of a code block.
+*** True Line Result
+
+*** True Line Result
+#+begin_src ruby
+** Processing line: ~  # ./samples/99_genre_rpg_roguelike/01_roguelike_starting_point/app/sprite_lookup.rb~
 - Inside source: true
 *** True Line Result
-  def serenity_alive_observatory args
+  # ./samples/99_genre_rpg_roguelike/01_roguelike_starting_point/app/sprite_lookup.rb
+** Processing line: ~  def sprite_lookup~
+- Inside source: true
+*** True Line Result
+  def sprite_lookup
 ** Processing line: ~    {~
 - Inside source: true
 *** True Line Result
     {
-** Processing line: ~      background: 'sprites/observatory.png',~
+** Processing line: ~      0 => [3, 0],~
 - Inside source: true
 *** True Line Result
-      background: 'sprites/observatory.png',
-** Processing line: ~      player: [60, 2],~
+      0 => [3, 0],
+** Processing line: ~      1 => [3, 1],~
 - Inside source: true
 *** True Line Result
-      player: [60, 2],
-** Processing line: ~      scenes: [~
+      1 => [3, 1],
+** Processing line: ~      2 => [3, 2],~
 - Inside source: true
 *** True Line Result
-      scenes: [
-** Processing line: ~        [28, 39, 4, 10, :serenity_alive_inside_observatory]~
+      2 => [3, 2],
+** Processing line: ~      3 => [3, 3],~
 - Inside source: true
 *** True Line Result
-        [28, 39, 4, 10, :serenity_alive_inside_observatory]
-** Processing line: ~      ],~
+      3 => [3, 3],
+** Processing line: ~      4 => [3, 4],~
 - Inside source: true
 *** True Line Result
-      ],
-** Processing line: ~      render_override: :blinking_light_observatory_render~
+      4 => [3, 4],
+** Processing line: ~      5 => [3, 5],~
 - Inside source: true
 *** True Line Result
-      render_override: :blinking_light_observatory_render
-** Processing line: ~    }~
+      5 => [3, 5],
+** Processing line: ~      6 => [3, 6],~
 - Inside source: true
 *** True Line Result
-    }
-** Processing line: ~  end~
+      6 => [3, 6],
+** Processing line: ~      7 => [3, 7],~
 - Inside source: true
 *** True Line Result
-  end
-** Processing line: ~~
+      7 => [3, 7],
+** Processing line: ~      8 => [3, 8],~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~  def serenity_alive_inside_observatory args~
+      8 => [3, 8],
+** Processing line: ~      9 => [3, 9],~
 - Inside source: true
 *** True Line Result
-  def serenity_alive_inside_observatory args
-** Processing line: ~    {~
+      9 => [3, 9],
+** Processing line: ~      '@' => [4, 0],~
 - Inside source: true
 *** True Line Result
-    {
-** Processing line: ~      background: 'sprites/inside-observatory.png',~
+      '@' => [4, 0],
+** Processing line: ~      A: [ 4,  1],~
 - Inside source: true
 *** True Line Result
-      background: 'sprites/inside-observatory.png',
-** Processing line: ~      player: [60, 2],~
+      A: [ 4,  1],
+** Processing line: ~      B: [ 4,  2],~
 - Inside source: true
 *** True Line Result
-      player: [60, 2],
-** Processing line: ~      storylines: [],~
+      B: [ 4,  2],
+** Processing line: ~      C: [ 4,  3],~
 - Inside source: true
 *** True Line Result
-      storylines: [],
-** Processing line: ~      scenes: [~
+      C: [ 4,  3],
+** Processing line: ~      D: [ 4,  4],~
 - Inside source: true
 *** True Line Result
-      scenes: [
-** Processing line: ~        [30, 18, 5, 12, :serenity_alive_inside_mainframe]~
+      D: [ 4,  4],
+** Processing line: ~      E: [ 4,  5],~
 - Inside source: true
 *** True Line Result
-        [30, 18, 5, 12, :serenity_alive_inside_mainframe]
-** Processing line: ~      ],~
+      E: [ 4,  5],
+** Processing line: ~      F: [ 4,  6],~
 - Inside source: true
 *** True Line Result
-      ],
-** Processing line: ~      render_override: :blinking_light_inside_observatory_render~
+      F: [ 4,  6],
+** Processing line: ~      G: [ 4,  7],~
 - Inside source: true
 *** True Line Result
-      render_override: :blinking_light_inside_observatory_render
-** Processing line: ~    }~
+      G: [ 4,  7],
+** Processing line: ~      H: [ 4,  8],~
 - Inside source: true
 *** True Line Result
-    }
-** Processing line: ~  end~
+      H: [ 4,  8],
+** Processing line: ~      I: [ 4,  9],~
 - Inside source: true
 *** True Line Result
-  end
-** Processing line: ~~
+      I: [ 4,  9],
+** Processing line: ~      J: [ 4, 10],~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~  def serenity_alive_inside_mainframe args~
+      J: [ 4, 10],
+** Processing line: ~      K: [ 4, 11],~
 - Inside source: true
 *** True Line Result
-  def serenity_alive_inside_mainframe args
-** Processing line: ~    {~
+      K: [ 4, 11],
+** Processing line: ~      L: [ 4, 12],~
 - Inside source: true
 *** True Line Result
-    {
-** Processing line: ~      background: 'sprites/mainframe.png',~
+      L: [ 4, 12],
+** Processing line: ~      M: [ 4, 13],~
 - Inside source: true
 *** True Line Result
-      background: 'sprites/mainframe.png',
-** Processing line: ~      fade: 60,~
+      M: [ 4, 13],
+** Processing line: ~      N: [ 4, 14],~
 - Inside source: true
 *** True Line Result
-      fade: 60,
-** Processing line: ~      player: [30, 4],~
+      N: [ 4, 14],
+** Processing line: ~      O: [ 4, 15],~
 - Inside source: true
 *** True Line Result
-      player: [30, 4],
-** Processing line: ~      scenes: [~
+      O: [ 4, 15],
+** Processing line: ~      P: [ 5,  0],~
 - Inside source: true
 *** True Line Result
-      scenes: [
-** Processing line: ~        [*hotspot_top, :serenity_alive_ship_status],~
+      P: [ 5,  0],
+** Processing line: ~      Q: [ 5,  1],~
 - Inside source: true
 *** True Line Result
-        [*hotspot_top, :serenity_alive_ship_status],
-** Processing line: ~      ],~
+      Q: [ 5,  1],
+** Processing line: ~      R: [ 5,  2],~
 - Inside source: true
 *** True Line Result
-      ],
-** Processing line: ~      storylines: [~
+      R: [ 5,  2],
+** Processing line: ~      S: [ 5,  3],~
 - Inside source: true
 *** True Line Result
-      storylines: [
-** Processing line: ~        [22, 45, 17, 4, (serenity_alive_last_reply args)],~
+      S: [ 5,  3],
+** Processing line: ~      T: [ 5,  4],~
 - Inside source: true
 *** True Line Result
-        [22, 45, 17, 4, (serenity_alive_last_reply args)],
-** Processing line: ~        [45, 45,  4, 4, (serenity_alive_current_message args)],~
+      T: [ 5,  4],
+** Processing line: ~      U: [ 5,  5],~
 - Inside source: true
 *** True Line Result
-        [45, 45,  4, 4, (serenity_alive_current_message args)],
-** Processing line: ~      ]~
+      U: [ 5,  5],
+** Processing line: ~      V: [ 5,  6],~
 - Inside source: true
 *** True Line Result
-      ]
-** Processing line: ~    }~
+      V: [ 5,  6],
+** Processing line: ~      W: [ 5,  7],~
 - Inside source: true
 *** True Line Result
-    }
-** Processing line: ~  end~
+      W: [ 5,  7],
+** Processing line: ~      X: [ 5,  8],~
 - Inside source: true
 *** True Line Result
-  end
-** Processing line: ~~
+      X: [ 5,  8],
+** Processing line: ~      Y: [ 5,  9],~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~  def serenity_alive_ship_status args~
+      Y: [ 5,  9],
+** Processing line: ~      Z: [ 5, 10],~
 - Inside source: true
 *** True Line Result
-  def serenity_alive_ship_status args
-** Processing line: ~    {~
+      Z: [ 5, 10],
+** Processing line: ~      a: [ 6,  1],~
 - Inside source: true
 *** True Line Result
-    {
-** Processing line: ~      background: 'sprites/serenity.png',~
+      a: [ 6,  1],
+** Processing line: ~      b: [ 6,  2],~
 - Inside source: true
 *** True Line Result
-      background: 'sprites/serenity.png',
-** Processing line: ~      fade: 60,~
+      b: [ 6,  2],
+** Processing line: ~      c: [ 6,  3],~
 - Inside source: true
 *** True Line Result
-      fade: 60,
-** Processing line: ~      player: [30, 10],~
+      c: [ 6,  3],
+** Processing line: ~      d: [ 6,  4],~
 - Inside source: true
 *** True Line Result
-      player: [30, 10],
-** Processing line: ~      scenes: [~
+      d: [ 6,  4],
+** Processing line: ~      e: [ 6,  5],~
 - Inside source: true
 *** True Line Result
-      scenes: [
-** Processing line: ~        [30, 50, 4, 4, :serenity_alive_ship_status_reviewed]~
+      e: [ 6,  5],
+** Processing line: ~      f: [ 6,  6],~
 - Inside source: true
 *** True Line Result
-        [30, 50, 4, 4, :serenity_alive_ship_status_reviewed]
-** Processing line: ~      ],~
+      f: [ 6,  6],
+** Processing line: ~      g: [ 6,  7],~
 - Inside source: true
 *** True Line Result
-      ],
-** Processing line: ~      storylines: [~
+      g: [ 6,  7],
+** Processing line: ~      h: [ 6,  8],~
 - Inside source: true
 *** True Line Result
-      storylines: [
-** Processing line: ~        [30,  8, 4, 4, "Serenity? THE--- Mission-- Serenity?! How is that possible? They- are supposed-- to be dead."],~
+      h: [ 6,  8],
+** Processing line: ~      i: [ 6,  9],~
 - Inside source: true
 *** True Line Result
-        [30,  8, 4, 4, "Serenity? THE--- Mission-- Serenity?! How is that possible? They- are supposed-- to be dead."],
-** Processing line: ~        [30, 10, 4, 4, "I... can't-- believe-- it. I- can access-- Serenity's-- computer? I- guess my \"superpower----\" isn't limited-- by proximity-- to- a machine--."],~
+      i: [ 6,  9],
+** Processing line: ~      j: [ 6, 10],~
 - Inside source: true
 *** True Line Result
-        [30, 10, 4, 4, "I... can't-- believe-- it. I- can access-- Serenity's-- computer? I- guess my \"superpower----\" isn't limited-- by proximity-- to- a machine--."],
-** Processing line: ~        *serenity_alive_shared_ship_status(args)~
+      j: [ 6, 10],
+** Processing line: ~      k: [ 6, 11],~
 - Inside source: true
 *** True Line Result
-        *serenity_alive_shared_ship_status(args)
-** Processing line: ~      ]~
+      k: [ 6, 11],
+** Processing line: ~      l: [ 6, 12],~
 - Inside source: true
 *** True Line Result
-      ]
-** Processing line: ~    }~
+      l: [ 6, 12],
+** Processing line: ~      m: [ 6, 13],~
 - Inside source: true
 *** True Line Result
-    }
-** Processing line: ~  end~
+      m: [ 6, 13],
+** Processing line: ~      n: [ 6, 14],~
 - Inside source: true
 *** True Line Result
-  end
-** Processing line: ~~
+      n: [ 6, 14],
+** Processing line: ~      o: [ 6, 15],~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~  def serenity_alive_ship_status_reviewed args~
+      o: [ 6, 15],
+** Processing line: ~      p: [ 7,  0],~
 - Inside source: true
 *** True Line Result
-  def serenity_alive_ship_status_reviewed args
-** Processing line: ~    {~
+      p: [ 7,  0],
+** Processing line: ~      q: [ 7,  1],~
 - Inside source: true
 *** True Line Result
-    {
-** Processing line: ~      background: 'sprites/serenity.png',~
+      q: [ 7,  1],
+** Processing line: ~      r: [ 7,  2],~
 - Inside source: true
 *** True Line Result
-      background: 'sprites/serenity.png',
-** Processing line: ~      fade: 60,~
+      r: [ 7,  2],
+** Processing line: ~      s: [ 7,  3],~
 - Inside source: true
 *** True Line Result
-      fade: 60,
-** Processing line: ~      scenes: [~
+      s: [ 7,  3],
+** Processing line: ~      t: [ 7,  4],~
 - Inside source: true
 *** True Line Result
-      scenes: [
-** Processing line: ~        [*hotspot_bottom, :serenity_alive_time_to_reply]~
+      t: [ 7,  4],
+** Processing line: ~      u: [ 7,  5],~
 - Inside source: true
 *** True Line Result
-        [*hotspot_bottom, :serenity_alive_time_to_reply]
-** Processing line: ~      ],~
+      u: [ 7,  5],
+** Processing line: ~      v: [ 7,  6],~
 - Inside source: true
 *** True Line Result
-      ],
-** Processing line: ~      storylines: [~
+      v: [ 7,  6],
+** Processing line: ~      w: [ 7,  7],~
 - Inside source: true
 *** True Line Result
-      storylines: [
-** Processing line: ~        [0, 62, 62, 3, "Okay. Reviewing-- everything--, it looks- like- I- can- take- the batteries--- from the Stasis--- Chambers--- and- Engine--- to keep- the crew-- alive-- and-- their-- location--- pinpointed---."],~
+      w: [ 7,  7],
+** Processing line: ~      x: [ 7,  8],~
 - Inside source: true
 *** True Line Result
-        [0, 62, 62, 3, "Okay. Reviewing-- everything--, it looks- like- I- can- take- the batteries--- from the Stasis--- Chambers--- and- Engine--- to keep- the crew-- alive-- and-- their-- location--- pinpointed---."],
-** Processing line: ~      ]~
+      x: [ 7,  8],
+** Processing line: ~      y: [ 7,  9],~
 - Inside source: true
 *** True Line Result
-      ]
+      y: [ 7,  9],
+** Processing line: ~      z: [ 7, 10],~
+- Inside source: true
+*** True Line Result
+      z: [ 7, 10],
+** Processing line: ~      '|' => [ 7, 12]~
+- Inside source: true
+*** True Line Result
+      '|' => [ 7, 12]
 ** Processing line: ~    }~
 - Inside source: true
 *** True Line Result
@@ -141203,26 +147255,14 @@ Follows is a source code listing for all files that have been open sourced. This
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~  def serenity_alive_time_to_reply args~
-- Inside source: true
-*** True Line Result
-  def serenity_alive_time_to_reply args
-** Processing line: ~    decision_graph serenity_alive_current_message(args),~
-- Inside source: true
-*** True Line Result
-    decision_graph serenity_alive_current_message(args),
-** Processing line: ~                    "Okay... time to deliver the bad news...",~
-- Inside source: true
-*** True Line Result
-                    "Okay... time to deliver the bad news...",
-** Processing line: ~                    [:replied_to_serenity_alive_firmly, "Firm-- Reply", serenity_alive_firm_reply],~
+** Processing line: ~  def sprite key~
 - Inside source: true
 *** True Line Result
-                    [:replied_to_serenity_alive_firmly, "Firm-- Reply", serenity_alive_firm_reply],
-** Processing line: ~                    [:replied_to_serenity_alive_kindly, "Sugar-- Coated---- Reply", serenity_alive_sugarcoated_reply]~
+  def sprite key
+** Processing line: ~    $gtk.args.state.reserved.sprite_lookup[key]~
 - Inside source: true
 *** True Line Result
-                    [:replied_to_serenity_alive_kindly, "Sugar-- Coated---- Reply", serenity_alive_sugarcoated_reply]
+    $gtk.args.state.reserved.sprite_lookup[key]
 ** Processing line: ~  end~
 - Inside source: true
 *** True Line Result
@@ -141231,206 +147271,194 @@ Follows is a source code listing for all files that have been open sourced. This
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~  def serenity_alive_shared_ship_status args~
-- Inside source: true
-*** True Line Result
-  def serenity_alive_shared_ship_status args
-** Processing line: ~    [~
+** Processing line: ~  def member_name_as_code raw_member_name~
 - Inside source: true
 *** True Line Result
-    [
-** Processing line: ~      *ship_control_hotspot( 0, 50,~
+  def member_name_as_code raw_member_name
+** Processing line: ~    if raw_member_name.is_a? Symbol~
 - Inside source: true
 *** True Line Result
-      *ship_control_hotspot( 0, 50,
-** Processing line: ~                             "Stasis-- Chambers--: Online, All chambers-- are powered. Battery--- Allocation---: 3--- of-- 3--, Hmmm. They don't-- need this to be powered-- right- now. Everyone-- is awake.",~
+    if raw_member_name.is_a? Symbol
+** Processing line: ~      ":#{raw_member_name}"~
 - Inside source: true
 *** True Line Result
-                             "Stasis-- Chambers--: Online, All chambers-- are powered. Battery--- Allocation---: 3--- of-- 3--, Hmmm. They don't-- need this to be powered-- right- now. Everyone-- is awake.",
-** Processing line: ~                             nil,~
+      ":#{raw_member_name}"
+** Processing line: ~    elsif raw_member_name.is_a? String~
 - Inside source: true
 *** True Line Result
-                             nil,
-** Processing line: ~                             nil,~
+    elsif raw_member_name.is_a? String
+** Processing line: ~      "'#{raw_member_name}'"~
 - Inside source: true
 *** True Line Result
-                             nil,
-** Processing line: ~                             nil),~
+      "'#{raw_member_name}'"
+** Processing line: ~    elsif raw_member_name.is_a? Fixnum~
 - Inside source: true
 *** True Line Result
-                             nil),
-** Processing line: ~      *ship_control_hotspot(12, 35,~
+    elsif raw_member_name.is_a? Fixnum
+** Processing line: ~      "#{raw_member_name}"~
 - Inside source: true
 *** True Line Result
-      *ship_control_hotspot(12, 35,
-** Processing line: ~                            "Life- Support--: Offline, Unable--- to- Sustain-- Life. Battery--- Allocation---: 0--- of-- 3---, Okay. That is definitely---- not a good thing.",~
+      "#{raw_member_name}"
+** Processing line: ~    else~
 - Inside source: true
 *** True Line Result
-                            "Life- Support--: Offline, Unable--- to- Sustain-- Life. Battery--- Allocation---: 0--- of-- 3---, Okay. That is definitely---- not a good thing.",
-** Processing line: ~                            nil,~
+    else
+** Processing line: ~      "UNKNOWN: #{raw_member_name}"~
 - Inside source: true
 *** True Line Result
-                            nil,
-** Processing line: ~                            nil,~
+      "UNKNOWN: #{raw_member_name}"
+** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
-                            nil,
-** Processing line: ~                            nil),~
+    end
+** Processing line: ~  end~
 - Inside source: true
 *** True Line Result
-                            nil),
-** Processing line: ~      *ship_control_hotspot(24, 20,~
+  end
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-      *ship_control_hotspot(24, 20,
-** Processing line: ~                            "Navigation: Offline, Unable--- to- Calculate--- Location. Battery--- Allocation---: 0--- of-- 3---, Whelp. No wonder-- Sasha-- can't-- get- any-- readings. Their- Navigation--- is completely--- offline.",~
+
+** Processing line: ~  def tile x, y, tile_row_column_or_key~
 - Inside source: true
 *** True Line Result
-                            "Navigation: Offline, Unable--- to- Calculate--- Location. Battery--- Allocation---: 0--- of-- 3---, Whelp. No wonder-- Sasha-- can't-- get- any-- readings. Their- Navigation--- is completely--- offline.",
-** Processing line: ~                            nil,~
+  def tile x, y, tile_row_column_or_key
+** Processing line: ~    tile_extended x, y, DESTINATION_TILE_SIZE, DESTINATION_TILE_SIZE, TILE_R, TILE_G, TILE_B, TILE_A, tile_row_column_or_key~
 - Inside source: true
 *** True Line Result
-                            nil,
-** Processing line: ~                            nil,~
+    tile_extended x, y, DESTINATION_TILE_SIZE, DESTINATION_TILE_SIZE, TILE_R, TILE_G, TILE_B, TILE_A, tile_row_column_or_key
+** Processing line: ~  end~
 - Inside source: true
 *** True Line Result
-                            nil,
-** Processing line: ~                            nil),~
+  end
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-                            nil),
-** Processing line: ~      *ship_control_hotspot(36, 35,~
+
+** Processing line: ~  def tile_extended x, y, w, h, r, g, b, a, tile_row_column_or_key~
 - Inside source: true
 *** True Line Result
-      *ship_control_hotspot(36, 35,
-** Processing line: ~                            "COMM: Underpowered----, Limited--- to- Text-- Based-- COMM. Battery--- Allocation---: 1--- of-- 3---, It's-- lucky- that- their- COMM---- system was able to survive-- twenty-- years--. Just- barely-- it seems.",~
+  def tile_extended x, y, w, h, r, g, b, a, tile_row_column_or_key
+** Processing line: ~    row_or_key, column = tile_row_column_or_key~
 - Inside source: true
 *** True Line Result
-                            "COMM: Underpowered----, Limited--- to- Text-- Based-- COMM. Battery--- Allocation---: 1--- of-- 3---, It's-- lucky- that- their- COMM---- system was able to survive-- twenty-- years--. Just- barely-- it seems.",
-** Processing line: ~                            nil,~
+    row_or_key, column = tile_row_column_or_key
+** Processing line: ~    if !column~
 - Inside source: true
 *** True Line Result
-                            nil,
-** Processing line: ~                            nil,~
+    if !column
+** Processing line: ~      row, column = sprite row_or_key~
 - Inside source: true
 *** True Line Result
-                            nil,
-** Processing line: ~                            nil),~
+      row, column = sprite row_or_key
+** Processing line: ~    else~
 - Inside source: true
 *** True Line Result
-                            nil),
-** Processing line: ~      *ship_control_hotspot(48, 50,~
+    else
+** Processing line: ~      row, column = row_or_key, column~
 - Inside source: true
 *** True Line Result
-      *ship_control_hotspot(48, 50,
-** Processing line: ~                            "Engine: Online, Full- Control-- Available. Battery--- Allocation---: 3--- of-- 3---, Hmmm. No point of having an engine-- online--, if you don't- know- where you're-- going.",~
+      row, column = row_or_key, column
+** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
-                            "Engine: Online, Full- Control-- Available. Battery--- Allocation---: 3--- of-- 3---, Hmmm. No point of having an engine-- online--, if you don't- know- where you're-- going.",
-** Processing line: ~                            nil,~
+    end
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-                            nil,
-** Processing line: ~                            nil,~
+
+** Processing line: ~    if !row~
 - Inside source: true
 *** True Line Result
-                            nil,
-** Processing line: ~                            nil)~
+    if !row
+** Processing line: ~      member_name = member_name_as_code tile_row_column_or_key~
 - Inside source: true
 *** True Line Result
-                            nil)
-** Processing line: ~    ]~
+      member_name = member_name_as_code tile_row_column_or_key
+** Processing line: ~      raise "Unabled to find a sprite for #{member_name}. Make sure the value exists in app/sprite_lookup.rb."~
 - Inside source: true
 *** True Line Result
-    ]
-** Processing line: ~  end~
+      raise "Unabled to find a sprite for #{member_name}. Make sure the value exists in app/sprite_lookup.rb."
+** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
-  end
+    end
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~  def serenity_alive_firm_reply~
+** Processing line: ~    # Sprite provided by Rogue Yun~
 - Inside source: true
 *** True Line Result
-  def serenity_alive_firm_reply
-** Processing line: ~    "Serenity, you are at a distance-- farther-- than- Neptune. All- of the ship's-- systems-- are failing. Please- move the batteries---- from- the Stasis-- Chambers-- over- to- Life-- Support--. I also-- need- you to move-- the batteries---- from- the Engines--- to your Navigation---- System."~
+    # Sprite provided by Rogue Yun
+** Processing line: ~    # http://www.bay12forums.com/smf/index.php?topic=144897.0~
 - Inside source: true
 *** True Line Result
-    "Serenity, you are at a distance-- farther-- than- Neptune. All- of the ship's-- systems-- are failing. Please- move the batteries---- from- the Stasis-- Chambers-- over- to- Life-- Support--. I also-- need- you to move-- the batteries---- from- the Engines--- to your Navigation---- System."
-** Processing line: ~  end~
+    # http://www.bay12forums.com/smf/index.php?topic=144897.0
+** Processing line: ~    # License: Public Domain~
 - Inside source: true
 *** True Line Result
-  end
+    # License: Public Domain
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~  def serenity_alive_sugarcoated_reply~
-- Inside source: true
-*** True Line Result
-  def serenity_alive_sugarcoated_reply
-** Processing line: ~    "So... you- are- a teeny--- tiny--- bit--- farther-- from Earth- than you think. And you have a teeny--- tiny--- problem-- with your ship. Please-- move the batteries--- from the Stasis--- Chambers--- over to Life--- Support---. I also need you to move the batteries--- from the Engines--- to your- Navigation--- System. Don't-- worry-- Sasha. I'll-- get y'all-- home."~
-- Inside source: true
-*** True Line Result
-    "So... you- are- a teeny--- tiny--- bit--- farther-- from Earth- than you think. And you have a teeny--- tiny--- problem-- with your ship. Please-- move the batteries--- from the Stasis--- Chambers--- over to Life--- Support---. I also need you to move the batteries--- from the Engines--- to your- Navigation--- System. Don't-- worry-- Sasha. I'll-- get y'all-- home."
-** Processing line: ~  end~
+** Processing line: ~    {~
 - Inside source: true
 *** True Line Result
-  end
-** Processing line: ~~
+    {
+** Processing line: ~      x: x,~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~  def replied_to_serenity_alive_firmly args~
+      x: x,
+** Processing line: ~      y: y,~
 - Inside source: true
 *** True Line Result
-  def replied_to_serenity_alive_firmly args
-** Processing line: ~    {~
+      y: y,
+** Processing line: ~      w: w,~
 - Inside source: true
 *** True Line Result
-    {
-** Processing line: ~      background: 'sprites/inside-observatory.png',~
+      w: w,
+** Processing line: ~      h: h,~
 - Inside source: true
 *** True Line Result
-      background: 'sprites/inside-observatory.png',
-** Processing line: ~      fade: 60,~
+      h: h,
+** Processing line: ~      tile_x: column * 16,~
 - Inside source: true
 *** True Line Result
-      fade: 60,
-** Processing line: ~      player: [32, 21],~
+      tile_x: column * 16,
+** Processing line: ~      tile_y: (row * 16),~
 - Inside source: true
 *** True Line Result
-      player: [32, 21],
-** Processing line: ~      scenes: [~
+      tile_y: (row * 16),
+** Processing line: ~      tile_w: 16,~
 - Inside source: true
 *** True Line Result
-      scenes: [
-** Processing line: ~        [*hotspot_bottom_right, :serenity_alive_path_from_observatory]~
+      tile_w: 16,
+** Processing line: ~      tile_h: 16,~
 - Inside source: true
 *** True Line Result
-        [*hotspot_bottom_right, :serenity_alive_path_from_observatory]
-** Processing line: ~      ],~
+      tile_h: 16,
+** Processing line: ~      r: r,~
 - Inside source: true
 *** True Line Result
-      ],
-** Processing line: ~      storylines: [~
+      r: r,
+** Processing line: ~      g: g,~
 - Inside source: true
 *** True Line Result
-      storylines: [
-** Processing line: ~        [30, 18, 5, 12, "Buffer-- has been set to: #{serenity_alive_firm_reply.quote}"],~
+      g: g,
+** Processing line: ~      b: b,~
 - Inside source: true
 *** True Line Result
-        [30, 18, 5, 12, "Buffer-- has been set to: #{serenity_alive_firm_reply.quote}"],
-** Processing line: ~        *serenity_alive_reply_completed_shared_hotspots(args),~
+      b: b,
+** Processing line: ~      a: a,~
 - Inside source: true
 *** True Line Result
-        *serenity_alive_reply_completed_shared_hotspots(args),
-** Processing line: ~      ]~
+      a: a,
+** Processing line: ~      path: 'sprites/simple-mood-16x16.png'~
 - Inside source: true
 *** True Line Result
-      ]
+      path: 'sprites/simple-mood-16x16.png'
 ** Processing line: ~    }~
 - Inside source: true
 *** True Line Result
@@ -141443,1694 +147471,1746 @@ Follows is a source code listing for all files that have been open sourced. This
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~  def replied_to_serenity_alive_kindly args~
+** Processing line: ~  $gtk.args.state.reserved.sprite_lookup = sprite_lookup~
 - Inside source: true
 *** True Line Result
-  def replied_to_serenity_alive_kindly args
-** Processing line: ~    {~
+  $gtk.args.state.reserved.sprite_lookup = sprite_lookup
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-    {
-** Processing line: ~      background: 'sprites/inside-observatory.png',~
+
+** Processing line: ~#+end_src~
+- Line was identified as the end of a code block.
+*** True Line Result
+#+end_src
+** Processing line: ~~
+- End of paragraph detected.
+*** True Line Result
+
+** Processing line: ~*** Rpg Roguelike - Roguelike Line Of Sight - main.rb~
+- Header detected.
+*** True Line Result
+
+*** True Line Result
+*** Rpg Roguelike - Roguelike Line Of Sight - main.rb
+** Processing line: ~#+begin_src ruby~
+- Line was identified as the beginning of a code block.
+*** True Line Result
+
+*** True Line Result
+#+begin_src ruby
+** Processing line: ~  # ./samples/99_genre_rpg_roguelike/02_roguelike_line_of_sight/app/main.rb~
 - Inside source: true
 *** True Line Result
-      background: 'sprites/inside-observatory.png',
-** Processing line: ~      fade: 60,~
+  # ./samples/99_genre_rpg_roguelike/02_roguelike_line_of_sight/app/main.rb
+** Processing line: ~  =begin~
+- Inside source: true
+*** True Line Result
+  =begin
+** Processing line: ~~
+- Inside source: true
+*** True Line Result
+
+** Processing line: ~   APIs listing that haven't been encountered in previous sample apps:~
+- Inside source: true
+*** True Line Result
+   APIs listing that haven't been encountered in previous sample apps:
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-      fade: 60,
-** Processing line: ~      player: [32, 21],~
+
+** Processing line: ~   - lambda: A way to define a block and its parameters with special syntax.~
 - Inside source: true
 *** True Line Result
-      player: [32, 21],
-** Processing line: ~      scenes: [~
+   - lambda: A way to define a block and its parameters with special syntax.
+** Processing line: ~     For example, the syntax of lambda looks like this:~
 - Inside source: true
 *** True Line Result
-      scenes: [
-** Processing line: ~        [*hotspot_bottom_right, :serenity_alive_path_from_observatory]~
+     For example, the syntax of lambda looks like this:
+** Processing line: ~     my_lambda = -> { puts "This is my lambda" }~
 - Inside source: true
 *** True Line Result
-        [*hotspot_bottom_right, :serenity_alive_path_from_observatory]
-** Processing line: ~      ],~
+     my_lambda = -> { puts "This is my lambda" }
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-      ],
-** Processing line: ~      storylines: [~
+
+** Processing line: ~   Reminders:~
 - Inside source: true
 *** True Line Result
-      storylines: [
-** Processing line: ~        [30, 18, 5, 12, "Buffer-- has been set to: #{serenity_alive_sugarcoated_reply.quote}"],~
+   Reminders:
+** Processing line: ~   - args.outputs.labels: An array. The values generate a label.~
 - Inside source: true
 *** True Line Result
-        [30, 18, 5, 12, "Buffer-- has been set to: #{serenity_alive_sugarcoated_reply.quote}"],
-** Processing line: ~        *serenity_alive_reply_completed_shared_hotspots(args),~
+   - args.outputs.labels: An array. The values generate a label.
+** Processing line: ~     The parameters are [X, Y, TEXT, SIZE, ALIGNMENT, RED, GREEN, BLUE, ALPHA, FONT STYLE]~
 - Inside source: true
 *** True Line Result
-        *serenity_alive_reply_completed_shared_hotspots(args),
-** Processing line: ~      ]~
+     The parameters are [X, Y, TEXT, SIZE, ALIGNMENT, RED, GREEN, BLUE, ALPHA, FONT STYLE]
+** Processing line: ~     For more information about labels, go to mygame/documentation/02-labels.~
 - Inside source: true
 *** True Line Result
-      ]
-** Processing line: ~    }~
+     For more information about labels, go to mygame/documentation/02-labels.
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-    }
-** Processing line: ~  end~
+
+** Processing line: ~   - ARRAY#inside_rect?: Returns whether or not the point is inside a rect.~
 - Inside source: true
 *** True Line Result
-  end
+   - ARRAY#inside_rect?: Returns whether or not the point is inside a rect.
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~  def serenity_alive_path_from_observatory args~
+** Processing line: ~   - product: Returns an array of all combinations of elements from all arrays.~
 - Inside source: true
 *** True Line Result
-  def serenity_alive_path_from_observatory args
-** Processing line: ~    {~
+   - product: Returns an array of all combinations of elements from all arrays.
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-    {
-** Processing line: ~      fade: 60,~
+
+** Processing line: ~   - find: Finds all elements of a collection that meet requirements.~
 - Inside source: true
 *** True Line Result
-      fade: 60,
-** Processing line: ~      background: 'sprites/path-to-observatory.png',~
+   - find: Finds all elements of a collection that meet requirements.
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-      background: 'sprites/path-to-observatory.png',
-** Processing line: ~      player: [4, 21],~
+
+** Processing line: ~   - abs: Returns the absolute value.~
 - Inside source: true
 *** True Line Result
-      player: [4, 21],
-** Processing line: ~      scenes: [~
+   - abs: Returns the absolute value.
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-      scenes: [
-** Processing line: ~        [*hotspot_bottom_right, :serenity_bio_infront_of_home]~
+
+** Processing line: ~  =end~
 - Inside source: true
 *** True Line Result
-        [*hotspot_bottom_right, :serenity_bio_infront_of_home]
-** Processing line: ~      ],~
+  =end
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-      ],
-** Processing line: ~      storylines: [~
+
+** Processing line: ~  # This sample app allows the player to move around in the dungeon, which becomes more or less visible~
 - Inside source: true
 *** True Line Result
-      storylines: [
-** Processing line: ~        [22, 20, 10, 10, "I'm not sure what's-- worse. Waiting-- for Sasha's-- reply. Or jumping-- off- from- right- here."]~
+  # This sample app allows the player to move around in the dungeon, which becomes more or less visible
+** Processing line: ~  # depending on the player's location, and also has enemies.~
 - Inside source: true
 *** True Line Result
-        [22, 20, 10, 10, "I'm not sure what's-- worse. Waiting-- for Sasha's-- reply. Or jumping-- off- from- right- here."]
-** Processing line: ~      ]~
+  # depending on the player's location, and also has enemies.
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-      ]
-** Processing line: ~    }~
+
+** Processing line: ~  class Game~
 - Inside source: true
 *** True Line Result
-    }
-** Processing line: ~  end~
+  class Game
+** Processing line: ~    attr_accessor :args, :state, :inputs, :outputs, :grid~
 - Inside source: true
 *** True Line Result
-  end
+    attr_accessor :args, :state, :inputs, :outputs, :grid
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~  def serenity_alive_reply_completed_shared_hotspots args~
+** Processing line: ~    # Calls all the methods needed for the game to run properly.~
 - Inside source: true
 *** True Line Result
-  def serenity_alive_reply_completed_shared_hotspots args
-** Processing line: ~    [~
+    # Calls all the methods needed for the game to run properly.
+** Processing line: ~    def tick~
 - Inside source: true
 *** True Line Result
-    [
-** Processing line: ~      [30, 10, 5, 4, "I guess it wasn't-- a joke- after-- all."],~
+    def tick
+** Processing line: ~      defaults~
 - Inside source: true
 *** True Line Result
-      [30, 10, 5, 4, "I guess it wasn't-- a joke- after-- all."],
-** Processing line: ~      [40, 10, 5, 4, "I barely-- remember--- the- history----- of the crew."],~
+      defaults
+** Processing line: ~      render_canvas~
 - Inside source: true
 *** True Line Result
-      [40, 10, 5, 4, "I barely-- remember--- the- history----- of the crew."],
-** Processing line: ~      [50, 10, 5, 4, "It probably--- wouldn't-- hurt- to- refresh-- my memory--."]~
+      render_canvas
+** Processing line: ~      render_dungeon~
 - Inside source: true
 *** True Line Result
-      [50, 10, 5, 4, "It probably--- wouldn't-- hurt- to- refresh-- my memory--."]
-** Processing line: ~    ]~
+      render_dungeon
+** Processing line: ~      render_player~
 - Inside source: true
 *** True Line Result
-    ]
-** Processing line: ~  end~
+      render_player
+** Processing line: ~      render_enemies~
 - Inside source: true
 *** True Line Result
-  end
-** Processing line: ~~
+      render_enemies
+** Processing line: ~      print_cell_coordinates~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~  def serenity_alive_last_reply args~
+      print_cell_coordinates
+** Processing line: ~      calc_canvas~
 - Inside source: true
 *** True Line Result
-  def serenity_alive_last_reply args
-** Processing line: ~    if args.state.scene_history.include? :replied_to_introduction_seriously~
+      calc_canvas
+** Processing line: ~      input_move~
 - Inside source: true
 *** True Line Result
-    if args.state.scene_history.include? :replied_to_introduction_seriously
-** Processing line: ~      return "Buffer--: \"Hello, Who- is sending-- this message--?\""~
+      input_move
+** Processing line: ~      input_click_map~
 - Inside source: true
 *** True Line Result
-      return "Buffer--: \"Hello, Who- is sending-- this message--?\""
-** Processing line: ~    else~
+      input_click_map
+** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
-    else
-** Processing line: ~      return "Buffer--: \"New- phone. Who dis?\""~
+    end
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-      return "Buffer--: \"New- phone. Who dis?\""
-** Processing line: ~    end~
+
+** Processing line: ~    # Sets default values and initializes variables~
 - Inside source: true
 *** True Line Result
-    end
-** Processing line: ~  end~
+    # Sets default values and initializes variables
+** Processing line: ~    def defaults~
 - Inside source: true
 *** True Line Result
-  end
+    def defaults
+** Processing line: ~      outputs.background_color = [0, 0, 0] # black background~
+- Inside source: true
+*** True Line Result
+      outputs.background_color = [0, 0, 0] # black background
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~  def serenity_alive_current_message args~
+** Processing line: ~      # Initializes empty canvas, dungeon, and enemies collections.~
 - Inside source: true
 *** True Line Result
-  def serenity_alive_current_message args
-** Processing line: ~    if args.state.scene_history.include? :replied_to_introduction_seriously~
+      # Initializes empty canvas, dungeon, and enemies collections.
+** Processing line: ~      state.canvas   ||= []~
 - Inside source: true
 *** True Line Result
-    if args.state.scene_history.include? :replied_to_introduction_seriously
-** Processing line: ~      "This- is Sasha. The Serenity--- crew-- is out of hibernation---- and ready-- for Earth reentry--. But, it seems like we are having-- trouble-- with our Navigation---- systems. Please advise.".quote~
+      state.canvas   ||= []
+** Processing line: ~      state.dungeon  ||= []~
 - Inside source: true
 *** True Line Result
-      "This- is Sasha. The Serenity--- crew-- is out of hibernation---- and ready-- for Earth reentry--. But, it seems like we are having-- trouble-- with our Navigation---- systems. Please advise.".quote
-** Processing line: ~    else~
+      state.dungeon  ||= []
+** Processing line: ~      state.enemies  ||= []~
 - Inside source: true
 *** True Line Result
-    else
-** Processing line: ~      "LOL! Thanks for the laugh. I needed that. This- is Sasha. The Serenity--- crew-- is out of hibernation---- and ready-- for Earth reentry--. But, it seems like we are having-- trouble-- with our Navigation---- systems. Can you help me out- babe?".quote~
+      state.enemies  ||= []
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-      "LOL! Thanks for the laugh. I needed that. This- is Sasha. The Serenity--- crew-- is out of hibernation---- and ready-- for Earth reentry--. But, it seems like we are having-- trouble-- with our Navigation---- systems. Can you help me out- babe?".quote
-** Processing line: ~    end~
+
+** Processing line: ~      # If state.area doesn't have value, load_area_one and derive_dungeon_from_area methods are called~
 - Inside source: true
 *** True Line Result
-    end
-** Processing line: ~  end~
+      # If state.area doesn't have value, load_area_one and derive_dungeon_from_area methods are called
+** Processing line: ~      if !state.area~
 - Inside source: true
 *** True Line Result
-  end
-** Processing line: ~~
+      if !state.area
+** Processing line: ~        load_area_one~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~#+end_src~
-- Line was identified as the end of a code block.
+        load_area_one
+** Processing line: ~        derive_dungeon_from_area~
+- Inside source: true
 *** True Line Result
-#+end_src
+        derive_dungeon_from_area
 ** Processing line: ~~
-- End of paragraph detected.
+- Inside source: true
 *** True Line Result
 
-** Processing line: ~*** Rpg Narrative - Return Of Serenity - storyline_serenity_bio.rb~
-- Header detected.
+** Processing line: ~        # Changing these values will change the position of player~
+- Inside source: true
 *** True Line Result
-
+        # Changing these values will change the position of player
+** Processing line: ~        state.x = 7~
+- Inside source: true
 *** True Line Result
-*** Rpg Narrative - Return Of Serenity - storyline_serenity_bio.rb
-** Processing line: ~#+begin_src ruby~
-- Line was identified as the beginning of a code block.
+        state.x = 7
+** Processing line: ~        state.y = 5~
+- Inside source: true
+*** True Line Result
+        state.y = 5
+** Processing line: ~~
+- Inside source: true
 *** True Line Result
 
+** Processing line: ~        # Creates new enemies, sets their values, and adds them to the enemies collection.~
+- Inside source: true
 *** True Line Result
-#+begin_src ruby
-** Processing line: ~  # ./samples/99_genre_rpg_narrative/return_of_serenity/app/storyline_serenity_bio.rb~
+        # Creates new enemies, sets their values, and adds them to the enemies collection.
+** Processing line: ~        state.enemies << state.new_entity(:enemy) do |e| # declares each enemy as new entity~
 - Inside source: true
 *** True Line Result
-  # ./samples/99_genre_rpg_narrative/return_of_serenity/app/storyline_serenity_bio.rb
-** Processing line: ~  def serenity_bio_infront_of_home args~
+        state.enemies << state.new_entity(:enemy) do |e| # declares each enemy as new entity
+** Processing line: ~          e.x           = 13 # position~
 - Inside source: true
 *** True Line Result
-  def serenity_bio_infront_of_home args
-** Processing line: ~    {~
+          e.x           = 13 # position
+** Processing line: ~          e.y           = 5~
 - Inside source: true
 *** True Line Result
-    {
-** Processing line: ~      fade: 60,~
+          e.y           = 5
+** Processing line: ~          e.previous_hp = 3~
 - Inside source: true
 *** True Line Result
-      fade: 60,
-** Processing line: ~      background: 'sprites/front-of-home.png',~
+          e.previous_hp = 3
+** Processing line: ~          e.hp          = 3~
 - Inside source: true
 *** True Line Result
-      background: 'sprites/front-of-home.png',
-** Processing line: ~      player: [54, 23],~
+          e.hp          = 3
+** Processing line: ~          e.max_hp      = 3~
 - Inside source: true
 *** True Line Result
-      player: [54, 23],
-** Processing line: ~      scenes: [~
+          e.max_hp      = 3
+** Processing line: ~          e.is_dead     = false # the enemy is alive~
 - Inside source: true
 *** True Line Result
-      scenes: [
-** Processing line: ~        [44, 34, 8, 14, :serenity_bio_inside_home],~
+          e.is_dead     = false # the enemy is alive
+** Processing line: ~        end~
 - Inside source: true
 *** True Line Result
-        [44, 34, 8, 14, :serenity_bio_inside_home],
-** Processing line: ~        [0, 3, 3, 22, :serenity_bio_library]~
+        end
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-        [0, 3, 3, 22, :serenity_bio_library]
-** Processing line: ~      ]~
+
+** Processing line: ~        update_line_of_sight # updates line of sight by adding newly visible cells~
 - Inside source: true
 *** True Line Result
-      ]
-** Processing line: ~    }~
+        update_line_of_sight # updates line of sight by adding newly visible cells
+** Processing line: ~      end~
 - Inside source: true
 *** True Line Result
-    }
-** Processing line: ~  end~
+      end
+** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
-  end
+    end
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~  def serenity_bio_inside_home args~
+** Processing line: ~    # Adds elements into the state.area collection~
 - Inside source: true
 *** True Line Result
-  def serenity_bio_inside_home args
-** Processing line: ~    {~
+    # Adds elements into the state.area collection
+** Processing line: ~    # The dungeon is derived using the coordinates of this collection~
 - Inside source: true
 *** True Line Result
-    {
-** Processing line: ~      background: 'sprites/inside-home.png',~
+    # The dungeon is derived using the coordinates of this collection
+** Processing line: ~    def load_area_one~
 - Inside source: true
 *** True Line Result
-      background: 'sprites/inside-home.png',
-** Processing line: ~      player: [34, 4],~
+    def load_area_one
+** Processing line: ~      state.area ||= []~
 - Inside source: true
 *** True Line Result
-      player: [34, 4],
-** Processing line: ~      storylines: [~
+      state.area ||= []
+** Processing line: ~      state.area << [8, 6]~
 - Inside source: true
 *** True Line Result
-      storylines: [
-** Processing line: ~        [34, 4, 4, 4, "I'm--- completely--- exhausted."],~
+      state.area << [8, 6]
+** Processing line: ~      state.area << [7, 6]~
 - Inside source: true
 *** True Line Result
-        [34, 4, 4, 4, "I'm--- completely--- exhausted."],
-** Processing line: ~      ],~
+      state.area << [7, 6]
+** Processing line: ~      state.area << [7, 7]~
 - Inside source: true
 *** True Line Result
-      ],
-** Processing line: ~      scenes: [~
+      state.area << [7, 7]
+** Processing line: ~      state.area << [8, 9]~
 - Inside source: true
 *** True Line Result
-      scenes: [
-** Processing line: ~        [30, 38, 12, 13, :serenity_bio_restless_sleep],~
+      state.area << [8, 9]
+** Processing line: ~      state.area << [7, 8]~
 - Inside source: true
 *** True Line Result
-        [30, 38, 12, 13, :serenity_bio_restless_sleep],
-** Processing line: ~        [32, 0, 8, 3, :serenity_bio_infront_of_home],~
+      state.area << [7, 8]
+** Processing line: ~      state.area << [7, 9]~
 - Inside source: true
 *** True Line Result
-        [32, 0, 8, 3, :serenity_bio_infront_of_home],
-** Processing line: ~      ]~
+      state.area << [7, 9]
+** Processing line: ~      state.area << [6, 4]~
 - Inside source: true
 *** True Line Result
-      ]
-** Processing line: ~    }~
+      state.area << [6, 4]
+** Processing line: ~      state.area << [7, 3]~
 - Inside source: true
 *** True Line Result
-    }
-** Processing line: ~  end~
+      state.area << [7, 3]
+** Processing line: ~      state.area << [7, 4]~
 - Inside source: true
 *** True Line Result
-  end
-** Processing line: ~~
+      state.area << [7, 4]
+** Processing line: ~      state.area << [6, 5]~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~  def serenity_bio_restless_sleep args~
+      state.area << [6, 5]
+** Processing line: ~      state.area << [7, 5]~
 - Inside source: true
 *** True Line Result
-  def serenity_bio_restless_sleep args
-** Processing line: ~    {~
+      state.area << [7, 5]
+** Processing line: ~      state.area << [8, 5]~
 - Inside source: true
 *** True Line Result
-    {
-** Processing line: ~      fade: 60,~
+      state.area << [8, 5]
+** Processing line: ~      state.area << [8, 4]~
 - Inside source: true
 *** True Line Result
-      fade: 60,
-** Processing line: ~      background: 'sprites/inside-home.png',~
+      state.area << [8, 4]
+** Processing line: ~      state.area << [1, 1]~
 - Inside source: true
 *** True Line Result
-      background: 'sprites/inside-home.png',
-** Processing line: ~      storylines: [~
+      state.area << [1, 1]
+** Processing line: ~      state.area << [0, 1]~
 - Inside source: true
 *** True Line Result
-      storylines: [
-** Processing line: ~        [32, 38, 10, 13, "I can't-- seem to sleep. I know nothing-- about the- crew-. Maybe- I- should- go read- up- on- them."],~
+      state.area << [0, 1]
+** Processing line: ~      state.area << [0, 2]~
 - Inside source: true
 *** True Line Result
-        [32, 38, 10, 13, "I can't-- seem to sleep. I know nothing-- about the- crew-. Maybe- I- should- go read- up- on- them."],
-** Processing line: ~      ],~
+      state.area << [0, 2]
+** Processing line: ~      state.area << [1, 2]~
 - Inside source: true
 *** True Line Result
-      ],
-** Processing line: ~      scenes: [~
+      state.area << [1, 2]
+** Processing line: ~      state.area << [2, 2]~
 - Inside source: true
 *** True Line Result
-      scenes: [
-** Processing line: ~        [32, 0, 8, 3, :serenity_bio_infront_of_home],~
+      state.area << [2, 2]
+** Processing line: ~      state.area << [2, 1]~
 - Inside source: true
 *** True Line Result
-        [32, 0, 8, 3, :serenity_bio_infront_of_home],
-** Processing line: ~      ]~
+      state.area << [2, 1]
+** Processing line: ~      state.area << [2, 3]~
 - Inside source: true
 *** True Line Result
-      ]
-** Processing line: ~    }~
+      state.area << [2, 3]
+** Processing line: ~      state.area << [1, 3]~
 - Inside source: true
 *** True Line Result
-    }
-** Processing line: ~  end~
+      state.area << [1, 3]
+** Processing line: ~      state.area << [1, 4]~
 - Inside source: true
 *** True Line Result
-  end
-** Processing line: ~~
+      state.area << [1, 4]
+** Processing line: ~      state.area << [2, 4]~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~  def serenity_bio_library args~
+      state.area << [2, 4]
+** Processing line: ~      state.area << [2, 5]~
 - Inside source: true
 *** True Line Result
-  def serenity_bio_library args
-** Processing line: ~    {~
+      state.area << [2, 5]
+** Processing line: ~      state.area << [1, 5]~
 - Inside source: true
 *** True Line Result
-    {
-** Processing line: ~      background: 'sprites/library.png',~
+      state.area << [1, 5]
+** Processing line: ~      state.area << [2, 6]~
 - Inside source: true
 *** True Line Result
-      background: 'sprites/library.png',
-** Processing line: ~      fade: 60,~
+      state.area << [2, 6]
+** Processing line: ~      state.area << [3, 6]~
 - Inside source: true
 *** True Line Result
-      fade: 60,
-** Processing line: ~      player: [30, 7],~
+      state.area << [3, 6]
+** Processing line: ~      state.area << [4, 6]~
 - Inside source: true
 *** True Line Result
-      player: [30, 7],
-** Processing line: ~      scenes: [~
+      state.area << [4, 6]
+** Processing line: ~      state.area << [4, 7]~
 - Inside source: true
 *** True Line Result
-      scenes: [
-** Processing line: ~        [21, 35, 3, 18, :serenity_bio_book]~
+      state.area << [4, 7]
+** Processing line: ~      state.area << [4, 8]~
 - Inside source: true
 *** True Line Result
-        [21, 35, 3, 18, :serenity_bio_book]
-** Processing line: ~      ]~
+      state.area << [4, 8]
+** Processing line: ~      state.area << [5, 8]~
 - Inside source: true
 *** True Line Result
-      ]
-** Processing line: ~    }~
+      state.area << [5, 8]
+** Processing line: ~      state.area << [5, 9]~
 - Inside source: true
 *** True Line Result
-    }
-** Processing line: ~  end~
+      state.area << [5, 9]
+** Processing line: ~      state.area << [6, 9]~
 - Inside source: true
 *** True Line Result
-  end
-** Processing line: ~~
+      state.area << [6, 9]
+** Processing line: ~      state.area << [7, 10]~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~  def serenity_bio_book args~
+      state.area << [7, 10]
+** Processing line: ~      state.area << [7, 11]~
 - Inside source: true
 *** True Line Result
-  def serenity_bio_book args
-** Processing line: ~    {~
+      state.area << [7, 11]
+** Processing line: ~      state.area << [7, 12]~
 - Inside source: true
 *** True Line Result
-    {
-** Processing line: ~      background: 'sprites/book.png',~
+      state.area << [7, 12]
+** Processing line: ~      state.area << [7, 12]~
 - Inside source: true
 *** True Line Result
-      background: 'sprites/book.png',
-** Processing line: ~      fade: 60,~
+      state.area << [7, 12]
+** Processing line: ~      state.area << [7, 13]~
 - Inside source: true
 *** True Line Result
-      fade: 60,
-** Processing line: ~      player: [6, 52],~
+      state.area << [7, 13]
+** Processing line: ~      state.area << [8, 13]~
 - Inside source: true
 *** True Line Result
-      player: [6, 52],
-** Processing line: ~      storylines: [~
+      state.area << [8, 13]
+** Processing line: ~      state.area << [9, 13]~
 - Inside source: true
 *** True Line Result
-      storylines: [
-** Processing line: ~        [ 4, 50, 56, 4, "The Title-- Reads: Never-- Forget-- Mission-- Serenity---"],~
+      state.area << [9, 13]
+** Processing line: ~      state.area << [10, 13]~
 - Inside source: true
 *** True Line Result
-        [ 4, 50, 56, 4, "The Title-- Reads: Never-- Forget-- Mission-- Serenity---"],
-** Processing line: ~~
+      state.area << [10, 13]
+** Processing line: ~      state.area << [11, 13]~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~        [ 4, 38,  8, 8, "Name: Matthew--- R. Sex: Male--- Age-- at-- Departure: 36-----"],~
+      state.area << [11, 13]
+** Processing line: ~      state.area << [12, 13]~
 - Inside source: true
 *** True Line Result
-        [ 4, 38,  8, 8, "Name: Matthew--- R. Sex: Male--- Age-- at-- Departure: 36-----"],
-** Processing line: ~        [14, 38, 46, 8, "Tribute-- Text: Matthew graduated-- Magna-- Cum-- Laude-- from MIT--- with-- a- PHD---- in Aero-- Nautical--- Engineering. He was immensely--- competitive, and had an insatiable---- thirst- for aerial-- battle. From the age of twenty, he remained-- undefeated--- in the Israeli-- Air- Force- \"Blue Flag\" combat-- exercises. By the age of 29--- he had already-- risen through- the ranks, and became-- the Lieutenant--- General--- of Lufwaffe. Matthew-- volenteered-- to- pilot-- Mission-- Serenity. To- this day, his wife- and son- are pillars-- of strength- for us. Rest- in Peace- Matthew, we are sorry-- that- news of the pregancy-- never-- reached- you. Please forgive us."],~
+      state.area << [12, 13]
+** Processing line: ~      state.area << [12, 12]~
 - Inside source: true
 *** True Line Result
-        [14, 38, 46, 8, "Tribute-- Text: Matthew graduated-- Magna-- Cum-- Laude-- from MIT--- with-- a- PHD---- in Aero-- Nautical--- Engineering. He was immensely--- competitive, and had an insatiable---- thirst- for aerial-- battle. From the age of twenty, he remained-- undefeated--- in the Israeli-- Air- Force- \"Blue Flag\" combat-- exercises. By the age of 29--- he had already-- risen through- the ranks, and became-- the Lieutenant--- General--- of Lufwaffe. Matthew-- volenteered-- to- pilot-- Mission-- Serenity. To- this day, his wife- and son- are pillars-- of strength- for us. Rest- in Peace- Matthew, we are sorry-- that- news of the pregancy-- never-- reached- you. Please forgive us."],
-** Processing line: ~~
+      state.area << [12, 12]
+** Processing line: ~      state.area << [8, 12]~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~        [4,  26,  8, 8, "Name: Aanka--- P. Sex: Female--- Age-- at-- Departure: 9-----"],~
+      state.area << [8, 12]
+** Processing line: ~      state.area << [9, 12]~
 - Inside source: true
 *** True Line Result
-        [4,  26,  8, 8, "Name: Aanka--- P. Sex: Female--- Age-- at-- Departure: 9-----"],
-** Processing line: ~        [14, 26, 46, 8, "Tribute-- Text: Aanka--- gratuated--- Magna-- Cum- Laude-- from MIT, at- the- age- of eight, with a- PHD---- in Astro-- Physics. Her-- IQ--- was over 390, the highest-- ever- recorded--- IQ-- in- human-- history. She changed- the landscape-- of Physics-- with her efforts- in- unravelling--- the mysteries--- of- Dark- Matter--. Anka discovered-- the threat- of Halley's-- Comet-- collision--- with Earth. She spear headed-- the global-- effort-- for Misson-- Serenity. Her- multilingual--- address-- to- the world-- brought- us all hope."],~
+      state.area << [9, 12]
+** Processing line: ~      state.area << [10, 12]~
 - Inside source: true
 *** True Line Result
-        [14, 26, 46, 8, "Tribute-- Text: Aanka--- gratuated--- Magna-- Cum- Laude-- from MIT, at- the- age- of eight, with a- PHD---- in Astro-- Physics. Her-- IQ--- was over 390, the highest-- ever- recorded--- IQ-- in- human-- history. She changed- the landscape-- of Physics-- with her efforts- in- unravelling--- the mysteries--- of- Dark- Matter--. Anka discovered-- the threat- of Halley's-- Comet-- collision--- with Earth. She spear headed-- the global-- effort-- for Misson-- Serenity. Her- multilingual--- address-- to- the world-- brought- us all hope."],
-** Processing line: ~~
+      state.area << [10, 12]
+** Processing line: ~      state.area << [11, 12]~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~        [4,  14,  8, 8, "Name: Sasha--- N. Sex: Female--- Age-- at-- Departure: 29-----"],~
+      state.area << [11, 12]
+** Processing line: ~      state.area << [12, 11]~
 - Inside source: true
 *** True Line Result
-        [4,  14,  8, 8, "Name: Sasha--- N. Sex: Female--- Age-- at-- Departure: 29-----"],
-** Processing line: ~        [14, 14, 46, 8, "Tribute-- Text: Sasha gratuated-- Magna-- Cum- Laude-- from MIT--- with-- a- PHD---- in Computer---- Science----. She-- was-- brilliant--, strong- willed--, and-- a-- stunningly--- beautiful--- woman---. Sasha---- is- the- creator--- of the world's--- first- Ruby--- Quantum-- Machine---. After-- much- critical--- acclaim--, the Quantum-- Computer-- was placed in MIT's---- Museam-- next- to- Richard--- G. and Thomas--- K.'s---- Lisp-- Machine---. Her- engineering--- skills-- were-- paramount--- for Mission--- Serenity's--- success. Humanity-- misses-- you-- dearly,-- Sasha--. Life-- shines-- a dimmer-- light-- now- that- your- angelic- voice-- can never- be heard- again."],~
+      state.area << [12, 11]
+** Processing line: ~      state.area << [13, 11]~
 - Inside source: true
 *** True Line Result
-        [14, 14, 46, 8, "Tribute-- Text: Sasha gratuated-- Magna-- Cum- Laude-- from MIT--- with-- a- PHD---- in Computer---- Science----. She-- was-- brilliant--, strong- willed--, and-- a-- stunningly--- beautiful--- woman---. Sasha---- is- the- creator--- of the world's--- first- Ruby--- Quantum-- Machine---. After-- much- critical--- acclaim--, the Quantum-- Computer-- was placed in MIT's---- Museam-- next- to- Richard--- G. and Thomas--- K.'s---- Lisp-- Machine---. Her- engineering--- skills-- were-- paramount--- for Mission--- Serenity's--- success. Humanity-- misses-- you-- dearly,-- Sasha--. Life-- shines-- a dimmer-- light-- now- that- your- angelic- voice-- can never- be heard- again."],
-** Processing line: ~      ],~
+      state.area << [13, 11]
+** Processing line: ~      state.area << [13, 10]~
 - Inside source: true
 *** True Line Result
-      ],
-** Processing line: ~      scenes: [~
+      state.area << [13, 10]
+** Processing line: ~      state.area << [13, 9]~
 - Inside source: true
 *** True Line Result
-      scenes: [
-** Processing line: ~        [*hotspot_bottom, :serenity_bio_finally_to_bed]~
+      state.area << [13, 9]
+** Processing line: ~      state.area << [13, 8]~
 - Inside source: true
 *** True Line Result
-        [*hotspot_bottom, :serenity_bio_finally_to_bed]
-** Processing line: ~      ]~
+      state.area << [13, 8]
+** Processing line: ~      state.area << [13, 7]~
 - Inside source: true
 *** True Line Result
-      ]
-** Processing line: ~    }~
+      state.area << [13, 7]
+** Processing line: ~      state.area << [13, 6]~
 - Inside source: true
 *** True Line Result
-    }
-** Processing line: ~  end~
+      state.area << [13, 6]
+** Processing line: ~      state.area << [12, 6]~
 - Inside source: true
 *** True Line Result
-  end
-** Processing line: ~~
+      state.area << [12, 6]
+** Processing line: ~      state.area << [14, 6]~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~  def serenity_bio_finally_to_bed args~
+      state.area << [14, 6]
+** Processing line: ~      state.area << [14, 5]~
 - Inside source: true
 *** True Line Result
-  def serenity_bio_finally_to_bed args
-** Processing line: ~    {~
+      state.area << [14, 5]
+** Processing line: ~      state.area << [13, 5]~
 - Inside source: true
 *** True Line Result
-    {
-** Processing line: ~      fade: 60,~
+      state.area << [13, 5]
+** Processing line: ~      state.area << [12, 5]~
 - Inside source: true
 *** True Line Result
-      fade: 60,
-** Processing line: ~      background: 'sprites/inside-home.png',~
+      state.area << [12, 5]
+** Processing line: ~      state.area << [12, 4]~
 - Inside source: true
 *** True Line Result
-      background: 'sprites/inside-home.png',
-** Processing line: ~      player: [35, 3],~
+      state.area << [12, 4]
+** Processing line: ~      state.area << [13, 4]~
 - Inside source: true
 *** True Line Result
-      player: [35, 3],
-** Processing line: ~      storylines: [~
+      state.area << [13, 4]
+** Processing line: ~      state.area << [14, 4]~
 - Inside source: true
 *** True Line Result
-      storylines: [
-** Processing line: ~        [34, 4, 4, 4, "Maybe-- I'll-- be able-- to sleep- now..."],~
+      state.area << [14, 4]
+** Processing line: ~      state.area << [1, 6]~
 - Inside source: true
 *** True Line Result
-        [34, 4, 4, 4, "Maybe-- I'll-- be able-- to sleep- now..."],
-** Processing line: ~      ],~
+      state.area << [1, 6]
+** Processing line: ~      state.area << [6, 6]~
 - Inside source: true
 *** True Line Result
-      ],
-** Processing line: ~      scenes: [~
+      state.area << [6, 6]
+** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
-      scenes: [
-** Processing line: ~        [32, 38, 10, 13, :bad_dream],~
+    end
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-        [32, 38, 10, 13, :bad_dream],
-** Processing line: ~      ]~
+
+** Processing line: ~    # Starts with an empty dungeon collection, and adds dungeon cells into it.~
 - Inside source: true
 *** True Line Result
-      ]
-** Processing line: ~    }~
+    # Starts with an empty dungeon collection, and adds dungeon cells into it.
+** Processing line: ~    def derive_dungeon_from_area~
 - Inside source: true
 *** True Line Result
-    }
-** Processing line: ~  end~
+    def derive_dungeon_from_area
+** Processing line: ~      state.dungeon = [] # starts as empty collection~
 - Inside source: true
 *** True Line Result
-  end
+      state.dungeon = [] # starts as empty collection
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~  def bad_dream args~
+** Processing line: ~      state.area.each do |a| # for each element of the area collection~
 - Inside source: true
 *** True Line Result
-  def bad_dream args
-** Processing line: ~    {~
+      state.area.each do |a| # for each element of the area collection
+** Processing line: ~        state.dungeon << state.new_entity(:dungeon_cell) do |d| # declares each dungeon cell as new entity~
 - Inside source: true
 *** True Line Result
-    {
-** Processing line: ~      fade: 120,~
+        state.dungeon << state.new_entity(:dungeon_cell) do |d| # declares each dungeon cell as new entity
+** Processing line: ~          d.x = a.x # dungeon cell position using coordinates from area~
 - Inside source: true
 *** True Line Result
-      fade: 120,
-** Processing line: ~      background: 'sprites/inside-home.png',~
+          d.x = a.x # dungeon cell position using coordinates from area
+** Processing line: ~          d.y = a.y~
 - Inside source: true
 *** True Line Result
-      background: 'sprites/inside-home.png',
-** Processing line: ~      player: [34, 35],~
+          d.y = a.y
+** Processing line: ~          d.is_visible = false # cell is not visible~
 - Inside source: true
 *** True Line Result
-      player: [34, 35],
-** Processing line: ~      storylines: [~
+          d.is_visible = false # cell is not visible
+** Processing line: ~          d.alpha = 0 # not transparent at all~
 - Inside source: true
 *** True Line Result
-      storylines: [
-** Processing line: ~        [34, 34, 4, 4, "Man. I did not- sleep- well- at all..."],~
+          d.alpha = 0 # not transparent at all
+** Processing line: ~          d.border = [left_margin   + a.x * grid_size,~
 - Inside source: true
 *** True Line Result
-        [34, 34, 4, 4, "Man. I did not- sleep- well- at all..."],
-** Processing line: ~      ],~
+          d.border = [left_margin   + a.x * grid_size,
+** Processing line: ~                      bottom_margin + a.y * grid_size,~
 - Inside source: true
 *** True Line Result
-      ],
-** Processing line: ~      scenes: [~
+                      bottom_margin + a.y * grid_size,
+** Processing line: ~                      grid_size,~
 - Inside source: true
 *** True Line Result
-      scenes: [
-** Processing line: ~        [32, -1, 8, 3, :bad_dream_observatory]~
+                      grid_size,
+** Processing line: ~                      grid_size,~
 - Inside source: true
 *** True Line Result
-        [32, -1, 8, 3, :bad_dream_observatory]
-** Processing line: ~      ]~
+                      grid_size,
+** Processing line: ~                      *blue,~
 - Inside source: true
 *** True Line Result
-      ]
-** Processing line: ~    }~
+                      *blue,
+** Processing line: ~                      255] # sets border definition for dungeon cell~
 - Inside source: true
 *** True Line Result
-    }
-** Processing line: ~  end~
+                      255] # sets border definition for dungeon cell
+** Processing line: ~          d # returns dungeon cell~
 - Inside source: true
 *** True Line Result
-  end
-** Processing line: ~~
+          d # returns dungeon cell
+** Processing line: ~        end~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~  def bad_dream_observatory args~
+        end
+** Processing line: ~      end~
 - Inside source: true
 *** True Line Result
-  def bad_dream_observatory args
-** Processing line: ~    {~
+      end
+** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
-    {
-** Processing line: ~      background: 'sprites/inside-observatory.png',~
+    end
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-      background: 'sprites/inside-observatory.png',
-** Processing line: ~      fade: 120,~
+
+** Processing line: ~    def left_margin~
 - Inside source: true
 *** True Line Result
-      fade: 120,
-** Processing line: ~      player: [51, 12],~
+    def left_margin
+** Processing line: ~      40  # sets left margin~
 - Inside source: true
 *** True Line Result
-      player: [51, 12],
-** Processing line: ~      storylines: [~
+      40  # sets left margin
+** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
-      storylines: [
-** Processing line: ~        [50, 10, 4, 4,   "Breathe, Hiro. Just see what's there... everything--- will- be okay."]~
+    end
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-        [50, 10, 4, 4,   "Breathe, Hiro. Just see what's there... everything--- will- be okay."]
-** Processing line: ~      ],~
+
+** Processing line: ~    def bottom_margin~
 - Inside source: true
 *** True Line Result
-      ],
-** Processing line: ~      scenes: [~
+    def bottom_margin
+** Processing line: ~      60 # sets bottom margin~
 - Inside source: true
 *** True Line Result
-      scenes: [
-** Processing line: ~        [30, 18, 5, 12, :bad_dream_inside_mainframe]~
+      60 # sets bottom margin
+** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
-        [30, 18, 5, 12, :bad_dream_inside_mainframe]
-** Processing line: ~      ],~
+    end
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-      ],
-** Processing line: ~      render_override: :blinking_light_inside_observatory_render~
+
+** Processing line: ~    def grid_size~
 - Inside source: true
 *** True Line Result
-      render_override: :blinking_light_inside_observatory_render
-** Processing line: ~    }~
+    def grid_size
+** Processing line: ~      40 # sets size of grid square~
 - Inside source: true
 *** True Line Result
-    }
-** Processing line: ~  end~
+      40 # sets size of grid square
+** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
-  end
+    end
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~  def bad_dream_inside_mainframe args~
+** Processing line: ~    # Updates the line of sight by calling the thick_line_of_sight method and~
 - Inside source: true
 *** True Line Result
-  def bad_dream_inside_mainframe args
-** Processing line: ~    {~
+    # Updates the line of sight by calling the thick_line_of_sight method and
+** Processing line: ~    # adding dungeon cells to the newly_visible collection~
 - Inside source: true
 *** True Line Result
-    {
-** Processing line: ~      player: [32, 4],~
+    # adding dungeon cells to the newly_visible collection
+** Processing line: ~    def update_line_of_sight~
 - Inside source: true
 *** True Line Result
-      player: [32, 4],
-** Processing line: ~      background: 'sprites/mainframe.png',~
+    def update_line_of_sight
+** Processing line: ~      variations = [-1, 0, 1]~
 - Inside source: true
 *** True Line Result
-      background: 'sprites/mainframe.png',
-** Processing line: ~      fade: 120,~
+      variations = [-1, 0, 1]
+** Processing line: ~      # creates collection of newly visible dungeon cells~
 - Inside source: true
 *** True Line Result
-      fade: 120,
-** Processing line: ~      storylines: [~
+      # creates collection of newly visible dungeon cells
+** Processing line: ~      newly_visible = variations.product(variations).flat_map do |rise, run| # combo of all elements~
 - Inside source: true
 *** True Line Result
-      storylines: [
-** Processing line: ~        [22, 45, 17, 4, (bad_dream_last_reply args)],~
+      newly_visible = variations.product(variations).flat_map do |rise, run| # combo of all elements
+** Processing line: ~        thick_line_of_sight state.x, state.y, rise, run, 15, # calls thick_line_of_sight method~
 - Inside source: true
 *** True Line Result
-        [22, 45, 17, 4, (bad_dream_last_reply args)],
-** Processing line: ~      ],~
+        thick_line_of_sight state.x, state.y, rise, run, 15, # calls thick_line_of_sight method
+** Processing line: ~                            lambda { |x, y| dungeon_cell_exists? x, y } # checks whether or not cell exists~
 - Inside source: true
 *** True Line Result
-      ],
-** Processing line: ~      scenes: [~
+                            lambda { |x, y| dungeon_cell_exists? x, y } # checks whether or not cell exists
+** Processing line: ~      end.uniq# removes duplicates~
 - Inside source: true
 *** True Line Result
-      scenes: [
-** Processing line: ~        [45, 45,  4, 4, :bad_dream_everyone_dead],~
+      end.uniq# removes duplicates
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-        [45, 45,  4, 4, :bad_dream_everyone_dead],
-** Processing line: ~      ]~
+
+** Processing line: ~      state.dungeon.each do |d| # perform action on each element of dungeons collection~
 - Inside source: true
 *** True Line Result
-      ]
-** Processing line: ~    }~
+      state.dungeon.each do |d| # perform action on each element of dungeons collection
+** Processing line: ~        d.is_visible = newly_visible.find { |v| v.x == d.x && v.y == d.y } # finds match inside newly_visible collection~
 - Inside source: true
 *** True Line Result
-    }
-** Processing line: ~  end~
+        d.is_visible = newly_visible.find { |v| v.x == d.x && v.y == d.y } # finds match inside newly_visible collection
+** Processing line: ~      end~
 - Inside source: true
 *** True Line Result
-  end
+      end
+** Processing line: ~    end~
+- Inside source: true
+*** True Line Result
+    end
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~  def bad_dream_everyone_dead args~
+** Processing line: ~    #Returns a boolean value~
 - Inside source: true
 *** True Line Result
-  def bad_dream_everyone_dead args
-** Processing line: ~    {~
+    #Returns a boolean value
+** Processing line: ~    def dungeon_cell_exists? x, y~
 - Inside source: true
 *** True Line Result
-    {
-** Processing line: ~      background: 'sprites/mainframe.png',~
+    def dungeon_cell_exists? x, y
+** Processing line: ~      # Finds cell coordinates inside dungeon collection to determine if dungeon cell exists~
 - Inside source: true
 *** True Line Result
-      background: 'sprites/mainframe.png',
-** Processing line: ~      storylines: [~
+      # Finds cell coordinates inside dungeon collection to determine if dungeon cell exists
+** Processing line: ~      state.dungeon.find { |d| d.x == x && d.y == y }~
 - Inside source: true
 *** True Line Result
-      storylines: [
-** Processing line: ~        [22, 45, 17, 4, (bad_dream_last_reply args)],~
+      state.dungeon.find { |d| d.x == x && d.y == y }
+** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
-        [22, 45, 17, 4, (bad_dream_last_reply args)],
-** Processing line: ~        [45, 45,  4, 4, "Hi-- Hiro. This is Sasha. By the time- you get this- message, chances-- are we will- already-- be- dead. The batteries--- got- damaged-- during-- removal. And- we don't-- have enough-- power-- for Life-- Support. The air-- is- already--- starting-- to taste- bad. It... would- have been- nice... to go- on a date--- with- you-- when-- I- got- back- to Earth. Anyways, good-- bye-- Hiro-- XOXOXO----"],~
+    end
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-        [45, 45,  4, 4, "Hi-- Hiro. This is Sasha. By the time- you get this- message, chances-- are we will- already-- be- dead. The batteries--- got- damaged-- during-- removal. And- we don't-- have enough-- power-- for Life-- Support. The air-- is- already--- starting-- to taste- bad. It... would- have been- nice... to go- on a date--- with- you-- when-- I- got- back- to Earth. Anyways, good-- bye-- Hiro-- XOXOXO----"],
-** Processing line: ~        [22,  5, 17, 4, "Meh. Whatever, I didn't-- want to save them anyways. What- a pain- in my ass."],~
+
+** Processing line: ~    # Calls line_of_sight method to add elements to result collection~
 - Inside source: true
 *** True Line Result
-        [22,  5, 17, 4, "Meh. Whatever, I didn't-- want to save them anyways. What- a pain- in my ass."],
-** Processing line: ~      ],~
+    # Calls line_of_sight method to add elements to result collection
+** Processing line: ~    def thick_line_of_sight start_x, start_y, rise, run, distance, cell_exists_lambda~
 - Inside source: true
 *** True Line Result
-      ],
-** Processing line: ~      scenes: [~
+    def thick_line_of_sight start_x, start_y, rise, run, distance, cell_exists_lambda
+** Processing line: ~      result = []~
 - Inside source: true
 *** True Line Result
-      scenes: [
-** Processing line: ~        [*hotspot_bottom, :anka_inside_room]~
+      result = []
+** Processing line: ~      result += line_of_sight start_x, start_y, rise, run, distance, cell_exists_lambda~
 - Inside source: true
 *** True Line Result
-        [*hotspot_bottom, :anka_inside_room]
-** Processing line: ~      ]~
+      result += line_of_sight start_x, start_y, rise, run, distance, cell_exists_lambda
+** Processing line: ~      result += line_of_sight start_x - 1, start_y, rise, run, distance, cell_exists_lambda # one left~
 - Inside source: true
 *** True Line Result
-      ]
-** Processing line: ~    }~
+      result += line_of_sight start_x - 1, start_y, rise, run, distance, cell_exists_lambda # one left
+** Processing line: ~      result += line_of_sight start_x + 1, start_y, rise, run, distance, cell_exists_lambda # one right~
 - Inside source: true
 *** True Line Result
-    }
-** Processing line: ~  end~
+      result += line_of_sight start_x + 1, start_y, rise, run, distance, cell_exists_lambda # one right
+** Processing line: ~      result~
 - Inside source: true
 *** True Line Result
-  end
+      result
+** Processing line: ~    end~
+- Inside source: true
+*** True Line Result
+    end
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~  def bad_dream_last_reply args~
+** Processing line: ~    # Adds points to the result collection to create the player's line of sight~
 - Inside source: true
 *** True Line Result
-  def bad_dream_last_reply args
-** Processing line: ~    if args.state.scene_history.include? :replied_to_serenity_alive_firmly~
+    # Adds points to the result collection to create the player's line of sight
+** Processing line: ~    def line_of_sight start_x, start_y, rise, run, distance, cell_exists_lambda~
 - Inside source: true
 *** True Line Result
-    if args.state.scene_history.include? :replied_to_serenity_alive_firmly
-** Processing line: ~      return "Buffer--: #{serenity_alive_firm_reply.quote}"~
+    def line_of_sight start_x, start_y, rise, run, distance, cell_exists_lambda
+** Processing line: ~      result = [] # starts as empty collection~
 - Inside source: true
 *** True Line Result
-      return "Buffer--: #{serenity_alive_firm_reply.quote}"
-** Processing line: ~    else~
+      result = [] # starts as empty collection
+** Processing line: ~      points = points_on_line start_x, start_y, rise, run, distance # calls points_on_line method~
 - Inside source: true
 *** True Line Result
-    else
-** Processing line: ~      return "Buffer--: #{serenity_alive_sugarcoated_reply.quote}"~
+      points = points_on_line start_x, start_y, rise, run, distance # calls points_on_line method
+** Processing line: ~      points.each do |p| # for each point in collection~
 - Inside source: true
 *** True Line Result
-      return "Buffer--: #{serenity_alive_sugarcoated_reply.quote}"
-** Processing line: ~    end~
+      points.each do |p| # for each point in collection
+** Processing line: ~        if cell_exists_lambda.call(p.x, p.y) # if the cell exists~
 - Inside source: true
 *** True Line Result
-    end
-** Processing line: ~  end~
+        if cell_exists_lambda.call(p.x, p.y) # if the cell exists
+** Processing line: ~          result << p # add it to result collection~
 - Inside source: true
 *** True Line Result
-  end
-** Processing line: ~~
+          result << p # add it to result collection
+** Processing line: ~        else # if cell does not exist~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~#+end_src~
-- Line was identified as the end of a code block.
-*** True Line Result
-#+end_src
-** Processing line: ~~
-- End of paragraph detected.
+        else # if cell does not exist
+** Processing line: ~          return result # return result collection as it is~
+- Inside source: true
 *** True Line Result
-
-** Processing line: ~*** Rpg Narrative - Return Of Serenity - storyline_serenity_introduction.rb~
-- Header detected.
+          return result # return result collection as it is
+** Processing line: ~        end~
+- Inside source: true
 *** True Line Result
-
+        end
+** Processing line: ~      end~
+- Inside source: true
 *** True Line Result
-*** Rpg Narrative - Return Of Serenity - storyline_serenity_introduction.rb
-** Processing line: ~#+begin_src ruby~
-- Line was identified as the beginning of a code block.
+      end
+** Processing line: ~~
+- Inside source: true
 *** True Line Result
 
-*** True Line Result
-#+begin_src ruby
-** Processing line: ~  # ./samples/99_genre_rpg_narrative/return_of_serenity/app/storyline_serenity_introduction.rb~
+** Processing line: ~      result # return result collection~
 - Inside source: true
 *** True Line Result
-  # ./samples/99_genre_rpg_narrative/return_of_serenity/app/storyline_serenity_introduction.rb
-** Processing line: ~  # decision_graph "Message from Sasha",~
+      result # return result collection
+** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
-  # decision_graph "Message from Sasha",
-** Processing line: ~  #                "I should reply.",~
+    end
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-  #                "I should reply.",
-** Processing line: ~  #                [:replied_to_introduction_seriously,  "Reply Seriously", "Who is this?"],~
+
+** Processing line: ~    # Finds the coordinates of the points on the line by performing calculations~
 - Inside source: true
 *** True Line Result
-  #                [:replied_to_introduction_seriously,  "Reply Seriously", "Who is this?"],
-** Processing line: ~  # [:replied_to_introduction_humorously, "Reply Humorously", "New phone who dis?"]~
+    # Finds the coordinates of the points on the line by performing calculations
+** Processing line: ~    def points_on_line start_x, start_y, rise, run, distance~
 - Inside source: true
 *** True Line Result
-  # [:replied_to_introduction_humorously, "Reply Humorously", "New phone who dis?"]
-** Processing line: ~  def reply_to_introduction args~
+    def points_on_line start_x, start_y, rise, run, distance
+** Processing line: ~      distance.times.map do |i| # perform an action~
 - Inside source: true
 *** True Line Result
-  def reply_to_introduction args
-** Processing line: ~    decision_graph  "\"Mission-- control--, your- main- comm-- channels-- seem-- to be down. My apologies-- for- using-- this low- level-- exploit--. What's-- going-- on down there? We are ready-- for reentry--.\" Message--- Timestamp---: 4- hours-- 23--- minutes-- ago--.",~
+      distance.times.map do |i| # perform an action
+** Processing line: ~        [start_x + run * i, start_y + rise * i] # definition of point~
 - Inside source: true
 *** True Line Result
-    decision_graph  "\"Mission-- control--, your- main- comm-- channels-- seem-- to be down. My apologies-- for- using-- this low- level-- exploit--. What's-- going-- on down there? We are ready-- for reentry--.\" Message--- Timestamp---: 4- hours-- 23--- minutes-- ago--.",
-** Processing line: ~                    "Whoever-- pulled- off this exploit-- knows their stuff. I should reply--.",~
+        [start_x + run * i, start_y + rise * i] # definition of point
+** Processing line: ~      end~
 - Inside source: true
 *** True Line Result
-                    "Whoever-- pulled- off this exploit-- knows their stuff. I should reply--.",
-** Processing line: ~                    [:replied_to_introduction_seriously,  "Serious Reply",  "Hello, Who- is sending-- this message--?"],~
+      end
+** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
-                    [:replied_to_introduction_seriously,  "Serious Reply",  "Hello, Who- is sending-- this message--?"],
-** Processing line: ~                    [:replied_to_introduction_humorously, "Humorous Reply", "New phone, who dis?"]~
+    end
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-                    [:replied_to_introduction_humorously, "Humorous Reply", "New phone, who dis?"]
-** Processing line: ~  end~
+
+** Processing line: ~    def render_canvas~
 - Inside source: true
 *** True Line Result
-  end
-** Processing line: ~~
+    def render_canvas
+** Processing line: ~      return~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~  def replied_to_introduction_seriously args~
+      return
+** Processing line: ~      outputs.borders << state.canvas.map do |c| # on each element of canvas collection~
 - Inside source: true
 *** True Line Result
-  def replied_to_introduction_seriously args
-** Processing line: ~    {~
+      outputs.borders << state.canvas.map do |c| # on each element of canvas collection
+** Processing line: ~        c.border # outputs border~
 - Inside source: true
 *** True Line Result
-    {
-** Processing line: ~      background: 'sprites/inside-observatory.png',~
+        c.border # outputs border
+** Processing line: ~      end~
 - Inside source: true
 *** True Line Result
-      background: 'sprites/inside-observatory.png',
-** Processing line: ~      fade: 60,~
+      end
+** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
-      fade: 60,
-** Processing line: ~      player: [32, 21],~
+    end
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-      player: [32, 21],
-** Processing line: ~      scenes: [~
+
+** Processing line: ~    # Outputs the dungeon cells.~
 - Inside source: true
 *** True Line Result
-      scenes: [
-** Processing line: ~        *replied_to_introduction_shared_scenes(args)~
+    # Outputs the dungeon cells.
+** Processing line: ~    def render_dungeon~
 - Inside source: true
 *** True Line Result
-        *replied_to_introduction_shared_scenes(args)
-** Processing line: ~      ],~
+    def render_dungeon
+** Processing line: ~      outputs.solids << [0, 0, grid.w, grid.h] # outputs black background for grid~
 - Inside source: true
 *** True Line Result
-      ],
-** Processing line: ~      storylines: [~
+      outputs.solids << [0, 0, grid.w, grid.h] # outputs black background for grid
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-      storylines: [
-** Processing line: ~        [30, 18, 5, 12, "Buffer-- has been set to: \"Hello, Who- is sending-- this message--?\""],~
+
+** Processing line: ~      # Sets the alpha value (opacity) for each dungeon cell and calls the cell_border method.~
 - Inside source: true
 *** True Line Result
-        [30, 18, 5, 12, "Buffer-- has been set to: \"Hello, Who- is sending-- this message--?\""],
-** Processing line: ~        *replied_to_introduction_shared_storylines(args)~
+      # Sets the alpha value (opacity) for each dungeon cell and calls the cell_border method.
+** Processing line: ~      outputs.borders << state.dungeon.map do |d| # for each element in dungeon collection~
 - Inside source: true
 *** True Line Result
-        *replied_to_introduction_shared_storylines(args)
-** Processing line: ~      ]~
+      outputs.borders << state.dungeon.map do |d| # for each element in dungeon collection
+** Processing line: ~        d.alpha += if d.is_visible # if cell is visible~
 - Inside source: true
 *** True Line Result
-      ]
-** Processing line: ~    }~
+        d.alpha += if d.is_visible # if cell is visible
+** Processing line: ~                   255.fdiv(30) # increment opacity (transparency)~
 - Inside source: true
 *** True Line Result
-    }
-** Processing line: ~  end~
+                   255.fdiv(30) # increment opacity (transparency)
+** Processing line: ~                 else # if cell is not visible~
 - Inside source: true
 *** True Line Result
-  end
-** Processing line: ~~
+                 else # if cell is not visible
+** Processing line: ~                   255.fdiv(600) * -1 # decrease opacity~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~  def replied_to_introduction_humorously args~
+                   255.fdiv(600) * -1 # decrease opacity
+** Processing line: ~                 end~
 - Inside source: true
 *** True Line Result
-  def replied_to_introduction_humorously args
-** Processing line: ~    {~
+                 end
+** Processing line: ~        d.alpha = d.alpha.cap_min_max(0, 255)~
 - Inside source: true
 *** True Line Result
-    {
-** Processing line: ~      background: 'sprites/inside-observatory.png',~
+        d.alpha = d.alpha.cap_min_max(0, 255)
+** Processing line: ~        cell_border d.x, d.y, [*blue, d.alpha] # sets blue border using alpha value~
 - Inside source: true
 *** True Line Result
-      background: 'sprites/inside-observatory.png',
-** Processing line: ~      fade: 60,~
+        cell_border d.x, d.y, [*blue, d.alpha] # sets blue border using alpha value
+** Processing line: ~      end.reject_nil~
 - Inside source: true
 *** True Line Result
-      fade: 60,
-** Processing line: ~      player: [32, 21],~
+      end.reject_nil
+** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
-      player: [32, 21],
-** Processing line: ~      scenes: [~
+    end
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-      scenes: [
-** Processing line: ~        *replied_to_introduction_shared_scenes(args)~
+
+** Processing line: ~    # Sets definition of a cell border using the parameters~
 - Inside source: true
 *** True Line Result
-        *replied_to_introduction_shared_scenes(args)
-** Processing line: ~      ],~
+    # Sets definition of a cell border using the parameters
+** Processing line: ~    def cell_border x, y, color = nil~
 - Inside source: true
 *** True Line Result
-      ],
-** Processing line: ~      storylines: [~
+    def cell_border x, y, color = nil
+** Processing line: ~      [left_margin   + x * grid_size,~
 - Inside source: true
 *** True Line Result
-      storylines: [
-** Processing line: ~        [30, 18, 5, 12, "Buffer-- has been set to: \"New- phone. Who dis?\""],~
+      [left_margin   + x * grid_size,
+** Processing line: ~      bottom_margin + y * grid_size,~
 - Inside source: true
 *** True Line Result
-        [30, 18, 5, 12, "Buffer-- has been set to: \"New- phone. Who dis?\""],
-** Processing line: ~        *replied_to_introduction_shared_storylines(args)~
+      bottom_margin + y * grid_size,
+** Processing line: ~      grid_size,~
 - Inside source: true
 *** True Line Result
-        *replied_to_introduction_shared_storylines(args)
-** Processing line: ~      ]~
+      grid_size,
+** Processing line: ~      grid_size,~
 - Inside source: true
 *** True Line Result
-      ]
-** Processing line: ~    }~
+      grid_size,
+** Processing line: ~      *color]~
 - Inside source: true
 *** True Line Result
-    }
-** Processing line: ~  end~
+      *color]
+** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
-  end
+    end
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~  def replied_to_introduction_shared_storylines args~
+** Processing line: ~    # Sets the values for the player and outputs it as a label~
 - Inside source: true
 *** True Line Result
-  def replied_to_introduction_shared_storylines args
-** Processing line: ~    [~
+    # Sets the values for the player and outputs it as a label
+** Processing line: ~    def render_player~
 - Inside source: true
 *** True Line Result
-    [
-** Processing line: ~      [30, 10, 5, 4, "It's-- going-- to take a while-- for this reply-- to make it's-- way back."],~
+    def render_player
+** Processing line: ~      outputs.labels << [grid_x(state.x) + 20, # positions "@" text in center of grid square~
 - Inside source: true
 *** True Line Result
-      [30, 10, 5, 4, "It's-- going-- to take a while-- for this reply-- to make it's-- way back."],
-** Processing line: ~      [40, 10, 5, 4, "4- hours-- to send a message-- at light speed?! How far away-- is the sender--?"],~
+      outputs.labels << [grid_x(state.x) + 20, # positions "@" text in center of grid square
+** Processing line: ~                       grid_y(state.y) + 35,~
 - Inside source: true
 *** True Line Result
-      [40, 10, 5, 4, "4- hours-- to send a message-- at light speed?! How far away-- is the sender--?"],
-** Processing line: ~      [50, 10, 5, 4, "I know- I've-- read about-- light- speed- travel-- before--. Maybe-- the library--- still has that- poster."]~
+                       grid_y(state.y) + 35,
+** Processing line: ~                       "@", # player is represented by a white "@" character~
 - Inside source: true
 *** True Line Result
-      [50, 10, 5, 4, "I know- I've-- read about-- light- speed- travel-- before--. Maybe-- the library--- still has that- poster."]
-** Processing line: ~    ]~
+                       "@", # player is represented by a white "@" character
+** Processing line: ~                       1, 1, *white]~
 - Inside source: true
 *** True Line Result
-    ]
-** Processing line: ~  end~
+                       1, 1, *white]
+** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
-  end
+    end
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~  def replied_to_introduction_shared_scenes args~
+** Processing line: ~    def grid_x x~
 - Inside source: true
 *** True Line Result
-  def replied_to_introduction_shared_scenes args
-** Processing line: ~    [[60, 0, 4, 32, :replied_to_introduction_observatory]]~
+    def grid_x x
+** Processing line: ~      left_margin + x * grid_size # positions horizontally on grid~
 - Inside source: true
 *** True Line Result
-    [[60, 0, 4, 32, :replied_to_introduction_observatory]]
-** Processing line: ~  end~
+      left_margin + x * grid_size # positions horizontally on grid
+** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
-  end
+    end
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~  def replied_to_introduction_observatory args~
-- Inside source: true
-*** True Line Result
-  def replied_to_introduction_observatory args
-** Processing line: ~    {~
+** Processing line: ~    def grid_y y~
 - Inside source: true
 *** True Line Result
-    {
-** Processing line: ~      background: 'sprites/observatory.png',~
+    def grid_y y
+** Processing line: ~      bottom_margin + y * grid_size # positions vertically on grid~
 - Inside source: true
 *** True Line Result
-      background: 'sprites/observatory.png',
-** Processing line: ~      player: [28, 39],~
+      bottom_margin + y * grid_size # positions vertically on grid
+** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
-      player: [28, 39],
-** Processing line: ~      scenes: [~
+    end
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-      scenes: [
-** Processing line: ~        [60, 0, 4, 32, :replied_to_introduction_path_to_observatory]~
+
+** Processing line: ~    # Outputs enemies onto the screen.~
 - Inside source: true
 *** True Line Result
-        [60, 0, 4, 32, :replied_to_introduction_path_to_observatory]
-** Processing line: ~      ]~
+    # Outputs enemies onto the screen.
+** Processing line: ~    def render_enemies~
 - Inside source: true
 *** True Line Result
-      ]
-** Processing line: ~    }~
+    def render_enemies
+** Processing line: ~      state.enemies.map do |e| # for each enemy in the collection~
 - Inside source: true
 *** True Line Result
-    }
-** Processing line: ~  end~
+      state.enemies.map do |e| # for each enemy in the collection
+** Processing line: ~        alpha = 255 # set opacity (full transparency)~
 - Inside source: true
 *** True Line Result
-  end
+        alpha = 255 # set opacity (full transparency)
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~  def replied_to_introduction_path_to_observatory args~
+** Processing line: ~        # Outputs an enemy using a label.~
 - Inside source: true
 *** True Line Result
-  def replied_to_introduction_path_to_observatory args
-** Processing line: ~    {~
+        # Outputs an enemy using a label.
+** Processing line: ~        outputs.labels << [~
 - Inside source: true
 *** True Line Result
-    {
-** Processing line: ~      background: 'sprites/path-to-observatory.png',~
+        outputs.labels << [
+** Processing line: ~                     left_margin + 20 +  e.x * grid_size, # positions enemy's "r" text in center of grid square~
 - Inside source: true
 *** True Line Result
-      background: 'sprites/path-to-observatory.png',
-** Processing line: ~      player: [0, 26],~
+                     left_margin + 20 +  e.x * grid_size, # positions enemy's "r" text in center of grid square
+** Processing line: ~                     bottom_margin + 35 + e.y * grid_size,~
 - Inside source: true
 *** True Line Result
-      player: [0, 26],
-** Processing line: ~      scenes: [~
+                     bottom_margin + 35 + e.y * grid_size,
+** Processing line: ~                     "r", # enemy's text~
 - Inside source: true
 *** True Line Result
-      scenes: [
-** Processing line: ~        [60, 0, 4, 20, :replied_to_introduction_mountain_pass]~
+                     "r", # enemy's text
+** Processing line: ~                     1, 1, *white, alpha]~
 - Inside source: true
 *** True Line Result
-        [60, 0, 4, 20, :replied_to_introduction_mountain_pass]
-** Processing line: ~      ],~
+                     1, 1, *white, alpha]
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-      ],
-** Processing line: ~    }~
+
+** Processing line: ~        # Creates a red border around an enemy.~
 - Inside source: true
 *** True Line Result
-    }
-** Processing line: ~  end~
+        # Creates a red border around an enemy.
+** Processing line: ~        outputs.borders << [grid_x(e.x), grid_y(e.y), grid_size, grid_size, *red]~
 - Inside source: true
 *** True Line Result
-  end
-** Processing line: ~~
+        outputs.borders << [grid_x(e.x), grid_y(e.y), grid_size, grid_size, *red]
+** Processing line: ~      end~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~  def replied_to_introduction_mountain_pass args~
+      end
+** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
-  def replied_to_introduction_mountain_pass args
-** Processing line: ~    {~
+    end
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-    {
-** Processing line: ~      background: 'sprites/mountain-pass-zoomed-out.png',~
+
+** Processing line: ~    #White labels are output for the cell coordinates of each element in the dungeon collection.~
 - Inside source: true
 *** True Line Result
-      background: 'sprites/mountain-pass-zoomed-out.png',
-** Processing line: ~      player: [21, 48],~
+    #White labels are output for the cell coordinates of each element in the dungeon collection.
+** Processing line: ~    def print_cell_coordinates~
 - Inside source: true
 *** True Line Result
-      player: [21, 48],
-** Processing line: ~      scenes: [~
+    def print_cell_coordinates
+** Processing line: ~      return unless state.debug~
 - Inside source: true
 *** True Line Result
-      scenes: [
-** Processing line: ~        [0, 0, 15, 4, :replied_to_introduction_side_of_home]~
+      return unless state.debug
+** Processing line: ~      state.dungeon.each do |d|~
 - Inside source: true
 *** True Line Result
-        [0, 0, 15, 4, :replied_to_introduction_side_of_home]
-** Processing line: ~      ],~
+      state.dungeon.each do |d|
+** Processing line: ~        outputs.labels << [grid_x(d.x) + 2,~
 - Inside source: true
 *** True Line Result
-      ],
-** Processing line: ~      storylines: [~
+        outputs.labels << [grid_x(d.x) + 2,
+** Processing line: ~                           grid_y(d.y) - 2,~
 - Inside source: true
 *** True Line Result
-      storylines: [
-** Processing line: ~        [15, 28, 5, 3, "At least I'm-- getting-- my- exercise-- in- for- today--."]~
+                           grid_y(d.y) - 2,
+** Processing line: ~                           "#{d.x},#{d.y}",~
 - Inside source: true
 *** True Line Result
-        [15, 28, 5, 3, "At least I'm-- getting-- my- exercise-- in- for- today--."]
-** Processing line: ~      ]~
+                           "#{d.x},#{d.y}",
+** Processing line: ~                           -2, 0, *white]~
 - Inside source: true
 *** True Line Result
-      ]
-** Processing line: ~    }~
+                           -2, 0, *white]
+** Processing line: ~      end~
 - Inside source: true
 *** True Line Result
-    }
-** Processing line: ~  end~
+      end
+** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
-  end
+    end
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~  def replied_to_introduction_side_of_home args~
+** Processing line: ~    # Adds new elements into the canvas collection and sets their values.~
 - Inside source: true
 *** True Line Result
-  def replied_to_introduction_side_of_home args
-** Processing line: ~    {~
+    # Adds new elements into the canvas collection and sets their values.
+** Processing line: ~    def calc_canvas~
 - Inside source: true
 *** True Line Result
-    {
-** Processing line: ~      background: 'sprites/side-of-home.png',~
+    def calc_canvas
+** Processing line: ~      return if state.canvas.length > 0 # return if canvas collection has at least one element~
 - Inside source: true
 *** True Line Result
-      background: 'sprites/side-of-home.png',
-** Processing line: ~      player: [58, 29],~
+      return if state.canvas.length > 0 # return if canvas collection has at least one element
+** Processing line: ~      15.times do |x| # 15 times perform an action~
 - Inside source: true
 *** True Line Result
-      player: [58, 29],
-** Processing line: ~      scenes: [~
+      15.times do |x| # 15 times perform an action
+** Processing line: ~        15.times do |y|~
 - Inside source: true
 *** True Line Result
-      scenes: [
-** Processing line: ~        [2, 0, 61, 2, :speed_of_light_front_of_home]~
+        15.times do |y|
+** Processing line: ~          state.canvas << state.new_entity(:canvas) do |c| # declare canvas element as new entity~
 - Inside source: true
 *** True Line Result
-        [2, 0, 61, 2, :speed_of_light_front_of_home]
-** Processing line: ~      ],~
+          state.canvas << state.new_entity(:canvas) do |c| # declare canvas element as new entity
+** Processing line: ~            c.x = x # set position~
 - Inside source: true
 *** True Line Result
-      ],
-** Processing line: ~    }~
+            c.x = x # set position
+** Processing line: ~            c.y = y~
 - Inside source: true
 *** True Line Result
-    }
-** Processing line: ~  end~
+            c.y = y
+** Processing line: ~            c.border = [left_margin   + x * grid_size,~
 - Inside source: true
 *** True Line Result
-  end
-** Processing line: ~~
+            c.border = [left_margin   + x * grid_size,
+** Processing line: ~                        bottom_margin + y * grid_size,~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~#+end_src~
-- Line was identified as the end of a code block.
-*** True Line Result
-#+end_src
-** Processing line: ~~
-- End of paragraph detected.
-*** True Line Result
-
-** Processing line: ~*** Rpg Narrative - Return Of Serenity - storyline_speed_of_light.rb~
-- Header detected.
-*** True Line Result
-
+                        bottom_margin + y * grid_size,
+** Processing line: ~                        grid_size,~
+- Inside source: true
 *** True Line Result
-*** Rpg Narrative - Return Of Serenity - storyline_speed_of_light.rb
-** Processing line: ~#+begin_src ruby~
-- Line was identified as the beginning of a code block.
+                        grid_size,
+** Processing line: ~                        grid_size,~
+- Inside source: true
 *** True Line Result
-
+                        grid_size,
+** Processing line: ~                        *white, 30] # sets border definition~
+- Inside source: true
 *** True Line Result
-#+begin_src ruby
-** Processing line: ~  # ./samples/99_genre_rpg_narrative/return_of_serenity/app/storyline_speed_of_light.rb~
+                        *white, 30] # sets border definition
+** Processing line: ~          end~
 - Inside source: true
 *** True Line Result
-  # ./samples/99_genre_rpg_narrative/return_of_serenity/app/storyline_speed_of_light.rb
-** Processing line: ~  def speed_of_light_front_of_home args~
+          end
+** Processing line: ~        end~
 - Inside source: true
 *** True Line Result
-  def speed_of_light_front_of_home args
-** Processing line: ~    {~
+        end
+** Processing line: ~      end~
 - Inside source: true
 *** True Line Result
-    {
-** Processing line: ~      background: 'sprites/front-of-home.png',~
+      end
+** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
-      background: 'sprites/front-of-home.png',
-** Processing line: ~      player: [54, 23],~
+    end
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-      player: [54, 23],
-** Processing line: ~      scenes: [~
+
+** Processing line: ~    # Updates x and y values of the player, and updates player's line of sight~
 - Inside source: true
 *** True Line Result
-      scenes: [
-** Processing line: ~        [44, 34, 8, 14, :speed_of_light_inside_home],~
+    # Updates x and y values of the player, and updates player's line of sight
+** Processing line: ~    def input_move~
 - Inside source: true
 *** True Line Result
-        [44, 34, 8, 14, :speed_of_light_inside_home],
-** Processing line: ~        [0, 3, 3, 22, :speed_of_light_outside_library]~
+    def input_move
+** Processing line: ~      x, y, x_diff, y_diff = input_target_cell~
 - Inside source: true
 *** True Line Result
-        [0, 3, 3, 22, :speed_of_light_outside_library]
-** Processing line: ~      ]~
+      x, y, x_diff, y_diff = input_target_cell
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-      ]
-** Processing line: ~    }~
+
+** Processing line: ~      return unless dungeon_cell_exists? x, y # player can't move there if a dungeon cell doesn't exist in that location~
 - Inside source: true
 *** True Line Result
-    }
-** Processing line: ~  end~
+      return unless dungeon_cell_exists? x, y # player can't move there if a dungeon cell doesn't exist in that location
+** Processing line: ~      return if enemy_at x, y # player can't move there if there is an enemy in that location~
 - Inside source: true
 *** True Line Result
-  end
+      return if enemy_at x, y # player can't move there if there is an enemy in that location
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~  def speed_of_light_inside_home args~
+** Processing line: ~      state.x += x_diff # increments x by x_diff (so player moves left or right)~
 - Inside source: true
 *** True Line Result
-  def speed_of_light_inside_home args
-** Processing line: ~    {~
+      state.x += x_diff # increments x by x_diff (so player moves left or right)
+** Processing line: ~      state.y += y_diff # same with y and y_diff ( so player moves up or down)~
 - Inside source: true
 *** True Line Result
-    {
-** Processing line: ~      background: 'sprites/inside-home.png',~
+      state.y += y_diff # same with y and y_diff ( so player moves up or down)
+** Processing line: ~      update_line_of_sight # updates visible cells~
 - Inside source: true
 *** True Line Result
-      background: 'sprites/inside-home.png',
-** Processing line: ~      player: [35, 4],~
+      update_line_of_sight # updates visible cells
+** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
-      player: [35, 4],
-** Processing line: ~      storylines: [~
+    end
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-      storylines: [
-** Processing line: ~        [30, 38, 12, 13, "Can't- sleep right now. I have to- find- out- why- it took- over-- 4- hours-- to receive-- that message."]~
+
+** Processing line: ~    def enemy_at x, y~
 - Inside source: true
 *** True Line Result
-        [30, 38, 12, 13, "Can't- sleep right now. I have to- find- out- why- it took- over-- 4- hours-- to receive-- that message."]
-** Processing line: ~      ],~
+    def enemy_at x, y
+** Processing line: ~      # Finds if coordinates exist in enemies collection and enemy is not dead~
 - Inside source: true
 *** True Line Result
-      ],
-** Processing line: ~      scenes: [~
+      # Finds if coordinates exist in enemies collection and enemy is not dead
+** Processing line: ~      state.enemies.find { |e| e.x == x && e.y == y && !e.is_dead }~
 - Inside source: true
 *** True Line Result
-      scenes: [
-** Processing line: ~        [32, 0, 8, 3, :speed_of_light_front_of_home],~
+      state.enemies.find { |e| e.x == x && e.y == y && !e.is_dead }
+** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
-        [32, 0, 8, 3, :speed_of_light_front_of_home],
-** Processing line: ~      ]~
+    end
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-      ]
-** Processing line: ~    }~
+
+** Processing line: ~    #M oves the user based on their keyboard input and sets values for target cell~
 - Inside source: true
 *** True Line Result
-    }
-** Processing line: ~  end~
+    #M oves the user based on their keyboard input and sets values for target cell
+** Processing line: ~    def input_target_cell~
 - Inside source: true
 *** True Line Result
-  end
-** Processing line: ~~
+    def input_target_cell
+** Processing line: ~      if inputs.keyboard.key_down.up # if "up" key is in "down" state~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~  def speed_of_light_outside_library args~
+      if inputs.keyboard.key_down.up # if "up" key is in "down" state
+** Processing line: ~        [state.x, state.y + 1,  0,  1] # user moves up~
 - Inside source: true
 *** True Line Result
-  def speed_of_light_outside_library args
-** Processing line: ~    {~
+        [state.x, state.y + 1,  0,  1] # user moves up
+** Processing line: ~      elsif inputs.keyboard.key_down.down # if "down" key is pressed~
 - Inside source: true
 *** True Line Result
-    {
-** Processing line: ~      background: 'sprites/outside-library.png',~
+      elsif inputs.keyboard.key_down.down # if "down" key is pressed
+** Processing line: ~        [state.x, state.y - 1,  0, -1] # user moves down~
 - Inside source: true
 *** True Line Result
-      background: 'sprites/outside-library.png',
-** Processing line: ~      player: [55, 19],~
+        [state.x, state.y - 1,  0, -1] # user moves down
+** Processing line: ~      elsif inputs.keyboard.key_down.left # if "left" key is pressed~
 - Inside source: true
 *** True Line Result
-      player: [55, 19],
-** Processing line: ~      scenes: [~
+      elsif inputs.keyboard.key_down.left # if "left" key is pressed
+** Processing line: ~        [state.x - 1, state.y, -1,  0] # user moves left~
 - Inside source: true
 *** True Line Result
-      scenes: [
-** Processing line: ~        [49, 39, 6, 10, :speed_of_light_library],~
+        [state.x - 1, state.y, -1,  0] # user moves left
+** Processing line: ~      elsif inputs.keyboard.key_down.right # if "right" key is pressed~
 - Inside source: true
 *** True Line Result
-        [49, 39, 6, 10, :speed_of_light_library],
-** Processing line: ~        [61, 11, 3, 20, :speed_of_light_front_of_home]~
+      elsif inputs.keyboard.key_down.right # if "right" key is pressed
+** Processing line: ~        [state.x + 1, state.y,  1,  0] # user moves right~
 - Inside source: true
 *** True Line Result
-        [61, 11, 3, 20, :speed_of_light_front_of_home]
-** Processing line: ~      ]~
+        [state.x + 1, state.y,  1,  0] # user moves right
+** Processing line: ~      else~
 - Inside source: true
 *** True Line Result
-      ]
-** Processing line: ~    }~
+      else
+** Processing line: ~        nil  # otherwise, empty~
 - Inside source: true
 *** True Line Result
-    }
-** Processing line: ~  end~
+        nil  # otherwise, empty
+** Processing line: ~      end~
 - Inside source: true
 *** True Line Result
-  end
-** Processing line: ~~
+      end
+** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~  def speed_of_light_library args~
+    end
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-  def speed_of_light_library args
-** Processing line: ~    {~
+
+** Processing line: ~    # Goes through the canvas collection to find if the mouse was clicked inside of the borders of an element.~
 - Inside source: true
 *** True Line Result
-    {
-** Processing line: ~      background: 'sprites/library.png',~
+    # Goes through the canvas collection to find if the mouse was clicked inside of the borders of an element.
+** Processing line: ~    def input_click_map~
 - Inside source: true
 *** True Line Result
-      background: 'sprites/library.png',
-** Processing line: ~      player: [30, 7],~
+    def input_click_map
+** Processing line: ~      return unless inputs.mouse.click # return unless the mouse is clicked~
 - Inside source: true
 *** True Line Result
-      player: [30, 7],
-** Processing line: ~      scenes: [~
+      return unless inputs.mouse.click # return unless the mouse is clicked
+** Processing line: ~      canvas_entry = state.canvas.find do |c| # find element from canvas collection that meets requirements~
 - Inside source: true
 *** True Line Result
-      scenes: [
-** Processing line: ~        [3, 50, 10, 3, :speed_of_light_celestial_bodies_diagram]~
+      canvas_entry = state.canvas.find do |c| # find element from canvas collection that meets requirements
+** Processing line: ~        inputs.mouse.click.inside_rect? c.border # find border that mouse was clicked inside of~
 - Inside source: true
 *** True Line Result
-        [3, 50, 10, 3, :speed_of_light_celestial_bodies_diagram]
-** Processing line: ~      ]~
+        inputs.mouse.click.inside_rect? c.border # find border that mouse was clicked inside of
+** Processing line: ~      end~
 - Inside source: true
 *** True Line Result
-      ]
-** Processing line: ~    }~
+      end
+** Processing line: ~      puts canvas_entry # prints canvas_entry value~
 - Inside source: true
 *** True Line Result
-    }
-** Processing line: ~  end~
+      puts canvas_entry # prints canvas_entry value
+** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
-  end
+    end
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~  def speed_of_light_celestial_bodies_diagram args~
-- Inside source: true
-*** True Line Result
-  def speed_of_light_celestial_bodies_diagram args
-** Processing line: ~    {~
+** Processing line: ~    # Sets the definition of a label using the parameters.~
 - Inside source: true
 *** True Line Result
-    {
-** Processing line: ~      background: 'sprites/planets.png',~
+    # Sets the definition of a label using the parameters.
+** Processing line: ~    def label text, x, y, color = nil~
 - Inside source: true
 *** True Line Result
-      background: 'sprites/planets.png',
-** Processing line: ~      fade: 60,~
+    def label text, x, y, color = nil
+** Processing line: ~      color ||= white # color is initialized to white~
 - Inside source: true
 *** True Line Result
-      fade: 60,
-** Processing line: ~      player: [30, 3],~
+      color ||= white # color is initialized to white
+** Processing line: ~      [x, y, text, 1, 1, *color] # sets label definition~
 - Inside source: true
 *** True Line Result
-      player: [30, 3],
-** Processing line: ~      scenes: [~
+      [x, y, text, 1, 1, *color] # sets label definition
+** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
-      scenes: [
-** Processing line: ~        [56 - 2, 10, 5, 5, :speed_of_light_distance_discovered]~
+    end
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-        [56 - 2, 10, 5, 5, :speed_of_light_distance_discovered]
-** Processing line: ~      ],~
+
+** Processing line: ~    def green~
 - Inside source: true
 *** True Line Result
-      ],
-** Processing line: ~      storylines: [~
+    def green
+** Processing line: ~      [60, 200, 100] # sets color saturation to shade of green~
 - Inside source: true
 *** True Line Result
-      storylines: [
-** Processing line: ~        [30, 2, 4, 4, "Here- it is! This is a diagram--- of the solar-- system--. It was printed-- over-- fifty-- years- ago. Geez-- that's-- old."],~
+      [60, 200, 100] # sets color saturation to shade of green
+** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
-        [30, 2, 4, 4, "Here- it is! This is a diagram--- of the solar-- system--. It was printed-- over-- fifty-- years- ago. Geez-- that's-- old."],
+    end
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~        [ 0 - 2, 10, 5, 5, "The label- reads: Sun. The length- of the Astronomical-------- Unit-- (AU), is the distance-- from the Sun- to the Earth. Which is about 150--- million--- kilometers----."],~
+** Processing line: ~    def blue~
 - Inside source: true
 *** True Line Result
-        [ 0 - 2, 10, 5, 5, "The label- reads: Sun. The length- of the Astronomical-------- Unit-- (AU), is the distance-- from the Sun- to the Earth. Which is about 150--- million--- kilometers----."],
-** Processing line: ~        [ 7 - 2, 10, 5, 5, "The label- reads: Mercury. Distance from Sun: 0.39AU------------ or- 3----- light-- minutes--."],~
+    def blue
+** Processing line: ~      [50, 50, 210] # sets color saturation to shade of blue~
 - Inside source: true
 *** True Line Result
-        [ 7 - 2, 10, 5, 5, "The label- reads: Mercury. Distance from Sun: 0.39AU------------ or- 3----- light-- minutes--."],
-** Processing line: ~        [14 - 2, 10, 5, 5, "The label- reads: Venus. Distance from Sun: 0.72AU------------ or- 6----- light-- minutes--."],~
+      [50, 50, 210] # sets color saturation to shade of blue
+** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
-        [14 - 2, 10, 5, 5, "The label- reads: Venus. Distance from Sun: 0.72AU------------ or- 6----- light-- minutes--."],
-** Processing line: ~        [21 - 2, 10, 5, 5, "The label- reads: Earth. Distance from Sun: 1.00AU------------ or- 8----- light-- minutes--."],~
+    end
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-        [21 - 2, 10, 5, 5, "The label- reads: Earth. Distance from Sun: 1.00AU------------ or- 8----- light-- minutes--."],
-** Processing line: ~        [28 - 2, 10, 5, 5, "The label- reads: Mars. Distance from Sun: 1.52AU------------ or- 12----- light-- minutes--."],~
+
+** Processing line: ~    def white~
 - Inside source: true
 *** True Line Result
-        [28 - 2, 10, 5, 5, "The label- reads: Mars. Distance from Sun: 1.52AU------------ or- 12----- light-- minutes--."],
-** Processing line: ~        [35 - 2, 10, 5, 5, "The label- reads: Jupiter. Distance from Sun: 5.20AU------------ or- 45----- light-- minutes--."],~
+    def white
+** Processing line: ~      [255, 255, 255] # sets color saturation to white~
 - Inside source: true
 *** True Line Result
-        [35 - 2, 10, 5, 5, "The label- reads: Jupiter. Distance from Sun: 5.20AU------------ or- 45----- light-- minutes--."],
-** Processing line: ~        [42 - 2, 10, 5, 5, "The label- reads: Saturn. Distance from Sun: 9.53AU------------ or- 79----- light-- minutes--."],~
+      [255, 255, 255] # sets color saturation to white
+** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
-        [42 - 2, 10, 5, 5, "The label- reads: Saturn. Distance from Sun: 9.53AU------------ or- 79----- light-- minutes--."],
-** Processing line: ~        [49 - 2, 10, 5, 5, "The label- reads: Uranus. Distance from Sun: 19.81AU------------ or- 159----- light-- minutes--."],~
+    end
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-        [49 - 2, 10, 5, 5, "The label- reads: Uranus. Distance from Sun: 19.81AU------------ or- 159----- light-- minutes--."],
-** Processing line: ~        # [56 - 2, 15, 4, 4, "The label- reads: Neptune. Distance from Sun: 30.05AU------------ or- 4.1----- light-- hours--."],~
+
+** Processing line: ~    def red~
 - Inside source: true
 *** True Line Result
-        # [56 - 2, 15, 4, 4, "The label- reads: Neptune. Distance from Sun: 30.05AU------------ or- 4.1----- light-- hours--."],
-** Processing line: ~        [63 - 2, 10, 5, 5, "The label- reads: Pluto. Wait. WTF? Pluto-- isn't-- a planet."],~
+    def red
+** Processing line: ~      [230, 80, 80] # sets color saturation to shade of red~
 - Inside source: true
 *** True Line Result
-        [63 - 2, 10, 5, 5, "The label- reads: Pluto. Wait. WTF? Pluto-- isn't-- a planet."],
-** Processing line: ~      ]~
+      [230, 80, 80] # sets color saturation to shade of red
+** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
-      ]
-** Processing line: ~    }~
+    end
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-    }
-** Processing line: ~  end~
+
+** Processing line: ~    def orange~
 - Inside source: true
 *** True Line Result
-  end
+    def orange
+** Processing line: ~      [255, 80, 60] # sets color saturation to shade of orange~
+- Inside source: true
+*** True Line Result
+      [255, 80, 60] # sets color saturation to shade of orange
+** Processing line: ~    end~
+- Inside source: true
+*** True Line Result
+    end
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~  def speed_of_light_distance_discovered args~
+** Processing line: ~    def pink~
 - Inside source: true
 *** True Line Result
-  def speed_of_light_distance_discovered args
-** Processing line: ~    {~
+    def pink
+** Processing line: ~      [255, 0, 200] # sets color saturation to shade of pink~
 - Inside source: true
 *** True Line Result
-    {
-** Processing line: ~      background: 'sprites/planets.png',~
+      [255, 0, 200] # sets color saturation to shade of pink
+** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
-      background: 'sprites/planets.png',
-** Processing line: ~      scenes: [~
+    end
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-      scenes: [
-** Processing line: ~        [13, 0, 44, 3, :speed_of_light_end_of_day]~
+
+** Processing line: ~    def gray~
 - Inside source: true
 *** True Line Result
-        [13, 0, 44, 3, :speed_of_light_end_of_day]
-** Processing line: ~      ],~
+    def gray
+** Processing line: ~      [75, 75, 75] # sets color saturation to shade of gray~
 - Inside source: true
 *** True Line Result
-      ],
-** Processing line: ~      storylines: [~
+      [75, 75, 75] # sets color saturation to shade of gray
+** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
-      storylines: [
-** Processing line: ~        [ 0 - 2, 10, 5, 5, "The label- reads: Sun. The length- of the Astronomical-------- Unit-- (AU), is the distance-- from the Sun- to the Earth. Which is about 150--- million--- kilometers----."],~
+    end
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-        [ 0 - 2, 10, 5, 5, "The label- reads: Sun. The length- of the Astronomical-------- Unit-- (AU), is the distance-- from the Sun- to the Earth. Which is about 150--- million--- kilometers----."],
-** Processing line: ~        [ 7 - 2, 10, 5, 5, "The label- reads: Mercury. Distance from Sun: 0.39AU------------ or- 3----- light-- minutes--."],~
+
+** Processing line: ~    # Recolors the border using the parameters.~
 - Inside source: true
 *** True Line Result
-        [ 7 - 2, 10, 5, 5, "The label- reads: Mercury. Distance from Sun: 0.39AU------------ or- 3----- light-- minutes--."],
-** Processing line: ~        [14 - 2, 10, 5, 5, "The label- reads: Venus. Distance from Sun: 0.72AU------------ or- 6----- light-- minutes--."],~
+    # Recolors the border using the parameters.
+** Processing line: ~    def recolor_border border, r, g, b~
 - Inside source: true
 *** True Line Result
-        [14 - 2, 10, 5, 5, "The label- reads: Venus. Distance from Sun: 0.72AU------------ or- 6----- light-- minutes--."],
-** Processing line: ~        [21 - 2, 10, 5, 5, "The label- reads: Earth. Distance from Sun: 1.00AU------------ or- 8----- light-- minutes--."],~
+    def recolor_border border, r, g, b
+** Processing line: ~      border[4] = r~
 - Inside source: true
 *** True Line Result
-        [21 - 2, 10, 5, 5, "The label- reads: Earth. Distance from Sun: 1.00AU------------ or- 8----- light-- minutes--."],
-** Processing line: ~        [28 - 2, 10, 5, 5, "The label- reads: Mars. Distance from Sun: 1.52AU------------ or- 12----- light-- minutes--."],~
+      border[4] = r
+** Processing line: ~      border[5] = g~
 - Inside source: true
 *** True Line Result
-        [28 - 2, 10, 5, 5, "The label- reads: Mars. Distance from Sun: 1.52AU------------ or- 12----- light-- minutes--."],
-** Processing line: ~        [35 - 2, 10, 5, 5, "The label- reads: Jupiter. Distance from Sun: 5.20AU------------ or- 45----- light-- minutes--."],~
+      border[5] = g
+** Processing line: ~      border[6] = b~
 - Inside source: true
 *** True Line Result
-        [35 - 2, 10, 5, 5, "The label- reads: Jupiter. Distance from Sun: 5.20AU------------ or- 45----- light-- minutes--."],
-** Processing line: ~        [42 - 2, 10, 5, 5, "The label- reads: Saturn. Distance from Sun: 9.53AU------------ or- 79----- light-- minutes--."],~
+      border[6] = b
+** Processing line: ~      border~
 - Inside source: true
 *** True Line Result
-        [42 - 2, 10, 5, 5, "The label- reads: Saturn. Distance from Sun: 9.53AU------------ or- 79----- light-- minutes--."],
-** Processing line: ~        [49 - 2, 10, 5, 5, "The label- reads: Uranus. Distance from Sun: 19.81AU------------ or- 159----- light-- minutes--."],~
+      border
+** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
-        [49 - 2, 10, 5, 5, "The label- reads: Uranus. Distance from Sun: 19.81AU------------ or- 159----- light-- minutes--."],
-** Processing line: ~        [56 - 2, 10, 5, 5, "The label- reads: Neptune. Distance from Sun: 30.05AU------------ or- 4.1----- light-- hours--. What?! The message--- I received-- was from a source-- farther-- than-- Neptune?!"],~
+    end
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-        [56 - 2, 10, 5, 5, "The label- reads: Neptune. Distance from Sun: 30.05AU------------ or- 4.1----- light-- hours--. What?! The message--- I received-- was from a source-- farther-- than-- Neptune?!"],
-** Processing line: ~        [63 - 2, 10, 5, 5, "The label- reads: Pluto. Dista- Wait... Pluto-- isn't-- a planet. People-- thought- Pluto-- was a planet-- back- then?--"],~
+
+** Processing line: ~    # Returns a boolean value.~
 - Inside source: true
 *** True Line Result
-        [63 - 2, 10, 5, 5, "The label- reads: Pluto. Dista- Wait... Pluto-- isn't-- a planet. People-- thought- Pluto-- was a planet-- back- then?--"],
-** Processing line: ~      ]~
+    # Returns a boolean value.
+** Processing line: ~    def visible? cell~
 - Inside source: true
 *** True Line Result
-      ]
-** Processing line: ~    }~
+    def visible? cell
+** Processing line: ~      # finds cell's coordinates inside visible_cells collections to determine if cell is visible~
 - Inside source: true
 *** True Line Result
-    }
-** Processing line: ~  end~
+      # finds cell's coordinates inside visible_cells collections to determine if cell is visible
+** Processing line: ~      state.visible_cells.find { |c| c.x == cell.x && c.y == cell.y}~
 - Inside source: true
 *** True Line Result
-  end
+      state.visible_cells.find { |c| c.x == cell.x && c.y == cell.y}
+** Processing line: ~    end~
+- Inside source: true
+*** True Line Result
+    end
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~  def speed_of_light_end_of_day args~
+** Processing line: ~    # Exports dungeon by printing dungeon cell coordinates~
 - Inside source: true
 *** True Line Result
-  def speed_of_light_end_of_day args
-** Processing line: ~    {~
+    # Exports dungeon by printing dungeon cell coordinates
+** Processing line: ~    def export_dungeon~
 - Inside source: true
 *** True Line Result
-    {
-** Processing line: ~      fade: 60,~
+    def export_dungeon
+** Processing line: ~      state.dungeon.each do |d| # on each element of dungeon collection~
 - Inside source: true
 *** True Line Result
-      fade: 60,
-** Processing line: ~      background: 'sprites/inside-home.png',~
+      state.dungeon.each do |d| # on each element of dungeon collection
+** Processing line: ~        puts "state.dungeon << [#{d.x}, #{d.y}]" # prints cell coordinates~
 - Inside source: true
 *** True Line Result
-      background: 'sprites/inside-home.png',
-** Processing line: ~      player: [35, 0],~
+        puts "state.dungeon << [#{d.x}, #{d.y}]" # prints cell coordinates
+** Processing line: ~      end~
 - Inside source: true
 *** True Line Result
-      player: [35, 0],
-** Processing line: ~      storylines: [~
+      end
+** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
-      storylines: [
-** Processing line: ~        [35, 10, 4, 4, "Wonder-- what the reply-- will be. Who- the hell is contacting--- me from beyond-- Neptune? This- has to be some- kind- of- joke."]~
+    end
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-        [35, 10, 4, 4, "Wonder-- what the reply-- will be. Who- the hell is contacting--- me from beyond-- Neptune? This- has to be some- kind- of- joke."]
-** Processing line: ~      ],~
+
+** Processing line: ~    def distance_to_cell cell~
 - Inside source: true
 *** True Line Result
-      ],
-** Processing line: ~      scenes: [~
+    def distance_to_cell cell
+** Processing line: ~      distance_to state.x, cell.x, state.y, cell.y # calls distance_to method~
 - Inside source: true
 *** True Line Result
-      scenes: [
-** Processing line: ~        [31, 38, 10, 12, :serenity_alive_side_of_home]~
+      distance_to state.x, cell.x, state.y, cell.y # calls distance_to method
+** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
-        [31, 38, 10, 12, :serenity_alive_side_of_home]
-** Processing line: ~      ]~
+    end
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-      ]
-** Processing line: ~    }~
+
+** Processing line: ~    def distance_to from_x, x, from_y, y~
 - Inside source: true
 *** True Line Result
-    }
+    def distance_to from_x, x, from_y, y
+** Processing line: ~      (from_x - x).abs + (from_y - y).abs # finds distance between two cells using coordinates~
+- Inside source: true
+*** True Line Result
+      (from_x - x).abs + (from_y - y).abs # finds distance between two cells using coordinates
+** Processing line: ~    end~
+- Inside source: true
+*** True Line Result
+    end
 ** Processing line: ~  end~
 - Inside source: true
 *** True Line Result
@@ -143139,62 +149219,46 @@ Follows is a source code listing for all files that have been open sourced. This
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~#+end_src~
-- Line was identified as the end of a code block.
+** Processing line: ~  $game = Game.new~
+- Inside source: true
 *** True Line Result
-#+end_src
+  $game = Game.new
 ** Processing line: ~~
-- End of paragraph detected.
-*** True Line Result
-
-** Processing line: ~*** Rpg Roguelike - Roguelike Starting Point - constants.rb~
-- Header detected.
-*** True Line Result
-
-*** True Line Result
-*** Rpg Roguelike - Roguelike Starting Point - constants.rb
-** Processing line: ~#+begin_src ruby~
-- Line was identified as the beginning of a code block.
-*** True Line Result
-
-*** True Line Result
-#+begin_src ruby
-** Processing line: ~  # ./samples/99_genre_rpg_roguelike/01_roguelike_starting_point/app/constants.rb~
 - Inside source: true
 *** True Line Result
-  # ./samples/99_genre_rpg_roguelike/01_roguelike_starting_point/app/constants.rb
-** Processing line: ~  SHOW_LEGEND = true~
+
+** Processing line: ~  def tick args~
 - Inside source: true
 *** True Line Result
-  SHOW_LEGEND = true
-** Processing line: ~  SOURCE_TILE_SIZE = 16~
+  def tick args
+** Processing line: ~    $game.args    = args~
 - Inside source: true
 *** True Line Result
-  SOURCE_TILE_SIZE = 16
-** Processing line: ~  DESTINATION_TILE_SIZE = 16~
+    $game.args    = args
+** Processing line: ~    $game.state   = args.state~
 - Inside source: true
 *** True Line Result
-  DESTINATION_TILE_SIZE = 16
-** Processing line: ~  TILE_SHEET_SIZE = 256~
+    $game.state   = args.state
+** Processing line: ~    $game.inputs  = args.inputs~
 - Inside source: true
 *** True Line Result
-  TILE_SHEET_SIZE = 256
-** Processing line: ~  TILE_R = 0~
+    $game.inputs  = args.inputs
+** Processing line: ~    $game.outputs = args.outputs~
 - Inside source: true
 *** True Line Result
-  TILE_R = 0
-** Processing line: ~  TILE_G = 0~
+    $game.outputs = args.outputs
+** Processing line: ~    $game.grid    = args.grid~
 - Inside source: true
 *** True Line Result
-  TILE_G = 0
-** Processing line: ~  TILE_B = 0~
+    $game.grid    = args.grid
+** Processing line: ~    $game.tick~
 - Inside source: true
 *** True Line Result
-  TILE_B = 0
-** Processing line: ~  TILE_A = 255~
+    $game.tick
+** Processing line: ~  end~
 - Inside source: true
 *** True Line Result
-  TILE_A = 255
+  end
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
@@ -143207,278 +149271,282 @@ Follows is a source code listing for all files that have been open sourced. This
 - End of paragraph detected.
 *** True Line Result
 
-** Processing line: ~*** Rpg Roguelike - Roguelike Starting Point - legend.rb~
+** Processing line: ~*** Rpg Tactical - Hexagonal Grid - main.rb~
 - Header detected.
 *** True Line Result
 
 *** True Line Result
-*** Rpg Roguelike - Roguelike Starting Point - legend.rb
+*** Rpg Tactical - Hexagonal Grid - main.rb
 ** Processing line: ~#+begin_src ruby~
 - Line was identified as the beginning of a code block.
 *** True Line Result
 
 *** True Line Result
 #+begin_src ruby
-** Processing line: ~  # ./samples/99_genre_rpg_roguelike/01_roguelike_starting_point/app/legend.rb~
+** Processing line: ~  # ./samples/99_genre_rpg_tactical/hexagonal_grid/app/main.rb~
 - Inside source: true
 *** True Line Result
-  # ./samples/99_genre_rpg_roguelike/01_roguelike_starting_point/app/legend.rb
-** Processing line: ~  def tick_legend args~
+  # ./samples/99_genre_rpg_tactical/hexagonal_grid/app/main.rb
+** Processing line: ~  class HexagonTileGame~
 - Inside source: true
 *** True Line Result
-  def tick_legend args
-** Processing line: ~    return unless SHOW_LEGEND~
+  class HexagonTileGame
+** Processing line: ~    attr_gtk~
 - Inside source: true
 *** True Line Result
-    return unless SHOW_LEGEND
+    attr_gtk
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~    legend_padding = 16~
+** Processing line: ~    def defaults~
 - Inside source: true
 *** True Line Result
-    legend_padding = 16
-** Processing line: ~    legend_x = 1280 - TILE_SHEET_SIZE - legend_padding~
+    def defaults
+** Processing line: ~      state.tile_scale      = 1.3~
 - Inside source: true
 *** True Line Result
-    legend_x = 1280 - TILE_SHEET_SIZE - legend_padding
-** Processing line: ~    legend_y =  720 - TILE_SHEET_SIZE - legend_padding~
+      state.tile_scale      = 1.3
+** Processing line: ~      state.tile_size       = 80~
 - Inside source: true
 *** True Line Result
-    legend_y =  720 - TILE_SHEET_SIZE - legend_padding
-** Processing line: ~    tile_sheet_sprite = [legend_x,~
+      state.tile_size       = 80
+** Processing line: ~      state.tile_w          = Math.sqrt(3) * state.tile_size.half~
 - Inside source: true
 *** True Line Result
-    tile_sheet_sprite = [legend_x,
-** Processing line: ~                         legend_y,~
+      state.tile_w          = Math.sqrt(3) * state.tile_size.half
+** Processing line: ~      state.tile_h          = state.tile_size * 3/4~
 - Inside source: true
 *** True Line Result
-                         legend_y,
-** Processing line: ~                         TILE_SHEET_SIZE,~
+      state.tile_h          = state.tile_size * 3/4
+** Processing line: ~      state.tiles_x_count   = 1280.idiv(state.tile_w) - 1~
 - Inside source: true
 *** True Line Result
-                         TILE_SHEET_SIZE,
-** Processing line: ~                         TILE_SHEET_SIZE,~
+      state.tiles_x_count   = 1280.idiv(state.tile_w) - 1
+** Processing line: ~      state.tiles_y_count   = 720.idiv(state.tile_h) - 1~
 - Inside source: true
 *** True Line Result
-                         TILE_SHEET_SIZE,
-** Processing line: ~                         'sprites/simple-mood-16x16.png', 0,~
+      state.tiles_y_count   = 720.idiv(state.tile_h) - 1
+** Processing line: ~      state.world_width_px  = state.tiles_x_count * state.tile_w~
 - Inside source: true
 *** True Line Result
-                         'sprites/simple-mood-16x16.png', 0,
-** Processing line: ~                         TILE_A,~
+      state.world_width_px  = state.tiles_x_count * state.tile_w
+** Processing line: ~      state.world_height_px = state.tiles_y_count * state.tile_h~
 - Inside source: true
 *** True Line Result
-                         TILE_A,
-** Processing line: ~                         TILE_R,~
+      state.world_height_px = state.tiles_y_count * state.tile_h
+** Processing line: ~      state.world_x_offset  = (1280 - state.world_width_px).half~
 - Inside source: true
 *** True Line Result
-                         TILE_R,
-** Processing line: ~                         TILE_G,~
+      state.world_x_offset  = (1280 - state.world_width_px).half
+** Processing line: ~      state.world_y_offset  = (720 - state.world_height_px).half~
 - Inside source: true
 *** True Line Result
-                         TILE_G,
-** Processing line: ~                         TILE_B]~
+      state.world_y_offset  = (720 - state.world_height_px).half
+** Processing line: ~      state.tiles         ||= state.tiles_x_count.map_with_ys(state.tiles_y_count) do |ordinal_x, ordinal_y|~
 - Inside source: true
 *** True Line Result
-                         TILE_B]
-** Processing line: ~~
+      state.tiles         ||= state.tiles_x_count.map_with_ys(state.tiles_y_count) do |ordinal_x, ordinal_y|
+** Processing line: ~        {~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~    if args.inputs.mouse.point.inside_rect? tile_sheet_sprite~
+        {
+** Processing line: ~          ordinal_x: ordinal_x,~
 - Inside source: true
 *** True Line Result
-    if args.inputs.mouse.point.inside_rect? tile_sheet_sprite
-** Processing line: ~      mouse_row = args.inputs.mouse.point.y.idiv(SOURCE_TILE_SIZE)~
+          ordinal_x: ordinal_x,
+** Processing line: ~          ordinal_y: ordinal_y,~
 - Inside source: true
 *** True Line Result
-      mouse_row = args.inputs.mouse.point.y.idiv(SOURCE_TILE_SIZE)
-** Processing line: ~      tile_row = 15 - (mouse_row - legend_y.idiv(SOURCE_TILE_SIZE))~
+          ordinal_y: ordinal_y,
+** Processing line: ~          offset_x: (ordinal_y.even?) ?~
 - Inside source: true
 *** True Line Result
-      tile_row = 15 - (mouse_row - legend_y.idiv(SOURCE_TILE_SIZE))
-** Processing line: ~~
+          offset_x: (ordinal_y.even?) ?
+** Processing line: ~                    (state.world_x_offset + state.tile_w.half.half) :~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~      mouse_col = args.inputs.mouse.point.x.idiv(SOURCE_TILE_SIZE)~
+                    (state.world_x_offset + state.tile_w.half.half) :
+** Processing line: ~                    (state.world_x_offset - state.tile_w.half.half),~
 - Inside source: true
 *** True Line Result
-      mouse_col = args.inputs.mouse.point.x.idiv(SOURCE_TILE_SIZE)
-** Processing line: ~      tile_col = (mouse_col - legend_x.idiv(SOURCE_TILE_SIZE))~
+                    (state.world_x_offset - state.tile_w.half.half),
+** Processing line: ~          offset_y: state.world_y_offset,~
 - Inside source: true
 *** True Line Result
-      tile_col = (mouse_col - legend_x.idiv(SOURCE_TILE_SIZE))
-** Processing line: ~~
+          offset_y: state.world_y_offset,
+** Processing line: ~          w: state.tile_w,~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~      args.outputs.primitives << [legend_x - legend_padding * 2,~
+          w: state.tile_w,
+** Processing line: ~          h: state.tile_h,~
 - Inside source: true
 *** True Line Result
-      args.outputs.primitives << [legend_x - legend_padding * 2,
-** Processing line: ~                                  mouse_row * SOURCE_TILE_SIZE, 256 + legend_padding * 2, 16, 128, 128, 128, 64].solid~
+          h: state.tile_h,
+** Processing line: ~          type: :blank,~
 - Inside source: true
 *** True Line Result
-                                  mouse_row * SOURCE_TILE_SIZE, 256 + legend_padding * 2, 16, 128, 128, 128, 64].solid
-** Processing line: ~~
+          type: :blank,
+** Processing line: ~          path: "sprites/hexagon-gray.png",~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~      args.outputs.primitives << [mouse_col * SOURCE_TILE_SIZE,~
+          path: "sprites/hexagon-gray.png",
+** Processing line: ~          a: 20~
 - Inside source: true
 *** True Line Result
-      args.outputs.primitives << [mouse_col * SOURCE_TILE_SIZE,
-** Processing line: ~                                  legend_y - legend_padding * 2, 16, 256 + legend_padding * 2, 128, 128, 128, 64].solid~
+          a: 20
+** Processing line: ~        }.associate do |h|~
 - Inside source: true
 *** True Line Result
-                                  legend_y - legend_padding * 2, 16, 256 + legend_padding * 2, 128, 128, 128, 64].solid
-** Processing line: ~~
+        }.associate do |h|
+** Processing line: ~          h.merge(x: h[:offset_x] + h[:ordinal_x] * h[:w],~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~      sprite_key = sprite_lookup.find { |k, v| v == [tile_row, tile_col] }~
+          h.merge(x: h[:offset_x] + h[:ordinal_x] * h[:w],
+** Processing line: ~                  y: h[:offset_y] + h[:ordinal_y] * h[:h]).scale_rect(state.tile_scale)~
 - Inside source: true
 *** True Line Result
-      sprite_key = sprite_lookup.find { |k, v| v == [tile_row, tile_col] }
-** Processing line: ~      if sprite_key~
+                  y: h[:offset_y] + h[:ordinal_y] * h[:h]).scale_rect(state.tile_scale)
+** Processing line: ~        end.associate do |h|~
 - Inside source: true
 *** True Line Result
-      if sprite_key
-** Processing line: ~        member_name, _ = sprite_key~
+        end.associate do |h|
+** Processing line: ~          h.merge(center: {~
 - Inside source: true
 *** True Line Result
-        member_name, _ = sprite_key
-** Processing line: ~        member_name = member_name_as_code member_name~
+          h.merge(center: {
+** Processing line: ~                    x: h[:x] + h[:w].half,~
 - Inside source: true
 *** True Line Result
-        member_name = member_name_as_code member_name
-** Processing line: ~        args.outputs.labels << [660, 70, "# CODE SAMPLE (place in the tick_game method located in main.rb)", -1, 0]~
+                    x: h[:x] + h[:w].half,
+** Processing line: ~                    y: h[:y] + h[:h].half~
 - Inside source: true
 *** True Line Result
-        args.outputs.labels << [660, 70, "# CODE SAMPLE (place in the tick_game method located in main.rb)", -1, 0]
-** Processing line: ~        args.outputs.labels << [660, 50, "#                                    GRID_X, GRID_Y, TILE_KEY", -1, 0]~
+                    y: h[:y] + h[:h].half
+** Processing line: ~                  }, radius: [h[:w].half, h[:h].half].max)~
 - Inside source: true
 *** True Line Result
-        args.outputs.labels << [660, 50, "#                                    GRID_X, GRID_Y, TILE_KEY", -1, 0]
-** Processing line: ~        args.outputs.labels << [660, 30, "args.outputs.sprites << tile_in_game(     5,      6, #{member_name}    )", -1, 0]~
+                  }, radius: [h[:w].half, h[:h].half].max)
+** Processing line: ~        end~
 - Inside source: true
 *** True Line Result
-        args.outputs.labels << [660, 30, "args.outputs.sprites << tile_in_game(     5,      6, #{member_name}    )", -1, 0]
-** Processing line: ~      else~
+        end
+** Processing line: ~      end~
 - Inside source: true
 *** True Line Result
-      else
-** Processing line: ~        args.outputs.labels << [660, 50, "Tile [#{tile_row}, #{tile_col}] not found. Add a key and value to app/sprite_lookup.rb:", -1, 0]~
+      end
+** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
-        args.outputs.labels << [660, 50, "Tile [#{tile_row}, #{tile_col}] not found. Add a key and value to app/sprite_lookup.rb:", -1, 0]
-** Processing line: ~        args.outputs.labels << [660, 30, "{ \"some_string\" => [#{tile_row}, #{tile_col}] } OR { some_symbol: [#{tile_row}, #{tile_col}] }.", -1, 0]~
+    end
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-        args.outputs.labels << [660, 30, "{ \"some_string\" => [#{tile_row}, #{tile_col}] } OR { some_symbol: [#{tile_row}, #{tile_col}] }.", -1, 0]
-** Processing line: ~      end~
+
+** Processing line: ~    def input~
 - Inside source: true
 *** True Line Result
-      end
-** Processing line: ~~
+    def input
+** Processing line: ~      if inputs.click~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~    end~
+      if inputs.click
+** Processing line: ~        tile = state.tiles.find { |t| inputs.click.point_inside_circle? t[:center], t[:radius] }~
 - Inside source: true
 *** True Line Result
-    end
-** Processing line: ~~
+        tile = state.tiles.find { |t| inputs.click.point_inside_circle? t[:center], t[:radius] }
+** Processing line: ~        if tile~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~    # render the sprite in the top right with a padding to the top and right so it's~
+        if tile
+** Processing line: ~          tile[:a] = 255~
 - Inside source: true
 *** True Line Result
-    # render the sprite in the top right with a padding to the top and right so it's
-** Processing line: ~    # not flush against the edge~
+          tile[:a] = 255
+** Processing line: ~          tile[:path] = "sprites/hexagon-black.png"~
 - Inside source: true
 *** True Line Result
-    # not flush against the edge
-** Processing line: ~    args.outputs.sprites << tile_sheet_sprite~
+          tile[:path] = "sprites/hexagon-black.png"
+** Processing line: ~        end~
 - Inside source: true
 *** True Line Result
-    args.outputs.sprites << tile_sheet_sprite
+        end
+** Processing line: ~      end~
+- Inside source: true
+*** True Line Result
+      end
+** Processing line: ~    end~
+- Inside source: true
+*** True Line Result
+    end
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~    # carefully place some ascii arrows to show the legend labels~
+** Processing line: ~    def tick~
 - Inside source: true
 *** True Line Result
-    # carefully place some ascii arrows to show the legend labels
-** Processing line: ~    args.outputs.labels  <<  [895, 707, "ROW --->"]~
+    def tick
+** Processing line: ~      defaults~
 - Inside source: true
 *** True Line Result
-    args.outputs.labels  <<  [895, 707, "ROW --->"]
-** Processing line: ~    args.outputs.labels  <<  [943, 412, "       ^"]~
+      defaults
+** Processing line: ~      input~
 - Inside source: true
 *** True Line Result
-    args.outputs.labels  <<  [943, 412, "       ^"]
-** Processing line: ~    args.outputs.labels  <<  [943, 412, "       |"]~
+      input
+** Processing line: ~      render~
 - Inside source: true
 *** True Line Result
-    args.outputs.labels  <<  [943, 412, "       |"]
-** Processing line: ~    args.outputs.labels  <<  [943, 394, "COL ---+"]~
+      render
+** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
-    args.outputs.labels  <<  [943, 394, "COL ---+"]
+    end
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~    # use the tile sheet to print out row and column numbers~
-- Inside source: true
-*** True Line Result
-    # use the tile sheet to print out row and column numbers
-** Processing line: ~    args.outputs.sprites << 16.map_with_index do |i|~
+** Processing line: ~    def render~
 - Inside source: true
 *** True Line Result
-    args.outputs.sprites << 16.map_with_index do |i|
-** Processing line: ~      sprite_key = i % 10~
+    def render
+** Processing line: ~      outputs.sprites << state.tiles~
 - Inside source: true
 *** True Line Result
-      sprite_key = i % 10
-** Processing line: ~      [~
+      outputs.sprites << state.tiles
+** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
-      [
-** Processing line: ~        tile(1280 - TILE_SHEET_SIZE - legend_padding * 2 - SOURCE_TILE_SIZE,~
+    end
+** Processing line: ~  end~
 - Inside source: true
 *** True Line Result
-        tile(1280 - TILE_SHEET_SIZE - legend_padding * 2 - SOURCE_TILE_SIZE,
-** Processing line: ~              720 - legend_padding * 2 - (SOURCE_TILE_SIZE * i),~
+  end
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-              720 - legend_padding * 2 - (SOURCE_TILE_SIZE * i),
-** Processing line: ~              sprite(sprite_key)),~
+
+** Processing line: ~  $game = HexagonTileGame.new~
 - Inside source: true
 *** True Line Result
-              sprite(sprite_key)),
-** Processing line: ~        tile(1280 - TILE_SHEET_SIZE - SOURCE_TILE_SIZE + (SOURCE_TILE_SIZE * i),~
+  $game = HexagonTileGame.new
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-        tile(1280 - TILE_SHEET_SIZE - SOURCE_TILE_SIZE + (SOURCE_TILE_SIZE * i),
-** Processing line: ~              720 - TILE_SHEET_SIZE - legend_padding * 3, sprite(sprite_key))~
+
+** Processing line: ~  def tick args~
 - Inside source: true
 *** True Line Result
-              720 - TILE_SHEET_SIZE - legend_padding * 3, sprite(sprite_key))
-** Processing line: ~      ]~
+  def tick args
+** Processing line: ~    $game.args = args~
 - Inside source: true
 *** True Line Result
-      ]
-** Processing line: ~    end~
+    $game.args = args
+** Processing line: ~    $game.tick~
 - Inside source: true
 *** True Line Result
-    end
+    $game.tick
 ** Processing line: ~  end~
 - Inside source: true
 *** True Line Result
@@ -143487,6 +149555,14 @@ Follows is a source code listing for all files that have been open sourced. This
 - Inside source: true
 *** True Line Result
 
+** Processing line: ~  $gtk.reset~
+- Inside source: true
+*** True Line Result
+  $gtk.reset
+** Processing line: ~~
+- Inside source: true
+*** True Line Result
+
 ** Processing line: ~#+end_src~
 - Line was identified as the end of a code block.
 *** True Line Result
@@ -143495,250 +149571,270 @@ Follows is a source code listing for all files that have been open sourced. This
 - End of paragraph detected.
 *** True Line Result
 
-** Processing line: ~*** Rpg Roguelike - Roguelike Starting Point - main.rb~
+** Processing line: ~*** Rpg Tactical - Isometric Grid - main.rb~
 - Header detected.
 *** True Line Result
 
 *** True Line Result
-*** Rpg Roguelike - Roguelike Starting Point - main.rb
+*** Rpg Tactical - Isometric Grid - main.rb
 ** Processing line: ~#+begin_src ruby~
 - Line was identified as the beginning of a code block.
 *** True Line Result
 
 *** True Line Result
 #+begin_src ruby
-** Processing line: ~  # ./samples/99_genre_rpg_roguelike/01_roguelike_starting_point/app/main.rb~
-- Inside source: true
-*** True Line Result
-  # ./samples/99_genre_rpg_roguelike/01_roguelike_starting_point/app/main.rb
-** Processing line: ~  require 'app/constants.rb'~
+** Processing line: ~  # ./samples/99_genre_rpg_tactical/isometric_grid/app/main.rb~
 - Inside source: true
 *** True Line Result
-  require 'app/constants.rb'
-** Processing line: ~  require 'app/sprite_lookup.rb'~
+  # ./samples/99_genre_rpg_tactical/isometric_grid/app/main.rb
+** Processing line: ~  class Isometric~
 - Inside source: true
 *** True Line Result
-  require 'app/sprite_lookup.rb'
-** Processing line: ~  require 'app/legend.rb'~
+  class Isometric
+** Processing line: ~      attr_accessor :grid, :inputs, :state, :outputs~
 - Inside source: true
 *** True Line Result
-  require 'app/legend.rb'
+      attr_accessor :grid, :inputs, :state, :outputs
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~  def tick args~
+** Processing line: ~      def tick~
 - Inside source: true
 *** True Line Result
-  def tick args
-** Processing line: ~    tick_game args~
+      def tick
+** Processing line: ~          defaults~
 - Inside source: true
 *** True Line Result
-    tick_game args
-** Processing line: ~    tick_legend args~
+          defaults
+** Processing line: ~          render~
 - Inside source: true
 *** True Line Result
-    tick_legend args
-** Processing line: ~  end~
+          render
+** Processing line: ~          calc~
 - Inside source: true
 *** True Line Result
-  end
+          calc
+** Processing line: ~          process_inputs~
+- Inside source: true
+*** True Line Result
+          process_inputs
+** Processing line: ~      end~
+- Inside source: true
+*** True Line Result
+      end
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~  def tick_game args~
+** Processing line: ~      def defaults~
 - Inside source: true
 *** True Line Result
-  def tick_game args
-** Processing line: ~    # setup the grid~
+      def defaults
+** Processing line: ~          state.quantity              ||= 6                                                        #Size of grid~
 - Inside source: true
 *** True Line Result
-    # setup the grid
-** Processing line: ~    args.state.grid.padding = 104~
+          state.quantity              ||= 6                                                        #Size of grid
+** Processing line: ~          state.tileSize              ||= [262 / 2, 194 / 2]                                       #width and heigth of orange tiles~
+- Inside source: true
+*** True Line Result
+          state.tileSize              ||= [262 / 2, 194 / 2]                                       #width and heigth of orange tiles
+** Processing line: ~          state.tileGrid              ||= []                                                       #Holds ordering of tiles~
+- Inside source: true
+*** True Line Result
+          state.tileGrid              ||= []                                                       #Holds ordering of tiles
+** Processing line: ~          state.currentSpriteLocation ||= -1                                                       #Current Sprite hovering location~
+- Inside source: true
+*** True Line Result
+          state.currentSpriteLocation ||= -1                                                       #Current Sprite hovering location
+** Processing line: ~          state.tileCords             ||= []                                                       #Physical, rendering cordinates~
+- Inside source: true
+*** True Line Result
+          state.tileCords             ||= []                                                       #Physical, rendering cordinates
+** Processing line: ~          state.initCords             ||= [640 - (state.quantity / 2 * state.tileSize[0]), 330]    #Location of tile (0, 0)~
 - Inside source: true
 *** True Line Result
-    args.state.grid.padding = 104
-** Processing line: ~    args.state.grid.size = 512~
+          state.initCords             ||= [640 - (state.quantity / 2 * state.tileSize[0]), 330]    #Location of tile (0, 0)
+** Processing line: ~          state.sideSize              ||= [state.tileSize[0] / 2, 242 / 2]                         #Purple & green cube face size~
 - Inside source: true
 *** True Line Result
-    args.state.grid.size = 512
-** Processing line: ~~
+          state.sideSize              ||= [state.tileSize[0] / 2, 242 / 2]                         #Purple & green cube face size
+** Processing line: ~          state.mode                  ||= :delete                                                  #Switches between :delete and :insert~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~    # set up your game~
+          state.mode                  ||= :delete                                                  #Switches between :delete and :insert
+** Processing line: ~          state.spriteSelection       ||= [['river',    0, 0, 262 / 2, 194 / 2],~
 - Inside source: true
 *** True Line Result
-    # set up your game
-** Processing line: ~    # initialize the game/game defaults. ||= means that you only initialize it if~
+          state.spriteSelection       ||= [['river',    0, 0, 262 / 2, 194 / 2],
+** Processing line: ~                                           ['mountain', 0, 0, 262 / 2, 245 / 2],~
 - Inside source: true
 *** True Line Result
-    # initialize the game/game defaults. ||= means that you only initialize it if
-** Processing line: ~    # the value isn't alread initialized~
+                                           ['mountain', 0, 0, 262 / 2, 245 / 2],
+** Processing line: ~                                           ['ocean',    0, 0, 262 / 2, 194 / 2]]             #Storage for sprite information~
 - Inside source: true
 *** True Line Result
-    # the value isn't alread initialized
-** Processing line: ~    args.state.player.x ||= 0~
+                                           ['ocean',    0, 0, 262 / 2, 194 / 2]]             #Storage for sprite information
+** Processing line: ~                                                                                             #['name', deltaX, deltaY, sizeW, sizeH]~
 - Inside source: true
 *** True Line Result
-    args.state.player.x ||= 0
-** Processing line: ~    args.state.player.y ||= 0~
+                                                                                             #['name', deltaX, deltaY, sizeW, sizeH]
+** Processing line: ~                                                                                             #^delta refers to distance from tile cords~
 - Inside source: true
 *** True Line Result
-    args.state.player.y ||= 0
+                                                                                             #^delta refers to distance from tile cords
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~    args.state.enemies ||= [~
+** Processing line: ~          #Orders tiles based on tile placement and fancy math. Very left: 0,0. Very bottom: quantity-1, 0, etc~
 - Inside source: true
 *** True Line Result
-    args.state.enemies ||= [
-** Processing line: ~      { x: 10, y: 10, type: :goblin, tile_key: :G },~
+          #Orders tiles based on tile placement and fancy math. Very left: 0,0. Very bottom: quantity-1, 0, etc
+** Processing line: ~          if state.tileGrid == []~
 - Inside source: true
 *** True Line Result
-      { x: 10, y: 10, type: :goblin, tile_key: :G },
-** Processing line: ~      { x: 15, y: 30, type: :rat,    tile_key: :R }~
+          if state.tileGrid == []
+** Processing line: ~              tempX = 0~
 - Inside source: true
 *** True Line Result
-      { x: 15, y: 30, type: :rat,    tile_key: :R }
-** Processing line: ~    ]~
+              tempX = 0
+** Processing line: ~              tempY = 0~
 - Inside source: true
 *** True Line Result
-    ]
-** Processing line: ~~
+              tempY = 0
+** Processing line: ~              tempLeft = false~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~    args.state.info_message ||= "Use arrow keys to move around."~
+              tempLeft = false
+** Processing line: ~              tempRight = false~
 - Inside source: true
 *** True Line Result
-    args.state.info_message ||= "Use arrow keys to move around."
-** Processing line: ~~
+              tempRight = false
+** Processing line: ~              count = 0~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~    # handle keyboard input~
+              count = 0
+** Processing line: ~              (state.quantity * state.quantity).times do~
 - Inside source: true
 *** True Line Result
-    # handle keyboard input
-** Processing line: ~    # keyboard input (arrow keys to move player)~
+              (state.quantity * state.quantity).times do
+** Processing line: ~                  if tempY == 0~
 - Inside source: true
 *** True Line Result
-    # keyboard input (arrow keys to move player)
-** Processing line: ~    new_player_x = args.state.player.x~
+                  if tempY == 0
+** Processing line: ~                      tempLeft = true~
 - Inside source: true
 *** True Line Result
-    new_player_x = args.state.player.x
-** Processing line: ~    new_player_y = args.state.player.y~
+                      tempLeft = true
+** Processing line: ~                  end~
 - Inside source: true
 *** True Line Result
-    new_player_y = args.state.player.y
-** Processing line: ~    player_direction = ""~
+                  end
+** Processing line: ~                  if tempX == (state.quantity - 1)~
 - Inside source: true
 *** True Line Result
-    player_direction = ""
-** Processing line: ~    player_moved = false~
+                  if tempX == (state.quantity - 1)
+** Processing line: ~                      tempRight = true~
 - Inside source: true
 *** True Line Result
-    player_moved = false
-** Processing line: ~    if args.inputs.keyboard.key_down.up~
+                      tempRight = true
+** Processing line: ~                  end~
 - Inside source: true
 *** True Line Result
-    if args.inputs.keyboard.key_down.up
-** Processing line: ~      new_player_y += 1~
+                  end
+** Processing line: ~                  state.tileGrid.push([tempX, tempY, true, tempLeft, tempRight, count])~
 - Inside source: true
 *** True Line Result
-      new_player_y += 1
-** Processing line: ~      player_direction = "north"~
+                  state.tileGrid.push([tempX, tempY, true, tempLeft, tempRight, count])
+** Processing line: ~                      #orderX, orderY, exists?, leftSide, rightSide, order~
 - Inside source: true
 *** True Line Result
-      player_direction = "north"
-** Processing line: ~      player_moved = true~
+                      #orderX, orderY, exists?, leftSide, rightSide, order
+** Processing line: ~                  tempX += 1~
 - Inside source: true
 *** True Line Result
-      player_moved = true
-** Processing line: ~    elsif args.inputs.keyboard.key_down.down~
+                  tempX += 1
+** Processing line: ~                  if tempX == state.quantity~
 - Inside source: true
 *** True Line Result
-    elsif args.inputs.keyboard.key_down.down
-** Processing line: ~      new_player_y -= 1~
+                  if tempX == state.quantity
+** Processing line: ~                      tempX = 0~
 - Inside source: true
 *** True Line Result
-      new_player_y -= 1
-** Processing line: ~      player_direction = "south"~
+                      tempX = 0
+** Processing line: ~                      tempY += 1~
 - Inside source: true
 *** True Line Result
-      player_direction = "south"
-** Processing line: ~      player_moved = true~
+                      tempY += 1
+** Processing line: ~                  end~
 - Inside source: true
 *** True Line Result
-      player_moved = true
-** Processing line: ~    elsif args.inputs.keyboard.key_down.right~
+                  end
+** Processing line: ~                  tempLeft = false~
 - Inside source: true
 *** True Line Result
-    elsif args.inputs.keyboard.key_down.right
-** Processing line: ~      new_player_x += 1~
+                  tempLeft = false
+** Processing line: ~                  tempRight = false~
 - Inside source: true
 *** True Line Result
-      new_player_x += 1
-** Processing line: ~      player_direction = "east"~
+                  tempRight = false
+** Processing line: ~                  count += 1~
 - Inside source: true
 *** True Line Result
-      player_direction = "east"
-** Processing line: ~      player_moved = true~
+                  count += 1
+** Processing line: ~              end~
 - Inside source: true
 *** True Line Result
-      player_moved = true
-** Processing line: ~    elsif args.inputs.keyboard.key_down.left~
+              end
+** Processing line: ~          end~
 - Inside source: true
 *** True Line Result
-    elsif args.inputs.keyboard.key_down.left
-** Processing line: ~      new_player_x -= 1~
+          end
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-      new_player_x -= 1
-** Processing line: ~      player_direction = "west"~
+
+** Processing line: ~          #Calculates physical cordinates for tiles~
 - Inside source: true
 *** True Line Result
-      player_direction = "west"
-** Processing line: ~      player_moved = true~
+          #Calculates physical cordinates for tiles
+** Processing line: ~          if state.tileCords == []~
 - Inside source: true
 *** True Line Result
-      player_moved = true
-** Processing line: ~    end~
+          if state.tileCords == []
+** Processing line: ~              state.tileCords = state.tileGrid.map do~
 - Inside source: true
 *** True Line Result
-    end
-** Processing line: ~~
+              state.tileCords = state.tileGrid.map do
+** Processing line: ~                  |val|~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~    #handle game logic~
+                  |val|
+** Processing line: ~                  x = (state.initCords[0]) + ((val[0] + val[1]) * state.tileSize[0] / 2)~
 - Inside source: true
 *** True Line Result
-    #handle game logic
-** Processing line: ~    # determine if there is an enemy on that square,~
+                  x = (state.initCords[0]) + ((val[0] + val[1]) * state.tileSize[0] / 2)
+** Processing line: ~                  y = (state.initCords[1]) + (-1 * val[0] * state.tileSize[1] / 2) + (val[1] * state.tileSize[1] / 2)~
 - Inside source: true
 *** True Line Result
-    # determine if there is an enemy on that square,
-** Processing line: ~    # if so, don't let the player move there~
+                  y = (state.initCords[1]) + (-1 * val[0] * state.tileSize[1] / 2) + (val[1] * state.tileSize[1] / 2)
+** Processing line: ~                  [x, y, val[2], val[3], val[4], val[5], -1] #-1 represents sprite on top of tile. -1 for now~
 - Inside source: true
 *** True Line Result
-    # if so, don't let the player move there
-** Processing line: ~    if player_moved~
+                  [x, y, val[2], val[3], val[4], val[5], -1] #-1 represents sprite on top of tile. -1 for now
+** Processing line: ~              end~
 - Inside source: true
 *** True Line Result
-    if player_moved
-** Processing line: ~      found_enemy = args.state.enemies.find do |e|~
+              end
+** Processing line: ~          end~
 - Inside source: true
 *** True Line Result
-      found_enemy = args.state.enemies.find do |e|
-** Processing line: ~        e[:x] == new_player_x && e[:y] == new_player_y~
+          end
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-        e[:x] == new_player_x && e[:y] == new_player_y
+
 ** Processing line: ~      end~
 - Inside source: true
 *** True Line Result
@@ -143747,994 +149843,1062 @@ Follows is a source code listing for all files that have been open sourced. This
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~      if !found_enemy~
+** Processing line: ~      def render~
 - Inside source: true
 *** True Line Result
-      if !found_enemy
-** Processing line: ~        args.state.player.x = new_player_x~
+      def render
+** Processing line: ~          renderBackground~
 - Inside source: true
 *** True Line Result
-        args.state.player.x = new_player_x
-** Processing line: ~        args.state.player.y = new_player_y~
+          renderBackground
+** Processing line: ~          renderLeft~
 - Inside source: true
 *** True Line Result
-        args.state.player.y = new_player_y
-** Processing line: ~        args.state.info_message = "You moved #{player_direction}."~
+          renderLeft
+** Processing line: ~          renderRight~
 - Inside source: true
 *** True Line Result
-        args.state.info_message = "You moved #{player_direction}."
-** Processing line: ~      else~
+          renderRight
+** Processing line: ~          renderTiles~
 - Inside source: true
 *** True Line Result
-      else
-** Processing line: ~        args.state.info_message = "You cannot move into a square an enemy occupies."~
+          renderTiles
+** Processing line: ~          renderObjects~
 - Inside source: true
 *** True Line Result
-        args.state.info_message = "You cannot move into a square an enemy occupies."
-** Processing line: ~      end~
+          renderObjects
+** Processing line: ~          renderLabels~
 - Inside source: true
 *** True Line Result
-      end
-** Processing line: ~    end~
+          renderLabels
+** Processing line: ~      end~
 - Inside source: true
 *** True Line Result
-    end
+      end
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~    args.outputs.sprites << tile_in_game(args.state.player.x,~
+** Processing line: ~      def renderBackground~
 - Inside source: true
 *** True Line Result
-    args.outputs.sprites << tile_in_game(args.state.player.x,
-** Processing line: ~                                         args.state.player.y, '@')~
+      def renderBackground
+** Processing line: ~          outputs.solids << [0, 0, 1280, 720, 0, 0, 0]   #Background color~
 - Inside source: true
 *** True Line Result
-                                         args.state.player.y, '@')
+          outputs.solids << [0, 0, 1280, 720, 0, 0, 0]   #Background color
+** Processing line: ~      end~
+- Inside source: true
+*** True Line Result
+      end
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~    # render game~
+** Processing line: ~      def renderLeft~
 - Inside source: true
 *** True Line Result
-    # render game
-** Processing line: ~    # render enemies at locations~
+      def renderLeft
+** Processing line: ~          #Shows the pink left cube face~
 - Inside source: true
 *** True Line Result
-    # render enemies at locations
-** Processing line: ~    args.outputs.sprites << args.state.enemies.map do |e|~
+          #Shows the pink left cube face
+** Processing line: ~          outputs.sprites << state.tileCords.map do~
 - Inside source: true
 *** True Line Result
-    args.outputs.sprites << args.state.enemies.map do |e|
-** Processing line: ~      tile_in_game(e[:x], e[:y], e[:tile_key])~
+          outputs.sprites << state.tileCords.map do
+** Processing line: ~              |val|~
 - Inside source: true
 *** True Line Result
-      tile_in_game(e[:x], e[:y], e[:tile_key])
-** Processing line: ~    end~
+              |val|
+** Processing line: ~              if val[2] == true && val[3] == true       #Checks if the tile exists and right face needs to be rendered~
 - Inside source: true
 *** True Line Result
-    end
-** Processing line: ~~
+              if val[2] == true && val[3] == true       #Checks if the tile exists and right face needs to be rendered
+** Processing line: ~                  [val[0], val[1] + (state.tileSize[1] / 2) - state.sideSize[1], state.sideSize[0],~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~    # render the border~
+                  [val[0], val[1] + (state.tileSize[1] / 2) - state.sideSize[1], state.sideSize[0],
+** Processing line: ~                  state.sideSize[1], 'sprites/leftSide.png']~
 - Inside source: true
 *** True Line Result
-    # render the border
-** Processing line: ~    border_x = args.state.grid.padding - DESTINATION_TILE_SIZE~
+                  state.sideSize[1], 'sprites/leftSide.png']
+** Processing line: ~              end~
 - Inside source: true
 *** True Line Result
-    border_x = args.state.grid.padding - DESTINATION_TILE_SIZE
-** Processing line: ~    border_y = args.state.grid.padding - DESTINATION_TILE_SIZE~
+              end
+** Processing line: ~          end~
 - Inside source: true
 *** True Line Result
-    border_y = args.state.grid.padding - DESTINATION_TILE_SIZE
-** Processing line: ~    border_size = args.state.grid.size + DESTINATION_TILE_SIZE * 2~
+          end
+** Processing line: ~      end~
 - Inside source: true
 *** True Line Result
-    border_size = args.state.grid.size + DESTINATION_TILE_SIZE * 2
+      end
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~    args.outputs.borders << [border_x,~
+** Processing line: ~      def renderRight~
 - Inside source: true
 *** True Line Result
-    args.outputs.borders << [border_x,
-** Processing line: ~                             border_y,~
+      def renderRight
+** Processing line: ~          #Shows the green right cube face~
 - Inside source: true
 *** True Line Result
-                             border_y,
-** Processing line: ~                             border_size,~
+          #Shows the green right cube face
+** Processing line: ~          outputs.sprites << state.tileCords.map do~
 - Inside source: true
 *** True Line Result
-                             border_size,
-** Processing line: ~                             border_size]~
+          outputs.sprites << state.tileCords.map do
+** Processing line: ~              |val|~
 - Inside source: true
 *** True Line Result
-                             border_size]
-** Processing line: ~~
+              |val|
+** Processing line: ~              if val[2] == true && val[4] == true        #Checks if it exists & checks if right face needs to be rendered~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~    # render label stuff~
+              if val[2] == true && val[4] == true        #Checks if it exists & checks if right face needs to be rendered
+** Processing line: ~                  [val[0] + state.tileSize[0] / 2, val[1] + (state.tileSize[1] / 2) - state.sideSize[1], state.sideSize[0],~
 - Inside source: true
 *** True Line Result
-    # render label stuff
-** Processing line: ~    args.outputs.labels << [border_x, border_y - 10, "Current player location is: #{args.state.player.x}, #{args.state.player.y}"]~
+                  [val[0] + state.tileSize[0] / 2, val[1] + (state.tileSize[1] / 2) - state.sideSize[1], state.sideSize[0],
+** Processing line: ~                  state.sideSize[1], 'sprites/rightSide.png']~
 - Inside source: true
 *** True Line Result
-    args.outputs.labels << [border_x, border_y - 10, "Current player location is: #{args.state.player.x}, #{args.state.player.y}"]
-** Processing line: ~    args.outputs.labels << [border_x, border_y + 25 + border_size, args.state.info_message]~
+                  state.sideSize[1], 'sprites/rightSide.png']
+** Processing line: ~              end~
 - Inside source: true
 *** True Line Result
-    args.outputs.labels << [border_x, border_y + 25 + border_size, args.state.info_message]
-** Processing line: ~  end~
+              end
+** Processing line: ~          end~
 - Inside source: true
 *** True Line Result
-  end
+          end
+** Processing line: ~      end~
+- Inside source: true
+*** True Line Result
+      end
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~  def tile_in_game x, y, tile_key~
+** Processing line: ~      def renderTiles~
 - Inside source: true
 *** True Line Result
-  def tile_in_game x, y, tile_key
-** Processing line: ~    tile($gtk.args.state.grid.padding + x * DESTINATION_TILE_SIZE,~
+      def renderTiles
+** Processing line: ~          #Shows the tile itself. Important that it's rendered after the two above!~
 - Inside source: true
 *** True Line Result
-    tile($gtk.args.state.grid.padding + x * DESTINATION_TILE_SIZE,
-** Processing line: ~         $gtk.args.state.grid.padding + y * DESTINATION_TILE_SIZE,~
+          #Shows the tile itself. Important that it's rendered after the two above!
+** Processing line: ~          outputs.sprites << state.tileCords.map do~
 - Inside source: true
 *** True Line Result
-         $gtk.args.state.grid.padding + y * DESTINATION_TILE_SIZE,
-** Processing line: ~         tile_key)~
+          outputs.sprites << state.tileCords.map do
+** Processing line: ~              |val|~
 - Inside source: true
 *** True Line Result
-         tile_key)
-** Processing line: ~  end~
+              |val|
+** Processing line: ~              if val[2] == true     #Chcekcs if tile needs to be rendered~
 - Inside source: true
 *** True Line Result
-  end
-** Processing line: ~~
+              if val[2] == true     #Chcekcs if tile needs to be rendered
+** Processing line: ~                if val[5] == state.currentSpriteLocation~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~#+end_src~
-- Line was identified as the end of a code block.
-*** True Line Result
-#+end_src
-** Processing line: ~~
-- End of paragraph detected.
+                if val[5] == state.currentSpriteLocation
+** Processing line: ~                  [val[0], val[1], state.tileSize[0], state.tileSize[1], 'sprites/selectedTile.png']~
+- Inside source: true
 *** True Line Result
-
-** Processing line: ~*** Rpg Roguelike - Roguelike Starting Point - sprite_lookup.rb~
-- Header detected.
+                  [val[0], val[1], state.tileSize[0], state.tileSize[1], 'sprites/selectedTile.png']
+** Processing line: ~                else~
+- Inside source: true
 *** True Line Result
-
+                else
+** Processing line: ~                  [val[0], val[1], state.tileSize[0], state.tileSize[1], 'sprites/tile.png']~
+- Inside source: true
 *** True Line Result
-*** Rpg Roguelike - Roguelike Starting Point - sprite_lookup.rb
-** Processing line: ~#+begin_src ruby~
-- Line was identified as the beginning of a code block.
+                  [val[0], val[1], state.tileSize[0], state.tileSize[1], 'sprites/tile.png']
+** Processing line: ~                end~
+- Inside source: true
 *** True Line Result
-
+                end
+** Processing line: ~              end~
+- Inside source: true
 *** True Line Result
-#+begin_src ruby
-** Processing line: ~  # ./samples/99_genre_rpg_roguelike/01_roguelike_starting_point/app/sprite_lookup.rb~
+              end
+** Processing line: ~          end~
 - Inside source: true
 *** True Line Result
-  # ./samples/99_genre_rpg_roguelike/01_roguelike_starting_point/app/sprite_lookup.rb
-** Processing line: ~  def sprite_lookup~
+          end
+** Processing line: ~      end~
 - Inside source: true
 *** True Line Result
-  def sprite_lookup
-** Processing line: ~    {~
+      end
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-    {
-** Processing line: ~      0 => [3, 0],~
+
+** Processing line: ~      def renderObjects~
 - Inside source: true
 *** True Line Result
-      0 => [3, 0],
-** Processing line: ~      1 => [3, 1],~
+      def renderObjects
+** Processing line: ~          #Renders the sprites on top of the tiles. Order of rendering: top corner to right corner and cascade down until left corner~
 - Inside source: true
 *** True Line Result
-      1 => [3, 1],
-** Processing line: ~      2 => [3, 2],~
+          #Renders the sprites on top of the tiles. Order of rendering: top corner to right corner and cascade down until left corner
+** Processing line: ~          #to bottom corner.~
 - Inside source: true
 *** True Line Result
-      2 => [3, 2],
-** Processing line: ~      3 => [3, 3],~
+          #to bottom corner.
+** Processing line: ~          a = (state.quantity * state.quantity) - state.quantity~
 - Inside source: true
 *** True Line Result
-      3 => [3, 3],
-** Processing line: ~      4 => [3, 4],~
+          a = (state.quantity * state.quantity) - state.quantity
+** Processing line: ~          iter = 0~
 - Inside source: true
 *** True Line Result
-      4 => [3, 4],
-** Processing line: ~      5 => [3, 5],~
+          iter = 0
+** Processing line: ~          loop do~
 - Inside source: true
 *** True Line Result
-      5 => [3, 5],
-** Processing line: ~      6 => [3, 6],~
+          loop do
+** Processing line: ~              if state.tileCords[a][2] == true && state.tileCords[a][6] != -1~
 - Inside source: true
 *** True Line Result
-      6 => [3, 6],
-** Processing line: ~      7 => [3, 7],~
+              if state.tileCords[a][2] == true && state.tileCords[a][6] != -1
+** Processing line: ~                  outputs.sprites << [state.tileCords[a][0] + state.spriteSelection[state.tileCords[a][6]][1],~
 - Inside source: true
 *** True Line Result
-      7 => [3, 7],
-** Processing line: ~      8 => [3, 8],~
+                  outputs.sprites << [state.tileCords[a][0] + state.spriteSelection[state.tileCords[a][6]][1],
+** Processing line: ~                                      state.tileCords[a][1] + state.spriteSelection[state.tileCords[a][6]][2],~
 - Inside source: true
 *** True Line Result
-      8 => [3, 8],
-** Processing line: ~      9 => [3, 9],~
+                                      state.tileCords[a][1] + state.spriteSelection[state.tileCords[a][6]][2],
+** Processing line: ~                                      state.spriteSelection[state.tileCords[a][6]][3], state.spriteSelection[state.tileCords[a][6]][4],~
 - Inside source: true
 *** True Line Result
-      9 => [3, 9],
-** Processing line: ~      '@' => [4, 0],~
+                                      state.spriteSelection[state.tileCords[a][6]][3], state.spriteSelection[state.tileCords[a][6]][4],
+** Processing line: ~                                      'sprites/' + state.spriteSelection[state.tileCords[a][6]][0] + '.png']~
 - Inside source: true
 *** True Line Result
-      '@' => [4, 0],
-** Processing line: ~      A: [ 4,  1],~
+                                      'sprites/' + state.spriteSelection[state.tileCords[a][6]][0] + '.png']
+** Processing line: ~              end~
 - Inside source: true
 *** True Line Result
-      A: [ 4,  1],
-** Processing line: ~      B: [ 4,  2],~
+              end
+** Processing line: ~              iter += 1~
 - Inside source: true
 *** True Line Result
-      B: [ 4,  2],
-** Processing line: ~      C: [ 4,  3],~
+              iter += 1
+** Processing line: ~              a    += 1~
 - Inside source: true
 *** True Line Result
-      C: [ 4,  3],
-** Processing line: ~      D: [ 4,  4],~
+              a    += 1
+** Processing line: ~              a -= state.quantity * 2 if iter == state.quantity~
 - Inside source: true
 *** True Line Result
-      D: [ 4,  4],
-** Processing line: ~      E: [ 4,  5],~
+              a -= state.quantity * 2 if iter == state.quantity
+** Processing line: ~              iter = 0                if iter == state.quantity~
 - Inside source: true
 *** True Line Result
-      E: [ 4,  5],
-** Processing line: ~      F: [ 4,  6],~
+              iter = 0                if iter == state.quantity
+** Processing line: ~              break if a < 0~
 - Inside source: true
 *** True Line Result
-      F: [ 4,  6],
-** Processing line: ~      G: [ 4,  7],~
+              break if a < 0
+** Processing line: ~          end~
 - Inside source: true
 *** True Line Result
-      G: [ 4,  7],
-** Processing line: ~      H: [ 4,  8],~
+          end
+** Processing line: ~      end~
 - Inside source: true
 *** True Line Result
-      H: [ 4,  8],
-** Processing line: ~      I: [ 4,  9],~
+      end
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-      I: [ 4,  9],
-** Processing line: ~      J: [ 4, 10],~
+
+** Processing line: ~      def renderLabels~
 - Inside source: true
 *** True Line Result
-      J: [ 4, 10],
-** Processing line: ~      K: [ 4, 11],~
+      def renderLabels
+** Processing line: ~          #Labels~
 - Inside source: true
 *** True Line Result
-      K: [ 4, 11],
-** Processing line: ~      L: [ 4, 12],~
+          #Labels
+** Processing line: ~          outputs.labels << [50, 680, 'Click to delete!',             5, 0, 255, 255, 255, 255] if state.mode == :delete~
 - Inside source: true
 *** True Line Result
-      L: [ 4, 12],
-** Processing line: ~      M: [ 4, 13],~
+          outputs.labels << [50, 680, 'Click to delete!',             5, 0, 255, 255, 255, 255] if state.mode == :delete
+** Processing line: ~          outputs.labels << [50, 640, 'Press \'i\' for insert mode!', 5, 0, 255, 255, 255, 255] if state.mode == :delete~
 - Inside source: true
 *** True Line Result
-      M: [ 4, 13],
-** Processing line: ~      N: [ 4, 14],~
+          outputs.labels << [50, 640, 'Press \'i\' for insert mode!', 5, 0, 255, 255, 255, 255] if state.mode == :delete
+** Processing line: ~          outputs.labels << [50, 680, 'Click to insert!',             5, 0, 255, 255, 255, 255] if state.mode == :insert~
 - Inside source: true
 *** True Line Result
-      N: [ 4, 14],
-** Processing line: ~      O: [ 4, 15],~
+          outputs.labels << [50, 680, 'Click to insert!',             5, 0, 255, 255, 255, 255] if state.mode == :insert
+** Processing line: ~          outputs.labels << [50, 640, 'Press \'d\' for delete mode!', 5, 0, 255, 255, 255, 255] if state.mode == :insert~
 - Inside source: true
 *** True Line Result
-      O: [ 4, 15],
-** Processing line: ~      P: [ 5,  0],~
+          outputs.labels << [50, 640, 'Press \'d\' for delete mode!', 5, 0, 255, 255, 255, 255] if state.mode == :insert
+** Processing line: ~      end~
 - Inside source: true
 *** True Line Result
-      P: [ 5,  0],
-** Processing line: ~      Q: [ 5,  1],~
+      end
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-      Q: [ 5,  1],
-** Processing line: ~      R: [ 5,  2],~
+
+** Processing line: ~      def calc~
 - Inside source: true
 *** True Line Result
-      R: [ 5,  2],
-** Processing line: ~      S: [ 5,  3],~
+      def calc
+** Processing line: ~          calcCurrentHover~
 - Inside source: true
 *** True Line Result
-      S: [ 5,  3],
-** Processing line: ~      T: [ 5,  4],~
+          calcCurrentHover
+** Processing line: ~      end~
 - Inside source: true
 *** True Line Result
-      T: [ 5,  4],
-** Processing line: ~      U: [ 5,  5],~
+      end
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-      U: [ 5,  5],
-** Processing line: ~      V: [ 5,  6],~
+
+** Processing line: ~      def calcCurrentHover~
 - Inside source: true
 *** True Line Result
-      V: [ 5,  6],
-** Processing line: ~      W: [ 5,  7],~
+      def calcCurrentHover
+** Processing line: ~          #This determines what tile the mouse is hovering (or last hovering) over~
 - Inside source: true
 *** True Line Result
-      W: [ 5,  7],
-** Processing line: ~      X: [ 5,  8],~
+          #This determines what tile the mouse is hovering (or last hovering) over
+** Processing line: ~          x = inputs.mouse.position.x~
 - Inside source: true
 *** True Line Result
-      X: [ 5,  8],
-** Processing line: ~      Y: [ 5,  9],~
+          x = inputs.mouse.position.x
+** Processing line: ~          y = inputs.mouse.position.y~
 - Inside source: true
 *** True Line Result
-      Y: [ 5,  9],
-** Processing line: ~      Z: [ 5, 10],~
+          y = inputs.mouse.position.y
+** Processing line: ~          m = (state.tileSize[1] / state.tileSize[0])   #slope~
 - Inside source: true
 *** True Line Result
-      Z: [ 5, 10],
-** Processing line: ~      a: [ 6,  1],~
+          m = (state.tileSize[1] / state.tileSize[0])   #slope
+** Processing line: ~          state.tileCords.map do~
 - Inside source: true
 *** True Line Result
-      a: [ 6,  1],
-** Processing line: ~      b: [ 6,  2],~
+          state.tileCords.map do
+** Processing line: ~              |val|~
 - Inside source: true
 *** True Line Result
-      b: [ 6,  2],
-** Processing line: ~      c: [ 6,  3],~
+              |val|
+** Processing line: ~              #Conditions that makes runtime faster. Checks if the mouse click was between tile dimensions (rectangle collision)~
 - Inside source: true
 *** True Line Result
-      c: [ 6,  3],
-** Processing line: ~      d: [ 6,  4],~
+              #Conditions that makes runtime faster. Checks if the mouse click was between tile dimensions (rectangle collision)
+** Processing line: ~              next unless val[0] < x && x < val[0] + state.tileSize[0]~
 - Inside source: true
 *** True Line Result
-      d: [ 6,  4],
-** Processing line: ~      e: [ 6,  5],~
+              next unless val[0] < x && x < val[0] + state.tileSize[0]
+** Processing line: ~              next unless val[1] < y && y < val[1] + state.tileSize[1]~
 - Inside source: true
 *** True Line Result
-      e: [ 6,  5],
-** Processing line: ~      f: [ 6,  6],~
+              next unless val[1] < y && y < val[1] + state.tileSize[1]
+** Processing line: ~              next unless val[2] == true~
 - Inside source: true
 *** True Line Result
-      f: [ 6,  6],
-** Processing line: ~      g: [ 6,  7],~
+              next unless val[2] == true
+** Processing line: ~              tempBool = false~
 - Inside source: true
 *** True Line Result
-      g: [ 6,  7],
-** Processing line: ~      h: [ 6,  8],~
+              tempBool = false
+** Processing line: ~              if x == val[0] + (state.tileSize[0] / 2)~
 - Inside source: true
 *** True Line Result
-      h: [ 6,  8],
-** Processing line: ~      i: [ 6,  9],~
+              if x == val[0] + (state.tileSize[0] / 2)
+** Processing line: ~                  #The height of a diamond is the height of the diamond, so if x equals that exact point, it must be inside the diamond~
 - Inside source: true
 *** True Line Result
-      i: [ 6,  9],
-** Processing line: ~      j: [ 6, 10],~
+                  #The height of a diamond is the height of the diamond, so if x equals that exact point, it must be inside the diamond
+** Processing line: ~                  tempBool = true~
 - Inside source: true
 *** True Line Result
-      j: [ 6, 10],
-** Processing line: ~      k: [ 6, 11],~
+                  tempBool = true
+** Processing line: ~              elsif x < state.tileSize[0] / 2 + val[0]~
 - Inside source: true
 *** True Line Result
-      k: [ 6, 11],
-** Processing line: ~      l: [ 6, 12],~
+              elsif x < state.tileSize[0] / 2 + val[0]
+** Processing line: ~                  #Uses y = (m) * (x - x1) + y1 to determine the y values for the two diamond lines on the left half of diamond~
 - Inside source: true
 *** True Line Result
-      l: [ 6, 12],
-** Processing line: ~      m: [ 6, 13],~
+                  #Uses y = (m) * (x - x1) + y1 to determine the y values for the two diamond lines on the left half of diamond
+** Processing line: ~                  tempY1 =      (m * (x - val[0])) + val[1] + (state.tileSize[1] / 2)~
 - Inside source: true
 *** True Line Result
-      m: [ 6, 13],
-** Processing line: ~      n: [ 6, 14],~
+                  tempY1 =      (m * (x - val[0])) + val[1] + (state.tileSize[1] / 2)
+** Processing line: ~                  tempY2 = (-1 * m * (x - val[0])) + val[1] + (state.tileSize[1] / 2)~
 - Inside source: true
 *** True Line Result
-      n: [ 6, 14],
-** Processing line: ~      o: [ 6, 15],~
+                  tempY2 = (-1 * m * (x - val[0])) + val[1] + (state.tileSize[1] / 2)
+** Processing line: ~                  #Checks to see if the mouse click y value is between those temp y values~
 - Inside source: true
 *** True Line Result
-      o: [ 6, 15],
-** Processing line: ~      p: [ 7,  0],~
+                  #Checks to see if the mouse click y value is between those temp y values
+** Processing line: ~                  tempBool = true if y < tempY1 && y > tempY2~
 - Inside source: true
 *** True Line Result
-      p: [ 7,  0],
-** Processing line: ~      q: [ 7,  1],~
+                  tempBool = true if y < tempY1 && y > tempY2
+** Processing line: ~              elsif x > state.tileSize[0] / 2 + val[0]~
 - Inside source: true
 *** True Line Result
-      q: [ 7,  1],
-** Processing line: ~      r: [ 7,  2],~
+              elsif x > state.tileSize[0] / 2 + val[0]
+** Processing line: ~                  #Uses y = (m) * (x - x1) + y1 to determine the y values for the two diamond lines on the right half of diamond~
 - Inside source: true
 *** True Line Result
-      r: [ 7,  2],
-** Processing line: ~      s: [ 7,  3],~
+                  #Uses y = (m) * (x - x1) + y1 to determine the y values for the two diamond lines on the right half of diamond
+** Processing line: ~                  tempY1 =      (m * (x - val[0] - (state.tileSize[0] / 2))) + val[1]~
 - Inside source: true
 *** True Line Result
-      s: [ 7,  3],
-** Processing line: ~      t: [ 7,  4],~
+                  tempY1 =      (m * (x - val[0] - (state.tileSize[0] / 2))) + val[1]
+** Processing line: ~                  tempY2 = (-1 * m * (x - val[0] - (state.tileSize[0] / 2))) + val[1] + state.tileSize[1]~
 - Inside source: true
 *** True Line Result
-      t: [ 7,  4],
-** Processing line: ~      u: [ 7,  5],~
+                  tempY2 = (-1 * m * (x - val[0] - (state.tileSize[0] / 2))) + val[1] + state.tileSize[1]
+** Processing line: ~                  #Checks to see if the mouse click y value is between those temp y values~
 - Inside source: true
 *** True Line Result
-      u: [ 7,  5],
-** Processing line: ~      v: [ 7,  6],~
+                  #Checks to see if the mouse click y value is between those temp y values
+** Processing line: ~                  tempBool = true if y > tempY1 && y < tempY2~
 - Inside source: true
 *** True Line Result
-      v: [ 7,  6],
-** Processing line: ~      w: [ 7,  7],~
+                  tempBool = true if y > tempY1 && y < tempY2
+** Processing line: ~              end~
 - Inside source: true
 *** True Line Result
-      w: [ 7,  7],
-** Processing line: ~      x: [ 7,  8],~
+              end
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-      x: [ 7,  8],
-** Processing line: ~      y: [ 7,  9],~
+
+** Processing line: ~              if tempBool == true~
 - Inside source: true
 *** True Line Result
-      y: [ 7,  9],
-** Processing line: ~      z: [ 7, 10],~
+              if tempBool == true
+** Processing line: ~                  state.currentSpriteLocation = val[5]         #Current sprite location set to the order value~
 - Inside source: true
 *** True Line Result
-      z: [ 7, 10],
-** Processing line: ~      '|' => [ 7, 12]~
+                  state.currentSpriteLocation = val[5]         #Current sprite location set to the order value
+** Processing line: ~              end~
 - Inside source: true
 *** True Line Result
-      '|' => [ 7, 12]
-** Processing line: ~    }~
+              end
+** Processing line: ~          end~
 - Inside source: true
 *** True Line Result
-    }
-** Processing line: ~  end~
+          end
+** Processing line: ~      end~
 - Inside source: true
 *** True Line Result
-  end
+      end
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~  def sprite key~
+** Processing line: ~      def process_inputs~
 - Inside source: true
 *** True Line Result
-  def sprite key
-** Processing line: ~    $gtk.args.state.reserved.sprite_lookup[key]~
+      def process_inputs
+** Processing line: ~          #Makes development much faster and easier~
 - Inside source: true
 *** True Line Result
-    $gtk.args.state.reserved.sprite_lookup[key]
-** Processing line: ~  end~
+          #Makes development much faster and easier
+** Processing line: ~          if inputs.keyboard.key_up.r~
 - Inside source: true
 *** True Line Result
-  end
+          if inputs.keyboard.key_up.r
+** Processing line: ~              $dragon.reset~
+- Inside source: true
+*** True Line Result
+              $dragon.reset
+** Processing line: ~          end~
+- Inside source: true
+*** True Line Result
+          end
+** Processing line: ~          checkTileSelected~
+- Inside source: true
+*** True Line Result
+          checkTileSelected
+** Processing line: ~          switchModes~
+- Inside source: true
+*** True Line Result
+          switchModes
+** Processing line: ~      end~
+- Inside source: true
+*** True Line Result
+      end
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~  def member_name_as_code raw_member_name~
+** Processing line: ~      def checkTileSelected~
 - Inside source: true
 *** True Line Result
-  def member_name_as_code raw_member_name
-** Processing line: ~    if raw_member_name.is_a? Symbol~
+      def checkTileSelected
+** Processing line: ~          if inputs.mouse.down~
 - Inside source: true
 *** True Line Result
-    if raw_member_name.is_a? Symbol
-** Processing line: ~      ":#{raw_member_name}"~
+          if inputs.mouse.down
+** Processing line: ~              x = inputs.mouse.down.point.x~
 - Inside source: true
 *** True Line Result
-      ":#{raw_member_name}"
-** Processing line: ~    elsif raw_member_name.is_a? String~
+              x = inputs.mouse.down.point.x
+** Processing line: ~              y = inputs.mouse.down.point.y~
 - Inside source: true
 *** True Line Result
-    elsif raw_member_name.is_a? String
-** Processing line: ~      "'#{raw_member_name}'"~
+              y = inputs.mouse.down.point.y
+** Processing line: ~              m = (state.tileSize[1] / state.tileSize[0])   #slope~
 - Inside source: true
 *** True Line Result
-      "'#{raw_member_name}'"
-** Processing line: ~    elsif raw_member_name.is_a? Fixnum~
+              m = (state.tileSize[1] / state.tileSize[0])   #slope
+** Processing line: ~              state.tileCords.map do~
 - Inside source: true
 *** True Line Result
-    elsif raw_member_name.is_a? Fixnum
-** Processing line: ~      "#{raw_member_name}"~
+              state.tileCords.map do
+** Processing line: ~                  |val|~
 - Inside source: true
 *** True Line Result
-      "#{raw_member_name}"
-** Processing line: ~    else~
+                  |val|
+** Processing line: ~                  #Conditions that makes runtime faster. Checks if the mouse click was between tile dimensions (rectangle collision)~
 - Inside source: true
 *** True Line Result
-    else
-** Processing line: ~      "UNKNOWN: #{raw_member_name}"~
+                  #Conditions that makes runtime faster. Checks if the mouse click was between tile dimensions (rectangle collision)
+** Processing line: ~                  next unless val[0] < x && x < val[0] + state.tileSize[0]~
 - Inside source: true
 *** True Line Result
-      "UNKNOWN: #{raw_member_name}"
-** Processing line: ~    end~
+                  next unless val[0] < x && x < val[0] + state.tileSize[0]
+** Processing line: ~                  next unless val[1] < y && y < val[1] + state.tileSize[1]~
 - Inside source: true
 *** True Line Result
-    end
-** Processing line: ~  end~
+                  next unless val[1] < y && y < val[1] + state.tileSize[1]
+** Processing line: ~                  next unless val[2] == true~
 - Inside source: true
 *** True Line Result
-  end
-** Processing line: ~~
+                  next unless val[2] == true
+** Processing line: ~                  tempBool = false~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~  def tile x, y, tile_row_column_or_key~
+                  tempBool = false
+** Processing line: ~                  if x == val[0] + (state.tileSize[0] / 2)~
 - Inside source: true
 *** True Line Result
-  def tile x, y, tile_row_column_or_key
-** Processing line: ~    tile_extended x, y, DESTINATION_TILE_SIZE, DESTINATION_TILE_SIZE, TILE_R, TILE_G, TILE_B, TILE_A, tile_row_column_or_key~
+                  if x == val[0] + (state.tileSize[0] / 2)
+** Processing line: ~                      #The height of a diamond is the height of the diamond, so if x equals that exact point, it must be inside the diamond~
 - Inside source: true
 *** True Line Result
-    tile_extended x, y, DESTINATION_TILE_SIZE, DESTINATION_TILE_SIZE, TILE_R, TILE_G, TILE_B, TILE_A, tile_row_column_or_key
-** Processing line: ~  end~
+                      #The height of a diamond is the height of the diamond, so if x equals that exact point, it must be inside the diamond
+** Processing line: ~                      tempBool = true~
 - Inside source: true
 *** True Line Result
-  end
-** Processing line: ~~
+                      tempBool = true
+** Processing line: ~                  elsif x < state.tileSize[0] / 2 + val[0]~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~  def tile_extended x, y, w, h, r, g, b, a, tile_row_column_or_key~
+                  elsif x < state.tileSize[0] / 2 + val[0]
+** Processing line: ~                      #Uses y = (m) * (x - x1) + y1 to determine the y values for the two diamond lines on the left half of diamond~
 - Inside source: true
 *** True Line Result
-  def tile_extended x, y, w, h, r, g, b, a, tile_row_column_or_key
-** Processing line: ~    row_or_key, column = tile_row_column_or_key~
+                      #Uses y = (m) * (x - x1) + y1 to determine the y values for the two diamond lines on the left half of diamond
+** Processing line: ~                      tempY1 =      (m * (x - val[0])) + val[1] + (state.tileSize[1] / 2)~
 - Inside source: true
 *** True Line Result
-    row_or_key, column = tile_row_column_or_key
-** Processing line: ~    if !column~
+                      tempY1 =      (m * (x - val[0])) + val[1] + (state.tileSize[1] / 2)
+** Processing line: ~                      tempY2 = (-1 * m * (x - val[0])) + val[1] + (state.tileSize[1] / 2)~
 - Inside source: true
 *** True Line Result
-    if !column
-** Processing line: ~      row, column = sprite row_or_key~
+                      tempY2 = (-1 * m * (x - val[0])) + val[1] + (state.tileSize[1] / 2)
+** Processing line: ~                      #Checks to see if the mouse click y value is between those temp y values~
 - Inside source: true
 *** True Line Result
-      row, column = sprite row_or_key
-** Processing line: ~    else~
+                      #Checks to see if the mouse click y value is between those temp y values
+** Processing line: ~                      tempBool = true if y < tempY1 && y > tempY2~
 - Inside source: true
 *** True Line Result
-    else
-** Processing line: ~      row, column = row_or_key, column~
+                      tempBool = true if y < tempY1 && y > tempY2
+** Processing line: ~                  elsif x > state.tileSize[0] / 2 + val[0]~
 - Inside source: true
 *** True Line Result
-      row, column = row_or_key, column
-** Processing line: ~    end~
+                  elsif x > state.tileSize[0] / 2 + val[0]
+** Processing line: ~                      #Uses y = (m) * (x - x1) + y1 to determine the y values for the two diamond lines on the right half of diamond~
 - Inside source: true
 *** True Line Result
-    end
-** Processing line: ~~
+                      #Uses y = (m) * (x - x1) + y1 to determine the y values for the two diamond lines on the right half of diamond
+** Processing line: ~                      tempY1 =      (m * (x - val[0] - (state.tileSize[0] / 2))) + val[1]~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~    if !row~
+                      tempY1 =      (m * (x - val[0] - (state.tileSize[0] / 2))) + val[1]
+** Processing line: ~                      tempY2 = (-1 * m * (x - val[0] - (state.tileSize[0] / 2))) + val[1] + state.tileSize[1]~
 - Inside source: true
 *** True Line Result
-    if !row
-** Processing line: ~      member_name = member_name_as_code tile_row_column_or_key~
+                      tempY2 = (-1 * m * (x - val[0] - (state.tileSize[0] / 2))) + val[1] + state.tileSize[1]
+** Processing line: ~                      #Checks to see if the mouse click y value is between those temp y values~
 - Inside source: true
 *** True Line Result
-      member_name = member_name_as_code tile_row_column_or_key
-** Processing line: ~      raise "Unabled to find a sprite for #{member_name}. Make sure the value exists in app/sprite_lookup.rb."~
+                      #Checks to see if the mouse click y value is between those temp y values
+** Processing line: ~                      tempBool = true if y > tempY1 && y < tempY2~
 - Inside source: true
 *** True Line Result
-      raise "Unabled to find a sprite for #{member_name}. Make sure the value exists in app/sprite_lookup.rb."
-** Processing line: ~    end~
+                      tempBool = true if y > tempY1 && y < tempY2
+** Processing line: ~                  end~
 - Inside source: true
 *** True Line Result
-    end
+                  end
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~    # Sprite provided by Rogue Yun~
+** Processing line: ~                  if tempBool == true~
 - Inside source: true
 *** True Line Result
-    # Sprite provided by Rogue Yun
-** Processing line: ~    # http://www.bay12forums.com/smf/index.php?topic=144897.0~
+                  if tempBool == true
+** Processing line: ~                      if state.mode == :delete~
 - Inside source: true
 *** True Line Result
-    # http://www.bay12forums.com/smf/index.php?topic=144897.0
-** Processing line: ~    # License: Public Domain~
+                      if state.mode == :delete
+** Processing line: ~                          val[2] = false~
 - Inside source: true
 *** True Line Result
-    # License: Public Domain
-** Processing line: ~~
+                          val[2] = false
+** Processing line: ~                          state.tileGrid[val[5]][2]  = false      #Unnecessary because never used again but eh, I like consistency~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~    {~
+                          state.tileGrid[val[5]][2]  = false      #Unnecessary because never used again but eh, I like consistency
+** Processing line: ~                          state.tileCords[val[5]][2] = false      #Ensures that the tile isn't rendered~
 - Inside source: true
 *** True Line Result
-    {
-** Processing line: ~      x: x,~
+                          state.tileCords[val[5]][2] = false      #Ensures that the tile isn't rendered
+** Processing line: ~                          unless state.tileGrid[val[5]][0] == 0   #If tile is the left most tile in the row, right doesn't get rendered~
 - Inside source: true
 *** True Line Result
-      x: x,
-** Processing line: ~      y: y,~
+                          unless state.tileGrid[val[5]][0] == 0   #If tile is the left most tile in the row, right doesn't get rendered
+** Processing line: ~                              state.tileGrid[val[5] - 1][4] = true            #Why the order value is amazing~
 - Inside source: true
 *** True Line Result
-      y: y,
-** Processing line: ~      w: w,~
+                              state.tileGrid[val[5] - 1][4] = true            #Why the order value is amazing
+** Processing line: ~                              state.tileCords[val[5] - 1][4] = true~
 - Inside source: true
 *** True Line Result
-      w: w,
-** Processing line: ~      h: h,~
+                              state.tileCords[val[5] - 1][4] = true
+** Processing line: ~                          end~
 - Inside source: true
 *** True Line Result
-      h: h,
-** Processing line: ~      tile_x: column * 16,~
+                          end
+** Processing line: ~                          unless state.tileGrid[val[5]][1] == state.quantity - 1     #Same but left side~
 - Inside source: true
 *** True Line Result
-      tile_x: column * 16,
-** Processing line: ~      tile_y: (row * 16),~
+                          unless state.tileGrid[val[5]][1] == state.quantity - 1     #Same but left side
+** Processing line: ~                              state.tileGrid[val[5] + state.quantity][3] = true~
 - Inside source: true
 *** True Line Result
-      tile_y: (row * 16),
-** Processing line: ~      tile_w: 16,~
+                              state.tileGrid[val[5] + state.quantity][3] = true
+** Processing line: ~                              state.tileCords[val[5] + state.quantity][3] = true~
 - Inside source: true
 *** True Line Result
-      tile_w: 16,
-** Processing line: ~      tile_h: 16,~
+                              state.tileCords[val[5] + state.quantity][3] = true
+** Processing line: ~                          end~
 - Inside source: true
 *** True Line Result
-      tile_h: 16,
-** Processing line: ~      r: r,~
+                          end
+** Processing line: ~                      elsif state.mode == :insert~
 - Inside source: true
 *** True Line Result
-      r: r,
-** Processing line: ~      g: g,~
+                      elsif state.mode == :insert
+** Processing line: ~                          #adds the current sprite value selected to tileCords. (changes from the -1 earlier)~
 - Inside source: true
 *** True Line Result
-      g: g,
-** Processing line: ~      b: b,~
+                          #adds the current sprite value selected to tileCords. (changes from the -1 earlier)
+** Processing line: ~                          val[6] = rand(state.spriteSelection.length)~
 - Inside source: true
 *** True Line Result
-      b: b,
-** Processing line: ~      a: a,~
+                          val[6] = rand(state.spriteSelection.length)
+** Processing line: ~                      end~
 - Inside source: true
 *** True Line Result
-      a: a,
-** Processing line: ~      path: 'sprites/simple-mood-16x16.png'~
+                      end
+** Processing line: ~                  end~
 - Inside source: true
 *** True Line Result
-      path: 'sprites/simple-mood-16x16.png'
-** Processing line: ~    }~
+                  end
+** Processing line: ~              end~
 - Inside source: true
 *** True Line Result
-    }
-** Processing line: ~  end~
+              end
+** Processing line: ~          end~
 - Inside source: true
 *** True Line Result
-  end
+          end
+** Processing line: ~      end~
+- Inside source: true
+*** True Line Result
+      end
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~  $gtk.args.state.reserved.sprite_lookup = sprite_lookup~
+** Processing line: ~      def switchModes~
 - Inside source: true
 *** True Line Result
-  $gtk.args.state.reserved.sprite_lookup = sprite_lookup
-** Processing line: ~~
+      def switchModes
+** Processing line: ~          #Switches between insert and delete modes~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~#+end_src~
-- Line was identified as the end of a code block.
+          #Switches between insert and delete modes
+** Processing line: ~          if inputs.keyboard.key_up.i && state.mode == :delete~
+- Inside source: true
 *** True Line Result
-#+end_src
-** Processing line: ~~
-- End of paragraph detected.
+          if inputs.keyboard.key_up.i && state.mode == :delete
+** Processing line: ~              state.mode = :insert~
+- Inside source: true
 *** True Line Result
-
-** Processing line: ~*** Rpg Roguelike - Roguelike Line Of Sight - main.rb~
-- Header detected.
+              state.mode = :insert
+** Processing line: ~              inputs.keyboard.clear~
+- Inside source: true
 *** True Line Result
-
+              inputs.keyboard.clear
+** Processing line: ~          elsif inputs.keyboard.key_up.d && state.mode == :insert~
+- Inside source: true
 *** True Line Result
-*** Rpg Roguelike - Roguelike Line Of Sight - main.rb
-** Processing line: ~#+begin_src ruby~
-- Line was identified as the beginning of a code block.
+          elsif inputs.keyboard.key_up.d && state.mode == :insert
+** Processing line: ~              state.mode = :delete~
+- Inside source: true
 *** True Line Result
-
+              state.mode = :delete
+** Processing line: ~              inputs.keyboard.clear~
+- Inside source: true
 *** True Line Result
-#+begin_src ruby
-** Processing line: ~  # ./samples/99_genre_rpg_roguelike/02_roguelike_line_of_sight/app/main.rb~
+              inputs.keyboard.clear
+** Processing line: ~          end~
 - Inside source: true
 *** True Line Result
-  # ./samples/99_genre_rpg_roguelike/02_roguelike_line_of_sight/app/main.rb
-** Processing line: ~  =begin~
+          end
+** Processing line: ~      end~
 - Inside source: true
 *** True Line Result
-  =begin
+      end
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~   APIs listing that haven't been encountered in previous sample apps:~
+** Processing line: ~  end~
 - Inside source: true
 *** True Line Result
-   APIs listing that haven't been encountered in previous sample apps:
+  end
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~   - lambda: A way to define a block and its parameters with special syntax.~
+** Processing line: ~  $isometric = Isometric.new~
 - Inside source: true
 *** True Line Result
-   - lambda: A way to define a block and its parameters with special syntax.
-** Processing line: ~     For example, the syntax of lambda looks like this:~
+  $isometric = Isometric.new
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-     For example, the syntax of lambda looks like this:
-** Processing line: ~     my_lambda = -> { puts "This is my lambda" }~
+
+** Processing line: ~  def tick args~
 - Inside source: true
 *** True Line Result
-     my_lambda = -> { puts "This is my lambda" }
-** Processing line: ~~
+  def tick args
+** Processing line: ~      $isometric.grid    = args.grid~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~   Reminders:~
+      $isometric.grid    = args.grid
+** Processing line: ~      $isometric.inputs  = args.inputs~
 - Inside source: true
 *** True Line Result
-   Reminders:
-** Processing line: ~   - args.outputs.labels: An array. The values generate a label.~
+      $isometric.inputs  = args.inputs
+** Processing line: ~      $isometric.state   = args.state~
 - Inside source: true
 *** True Line Result
-   - args.outputs.labels: An array. The values generate a label.
-** Processing line: ~     The parameters are [X, Y, TEXT, SIZE, ALIGNMENT, RED, GREEN, BLUE, ALPHA, FONT STYLE]~
+      $isometric.state   = args.state
+** Processing line: ~      $isometric.outputs = args.outputs~
 - Inside source: true
 *** True Line Result
-     The parameters are [X, Y, TEXT, SIZE, ALIGNMENT, RED, GREEN, BLUE, ALPHA, FONT STYLE]
-** Processing line: ~     For more information about labels, go to mygame/documentation/02-labels.~
+      $isometric.outputs = args.outputs
+** Processing line: ~      $isometric.tick~
 - Inside source: true
 *** True Line Result
-     For more information about labels, go to mygame/documentation/02-labels.
+      $isometric.tick
+** Processing line: ~  end~
+- Inside source: true
+*** True Line Result
+  end
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~   - ARRAY#inside_rect?: Returns whether or not the point is inside a rect.~
-- Inside source: true
+** Processing line: ~#+end_src~
+- Line was identified as the end of a code block.
 *** True Line Result
-   - ARRAY#inside_rect?: Returns whether or not the point is inside a rect.
+#+end_src
 ** Processing line: ~~
-- Inside source: true
+- End of paragraph detected.
 *** True Line Result
 
-** Processing line: ~   - product: Returns an array of all combinations of elements from all arrays.~
-- Inside source: true
+** Processing line: ~*** Rpg Topdown - Topdown Casino - main.rb~
+- Header detected.
 *** True Line Result
-   - product: Returns an array of all combinations of elements from all arrays.
-** Processing line: ~~
-- Inside source: true
+
+*** True Line Result
+*** Rpg Topdown - Topdown Casino - main.rb
+** Processing line: ~#+begin_src ruby~
+- Line was identified as the beginning of a code block.
 *** True Line Result
 
-** Processing line: ~   - find: Finds all elements of a collection that meet requirements.~
+*** True Line Result
+#+begin_src ruby
+** Processing line: ~  # ./samples/99_genre_rpg_topdown/topdown_casino/app/main.rb~
 - Inside source: true
 *** True Line Result
-   - find: Finds all elements of a collection that meet requirements.
+  # ./samples/99_genre_rpg_topdown/topdown_casino/app/main.rb
+** Processing line: ~  $gtk.reset~
+- Inside source: true
+*** True Line Result
+  $gtk.reset
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~   - abs: Returns the absolute value.~
+** Processing line: ~  def coinflip~
 - Inside source: true
 *** True Line Result
-   - abs: Returns the absolute value.
-** Processing line: ~~
+  def coinflip
+** Processing line: ~    rand < 0.5~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~  =end~
+    rand < 0.5
+** Processing line: ~  end~
 - Inside source: true
 *** True Line Result
-  =end
+  end
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~  # This sample app allows the player to move around in the dungeon, which becomes more or less visible~
+** Processing line: ~  class Game~
 - Inside source: true
 *** True Line Result
-  # This sample app allows the player to move around in the dungeon, which becomes more or less visible
-** Processing line: ~  # depending on the player's location, and also has enemies.~
+  class Game
+** Processing line: ~    attr_accessor :args~
 - Inside source: true
 *** True Line Result
-  # depending on the player's location, and also has enemies.
+    attr_accessor :args
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~  class Game~
+** Processing line: ~    def text_font~
 - Inside source: true
 *** True Line Result
-  class Game
-** Processing line: ~    attr_accessor :args, :state, :inputs, :outputs, :grid~
+    def text_font
+** Processing line: ~      return nil #"rpg.ttf"~
 - Inside source: true
 *** True Line Result
-    attr_accessor :args, :state, :inputs, :outputs, :grid
+      return nil #"rpg.ttf"
+** Processing line: ~    end~
+- Inside source: true
+*** True Line Result
+    end
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~    # Calls all the methods needed for the game to run properly.~
+** Processing line: ~    def text_color~
 - Inside source: true
 *** True Line Result
-    # Calls all the methods needed for the game to run properly.
-** Processing line: ~    def tick~
+    def text_color
+** Processing line: ~      [ 255, 255, 255, 255 ]~
 - Inside source: true
 *** True Line Result
-    def tick
-** Processing line: ~      defaults~
+      [ 255, 255, 255, 255 ]
+** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
-      defaults
-** Processing line: ~      render_canvas~
+    end
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-      render_canvas
-** Processing line: ~      render_dungeon~
+
+** Processing line: ~    def set_gem_values~
 - Inside source: true
 *** True Line Result
-      render_dungeon
-** Processing line: ~      render_player~
+    def set_gem_values
+** Processing line: ~      @args.state.gem0 = ((coinflip) ?  100 : 20)~
 - Inside source: true
 *** True Line Result
-      render_player
-** Processing line: ~      render_enemies~
+      @args.state.gem0 = ((coinflip) ?  100 : 20)
+** Processing line: ~      @args.state.gem1 = ((coinflip) ? -10 : -50)~
 - Inside source: true
 *** True Line Result
-      render_enemies
-** Processing line: ~      print_cell_coordinates~
+      @args.state.gem1 = ((coinflip) ? -10 : -50)
+** Processing line: ~      @args.state.gem2 = ((coinflip) ? -10 : -30)~
+- Inside source: true
+*** True Line Result
+      @args.state.gem2 = ((coinflip) ? -10 : -30)
+** Processing line: ~      if coinflip~
+- Inside source: true
+*** True Line Result
+      if coinflip
+** Processing line: ~        tmp = @args.state.gem0~
+- Inside source: true
+*** True Line Result
+        tmp = @args.state.gem0
+** Processing line: ~        @args.state.gem0 = @args.state.gem1~
 - Inside source: true
 *** True Line Result
-      print_cell_coordinates
-** Processing line: ~      calc_canvas~
+        @args.state.gem0 = @args.state.gem1
+** Processing line: ~        @args.state.gem1 = tmp~
 - Inside source: true
 *** True Line Result
-      calc_canvas
-** Processing line: ~      input_move~
+        @args.state.gem1 = tmp
+** Processing line: ~      end~
 - Inside source: true
 *** True Line Result
-      input_move
-** Processing line: ~      input_click_map~
+      end
+** Processing line: ~      if coinflip~
 - Inside source: true
 *** True Line Result
-      input_click_map
-** Processing line: ~    end~
+      if coinflip
+** Processing line: ~        tmp = @args.state.gem1~
 - Inside source: true
 *** True Line Result
-    end
-** Processing line: ~~
+        tmp = @args.state.gem1
+** Processing line: ~        @args.state.gem1 = @args.state.gem2~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~    # Sets default values and initializes variables~
+        @args.state.gem1 = @args.state.gem2
+** Processing line: ~        @args.state.gem2 = tmp~
 - Inside source: true
 *** True Line Result
-    # Sets default values and initializes variables
-** Processing line: ~    def defaults~
+        @args.state.gem2 = tmp
+** Processing line: ~      end~
 - Inside source: true
 *** True Line Result
-    def defaults
-** Processing line: ~      outputs.background_color = [0, 0, 0] # black background~
+      end
+** Processing line: ~      if coinflip~
 - Inside source: true
 *** True Line Result
-      outputs.background_color = [0, 0, 0] # black background
-** Processing line: ~~
+      if coinflip
+** Processing line: ~        tmp = @args.state.gem0~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~      # Initializes empty canvas, dungeon, and enemies collections.~
+        tmp = @args.state.gem0
+** Processing line: ~        @args.state.gem0 = @args.state.gem2~
 - Inside source: true
 *** True Line Result
-      # Initializes empty canvas, dungeon, and enemies collections.
-** Processing line: ~      state.canvas   ||= []~
+        @args.state.gem0 = @args.state.gem2
+** Processing line: ~        @args.state.gem2 = tmp~
 - Inside source: true
 *** True Line Result
-      state.canvas   ||= []
-** Processing line: ~      state.dungeon  ||= []~
+        @args.state.gem2 = tmp
+** Processing line: ~      end~
 - Inside source: true
 *** True Line Result
-      state.dungeon  ||= []
-** Processing line: ~      state.enemies  ||= []~
+      end
+** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
-      state.enemies  ||= []
+    end
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~      # If state.area doesn't have value, load_area_one and derive_dungeon_from_area methods are called~
-- Inside source: true
-*** True Line Result
-      # If state.area doesn't have value, load_area_one and derive_dungeon_from_area methods are called
-** Processing line: ~      if !state.area~
+** Processing line: ~    def initialize args~
 - Inside source: true
 *** True Line Result
-      if !state.area
-** Processing line: ~        load_area_one~
+    def initialize args
+** Processing line: ~      @args = args~
 - Inside source: true
 *** True Line Result
-        load_area_one
-** Processing line: ~        derive_dungeon_from_area~
+      @args = args
+** Processing line: ~      @args.state.animticks = 0~
 - Inside source: true
 *** True Line Result
-        derive_dungeon_from_area
-** Processing line: ~~
+      @args.state.animticks = 0
+** Processing line: ~      @args.state.score = 0~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~        # Changing these values will change the position of player~
+      @args.state.score = 0
+** Processing line: ~      @args.state.gem_chosen = false~
 - Inside source: true
 *** True Line Result
-        # Changing these values will change the position of player
-** Processing line: ~        state.x = 7~
+      @args.state.gem_chosen = false
+** Processing line: ~      @args.state.round_finished = false~
 - Inside source: true
 *** True Line Result
-        state.x = 7
-** Processing line: ~        state.y = 5~
+      @args.state.round_finished = false
+** Processing line: ~      @args.state.gem0_x = 197~
 - Inside source: true
 *** True Line Result
-        state.y = 5
-** Processing line: ~~
+      @args.state.gem0_x = 197
+** Processing line: ~      @args.state.gem0_y = 720-274~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~        # Creates new enemies, sets their values, and adds them to the enemies collection.~
+      @args.state.gem0_y = 720-274
+** Processing line: ~      @args.state.gem1_x = 623~
 - Inside source: true
 *** True Line Result
-        # Creates new enemies, sets their values, and adds them to the enemies collection.
-** Processing line: ~        state.enemies << state.new_entity(:enemy) do |e| # declares each enemy as new entity~
+      @args.state.gem1_x = 623
+** Processing line: ~      @args.state.gem1_y = 720-274~
 - Inside source: true
 *** True Line Result
-        state.enemies << state.new_entity(:enemy) do |e| # declares each enemy as new entity
-** Processing line: ~          e.x           = 13 # position~
+      @args.state.gem1_y = 720-274
+** Processing line: ~      @args.state.gem2_x = 1049~
 - Inside source: true
 *** True Line Result
-          e.x           = 13 # position
-** Processing line: ~          e.y           = 5~
+      @args.state.gem2_x = 1049
+** Processing line: ~      @args.state.gem2_y = 720-274~
 - Inside source: true
 *** True Line Result
-          e.y           = 5
-** Processing line: ~          e.previous_hp = 3~
+      @args.state.gem2_y = 720-274
+** Processing line: ~      @args.state.hero_sprite = "sprites/herodown100.png"~
 - Inside source: true
 *** True Line Result
-          e.previous_hp = 3
-** Processing line: ~          e.hp          = 3~
+      @args.state.hero_sprite = "sprites/herodown100.png"
+** Processing line: ~      @args.state.hero_x = 608~
 - Inside source: true
 *** True Line Result
-          e.hp          = 3
-** Processing line: ~          e.max_hp      = 3~
+      @args.state.hero_x = 608
+** Processing line: ~      @args.state.hero_y = 720-656~
 - Inside source: true
 *** True Line Result
-          e.max_hp      = 3
-** Processing line: ~          e.is_dead     = false # the enemy is alive~
+      @args.state.hero_y = 720-656
+** Processing line: ~      set_gem_values~
 - Inside source: true
 *** True Line Result
-          e.is_dead     = false # the enemy is alive
-** Processing line: ~        end~
+      set_gem_values
+** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
-        end
+    end
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~        update_line_of_sight # updates line of sight by adding newly visible cells~
+** Processing line: ~    def render_gem_value x, y, gem~
 - Inside source: true
 *** True Line Result
-        update_line_of_sight # updates line of sight by adding newly visible cells
+    def render_gem_value x, y, gem
+** Processing line: ~      if @args.state.gem_chosen~
+- Inside source: true
+*** True Line Result
+      if @args.state.gem_chosen
+** Processing line: ~        @args.outputs.labels << [ x, y + 96, gem.to_s, 1, 1, *text_color, text_font ]~
+- Inside source: true
+*** True Line Result
+        @args.outputs.labels << [ x, y + 96, gem.to_s, 1, 1, *text_color, text_font ]
 ** Processing line: ~      end~
 - Inside source: true
 *** True Line Result
@@ -144747,474 +150911,502 @@ Follows is a source code listing for all files that have been open sourced. This
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~    # Adds elements into the state.area collection~
+** Processing line: ~    def render~
 - Inside source: true
 *** True Line Result
-    # Adds elements into the state.area collection
-** Processing line: ~    # The dungeon is derived using the coordinates of this collection~
+    def render
+** Processing line: ~      gemsprite = ((@args.state.animticks % 400) < 200) ? 'sprites/gem200.png' : 'sprites/gem400.png'~
 - Inside source: true
 *** True Line Result
-    # The dungeon is derived using the coordinates of this collection
-** Processing line: ~    def load_area_one~
+      gemsprite = ((@args.state.animticks % 400) < 200) ? 'sprites/gem200.png' : 'sprites/gem400.png'
+** Processing line: ~      @args.outputs.background_color = [ 0, 0, 0, 255 ]~
 - Inside source: true
 *** True Line Result
-    def load_area_one
-** Processing line: ~      state.area ||= []~
+      @args.outputs.background_color = [ 0, 0, 0, 255 ]
+** Processing line: ~      @args.outputs.sprites << [608, 720-150, 64, 64, 'sprites/oldman.png']~
 - Inside source: true
 *** True Line Result
-      state.area ||= []
-** Processing line: ~      state.area << [8, 6]~
+      @args.outputs.sprites << [608, 720-150, 64, 64, 'sprites/oldman.png']
+** Processing line: ~      @args.outputs.sprites << [300, 720-150, 64, 64, 'sprites/fire.png']~
 - Inside source: true
 *** True Line Result
-      state.area << [8, 6]
-** Processing line: ~      state.area << [7, 6]~
+      @args.outputs.sprites << [300, 720-150, 64, 64, 'sprites/fire.png']
+** Processing line: ~      @args.outputs.sprites << [900, 720-150, 64, 64, 'sprites/fire.png']~
 - Inside source: true
 *** True Line Result
-      state.area << [7, 6]
-** Processing line: ~      state.area << [7, 7]~
+      @args.outputs.sprites << [900, 720-150, 64, 64, 'sprites/fire.png']
+** Processing line: ~      @args.outputs.sprites << [@args.state.gem0_x, @args.state.gem0_y, 32, 64, gemsprite]~
 - Inside source: true
 *** True Line Result
-      state.area << [7, 7]
-** Processing line: ~      state.area << [8, 9]~
+      @args.outputs.sprites << [@args.state.gem0_x, @args.state.gem0_y, 32, 64, gemsprite]
+** Processing line: ~      @args.outputs.sprites << [@args.state.gem1_x, @args.state.gem1_y, 32, 64, gemsprite]~
 - Inside source: true
 *** True Line Result
-      state.area << [8, 9]
-** Processing line: ~      state.area << [7, 8]~
+      @args.outputs.sprites << [@args.state.gem1_x, @args.state.gem1_y, 32, 64, gemsprite]
+** Processing line: ~      @args.outputs.sprites << [@args.state.gem2_x, @args.state.gem2_y, 32, 64, gemsprite]~
 - Inside source: true
 *** True Line Result
-      state.area << [7, 8]
-** Processing line: ~      state.area << [7, 9]~
+      @args.outputs.sprites << [@args.state.gem2_x, @args.state.gem2_y, 32, 64, gemsprite]
+** Processing line: ~      @args.outputs.sprites << [@args.state.hero_x, @args.state.hero_y, 64, 64, @args.state.hero_sprite]~
 - Inside source: true
 *** True Line Result
-      state.area << [7, 9]
-** Processing line: ~      state.area << [6, 4]~
+      @args.outputs.sprites << [@args.state.hero_x, @args.state.hero_y, 64, 64, @args.state.hero_sprite]
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-      state.area << [6, 4]
-** Processing line: ~      state.area << [7, 3]~
+
+** Processing line: ~      @args.outputs.labels << [ 630, 720-30, "IT'S A SECRET TO EVERYONE.", 1, 1, *text_color, text_font ]~
 - Inside source: true
 *** True Line Result
-      state.area << [7, 3]
-** Processing line: ~      state.area << [7, 4]~
+      @args.outputs.labels << [ 630, 720-30, "IT'S A SECRET TO EVERYONE.", 1, 1, *text_color, text_font ]
+** Processing line: ~      @args.outputs.labels << [ 50, 720-85, @args.state.score.to_s, 1, 1, *text_color, text_font ]~
 - Inside source: true
 *** True Line Result
-      state.area << [7, 4]
-** Processing line: ~      state.area << [6, 5]~
+      @args.outputs.labels << [ 50, 720-85, @args.state.score.to_s, 1, 1, *text_color, text_font ]
+** Processing line: ~      render_gem_value @args.state.gem0_x, @args.state.gem0_y, @args.state.gem0~
 - Inside source: true
 *** True Line Result
-      state.area << [6, 5]
-** Processing line: ~      state.area << [7, 5]~
+      render_gem_value @args.state.gem0_x, @args.state.gem0_y, @args.state.gem0
+** Processing line: ~      render_gem_value @args.state.gem1_x, @args.state.gem1_y, @args.state.gem1~
 - Inside source: true
 *** True Line Result
-      state.area << [7, 5]
-** Processing line: ~      state.area << [8, 5]~
+      render_gem_value @args.state.gem1_x, @args.state.gem1_y, @args.state.gem1
+** Processing line: ~      render_gem_value @args.state.gem2_x, @args.state.gem2_y, @args.state.gem2~
 - Inside source: true
 *** True Line Result
-      state.area << [8, 5]
-** Processing line: ~      state.area << [8, 4]~
+      render_gem_value @args.state.gem2_x, @args.state.gem2_y, @args.state.gem2
+** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
-      state.area << [8, 4]
-** Processing line: ~      state.area << [1, 1]~
+    end
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-      state.area << [1, 1]
-** Processing line: ~      state.area << [0, 1]~
+
+** Processing line: ~    def calc~
 - Inside source: true
 *** True Line Result
-      state.area << [0, 1]
-** Processing line: ~      state.area << [0, 2]~
+    def calc
+** Processing line: ~      @args.state.animticks += 16~
 - Inside source: true
 *** True Line Result
-      state.area << [0, 2]
-** Processing line: ~      state.area << [1, 2]~
+      @args.state.animticks += 16
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-      state.area << [1, 2]
-** Processing line: ~      state.area << [2, 2]~
+
+** Processing line: ~      return unless @args.state.gem_chosen~
 - Inside source: true
 *** True Line Result
-      state.area << [2, 2]
-** Processing line: ~      state.area << [2, 1]~
+      return unless @args.state.gem_chosen
+** Processing line: ~      @args.state.round_finished_debounce ||= 60 * 3~
 - Inside source: true
 *** True Line Result
-      state.area << [2, 1]
-** Processing line: ~      state.area << [2, 3]~
+      @args.state.round_finished_debounce ||= 60 * 3
+** Processing line: ~      @args.state.round_finished_debounce -= 1~
 - Inside source: true
 *** True Line Result
-      state.area << [2, 3]
-** Processing line: ~      state.area << [1, 3]~
+      @args.state.round_finished_debounce -= 1
+** Processing line: ~      return if @args.state.round_finished_debounce > 0~
 - Inside source: true
 *** True Line Result
-      state.area << [1, 3]
-** Processing line: ~      state.area << [1, 4]~
+      return if @args.state.round_finished_debounce > 0
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-      state.area << [1, 4]
-** Processing line: ~      state.area << [2, 4]~
+
+** Processing line: ~      @args.state.gem_chosen = false~
 - Inside source: true
 *** True Line Result
-      state.area << [2, 4]
-** Processing line: ~      state.area << [2, 5]~
+      @args.state.gem_chosen = false
+** Processing line: ~      @args.state.hero.sprite[0] = 'sprites/herodown100.png'~
 - Inside source: true
 *** True Line Result
-      state.area << [2, 5]
-** Processing line: ~      state.area << [1, 5]~
+      @args.state.hero.sprite[0] = 'sprites/herodown100.png'
+** Processing line: ~      @args.state.hero.sprite[1] = 608~
 - Inside source: true
 *** True Line Result
-      state.area << [1, 5]
-** Processing line: ~      state.area << [2, 6]~
+      @args.state.hero.sprite[1] = 608
+** Processing line: ~      @args.state.hero.sprite[2] = 656~
 - Inside source: true
 *** True Line Result
-      state.area << [2, 6]
-** Processing line: ~      state.area << [3, 6]~
+      @args.state.hero.sprite[2] = 656
+** Processing line: ~      @args.state.round_finished_debounce = nil~
 - Inside source: true
 *** True Line Result
-      state.area << [3, 6]
-** Processing line: ~      state.area << [4, 6]~
+      @args.state.round_finished_debounce = nil
+** Processing line: ~      set_gem_values~
 - Inside source: true
 *** True Line Result
-      state.area << [4, 6]
-** Processing line: ~      state.area << [4, 7]~
+      set_gem_values
+** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
-      state.area << [4, 7]
-** Processing line: ~      state.area << [4, 8]~
+    end
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-      state.area << [4, 8]
-** Processing line: ~      state.area << [5, 8]~
+
+** Processing line: ~    def walk xdir, ydir, anim~
 - Inside source: true
 *** True Line Result
-      state.area << [5, 8]
-** Processing line: ~      state.area << [5, 9]~
+    def walk xdir, ydir, anim
+** Processing line: ~      @args.state.hero_sprite = "sprites/#{anim}#{(((@args.state.animticks % 200) < 100) ? '100' : '200')}.png"~
 - Inside source: true
 *** True Line Result
-      state.area << [5, 9]
-** Processing line: ~      state.area << [6, 9]~
+      @args.state.hero_sprite = "sprites/#{anim}#{(((@args.state.animticks % 200) < 100) ? '100' : '200')}.png"
+** Processing line: ~      @args.state.hero_x += 5 * xdir~
 - Inside source: true
 *** True Line Result
-      state.area << [6, 9]
-** Processing line: ~      state.area << [7, 10]~
+      @args.state.hero_x += 5 * xdir
+** Processing line: ~      @args.state.hero_y += 5 * ydir~
 - Inside source: true
 *** True Line Result
-      state.area << [7, 10]
-** Processing line: ~      state.area << [7, 11]~
+      @args.state.hero_y += 5 * ydir
+** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
-      state.area << [7, 11]
-** Processing line: ~      state.area << [7, 12]~
+    end
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-      state.area << [7, 12]
-** Processing line: ~      state.area << [7, 12]~
+
+** Processing line: ~    def check_gem_touching gem_x, gem_y, gem~
 - Inside source: true
 *** True Line Result
-      state.area << [7, 12]
-** Processing line: ~      state.area << [7, 13]~
+    def check_gem_touching gem_x, gem_y, gem
+** Processing line: ~      return if @args.state.gem_chosen~
 - Inside source: true
 *** True Line Result
-      state.area << [7, 13]
-** Processing line: ~      state.area << [8, 13]~
+      return if @args.state.gem_chosen
+** Processing line: ~      herorect = [ @args.state.hero_x, @args.state.hero_y, 64, 64 ]~
 - Inside source: true
 *** True Line Result
-      state.area << [8, 13]
-** Processing line: ~      state.area << [9, 13]~
+      herorect = [ @args.state.hero_x, @args.state.hero_y, 64, 64 ]
+** Processing line: ~      return if !herorect.intersect_rect?([gem_x, gem_y, 32, 64])~
 - Inside source: true
 *** True Line Result
-      state.area << [9, 13]
-** Processing line: ~      state.area << [10, 13]~
+      return if !herorect.intersect_rect?([gem_x, gem_y, 32, 64])
+** Processing line: ~      @args.state.gem_chosen = true~
 - Inside source: true
 *** True Line Result
-      state.area << [10, 13]
-** Processing line: ~      state.area << [11, 13]~
+      @args.state.gem_chosen = true
+** Processing line: ~      @args.state.score += gem~
 - Inside source: true
 *** True Line Result
-      state.area << [11, 13]
-** Processing line: ~      state.area << [12, 13]~
+      @args.state.score += gem
+** Processing line: ~      @args.outputs.sounds << ((gem < 0) ? 'sounds/lose.wav' : 'sounds/win.wav')~
 - Inside source: true
 *** True Line Result
-      state.area << [12, 13]
-** Processing line: ~      state.area << [12, 12]~
+      @args.outputs.sounds << ((gem < 0) ? 'sounds/lose.wav' : 'sounds/win.wav')
+** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
-      state.area << [12, 12]
-** Processing line: ~      state.area << [8, 12]~
+    end
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-      state.area << [8, 12]
-** Processing line: ~      state.area << [9, 12]~
+
+** Processing line: ~    def input~
 - Inside source: true
 *** True Line Result
-      state.area << [9, 12]
-** Processing line: ~      state.area << [10, 12]~
+    def input
+** Processing line: ~      if @args.inputs.keyboard.key_held.left~
 - Inside source: true
 *** True Line Result
-      state.area << [10, 12]
-** Processing line: ~      state.area << [11, 12]~
+      if @args.inputs.keyboard.key_held.left
+** Processing line: ~        walk(-1.0, 0.0, 'heroleft')~
 - Inside source: true
 *** True Line Result
-      state.area << [11, 12]
-** Processing line: ~      state.area << [12, 11]~
+        walk(-1.0, 0.0, 'heroleft')
+** Processing line: ~      elsif @args.inputs.keyboard.key_held.right~
 - Inside source: true
 *** True Line Result
-      state.area << [12, 11]
-** Processing line: ~      state.area << [13, 11]~
+      elsif @args.inputs.keyboard.key_held.right
+** Processing line: ~        walk(1.0, 0.0, 'heroright')~
 - Inside source: true
 *** True Line Result
-      state.area << [13, 11]
-** Processing line: ~      state.area << [13, 10]~
+        walk(1.0, 0.0, 'heroright')
+** Processing line: ~      elsif @args.inputs.keyboard.key_held.up~
 - Inside source: true
 *** True Line Result
-      state.area << [13, 10]
-** Processing line: ~      state.area << [13, 9]~
+      elsif @args.inputs.keyboard.key_held.up
+** Processing line: ~        walk(0.0, 1.0, 'heroup')~
 - Inside source: true
 *** True Line Result
-      state.area << [13, 9]
-** Processing line: ~      state.area << [13, 8]~
+        walk(0.0, 1.0, 'heroup')
+** Processing line: ~      elsif @args.inputs.keyboard.key_held.down~
 - Inside source: true
 *** True Line Result
-      state.area << [13, 8]
-** Processing line: ~      state.area << [13, 7]~
+      elsif @args.inputs.keyboard.key_held.down
+** Processing line: ~        walk(0.0, -1.0, 'herodown')~
 - Inside source: true
 *** True Line Result
-      state.area << [13, 7]
-** Processing line: ~      state.area << [13, 6]~
+        walk(0.0, -1.0, 'herodown')
+** Processing line: ~      end~
 - Inside source: true
 *** True Line Result
-      state.area << [13, 6]
-** Processing line: ~      state.area << [12, 6]~
+      end
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-      state.area << [12, 6]
-** Processing line: ~      state.area << [14, 6]~
+
+** Processing line: ~      check_gem_touching(@args.state.gem0_x, @args.state.gem0_y, @args.state.gem0)~
 - Inside source: true
 *** True Line Result
-      state.area << [14, 6]
-** Processing line: ~      state.area << [14, 5]~
+      check_gem_touching(@args.state.gem0_x, @args.state.gem0_y, @args.state.gem0)
+** Processing line: ~      check_gem_touching(@args.state.gem1_x, @args.state.gem1_y, @args.state.gem1)~
 - Inside source: true
 *** True Line Result
-      state.area << [14, 5]
-** Processing line: ~      state.area << [13, 5]~
+      check_gem_touching(@args.state.gem1_x, @args.state.gem1_y, @args.state.gem1)
+** Processing line: ~      check_gem_touching(@args.state.gem2_x, @args.state.gem2_y, @args.state.gem2)~
 - Inside source: true
 *** True Line Result
-      state.area << [13, 5]
-** Processing line: ~      state.area << [12, 5]~
+      check_gem_touching(@args.state.gem2_x, @args.state.gem2_y, @args.state.gem2)
+** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
-      state.area << [12, 5]
-** Processing line: ~      state.area << [12, 4]~
+    end
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-      state.area << [12, 4]
-** Processing line: ~      state.area << [13, 4]~
+
+** Processing line: ~    def tick~
 - Inside source: true
 *** True Line Result
-      state.area << [13, 4]
-** Processing line: ~      state.area << [14, 4]~
+    def tick
+** Processing line: ~      input~
 - Inside source: true
 *** True Line Result
-      state.area << [14, 4]
-** Processing line: ~      state.area << [1, 6]~
+      input
+** Processing line: ~      calc~
 - Inside source: true
 *** True Line Result
-      state.area << [1, 6]
-** Processing line: ~      state.area << [6, 6]~
+      calc
+** Processing line: ~      render~
 - Inside source: true
 *** True Line Result
-      state.area << [6, 6]
+      render
 ** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
     end
+** Processing line: ~  end~
+- Inside source: true
+*** True Line Result
+  end
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~    # Starts with an empty dungeon collection, and adds dungeon cells into it.~
+** Processing line: ~  def tick args~
 - Inside source: true
 *** True Line Result
-    # Starts with an empty dungeon collection, and adds dungeon cells into it.
-** Processing line: ~    def derive_dungeon_from_area~
+  def tick args
+** Processing line: ~      args.state.game ||= Game.new args~
 - Inside source: true
 *** True Line Result
-    def derive_dungeon_from_area
-** Processing line: ~      state.dungeon = [] # starts as empty collection~
+      args.state.game ||= Game.new args
+** Processing line: ~      args.state.game.args = args~
 - Inside source: true
 *** True Line Result
-      state.dungeon = [] # starts as empty collection
-** Processing line: ~~
+      args.state.game.args = args
+** Processing line: ~      args.state.game.tick~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~      state.area.each do |a| # for each element of the area collection~
+      args.state.game.tick
+** Processing line: ~  end~
 - Inside source: true
 *** True Line Result
-      state.area.each do |a| # for each element of the area collection
-** Processing line: ~        state.dungeon << state.new_entity(:dungeon_cell) do |d| # declares each dungeon cell as new entity~
+  end
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-        state.dungeon << state.new_entity(:dungeon_cell) do |d| # declares each dungeon cell as new entity
-** Processing line: ~          d.x = a.x # dungeon cell position using coordinates from area~
-- Inside source: true
+
+** Processing line: ~#+end_src~
+- Line was identified as the end of a code block.
 *** True Line Result
-          d.x = a.x # dungeon cell position using coordinates from area
-** Processing line: ~          d.y = a.y~
-- Inside source: true
+#+end_src
+** Processing line: ~~
+- End of paragraph detected.
 *** True Line Result
-          d.y = a.y
-** Processing line: ~          d.is_visible = false # cell is not visible~
-- Inside source: true
+
+** Processing line: ~*** Rpg Topdown - Topdown Starting Point - main.rb~
+- Header detected.
 *** True Line Result
-          d.is_visible = false # cell is not visible
-** Processing line: ~          d.alpha = 0 # not transparent at all~
+
+*** True Line Result
+*** Rpg Topdown - Topdown Starting Point - main.rb
+** Processing line: ~#+begin_src ruby~
+- Line was identified as the beginning of a code block.
+*** True Line Result
+
+*** True Line Result
+#+begin_src ruby
+** Processing line: ~  # ./samples/99_genre_rpg_topdown/topdown_starting_point/app/main.rb~
 - Inside source: true
 *** True Line Result
-          d.alpha = 0 # not transparent at all
-** Processing line: ~          d.border = [left_margin   + a.x * grid_size,~
+  # ./samples/99_genre_rpg_topdown/topdown_starting_point/app/main.rb
+** Processing line: ~  =begin~
 - Inside source: true
 *** True Line Result
-          d.border = [left_margin   + a.x * grid_size,
-** Processing line: ~                      bottom_margin + a.y * grid_size,~
+  =begin
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-                      bottom_margin + a.y * grid_size,
-** Processing line: ~                      grid_size,~
+
+** Processing line: ~   APIs listing that haven't been encountered in previous sample apps:~
 - Inside source: true
 *** True Line Result
-                      grid_size,
-** Processing line: ~                      grid_size,~
+   APIs listing that haven't been encountered in previous sample apps:
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-                      grid_size,
-** Processing line: ~                      *blue,~
+
+** Processing line: ~   - reverse: Returns a new string with the characters from original string in reverse order.~
 - Inside source: true
 *** True Line Result
-                      *blue,
-** Processing line: ~                      255] # sets border definition for dungeon cell~
+   - reverse: Returns a new string with the characters from original string in reverse order.
+** Processing line: ~     For example, the command~
 - Inside source: true
 *** True Line Result
-                      255] # sets border definition for dungeon cell
-** Processing line: ~          d # returns dungeon cell~
+     For example, the command
+** Processing line: ~     "dragonruby".reverse~
 - Inside source: true
 *** True Line Result
-          d # returns dungeon cell
-** Processing line: ~        end~
+     "dragonruby".reverse
+** Processing line: ~     would return the string~
 - Inside source: true
 *** True Line Result
-        end
-** Processing line: ~      end~
+     would return the string
+** Processing line: ~     "yburnogard".~
 - Inside source: true
 *** True Line Result
-      end
-** Processing line: ~    end~
+     "yburnogard".
+** Processing line: ~     Reverse is not only limited to strings, but can be applied to arrays and other collections.~
 - Inside source: true
 *** True Line Result
-    end
+     Reverse is not only limited to strings, but can be applied to arrays and other collections.
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~    def left_margin~
+** Processing line: ~   Reminders:~
 - Inside source: true
 *** True Line Result
-    def left_margin
-** Processing line: ~      40  # sets left margin~
+   Reminders:
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-      40  # sets left margin
-** Processing line: ~    end~
+
+** Processing line: ~   - ARRAY#intersect_rect?: Returns true or false depending on if two rectangles intersect.~
 - Inside source: true
 *** True Line Result
-    end
+   - ARRAY#intersect_rect?: Returns true or false depending on if two rectangles intersect.
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~    def bottom_margin~
+** Processing line: ~   - args.outputs.labels: An array. The values generate a label.~
 - Inside source: true
 *** True Line Result
-    def bottom_margin
-** Processing line: ~      60 # sets bottom margin~
+   - args.outputs.labels: An array. The values generate a label.
+** Processing line: ~     The parameters are [X, Y, TEXT, SIZE, ALIGNMENT, RED, GREEN, BLUE, ALPHA, FONT STYLE]~
 - Inside source: true
 *** True Line Result
-      60 # sets bottom margin
-** Processing line: ~    end~
+     The parameters are [X, Y, TEXT, SIZE, ALIGNMENT, RED, GREEN, BLUE, ALPHA, FONT STYLE]
+** Processing line: ~     For more information about labels, go to mygame/documentation/02-labels.md.~
 - Inside source: true
 *** True Line Result
-    end
+     For more information about labels, go to mygame/documentation/02-labels.md.
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~    def grid_size~
+** Processing line: ~  =end~
 - Inside source: true
 *** True Line Result
-    def grid_size
-** Processing line: ~      40 # sets size of grid square~
+  =end
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-      40 # sets size of grid square
-** Processing line: ~    end~
+
+** Processing line: ~  # This code shows a maze and uses input from the keyboard to move the user around the screen.~
 - Inside source: true
 *** True Line Result
-    end
+  # This code shows a maze and uses input from the keyboard to move the user around the screen.
+** Processing line: ~  # The objective is to reach the goal.~
+- Inside source: true
+*** True Line Result
+  # The objective is to reach the goal.
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~    # Updates the line of sight by calling the thick_line_of_sight method and~
+** Processing line: ~  # Sets values of tile size and player's movement speed~
 - Inside source: true
 *** True Line Result
-    # Updates the line of sight by calling the thick_line_of_sight method and
-** Processing line: ~    # adding dungeon cells to the newly_visible collection~
+  # Sets values of tile size and player's movement speed
+** Processing line: ~  # Also creates tile or box for player and generates map~
 - Inside source: true
 *** True Line Result
-    # adding dungeon cells to the newly_visible collection
-** Processing line: ~    def update_line_of_sight~
+  # Also creates tile or box for player and generates map
+** Processing line: ~  def tick args~
 - Inside source: true
 *** True Line Result
-    def update_line_of_sight
-** Processing line: ~      variations = [-1, 0, 1]~
+  def tick args
+** Processing line: ~    args.state.tile_size     = 80~
 - Inside source: true
 *** True Line Result
-      variations = [-1, 0, 1]
-** Processing line: ~      # creates collection of newly visible dungeon cells~
+    args.state.tile_size     = 80
+** Processing line: ~    args.state.player_speed  = 4~
 - Inside source: true
 *** True Line Result
-      # creates collection of newly visible dungeon cells
-** Processing line: ~      newly_visible = variations.product(variations).flat_map do |rise, run| # combo of all elements~
+    args.state.player_speed  = 4
+** Processing line: ~    args.state.player      ||= tile(args, 7, 3, 0, 128, 180)~
 - Inside source: true
 *** True Line Result
-      newly_visible = variations.product(variations).flat_map do |rise, run| # combo of all elements
-** Processing line: ~        thick_line_of_sight state.x, state.y, rise, run, 15, # calls thick_line_of_sight method~
+    args.state.player      ||= tile(args, 7, 3, 0, 128, 180)
+** Processing line: ~    generate_map args~
 - Inside source: true
 *** True Line Result
-        thick_line_of_sight state.x, state.y, rise, run, 15, # calls thick_line_of_sight method
-** Processing line: ~                            lambda { |x, y| dungeon_cell_exists? x, y } # checks whether or not cell exists~
+    generate_map args
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-                            lambda { |x, y| dungeon_cell_exists? x, y } # checks whether or not cell exists
-** Processing line: ~      end.uniq# removes duplicates~
+
+** Processing line: ~    # Adds walls, goal, and player to args.outputs.solids so they appear on screen~
 - Inside source: true
 *** True Line Result
-      end.uniq# removes duplicates
+    # Adds walls, goal, and player to args.outputs.solids so they appear on screen
+** Processing line: ~    args.outputs.solids << args.state.walls~
+- Inside source: true
+*** True Line Result
+    args.outputs.solids << args.state.walls
+** Processing line: ~    args.outputs.solids << args.state.goal~
+- Inside source: true
+*** True Line Result
+    args.outputs.solids << args.state.goal
+** Processing line: ~    args.outputs.solids << args.state.player~
+- Inside source: true
+*** True Line Result
+    args.outputs.solids << args.state.player
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~      state.dungeon.each do |d| # perform action on each element of dungeons collection~
+** Processing line: ~    # If player's box intersects with goal, a label is output onto the screen~
 - Inside source: true
 *** True Line Result
-      state.dungeon.each do |d| # perform action on each element of dungeons collection
-** Processing line: ~        d.is_visible = newly_visible.find { |v| v.x == d.x && v.y == d.y } # finds match inside newly_visible collection~
+    # If player's box intersects with goal, a label is output onto the screen
+** Processing line: ~    if args.state.player.intersect_rect? args.state.goal~
 - Inside source: true
 *** True Line Result
-        d.is_visible = newly_visible.find { |v| v.x == d.x && v.y == d.y } # finds match inside newly_visible collection
-** Processing line: ~      end~
+    if args.state.player.intersect_rect? args.state.goal
+** Processing line: ~      args.outputs.labels << [30, 720 - 30, "You're a wizard Harry!!"] # 30 pixels lower than top of screen~
 - Inside source: true
 *** True Line Result
-      end
+      args.outputs.labels << [30, 720 - 30, "You're a wizard Harry!!"] # 30 pixels lower than top of screen
 ** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
@@ -145223,790 +151415,790 @@ Follows is a source code listing for all files that have been open sourced. This
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~    #Returns a boolean value~
+** Processing line: ~    move_player args, -1,  0 if args.inputs.keyboard.left # x position decreases by 1 if left key is pressed~
 - Inside source: true
 *** True Line Result
-    #Returns a boolean value
-** Processing line: ~    def dungeon_cell_exists? x, y~
+    move_player args, -1,  0 if args.inputs.keyboard.left # x position decreases by 1 if left key is pressed
+** Processing line: ~    move_player args,  1,  0 if args.inputs.keyboard.right # x position increases by 1 if right key is pressed~
 - Inside source: true
 *** True Line Result
-    def dungeon_cell_exists? x, y
-** Processing line: ~      # Finds cell coordinates inside dungeon collection to determine if dungeon cell exists~
+    move_player args,  1,  0 if args.inputs.keyboard.right # x position increases by 1 if right key is pressed
+** Processing line: ~    move_player args,  0,  1 if args.inputs.keyboard.up # y position increases by 1 if up is pressed~
 - Inside source: true
 *** True Line Result
-      # Finds cell coordinates inside dungeon collection to determine if dungeon cell exists
-** Processing line: ~      state.dungeon.find { |d| d.x == x && d.y == y }~
+    move_player args,  0,  1 if args.inputs.keyboard.up # y position increases by 1 if up is pressed
+** Processing line: ~    move_player args,  0, -1 if args.inputs.keyboard.down # y position decreases by 1 if down is pressed~
 - Inside source: true
 *** True Line Result
-      state.dungeon.find { |d| d.x == x && d.y == y }
-** Processing line: ~    end~
+    move_player args,  0, -1 if args.inputs.keyboard.down # y position decreases by 1 if down is pressed
+** Processing line: ~  end~
 - Inside source: true
 *** True Line Result
-    end
+  end
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~    # Calls line_of_sight method to add elements to result collection~
+** Processing line: ~  # Sets position, size, and color of the tile~
 - Inside source: true
 *** True Line Result
-    # Calls line_of_sight method to add elements to result collection
-** Processing line: ~    def thick_line_of_sight start_x, start_y, rise, run, distance, cell_exists_lambda~
+  # Sets position, size, and color of the tile
+** Processing line: ~  def tile args, x, y, *color~
 - Inside source: true
 *** True Line Result
-    def thick_line_of_sight start_x, start_y, rise, run, distance, cell_exists_lambda
-** Processing line: ~      result = []~
+  def tile args, x, y, *color
+** Processing line: ~    [x * args.state.tile_size, # sets definition for array using method parameters~
 - Inside source: true
 *** True Line Result
-      result = []
-** Processing line: ~      result += line_of_sight start_x, start_y, rise, run, distance, cell_exists_lambda~
+    [x * args.state.tile_size, # sets definition for array using method parameters
+** Processing line: ~     y * args.state.tile_size, # multiplying by tile_size sets x and y to correct position using pixel values~
 - Inside source: true
 *** True Line Result
-      result += line_of_sight start_x, start_y, rise, run, distance, cell_exists_lambda
-** Processing line: ~      result += line_of_sight start_x - 1, start_y, rise, run, distance, cell_exists_lambda # one left~
+     y * args.state.tile_size, # multiplying by tile_size sets x and y to correct position using pixel values
+** Processing line: ~     args.state.tile_size,~
 - Inside source: true
 *** True Line Result
-      result += line_of_sight start_x - 1, start_y, rise, run, distance, cell_exists_lambda # one left
-** Processing line: ~      result += line_of_sight start_x + 1, start_y, rise, run, distance, cell_exists_lambda # one right~
+     args.state.tile_size,
+** Processing line: ~     args.state.tile_size,~
 - Inside source: true
 *** True Line Result
-      result += line_of_sight start_x + 1, start_y, rise, run, distance, cell_exists_lambda # one right
-** Processing line: ~      result~
+     args.state.tile_size,
+** Processing line: ~     *color]~
 - Inside source: true
 *** True Line Result
-      result
-** Processing line: ~    end~
+     *color]
+** Processing line: ~  end~
 - Inside source: true
 *** True Line Result
-    end
+  end
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~    # Adds points to the result collection to create the player's line of sight~
+** Processing line: ~  # Creates map by adding tiles to the wall, as well as a goal (that the player needs to reach)~
 - Inside source: true
 *** True Line Result
-    # Adds points to the result collection to create the player's line of sight
-** Processing line: ~    def line_of_sight start_x, start_y, rise, run, distance, cell_exists_lambda~
+  # Creates map by adding tiles to the wall, as well as a goal (that the player needs to reach)
+** Processing line: ~  def generate_map args~
 - Inside source: true
 *** True Line Result
-    def line_of_sight start_x, start_y, rise, run, distance, cell_exists_lambda
-** Processing line: ~      result = [] # starts as empty collection~
+  def generate_map args
+** Processing line: ~    return if args.state.area~
 - Inside source: true
 *** True Line Result
-      result = [] # starts as empty collection
-** Processing line: ~      points = points_on_line start_x, start_y, rise, run, distance # calls points_on_line method~
+    return if args.state.area
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-      points = points_on_line start_x, start_y, rise, run, distance # calls points_on_line method
-** Processing line: ~      points.each do |p| # for each point in collection~
+
+** Processing line: ~    # Creates the area of the map. There are 9 rows running horizontally across the screen~
 - Inside source: true
 *** True Line Result
-      points.each do |p| # for each point in collection
-** Processing line: ~        if cell_exists_lambda.call(p.x, p.y) # if the cell exists~
+    # Creates the area of the map. There are 9 rows running horizontally across the screen
+** Processing line: ~    # and 16 columns running vertically on the screen. Any spot with a "1" is not~
 - Inside source: true
 *** True Line Result
-        if cell_exists_lambda.call(p.x, p.y) # if the cell exists
-** Processing line: ~          result << p # add it to result collection~
+    # and 16 columns running vertically on the screen. Any spot with a "1" is not
+** Processing line: ~    # open for the player to move into (and is green), and any spot with a "0" is available~
 - Inside source: true
 *** True Line Result
-          result << p # add it to result collection
-** Processing line: ~        else # if cell does not exist~
+    # open for the player to move into (and is green), and any spot with a "0" is available
+** Processing line: ~    # for the player to move in.~
 - Inside source: true
 *** True Line Result
-        else # if cell does not exist
-** Processing line: ~          return result # return result collection as it is~
+    # for the player to move in.
+** Processing line: ~    args.state.area = [~
 - Inside source: true
 *** True Line Result
-          return result # return result collection as it is
-** Processing line: ~        end~
+    args.state.area = [
+** Processing line: ~      [1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1,],~
 - Inside source: true
 *** True Line Result
-        end
-** Processing line: ~      end~
+      [1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1,],
+** Processing line: ~      [1, 1, 1, 2, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1,], # the "2" represents the goal~
 - Inside source: true
 *** True Line Result
-      end
-** Processing line: ~~
+      [1, 1, 1, 2, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1,], # the "2" represents the goal
+** Processing line: ~      [1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1,],~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~      result # return result collection~
+      [1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1,],
+** Processing line: ~      [1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1,],~
 - Inside source: true
 *** True Line Result
-      result # return result collection
-** Processing line: ~    end~
+      [1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1,],
+** Processing line: ~      [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,],~
 - Inside source: true
 *** True Line Result
-    end
-** Processing line: ~~
+      [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,],
+** Processing line: ~      [1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1,],~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~    # Finds the coordinates of the points on the line by performing calculations~
+      [1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1,],
+** Processing line: ~      [1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1,],~
 - Inside source: true
 *** True Line Result
-    # Finds the coordinates of the points on the line by performing calculations
-** Processing line: ~    def points_on_line start_x, start_y, rise, run, distance~
+      [1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1,],
+** Processing line: ~      [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,],~
 - Inside source: true
 *** True Line Result
-    def points_on_line start_x, start_y, rise, run, distance
-** Processing line: ~      distance.times.map do |i| # perform an action~
+      [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,],
+** Processing line: ~      [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 ],~
 - Inside source: true
 *** True Line Result
-      distance.times.map do |i| # perform an action
-** Processing line: ~        [start_x + run * i, start_y + rise * i] # definition of point~
+      [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 ],
+** Processing line: ~    ].reverse # reverses the order of the area collection~
 - Inside source: true
 *** True Line Result
-        [start_x + run * i, start_y + rise * i] # definition of point
-** Processing line: ~      end~
+    ].reverse # reverses the order of the area collection
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-      end
-** Processing line: ~    end~
+
+** Processing line: ~    # By reversing the order, the way that the area appears above is how it appears~
 - Inside source: true
 *** True Line Result
-    end
-** Processing line: ~~
+    # By reversing the order, the way that the area appears above is how it appears
+** Processing line: ~    # on the screen in the game. If we did not reverse, the map would appear inverted.~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~    def render_canvas~
+    # on the screen in the game. If we did not reverse, the map would appear inverted.
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-    def render_canvas
-** Processing line: ~      return~
+
+** Processing line: ~    #The wall starts off with no tiles.~
 - Inside source: true
 *** True Line Result
-      return
-** Processing line: ~      outputs.borders << state.canvas.map do |c| # on each element of canvas collection~
+    #The wall starts off with no tiles.
+** Processing line: ~    args.state.walls = []~
 - Inside source: true
 *** True Line Result
-      outputs.borders << state.canvas.map do |c| # on each element of canvas collection
-** Processing line: ~        c.border # outputs border~
+    args.state.walls = []
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-        c.border # outputs border
-** Processing line: ~      end~
+
+** Processing line: ~    # If v is 1, a green tile is added to args.state.walls.~
 - Inside source: true
 *** True Line Result
-      end
-** Processing line: ~    end~
+    # If v is 1, a green tile is added to args.state.walls.
+** Processing line: ~    # If v is 2, a black tile is created as the goal.~
 - Inside source: true
 *** True Line Result
-    end
-** Processing line: ~~
+    # If v is 2, a black tile is created as the goal.
+** Processing line: ~    args.state.area.map_2d do |y, x, v|~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~    # Outputs the dungeon cells.~
+    args.state.area.map_2d do |y, x, v|
+** Processing line: ~      if    v == 1~
 - Inside source: true
 *** True Line Result
-    # Outputs the dungeon cells.
-** Processing line: ~    def render_dungeon~
+      if    v == 1
+** Processing line: ~        args.state.walls << tile(args, x, y, 0, 255, 0) # green tile~
 - Inside source: true
 *** True Line Result
-    def render_dungeon
-** Processing line: ~      outputs.solids << [0, 0, grid.w, grid.h] # outputs black background for grid~
+        args.state.walls << tile(args, x, y, 0, 255, 0) # green tile
+** Processing line: ~      elsif v == 2 # notice there is only one "2" above because there is only one single goal~
 - Inside source: true
 *** True Line Result
-      outputs.solids << [0, 0, grid.w, grid.h] # outputs black background for grid
-** Processing line: ~~
+      elsif v == 2 # notice there is only one "2" above because there is only one single goal
+** Processing line: ~        args.state.goal   = tile(args, x, y, 0,   0, 0) # black tile~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~      # Sets the alpha value (opacity) for each dungeon cell and calls the cell_border method.~
+        args.state.goal   = tile(args, x, y, 0,   0, 0) # black tile
+** Processing line: ~      end~
 - Inside source: true
 *** True Line Result
-      # Sets the alpha value (opacity) for each dungeon cell and calls the cell_border method.
-** Processing line: ~      outputs.borders << state.dungeon.map do |d| # for each element in dungeon collection~
+      end
+** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
-      outputs.borders << state.dungeon.map do |d| # for each element in dungeon collection
-** Processing line: ~        d.alpha += if d.is_visible # if cell is visible~
+    end
+** Processing line: ~  end~
 - Inside source: true
 *** True Line Result
-        d.alpha += if d.is_visible # if cell is visible
-** Processing line: ~                   255.fdiv(30) # increment opacity (transparency)~
+  end
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-                   255.fdiv(30) # increment opacity (transparency)
-** Processing line: ~                 else # if cell is not visible~
+
+** Processing line: ~  # Allows the player to move their box around the screen~
 - Inside source: true
 *** True Line Result
-                 else # if cell is not visible
-** Processing line: ~                   255.fdiv(600) * -1 # decrease opacity~
+  # Allows the player to move their box around the screen
+** Processing line: ~  def move_player args, *vector~
 - Inside source: true
 *** True Line Result
-                   255.fdiv(600) * -1 # decrease opacity
-** Processing line: ~                 end~
+  def move_player args, *vector
+** Processing line: ~    box = args.state.player.shift_rect(vector) # box is able to move at an angle~
 - Inside source: true
 *** True Line Result
-                 end
-** Processing line: ~        d.alpha = d.alpha.cap_min_max(0, 255)~
+    box = args.state.player.shift_rect(vector) # box is able to move at an angle
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-        d.alpha = d.alpha.cap_min_max(0, 255)
-** Processing line: ~        cell_border d.x, d.y, [*blue, d.alpha] # sets blue border using alpha value~
+
+** Processing line: ~    # If the player's box hits a wall, it is not able to move further in that direction~
 - Inside source: true
 *** True Line Result
-        cell_border d.x, d.y, [*blue, d.alpha] # sets blue border using alpha value
-** Processing line: ~      end.reject_nil~
+    # If the player's box hits a wall, it is not able to move further in that direction
+** Processing line: ~    return if args.state.walls~
 - Inside source: true
 *** True Line Result
-      end.reject_nil
-** Processing line: ~    end~
+    return if args.state.walls
+** Processing line: ~                  .any_intersect_rect?(box)~
 - Inside source: true
 *** True Line Result
-    end
+                  .any_intersect_rect?(box)
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~    # Sets definition of a cell border using the parameters~
+** Processing line: ~    # Player's box is able to move at angles (not just the four general directions) fast~
 - Inside source: true
 *** True Line Result
-    # Sets definition of a cell border using the parameters
-** Processing line: ~    def cell_border x, y, color = nil~
+    # Player's box is able to move at angles (not just the four general directions) fast
+** Processing line: ~    args.state.player =~
 - Inside source: true
 *** True Line Result
-    def cell_border x, y, color = nil
-** Processing line: ~      [left_margin   + x * grid_size,~
+    args.state.player =
+** Processing line: ~      args.state.player~
 - Inside source: true
 *** True Line Result
-      [left_margin   + x * grid_size,
-** Processing line: ~      bottom_margin + y * grid_size,~
+      args.state.player
+** Processing line: ~          .shift_rect(vector.x * args.state.player_speed, # if we don't multiply by speed, then~
 - Inside source: true
 *** True Line Result
-      bottom_margin + y * grid_size,
-** Processing line: ~      grid_size,~
+          .shift_rect(vector.x * args.state.player_speed, # if we don't multiply by speed, then
+** Processing line: ~                      vector.y * args.state.player_speed) # the box will move extremely slow~
 - Inside source: true
 *** True Line Result
-      grid_size,
-** Processing line: ~      grid_size,~
+                      vector.y * args.state.player_speed) # the box will move extremely slow
+** Processing line: ~  end~
 - Inside source: true
 *** True Line Result
-      grid_size,
-** Processing line: ~      *color]~
+  end
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-      *color]
-** Processing line: ~    end~
-- Inside source: true
+
+** Processing line: ~#+end_src~
+- Line was identified as the end of a code block.
 *** True Line Result
-    end
+#+end_src
 ** Processing line: ~~
-- Inside source: true
+- End of paragraph detected.
 *** True Line Result
 
-** Processing line: ~    # Sets the values for the player and outputs it as a label~
+** Processing line: ~*** Teenytiny - Teenytiny Starting Point - main.rb~
+- Header detected.
+*** True Line Result
+
+*** True Line Result
+*** Teenytiny - Teenytiny Starting Point - main.rb
+** Processing line: ~#+begin_src ruby~
+- Line was identified as the beginning of a code block.
+*** True Line Result
+
+*** True Line Result
+#+begin_src ruby
+** Processing line: ~  # ./samples/99_genre_teenytiny/teenytiny_starting_point/app/main.rb~
 - Inside source: true
 *** True Line Result
-    # Sets the values for the player and outputs it as a label
-** Processing line: ~    def render_player~
+  # ./samples/99_genre_teenytiny/teenytiny_starting_point/app/main.rb
+** Processing line: ~  # full documenation is at http://docs.dragonruby.org~
 - Inside source: true
 *** True Line Result
-    def render_player
-** Processing line: ~      outputs.labels << [grid_x(state.x) + 20, # positions "@" text in center of grid square~
+  # full documenation is at http://docs.dragonruby.org
+** Processing line: ~  # be sure to come to the discord if you hit any snags: http://discord.dragonruby.org~
 - Inside source: true
 *** True Line Result
-      outputs.labels << [grid_x(state.x) + 20, # positions "@" text in center of grid square
-** Processing line: ~                       grid_y(state.y) + 35,~
+  # be sure to come to the discord if you hit any snags: http://discord.dragonruby.org
+** Processing line: ~  def tick args~
 - Inside source: true
 *** True Line Result
-                       grid_y(state.y) + 35,
-** Processing line: ~                       "@", # player is represented by a white "@" character~
+  def tick args
+** Processing line: ~    # ====================================================~
 - Inside source: true
 *** True Line Result
-                       "@", # player is represented by a white "@" character
-** Processing line: ~                       1, 1, *white]~
+    # ====================================================
+** Processing line: ~    # initialize default variables~
 - Inside source: true
 *** True Line Result
-                       1, 1, *white]
-** Processing line: ~    end~
+    # initialize default variables
+** Processing line: ~    # ====================================================~
 - Inside source: true
 *** True Line Result
-    end
+    # ====================================================
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~    def grid_x x~
+** Processing line: ~    # ruby has an operator called ||= which means "only initialize this if it's nil"~
 - Inside source: true
 *** True Line Result
-    def grid_x x
-** Processing line: ~      left_margin + x * grid_size # positions horizontally on grid~
+    # ruby has an operator called ||= which means "only initialize this if it's nil"
+** Processing line: ~    args.state.count_down   ||= 20 * 60 # set the count down to 20 seconds~
 - Inside source: true
 *** True Line Result
-      left_margin + x * grid_size # positions horizontally on grid
-** Processing line: ~    end~
+    args.state.count_down   ||= 20 * 60 # set the count down to 20 seconds
+** Processing line: ~    # set the initial position of the target~
 - Inside source: true
 *** True Line Result
-    end
-** Processing line: ~~
+    # set the initial position of the target
+** Processing line: ~    args.state.target       ||= { x: args.grid.w.half,~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~    def grid_y y~
+    args.state.target       ||= { x: args.grid.w.half,
+** Processing line: ~                                  y: args.grid.h.half,~
 - Inside source: true
 *** True Line Result
-    def grid_y y
-** Processing line: ~      bottom_margin + y * grid_size # positions vertically on grid~
+                                  y: args.grid.h.half,
+** Processing line: ~                                  w: 20,~
 - Inside source: true
 *** True Line Result
-      bottom_margin + y * grid_size # positions vertically on grid
-** Processing line: ~    end~
+                                  w: 20,
+** Processing line: ~                                  h: 20 }~
 - Inside source: true
 *** True Line Result
-    end
+                                  h: 20 }
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~    # Outputs enemies onto the screen.~
+** Processing line: ~    # set the initial position of the player~
 - Inside source: true
 *** True Line Result
-    # Outputs enemies onto the screen.
-** Processing line: ~    def render_enemies~
+    # set the initial position of the player
+** Processing line: ~    args.state.player       ||= { x: 50,~
 - Inside source: true
 *** True Line Result
-    def render_enemies
-** Processing line: ~      state.enemies.map do |e| # for each enemy in the collection~
+    args.state.player       ||= { x: 50,
+** Processing line: ~                                  y: 50,~
 - Inside source: true
 *** True Line Result
-      state.enemies.map do |e| # for each enemy in the collection
-** Processing line: ~        alpha = 255 # set opacity (full transparency)~
+                                  y: 50,
+** Processing line: ~                                  w: 20,~
 - Inside source: true
 *** True Line Result
-        alpha = 255 # set opacity (full transparency)
+                                  w: 20,
+** Processing line: ~                                  h: 20 }~
+- Inside source: true
+*** True Line Result
+                                  h: 20 }
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~        # Outputs an enemy using a label.~
+** Processing line: ~    # set the player movement speed~
 - Inside source: true
 *** True Line Result
-        # Outputs an enemy using a label.
-** Processing line: ~        outputs.labels << [~
+    # set the player movement speed
+** Processing line: ~    args.state.player_speed ||= 5~
 - Inside source: true
 *** True Line Result
-        outputs.labels << [
-** Processing line: ~                     left_margin + 20 +  e.x * grid_size, # positions enemy's "r" text in center of grid square~
+    args.state.player_speed ||= 5
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-                     left_margin + 20 +  e.x * grid_size, # positions enemy's "r" text in center of grid square
-** Processing line: ~                     bottom_margin + 35 + e.y * grid_size,~
+
+** Processing line: ~    # set the score~
 - Inside source: true
 *** True Line Result
-                     bottom_margin + 35 + e.y * grid_size,
-** Processing line: ~                     "r", # enemy's text~
+    # set the score
+** Processing line: ~    args.state.score        ||= 0~
 - Inside source: true
 *** True Line Result
-                     "r", # enemy's text
-** Processing line: ~                     1, 1, *white, alpha]~
+    args.state.score        ||= 0
+** Processing line: ~    args.state.teleports    ||= 3~
 - Inside source: true
 *** True Line Result
-                     1, 1, *white, alpha]
+    args.state.teleports    ||= 3
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~        # Creates a red border around an enemy.~
-- Inside source: true
-*** True Line Result
-        # Creates a red border around an enemy.
-** Processing line: ~        outputs.borders << [grid_x(e.x), grid_y(e.y), grid_size, grid_size, *red]~
-- Inside source: true
-*** True Line Result
-        outputs.borders << [grid_x(e.x), grid_y(e.y), grid_size, grid_size, *red]
-** Processing line: ~      end~
+** Processing line: ~    # set the instructions~
 - Inside source: true
 *** True Line Result
-      end
-** Processing line: ~    end~
+    # set the instructions
+** Processing line: ~    args.state.instructions ||= "Get to the red goal! Use arrow keys to move. Spacebar to teleport (use them carefully)!"~
 - Inside source: true
 *** True Line Result
-    end
+    args.state.instructions ||= "Get to the red goal! Use arrow keys to move. Spacebar to teleport (use them carefully)!"
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~    #White labels are output for the cell coordinates of each element in the dungeon collection.~
-- Inside source: true
-*** True Line Result
-    #White labels are output for the cell coordinates of each element in the dungeon collection.
-** Processing line: ~    def print_cell_coordinates~
-- Inside source: true
-*** True Line Result
-    def print_cell_coordinates
-** Processing line: ~      return unless state.debug~
+** Processing line: ~    # ====================================================~
 - Inside source: true
 *** True Line Result
-      return unless state.debug
-** Processing line: ~      state.dungeon.each do |d|~
+    # ====================================================
+** Processing line: ~    # render the game~
 - Inside source: true
 *** True Line Result
-      state.dungeon.each do |d|
-** Processing line: ~        outputs.labels << [grid_x(d.x) + 2,~
+    # render the game
+** Processing line: ~    # ====================================================~
 - Inside source: true
 *** True Line Result
-        outputs.labels << [grid_x(d.x) + 2,
-** Processing line: ~                           grid_y(d.y) - 2,~
+    # ====================================================
+** Processing line: ~    args.outputs.labels  << { x: args.grid.w.half, y: args.grid.h - 10,~
 - Inside source: true
 *** True Line Result
-                           grid_y(d.y) - 2,
-** Processing line: ~                           "#{d.x},#{d.y}",~
+    args.outputs.labels  << { x: args.grid.w.half, y: args.grid.h - 10,
+** Processing line: ~                              text: args.state.instructions,~
 - Inside source: true
 *** True Line Result
-                           "#{d.x},#{d.y}",
-** Processing line: ~                           -2, 0, *white]~
+                              text: args.state.instructions,
+** Processing line: ~                              alignment_enum: 1 }~
 - Inside source: true
 *** True Line Result
-                           -2, 0, *white]
-** Processing line: ~      end~
+                              alignment_enum: 1 }
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-      end
-** Processing line: ~    end~
+
+** Processing line: ~    # check if it's game over. if so, then render game over~
 - Inside source: true
 *** True Line Result
-    end
-** Processing line: ~~
+    # check if it's game over. if so, then render game over
+** Processing line: ~    # otherwise render the current time left~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~    # Adds new elements into the canvas collection and sets their values.~
+    # otherwise render the current time left
+** Processing line: ~    if game_over? args~
 - Inside source: true
 *** True Line Result
-    # Adds new elements into the canvas collection and sets their values.
-** Processing line: ~    def calc_canvas~
+    if game_over? args
+** Processing line: ~      args.outputs.labels  << { x: args.grid.w.half,~
 - Inside source: true
 *** True Line Result
-    def calc_canvas
-** Processing line: ~      return if state.canvas.length > 0 # return if canvas collection has at least one element~
+      args.outputs.labels  << { x: args.grid.w.half,
+** Processing line: ~                                y: args.grid.h - 40,~
 - Inside source: true
 *** True Line Result
-      return if state.canvas.length > 0 # return if canvas collection has at least one element
-** Processing line: ~      15.times do |x| # 15 times perform an action~
+                                y: args.grid.h - 40,
+** Processing line: ~                                text: "game over! (press r to start over)",~
 - Inside source: true
 *** True Line Result
-      15.times do |x| # 15 times perform an action
-** Processing line: ~        15.times do |y|~
+                                text: "game over! (press r to start over)",
+** Processing line: ~                                alignment_enum: 1 }~
 - Inside source: true
 *** True Line Result
-        15.times do |y|
-** Processing line: ~          state.canvas << state.new_entity(:canvas) do |c| # declare canvas element as new entity~
+                                alignment_enum: 1 }
+** Processing line: ~    else~
 - Inside source: true
 *** True Line Result
-          state.canvas << state.new_entity(:canvas) do |c| # declare canvas element as new entity
-** Processing line: ~            c.x = x # set position~
+    else
+** Processing line: ~      args.outputs.labels  << { x: args.grid.w.half,~
 - Inside source: true
 *** True Line Result
-            c.x = x # set position
-** Processing line: ~            c.y = y~
+      args.outputs.labels  << { x: args.grid.w.half,
+** Processing line: ~                                y: args.grid.h - 40,~
 - Inside source: true
 *** True Line Result
-            c.y = y
-** Processing line: ~            c.border = [left_margin   + x * grid_size,~
+                                y: args.grid.h - 40,
+** Processing line: ~                                text: "time left: #{(args.state.count_down.idiv 60) + 1}",~
 - Inside source: true
 *** True Line Result
-            c.border = [left_margin   + x * grid_size,
-** Processing line: ~                        bottom_margin + y * grid_size,~
+                                text: "time left: #{(args.state.count_down.idiv 60) + 1}",
+** Processing line: ~                                alignment_enum: 1 }~
 - Inside source: true
 *** True Line Result
-                        bottom_margin + y * grid_size,
-** Processing line: ~                        grid_size,~
+                                alignment_enum: 1 }
+** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
-                        grid_size,
-** Processing line: ~                        grid_size,~
+    end
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-                        grid_size,
-** Processing line: ~                        *white, 30] # sets border definition~
+
+** Processing line: ~    # render the score~
 - Inside source: true
 *** True Line Result
-                        *white, 30] # sets border definition
-** Processing line: ~          end~
+    # render the score
+** Processing line: ~    args.outputs.labels  << { x: args.grid.w.half,~
 - Inside source: true
 *** True Line Result
-          end
-** Processing line: ~        end~
+    args.outputs.labels  << { x: args.grid.w.half,
+** Processing line: ~                              y: args.grid.h - 70,~
 - Inside source: true
 *** True Line Result
-        end
-** Processing line: ~      end~
+                              y: args.grid.h - 70,
+** Processing line: ~                              text: "score: #{args.state.score}",~
 - Inside source: true
 *** True Line Result
-      end
-** Processing line: ~    end~
+                              text: "score: #{args.state.score}",
+** Processing line: ~                              alignment_enum: 1 }~
 - Inside source: true
 *** True Line Result
-    end
+                              alignment_enum: 1 }
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~    # Updates x and y values of the player, and updates player's line of sight~
+** Processing line: ~    # render the player with teleport count~
 - Inside source: true
 *** True Line Result
-    # Updates x and y values of the player, and updates player's line of sight
-** Processing line: ~    def input_move~
+    # render the player with teleport count
+** Processing line: ~    args.outputs.sprites << { x: args.state.player.x,~
 - Inside source: true
 *** True Line Result
-    def input_move
-** Processing line: ~      x, y, x_diff, y_diff = input_target_cell~
+    args.outputs.sprites << { x: args.state.player.x,
+** Processing line: ~                              y: args.state.player.y,~
 - Inside source: true
 *** True Line Result
-      x, y, x_diff, y_diff = input_target_cell
-** Processing line: ~~
+                              y: args.state.player.y,
+** Processing line: ~                              w: args.state.player.w,~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~      return unless dungeon_cell_exists? x, y # player can't move there if a dungeon cell doesn't exist in that location~
+                              w: args.state.player.w,
+** Processing line: ~                              h: args.state.player.h,~
 - Inside source: true
 *** True Line Result
-      return unless dungeon_cell_exists? x, y # player can't move there if a dungeon cell doesn't exist in that location
-** Processing line: ~      return if enemy_at x, y # player can't move there if there is an enemy in that location~
+                              h: args.state.player.h,
+** Processing line: ~                              path: 'sprites/square-green.png' }~
 - Inside source: true
 *** True Line Result
-      return if enemy_at x, y # player can't move there if there is an enemy in that location
+                              path: 'sprites/square-green.png' }
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~      state.x += x_diff # increments x by x_diff (so player moves left or right)~
+** Processing line: ~    args.outputs.labels << { x: args.state.player.x + 10,~
 - Inside source: true
 *** True Line Result
-      state.x += x_diff # increments x by x_diff (so player moves left or right)
-** Processing line: ~      state.y += y_diff # same with y and y_diff ( so player moves up or down)~
+    args.outputs.labels << { x: args.state.player.x + 10,
+** Processing line: ~                             y: args.state.player.y + 40,~
 - Inside source: true
 *** True Line Result
-      state.y += y_diff # same with y and y_diff ( so player moves up or down)
-** Processing line: ~      update_line_of_sight # updates visible cells~
+                             y: args.state.player.y + 40,
+** Processing line: ~                             text: "teleports: #{args.state.teleports}",~
 - Inside source: true
 *** True Line Result
-      update_line_of_sight # updates visible cells
-** Processing line: ~    end~
+                             text: "teleports: #{args.state.teleports}",
+** Processing line: ~                             alignment_enum: 1, size_enum: -2 }~
 - Inside source: true
 *** True Line Result
-    end
+                             alignment_enum: 1, size_enum: -2 }
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~    def enemy_at x, y~
+** Processing line: ~    # render the target~
 - Inside source: true
 *** True Line Result
-    def enemy_at x, y
-** Processing line: ~      # Finds if coordinates exist in enemies collection and enemy is not dead~
+    # render the target
+** Processing line: ~    args.outputs.sprites << { x: args.state.target.x,~
 - Inside source: true
 *** True Line Result
-      # Finds if coordinates exist in enemies collection and enemy is not dead
-** Processing line: ~      state.enemies.find { |e| e.x == x && e.y == y && !e.is_dead }~
+    args.outputs.sprites << { x: args.state.target.x,
+** Processing line: ~                              y: args.state.target.y,~
 - Inside source: true
 *** True Line Result
-      state.enemies.find { |e| e.x == x && e.y == y && !e.is_dead }
-** Processing line: ~    end~
+                              y: args.state.target.y,
+** Processing line: ~                              w: args.state.target.w,~
 - Inside source: true
 *** True Line Result
-    end
+                              w: args.state.target.w,
+** Processing line: ~                              h: args.state.target.h,~
+- Inside source: true
+*** True Line Result
+                              h: args.state.target.h,
+** Processing line: ~                              path: 'sprites/square-red.png' }~
+- Inside source: true
+*** True Line Result
+                              path: 'sprites/square-red.png' }
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~    #M oves the user based on their keyboard input and sets values for target cell~
+** Processing line: ~    # ====================================================~
 - Inside source: true
 *** True Line Result
-    #M oves the user based on their keyboard input and sets values for target cell
-** Processing line: ~    def input_target_cell~
+    # ====================================================
+** Processing line: ~    # run simulation~
 - Inside source: true
 *** True Line Result
-    def input_target_cell
-** Processing line: ~      if inputs.keyboard.key_down.up # if "up" key is in "down" state~
+    # run simulation
+** Processing line: ~    # ====================================================~
 - Inside source: true
 *** True Line Result
-      if inputs.keyboard.key_down.up # if "up" key is in "down" state
-** Processing line: ~        [state.x, state.y + 1,  0,  1] # user moves up~
+    # ====================================================
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-        [state.x, state.y + 1,  0,  1] # user moves up
-** Processing line: ~      elsif inputs.keyboard.key_down.down # if "down" key is pressed~
+
+** Processing line: ~    # count down calculation~
 - Inside source: true
 *** True Line Result
-      elsif inputs.keyboard.key_down.down # if "down" key is pressed
-** Processing line: ~        [state.x, state.y - 1,  0, -1] # user moves down~
+    # count down calculation
+** Processing line: ~    args.state.count_down -= 1~
 - Inside source: true
 *** True Line Result
-        [state.x, state.y - 1,  0, -1] # user moves down
-** Processing line: ~      elsif inputs.keyboard.key_down.left # if "left" key is pressed~
+    args.state.count_down -= 1
+** Processing line: ~    args.state.count_down = -1 if args.state.count_down < -1~
 - Inside source: true
 *** True Line Result
-      elsif inputs.keyboard.key_down.left # if "left" key is pressed
-** Processing line: ~        [state.x - 1, state.y, -1,  0] # user moves left~
+    args.state.count_down = -1 if args.state.count_down < -1
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-        [state.x - 1, state.y, -1,  0] # user moves left
-** Processing line: ~      elsif inputs.keyboard.key_down.right # if "right" key is pressed~
+
+** Processing line: ~    # ====================================================~
 - Inside source: true
 *** True Line Result
-      elsif inputs.keyboard.key_down.right # if "right" key is pressed
-** Processing line: ~        [state.x + 1, state.y,  1,  0] # user moves right~
+    # ====================================================
+** Processing line: ~    # process player input~
 - Inside source: true
 *** True Line Result
-        [state.x + 1, state.y,  1,  0] # user moves right
-** Processing line: ~      else~
+    # process player input
+** Processing line: ~    # ====================================================~
 - Inside source: true
 *** True Line Result
-      else
-** Processing line: ~        nil  # otherwise, empty~
+    # ====================================================
+** Processing line: ~    # if it isn't game over let them move~
 - Inside source: true
 *** True Line Result
-        nil  # otherwise, empty
-** Processing line: ~      end~
+    # if it isn't game over let them move
+** Processing line: ~    if !game_over? args~
 - Inside source: true
 *** True Line Result
-      end
-** Processing line: ~    end~
+    if !game_over? args
+** Processing line: ~      dir_y = 0~
 - Inside source: true
 *** True Line Result
-    end
+      dir_y = 0
+** Processing line: ~      dir_x = 0~
+- Inside source: true
+*** True Line Result
+      dir_x = 0
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~    # Goes through the canvas collection to find if the mouse was clicked inside of the borders of an element.~
+** Processing line: ~      # determine the change horizontally~
 - Inside source: true
 *** True Line Result
-    # Goes through the canvas collection to find if the mouse was clicked inside of the borders of an element.
-** Processing line: ~    def input_click_map~
+      # determine the change horizontally
+** Processing line: ~      if args.inputs.keyboard.up~
 - Inside source: true
 *** True Line Result
-    def input_click_map
-** Processing line: ~      return unless inputs.mouse.click # return unless the mouse is clicked~
+      if args.inputs.keyboard.up
+** Processing line: ~        dir_y += args.state.player_speed~
 - Inside source: true
 *** True Line Result
-      return unless inputs.mouse.click # return unless the mouse is clicked
-** Processing line: ~      canvas_entry = state.canvas.find do |c| # find element from canvas collection that meets requirements~
+        dir_y += args.state.player_speed
+** Processing line: ~      elsif args.inputs.keyboard.down~
 - Inside source: true
 *** True Line Result
-      canvas_entry = state.canvas.find do |c| # find element from canvas collection that meets requirements
-** Processing line: ~        inputs.mouse.click.inside_rect? c.border # find border that mouse was clicked inside of~
+      elsif args.inputs.keyboard.down
+** Processing line: ~        dir_y -= args.state.player_speed~
 - Inside source: true
 *** True Line Result
-        inputs.mouse.click.inside_rect? c.border # find border that mouse was clicked inside of
+        dir_y -= args.state.player_speed
 ** Processing line: ~      end~
 - Inside source: true
 *** True Line Result
       end
-** Processing line: ~      puts canvas_entry # prints canvas_entry value~
-- Inside source: true
-*** True Line Result
-      puts canvas_entry # prints canvas_entry value
-** Processing line: ~    end~
-- Inside source: true
-*** True Line Result
-    end
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~    # Sets the definition of a label using the parameters.~
+** Processing line: ~      # determine the change vertically~
 - Inside source: true
 *** True Line Result
-    # Sets the definition of a label using the parameters.
-** Processing line: ~    def label text, x, y, color = nil~
+      # determine the change vertically
+** Processing line: ~      if args.inputs.keyboard.left~
 - Inside source: true
 *** True Line Result
-    def label text, x, y, color = nil
-** Processing line: ~      color ||= white # color is initialized to white~
+      if args.inputs.keyboard.left
+** Processing line: ~        dir_x -= args.state.player_speed~
 - Inside source: true
 *** True Line Result
-      color ||= white # color is initialized to white
-** Processing line: ~      [x, y, text, 1, 1, *color] # sets label definition~
+        dir_x -= args.state.player_speed
+** Processing line: ~      elsif args.inputs.keyboard.right~
 - Inside source: true
 *** True Line Result
-      [x, y, text, 1, 1, *color] # sets label definition
-** Processing line: ~    end~
+      elsif args.inputs.keyboard.right
+** Processing line: ~        dir_x += args.state.player_speed~
 - Inside source: true
 *** True Line Result
-    end
-** Processing line: ~~
+        dir_x += args.state.player_speed
+** Processing line: ~      end~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~    def green~
+      end
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-    def green
-** Processing line: ~      [60, 200, 100] # sets color saturation to shade of green~
+
+** Processing line: ~      # determine if teleport can be used~
 - Inside source: true
 *** True Line Result
-      [60, 200, 100] # sets color saturation to shade of green
-** Processing line: ~    end~
+      # determine if teleport can be used
+** Processing line: ~      if args.inputs.keyboard.key_down.space && args.state.teleports > 0~
 - Inside source: true
 *** True Line Result
-    end
-** Processing line: ~~
+      if args.inputs.keyboard.key_down.space && args.state.teleports > 0
+** Processing line: ~        args.state.teleports -= 1~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~    def blue~
+        args.state.teleports -= 1
+** Processing line: ~        dir_x *= 20~
 - Inside source: true
 *** True Line Result
-    def blue
-** Processing line: ~      [50, 50, 210] # sets color saturation to shade of blue~
+        dir_x *= 20
+** Processing line: ~        dir_y *= 20~
 - Inside source: true
 *** True Line Result
-      [50, 50, 210] # sets color saturation to shade of blue
-** Processing line: ~    end~
+        dir_y *= 20
+** Processing line: ~      end~
 - Inside source: true
 *** True Line Result
-    end
+      end
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~    def white~
-- Inside source: true
-*** True Line Result
-    def white
-** Processing line: ~      [255, 255, 255] # sets color saturation to white~
+** Processing line: ~      # apply change to player~
 - Inside source: true
 *** True Line Result
-      [255, 255, 255] # sets color saturation to white
-** Processing line: ~    end~
+      # apply change to player
+** Processing line: ~      args.state.player.x += dir_x~
 - Inside source: true
 *** True Line Result
-    end
-** Processing line: ~~
+      args.state.player.x += dir_x
+** Processing line: ~      args.state.player.y += dir_y~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~    def red~
+      args.state.player.y += dir_y
+** Processing line: ~    else~
 - Inside source: true
 *** True Line Result
-    def red
-** Processing line: ~      [230, 80, 80] # sets color saturation to shade of red~
+    else
+** Processing line: ~      # if r is pressed, reset the game~
 - Inside source: true
 *** True Line Result
-      [230, 80, 80] # sets color saturation to shade of red
-** Processing line: ~    end~
+      # if r is pressed, reset the game
+** Processing line: ~      if args.inputs.keyboard.key_down.r~
 - Inside source: true
 *** True Line Result
-    end
-** Processing line: ~~
+      if args.inputs.keyboard.key_down.r
+** Processing line: ~        $gtk.reset~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~    def orange~
+        $gtk.reset
+** Processing line: ~        return~
 - Inside source: true
 *** True Line Result
-    def orange
-** Processing line: ~      [255, 80, 60] # sets color saturation to shade of orange~
+        return
+** Processing line: ~      end~
 - Inside source: true
 *** True Line Result
-      [255, 80, 60] # sets color saturation to shade of orange
+      end
 ** Processing line: ~    end~
 - Inside source: true
 *** True Line Result
@@ -146015,110 +152207,118 @@ Follows is a source code listing for all files that have been open sourced. This
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~    def pink~
+** Processing line: ~    # ====================================================~
 - Inside source: true
 *** True Line Result
-    def pink
-** Processing line: ~      [255, 0, 200] # sets color saturation to shade of pink~
+    # ====================================================
+** Processing line: ~    # determine score~
 - Inside source: true
 *** True Line Result
-      [255, 0, 200] # sets color saturation to shade of pink
-** Processing line: ~    end~
+    # determine score
+** Processing line: ~    # ====================================================~
 - Inside source: true
 *** True Line Result
-    end
+    # ====================================================
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~    def gray~
-- Inside source: true
-*** True Line Result
-    def gray
-** Processing line: ~      [75, 75, 75] # sets color saturation to shade of gray~
+** Processing line: ~    # calculate new score if the player is at goal~
 - Inside source: true
 *** True Line Result
-      [75, 75, 75] # sets color saturation to shade of gray
-** Processing line: ~    end~
+    # calculate new score if the player is at goal
+** Processing line: ~    if !game_over? args~
 - Inside source: true
 *** True Line Result
-    end
+    if !game_over? args
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~    # Recolors the border using the parameters.~
+** Processing line: ~      # if the player is at the goal, then move the goal~
 - Inside source: true
 *** True Line Result
-    # Recolors the border using the parameters.
-** Processing line: ~    def recolor_border border, r, g, b~
+      # if the player is at the goal, then move the goal
+** Processing line: ~      if args.state.player.intersect_rect? args.state.target~
 - Inside source: true
 *** True Line Result
-    def recolor_border border, r, g, b
-** Processing line: ~      border[4] = r~
+      if args.state.player.intersect_rect? args.state.target
+** Processing line: ~        # increment the goal~
 - Inside source: true
 *** True Line Result
-      border[4] = r
-** Processing line: ~      border[5] = g~
+        # increment the goal
+** Processing line: ~        args.state.score += 1~
 - Inside source: true
 *** True Line Result
-      border[5] = g
-** Processing line: ~      border[6] = b~
+        args.state.score += 1
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-      border[6] = b
-** Processing line: ~      border~
+
+** Processing line: ~        # move the goal to a random location~
 - Inside source: true
 *** True Line Result
-      border
-** Processing line: ~    end~
+        # move the goal to a random location
+** Processing line: ~        args.state.target = { x: (rand args.grid.w), y: (rand args.grid.h), w: 20, h: 20 }~
 - Inside source: true
 *** True Line Result
-    end
+        args.state.target = { x: (rand args.grid.w), y: (rand args.grid.h), w: 20, h: 20 }
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~    # Returns a boolean value.~
+** Processing line: ~        # make sure the goal is inside the view area~
 - Inside source: true
 *** True Line Result
-    # Returns a boolean value.
-** Processing line: ~    def visible? cell~
+        # make sure the goal is inside the view area
+** Processing line: ~        if args.state.target.x < 0~
 - Inside source: true
 *** True Line Result
-    def visible? cell
-** Processing line: ~      # finds cell's coordinates inside visible_cells collections to determine if cell is visible~
+        if args.state.target.x < 0
+** Processing line: ~          args.state.target.x += 20~
 - Inside source: true
 *** True Line Result
-      # finds cell's coordinates inside visible_cells collections to determine if cell is visible
-** Processing line: ~      state.visible_cells.find { |c| c.x == cell.x && c.y == cell.y}~
+          args.state.target.x += 20
+** Processing line: ~        elsif args.state.target.x > 1280~
 - Inside source: true
 *** True Line Result
-      state.visible_cells.find { |c| c.x == cell.x && c.y == cell.y}
-** Processing line: ~    end~
+        elsif args.state.target.x > 1280
+** Processing line: ~          args.state.target.x -= 20~
 - Inside source: true
 *** True Line Result
-    end
+          args.state.target.x -= 20
+** Processing line: ~        end~
+- Inside source: true
+*** True Line Result
+        end
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~    # Exports dungeon by printing dungeon cell coordinates~
+** Processing line: ~        # make sure the goal is inside the view area~
 - Inside source: true
 *** True Line Result
-    # Exports dungeon by printing dungeon cell coordinates
-** Processing line: ~    def export_dungeon~
+        # make sure the goal is inside the view area
+** Processing line: ~        if args.state.target.y < 0~
 - Inside source: true
 *** True Line Result
-    def export_dungeon
-** Processing line: ~      state.dungeon.each do |d| # on each element of dungeon collection~
+        if args.state.target.y < 0
+** Processing line: ~          args.state.target.y += 20~
 - Inside source: true
 *** True Line Result
-      state.dungeon.each do |d| # on each element of dungeon collection
-** Processing line: ~        puts "state.dungeon << [#{d.x}, #{d.y}]" # prints cell coordinates~
+          args.state.target.y += 20
+** Processing line: ~        elsif args.state.target.y > 720~
 - Inside source: true
 *** True Line Result
-        puts "state.dungeon << [#{d.x}, #{d.y}]" # prints cell coordinates
+        elsif args.state.target.y > 720
+** Processing line: ~          args.state.target.y -= 20~
+- Inside source: true
+*** True Line Result
+          args.state.target.y -= 20
+** Processing line: ~        end~
+- Inside source: true
+*** True Line Result
+        end
 ** Processing line: ~      end~
 - Inside source: true
 *** True Line Result
@@ -146127,86 +152327,98 @@ Follows is a source code listing for all files that have been open sourced. This
 - Inside source: true
 *** True Line Result
     end
+** Processing line: ~  end~
+- Inside source: true
+*** True Line Result
+  end
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~    def distance_to_cell cell~
+** Processing line: ~  def game_over? args~
 - Inside source: true
 *** True Line Result
-    def distance_to_cell cell
-** Processing line: ~      distance_to state.x, cell.x, state.y, cell.y # calls distance_to method~
+  def game_over? args
+** Processing line: ~    args.state.count_down < 0~
 - Inside source: true
 *** True Line Result
-      distance_to state.x, cell.x, state.y, cell.y # calls distance_to method
-** Processing line: ~    end~
+    args.state.count_down < 0
+** Processing line: ~  end~
 - Inside source: true
 *** True Line Result
-    end
+  end
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
 
-** Processing line: ~    def distance_to from_x, x, from_y, y~
-- Inside source: true
-*** True Line Result
-    def distance_to from_x, x, from_y, y
-** Processing line: ~      (from_x - x).abs + (from_y - y).abs # finds distance between two cells using coordinates~
+** Processing line: ~  $gtk.reset~
 - Inside source: true
 *** True Line Result
-      (from_x - x).abs + (from_y - y).abs # finds distance between two cells using coordinates
-** Processing line: ~    end~
+  $gtk.reset
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-    end
-** Processing line: ~  end~
-- Inside source: true
+
+** Processing line: ~#+end_src~
+- Line was identified as the end of a code block.
 *** True Line Result
-  end
+#+end_src
 ** Processing line: ~~
-- Inside source: true
+- End of paragraph detected.
 *** True Line Result
 
-** Processing line: ~  $game = Game.new~
+** Processing line: ~*** Teenytiny - Teenytiny Starting Point - license.txt~
+- Header detected.
+*** True Line Result
+
+*** True Line Result
+*** Teenytiny - Teenytiny Starting Point - license.txt
+** Processing line: ~#+begin_src ruby~
+- Line was identified as the beginning of a code block.
+*** True Line Result
+
+*** True Line Result
+#+begin_src ruby
+** Processing line: ~  # ./samples/99_genre_teenytiny/teenytiny_starting_point/license.txt~
 - Inside source: true
 *** True Line Result
-  $game = Game.new
-** Processing line: ~~
+  # ./samples/99_genre_teenytiny/teenytiny_starting_point/license.txt
+** Processing line: ~  Copyright 2019 DragonRuby LLC~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~  def tick args~
+  Copyright 2019 DragonRuby LLC
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-  def tick args
-** Processing line: ~    $game.args    = args~
+
+** Processing line: ~  MIT License~
 - Inside source: true
 *** True Line Result
-    $game.args    = args
-** Processing line: ~    $game.state   = args.state~
+  MIT License
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-    $game.state   = args.state
-** Processing line: ~    $game.inputs  = args.inputs~
+
+** Processing line: ~  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:~
 - Inside source: true
 *** True Line Result
-    $game.inputs  = args.inputs
-** Processing line: ~    $game.outputs = args.outputs~
+  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:
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-    $game.outputs = args.outputs
-** Processing line: ~    $game.grid    = args.grid~
+
+** Processing line: ~  The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.~
 - Inside source: true
 *** True Line Result
-    $game.grid    = args.grid
-** Processing line: ~    $game.tick~
+  The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-    $game.tick
-** Processing line: ~  end~
+
+** Processing line: ~  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.~
 - Inside source: true
 *** True Line Result
-  end
+  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.
 ** Processing line: ~~
 - Inside source: true
 *** True Line Result
@@ -146219,354 +152431,373 @@ Follows is a source code listing for all files that have been open sourced. This
 - End of paragraph detected.
 *** True Line Result
 
-** Processing line: ~*** Rpg Tactical - Hexagonal Grid - main.rb~
+** Processing line: ~** OSS~
 - Header detected.
 *** True Line Result
 
 *** True Line Result
-*** Rpg Tactical - Hexagonal Grid - main.rb
+** OSS
+** Processing line: ~Follows is a source code listing for all files that have been open sourced. This code can be found online at [[https://github.com/DragonRuby/dragonruby-game-toolkit-contrib/]].~
+** Processing line: ~*** api.rb~
+- Header detected.
+*** True Line Result
+Follows is a source code listing for all files that have been open sourced. This code can be found online at [[https://github.com/DragonRuby/dragonruby-game-toolkit-contrib/]].
+*** True Line Result
+*** api.rb
 ** Processing line: ~#+begin_src ruby~
 - Line was identified as the beginning of a code block.
 *** True Line Result
 
 *** True Line Result
 #+begin_src ruby
-** Processing line: ~  # ./samples/99_genre_rpg_tactical/hexagonal_grid/app/main.rb~
+** Processing line: ~  # ./dragon/api.rb~
 - Inside source: true
 *** True Line Result
-  # ./samples/99_genre_rpg_tactical/hexagonal_grid/app/main.rb
-** Processing line: ~  class HexagonTileGame~
+  # ./dragon/api.rb
+** Processing line: ~  # coding: utf-8~
 - Inside source: true
 *** True Line Result
-  class HexagonTileGame
-** Processing line: ~    attr_gtk~
+  # coding: utf-8
+** Processing line: ~  # Copyright 2019 DragonRuby LLC~
 - Inside source: true
 *** True Line Result
-    attr_gtk
-** Processing line: ~~
+  # Copyright 2019 DragonRuby LLC
+** Processing line: ~  # MIT License~
 - Inside source: true
 *** True Line Result
-
-** Processing line: ~    def defaults~
+  # MIT License
+** Processing line: ~  # api.rb has been released under MIT (*only this file*).~
 - Inside source: true
 *** True Line Result
-    def defaults
-** Processing line: ~      state.tile_scale      = 1.3~
+  # api.rb has been released under MIT (*only this file*).
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-      state.tile_scale      = 1.3
-** Processing line: ~      state.tile_size       = 80~
+
+** Processing line: ~  module GTK~
 - Inside source: true
 *** True Line Result
-      state.tile_size       = 80
-** Processing line: ~      state.tile_w          = Math.sqrt(3) * state.tile_size.half~
+  module GTK
+** Processing line: ~    class Api~
 - Inside source: true
 *** True Line Result
-      state.tile_w          = Math.sqrt(3) * state.tile_size.half
-** Processing line: ~      state.tile_h          = state.tile_size * 3/4~
+    class Api
+** Processing line: ~      def initialize~
 - Inside source: true
 *** True Line Result
-      state.tile_h          = state.tile_size * 3/4
-** Processing line: ~      state.tiles_x_count   = 1280.idiv(state.tile_w) - 1~
+      def initialize
+** Processing line: ~      end~
 - Inside source: true
 *** True Line Result
-      state.tiles_x_count   = 1280.idiv(state.tile_w) - 1
-** Processing line: ~      state.tiles_y_count   = 720.idiv(state.tile_h) - 1~
+      end
+** Processing line: ~~
 - Inside source: true
 *** True Line Result
-      state.tiles_y_count   = 720.idiv(state.tile_h) - 1
-** Processing line: ~      state.world_width_px  = state.tiles_x_count * state.tile_w~
+
+** Processing line: ~      def get_api_autocomplete args, req~
 - Inside source: true
 *** True Line Result
-      state.world_width_px  = state.tiles_x_count * state.tile_w
-** Processing line: ~      state.world_height_px = state.tiles_y_count * state.tile_h~
+      def get_api_autocomplete args, req
+** Processing line: ~        html = <<-S~
 - Inside source: true
 *** True Line Result
-      state.world_height_px = state.tiles_y_count * state.tile_h
-** Processing line: ~      state.world_x_offset  = (1280 - state.world_width_px).half~
+        html = <<-S
+** Processing line: ~  ~
 - Inside source: true
 *** True Line Result
-      state.world_x_offset  = (1280 - state.world_width_px).half
-** Processing line: ~      state.world_y_offset  = (720 - state.world_height_px).half~
+  
+** Processing line: ~    ~
 - Inside source: true
 *** True Line Result
-      state.world_y_offset  = (720 - state.world_height_px).half
-** Processing line: ~      state.tiles         ||= state.tiles_x_count.map_with_ys(state.tiles_y_count) do |ordinal_x, ordinal_y|~
+    
+** Processing line: ~      ~
 - Inside source: true
 *** True Line Result
-      state.tiles         ||= state.tiles_x_count.map_with_ys(state.tiles_y_count) do |ordinal_x, ordinal_y|
-** Processing line: ~        {~
+      
+** Processing line: ~      DragonRuby Game Toolkit Documentation~
 - Inside source: true
 *** True Line Result
-        {
-** Processing line: ~          ordinal_x: ordinal_x,~
+      DragonRuby Game Toolkit Documentation
+** Processing line: ~      ~
 - Inside source: true
 *** True Line Result
-        }.associate do |h|
-** Processing line: ~          h.merge(x: h[:offset_x] + h[:ordinal_x] * h[:w],~
+      
+** Processing line: ~    ~
 - Inside source: true
 *** True Line Result
-          h.merge(x: h[:offset_x] + h[:ordinal_x] * h[:w],
-** Processing line: ~                  y: h[:offset_y] + h[:ordinal_y] * h[:h]).scale_rect(state.tile_scale)~
+    
+** Processing line: ~    ~
 - Inside source: true
 *** True Line Result
-                  y: h[:offset_y] + h[:ordinal_y] * h[:h]).scale_rect(state.tile_scale)
-** Processing line: ~        end.associate do |h|~
+    
+** Processing line: ~        ~
 - Inside source: true
 *** True Line Result
-      if inputs.click
-** Processing line: ~        tile = state.tiles.find { |t| inputs.click.point_inside_circle? t[:center], t[:radius] }~
+        
+** Processing line: ~        
~ - Inside source: true *** True Line Result - tile = state.tiles.find { |t| inputs.click.point_inside_circle? t[:center], t[:radius] } -** Processing line: ~ if tile~ + +** Processing line: ~
index
~ - Inside source: true *** True Line Result - if tile -** Processing line: ~ tile[:a] = 255~ +
index
+** Processing line: ~ ~ - Inside source: true *** True Line Result - tile[:a] = 255 -** Processing line: ~ tile[:path] = "sprites/hexagon-black.png"~ + +** Processing line: ~
code
~ - Inside source: true *** True Line Result - tile[:path] = "sprites/hexagon-black.png" -** Processing line: ~ end~ +
code
+** Processing line: ~ ~ - Inside source: true *** True Line Result - end -** Processing line: ~~ + end +** Processing line: ~
~ - Inside source: true *** True Line Result - -** Processing line: ~ def tick~ +
+** Processing line: ~ ~ - Inside source: true *** True Line Result - def tick -** Processing line: ~ defaults~ + +** Processing line: ~ ~ - Inside source: true *** True Line Result - defaults -** Processing line: ~ input~ + +** Processing line: ~
~ - Inside source: true *** True Line Result - input -** Processing line: ~ render~ + +** Processing line: ~
~
 - Inside source: true
 *** True Line Result
-      render
-** Processing line: ~    end~
+        
+** Processing line: ~        
~ - Inside source: true *** True Line Result - end +
** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ def render~ +** Processing line: ~ #{links}~ - Inside source: true *** True Line Result - def render -** Processing line: ~ outputs.sprites << state.tiles~ + #{links} +** Processing line: ~ ~ - Inside source: true *** True Line Result - outputs.sprites << state.tiles -** Processing line: ~ end~ + +** Processing line: ~ ~ - Inside source: true *** True Line Result - end -** Processing line: ~ end~ + +** Processing line: ~ S~ - Inside source: true *** True Line Result - end + S ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ $game = HexagonTileGame.new~ +** Processing line: ~ req.respond 200,~ - Inside source: true *** True Line Result - $game = HexagonTileGame.new + req.respond 200, +** Processing line: ~ html,~ +- Inside source: true +*** True Line Result + html, +** Processing line: ~ { 'Content-Type' => 'text/html' }~ +- Inside source: true +*** True Line Result + { 'Content-Type' => 'text/html' } +** Processing line: ~ end~ +- Inside source: true +*** True Line Result + end ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ def tick args~ +** Processing line: ~ def post_api_autocomplete args, req~ - Inside source: true *** True Line Result - def tick args -** Processing line: ~ $game.args = args~ + def post_api_autocomplete args, req +** Processing line: ~ json = ($gtk.parse_json req.body)~ - Inside source: true *** True Line Result - $game.args = args -** Processing line: ~ $game.tick~ + json = ($gtk.parse_json req.body) +** Processing line: ~ index = json["index"].to_i~ - Inside source: true *** True Line Result - $game.tick -** Processing line: ~ end~ + index = json["index"].to_i +** Processing line: ~ text = json["text"]~ - Inside source: true *** True Line Result - end -** Processing line: ~~ + text = json["text"] +** Processing line: ~ suggestions = args.gtk.suggest_autocompletion index: index, text: text~ - Inside source: true *** True Line Result - -** Processing line: ~ $gtk.reset~ + suggestions = args.gtk.suggest_autocompletion index: index, text: text +** Processing line: ~ list_as_string = suggestions.join("\n")~ - Inside source: true *** True Line Result - $gtk.reset -** Processing line: ~~ + list_as_string = suggestions.join("\n") +** Processing line: ~ req.respond 200, list_as_string, { 'Content-Type' => 'text/plain' }~ - Inside source: true *** True Line Result - -** Processing line: ~#+end_src~ -- Line was identified as the end of a code block. + req.respond 200, list_as_string, { 'Content-Type' => 'text/plain' } +** Processing line: ~ end~ +- Inside source: true *** True Line Result -#+end_src + end ** Processing line: ~~ -- End of paragraph detected. -*** True Line Result - -** Processing line: ~*** Rpg Tactical - Isometric Grid - main.rb~ -- Header detected. +- Inside source: true *** True Line Result +** Processing line: ~ define_method :links do~ +- Inside source: true *** True Line Result -*** Rpg Tactical - Isometric Grid - main.rb -** Processing line: ~#+begin_src ruby~ -- Line was identified as the beginning of a code block. + define_method :links do +** Processing line: ~ <<-S~ +- Inside source: true *** True Line Result - + <<-S +** Processing line: ~
    ~ +- Inside source: true *** True Line Result -#+begin_src ruby -** Processing line: ~ # ./samples/99_genre_rpg_tactical/isometric_grid/app/main.rb~ +
      +** Processing line: ~
    • Home
    • ~ - Inside source: true *** True Line Result - # ./samples/99_genre_rpg_tactical/isometric_grid/app/main.rb -** Processing line: ~ class Isometric~ +
    • Home
    • +** Processing line: ~
    • Docs
    • ~ - Inside source: true *** True Line Result - class Isometric -** Processing line: ~ attr_accessor :grid, :inputs, :state, :outputs~ +
    • Docs
    • +** Processing line: ~
    • Control Panel
    • ~ - Inside source: true *** True Line Result - attr_accessor :grid, :inputs, :state, :outputs -** Processing line: ~~ +
    • Control Panel
    • +** Processing line: ~
    • Console
    • ~ - Inside source: true *** True Line Result - -** Processing line: ~ def tick~ +
    • Console
    • +** Processing line: ~
    • Logs
    • ~ - Inside source: true *** True Line Result - def tick -** Processing line: ~ defaults~ +
    • Logs
    • +** Processing line: ~
    • Puts
    • ~ - Inside source: true *** True Line Result - defaults -** Processing line: ~ render~ +
    • Puts
    • +** Processing line: ~
    • Code
    • ~ - Inside source: true *** True Line Result - render -** Processing line: ~ calc~ +
    • Code
    • +** Processing line: ~
    ~ - Inside source: true *** True Line Result - calc -** Processing line: ~ process_inputs~ +
+** Processing line: ~ S~ - Inside source: true *** True Line Result - process_inputs + S ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -146575,310 +152806,310 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ def defaults~ -- Inside source: true -*** True Line Result - def defaults -** Processing line: ~ state.quantity ||= 6 #Size of grid~ +** Processing line: ~ def get_index args, req~ - Inside source: true *** True Line Result - state.quantity ||= 6 #Size of grid -** Processing line: ~ state.tileSize ||= [262 / 2, 194 / 2] #width and heigth of orange tiles~ + def get_index args, req +** Processing line: ~ req.respond 200, <<-S, { 'Content-Type' => 'text/html' }~ - Inside source: true *** True Line Result - state.tileSize ||= [262 / 2, 194 / 2] #width and heigth of orange tiles -** Processing line: ~ state.tileGrid ||= [] #Holds ordering of tiles~ + req.respond 200, <<-S, { 'Content-Type' => 'text/html' } +** Processing line: ~ ~ - Inside source: true *** True Line Result - state.tileGrid ||= [] #Holds ordering of tiles -** Processing line: ~ state.currentSpriteLocation ||= -1 #Current Sprite hovering location~ + +** Processing line: ~ ~ - Inside source: true *** True Line Result - state.currentSpriteLocation ||= -1 #Current Sprite hovering location -** Processing line: ~ state.tileCords ||= [] #Physical, rendering cordinates~ + +** Processing line: ~ ~ - Inside source: true *** True Line Result - state.tileCords ||= [] #Physical, rendering cordinates -** Processing line: ~ state.initCords ||= [640 - (state.quantity / 2 * state.tileSize[0]), 330] #Location of tile (0, 0)~ + +** Processing line: ~ DragonRuby Game Toolkit Documentation~ - Inside source: true *** True Line Result - state.initCords ||= [640 - (state.quantity / 2 * state.tileSize[0]), 330] #Location of tile (0, 0) -** Processing line: ~ state.sideSize ||= [state.tileSize[0] / 2, 242 / 2] #Purple & green cube face size~ + DragonRuby Game Toolkit Documentation +** Processing line: ~ ~ - Inside source: true *** True Line Result - state.sideSize ||= [state.tileSize[0] / 2, 242 / 2] #Purple & green cube face size -** Processing line: ~ state.mode ||= :delete #Switches between :delete and :insert~ + +** Processing line: ~ ~ - Inside source: true *** True Line Result - state.mode ||= :delete #Switches between :delete and :insert -** Processing line: ~ state.spriteSelection ||= [['river', 0, 0, 262 / 2, 194 / 2],~ + +** Processing line: ~ #{links}~ - Inside source: true *** True Line Result - state.spriteSelection ||= [['river', 0, 0, 262 / 2, 194 / 2], -** Processing line: ~ ['mountain', 0, 0, 262 / 2, 245 / 2],~ + #{links} +** Processing line: ~ ~ - Inside source: true *** True Line Result - ['mountain', 0, 0, 262 / 2, 245 / 2], -** Processing line: ~ ['ocean', 0, 0, 262 / 2, 194 / 2]] #Storage for sprite information~ + +** Processing line: ~ ~ - Inside source: true *** True Line Result - ['ocean', 0, 0, 262 / 2, 194 / 2]] #Storage for sprite information -** Processing line: ~ #['name', deltaX, deltaY, sizeW, sizeH]~ + +** Processing line: ~ S~ - Inside source: true *** True Line Result - #['name', deltaX, deltaY, sizeW, sizeH] -** Processing line: ~ #^delta refers to distance from tile cords~ + S +** Processing line: ~ end~ - Inside source: true *** True Line Result - #^delta refers to distance from tile cords + end ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ #Orders tiles based on tile placement and fancy math. Very left: 0,0. Very bottom: quantity-1, 0, etc~ +** Processing line: ~ def source_code_links args~ - Inside source: true *** True Line Result - #Orders tiles based on tile placement and fancy math. Very left: 0,0. Very bottom: quantity-1, 0, etc -** Processing line: ~ if state.tileGrid == []~ + def source_code_links args +** Processing line: ~ links = args.gtk.reload_list_history.keys.map do |f|~ - Inside source: true *** True Line Result - if state.tileGrid == [] -** Processing line: ~ tempX = 0~ + links = args.gtk.reload_list_history.keys.map do |f| +** Processing line: ~ "
  • #{f}
  • "~ - Inside source: true *** True Line Result - tempX = 0 -** Processing line: ~ tempY = 0~ + "
  • #{f}
  • " +** Processing line: ~ end~ - Inside source: true *** True Line Result - tempY = 0 -** Processing line: ~ tempLeft = false~ + end +** Processing line: ~ <<-S~ - Inside source: true *** True Line Result - tempLeft = false -** Processing line: ~ tempRight = false~ + <<-S +** Processing line: ~
      ~ - Inside source: true *** True Line Result - tempRight = false -** Processing line: ~ count = 0~ +
        +** Processing line: ~ #{links.join("\n")}~ - Inside source: true *** True Line Result - count = 0 -** Processing line: ~ (state.quantity * state.quantity).times do~ + #{links.join("\n")} +** Processing line: ~
      ~ - Inside source: true *** True Line Result - (state.quantity * state.quantity).times do -** Processing line: ~ if tempY == 0~ +
    +** Processing line: ~ S~ - Inside source: true *** True Line Result - if tempY == 0 -** Processing line: ~ tempLeft = true~ + S +** Processing line: ~ end~ - Inside source: true *** True Line Result - tempLeft = true -** Processing line: ~ end~ + end +** Processing line: ~~ - Inside source: true *** True Line Result - end -** Processing line: ~ if tempX == (state.quantity - 1)~ + +** Processing line: ~ def get_api_code args, req~ - Inside source: true *** True Line Result - if tempX == (state.quantity - 1) -** Processing line: ~ tempRight = true~ + def get_api_code args, req +** Processing line: ~ view = <<-S~ - Inside source: true *** True Line Result - tempRight = true -** Processing line: ~ end~ + view = <<-S +** Processing line: ~ ~ - Inside source: true *** True Line Result - end -** Processing line: ~ state.tileGrid.push([tempX, tempY, true, tempLeft, tempRight, count])~ + +** Processing line: ~ ~ - Inside source: true *** True Line Result - state.tileGrid.push([tempX, tempY, true, tempLeft, tempRight, count]) -** Processing line: ~ #orderX, orderY, exists?, leftSide, rightSide, order~ + +** Processing line: ~ ~ - Inside source: true *** True Line Result - #orderX, orderY, exists?, leftSide, rightSide, order -** Processing line: ~ tempX += 1~ + +** Processing line: ~ DragonRuby Game Toolkit Documentation~ - Inside source: true *** True Line Result - tempX += 1 -** Processing line: ~ if tempX == state.quantity~ + DragonRuby Game Toolkit Documentation +** Processing line: ~ ~ - Inside source: true *** True Line Result - if tempX == state.quantity -** Processing line: ~ tempX = 0~ + +** Processing line: ~ ~ - Inside source: true *** True Line Result - tempX = 0 -** Processing line: ~ tempY += 1~ + +** Processing line: ~ #{source_code_links args}~ - Inside source: true *** True Line Result - tempY += 1 -** Processing line: ~ end~ + #{source_code_links args} +** Processing line: ~~ - Inside source: true *** True Line Result - end -** Processing line: ~ tempLeft = false~ + +** Processing line: ~ #{links}~ - Inside source: true *** True Line Result - tempLeft = false -** Processing line: ~ tempRight = false~ + #{links} +** Processing line: ~ ~ - Inside source: true *** True Line Result - tempRight = false -** Processing line: ~ count += 1~ + +** Processing line: ~ ~ - Inside source: true *** True Line Result - count += 1 -** Processing line: ~ end~ + +** Processing line: ~ S~ - Inside source: true *** True Line Result - end -** Processing line: ~ end~ + S +** Processing line: ~ req.respond 200,~ - Inside source: true *** True Line Result - end -** Processing line: ~~ + req.respond 200, +** Processing line: ~ view,~ - Inside source: true *** True Line Result - -** Processing line: ~ #Calculates physical cordinates for tiles~ + view, +** Processing line: ~ { 'Content-Type' => 'text/html' }~ - Inside source: true *** True Line Result - #Calculates physical cordinates for tiles -** Processing line: ~ if state.tileCords == []~ + { 'Content-Type' => 'text/html' } +** Processing line: ~ end~ - Inside source: true *** True Line Result - if state.tileCords == [] -** Processing line: ~ state.tileCords = state.tileGrid.map do~ + end +** Processing line: ~~ - Inside source: true *** True Line Result - state.tileCords = state.tileGrid.map do -** Processing line: ~ |val|~ + +** Processing line: ~ def code_edit_view args, file~ - Inside source: true *** True Line Result - |val| -** Processing line: ~ x = (state.initCords[0]) + ((val[0] + val[1]) * state.tileSize[0] / 2)~ + def code_edit_view args, file +** Processing line: ~ view = <<-S~ - Inside source: true *** True Line Result - x = (state.initCords[0]) + ((val[0] + val[1]) * state.tileSize[0] / 2) -** Processing line: ~ y = (state.initCords[1]) + (-1 * val[0] * state.tileSize[1] / 2) + (val[1] * state.tileSize[1] / 2)~ + view = <<-S +** Processing line: ~ ~ - Inside source: true *** True Line Result - y = (state.initCords[1]) + (-1 * val[0] * state.tileSize[1] / 2) + (val[1] * state.tileSize[1] / 2) -** Processing line: ~ [x, y, val[2], val[3], val[4], val[5], -1] #-1 represents sprite on top of tile. -1 for now~ + +** Processing line: ~ ~ - Inside source: true *** True Line Result - [x, y, val[2], val[3], val[4], val[5], -1] #-1 represents sprite on top of tile. -1 for now -** Processing line: ~ end~ + +** Processing line: ~ ~ - Inside source: true *** True Line Result - end -** Processing line: ~ end~ + +** Processing line: ~ DragonRuby Game Toolkit Documentation~ - Inside source: true *** True Line Result - end -** Processing line: ~~ + DragonRuby Game Toolkit Documentation +** Processing line: ~ ~ - Inside source: true *** True Line Result - -** Processing line: ~ end~ + +** Processing line: ~ ~ - Inside source: true *** True Line Result - end -** Processing line: ~~ + +** Processing line: ~ ~ - Inside source: true *** True Line Result - def renderBackground -** Processing line: ~ outputs.solids << [0, 0, 1280, 720, 0, 0, 0] #Background color~ + +** Processing line: ~
    ~ - Inside source: true *** True Line Result - outputs.solids << [0, 0, 1280, 720, 0, 0, 0] #Background color -** Processing line: ~ end~ + +** Processing line: ~
    #{file}:
    ~ - Inside source: true *** True Line Result - end -** Processing line: ~~ +
    #{file}:
    +** Processing line: ~ ~ - Inside source: true *** True Line Result - -** Processing line: ~ def renderLeft~ + +** Processing line: ~
    ~ - Inside source: true *** True Line Result - def renderLeft -** Processing line: ~ #Shows the pink left cube face~ +
    +** Processing line: ~ ~ - Inside source: true *** True Line Result - #Shows the pink left cube face -** Processing line: ~ outputs.sprites << state.tileCords.map do~ + +** Processing line: ~ ~ - Inside source: true *** True Line Result - outputs.sprites << state.tileCords.map do -** Processing line: ~ |val|~ + +** Processing line: ~
    ~ - Inside source: true *** True Line Result - |val| -** Processing line: ~ if val[2] == true && val[3] == true #Checks if the tile exists and right face needs to be rendered~ + +** Processing line: ~ #{source_code_links args}~ - Inside source: true *** True Line Result - if val[2] == true && val[3] == true #Checks if the tile exists and right face needs to be rendered -** Processing line: ~ [val[0], val[1] + (state.tileSize[1] / 2) - state.sideSize[1], state.sideSize[0],~ + #{source_code_links args} +** Processing line: ~~ - Inside source: true *** True Line Result - [val[0], val[1] + (state.tileSize[1] / 2) - state.sideSize[1], state.sideSize[0], -** Processing line: ~ state.sideSize[1], 'sprites/leftSide.png']~ + +** Processing line: ~ #{links}~ - Inside source: true *** True Line Result - state.sideSize[1], 'sprites/leftSide.png'] -** Processing line: ~ end~ + #{links} +** Processing line: ~ ~ - Inside source: true *** True Line Result - end -** Processing line: ~ end~ + +** Processing line: ~ ~ - Inside source: true *** True Line Result - end + +** Processing line: ~ S~ +- Inside source: true +*** True Line Result + S ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -146887,42 +153118,30 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ def renderRight~ -- Inside source: true -*** True Line Result - def renderRight -** Processing line: ~ #Shows the green right cube face~ -- Inside source: true -*** True Line Result - #Shows the green right cube face -** Processing line: ~ outputs.sprites << state.tileCords.map do~ -- Inside source: true -*** True Line Result - outputs.sprites << state.tileCords.map do -** Processing line: ~ |val|~ +** Processing line: ~ def get_api_code_edit args, req~ - Inside source: true *** True Line Result - |val| -** Processing line: ~ if val[2] == true && val[4] == true #Checks if it exists & checks if right face needs to be rendered~ + def get_api_code_edit args, req +** Processing line: ~ file = req.uri.split('?').last.gsub("file=", "")~ - Inside source: true *** True Line Result - if val[2] == true && val[4] == true #Checks if it exists & checks if right face needs to be rendered -** Processing line: ~ [val[0] + state.tileSize[0] / 2, val[1] + (state.tileSize[1] / 2) - state.sideSize[1], state.sideSize[0],~ + file = req.uri.split('?').last.gsub("file=", "") +** Processing line: ~ view = code_edit_view args, file~ - Inside source: true *** True Line Result - [val[0] + state.tileSize[0] / 2, val[1] + (state.tileSize[1] / 2) - state.sideSize[1], state.sideSize[0], -** Processing line: ~ state.sideSize[1], 'sprites/rightSide.png']~ + view = code_edit_view args, file +** Processing line: ~ req.respond 200,~ - Inside source: true *** True Line Result - state.sideSize[1], 'sprites/rightSide.png'] -** Processing line: ~ end~ + req.respond 200, +** Processing line: ~ view,~ - Inside source: true *** True Line Result - end -** Processing line: ~ end~ + view, +** Processing line: ~ { 'Content-Type' => 'text/html' }~ - Inside source: true *** True Line Result - end + { 'Content-Type' => 'text/html' } ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -146931,54 +153150,38 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ def renderTiles~ -- Inside source: true -*** True Line Result - def renderTiles -** Processing line: ~ #Shows the tile itself. Important that it's rendered after the two above!~ -- Inside source: true -*** True Line Result - #Shows the tile itself. Important that it's rendered after the two above! -** Processing line: ~ outputs.sprites << state.tileCords.map do~ -- Inside source: true -*** True Line Result - outputs.sprites << state.tileCords.map do -** Processing line: ~ |val|~ -- Inside source: true -*** True Line Result - |val| -** Processing line: ~ if val[2] == true #Chcekcs if tile needs to be rendered~ +** Processing line: ~ def post_api_code_update args, req~ - Inside source: true *** True Line Result - if val[2] == true #Chcekcs if tile needs to be rendered -** Processing line: ~ if val[5] == state.currentSpriteLocation~ + def post_api_code_update args, req +** Processing line: ~ file = req.uri.split('?').last.gsub("file=", "")~ - Inside source: true *** True Line Result - if val[5] == state.currentSpriteLocation -** Processing line: ~ [val[0], val[1], state.tileSize[0], state.tileSize[1], 'sprites/selectedTile.png']~ + file = req.uri.split('?').last.gsub("file=", "") +** Processing line: ~ code = ($gtk.parse_json req.body)["code"]~ - Inside source: true *** True Line Result - [val[0], val[1], state.tileSize[0], state.tileSize[1], 'sprites/selectedTile.png'] -** Processing line: ~ else~ + code = ($gtk.parse_json req.body)["code"] +** Processing line: ~ args.gtk.write_file file, code~ - Inside source: true *** True Line Result - else -** Processing line: ~ [val[0], val[1], state.tileSize[0], state.tileSize[1], 'sprites/tile.png']~ + args.gtk.write_file file, code +** Processing line: ~ view = code_edit_view args, file~ - Inside source: true *** True Line Result - [val[0], val[1], state.tileSize[0], state.tileSize[1], 'sprites/tile.png'] -** Processing line: ~ end~ + view = code_edit_view args, file +** Processing line: ~ req.respond 200,~ - Inside source: true *** True Line Result - end -** Processing line: ~ end~ + req.respond 200, +** Processing line: ~ view,~ - Inside source: true *** True Line Result - end -** Processing line: ~ end~ + view, +** Processing line: ~ { 'Content-Type' => 'text/html' }~ - Inside source: true *** True Line Result - end + { 'Content-Type' => 'text/html' } ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -146987,78 +153190,70 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ def renderObjects~ -- Inside source: true -*** True Line Result - def renderObjects -** Processing line: ~ #Renders the sprites on top of the tiles. Order of rendering: top corner to right corner and cascade down until left corner~ -- Inside source: true -*** True Line Result - #Renders the sprites on top of the tiles. Order of rendering: top corner to right corner and cascade down until left corner -** Processing line: ~ #to bottom corner.~ +** Processing line: ~ def get_api_boot args, req~ - Inside source: true *** True Line Result - #to bottom corner. -** Processing line: ~ a = (state.quantity * state.quantity) - state.quantity~ + def get_api_boot args, req +** Processing line: ~ req.respond 200,~ - Inside source: true *** True Line Result - a = (state.quantity * state.quantity) - state.quantity -** Processing line: ~ iter = 0~ + req.respond 200, +** Processing line: ~ args.gtk.read_file("tmp/src_backup/boot.txt"),~ - Inside source: true *** True Line Result - iter = 0 -** Processing line: ~ loop do~ + args.gtk.read_file("tmp/src_backup/boot.txt"), +** Processing line: ~ { 'Content-Type' => 'text/plain' }~ - Inside source: true *** True Line Result - loop do -** Processing line: ~ if state.tileCords[a][2] == true && state.tileCords[a][6] != -1~ + { 'Content-Type' => 'text/plain' } +** Processing line: ~ end~ - Inside source: true *** True Line Result - if state.tileCords[a][2] == true && state.tileCords[a][6] != -1 -** Processing line: ~ outputs.sprites << [state.tileCords[a][0] + state.spriteSelection[state.tileCords[a][6]][1],~ + end +** Processing line: ~~ - Inside source: true *** True Line Result - outputs.sprites << [state.tileCords[a][0] + state.spriteSelection[state.tileCords[a][6]][1], -** Processing line: ~ state.tileCords[a][1] + state.spriteSelection[state.tileCords[a][6]][2],~ + +** Processing line: ~ def get_api_trace args, req~ - Inside source: true *** True Line Result - state.tileCords[a][1] + state.spriteSelection[state.tileCords[a][6]][2], -** Processing line: ~ state.spriteSelection[state.tileCords[a][6]][3], state.spriteSelection[state.tileCords[a][6]][4],~ + def get_api_trace args, req +** Processing line: ~ req.respond 200,~ - Inside source: true *** True Line Result - state.spriteSelection[state.tileCords[a][6]][3], state.spriteSelection[state.tileCords[a][6]][4], -** Processing line: ~ 'sprites/' + state.spriteSelection[state.tileCords[a][6]][0] + '.png']~ + req.respond 200, +** Processing line: ~ args.gtk.read_file("logs/trace.txt"),~ - Inside source: true *** True Line Result - 'sprites/' + state.spriteSelection[state.tileCords[a][6]][0] + '.png'] -** Processing line: ~ end~ + args.gtk.read_file("logs/trace.txt"), +** Processing line: ~ { 'Content-Type' => 'text/plain' }~ - Inside source: true *** True Line Result - end -** Processing line: ~ iter += 1~ + { 'Content-Type' => 'text/plain' } +** Processing line: ~ end~ - Inside source: true *** True Line Result - iter += 1 -** Processing line: ~ a += 1~ + end +** Processing line: ~~ - Inside source: true *** True Line Result - a += 1 -** Processing line: ~ a -= state.quantity * 2 if iter == state.quantity~ + +** Processing line: ~ def get_api_log args, req~ - Inside source: true *** True Line Result - a -= state.quantity * 2 if iter == state.quantity -** Processing line: ~ iter = 0 if iter == state.quantity~ + def get_api_log args, req +** Processing line: ~ req.respond 200,~ - Inside source: true *** True Line Result - iter = 0 if iter == state.quantity -** Processing line: ~ break if a < 0~ + req.respond 200, +** Processing line: ~ args.gtk.read_file("logs/log.txt"),~ - Inside source: true *** True Line Result - break if a < 0 -** Processing line: ~ end~ + args.gtk.read_file("logs/log.txt"), +** Processing line: ~ { 'Content-Type' => 'text/plain' }~ - Inside source: true *** True Line Result - end + { 'Content-Type' => 'text/plain' } ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -147067,30 +153262,30 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ def renderLabels~ +** Processing line: ~ def post_api_log args, req~ - Inside source: true *** True Line Result - def renderLabels -** Processing line: ~ #Labels~ + def post_api_log args, req +** Processing line: ~ Log.log req.body~ - Inside source: true *** True Line Result - #Labels -** Processing line: ~ outputs.labels << [50, 680, 'Click to delete!', 5, 0, 255, 255, 255, 255] if state.mode == :delete~ + Log.log req.body +** Processing line: ~~ - Inside source: true *** True Line Result - outputs.labels << [50, 680, 'Click to delete!', 5, 0, 255, 255, 255, 255] if state.mode == :delete -** Processing line: ~ outputs.labels << [50, 640, 'Press \'i\' for insert mode!', 5, 0, 255, 255, 255, 255] if state.mode == :delete~ + +** Processing line: ~ req.respond 200,~ - Inside source: true *** True Line Result - outputs.labels << [50, 640, 'Press \'i\' for insert mode!', 5, 0, 255, 255, 255, 255] if state.mode == :delete -** Processing line: ~ outputs.labels << [50, 680, 'Click to insert!', 5, 0, 255, 255, 255, 255] if state.mode == :insert~ + req.respond 200, +** Processing line: ~ "ok",~ - Inside source: true *** True Line Result - outputs.labels << [50, 680, 'Click to insert!', 5, 0, 255, 255, 255, 255] if state.mode == :insert -** Processing line: ~ outputs.labels << [50, 640, 'Press \'d\' for delete mode!', 5, 0, 255, 255, 255, 255] if state.mode == :insert~ + "ok", +** Processing line: ~ { 'Content-Type' => 'text/plain' }~ - Inside source: true *** True Line Result - outputs.labels << [50, 640, 'Press \'d\' for delete mode!', 5, 0, 255, 255, 255, 255] if state.mode == :insert + { 'Content-Type' => 'text/plain' } ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -147099,154 +153294,150 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ def calc~ -- Inside source: true -*** True Line Result - def calc -** Processing line: ~ calcCurrentHover~ +** Processing line: ~ def get_api_puts args, req~ - Inside source: true *** True Line Result - calcCurrentHover -** Processing line: ~ end~ + def get_api_puts args, req +** Processing line: ~ req.respond 200,~ - Inside source: true *** True Line Result - end -** Processing line: ~~ + req.respond 200, +** Processing line: ~ args.gtk.read_file("logs/puts.txt"),~ - Inside source: true *** True Line Result - -** Processing line: ~ def calcCurrentHover~ + args.gtk.read_file("logs/puts.txt"), +** Processing line: ~ { 'Content-Type' => 'text/plain' }~ - Inside source: true *** True Line Result - def calcCurrentHover -** Processing line: ~ #This determines what tile the mouse is hovering (or last hovering) over~ + { 'Content-Type' => 'text/plain' } +** Processing line: ~ end~ - Inside source: true *** True Line Result - #This determines what tile the mouse is hovering (or last hovering) over -** Processing line: ~ x = inputs.mouse.position.x~ + end +** Processing line: ~~ - Inside source: true *** True Line Result - x = inputs.mouse.position.x -** Processing line: ~ y = inputs.mouse.position.y~ + +** Processing line: ~ def get_api_changes args, req~ - Inside source: true *** True Line Result - y = inputs.mouse.position.y -** Processing line: ~ m = (state.tileSize[1] / state.tileSize[0]) #slope~ + def get_api_changes args, req +** Processing line: ~ req.respond 200,~ - Inside source: true *** True Line Result - m = (state.tileSize[1] / state.tileSize[0]) #slope -** Processing line: ~ state.tileCords.map do~ + req.respond 200, +** Processing line: ~ args.gtk.read_file("tmp/src_backup/src_backup_changes.txt"),~ - Inside source: true *** True Line Result - state.tileCords.map do -** Processing line: ~ |val|~ + args.gtk.read_file("tmp/src_backup/src_backup_changes.txt"), +** Processing line: ~ { 'Content-Type' => 'text/plain' }~ - Inside source: true *** True Line Result - |val| -** Processing line: ~ #Conditions that makes runtime faster. Checks if the mouse click was between tile dimensions (rectangle collision)~ + { 'Content-Type' => 'text/plain' } +** Processing line: ~ end~ - Inside source: true *** True Line Result - #Conditions that makes runtime faster. Checks if the mouse click was between tile dimensions (rectangle collision) -** Processing line: ~ next unless val[0] < x && x < val[0] + state.tileSize[0]~ + end +** Processing line: ~~ - Inside source: true *** True Line Result - next unless val[0] < x && x < val[0] + state.tileSize[0] -** Processing line: ~ next unless val[1] < y && y < val[1] + state.tileSize[1]~ + +** Processing line: ~ def get_favicon_ico args, req~ - Inside source: true *** True Line Result - next unless val[1] < y && y < val[1] + state.tileSize[1] -** Processing line: ~ next unless val[2] == true~ + def get_favicon_ico args, req +** Processing line: ~ @favicon ||= args.gtk.read_file('docs/favicon.ico')~ - Inside source: true *** True Line Result - next unless val[2] == true -** Processing line: ~ tempBool = false~ + @favicon ||= args.gtk.read_file('docs/favicon.ico') +** Processing line: ~ req.respond 200, @favicon, { "Content-Type" => 'image/x-icon' }~ - Inside source: true *** True Line Result - tempBool = false -** Processing line: ~ if x == val[0] + (state.tileSize[0] / 2)~ + req.respond 200, @favicon, { "Content-Type" => 'image/x-icon' } +** Processing line: ~ end~ - Inside source: true *** True Line Result - if x == val[0] + (state.tileSize[0] / 2) -** Processing line: ~ #The height of a diamond is the height of the diamond, so if x equals that exact point, it must be inside the diamond~ + end +** Processing line: ~~ - Inside source: true *** True Line Result - #The height of a diamond is the height of the diamond, so if x equals that exact point, it must be inside the diamond -** Processing line: ~ tempBool = true~ + +** Processing line: ~ def get_src_backup args, req~ - Inside source: true *** True Line Result - tempBool = true -** Processing line: ~ elsif x < state.tileSize[0] / 2 + val[0]~ + def get_src_backup args, req +** Processing line: ~ file_name = req.uri.gsub("/dragon/", "")~ - Inside source: true *** True Line Result - elsif x < state.tileSize[0] / 2 + val[0] -** Processing line: ~ #Uses y = (m) * (x - x1) + y1 to determine the y values for the two diamond lines on the left half of diamond~ + file_name = req.uri.gsub("/dragon/", "") +** Processing line: ~ req.respond 200,~ - Inside source: true *** True Line Result - #Uses y = (m) * (x - x1) + y1 to determine the y values for the two diamond lines on the left half of diamond -** Processing line: ~ tempY1 = (m * (x - val[0])) + val[1] + (state.tileSize[1] / 2)~ + req.respond 200, +** Processing line: ~ args.gtk.read_file("tmp/src_backup/#{file_name}"),~ - Inside source: true *** True Line Result - tempY1 = (m * (x - val[0])) + val[1] + (state.tileSize[1] / 2) -** Processing line: ~ tempY2 = (-1 * m * (x - val[0])) + val[1] + (state.tileSize[1] / 2)~ + args.gtk.read_file("tmp/src_backup/#{file_name}"), +** Processing line: ~ { 'Content-Type' => 'text/plain' }~ - Inside source: true *** True Line Result - tempY2 = (-1 * m * (x - val[0])) + val[1] + (state.tileSize[1] / 2) -** Processing line: ~ #Checks to see if the mouse click y value is between those temp y values~ + { 'Content-Type' => 'text/plain' } +** Processing line: ~ end~ - Inside source: true *** True Line Result - #Checks to see if the mouse click y value is between those temp y values -** Processing line: ~ tempBool = true if y < tempY1 && y > tempY2~ + end +** Processing line: ~~ - Inside source: true *** True Line Result - tempBool = true if y < tempY1 && y > tempY2 -** Processing line: ~ elsif x > state.tileSize[0] / 2 + val[0]~ + +** Processing line: ~ def get_not_found args, req~ - Inside source: true *** True Line Result - elsif x > state.tileSize[0] / 2 + val[0] -** Processing line: ~ #Uses y = (m) * (x - x1) + y1 to determine the y values for the two diamond lines on the right half of diamond~ + def get_not_found args, req +** Processing line: ~ puts("METHOD: #{req.method}");~ - Inside source: true *** True Line Result - #Uses y = (m) * (x - x1) + y1 to determine the y values for the two diamond lines on the right half of diamond -** Processing line: ~ tempY1 = (m * (x - val[0] - (state.tileSize[0] / 2))) + val[1]~ + puts("METHOD: #{req.method}"); +** Processing line: ~ puts("URI: #{req.uri}");~ - Inside source: true *** True Line Result - tempY1 = (m * (x - val[0] - (state.tileSize[0] / 2))) + val[1] -** Processing line: ~ tempY2 = (-1 * m * (x - val[0] - (state.tileSize[0] / 2))) + val[1] + state.tileSize[1]~ + puts("URI: #{req.uri}"); +** Processing line: ~ puts("HEADERS:");~ - Inside source: true *** True Line Result - tempY2 = (-1 * m * (x - val[0] - (state.tileSize[0] / 2))) + val[1] + state.tileSize[1] -** Processing line: ~ #Checks to see if the mouse click y value is between those temp y values~ + puts("HEADERS:"); +** Processing line: ~ req.headers.each { |k,v| puts(" #{k}: #{v}") }~ - Inside source: true *** True Line Result - #Checks to see if the mouse click y value is between those temp y values -** Processing line: ~ tempBool = true if y > tempY1 && y < tempY2~ + req.headers.each { |k,v| puts(" #{k}: #{v}") } +** Processing line: ~ req.respond 404, "not found: #{req.uri}", { }~ - Inside source: true *** True Line Result - tempBool = true if y > tempY1 && y < tempY2 -** Processing line: ~ end~ + req.respond 404, "not found: #{req.uri}", { } +** Processing line: ~ end~ - Inside source: true *** True Line Result - end + end ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ if tempBool == true~ +** Processing line: ~ def get_docs_html args, req~ - Inside source: true *** True Line Result - if tempBool == true -** Processing line: ~ state.currentSpriteLocation = val[5] #Current sprite location set to the order value~ + def get_docs_html args, req +** Processing line: ~ req.respond 200,~ - Inside source: true *** True Line Result - state.currentSpriteLocation = val[5] #Current sprite location set to the order value -** Processing line: ~ end~ + req.respond 200, +** Processing line: ~ args.gtk.read_file("docs/docs.html"),~ - Inside source: true *** True Line Result - end -** Processing line: ~ end~ + args.gtk.read_file("docs/docs.html"), +** Processing line: ~ { 'Content-Type' => 'text/html' }~ - Inside source: true *** True Line Result - end + { 'Content-Type' => 'text/html' } ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -147255,34 +153446,22 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ def process_inputs~ -- Inside source: true -*** True Line Result - def process_inputs -** Processing line: ~ #Makes development much faster and easier~ -- Inside source: true -*** True Line Result - #Makes development much faster and easier -** Processing line: ~ if inputs.keyboard.key_up.r~ +** Processing line: ~ def get_docs_css args, req~ - Inside source: true *** True Line Result - if inputs.keyboard.key_up.r -** Processing line: ~ $dragon.reset~ -- Inside source: true -*** True Line Result - $dragon.reset -** Processing line: ~ end~ + def get_docs_css args, req +** Processing line: ~ req.respond 200,~ - Inside source: true *** True Line Result - end -** Processing line: ~ checkTileSelected~ + req.respond 200, +** Processing line: ~ args.gtk.read_file("docs/docs.css"),~ - Inside source: true *** True Line Result - checkTileSelected -** Processing line: ~ switchModes~ + args.gtk.read_file("docs/docs.css"), +** Processing line: ~ { 'Content-Type' => 'text/css' }~ - Inside source: true *** True Line Result - switchModes + { 'Content-Type' => 'text/css' } ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -147291,1394 +153470,1430 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ def checkTileSelected~ +** Processing line: ~ def get_docs_search_gif args, req~ - Inside source: true *** True Line Result - def checkTileSelected -** Processing line: ~ if inputs.mouse.down~ + def get_docs_search_gif args, req +** Processing line: ~ req.respond 200,~ - Inside source: true *** True Line Result - if inputs.mouse.down -** Processing line: ~ x = inputs.mouse.down.point.x~ + req.respond 200, +** Processing line: ~ args.gtk.read_file("docs/docs_search.gif"),~ - Inside source: true *** True Line Result - x = inputs.mouse.down.point.x -** Processing line: ~ y = inputs.mouse.down.point.y~ + args.gtk.read_file("docs/docs_search.gif"), +** Processing line: ~ { 'Content-Type' => 'image/gif' }~ - Inside source: true *** True Line Result - y = inputs.mouse.down.point.y -** Processing line: ~ m = (state.tileSize[1] / state.tileSize[0]) #slope~ + { 'Content-Type' => 'image/gif' } +** Processing line: ~ end~ - Inside source: true *** True Line Result - m = (state.tileSize[1] / state.tileSize[0]) #slope -** Processing line: ~ state.tileCords.map do~ + end +** Processing line: ~~ - Inside source: true *** True Line Result - state.tileCords.map do -** Processing line: ~ |val|~ + +** Processing line: ~ def get_src_backup_index_html args, req~ - Inside source: true *** True Line Result - |val| -** Processing line: ~ #Conditions that makes runtime faster. Checks if the mouse click was between tile dimensions (rectangle collision)~ + def get_src_backup_index_html args, req +** Processing line: ~ req.respond 200,~ - Inside source: true *** True Line Result - #Conditions that makes runtime faster. Checks if the mouse click was between tile dimensions (rectangle collision) -** Processing line: ~ next unless val[0] < x && x < val[0] + state.tileSize[0]~ + req.respond 200, +** Processing line: ~ args.gtk.read_file("/tmp/src_backup/src_backup_index.html"),~ - Inside source: true *** True Line Result - next unless val[0] < x && x < val[0] + state.tileSize[0] -** Processing line: ~ next unless val[1] < y && y < val[1] + state.tileSize[1]~ + args.gtk.read_file("/tmp/src_backup/src_backup_index.html"), +** Processing line: ~ { 'Content-Type' => 'text/html' }~ - Inside source: true *** True Line Result - next unless val[1] < y && y < val[1] + state.tileSize[1] -** Processing line: ~ next unless val[2] == true~ + { 'Content-Type' => 'text/html' } +** Processing line: ~ end~ - Inside source: true *** True Line Result - next unless val[2] == true -** Processing line: ~ tempBool = false~ + end +** Processing line: ~~ - Inside source: true *** True Line Result - tempBool = false -** Processing line: ~ if x == val[0] + (state.tileSize[0] / 2)~ + +** Processing line: ~ def get_src_backup_index_txt args, req~ - Inside source: true *** True Line Result - if x == val[0] + (state.tileSize[0] / 2) -** Processing line: ~ #The height of a diamond is the height of the diamond, so if x equals that exact point, it must be inside the diamond~ + def get_src_backup_index_txt args, req +** Processing line: ~ req.respond 200,~ +- Inside source: true +*** True Line Result + req.respond 200, +** Processing line: ~ args.gtk.read_file("/tmp/src_backup/src_backup_index.txt"),~ - Inside source: true *** True Line Result - #The height of a diamond is the height of the diamond, so if x equals that exact point, it must be inside the diamond -** Processing line: ~ tempBool = true~ + args.gtk.read_file("/tmp/src_backup/src_backup_index.txt"), +** Processing line: ~ { 'Content-Type' => 'text/txt' }~ - Inside source: true *** True Line Result - tempBool = true -** Processing line: ~ elsif x < state.tileSize[0] / 2 + val[0]~ + { 'Content-Type' => 'text/txt' } +** Processing line: ~ end~ - Inside source: true *** True Line Result - elsif x < state.tileSize[0] / 2 + val[0] -** Processing line: ~ #Uses y = (m) * (x - x1) + y1 to determine the y values for the two diamond lines on the left half of diamond~ + end +** Processing line: ~~ - Inside source: true *** True Line Result - #Uses y = (m) * (x - x1) + y1 to determine the y values for the two diamond lines on the left half of diamond -** Processing line: ~ tempY1 = (m * (x - val[0])) + val[1] + (state.tileSize[1] / 2)~ + +** Processing line: ~ def get_src_backup_css args, req~ - Inside source: true *** True Line Result - tempY1 = (m * (x - val[0])) + val[1] + (state.tileSize[1] / 2) -** Processing line: ~ tempY2 = (-1 * m * (x - val[0])) + val[1] + (state.tileSize[1] / 2)~ + def get_src_backup_css args, req +** Processing line: ~ req.respond 200,~ - Inside source: true *** True Line Result - tempY2 = (-1 * m * (x - val[0])) + val[1] + (state.tileSize[1] / 2) -** Processing line: ~ #Checks to see if the mouse click y value is between those temp y values~ + req.respond 200, +** Processing line: ~ args.gtk.read_file("/tmp/src_backup/src_backup.css"),~ - Inside source: true *** True Line Result - #Checks to see if the mouse click y value is between those temp y values -** Processing line: ~ tempBool = true if y < tempY1 && y > tempY2~ + args.gtk.read_file("/tmp/src_backup/src_backup.css"), +** Processing line: ~ { 'Content-Type' => 'text/css' }~ - Inside source: true *** True Line Result - tempBool = true if y < tempY1 && y > tempY2 -** Processing line: ~ elsif x > state.tileSize[0] / 2 + val[0]~ + { 'Content-Type' => 'text/css' } +** Processing line: ~ end~ - Inside source: true *** True Line Result - elsif x > state.tileSize[0] / 2 + val[0] -** Processing line: ~ #Uses y = (m) * (x - x1) + y1 to determine the y values for the two diamond lines on the right half of diamond~ + end +** Processing line: ~~ - Inside source: true *** True Line Result - #Uses y = (m) * (x - x1) + y1 to determine the y values for the two diamond lines on the right half of diamond -** Processing line: ~ tempY1 = (m * (x - val[0] - (state.tileSize[0] / 2))) + val[1]~ + +** Processing line: ~ def get_src_backup_changes_html args, req~ - Inside source: true *** True Line Result - tempY1 = (m * (x - val[0] - (state.tileSize[0] / 2))) + val[1] -** Processing line: ~ tempY2 = (-1 * m * (x - val[0] - (state.tileSize[0] / 2))) + val[1] + state.tileSize[1]~ + def get_src_backup_changes_html args, req +** Processing line: ~ req.respond 200,~ - Inside source: true *** True Line Result - tempY2 = (-1 * m * (x - val[0] - (state.tileSize[0] / 2))) + val[1] + state.tileSize[1] -** Processing line: ~ #Checks to see if the mouse click y value is between those temp y values~ + req.respond 200, +** Processing line: ~ args.gtk.read_file("/tmp/src_backup/src_backup_changes.html"),~ - Inside source: true *** True Line Result - #Checks to see if the mouse click y value is between those temp y values -** Processing line: ~ tempBool = true if y > tempY1 && y < tempY2~ + args.gtk.read_file("/tmp/src_backup/src_backup_changes.html"), +** Processing line: ~ { 'Content-Type' => 'text/html' }~ - Inside source: true *** True Line Result - tempBool = true if y > tempY1 && y < tempY2 -** Processing line: ~ end~ + { 'Content-Type' => 'text/html' } +** Processing line: ~ end~ - Inside source: true *** True Line Result - end + end ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ if tempBool == true~ +** Processing line: ~ def get_src_backup_changes_txt args, req~ - Inside source: true *** True Line Result - if tempBool == true -** Processing line: ~ if state.mode == :delete~ + def get_src_backup_changes_txt args, req +** Processing line: ~ req.respond 200,~ - Inside source: true *** True Line Result - if state.mode == :delete -** Processing line: ~ val[2] = false~ + req.respond 200, +** Processing line: ~ args.gtk.read_file("/tmp/src_backup/src_backup_changes.txt"),~ - Inside source: true *** True Line Result - val[2] = false -** Processing line: ~ state.tileGrid[val[5]][2] = false #Unnecessary because never used again but eh, I like consistency~ + args.gtk.read_file("/tmp/src_backup/src_backup_changes.txt"), +** Processing line: ~ { 'Content-Type' => 'text/txt' }~ - Inside source: true *** True Line Result - state.tileGrid[val[5]][2] = false #Unnecessary because never used again but eh, I like consistency -** Processing line: ~ state.tileCords[val[5]][2] = false #Ensures that the tile isn't rendered~ + { 'Content-Type' => 'text/txt' } +** Processing line: ~ end~ - Inside source: true *** True Line Result - state.tileCords[val[5]][2] = false #Ensures that the tile isn't rendered -** Processing line: ~ unless state.tileGrid[val[5]][0] == 0 #If tile is the left most tile in the row, right doesn't get rendered~ + end +** Processing line: ~~ - Inside source: true *** True Line Result - unless state.tileGrid[val[5]][0] == 0 #If tile is the left most tile in the row, right doesn't get rendered -** Processing line: ~ state.tileGrid[val[5] - 1][4] = true #Why the order value is amazing~ + +** Processing line: ~ def get_api_eval args, req~ - Inside source: true *** True Line Result - state.tileGrid[val[5] - 1][4] = true #Why the order value is amazing -** Processing line: ~ state.tileCords[val[5] - 1][4] = true~ + def get_api_eval args, req +** Processing line: ~ eval_view = <<-S~ - Inside source: true *** True Line Result - state.tileCords[val[5] - 1][4] = true -** Processing line: ~ end~ + eval_view = <<-S +** Processing line: ~ ~ - Inside source: true *** True Line Result - end -** Processing line: ~ unless state.tileGrid[val[5]][1] == state.quantity - 1 #Same but left side~ + +** Processing line: ~ Eval~ - Inside source: true *** True Line Result - unless state.tileGrid[val[5]][1] == state.quantity - 1 #Same but left side -** Processing line: ~ state.tileGrid[val[5] + state.quantity][3] = true~ + Eval +** Processing line: ~ ~ - Inside source: true *** True Line Result - -** Processing line: ~ def switchModes~ + +** Processing line: ~ ~ - Inside source: true *** True Line Result - def switchModes -** Processing line: ~ #Switches between insert and delete modes~ + +** Processing line: ~ ~ - Inside source: true *** True Line Result - -** Processing line: ~ end~ + +** Processing line: ~
    ~ - Inside source: true *** True Line Result - end -** Processing line: ~~ + +** Processing line: ~ ~ - Inside source: true *** True Line Result - -** Processing line: ~ $isometric = Isometric.new~ + +** Processing line: ~
    ~ - Inside source: true *** True Line Result - $isometric = Isometric.new -** Processing line: ~~ +
    +** Processing line: ~ ~ - Inside source: true *** True Line Result - -** Processing line: ~ def tick args~ + +** Processing line: ~
    ~ - Inside source: true *** True Line Result - def tick args -** Processing line: ~ $isometric.grid = args.grid~ + +** Processing line: ~
    curl -H "Content-Type: application/json" --data '{ "code": "$result = $args.state" }' -X POST http://localhost:9001/dragon/eval/
    ~ - Inside source: true *** True Line Result - $isometric.grid = args.grid -** Processing line: ~ $isometric.inputs = args.inputs~ +
    curl -H "Content-Type: application/json" --data '{ "code": "$result = $args.state" }' -X POST http://localhost:9001/dragon/eval/
    +** Processing line: ~
    Eval Result:
    ~ - Inside source: true *** True Line Result - $isometric.inputs = args.inputs -** Processing line: ~ $isometric.state = args.state~ +
    Eval Result:
    +** Processing line: ~
    ~
     - Inside source: true
     *** True Line Result
    -      $isometric.state   = args.state
    -** Processing line: ~      $isometric.outputs = args.outputs~
    +      
    
    +** Processing line: ~      #{links}~
     - Inside source: true
     *** True Line Result
    -      $isometric.outputs = args.outputs
    -** Processing line: ~      $isometric.tick~
    +      #{links}
    +** Processing line: ~    ~
     - Inside source: true
     *** True Line Result
    -      $isometric.tick
    -** Processing line: ~  end~
    +    
    +** Processing line: ~  ~
     - Inside source: true
     *** True Line Result
    -  end
    -** Processing line: ~~
    +  
    +** Processing line: ~  S~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~#+end_src~
    -- Line was identified as the end of a code block.
    +  S
    +** Processing line: ~        req.respond 200,~
    +- Inside source: true
     *** True Line Result
    -#+end_src
    -** Processing line: ~~
    -- End of paragraph detected.
    +        req.respond 200,
    +** Processing line: ~                    eval_view,~
    +- Inside source: true
     *** True Line Result
    -
    -** Processing line: ~*** Rpg Topdown - Topdown Starting Point - main.rb~
    -- Header detected.
    +                    eval_view,
    +** Processing line: ~                    { 'Content-Type' => 'text/html' }~
    +- Inside source: true
     *** True Line Result
    -
    +                    { 'Content-Type' => 'text/html' }
    +** Processing line: ~      end~
    +- Inside source: true
     *** True Line Result
    -*** Rpg Topdown - Topdown Starting Point - main.rb
    -** Processing line: ~#+begin_src ruby~
    -- Line was identified as the beginning of a code block.
    +      end
    +** Processing line: ~~
    +- Inside source: true
     *** True Line Result
     
    +** Processing line: ~      def post_api_eval args, req~
    +- Inside source: true
     *** True Line Result
    -#+begin_src ruby
    -** Processing line: ~  # ./samples/99_genre_rpg_topdown/topdown_starting_point/app/main.rb~
    +      def post_api_eval args, req
    +** Processing line: ~        if json? req~
     - Inside source: true
     *** True Line Result
    -  # ./samples/99_genre_rpg_topdown/topdown_starting_point/app/main.rb
    -** Processing line: ~  =begin~
    +        if json? req
    +** Processing line: ~          code = ($gtk.parse_json req.body)["code"]~
     - Inside source: true
     *** True Line Result
    -  =begin
    -** Processing line: ~~
    +          code = ($gtk.parse_json req.body)["code"]
    +** Processing line: ~          code = code.gsub("$result", "$eval_result")~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~   APIs listing that haven't been encountered in previous sample apps:~
    +          code = code.gsub("$result", "$eval_result")
    +** Processing line: ~          Object.new.instance_eval do~
     - Inside source: true
     *** True Line Result
    -   APIs listing that haven't been encountered in previous sample apps:
    -** Processing line: ~~
    +          Object.new.instance_eval do
    +** Processing line: ~            begin~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~   - reverse: Returns a new string with the characters from original string in reverse order.~
    +            begin
    +** Processing line: ~              Kernel.eval code~
     - Inside source: true
     *** True Line Result
    -   - reverse: Returns a new string with the characters from original string in reverse order.
    -** Processing line: ~     For example, the command~
    +              Kernel.eval code
    +** Processing line: ~            rescue Exception => e~
     - Inside source: true
     *** True Line Result
    -     For example, the command
    -** Processing line: ~     "dragonruby".reverse~
    +            rescue Exception => e
    +** Processing line: ~              $eval_result = e~
     - Inside source: true
     *** True Line Result
    -     "dragonruby".reverse
    -** Processing line: ~     would return the string~
    +              $eval_result = e
    +** Processing line: ~            end~
     - Inside source: true
     *** True Line Result
    -     would return the string
    -** Processing line: ~     "yburnogard".~
    +            end
    +** Processing line: ~          end~
     - Inside source: true
     *** True Line Result
    -     "yburnogard".
    -** Processing line: ~     Reverse is not only limited to strings, but can be applied to arrays and other collections.~
    +          end
    +** Processing line: ~        end~
     - Inside source: true
     *** True Line Result
    -     Reverse is not only limited to strings, but can be applied to arrays and other collections.
    +        end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~   Reminders:~
    +** Processing line: ~        req.respond 200,~
     - Inside source: true
     *** True Line Result
    -   Reminders:
    -** Processing line: ~~
    +        req.respond 200,
    +** Processing line: ~                    "#{$eval_result || $eval_results || "nil"}",~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~   - ARRAY#intersect_rect?: Returns true or false depending on if two rectangles intersect.~
    +                    "#{$eval_result || $eval_results || "nil"}",
    +** Processing line: ~                    { 'Content-Type' => 'text/plain' }~
     - Inside source: true
     *** True Line Result
    -   - ARRAY#intersect_rect?: Returns true or false depending on if two rectangles intersect.
    +                    { 'Content-Type' => 'text/plain' }
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~   - args.outputs.labels: An array. The values generate a label.~
    +** Processing line: ~        $eval_result  = nil~
     - Inside source: true
     *** True Line Result
    -   - args.outputs.labels: An array. The values generate a label.
    -** Processing line: ~     The parameters are [X, Y, TEXT, SIZE, ALIGNMENT, RED, GREEN, BLUE, ALPHA, FONT STYLE]~
    +        $eval_result  = nil
    +** Processing line: ~        $eval_results = nil~
     - Inside source: true
     *** True Line Result
    -     The parameters are [X, Y, TEXT, SIZE, ALIGNMENT, RED, GREEN, BLUE, ALPHA, FONT STYLE]
    -** Processing line: ~     For more information about labels, go to mygame/documentation/02-labels.md.~
    +        $eval_results = nil
    +** Processing line: ~      end~
     - Inside source: true
     *** True Line Result
    -     For more information about labels, go to mygame/documentation/02-labels.md.
    +      end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~  =end~
    +** Processing line: ~      def api_css_string~
     - Inside source: true
     *** True Line Result
    -  =end
    +      def api_css_string
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~  # This code shows a maze and uses input from the keyboard to move the user around the screen.~
    -- Inside source: true
    -*** True Line Result
    -  # This code shows a maze and uses input from the keyboard to move the user around the screen.
    -** Processing line: ~  # The objective is to reach the goal.~
    +** Processing line: ~      end~
     - Inside source: true
     *** True Line Result
    -  # The objective is to reach the goal.
    +      end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~  # Sets values of tile size and player's movement speed~
    -- Inside source: true
    -*** True Line Result
    -  # Sets values of tile size and player's movement speed
    -** Processing line: ~  # Also creates tile or box for player and generates map~
    +** Processing line: ~      def get_api_console args, req~
     - Inside source: true
     *** True Line Result
    -  # Also creates tile or box for player and generates map
    -** Processing line: ~  def tick args~
    +      def get_api_console args, req
    +** Processing line: ~        html = console_view "# write your code here and set $result.\n$result = $gtk.args.state"~
     - Inside source: true
     *** True Line Result
    -  def tick args
    -** Processing line: ~    args.state.tile_size     = 80~
    +        html = console_view "# write your code here and set $result.\n$result = $gtk.args.state"
    +** Processing line: ~        req.respond 200,~
     - Inside source: true
     *** True Line Result
    -    args.state.tile_size     = 80
    -** Processing line: ~    args.state.player_speed  = 4~
    +        req.respond 200,
    +** Processing line: ~                    html,~
     - Inside source: true
     *** True Line Result
    -    args.state.player_speed  = 4
    -** Processing line: ~    args.state.player      ||= tile(args, 7, 3, 0, 128, 180)~
    +                    html,
    +** Processing line: ~                    { 'Content-Type' => 'text/html' }~
     - Inside source: true
     *** True Line Result
    -    args.state.player      ||= tile(args, 7, 3, 0, 128, 180)
    -** Processing line: ~    generate_map args~
    +                    { 'Content-Type' => 'text/html' }
    +** Processing line: ~      end~
     - Inside source: true
     *** True Line Result
    -    generate_map args
    +      end
     ** Processing line: ~~
     - Inside source: true
     *** True Line Result
     
    -** Processing line: ~    # Adds walls, goal, and player to args.outputs.solids so they appear on screen~
    -- Inside source: true
    -*** True Line Result
    -    # Adds walls, goal, and player to args.outputs.solids so they appear on screen
    -** Processing line: ~    args.outputs.solids << args.state.walls~
    +** Processing line: ~      def control_panel_view~
     - Inside source: true
     *** True Line Result
    -    args.outputs.solids << args.state.walls
    -** Processing line: ~    args.outputs.solids << args.state.goal~
    +      def control_panel_view
    +** Processing line: ~        <<-S~
     - Inside source: true
     *** True Line Result
    -    args.outputs.solids << args.state.goal
    -** Processing line: ~    args.outputs.solids << args.state.player~
    +        <<-S
    +** Processing line: ~  ~
     - Inside source: true
     *** True Line Result
    -    args.outputs.solids << args.state.player
    -** Processing line: ~~
    +  
    +** Processing line: ~    console~
     - Inside source: true
     *** True Line Result
    -
    -** Processing line: ~    # If player's box intersects with goal, a label is output onto the screen~
    +    console
    +** Processing line: ~    ~
     - Inside source: true
     *** True Line Result
    -    # If player's box intersects with goal, a label is output onto the screen
    -** Processing line: ~    if args.state.player.intersect_rect? args.state.goal~
    +    
    +** Processing line: ~      ~
     - Inside source: true
     *** True Line Result
    -  # Sets position, size, and color of the tile
    -** Processing line: ~  def tile args, x, y, *color~
    +      
    +** Processing line: ~      
    ~ - Inside source: true *** True Line Result - def tile args, x, y, *color -** Processing line: ~ [x * args.state.tile_size, # sets definition for array using method parameters~ + +** Processing line: ~ ~ - Inside source: true *** True Line Result - [x * args.state.tile_size, # sets definition for array using method parameters -** Processing line: ~ y * args.state.tile_size, # multiplying by tile_size sets x and y to correct position using pixel values~ + +** Processing line: ~
    ~ - Inside source: true *** True Line Result - y * args.state.tile_size, # multiplying by tile_size sets x and y to correct position using pixel values -** Processing line: ~ args.state.tile_size,~ + +** Processing line: ~
    ~ - Inside source: true *** True Line Result - args.state.tile_size, -** Processing line: ~ args.state.tile_size,~ + +** Processing line: ~ ~ - Inside source: true *** True Line Result - args.state.tile_size, -** Processing line: ~ *color]~ + +** Processing line: ~
    ~ - Inside source: true *** True Line Result - *color] -** Processing line: ~ end~ + +** Processing line: ~
    ~ - Inside source: true *** True Line Result - end -** Processing line: ~~ + +** Processing line: ~ ~ - Inside source: true *** True Line Result - -** Processing line: ~ # Creates map by adding tiles to the wall, as well as a goal (that the player needs to reach)~ + +** Processing line: ~
    ~ - Inside source: true *** True Line Result - # Creates map by adding tiles to the wall, as well as a goal (that the player needs to reach) -** Processing line: ~ def generate_map args~ + +** Processing line: ~
    ~ - Inside source: true *** True Line Result - def generate_map args -** Processing line: ~ return if args.state.area~ + +** Processing line: ~ ~ - Inside source: true *** True Line Result - return if args.state.area -** Processing line: ~~ + +** Processing line: ~
    ~ - Inside source: true *** True Line Result - -** Processing line: ~ # Creates the area of the map. There are 9 rows running horizontally across the screen~ + +** Processing line: ~
    ~ - Inside source: true *** True Line Result - # Creates the area of the map. There are 9 rows running horizontally across the screen -** Processing line: ~ # and 16 columns running vertically on the screen. Any spot with a "1" is not~ + +** Processing line: ~ ~ - Inside source: true *** True Line Result - # and 16 columns running vertically on the screen. Any spot with a "1" is not -** Processing line: ~ # open for the player to move into (and is green), and any spot with a "0" is available~ + +** Processing line: ~
    ~ - Inside source: true *** True Line Result - # open for the player to move into (and is green), and any spot with a "0" is available -** Processing line: ~ # for the player to move in.~ + +** Processing line: ~
    ~ - Inside source: true *** True Line Result - # for the player to move in. -** Processing line: ~ args.state.area = [~ +
    +** Processing line: ~ #{links}~ - Inside source: true *** True Line Result - args.state.area = [ -** Processing line: ~ [1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1,],~ + #{links} +** Processing line: ~ ~ - Inside source: true *** True Line Result - [1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1,], -** Processing line: ~ [1, 1, 1, 2, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1,], # the "2" represents the goal~ + +** Processing line: ~ ~ - Inside source: true *** True Line Result - [1, 1, 1, 2, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1,], # the "2" represents the goal -** Processing line: ~ [1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1,],~ + +** Processing line: ~ S~ - Inside source: true *** True Line Result - [1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1,], -** Processing line: ~ [1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1,],~ + S +** Processing line: ~ end~ - Inside source: true *** True Line Result - [1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1,], -** Processing line: ~ [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,],~ + end +** Processing line: ~~ - Inside source: true *** True Line Result - [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,], -** Processing line: ~ [1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1,],~ + +** Processing line: ~ def get_api_control_panel args, req~ - Inside source: true *** True Line Result - [1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1,], -** Processing line: ~ [1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1,],~ + def get_api_control_panel args, req +** Processing line: ~ req.respond 200,~ - Inside source: true *** True Line Result - [1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1,], -** Processing line: ~ [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,],~ + req.respond 200, +** Processing line: ~ control_panel_view,~ - Inside source: true *** True Line Result - [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,], -** Processing line: ~ [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 ],~ + control_panel_view, +** Processing line: ~ { 'Content-Type' => 'text/html' }~ - Inside source: true *** True Line Result - [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 ], -** Processing line: ~ ].reverse # reverses the order of the area collection~ + { 'Content-Type' => 'text/html' } +** Processing line: ~ end~ - Inside source: true *** True Line Result - ].reverse # reverses the order of the area collection + end ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ # By reversing the order, the way that the area appears above is how it appears~ +** Processing line: ~ def json? req~ - Inside source: true *** True Line Result - # By reversing the order, the way that the area appears above is how it appears -** Processing line: ~ # on the screen in the game. If we did not reverse, the map would appear inverted.~ + def json? req +** Processing line: ~ req.headers.find { |k, v| k == "Content-Type" && (v.include? "application/json") }~ - Inside source: true *** True Line Result - # on the screen in the game. If we did not reverse, the map would appear inverted. + req.headers.find { |k, v| k == "Content-Type" && (v.include? "application/json") } +** Processing line: ~ end~ +- Inside source: true +*** True Line Result + end ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ #The wall starts off with no tiles.~ +** Processing line: ~ def post_api_reset args, req~ - Inside source: true *** True Line Result - #The wall starts off with no tiles. -** Processing line: ~ args.state.walls = []~ + def post_api_reset args, req +** Processing line: ~ $gtk.reset if json? req~ - Inside source: true *** True Line Result - args.state.walls = [] -** Processing line: ~~ + $gtk.reset if json? req +** Processing line: ~ req.respond 200,~ - Inside source: true *** True Line Result - -** Processing line: ~ # If v is 1, a green tile is added to args.state.walls.~ + req.respond 200, +** Processing line: ~ control_panel_view,~ - Inside source: true *** True Line Result - # If v is 1, a green tile is added to args.state.walls. -** Processing line: ~ # If v is 2, a black tile is created as the goal.~ + control_panel_view, +** Processing line: ~ { 'Content-Type' => 'text/html' }~ - Inside source: true *** True Line Result - # If v is 2, a black tile is created as the goal. -** Processing line: ~ args.state.area.map_2d do |y, x, v|~ + { 'Content-Type' => 'text/html' } +** Processing line: ~ end~ - Inside source: true *** True Line Result - args.state.area.map_2d do |y, x, v| -** Processing line: ~ if v == 1~ + end +** Processing line: ~~ - Inside source: true *** True Line Result - if v == 1 -** Processing line: ~ args.state.walls << tile(args, x, y, 0, 255, 0) # green tile~ + +** Processing line: ~ def post_api_record args, req~ - Inside source: true *** True Line Result - args.state.walls << tile(args, x, y, 0, 255, 0) # green tile -** Processing line: ~ elsif v == 2 # notice there is only one "2" above because there is only one single goal~ + def post_api_record args, req +** Processing line: ~ $recording.start 100 if json? req~ - Inside source: true *** True Line Result - elsif v == 2 # notice there is only one "2" above because there is only one single goal -** Processing line: ~ args.state.goal = tile(args, x, y, 0, 0, 0) # black tile~ + $recording.start 100 if json? req +** Processing line: ~ req.respond 200,~ - Inside source: true *** True Line Result - args.state.goal = tile(args, x, y, 0, 0, 0) # black tile -** Processing line: ~ end~ + req.respond 200, +** Processing line: ~ control_panel_view,~ - Inside source: true *** True Line Result - end -** Processing line: ~ end~ + control_panel_view, +** Processing line: ~ { 'Content-Type' => 'text/html' }~ - Inside source: true *** True Line Result - end -** Processing line: ~ end~ + { 'Content-Type' => 'text/html' } +** Processing line: ~ end~ - Inside source: true *** True Line Result - end + end ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ # Allows the player to move their box around the screen~ +** Processing line: ~ def post_api_record_stop args, req~ - Inside source: true *** True Line Result - # Allows the player to move their box around the screen -** Processing line: ~ def move_player args, *vector~ -- Inside source: true -*** True Line Result - def move_player args, *vector -** Processing line: ~ box = args.state.player.shift_rect(vector) # box is able to move at an angle~ + def post_api_record_stop args, req +** Processing line: ~ $recording.stop 'replay.txt' if json? req~ - Inside source: true *** True Line Result - box = args.state.player.shift_rect(vector) # box is able to move at an angle -** Processing line: ~~ + $recording.stop 'replay.txt' if json? req +** Processing line: ~ req.respond 200,~ - Inside source: true *** True Line Result - -** Processing line: ~ # If the player's box hits a wall, it is not able to move further in that direction~ + req.respond 200, +** Processing line: ~ control_panel_view,~ - Inside source: true *** True Line Result - # If the player's box hits a wall, it is not able to move further in that direction -** Processing line: ~ return if args.state.walls~ + control_panel_view, +** Processing line: ~ { 'Content-Type' => 'text/html' }~ - Inside source: true *** True Line Result - return if args.state.walls -** Processing line: ~ .any_intersect_rect?(box)~ + { 'Content-Type' => 'text/html' } +** Processing line: ~ end~ - Inside source: true *** True Line Result - .any_intersect_rect?(box) + end ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ # Player's box is able to move at angles (not just the four general directions) fast~ +** Processing line: ~ def post_api_replay args, req~ - Inside source: true *** True Line Result - # Player's box is able to move at angles (not just the four general directions) fast -** Processing line: ~ args.state.player =~ + def post_api_replay args, req +** Processing line: ~ $replay.start 'replay.txt' if json? req~ - Inside source: true *** True Line Result - args.state.player = -** Processing line: ~ args.state.player~ + $replay.start 'replay.txt' if json? req +** Processing line: ~ req.respond 200,~ - Inside source: true *** True Line Result - args.state.player -** Processing line: ~ .shift_rect(vector.x * args.state.player_speed, # if we don't multiply by speed, then~ + req.respond 200, +** Processing line: ~ control_panel_view,~ - Inside source: true *** True Line Result - .shift_rect(vector.x * args.state.player_speed, # if we don't multiply by speed, then -** Processing line: ~ vector.y * args.state.player_speed) # the box will move extremely slow~ + control_panel_view, +** Processing line: ~ { 'Content-Type' => 'text/html' }~ - Inside source: true *** True Line Result - vector.y * args.state.player_speed) # the box will move extremely slow -** Processing line: ~ end~ + { 'Content-Type' => 'text/html' } +** Processing line: ~ end~ - Inside source: true *** True Line Result - end + end ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~#+end_src~ -- Line was identified as the end of a code block. +** Processing line: ~ def post_api_show_console args, req~ +- Inside source: true *** True Line Result -#+end_src + def post_api_show_console args, req +** Processing line: ~ $gtk.console.show if json? req~ +- Inside source: true +*** True Line Result + $gtk.console.show if json? req +** Processing line: ~ req.respond 200,~ +- Inside source: true +*** True Line Result + req.respond 200, +** Processing line: ~ control_panel_view,~ +- Inside source: true +*** True Line Result + control_panel_view, +** Processing line: ~ { 'Content-Type' => 'text/html' }~ +- Inside source: true +*** True Line Result + { 'Content-Type' => 'text/html' } +** Processing line: ~ end~ +- Inside source: true +*** True Line Result + end ** Processing line: ~~ -- End of paragraph detected. +- Inside source: true *** True Line Result -** Processing line: ~*** Teentiny - main.rb~ -- Header detected. +** Processing line: ~ def tick args~ +- Inside source: true *** True Line Result - + def tick args +** Processing line: ~ args.inputs.http_requests.each do |req|~ +- Inside source: true *** True Line Result -*** Teentiny - main.rb -** Processing line: ~#+begin_src ruby~ -- Line was identified as the beginning of a code block. + args.inputs.http_requests.each do |req| +** Processing line: ~ match_candidate = { method: req.method.downcase.to_sym,~ +- Inside source: true *** True Line Result - + match_candidate = { method: req.method.downcase.to_sym, +** Processing line: ~ uri: req.uri,~ +- Inside source: true *** True Line Result -#+begin_src ruby -** Processing line: ~ # ./samples/99_genre_teentiny/app/main.rb~ + uri: req.uri, +** Processing line: ~ uri_without_query_string: (req.uri.split '?').first,~ - Inside source: true *** True Line Result - # ./samples/99_genre_teentiny/app/main.rb -** Processing line: ~ # full documenation is at http://docs.dragonruby.org~ + uri_without_query_string: (req.uri.split '?').first, +** Processing line: ~ query_string: (req.uri.split '?').last,~ - Inside source: true *** True Line Result - # full documenation is at http://docs.dragonruby.org -** Processing line: ~ # be sure to come to the discord if you hit any snags: http://discord.dragonruby.org~ + query_string: (req.uri.split '?').last, +** Processing line: ~ has_query_string: !!(req.uri.split '?').last,~ - Inside source: true *** True Line Result - # be sure to come to the discord if you hit any snags: http://discord.dragonruby.org -** Processing line: ~ def tick args~ + has_query_string: !!(req.uri.split '?').last, +** Processing line: ~ has_api_prefix: (req.uri.start_with? "/dragon"),~ - Inside source: true *** True Line Result - def tick args -** Processing line: ~ # ====================================================~ + has_api_prefix: (req.uri.start_with? "/dragon"), +** Processing line: ~ end_with_rb: (req.uri.end_with? ".rb"),~ - Inside source: true *** True Line Result - # ==================================================== -** Processing line: ~ # initialize default variables~ + end_with_rb: (req.uri.end_with? ".rb"), +** Processing line: ~ has_file_extension: file_extensions.find { |f| req.uri.include? f },~ - Inside source: true *** True Line Result - # initialize default variables -** Processing line: ~ # ====================================================~ + has_file_extension: file_extensions.find { |f| req.uri.include? f }, +** Processing line: ~ has_trailing_slash: (req.uri.split('?').first.end_with? "/") }~ - Inside source: true *** True Line Result - # ==================================================== + has_trailing_slash: (req.uri.split('?').first.end_with? "/") } ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ # ruby has an operator called ||= which means "only initialize this if it's nil"~ +** Processing line: ~ if !match_candidate[:has_file_extension]~ - Inside source: true *** True Line Result - # ruby has an operator called ||= which means "only initialize this if it's nil" -** Processing line: ~ args.state.count_down ||= 20 * 60 # set the count down to 20 seconds~ + if !match_candidate[:has_file_extension] +** Processing line: ~ if !match_candidate[:has_trailing_slash]~ - Inside source: true *** True Line Result - args.state.count_down ||= 20 * 60 # set the count down to 20 seconds -** Processing line: ~ # set the initial position of the target~ + if !match_candidate[:has_trailing_slash] +** Processing line: ~ match_candidate[:uri] = match_candidate[:uri_without_query_string] + "/"~ - Inside source: true *** True Line Result - # set the initial position of the target -** Processing line: ~ args.state.target ||= { x: args.grid.w.half,~ + match_candidate[:uri] = match_candidate[:uri_without_query_string] + "/" +** Processing line: ~ if match_candidate[:query_string]~ - Inside source: true *** True Line Result - args.state.target ||= { x: args.grid.w.half, -** Processing line: ~ y: args.grid.h.half,~ + if match_candidate[:query_string] +** Processing line: ~ match_candidate[:uri] += "?#{match_candidate[:query_string]}"~ - Inside source: true *** True Line Result - y: args.grid.h.half, -** Processing line: ~ w: 20,~ + match_candidate[:uri] += "?#{match_candidate[:query_string]}" +** Processing line: ~ end~ - Inside source: true *** True Line Result - w: 20, -** Processing line: ~ h: 20 }~ + end +** Processing line: ~ end~ - Inside source: true *** True Line Result - h: 20 } + end +** Processing line: ~ end~ +- Inside source: true +*** True Line Result + end ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ # set the initial position of the player~ +** Processing line: ~ context = { args: args, req: req, match_candidate: match_candidate }~ - Inside source: true *** True Line Result - # set the initial position of the player -** Processing line: ~ args.state.player ||= { x: 50,~ + context = { args: args, req: req, match_candidate: match_candidate } +** Processing line: ~~ - Inside source: true *** True Line Result - args.state.player ||= { x: 50, -** Processing line: ~ y: 50,~ + +** Processing line: ~ process! context: context, routes: routes~ - Inside source: true *** True Line Result - y: 50, -** Processing line: ~ w: 20,~ + process! context: context, routes: routes +** Processing line: ~ end~ - Inside source: true *** True Line Result - w: 20, -** Processing line: ~ h: 20 }~ + end +** Processing line: ~ end~ - Inside source: true *** True Line Result - h: 20 } + end ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ # set the player movement speed~ +** Processing line: ~ def url_decode args, string~ - Inside source: true *** True Line Result - # set the player movement speed -** Processing line: ~ args.state.player_speed ||= 5~ + def url_decode args, string +** Processing line: ~ args.fn.gsub string,~ - Inside source: true *** True Line Result - args.state.player_speed ||= 5 -** Processing line: ~~ + args.fn.gsub string, +** Processing line: ~ '+', " ",~ - Inside source: true *** True Line Result - -** Processing line: ~ # set the score~ + '+', " ", +** Processing line: ~ '%27', "'",~ - Inside source: true *** True Line Result - # set the score -** Processing line: ~ args.state.score ||= 0~ + '%27', "'", +** Processing line: ~ '%22', '"',~ - Inside source: true *** True Line Result - args.state.score ||= 0 -** Processing line: ~ args.state.teleports ||= 3~ + '%22', '"', +** Processing line: ~ '%0D%0A', "\n",~ - Inside source: true *** True Line Result - args.state.teleports ||= 3 -** Processing line: ~~ + '%0D%0A', "\n", +** Processing line: ~ '%3D', "=",~ - Inside source: true *** True Line Result - -** Processing line: ~ # set the instructions~ + '%3D', "=", +** Processing line: ~ '%3B', ";",~ - Inside source: true *** True Line Result - # set the instructions -** Processing line: ~ args.state.instructions ||= "Get to the red goal! Use arrow keys to move. Spacebar to teleport (use them carefully)!"~ + '%3B', ";", +** Processing line: ~ '%7C', "|",~ - Inside source: true *** True Line Result - args.state.instructions ||= "Get to the red goal! Use arrow keys to move. Spacebar to teleport (use them carefully)!" -** Processing line: ~~ + '%7C', "|", +** Processing line: ~ '%28', "(",~ - Inside source: true *** True Line Result - -** Processing line: ~ # ====================================================~ + '%28', "(", +** Processing line: ~ '%29', ")",~ - Inside source: true *** True Line Result - # ==================================================== -** Processing line: ~ # render the game~ + '%29', ")", +** Processing line: ~ '%7B', "{",~ - Inside source: true *** True Line Result - # render the game -** Processing line: ~ # ====================================================~ + '%7B', "{", +** Processing line: ~ '%7D', "}",~ - Inside source: true *** True Line Result - # ==================================================== -** Processing line: ~ args.outputs.labels << { x: args.grid.w.half, y: args.grid.h - 10,~ + '%7D', "}", +** Processing line: ~ '%2C', ",",~ - Inside source: true *** True Line Result - args.outputs.labels << { x: args.grid.w.half, y: args.grid.h - 10, -** Processing line: ~ text: args.state.instructions,~ + '%2C', ",", +** Processing line: ~ '%3A', ":",~ - Inside source: true *** True Line Result - text: args.state.instructions, -** Processing line: ~ alignment_enum: 1 }~ + '%3A', ":", +** Processing line: ~ '%5B', "[",~ - Inside source: true *** True Line Result - alignment_enum: 1 } -** Processing line: ~~ + '%5B', "[", +** Processing line: ~ '%5D', "]",~ - Inside source: true *** True Line Result - -** Processing line: ~ # check if it's game over. if so, then render game over~ + '%5D', "]", +** Processing line: ~ '%23', "#",~ - Inside source: true *** True Line Result - # check if it's game over. if so, then render game over -** Processing line: ~ # otherwise render the current time left~ + '%23', "#", +** Processing line: ~ '%21', "!",~ - Inside source: true *** True Line Result - # otherwise render the current time left -** Processing line: ~ if game_over? args~ + '%21', "!", +** Processing line: ~ '%3C', "<",~ - Inside source: true *** True Line Result - if game_over? args -** Processing line: ~ args.outputs.labels << { x: args.grid.w.half,~ + '%3C', "<", +** Processing line: ~ '%3E', ">",~ - Inside source: true *** True Line Result - args.outputs.labels << { x: args.grid.w.half, -** Processing line: ~ y: args.grid.h - 40,~ + '%3E', ">", +** Processing line: ~ '%2B', "+",~ - Inside source: true *** True Line Result - y: args.grid.h - 40, -** Processing line: ~ text: "game over! (press r to start over)",~ + '%2B', "+", +** Processing line: ~ '%2F', "/",~ - Inside source: true *** True Line Result - text: "game over! (press r to start over)", -** Processing line: ~ alignment_enum: 1 }~ + '%2F', "/", +** Processing line: ~ '%40', "@",~ - Inside source: true *** True Line Result - alignment_enum: 1 } -** Processing line: ~ else~ + '%40', "@", +** Processing line: ~ '%3F', "?",~ - Inside source: true *** True Line Result - else -** Processing line: ~ args.outputs.labels << { x: args.grid.w.half,~ + '%3F', "?", +** Processing line: ~ '%26', "&",~ - Inside source: true *** True Line Result - args.outputs.labels << { x: args.grid.w.half, -** Processing line: ~ y: args.grid.h - 40,~ + '%26', "&", +** Processing line: ~ '%24', "$",~ - Inside source: true *** True Line Result - y: args.grid.h - 40, -** Processing line: ~ text: "time left: #{(args.state.count_down.idiv 60) + 1}",~ + '%24', "$", +** Processing line: ~ '%5C', "\\",~ - Inside source: true *** True Line Result - text: "time left: #{(args.state.count_down.idiv 60) + 1}", -** Processing line: ~ alignment_enum: 1 }~ + '%5C', "\\", +** Processing line: ~ '%60', "`",~ - Inside source: true *** True Line Result - alignment_enum: 1 } -** Processing line: ~ end~ + '%60', "`", +** Processing line: ~ '%7E', "~",~ - Inside source: true *** True Line Result - end -** Processing line: ~~ + '%7E', "~", +** Processing line: ~ '%C2%B2', "²",~ - Inside source: true *** True Line Result - -** Processing line: ~ # render the score~ + '%C2%B2', "²", +** Processing line: ~ '%5E', "^",~ - Inside source: true *** True Line Result - # render the score -** Processing line: ~ args.outputs.labels << { x: args.grid.w.half,~ + '%5E', "^", +** Processing line: ~ '%C2%BA', "º",~ - Inside source: true *** True Line Result - args.outputs.labels << { x: args.grid.w.half, -** Processing line: ~ y: args.grid.h - 70,~ + '%C2%BA', "º", +** Processing line: ~ '%C2%A7', "§",~ - Inside source: true *** True Line Result - y: args.grid.h - 70, -** Processing line: ~ text: "score: #{args.state.score}",~ + '%C2%A7', "§", +** Processing line: ~ '%20', " ",~ - Inside source: true *** True Line Result - text: "score: #{args.state.score}", -** Processing line: ~ alignment_enum: 1 }~ + '%20', " ", +** Processing line: ~ '%0A', "\n",~ - Inside source: true *** True Line Result - alignment_enum: 1 } -** Processing line: ~~ + '%0A', "\n", +** Processing line: ~ '%25', "%",~ - Inside source: true *** True Line Result - -** Processing line: ~ # render the player with teleport count~ + '%25', "%", +** Processing line: ~ '%2A', "*"~ - Inside source: true *** True Line Result - # render the player with teleport count -** Processing line: ~ args.outputs.sprites << { x: args.state.player.x,~ + '%2A', "*" +** Processing line: ~ end~ - Inside source: true *** True Line Result - args.outputs.sprites << { x: args.state.player.x, -** Processing line: ~ y: args.state.player.y,~ + end +** Processing line: ~~ - Inside source: true *** True Line Result - y: args.state.player.y, -** Processing line: ~ w: args.state.player.w,~ + +** Processing line: ~ def file_extensions~ - Inside source: true *** True Line Result - w: args.state.player.w, -** Processing line: ~ h: args.state.player.h,~ + def file_extensions +** Processing line: ~ [".html", ".css", ".gif", ".txt", ".ico", ".rb"]~ - Inside source: true *** True Line Result - h: args.state.player.h, -** Processing line: ~ path: 'sprites/square-green.png' }~ + [".html", ".css", ".gif", ".txt", ".ico", ".rb"] +** Processing line: ~ end~ - Inside source: true *** True Line Result - path: 'sprites/square-green.png' } + end ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ args.outputs.labels << { x: args.state.player.x + 10,~ +** Processing line: ~ def routes~ - Inside source: true *** True Line Result - args.outputs.labels << { x: args.state.player.x + 10, -** Processing line: ~ y: args.state.player.y + 40,~ + def routes +** Processing line: ~ [{ match_criteria: { method: :get, uri: "/" },~ - Inside source: true *** True Line Result - y: args.state.player.y + 40, -** Processing line: ~ text: "teleports: #{args.state.teleports}",~ + [{ match_criteria: { method: :get, uri: "/" }, +** Processing line: ~ handler: :get_index },~ - Inside source: true *** True Line Result - text: "teleports: #{args.state.teleports}", -** Processing line: ~ alignment_enum: 1, size_enum: -2 }~ + handler: :get_index }, +** Processing line: ~ { match_criteria: { method: :get, uri: "/dragon/" },~ - Inside source: true *** True Line Result - alignment_enum: 1, size_enum: -2 } -** Processing line: ~~ + { match_criteria: { method: :get, uri: "/dragon/" }, +** Processing line: ~ handler: :get_index },~ - Inside source: true *** True Line Result - -** Processing line: ~ # render the target~ + handler: :get_index }, +** Processing line: ~~ - Inside source: true *** True Line Result - # render the target -** Processing line: ~ args.outputs.sprites << { x: args.state.target.x,~ + +** Processing line: ~ { match_criteria: { method: :get, uri: "/dragon/boot/" },~ - Inside source: true *** True Line Result - args.outputs.sprites << { x: args.state.target.x, -** Processing line: ~ y: args.state.target.y,~ + { match_criteria: { method: :get, uri: "/dragon/boot/" }, +** Processing line: ~ handler: :get_api_boot },~ - Inside source: true *** True Line Result - y: args.state.target.y, -** Processing line: ~ w: args.state.target.w,~ + handler: :get_api_boot }, +** Processing line: ~ { match_criteria: { method: :get, uri: "/dragon/trace/" },~ - Inside source: true *** True Line Result - w: args.state.target.w, -** Processing line: ~ h: args.state.target.h,~ + { match_criteria: { method: :get, uri: "/dragon/trace/" }, +** Processing line: ~ handler: :get_api_trace },~ - Inside source: true *** True Line Result - h: args.state.target.h, -** Processing line: ~ path: 'sprites/square-red.png' }~ + handler: :get_api_trace }, +** Processing line: ~ { match_criteria: { method: :get, uri: "/dragon/puts/" },~ - Inside source: true *** True Line Result - path: 'sprites/square-red.png' } -** Processing line: ~~ + { match_criteria: { method: :get, uri: "/dragon/puts/" }, +** Processing line: ~ handler: :get_api_puts },~ - Inside source: true *** True Line Result - -** Processing line: ~ # ====================================================~ + handler: :get_api_puts }, +** Processing line: ~ { match_criteria: { method: :get, uri: "/dragon/log/" },~ - Inside source: true *** True Line Result - # ==================================================== -** Processing line: ~ # run simulation~ + { match_criteria: { method: :get, uri: "/dragon/log/" }, +** Processing line: ~ handler: :get_api_log },~ - Inside source: true *** True Line Result - # run simulation -** Processing line: ~ # ====================================================~ + handler: :get_api_log }, +** Processing line: ~ { match_criteria: { method: :post, uri: "/dragon/log/" },~ - Inside source: true *** True Line Result - # ==================================================== -** Processing line: ~~ + { match_criteria: { method: :post, uri: "/dragon/log/" }, +** Processing line: ~ handler: :post_api_log },~ - Inside source: true *** True Line Result - -** Processing line: ~ # count down calculation~ + handler: :post_api_log }, +** Processing line: ~ { match_criteria: { method: :get, uri: "/dragon/changes/" },~ - Inside source: true *** True Line Result - # count down calculation -** Processing line: ~ args.state.count_down -= 1~ + { match_criteria: { method: :get, uri: "/dragon/changes/" }, +** Processing line: ~ handler: :get_api_changes },~ - Inside source: true *** True Line Result - args.state.count_down -= 1 -** Processing line: ~ args.state.count_down = -1 if args.state.count_down < -1~ + handler: :get_api_changes }, +** Processing line: ~ { match_criteria: { method: :get, uri: "/dragon/eval/" },~ - Inside source: true *** True Line Result - args.state.count_down = -1 if args.state.count_down < -1 -** Processing line: ~~ + { match_criteria: { method: :get, uri: "/dragon/eval/" }, +** Processing line: ~ handler: :get_api_eval },~ - Inside source: true *** True Line Result - -** Processing line: ~ # ====================================================~ + handler: :get_api_eval }, +** Processing line: ~ { match_criteria: { method: :post, uri: "/dragon/eval/" },~ - Inside source: true *** True Line Result - # ==================================================== -** Processing line: ~ # process player input~ + { match_criteria: { method: :post, uri: "/dragon/eval/" }, +** Processing line: ~ handler: :post_api_eval },~ - Inside source: true *** True Line Result - # process player input -** Processing line: ~ # ====================================================~ + handler: :post_api_eval }, +** Processing line: ~ { match_criteria: { method: :get, uri: "/dragon/console/" },~ - Inside source: true *** True Line Result - # ==================================================== -** Processing line: ~ # if it isn't game over let them move~ + { match_criteria: { method: :get, uri: "/dragon/console/" }, +** Processing line: ~ handler: :get_api_console },~ - Inside source: true *** True Line Result - # if it isn't game over let them move -** Processing line: ~ if !game_over? args~ + handler: :get_api_console }, +** Processing line: ~ { match_criteria: { method: :post, uri: "/dragon/console/" },~ - Inside source: true *** True Line Result - if !game_over? args -** Processing line: ~ dir_y = 0~ + { match_criteria: { method: :post, uri: "/dragon/console/" }, +** Processing line: ~ handler: :post_api_console },~ - Inside source: true *** True Line Result - dir_y = 0 -** Processing line: ~ dir_x = 0~ + handler: :post_api_console }, +** Processing line: ~ { match_criteria: { method: :get, uri: "/dragon/control_panel/" },~ - Inside source: true *** True Line Result - dir_x = 0 -** Processing line: ~~ + { match_criteria: { method: :get, uri: "/dragon/control_panel/" }, +** Processing line: ~ handler: :get_api_control_panel },~ - Inside source: true *** True Line Result - -** Processing line: ~ # determine the change horizontally~ + handler: :get_api_control_panel }, +** Processing line: ~ { match_criteria: { method: :post, uri: "/dragon/reset/" },~ - Inside source: true *** True Line Result - # determine the change horizontally -** Processing line: ~ if args.inputs.keyboard.up~ + { match_criteria: { method: :post, uri: "/dragon/reset/" }, +** Processing line: ~ handler: :post_api_reset },~ - Inside source: true *** True Line Result - if args.inputs.keyboard.up -** Processing line: ~ dir_y += args.state.player_speed~ + handler: :post_api_reset }, +** Processing line: ~ { match_criteria: { method: :post, uri: "/dragon/record/" },~ - Inside source: true *** True Line Result - dir_y += args.state.player_speed -** Processing line: ~ elsif args.inputs.keyboard.down~ + { match_criteria: { method: :post, uri: "/dragon/record/" }, +** Processing line: ~ handler: :post_api_record },~ - Inside source: true *** True Line Result - elsif args.inputs.keyboard.down -** Processing line: ~ dir_y -= args.state.player_speed~ + handler: :post_api_record }, +** Processing line: ~ { match_criteria: { method: :post, uri: "/dragon/record_stop/" },~ - Inside source: true *** True Line Result - dir_y -= args.state.player_speed -** Processing line: ~ end~ + { match_criteria: { method: :post, uri: "/dragon/record_stop/" }, +** Processing line: ~ handler: :post_api_record_stop },~ - Inside source: true *** True Line Result - end -** Processing line: ~~ + handler: :post_api_record_stop }, +** Processing line: ~ { match_criteria: { method: :post, uri: "/dragon/replay/" },~ - Inside source: true *** True Line Result - -** Processing line: ~ # determine the change vertically~ + { match_criteria: { method: :post, uri: "/dragon/replay/" }, +** Processing line: ~ handler: :post_api_replay },~ - Inside source: true *** True Line Result - # determine the change vertically -** Processing line: ~ if args.inputs.keyboard.left~ + handler: :post_api_replay }, +** Processing line: ~ { match_criteria: { method: :post, uri: "/dragon/show_console/" },~ - Inside source: true *** True Line Result - if args.inputs.keyboard.left -** Processing line: ~ dir_x -= args.state.player_speed~ + { match_criteria: { method: :post, uri: "/dragon/show_console/" }, +** Processing line: ~ handler: :post_api_show_console },~ - Inside source: true *** True Line Result - dir_x -= args.state.player_speed -** Processing line: ~ elsif args.inputs.keyboard.right~ + handler: :post_api_show_console }, +** Processing line: ~ { match_criteria: { method: :get, uri: "/dragon/code/" },~ - Inside source: true *** True Line Result - elsif args.inputs.keyboard.right -** Processing line: ~ dir_x += args.state.player_speed~ + { match_criteria: { method: :get, uri: "/dragon/code/" }, +** Processing line: ~ handler: :get_api_code },~ - Inside source: true *** True Line Result - dir_x += args.state.player_speed -** Processing line: ~ end~ + handler: :get_api_code }, +** Processing line: ~ { match_criteria: { method: :get, uri: "/dragon/autocomplete/" },~ - Inside source: true *** True Line Result - end -** Processing line: ~~ + { match_criteria: { method: :get, uri: "/dragon/autocomplete/" }, +** Processing line: ~ handler: :get_api_autocomplete },~ - Inside source: true *** True Line Result - -** Processing line: ~ # determine if teleport can be used~ + handler: :get_api_autocomplete }, +** Processing line: ~ { match_criteria: { method: :post, uri: "/dragon/autocomplete/" },~ - Inside source: true *** True Line Result - # determine if teleport can be used -** Processing line: ~ if args.inputs.keyboard.key_down.space && args.state.teleports > 0~ + { match_criteria: { method: :post, uri: "/dragon/autocomplete/" }, +** Processing line: ~ handler: :post_api_autocomplete },~ - Inside source: true *** True Line Result - if args.inputs.keyboard.key_down.space && args.state.teleports > 0 -** Processing line: ~ args.state.teleports -= 1~ + handler: :post_api_autocomplete }, +** Processing line: ~ { match_criteria: { method: :get, uri_without_query_string: "/dragon/code/edit/", has_query_string: true },~ - Inside source: true *** True Line Result - args.state.teleports -= 1 -** Processing line: ~ dir_x *= 20~ + { match_criteria: { method: :get, uri_without_query_string: "/dragon/code/edit/", has_query_string: true }, +** Processing line: ~ handler: :get_api_code_edit },~ - Inside source: true *** True Line Result - dir_x *= 20 -** Processing line: ~ dir_y *= 20~ + handler: :get_api_code_edit }, +** Processing line: ~ { match_criteria: { method: :post, uri_without_query_string: "/dragon/code/update/", has_query_string: true },~ - Inside source: true *** True Line Result - dir_y *= 20 -** Processing line: ~ end~ + { match_criteria: { method: :post, uri_without_query_string: "/dragon/code/update/", has_query_string: true }, +** Processing line: ~ handler: :post_api_code_update },~ - Inside source: true *** True Line Result - end + handler: :post_api_code_update }, ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ # apply change to player~ +** Processing line: ~~ - Inside source: true *** True Line Result - # apply change to player -** Processing line: ~ args.state.player.x += dir_x~ + +** Processing line: ~ { match_criteria: { method: :get, uri: "/docs.html" },~ - Inside source: true *** True Line Result - args.state.player.x += dir_x -** Processing line: ~ args.state.player.y += dir_y~ + { match_criteria: { method: :get, uri: "/docs.html" }, +** Processing line: ~ handler: :get_docs_html },~ - Inside source: true *** True Line Result - args.state.player.y += dir_y -** Processing line: ~ else~ + handler: :get_docs_html }, +** Processing line: ~ { match_criteria: { method: :get, uri_without_query_string: "/docs.css" },~ - Inside source: true *** True Line Result - else -** Processing line: ~ # if r is pressed, reset the game~ + { match_criteria: { method: :get, uri_without_query_string: "/docs.css" }, +** Processing line: ~ handler: :get_docs_css },~ - Inside source: true *** True Line Result - # if r is pressed, reset the game -** Processing line: ~ if args.inputs.keyboard.key_down.r~ + handler: :get_docs_css }, +** Processing line: ~ { match_criteria: { method: :get, uri: "/docs_search.gif" },~ - Inside source: true *** True Line Result - if args.inputs.keyboard.key_down.r -** Processing line: ~ $gtk.reset~ + { match_criteria: { method: :get, uri: "/docs_search.gif" }, +** Processing line: ~ handler: :get_docs_search_gif },~ - Inside source: true *** True Line Result - $gtk.reset -** Processing line: ~ return~ + handler: :get_docs_search_gif }, +** Processing line: ~~ - Inside source: true *** True Line Result - return -** Processing line: ~ end~ + +** Processing line: ~ { match_criteria: { method: :get, uri: "/src_backup_index.html" },~ - Inside source: true *** True Line Result - end -** Processing line: ~ end~ + { match_criteria: { method: :get, uri: "/src_backup_index.html" }, +** Processing line: ~ handler: :get_src_backup_index_html },~ - Inside source: true *** True Line Result - end + handler: :get_src_backup_index_html }, ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ # ====================================================~ -- Inside source: true -*** True Line Result - # ==================================================== -** Processing line: ~ # determine score~ +** Processing line: ~ { match_criteria: { method: :get, uri: "/src_backup_index.txt" },~ - Inside source: true *** True Line Result - # determine score -** Processing line: ~ # ====================================================~ + { match_criteria: { method: :get, uri: "/src_backup_index.txt" }, +** Processing line: ~ handler: :get_src_backup_index_txt },~ - Inside source: true *** True Line Result - # ==================================================== + handler: :get_src_backup_index_txt }, ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ # calculate new score if the player is at goal~ +** Processing line: ~ { match_criteria: { method: :get, uri: "/src_backup_changes.html" },~ - Inside source: true *** True Line Result - # calculate new score if the player is at goal -** Processing line: ~ if !game_over? args~ + { match_criteria: { method: :get, uri: "/src_backup_changes.html" }, +** Processing line: ~ handler: :get_src_backup_changes_html },~ - Inside source: true *** True Line Result - if !game_over? args + handler: :get_src_backup_changes_html }, ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ # if the player is at the goal, then move the goal~ +** Processing line: ~ { match_criteria: { method: :get, uri: "/src_backup_changes.txt" },~ - Inside source: true *** True Line Result - # if the player is at the goal, then move the goal -** Processing line: ~ if args.state.player.intersect_rect? args.state.target~ + { match_criteria: { method: :get, uri: "/src_backup_changes.txt" }, +** Processing line: ~ handler: :get_src_backup_changes_txt },~ - Inside source: true *** True Line Result - if args.state.player.intersect_rect? args.state.target -** Processing line: ~ # increment the goal~ + handler: :get_src_backup_changes_txt }, +** Processing line: ~~ - Inside source: true *** True Line Result - # increment the goal -** Processing line: ~ args.state.score += 1~ + +** Processing line: ~ { match_criteria: { method: :get, uri: "/src_backup.css" },~ - Inside source: true *** True Line Result - args.state.score += 1 + { match_criteria: { method: :get, uri: "/src_backup.css" }, +** Processing line: ~ handler: :get_src_backup_css },~ +- Inside source: true +*** True Line Result + handler: :get_src_backup_css }, ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ # move the goal to a random location~ +** Processing line: ~ { match_criteria: { method: :get, uri: "/favicon.ico" },~ - Inside source: true *** True Line Result - # move the goal to a random location -** Processing line: ~ args.state.target = { x: (rand args.grid.w), y: (rand args.grid.h), w: 20, h: 20 }~ + { match_criteria: { method: :get, uri: "/favicon.ico" }, +** Processing line: ~ handler: :get_favicon_ico },~ - Inside source: true *** True Line Result - args.state.target = { x: (rand args.grid.w), y: (rand args.grid.h), w: 20, h: 20 } + handler: :get_favicon_ico }, ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ # make sure the goal is inside the view area~ +** Processing line: ~ { match_criteria: { method: :get, end_with_rb: true },~ - Inside source: true *** True Line Result - # make sure the goal is inside the view area -** Processing line: ~ if args.state.target.x < 0~ + { match_criteria: { method: :get, end_with_rb: true }, +** Processing line: ~ handler: :get_src_backup },~ - Inside source: true *** True Line Result - if args.state.target.x < 0 -** Processing line: ~ args.state.target.x += 20~ + handler: :get_src_backup }, +** Processing line: ~~ - Inside source: true *** True Line Result - args.state.target.x += 20 -** Processing line: ~ elsif args.state.target.x > 1280~ + +** Processing line: ~ { match_criteria: { method: :get, end_with_rb: true },~ - Inside source: true *** True Line Result - elsif args.state.target.x > 1280 -** Processing line: ~ args.state.target.x -= 20~ + { match_criteria: { method: :get, end_with_rb: true }, +** Processing line: ~ handler: :get_src_backup }~ - Inside source: true *** True Line Result - args.state.target.x -= 20 -** Processing line: ~ end~ + handler: :get_src_backup } +** Processing line: ~~ - Inside source: true *** True Line Result - end + +** Processing line: ~ ]~ +- Inside source: true +*** True Line Result + ] +** Processing line: ~ end~ +- Inside source: true +*** True Line Result + end ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ # make sure the goal is inside the view area~ +** Processing line: ~ def process! opts~ - Inside source: true *** True Line Result - # make sure the goal is inside the view area -** Processing line: ~ if args.state.target.y < 0~ + def process! opts +** Processing line: ~ routes = opts[:routes]~ - Inside source: true *** True Line Result - if args.state.target.y < 0 -** Processing line: ~ args.state.target.y += 20~ + routes = opts[:routes] +** Processing line: ~ context = opts[:context]~ - Inside source: true *** True Line Result - args.state.target.y += 20 -** Processing line: ~ elsif args.state.target.y > 720~ + context = opts[:context] +** Processing line: ~ routes.each do |route|~ - Inside source: true *** True Line Result - elsif args.state.target.y > 720 -** Processing line: ~ args.state.target.y -= 20~ + routes.each do |route| +** Processing line: ~ match_found = (process_single! route: route, context: context)~ - Inside source: true *** True Line Result - args.state.target.y -= 20 + match_found = (process_single! route: route, context: context) +** Processing line: ~ return if match_found~ +- Inside source: true +*** True Line Result + return if match_found ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -148687,102 +154902,94 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result end -** Processing line: ~ end~ +** Processing line: ~~ - Inside source: true *** True Line Result - end -** Processing line: ~ end~ + +** Processing line: ~ def process_single! opts~ - Inside source: true *** True Line Result - end -** Processing line: ~~ + def process_single! opts +** Processing line: ~ match_criteria = opts[:route][:match_criteria]~ - Inside source: true *** True Line Result - -** Processing line: ~ def game_over? args~ + match_criteria = opts[:route][:match_criteria] +** Processing line: ~ m = opts[:route][:handler]~ - Inside source: true *** True Line Result - def game_over? args -** Processing line: ~ args.state.count_down < 0~ + m = opts[:route][:handler] +** Processing line: ~ args = opts[:context][:args]~ - Inside source: true *** True Line Result - args.state.count_down < 0 -** Processing line: ~ end~ + args = opts[:context][:args] +** Processing line: ~ req = opts[:context][:req]~ - Inside source: true *** True Line Result - end -** Processing line: ~~ + req = opts[:context][:req] +** Processing line: ~ match_candidate = opts[:context][:match_candidate]~ - Inside source: true *** True Line Result - -** Processing line: ~ $gtk.reset~ + match_candidate = opts[:context][:match_candidate] +** Processing line: ~ match_criteria.each do |k, v|~ - Inside source: true *** True Line Result - $gtk.reset -** Processing line: ~~ + match_criteria.each do |k, v| +** Processing line: ~ return false if match_candidate[k] != v~ - Inside source: true *** True Line Result - -** Processing line: ~#+end_src~ -- Line was identified as the end of a code block. + return false if match_candidate[k] != v +** Processing line: ~ end~ +- Inside source: true *** True Line Result -#+end_src + end ** Processing line: ~~ -- End of paragraph detected. -*** True Line Result - -** Processing line: ~*** Teentiny - license.txt~ -- Header detected. -*** True Line Result - -*** True Line Result -*** Teentiny - license.txt -** Processing line: ~#+begin_src ruby~ -- Line was identified as the beginning of a code block. +- Inside source: true *** True Line Result +** Processing line: ~ begin~ +- Inside source: true *** True Line Result -#+begin_src ruby -** Processing line: ~ # ./samples/99_genre_teentiny/license.txt~ + begin +** Processing line: ~ send m, args, req~ - Inside source: true *** True Line Result - # ./samples/99_genre_teentiny/license.txt -** Processing line: ~ Copyright 2019 DragonRuby LLC~ + send m, args, req +** Processing line: ~ rescue Exception => e~ - Inside source: true *** True Line Result - Copyright 2019 DragonRuby LLC -** Processing line: ~~ + rescue Exception => e +** Processing line: ~ req.respond 200,~ - Inside source: true *** True Line Result - -** Processing line: ~ MIT License~ + req.respond 200, +** Processing line: ~ "#{e}\n#{e.__backtrace_to_org__}",~ - Inside source: true *** True Line Result - MIT License -** Processing line: ~~ + "#{e}\n#{e.__backtrace_to_org__}", +** Processing line: ~ { 'Content-Type' => 'text/plain' }~ - Inside source: true *** True Line Result - -** Processing line: ~ 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:~ + { 'Content-Type' => 'text/plain' } +** Processing line: ~ end~ - Inside source: true *** True Line Result - 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: -** Processing line: ~~ + end +** Processing line: ~ return true~ - Inside source: true *** True Line Result - -** Processing line: ~ The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.~ + return true +** Processing line: ~ end~ - Inside source: true *** True Line Result - The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -** Processing line: ~~ + end +** Processing line: ~ end~ - Inside source: true *** True Line Result - -** Processing line: ~ 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.~ + end +** Processing line: ~ end~ - Inside source: true *** True Line Result - 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. + end ** Processing line: ~~ - Inside source: true *** True Line Result @@ -148795,17 +155002,10 @@ Follows is a source code listing for all files that have been open sourced. This - End of paragraph detected. *** True Line Result -** Processing line: ~** OSS~ -- Header detected. -*** True Line Result - -*** True Line Result -** OSS -** Processing line: ~Follows is a source code listing for all files that have been open sourced. This code can be found online at [[https://github.com/DragonRuby/dragonruby-game-toolkit-contrib/]].~ ** Processing line: ~*** args.rb~ - Header detected. *** True Line Result -Follows is a source code listing for all files that have been open sourced. This code can be found online at [[https://github.com/DragonRuby/dragonruby-game-toolkit-contrib/]]. + *** True Line Result *** args.rb ** Processing line: ~#+begin_src ruby~ @@ -148866,6 +155066,10 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result include Serialize +** Processing line: ~ attr_accessor :cvars~ +- Inside source: true +*** True Line Result + attr_accessor :cvars ** Processing line: ~ attr_accessor :inputs~ - Inside source: true *** True Line Result @@ -148946,6 +155150,10 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result @outputs = Outputs.new args: self +** Processing line: ~ @cvars = {}~ +- Inside source: true +*** True Line Result + @cvars = {} ** Processing line: ~ @audio = {}~ - Inside source: true *** True Line Result @@ -150890,26 +157098,26 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ attr_accessor :show_reason, :log, :logo, :background_color,~ +** Processing line: ~ attr_accessor :show_reason, :log, :logo,~ - Inside source: true *** True Line Result - attr_accessor :show_reason, :log, :logo, :background_color, -** Processing line: ~ :text_color, :animation_duration,~ + attr_accessor :show_reason, :log, :logo, +** Processing line: ~ :animation_duration,~ - Inside source: true *** True Line Result - :text_color, :animation_duration, + :animation_duration, ** Processing line: ~ :max_log_lines, :max_history, :log,~ - Inside source: true *** True Line Result :max_log_lines, :max_history, :log, -** Processing line: ~ :last_command_errored, :last_command, :error_color, :shown_at,~ +** Processing line: ~ :last_command_errored, :last_command, :shown_at,~ - Inside source: true *** True Line Result - :last_command_errored, :last_command, :error_color, :shown_at, -** Processing line: ~ :header_color, :archived_log, :last_log_lines, :last_log_lines_count,~ + :last_command_errored, :last_command, :shown_at, +** Processing line: ~ :archived_log, :last_log_lines, :last_log_lines_count,~ - Inside source: true *** True Line Result - :header_color, :archived_log, :last_log_lines, :last_log_lines_count, + :archived_log, :last_log_lines, :last_log_lines_count, ** Processing line: ~ :suppress_left_arrow_behavior, :command_set_at,~ - Inside source: true *** True Line Result @@ -150918,10 +157126,22 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result :toast_ids, :bottom, -** Processing line: ~ :font_style, :menu~ +** Processing line: ~ :font_style, :menu,~ - Inside source: true *** True Line Result - :font_style, :menu + :font_style, :menu, +** Processing line: ~ :background_color, :spam_color, :text_color, :warn_color,~ +- Inside source: true +*** True Line Result + :background_color, :spam_color, :text_color, :warn_color, +** Processing line: ~ :error_color, :header_color, :code_color, :comment_color,~ +- Inside source: true +*** True Line Result + :error_color, :header_color, :code_color, :comment_color, +** Processing line: ~ :debug_color, :unfiltered_color~ +- Inside source: true +*** True Line Result + :debug_color, :unfiltered_color ** Processing line: ~~ - Inside source: true *** True Line Result @@ -150990,22 +157210,14 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result @logo = 'console-logo.png' -** Processing line: ~ @history_fname = 'console_history.txt'~ +** Processing line: ~ @history_fname = 'logs/console_history.txt'~ - Inside source: true *** True Line Result - @history_fname = 'console_history.txt' + @history_fname = 'logs/console_history.txt' ** Processing line: ~ @background_color = Color.new [0, 0, 0, 224]~ - Inside source: true *** True Line Result @background_color = Color.new [0, 0, 0, 224] -** Processing line: ~ @text_color = Color.new [255, 255, 255]~ -- Inside source: true -*** True Line Result - @text_color = Color.new [255, 255, 255] -** Processing line: ~ @error_color = Color.new [200, 50, 50]~ -- Inside source: true -*** True Line Result - @error_color = Color.new [200, 50, 50] ** Processing line: ~ @header_color = Color.new [100, 200, 220]~ - Inside source: true *** True Line Result @@ -151014,10 +157226,10 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result @code_color = Color.new [210, 168, 255] -** Processing line: ~ @comment_color = Color.new [0, 200, 100]~ +** Processing line: ~ @comment_color = Color.new [0, 200, 100]~ - Inside source: true *** True Line Result - @comment_color = Color.new [0, 200, 100] + @comment_color = Color.new [0, 200, 100] ** Processing line: ~ @animation_duration = 1.seconds~ - Inside source: true *** True Line Result @@ -151026,6 +157238,42 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result @shown_at = -1 +** Processing line: ~~ +- Inside source: true +*** True Line Result + +** Processing line: ~ # these are the colors for text at various log levels.~ +- Inside source: true +*** True Line Result + # these are the colors for text at various log levels. +** Processing line: ~ @spam_color = Color.new [160, 160, 160]~ +- Inside source: true +*** True Line Result + @spam_color = Color.new [160, 160, 160] +** Processing line: ~ @debug_color = Color.new [0, 255, 0]~ +- Inside source: true +*** True Line Result + @debug_color = Color.new [0, 255, 0] +** Processing line: ~ @text_color = Color.new [255, 255, 255]~ +- Inside source: true +*** True Line Result + @text_color = Color.new [255, 255, 255] +** Processing line: ~ @warn_color = Color.new [255, 255, 0]~ +- Inside source: true +*** True Line Result + @warn_color = Color.new [255, 255, 0] +** Processing line: ~ @error_color = Color.new [200, 50, 50]~ +- Inside source: true +*** True Line Result + @error_color = Color.new [200, 50, 50] +** Processing line: ~ @unfiltered_color = Color.new [0, 255, 255]~ +- Inside source: true +*** True Line Result + @unfiltered_color = Color.new [0, 255, 255] +** Processing line: ~~ +- Inside source: true +*** True Line Result + ** Processing line: ~ load_history~ - Inside source: true *** True Line Result @@ -151286,10 +157534,34 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ def add_text obj~ +** Processing line: ~ def add_text obj, loglevel=-1~ +- Inside source: true +*** True Line Result + def add_text obj, loglevel=-1 +** Processing line: ~ # loglevel is one of the values of LogLevel in logging.h, or -1 to say "we don't care, colorize it with your special string parsing magic"~ +- Inside source: true +*** True Line Result + # loglevel is one of the values of LogLevel in logging.h, or -1 to say "we don't care, colorize it with your special string parsing magic" +** Processing line: ~ loglevel = -1 if loglevel < 0~ +- Inside source: true +*** True Line Result + loglevel = -1 if loglevel < 0 +** Processing line: ~ loglevel = 5 if loglevel > 5 # 5 == unfiltered (it's 0x7FFFFFFE in C, clamp it down)~ +- Inside source: true +*** True Line Result + loglevel = 5 if loglevel > 5 # 5 == unfiltered (it's 0x7FFFFFFE in C, clamp it down) +** Processing line: ~ loglevel = 2 if (loglevel == -1) && obj.start_with?('!c!') # oh well~ - Inside source: true *** True Line Result - def add_text obj + loglevel = 2 if (loglevel == -1) && obj.start_with?('!c!') # oh well +** Processing line: ~ colorstr = (loglevel != -1) ? "!c!#{loglevel}" : nil~ +- Inside source: true +*** True Line Result + colorstr = (loglevel != -1) ? "!c!#{loglevel}" : nil +** Processing line: ~~ +- Inside source: true +*** True Line Result + ** Processing line: ~ @last_log_lines_count ||= 1~ - Inside source: true *** True Line Result @@ -151322,14 +157594,38 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result str.each_line do |s| -** Processing line: ~ s.wrapped_lines(self.console_text_width).each do |l|~ +** Processing line: ~ if colorstr.nil?~ +- Inside source: true +*** True Line Result + if colorstr.nil? +** Processing line: ~ s.wrapped_lines(self.console_text_width).each do |l|~ +- Inside source: true +*** True Line Result + s.wrapped_lines(self.console_text_width).each do |l| +** Processing line: ~ log_lines << l~ +- Inside source: true +*** True Line Result + log_lines << l +** Processing line: ~ end~ +- Inside source: true +*** True Line Result + end +** Processing line: ~ else~ +- Inside source: true +*** True Line Result + else +** Processing line: ~ s.wrapped_lines(self.console_text_width).each do |l|~ - Inside source: true *** True Line Result - s.wrapped_lines(self.console_text_width).each do |l| -** Processing line: ~ log_lines << l~ + s.wrapped_lines(self.console_text_width).each do |l| +** Processing line: ~ log_lines << "#{colorstr}#{l}"~ - Inside source: true *** True Line Result - log_lines << l + log_lines << "#{colorstr}#{l}" +** Processing line: ~ end~ +- Inside source: true +*** True Line Result + end ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -151342,10 +157638,10 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ if log_lines == @last_log_lines~ +** Processing line: ~ if log_lines == @last_log_lines && log_lines.length != 0~ - Inside source: true *** True Line Result - if log_lines == @last_log_lines + if log_lines == @last_log_lines && log_lines.length != 0 ** Processing line: ~ @last_log_lines_count += 1~ - Inside source: true *** True Line Result @@ -152442,22 +158738,30 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ if args.inputs.mouse.wheel && args.inputs.mouse.wheel.y > 0~ +** Processing line: ~ if args.inputs.mouse.wheel~ - Inside source: true *** True Line Result - if args.inputs.mouse.wheel && args.inputs.mouse.wheel.y > 0 -** Processing line: ~ @inertia = 1~ + if args.inputs.mouse.wheel +** Processing line: ~ if args.inputs.mouse.wheel.y > 0~ - Inside source: true *** True Line Result - @inertia = 1 -** Processing line: ~ elsif args.inputs.mouse.wheel && args.inputs.mouse.wheel.y < 0~ + if args.inputs.mouse.wheel.y > 0 +** Processing line: ~ @inertia = 1~ - Inside source: true *** True Line Result - elsif args.inputs.mouse.wheel && args.inputs.mouse.wheel.y < 0 -** Processing line: ~ @inertia = -1~ + @inertia = 1 +** Processing line: ~ elsif args.inputs.mouse.wheel.y < 0~ - Inside source: true *** True Line Result - @inertia = -1 + elsif args.inputs.mouse.wheel.y < 0 +** Processing line: ~ @inertia = -1~ +- Inside source: true +*** True Line Result + @inertia = -1 +** Processing line: ~ end~ +- Inside source: true +*** True Line Result + end ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -152490,34 +158794,26 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ if @inertia != 0~ -- Inside source: true -*** True Line Result - if @inertia != 0 -** Processing line: ~ @inertia = (@inertia * 0.7)~ +** Processing line: ~ @inertia = (@inertia * 0.7)~ - Inside source: true *** True Line Result - @inertia = (@inertia * 0.7) -** Processing line: ~ if @inertia > 0~ + @inertia = (@inertia * 0.7) +** Processing line: ~ if @inertia > 0~ - Inside source: true *** True Line Result - if @inertia > 0 -** Processing line: ~ @log_offset -= 1~ + if @inertia > 0 +** Processing line: ~ @log_offset += 1~ - Inside source: true *** True Line Result - @log_offset -= 1 -** Processing line: ~ elsif @inertia < 0~ + @log_offset += 1 +** Processing line: ~ elsif @inertia < 0~ - Inside source: true *** True Line Result - elsif @inertia < 0 -** Processing line: ~ @log_offset += 1~ + elsif @inertia < 0 +** Processing line: ~ @log_offset -= 1~ - Inside source: true *** True Line Result - @log_offset += 1 -** Processing line: ~ end~ -- Inside source: true -*** True Line Result - end + @log_offset -= 1 ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -152978,10 +159274,10 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result color = color.mult_alpha(0.5) if archived -** Processing line: ~~ +** Processing line: ~ str = str[4..-1] if str.start_with?('!c!') # chop off loglevel color~ - Inside source: true *** True Line Result - + str = str[4..-1] if str.start_with?('!c!') # chop off loglevel color ** Processing line: ~ args.outputs.reserved << font_style.label(x: left.shift_right(10), y: y, text: str, color: color)~ - Inside source: true *** True Line Result @@ -153922,10 +160218,18 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ def color_for_log_entry(log_entry)~ +** Processing line: ~ def color_for_plain_text log_entry~ - Inside source: true *** True Line Result - def color_for_log_entry(log_entry) + def color_for_plain_text log_entry +** Processing line: ~ log_entry = log_entry[4..-1] if log_entry.start_with? "!c!"~ +- Inside source: true +*** True Line Result + log_entry = log_entry[4..-1] if log_entry.start_with? "!c!" +** Processing line: ~~ +- Inside source: true +*** True Line Result + ** Processing line: ~ if code? log_entry~ - Inside source: true *** True Line Result @@ -154002,6 +160306,98 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result +** Processing line: ~ def color_for_log_entry(log_entry)~ +- Inside source: true +*** True Line Result + def color_for_log_entry(log_entry) +** Processing line: ~ if log_entry.start_with?('!c!') # loglevel color specified.~ +- Inside source: true +*** True Line Result + if log_entry.start_with?('!c!') # loglevel color specified. +** Processing line: ~ return case log_entry[3..3].to_i~ +- Inside source: true +*** True Line Result + return case log_entry[3..3].to_i +** Processing line: ~ when 0 # spam~ +- Inside source: true +*** True Line Result + when 0 # spam +** Processing line: ~ @spam_color~ +- Inside source: true +*** True Line Result + @spam_color +** Processing line: ~ when 1 # debug~ +- Inside source: true +*** True Line Result + when 1 # debug +** Processing line: ~ @debug_color~ +- Inside source: true +*** True Line Result + @debug_color +** Processing line: ~ #when 2 # info (caught by the `else` block.)~ +- Inside source: true +*** True Line Result + #when 2 # info (caught by the `else` block.) +** Processing line: ~ # @text_color~ +- Inside source: true +*** True Line Result + # @text_color +** Processing line: ~ when 3 # warn~ +- Inside source: true +*** True Line Result + when 3 # warn +** Processing line: ~ @warn_color~ +- Inside source: true +*** True Line Result + @warn_color +** Processing line: ~ when 4 # error~ +- Inside source: true +*** True Line Result + when 4 # error +** Processing line: ~ @error_color~ +- Inside source: true +*** True Line Result + @error_color +** Processing line: ~ when 5 # unfiltered~ +- Inside source: true +*** True Line Result + when 5 # unfiltered +** Processing line: ~ @unfiltered_color~ +- Inside source: true +*** True Line Result + @unfiltered_color +** Processing line: ~ else~ +- Inside source: true +*** True Line Result + else +** Processing line: ~ color_for_plain_text log_entry~ +- Inside source: true +*** True Line Result + color_for_plain_text log_entry +** Processing line: ~ end~ +- Inside source: true +*** True Line Result + end +** Processing line: ~ end~ +- Inside source: true +*** True Line Result + end +** Processing line: ~~ +- Inside source: true +*** True Line Result + +** Processing line: ~ return color_for_plain_text log_entry~ +- Inside source: true +*** True Line Result + return color_for_plain_text log_entry +** Processing line: ~ end~ +- Inside source: true +*** True Line Result + end +** Processing line: ~~ +- Inside source: true +*** True Line Result + ** Processing line: ~ def prompt~ - Inside source: true *** True Line Result @@ -155822,10 +162218,10 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result items.each_slice(columns).each_with_index do |cells, i| -** Processing line: ~ pretty_print_row_seperator string_width, cell_width, column_width, columns~ +** Processing line: ~ pretty_print_row_separator string_width, cell_width, column_width, columns~ - Inside source: true *** True Line Result - pretty_print_row_seperator string_width, cell_width, column_width, columns + pretty_print_row_separator string_width, cell_width, column_width, columns ** Processing line: ~ pretty_print_row cells, string_width, cell_width, column_width, columns~ - Inside source: true *** True Line Result @@ -155838,10 +162234,10 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ pretty_print_row_seperator string_width, cell_width, column_width, columns~ +** Processing line: ~ pretty_print_row_separator string_width, cell_width, column_width, columns~ - Inside source: true *** True Line Result - pretty_print_row_seperator string_width, cell_width, column_width, columns + pretty_print_row_separator string_width, cell_width, column_width, columns ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -159206,14 +165602,14 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result start_tick + duration, -** Processing line: ~ (initial_value *definitions),~ +** Processing line: ~ initial_value(*definitions),~ - Inside source: true *** True Line Result - (initial_value *definitions), -** Processing line: ~ (final_value *definitions),~ + initial_value(*definitions), +** Processing line: ~ final_value(*definitions),~ - Inside source: true *** True Line Result - (final_value *definitions), + final_value(*definitions), ** Processing line: ~ *definitions~ - Inside source: true *** True Line Result @@ -159998,14 +166394,14 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result def self.rotate_point point, angle, around = nil -** Processing line: ~ s = Math.sin a.to_radians~ +** Processing line: ~ s = Math.sin angle.to_radians~ - Inside source: true *** True Line Result - s = Math.sin a.to_radians -** Processing line: ~ c = Math.cos a.to_radians~ + s = Math.sin angle.to_radians +** Processing line: ~ c = Math.cos angle.to_radians~ - Inside source: true *** True Line Result - c = Math.cos a.to_radians + c = Math.cos angle.to_radians ** Processing line: ~ px = point.x~ - Inside source: true *** True Line Result @@ -160726,14 +167122,46 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result # @gtk -** Processing line: ~ def self.line_y_intercept line~ +** Processing line: ~ def self.line_y_intercept line, replace_infinity: nil~ +- Inside source: true +*** True Line Result + def self.line_y_intercept line, replace_infinity: nil +** Processing line: ~ line.y - line_slope(line, replace_infinity: replace_infinity) * line.x~ +- Inside source: true +*** True Line Result + line.y - line_slope(line, replace_infinity: replace_infinity) * line.x +** Processing line: ~ rescue Exception => e~ +- Inside source: true +*** True Line Result + rescue Exception => e +** Processing line: ~ raise <<-S~ - Inside source: true *** True Line Result - def self.line_y_intercept line -** Processing line: ~ line.y - line_slope(line) * line.x~ + raise <<-S +** Processing line: ~ * ERROR: ~Geometry::line_y_intercept~~ - Inside source: true *** True Line Result - line.y - line_slope(line) * line.x + * ERROR: ~Geometry::line_y_intercept~ +** Processing line: ~ The following exception was thrown for line: #{line}~ +- Inside source: true +*** True Line Result + The following exception was thrown for line: #{line} +** Processing line: ~ #{e}~ +- Inside source: true +*** True Line Result + #{e} +** Processing line: ~~ +- Inside source: true +*** True Line Result + +** Processing line: ~ Consider passing in ~replace_infinity: VALUE~ to handle for vertical lines.~ +- Inside source: true +*** True Line Result + Consider passing in ~replace_infinity: VALUE~ to handle for vertical lines. +** Processing line: ~ S~ +- Inside source: true +*** True Line Result + S ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -161034,26 +167462,26 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result # @gtk -** Processing line: ~ def self.line_intersect line_one, line_two~ +** Processing line: ~ def self.line_intersect line_one, line_two, replace_infinity: nil~ - Inside source: true *** True Line Result - def self.line_intersect line_one, line_two -** Processing line: ~ m1 = line_slope(line_one)~ + def self.line_intersect line_one, line_two, replace_infinity: nil +** Processing line: ~ m1 = line_slope(line_one, replace_infinity: replace_infinity)~ - Inside source: true *** True Line Result - m1 = line_slope(line_one) -** Processing line: ~ m2 = line_slope(line_two)~ + m1 = line_slope(line_one, replace_infinity: replace_infinity) +** Processing line: ~ m2 = line_slope(line_two, replace_infinity: replace_infinity)~ - Inside source: true *** True Line Result - m2 = line_slope(line_two) -** Processing line: ~ b1 = line_y_intercept(line_one)~ + m2 = line_slope(line_two, replace_infinity: replace_infinity) +** Processing line: ~ b1 = line_y_intercept(line_one, replace_infinity: replace_infinity)~ - Inside source: true *** True Line Result - b1 = line_y_intercept(line_one) -** Processing line: ~ b2 = line_y_intercept(line_two)~ + b1 = line_y_intercept(line_one, replace_infinity: replace_infinity) +** Processing line: ~ b2 = line_y_intercept(line_two, replace_infinity: replace_infinity)~ - Inside source: true *** True Line Result - b2 = line_y_intercept(line_two) + b2 = line_y_intercept(line_two, replace_infinity: replace_infinity) ** Processing line: ~ x = (b1 - b2) / (m2 - m1)~ - Inside source: true *** True Line Result @@ -161066,6 +167494,38 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result [x, y] +** Processing line: ~ rescue Exception => e~ +- Inside source: true +*** True Line Result + rescue Exception => e +** Processing line: ~ raise <<-S~ +- Inside source: true +*** True Line Result + raise <<-S +** Processing line: ~ * ERROR: ~Geometry::line_intersect~~ +- Inside source: true +*** True Line Result + * ERROR: ~Geometry::line_intersect~ +** Processing line: ~ The following exception was thrown for line_one: #{line_one}, line_two: #{line_two}~ +- Inside source: true +*** True Line Result + The following exception was thrown for line_one: #{line_one}, line_two: #{line_two} +** Processing line: ~ #{e}~ +- Inside source: true +*** True Line Result + #{e} +** Processing line: ~~ +- Inside source: true +*** True Line Result + +** Processing line: ~ Consider passing in ~replace_infinity: VALUE~ to handle for vertical lines.~ +- Inside source: true +*** True Line Result + Consider passing in ~replace_infinity: VALUE~ to handle for vertical lines. +** Processing line: ~ S~ +- Inside source: true +*** True Line Result + S ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -163810,10 +170270,14 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result collection.each do |m| -** Processing line: ~ self.instance_variable_set("@#{m.to_s}".to_sym, value)~ +** Processing line: ~ m_to_s = m.to_s~ +- Inside source: true +*** True Line Result + m_to_s = m.to_s +** Processing line: ~ self.instance_variable_set("@#{m_to_s}".to_sym, value) if m_to_s.strip.length > 0~ - Inside source: true *** True Line Result - self.instance_variable_set("@#{m.to_s}".to_sym, value) + self.instance_variable_set("@#{m_to_s}".to_sym, value) if m_to_s.strip.length > 0 ** Processing line: ~ rescue Exception => e~ - Inside source: true *** True Line Result @@ -165990,6 +172454,10 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result *app_metadata_retrieval_steps, +** Processing line: ~ :determine_devcert,~ +- Inside source: true +*** True Line Result + :determine_devcert, ** Processing line: ~~ - Inside source: true *** True Line Result @@ -166102,6 +172570,10 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result *app_metadata_retrieval_steps, +** Processing line: ~ :determine_prodcert,~ +- Inside source: true +*** True Line Result + :determine_prodcert, ** Processing line: ~~ - Inside source: true *** True Line Result @@ -166878,6 +173350,22 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result appname= +** Processing line: ~ # devcert is the certificate to use for development/deploying to your local device~ +- Inside source: true +*** True Line Result + # devcert is the certificate to use for development/deploying to your local device +** Processing line: ~ devcert=~ +- Inside source: true +*** True Line Result + devcert= +** Processing line: ~ # prodcert is the certificate to use for distribution to the app store~ +- Inside source: true +*** True Line Result + # prodcert is the certificate to use for distribution to the app store +** Processing line: ~ prodcert=~ +- Inside source: true +*** True Line Result + prodcert= ** Processing line: ~ S~ - Inside source: true *** True Line Result @@ -167018,10 +173506,10 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result "* mygame/metadata/ios_metadata.txt needs to be filled out.", -** Processing line: ~ "You need to update metadata/ios_metadata.txt with a valid teamid, appname, and appid.",~ +** Processing line: ~ "You need to update metadata/ios_metadata.txt with a valid teamid, appname, appid, devcert, and prodcert.",~ - Inside source: true *** True Line Result - "You need to update metadata/ios_metadata.txt with a valid teamid, appname, and appid.", + "You need to update metadata/ios_metadata.txt with a valid teamid, appname, appid, devcert, and prodcert.", ** Processing line: ~ "Instructions for where the values should come from are within metadata/ios_metadata.txt."~ - Inside source: true *** True Line Result @@ -167178,10 +173666,58 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result raise_ios_metadata_required if @app_id.strip.length == 0 -** Processing line: ~ log_info "App Identifier is set to : #{@app_id}"~ +** Processing line: ~ log_info "App Identifier is set to: #{@app_id}"~ +- Inside source: true +*** True Line Result + log_info "App Identifier is set to: #{@app_id}" +** Processing line: ~ end~ +- Inside source: true +*** True Line Result + end +** Processing line: ~~ +- Inside source: true +*** True Line Result + +** Processing line: ~ def determine_devcert~ +- Inside source: true +*** True Line Result + def determine_devcert +** Processing line: ~ @certificate_name = ios_metadata.devcert~ +- Inside source: true +*** True Line Result + @certificate_name = ios_metadata.devcert +** Processing line: ~ raise_ios_metadata_required if @certificate_name.strip.length == 0~ +- Inside source: true +*** True Line Result + raise_ios_metadata_required if @certificate_name.strip.length == 0 +** Processing line: ~ log_info "Dev Certificate is set to: #{@certificate_name}"~ +- Inside source: true +*** True Line Result + log_info "Dev Certificate is set to: #{@certificate_name}" +** Processing line: ~ end~ +- Inside source: true +*** True Line Result + end +** Processing line: ~~ +- Inside source: true +*** True Line Result + +** Processing line: ~ def determine_prodcert~ +- Inside source: true +*** True Line Result + def determine_prodcert +** Processing line: ~ @certificate_name = ios_metadata.prodcert~ +- Inside source: true +*** True Line Result + @certificate_name = ios_metadata.prodcert +** Processing line: ~ raise_ios_metadata_required if @certificate_name.strip.length == 0~ +- Inside source: true +*** True Line Result + raise_ios_metadata_required if @certificate_name.strip.length == 0 +** Processing line: ~ log_info "Production (Distribution) Certificate is set to: #{@certificate_name}"~ - Inside source: true *** True Line Result - log_info "App Identifier is set to : #{@app_id}" + log_info "Production (Distribution) Certificate is set to: #{@certificate_name}" ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -167266,30 +173802,6 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ def stage_app~ -- Inside source: true -*** True Line Result - def stage_app -** Processing line: ~ log_info "Staging."~ -- Inside source: true -*** True Line Result - log_info "Staging." -** Processing line: ~ sh "mkdir -p #{tmp_directory}"~ -- Inside source: true -*** True Line Result - sh "mkdir -p #{tmp_directory}" -** Processing line: ~ sh "cp -R #{relative_path}/dragonruby-ios.app \"#{tmp_directory}/#{@app_name}.app\""~ -- Inside source: true -*** True Line Result - sh "cp -R #{relative_path}/dragonruby-ios.app \"#{tmp_directory}/#{@app_name}.app\"" -** Processing line: ~ end~ -- Inside source: true -*** True Line Result - end -** Processing line: ~~ -- Inside source: true -*** True Line Result - ** Processing line: ~ def set_app_id id~ - Inside source: true *** True Line Result @@ -167410,118 +173922,34 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ if !cli_app_exist?(security_cli_app)~ -- Inside source: true -*** True Line Result - if !cli_app_exist?(security_cli_app) -** Processing line: ~ raise WizardException.new(~ -- Inside source: true -*** True Line Result - raise WizardException.new( -** Processing line: ~ "* It doesn't look like you have #{security_cli_app}.",~ -- Inside source: true -*** True Line Result - "* It doesn't look like you have #{security_cli_app}.", -** Processing line: ~ "** 1. Open Disk Utility and run First Aid.",~ -- Inside source: true -*** True Line Result - "** 1. Open Disk Utility and run First Aid.", -** Processing line: ~ { w: 700, h: 148, path: get_reserved_sprite("disk-utility.png") },~ -- Inside source: true -*** True Line Result - { w: 700, h: 148, path: get_reserved_sprite("disk-utility.png") }, -** Processing line: ~ )~ -- Inside source: true -*** True Line Result - ) -** Processing line: ~ end~ -- Inside source: true -*** True Line Result - end -** Processing line: ~~ -- Inside source: true -*** True Line Result - -** Processing line: ~ if valid_certs.length == 0~ -- Inside source: true -*** True Line Result - if valid_certs.length == 0 -** Processing line: ~ raise WizardException.new(~ -- Inside source: true -*** True Line Result - raise WizardException.new( -** Processing line: ~ "* It doesn't look like you have any valid certs installed.",~ -- Inside source: true -*** True Line Result - "* It doesn't look like you have any valid certs installed.", -** Processing line: ~ "** 1. Open Xcode.",~ -- Inside source: true -*** True Line Result - "** 1. Open Xcode.", -** Processing line: ~ "** 2. Log into your developer account. Xcode -> Preferences -> Accounts.",~ -- Inside source: true -*** True Line Result - "** 2. Log into your developer account. Xcode -> Preferences -> Accounts.", -** Processing line: ~ { w: 700, h: 98, path: get_reserved_sprite("login-xcode.png") },~ -- Inside source: true -*** True Line Result - { w: 700, h: 98, path: get_reserved_sprite("login-xcode.png") }, -** Processing line: ~ "** 3. After loggin in, select Manage Certificates...",~ -- Inside source: true -*** True Line Result - "** 3. After loggin in, select Manage Certificates...", -** Processing line: ~ { w: 700, h: 115, path: get_reserved_sprite("manage-certificates.png") },~ -- Inside source: true -*** True Line Result - { w: 700, h: 115, path: get_reserved_sprite("manage-certificates.png") }, -** Processing line: ~ "** 4. Add a certificate for Apple Development.",~ -- Inside source: true -*** True Line Result - "** 4. Add a certificate for Apple Development.", -** Processing line: ~ { w: 700, h: 217, path: get_reserved_sprite("add-cert.png") },~ -- Inside source: true -*** True Line Result - { w: 700, h: 217, path: get_reserved_sprite("add-cert.png") }, -** Processing line: ~ )~ -- Inside source: true -*** True Line Result - ) -** Processing line: ~ raise "You do not have any Apple development certs on this computer."~ -- Inside source: true -*** True Line Result - raise "You do not have any Apple development certs on this computer." -** Processing line: ~ end~ -- Inside source: true -*** True Line Result - end -** Processing line: ~~ -- Inside source: true -*** True Line Result - ** Processing line: ~ if @production_build~ - Inside source: true *** True Line Result if @production_build -** Processing line: ~ @certificate_name = valid_certs.find_all { |f| f[:name].include? "Distribution" }.first[:name]~ +** Processing line: ~ @certificate_name = ios_metadata[:prodcert]~ - Inside source: true *** True Line Result - @certificate_name = valid_certs.find_all { |f| f[:name].include? "Distribution" }.first[:name] + @certificate_name = ios_metadata[:prodcert] ** Processing line: ~ else~ - Inside source: true *** True Line Result else -** Processing line: ~ @certificate_name = valid_certs.find_all { |f| f[:name].include? "Development" }.first[:name]~ +** Processing line: ~ @certificate_name = ios_metadata[:devcert]~ - Inside source: true *** True Line Result - @certificate_name = valid_certs.find_all { |f| f[:name].include? "Development" }.first[:name] + @certificate_name = ios_metadata[:devcert] ** Processing line: ~ end~ - Inside source: true *** True Line Result end -** Processing line: ~ log_info "I will be using Certificate: '#{@certificate_name}'."~ +** Processing line: ~~ - Inside source: true *** True Line Result - log_info "I will be using Certificate: '#{@certificate_name}'." + +** Processing line: ~ log_info "I will be using certificate: '#{@certificate_name}'."~ +- Inside source: true +*** True Line Result + log_info "I will be using certificate: '#{@certificate_name}'." ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -167578,78 +174006,6 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ def valid_certs~ -- Inside source: true -*** True Line Result - def valid_certs -** Processing line: ~ certs = sh("#{security_cli_app} -q find-identity -p codesigning -v").each_line.map do |l|~ -- Inside source: true -*** True Line Result - certs = sh("#{security_cli_app} -q find-identity -p codesigning -v").each_line.map do |l| -** Processing line: ~ if l.include?(")") && !l.include?("Developer ID") && (l.include?("Development") || l.include?("Distribution"))~ -- Inside source: true -*** True Line Result - if l.include?(")") && !l.include?("Developer ID") && (l.include?("Development") || l.include?("Distribution")) -** Processing line: ~ l.strip~ -- Inside source: true -*** True Line Result - l.strip -** Processing line: ~ else~ -- Inside source: true -*** True Line Result - else -** Processing line: ~ nil~ -- Inside source: true -*** True Line Result - nil -** Processing line: ~ end~ -- Inside source: true -*** True Line Result - end -** Processing line: ~ end.reject_nil.map do |l|~ -- Inside source: true -*** True Line Result - end.reject_nil.map do |l| -** Processing line: ~ number, id, name = l.split(' ', 3)~ -- Inside source: true -*** True Line Result - number, id, name = l.split(' ', 3) -** Processing line: ~ name = name.gsub("\"", "") if name~ -- Inside source: true -*** True Line Result - name = name.gsub("\"", "") if name -** Processing line: ~ {~ -- Inside source: true -*** True Line Result - { -** Processing line: ~ number: 1,~ -- Inside source: true -*** True Line Result - number: 1, -** Processing line: ~ id: id,~ -- Inside source: true -*** True Line Result - id: id, -** Processing line: ~ name: name~ -- Inside source: true -*** True Line Result - name: name -** Processing line: ~ }~ -- Inside source: true -*** True Line Result - } -** Processing line: ~ end~ -- Inside source: true -*** True Line Result - end -** Processing line: ~ end~ -- Inside source: true -*** True Line Result - end -** Processing line: ~~ -- Inside source: true -*** True Line Result - ** Processing line: ~ def connected_devices~ - Inside source: true *** True Line Result @@ -169766,6 +176122,18 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result def stage_app +** Processing line: ~ log_info "Staging."~ +- Inside source: true +*** True Line Result + log_info "Staging." +** Processing line: ~ sh "mkdir -p #{tmp_directory}"~ +- Inside source: true +*** True Line Result + sh "mkdir -p #{tmp_directory}" +** Processing line: ~ sh "cp -R #{relative_path}/dragonruby-ios.app \"#{tmp_directory}/#{@app_name}.app\""~ +- Inside source: true +*** True Line Result + sh "cp -R #{relative_path}/dragonruby-ios.app \"#{tmp_directory}/#{@app_name}.app\"" ** Processing line: ~ sh %Q[cp -r "#{root_folder}/app/" "#{app_path}/app/"]~ - Inside source: true *** True Line Result @@ -177134,86 +183502,6 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ def >= other~ -- Inside source: true -*** True Line Result - def >= other -** Processing line: ~ return false if !other~ -- Inside source: true -*** True Line Result - return false if !other -** Processing line: ~ return gte other~ -- Inside source: true -*** True Line Result - return gte other -** Processing line: ~ end~ -- Inside source: true -*** True Line Result - end -** Processing line: ~~ -- Inside source: true -*** True Line Result - -** Processing line: ~ def > other~ -- Inside source: true -*** True Line Result - def > other -** Processing line: ~ return false if !other~ -- Inside source: true -*** True Line Result - return false if !other -** Processing line: ~ return gt other~ -- Inside source: true -*** True Line Result - return gt other -** Processing line: ~ end~ -- Inside source: true -*** True Line Result - end -** Processing line: ~~ -- Inside source: true -*** True Line Result - -** Processing line: ~ def <= other~ -- Inside source: true -*** True Line Result - def <= other -** Processing line: ~ return false if !other~ -- Inside source: true -*** True Line Result - return false if !other -** Processing line: ~ return lte other~ -- Inside source: true -*** True Line Result - return lte other -** Processing line: ~ end~ -- Inside source: true -*** True Line Result - end -** Processing line: ~~ -- Inside source: true -*** True Line Result - -** Processing line: ~ def < other~ -- Inside source: true -*** True Line Result - def < other -** Processing line: ~ return false if !other~ -- Inside source: true -*** True Line Result - return false if !other -** Processing line: ~ return gt other~ -- Inside source: true -*** True Line Result - return gt other -** Processing line: ~ end~ -- Inside source: true -*** True Line Result - end -** Processing line: ~~ -- Inside source: true -*** True Line Result - ** Processing line: ~ # @gtk~ - Inside source: true *** True Line Result @@ -177554,118 +183842,6 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ def - other~ -- Inside source: true -*** True Line Result - def - other -** Processing line: ~ return self unless other~ -- Inside source: true -*** True Line Result - return self unless other -** Processing line: ~ self - other~ -- Inside source: true -*** True Line Result - self - other -** Processing line: ~ rescue Exception => e~ -- Inside source: true -*** True Line Result - rescue Exception => e -** Processing line: ~ __raise_arithmetic_exception__ other, :-, e~ -- Inside source: true -*** True Line Result - __raise_arithmetic_exception__ other, :-, e -** Processing line: ~ end~ -- Inside source: true -*** True Line Result - end -** Processing line: ~~ -- Inside source: true -*** True Line Result - -** Processing line: ~ def + other~ -- Inside source: true -*** True Line Result - def + other -** Processing line: ~ return self unless other~ -- Inside source: true -*** True Line Result - return self unless other -** Processing line: ~ self + other~ -- Inside source: true -*** True Line Result - self + other -** Processing line: ~ rescue Exception => e~ -- Inside source: true -*** True Line Result - rescue Exception => e -** Processing line: ~ __raise_arithmetic_exception__ other, :+, e~ -- Inside source: true -*** True Line Result - __raise_arithmetic_exception__ other, :+, e -** Processing line: ~ end~ -- Inside source: true -*** True Line Result - end -** Processing line: ~~ -- Inside source: true -*** True Line Result - -** Processing line: ~ def * other~ -- Inside source: true -*** True Line Result - def * other -** Processing line: ~ return self unless other~ -- Inside source: true -*** True Line Result - return self unless other -** Processing line: ~ self * other~ -- Inside source: true -*** True Line Result - self * other -** Processing line: ~ rescue Exception => e~ -- Inside source: true -*** True Line Result - rescue Exception => e -** Processing line: ~ __raise_arithmetic_exception__ other, :*, e~ -- Inside source: true -*** True Line Result - __raise_arithmetic_exception__ other, :*, e -** Processing line: ~ end~ -- Inside source: true -*** True Line Result - end -** Processing line: ~~ -- Inside source: true -*** True Line Result - -** Processing line: ~ def / other~ -- Inside source: true -*** True Line Result - def / other -** Processing line: ~ return self unless other~ -- Inside source: true -*** True Line Result - return self unless other -** Processing line: ~ self / other~ -- Inside source: true -*** True Line Result - self / other -** Processing line: ~ rescue Exception => e~ -- Inside source: true -*** True Line Result - rescue Exception => e -** Processing line: ~ __raise_arithmetic_exception__ other, :/, e~ -- Inside source: true -*** True Line Result - __raise_arithmetic_exception__ other, :/, e -** Processing line: ~ end~ -- Inside source: true -*** True Line Result - end -** Processing line: ~~ -- Inside source: true -*** True Line Result - ** Processing line: ~ def serialize~ - Inside source: true *** True Line Result @@ -177882,26 +184058,38 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ def + other~ +** Processing line: ~ # Returns `-1` if the number is less than `0`. `+1` if the number~ +- Inside source: true +*** True Line Result + # Returns `-1` if the number is less than `0`. `+1` if the number +** Processing line: ~ # is greater than `0`. Returns `0` if the number is equal to `0`.~ - Inside source: true *** True Line Result - def + other -** Processing line: ~ return self unless other~ + # is greater than `0`. Returns `0` if the number is equal to `0`. +** Processing line: ~ #~ - Inside source: true *** True Line Result - return self unless other -** Processing line: ~ self + other~ + # +** Processing line: ~ # @gtk~ - Inside source: true *** True Line Result - self + other -** Processing line: ~ rescue Exception => e~ + # @gtk +** Processing line: ~ def sign~ - Inside source: true *** True Line Result - rescue Exception => e -** Processing line: ~ __raise_arithmetic_exception__ other, :+, e~ + def sign +** Processing line: ~ return -1 if self < 0~ +- Inside source: true +*** True Line Result + return -1 if self < 0 +** Processing line: ~ return 1 if self > 0~ - Inside source: true *** True Line Result - __raise_arithmetic_exception__ other, :+, e + return 1 if self > 0 +** Processing line: ~ return 0~ +- Inside source: true +*** True Line Result + return 0 ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -177910,26 +184098,26 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ def * other~ +** Processing line: ~ # Returns `true` if number is greater than `0`.~ - Inside source: true *** True Line Result - def * other -** Processing line: ~ return self unless other~ + # Returns `true` if number is greater than `0`. +** Processing line: ~ #~ - Inside source: true *** True Line Result - return self unless other -** Processing line: ~ self * other~ + # +** Processing line: ~ # @gtk~ - Inside source: true *** True Line Result - self * other -** Processing line: ~ rescue Exception => e~ + # @gtk +** Processing line: ~ def pos?~ - Inside source: true *** True Line Result - rescue Exception => e -** Processing line: ~ __raise_arithmetic_exception__ other, :*, e~ + def pos? +** Processing line: ~ sign > 0~ - Inside source: true *** True Line Result - __raise_arithmetic_exception__ other, :*, e + sign > 0 ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -177938,26 +184126,26 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ def / other~ +** Processing line: ~ # Returns `true` if number is less than `0`.~ - Inside source: true *** True Line Result - def / other -** Processing line: ~ return self unless other~ + # Returns `true` if number is less than `0`. +** Processing line: ~ #~ - Inside source: true *** True Line Result - return self unless other -** Processing line: ~ self / other~ + # +** Processing line: ~ # @gtk~ - Inside source: true *** True Line Result - self / other -** Processing line: ~ rescue Exception => e~ + # @gtk +** Processing line: ~ def neg?~ - Inside source: true *** True Line Result - rescue Exception => e -** Processing line: ~ __raise_arithmetic_exception__ other, :/, e~ + def neg? +** Processing line: ~ sign < 0~ - Inside source: true *** True Line Result - __raise_arithmetic_exception__ other, :/, e + sign < 0 ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -177966,26 +184154,26 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ def - other~ +** Processing line: ~ # Returns the cosine of a represented in degrees (NOT radians).~ - Inside source: true *** True Line Result - def - other -** Processing line: ~ return self unless other~ + # Returns the cosine of a represented in degrees (NOT radians). +** Processing line: ~ #~ - Inside source: true *** True Line Result - return self unless other -** Processing line: ~ self - other~ + # +** Processing line: ~ # @gtk~ - Inside source: true *** True Line Result - self - other -** Processing line: ~ rescue Exception => e~ + # @gtk +** Processing line: ~ def cos~ - Inside source: true *** True Line Result - rescue Exception => e -** Processing line: ~ __raise_arithmetic_exception__ other, :-, e~ + def cos +** Processing line: ~ Math.cos(self.to_radians)~ - Inside source: true *** True Line Result - __raise_arithmetic_exception__ other, :-, e + Math.cos(self.to_radians) ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -177994,14 +184182,10 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ # Returns `-1` if the number is less than `0`. `+1` if the number~ -- Inside source: true -*** True Line Result - # Returns `-1` if the number is less than `0`. `+1` if the number -** Processing line: ~ # is greater than `0`. Returns `0` if the number is equal to `0`.~ +** Processing line: ~ # Returns the cosine of a represented in degrees (NOT radians).~ - Inside source: true *** True Line Result - # is greater than `0`. Returns `0` if the number is equal to `0`. + # Returns the cosine of a represented in degrees (NOT radians). ** Processing line: ~ #~ - Inside source: true *** True Line Result @@ -178010,22 +184194,30 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result # @gtk -** Processing line: ~ def sign~ +** Processing line: ~ def sin~ - Inside source: true *** True Line Result - def sign -** Processing line: ~ return -1 if self < 0~ + def sin +** Processing line: ~ Math.sin(self.to_radians)~ - Inside source: true *** True Line Result - return -1 if self < 0 -** Processing line: ~ return 1 if self > 0~ + Math.sin(self.to_radians) +** Processing line: ~ end~ - Inside source: true *** True Line Result - return 1 if self > 0 -** Processing line: ~ return 0~ + end +** Processing line: ~~ - Inside source: true *** True Line Result - return 0 + +** Processing line: ~ def to_sf~ +- Inside source: true +*** True Line Result + def to_sf +** Processing line: ~ "%.2f" % self~ +- Inside source: true +*** True Line Result + "%.2f" % self ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -178034,54 +184226,66 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ # Returns `true` if number is greater than `0`.~ +** Processing line: ~ def ifloor int~ - Inside source: true *** True Line Result - # Returns `true` if number is greater than `0`. -** Processing line: ~ #~ + def ifloor int +** Processing line: ~ (self.idiv int.to_i) * int.to_i~ - Inside source: true *** True Line Result - # -** Processing line: ~ # @gtk~ + (self.idiv int.to_i) * int.to_i +** Processing line: ~ end~ - Inside source: true *** True Line Result - # @gtk -** Processing line: ~ def pos?~ + end +** Processing line: ~ end~ - Inside source: true *** True Line Result - def pos? -** Processing line: ~ sign > 0~ + end +** Processing line: ~~ - Inside source: true *** True Line Result - sign > 0 -** Processing line: ~ end~ + +** Processing line: ~ class Float~ - Inside source: true *** True Line Result - end + class Float +** Processing line: ~ include ValueType~ +- Inside source: true +*** True Line Result + include ValueType ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ # Returns `true` if number is less than `0`.~ +** Processing line: ~ alias_method :__original_add__, :+ unless Float.instance_methods.include? :__original_add__~ - Inside source: true *** True Line Result - # Returns `true` if number is less than `0`. -** Processing line: ~ #~ + alias_method :__original_add__, :+ unless Float.instance_methods.include? :__original_add__ +** Processing line: ~ alias_method :__original_subtract__, :- unless Float.instance_methods.include? :__original_subtract__~ - Inside source: true *** True Line Result - # -** Processing line: ~ # @gtk~ + alias_method :__original_subtract__, :- unless Float.instance_methods.include? :__original_subtract__ +** Processing line: ~ alias_method :__original_multiply__, :* unless Float.instance_methods.include? :__original_multiply__~ - Inside source: true *** True Line Result - # @gtk -** Processing line: ~ def neg?~ + alias_method :__original_multiply__, :* unless Float.instance_methods.include? :__original_multiply__ +** Processing line: ~ alias_method :__original_divide__, :- unless Float.instance_methods.include? :__original_divide__~ - Inside source: true *** True Line Result - def neg? -** Processing line: ~ sign < 0~ + alias_method :__original_divide__, :- unless Float.instance_methods.include? :__original_divide__ +** Processing line: ~~ - Inside source: true *** True Line Result - sign < 0 + +** Processing line: ~ def serialize~ +- Inside source: true +*** True Line Result + def serialize +** Processing line: ~ self~ +- Inside source: true +*** True Line Result + self ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -178090,26 +184294,26 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ # Returns the cosine of a represented in degrees (NOT radians).~ +** Processing line: ~ # @gtk~ - Inside source: true *** True Line Result - # Returns the cosine of a represented in degrees (NOT radians). -** Processing line: ~ #~ + # @gtk +** Processing line: ~ def sign~ - Inside source: true *** True Line Result - # -** Processing line: ~ # @gtk~ + def sign +** Processing line: ~ return -1 if self < 0~ - Inside source: true *** True Line Result - # @gtk -** Processing line: ~ def cos~ + return -1 if self < 0 +** Processing line: ~ return 1 if self > 0~ - Inside source: true *** True Line Result - def cos -** Processing line: ~ Math.cos(self.to_radians)~ + return 1 if self > 0 +** Processing line: ~ return 0~ - Inside source: true *** True Line Result - Math.cos(self.to_radians) + return 0 ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -178118,26 +184322,26 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ # Returns the cosine of a represented in degrees (NOT radians).~ +** Processing line: ~ def replace_infinity scalar~ - Inside source: true *** True Line Result - # Returns the cosine of a represented in degrees (NOT radians). -** Processing line: ~ #~ + def replace_infinity scalar +** Processing line: ~ return self if !scalar~ - Inside source: true *** True Line Result - # -** Processing line: ~ # @gtk~ + return self if !scalar +** Processing line: ~ return self unless self.infinite?~ - Inside source: true *** True Line Result - # @gtk -** Processing line: ~ def sin~ + return self unless self.infinite? +** Processing line: ~ return -scalar if self < 0~ - Inside source: true *** True Line Result - def sin -** Processing line: ~ Math.sin(self.to_radians)~ + return -scalar if self < 0 +** Processing line: ~ return scalar if self > 0~ - Inside source: true *** True Line Result - Math.sin(self.to_radians) + return scalar if self > 0 ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -178182,86 +184386,182 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ class Float~ +** Processing line: ~ class Integer~ - Inside source: true *** True Line Result - class Float -** Processing line: ~ include ValueType~ + class Integer +** Processing line: ~ alias_method :__original_round__, :round unless Integer.instance_methods.include? :__original_round__~ - Inside source: true *** True Line Result - include ValueType -** Processing line: ~~ + alias_method :__original_round__, :round unless Integer.instance_methods.include? :__original_round__ +** Processing line: ~ alias_method :__original_add__, :+ unless Integer.instance_methods.include? :__original_add__~ - Inside source: true *** True Line Result - -** Processing line: ~ alias_method :__original_add__, :+ unless Float.instance_methods.include? :__original_add__~ + alias_method :__original_add__, :+ unless Integer.instance_methods.include? :__original_add__ +** Processing line: ~ alias_method :__original_subtract__, :- unless Integer.instance_methods.include? :__original_subtract__~ - Inside source: true *** True Line Result - alias_method :__original_add__, :+ unless Float.instance_methods.include? :__original_add__ -** Processing line: ~ alias_method :__original_subtract__, :- unless Float.instance_methods.include? :__original_subtract__~ + alias_method :__original_subtract__, :- unless Integer.instance_methods.include? :__original_subtract__ +** Processing line: ~ alias_method :__original_multiply__, :* unless Integer.instance_methods.include? :__original_multiply__~ - Inside source: true *** True Line Result - alias_method :__original_subtract__, :- unless Float.instance_methods.include? :__original_subtract__ -** Processing line: ~ alias_method :__original_multiply__, :* unless Float.instance_methods.include? :__original_multiply__~ + alias_method :__original_multiply__, :* unless Integer.instance_methods.include? :__original_multiply__ +** Processing line: ~ alias_method :__original_divide__, :- unless Integer.instance_methods.include? :__original_divide__~ - Inside source: true *** True Line Result - alias_method :__original_multiply__, :* unless Float.instance_methods.include? :__original_multiply__ -** Processing line: ~ alias_method :__original_divide__, :- unless Float.instance_methods.include? :__original_divide__~ + alias_method :__original_divide__, :- unless Integer.instance_methods.include? :__original_divide__ +** Processing line: ~~ - Inside source: true *** True Line Result - alias_method :__original_divide__, :- unless Float.instance_methods.include? :__original_divide__ + +** Processing line: ~ def round *args~ +- Inside source: true +*** True Line Result + def round *args +** Processing line: ~ __original_round__~ +- Inside source: true +*** True Line Result + __original_round__ +** Processing line: ~ end~ +- Inside source: true +*** True Line Result + end ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ def - other~ +** Processing line: ~ def nan?~ +- Inside source: true +*** True Line Result + def nan? +** Processing line: ~ false~ - Inside source: true *** True Line Result - def - other -** Processing line: ~ return self unless other~ + false +** Processing line: ~ end~ - Inside source: true *** True Line Result - return self unless other -** Processing line: ~ super~ + end +** Processing line: ~~ - Inside source: true *** True Line Result - super -** Processing line: ~ rescue Exception => e~ + +** Processing line: ~ def center other~ - Inside source: true *** True Line Result - rescue Exception => e -** Processing line: ~ __raise_arithmetic_exception__ other, :-, e~ + def center other +** Processing line: ~ (self - other).abs.fdiv(2)~ - Inside source: true *** True Line Result - __raise_arithmetic_exception__ other, :-, e + (self - other).abs.fdiv(2) ** Processing line: ~ end~ - Inside source: true *** True Line Result end +** Processing line: ~ end~ +- Inside source: true +*** True Line Result + end ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ def + other~ +** Processing line: ~#+end_src~ +- Line was identified as the end of a code block. +*** True Line Result +#+end_src +** Processing line: ~~ +- End of paragraph detected. +*** True Line Result + +** Processing line: ~*** recording.rb~ +- Header detected. +*** True Line Result + +*** True Line Result +*** recording.rb +** Processing line: ~#+begin_src ruby~ +- Line was identified as the beginning of a code block. +*** True Line Result + +*** True Line Result +#+begin_src ruby +** Processing line: ~ # ./dragon/recording.rb~ - Inside source: true *** True Line Result - def + other -** Processing line: ~ return self unless other~ + # ./dragon/recording.rb +** Processing line: ~ # coding: utf-8~ - Inside source: true *** True Line Result - return self unless other -** Processing line: ~ super~ + # coding: utf-8 +** Processing line: ~ # Copyright 2019 DragonRuby LLC~ - Inside source: true *** True Line Result - super -** Processing line: ~ rescue Exception => e~ + # Copyright 2019 DragonRuby LLC +** Processing line: ~ # MIT License~ - Inside source: true *** True Line Result - rescue Exception => e -** Processing line: ~ __raise_arithmetic_exception__ other, :+, e~ + # MIT License +** Processing line: ~ # recording.rb has been released under MIT (*only this file*).~ +- Inside source: true +*** True Line Result + # recording.rb has been released under MIT (*only this file*). +** Processing line: ~~ +- Inside source: true +*** True Line Result + +** Processing line: ~ module GTK~ - Inside source: true *** True Line Result - __raise_arithmetic_exception__ other, :+, e + module GTK +** Processing line: ~ # FIXME: Gross~ +- Inside source: true +*** True Line Result + # FIXME: Gross +** Processing line: ~ # @gtk~ +- Inside source: true +*** True Line Result + # @gtk +** Processing line: ~ class Replay~ +- Inside source: true +*** True Line Result + class Replay +** Processing line: ~ # @gtk~ +- Inside source: true +*** True Line Result + # @gtk +** Processing line: ~ def self.start file_name = nil~ +- Inside source: true +*** True Line Result + def self.start file_name = nil +** Processing line: ~ $recording.start_replay file_name~ +- Inside source: true +*** True Line Result + $recording.start_replay file_name +** Processing line: ~ end~ +- Inside source: true +*** True Line Result + end +** Processing line: ~~ +- Inside source: true +*** True Line Result + +** Processing line: ~ # @gtk~ +- Inside source: true +*** True Line Result + # @gtk +** Processing line: ~ def self.stop~ +- Inside source: true +*** True Line Result + def self.stop +** Processing line: ~ $recording.stop_replay~ +- Inside source: true +*** True Line Result + $recording.stop_replay +** Processing line: ~ end~ +- Inside source: true +*** True Line Result + end ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -178270,238 +184570,958 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ def * other~ +** Processing line: ~ # @gtk~ - Inside source: true *** True Line Result - def * other -** Processing line: ~ return self unless other~ + # @gtk +** Processing line: ~ class Recording~ - Inside source: true *** True Line Result - return self unless other -** Processing line: ~ super~ + class Recording +** Processing line: ~ def initialize runtime~ - Inside source: true *** True Line Result - super -** Processing line: ~ rescue Exception => e~ + def initialize runtime +** Processing line: ~ @runtime = runtime~ - Inside source: true *** True Line Result - rescue Exception => e -** Processing line: ~ __raise_arithmetic_exception__ other, :*, e~ + @runtime = runtime +** Processing line: ~ @tick_count = 0~ - Inside source: true *** True Line Result - __raise_arithmetic_exception__ other, :*, e -** Processing line: ~ end~ + @tick_count = 0 +** Processing line: ~ @global_input_order = 1~ - Inside source: true *** True Line Result - end + @global_input_order = 1 +** Processing line: ~ end~ +- Inside source: true +*** True Line Result + end ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ def / other~ +** Processing line: ~ def tick~ - Inside source: true *** True Line Result - def / other -** Processing line: ~ return self unless other~ + def tick +** Processing line: ~ @tick_count += 1~ - Inside source: true *** True Line Result - return self unless other -** Processing line: ~ super~ + @tick_count += 1 +** Processing line: ~ end~ - Inside source: true *** True Line Result - super -** Processing line: ~ rescue Exception => e~ + end +** Processing line: ~~ - Inside source: true *** True Line Result - rescue Exception => e -** Processing line: ~ __raise_arithmetic_exception__ other, :/, e~ + +** Processing line: ~ def start_recording seed_number = nil~ - Inside source: true *** True Line Result - __raise_arithmetic_exception__ other, :/, e -** Processing line: ~ end~ + def start_recording seed_number = nil +** Processing line: ~ if !seed_number~ - Inside source: true *** True Line Result - end + if !seed_number +** Processing line: ~ log <<-S~ +- Inside source: true +*** True Line Result + log <<-S +** Processing line: ~ * ERROR:~ +- Inside source: true +*** True Line Result + * ERROR: +** Processing line: ~ To start recording, you must provide an integer value to~ +- Inside source: true +*** True Line Result + To start recording, you must provide an integer value to +** Processing line: ~ seed random number generation.~ +- Inside source: true +*** True Line Result + seed random number generation. +** Processing line: ~ S~ +- Inside source: true +*** True Line Result + S +** Processing line: ~ $console.set_command "$recording.start SEED_NUMBER"~ +- Inside source: true +*** True Line Result + $console.set_command "$recording.start SEED_NUMBER" +** Processing line: ~ return~ +- Inside source: true +*** True Line Result + return +** Processing line: ~ end~ +- Inside source: true +*** True Line Result + end ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ def serialize~ +** Processing line: ~ if @is_recording~ - Inside source: true *** True Line Result - def serialize -** Processing line: ~ self~ + if @is_recording +** Processing line: ~ log <<-S~ - Inside source: true *** True Line Result - self -** Processing line: ~ end~ + log <<-S +** Processing line: ~ * ERROR:~ - Inside source: true *** True Line Result - end + * ERROR: +** Processing line: ~ You are already recording, first cancel (or stop) the current recording.~ +- Inside source: true +*** True Line Result + You are already recording, first cancel (or stop) the current recording. +** Processing line: ~ S~ +- Inside source: true +*** True Line Result + S +** Processing line: ~ $console.set_command "$recording.cancel"~ +- Inside source: true +*** True Line Result + $console.set_command "$recording.cancel" +** Processing line: ~ return~ +- Inside source: true +*** True Line Result + return +** Processing line: ~ end~ +- Inside source: true +*** True Line Result + end ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ # @gtk~ +** Processing line: ~ if @is_replaying~ - Inside source: true *** True Line Result - # @gtk -** Processing line: ~ def sign~ + if @is_replaying +** Processing line: ~ log <<-S~ - Inside source: true *** True Line Result - def sign -** Processing line: ~ return -1 if self < 0~ + log <<-S +** Processing line: ~ * ERROR:~ - Inside source: true *** True Line Result - return -1 if self < 0 -** Processing line: ~ return 1 if self > 0~ + * ERROR: +** Processing line: ~ You are currently replaying a recording, first stop the replay.~ - Inside source: true *** True Line Result - return 1 if self > 0 -** Processing line: ~ return 0~ + You are currently replaying a recording, first stop the replay. +** Processing line: ~ S~ - Inside source: true *** True Line Result - return 0 -** Processing line: ~ end~ + S +** Processing line: ~ return~ - Inside source: true *** True Line Result - end + return +** Processing line: ~ end~ +- Inside source: true +*** True Line Result + end ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ def replace_infinity scalar~ +** Processing line: ~ log_info <<-S~ - Inside source: true *** True Line Result - def replace_infinity scalar -** Processing line: ~ return self if !scalar~ + log_info <<-S +** Processing line: ~ Recording has begun with RNG seed value set to #{seed_number}.~ - Inside source: true *** True Line Result - return self if !scalar -** Processing line: ~ return self unless self.infinite?~ + Recording has begun with RNG seed value set to #{seed_number}. +** Processing line: ~ To stop recording use stop_recording(filename).~ - Inside source: true *** True Line Result - return self unless self.infinite? -** Processing line: ~ return -scalar if self < 0~ + To stop recording use stop_recording(filename). +** Processing line: ~ The recording will stop without saving a file if a filename is nil.~ - Inside source: true *** True Line Result - return -scalar if self < 0 -** Processing line: ~ return scalar if self > 0~ + The recording will stop without saving a file if a filename is nil. +** Processing line: ~ S~ - Inside source: true *** True Line Result - return scalar if self > 0 -** Processing line: ~ end~ + S +** Processing line: ~~ - Inside source: true *** True Line Result - end + +** Processing line: ~ $console.set_command "$recording.stop 'replay.txt'"~ +- Inside source: true +*** True Line Result + $console.set_command "$recording.stop 'replay.txt'" +** Processing line: ~ @runtime.__reset__~ +- Inside source: true +*** True Line Result + @runtime.__reset__ +** Processing line: ~ @seed_number = seed_number~ +- Inside source: true +*** True Line Result + @seed_number = seed_number +** Processing line: ~ @runtime.set_rng seed_number~ +- Inside source: true +*** True Line Result + @runtime.set_rng seed_number ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ def to_sf~ +** Processing line: ~ @tick_count = 0~ - Inside source: true *** True Line Result - def to_sf -** Processing line: ~ "%.2f" % self~ + @tick_count = 0 +** Processing line: ~ @global_input_order = 1~ - Inside source: true *** True Line Result - "%.2f" % self -** Processing line: ~ end~ + @global_input_order = 1 +** Processing line: ~ @is_recording = true~ - Inside source: true *** True Line Result - end + @is_recording = true +** Processing line: ~ @input_history = []~ +- Inside source: true +*** True Line Result + @input_history = [] +** Processing line: ~ @runtime.notify! "Recording started. When completed, open the console to save it using $recording.stop FILE_NAME (or cancel).", 300~ +- Inside source: true +*** True Line Result + @runtime.notify! "Recording started. When completed, open the console to save it using $recording.stop FILE_NAME (or cancel).", 300 +** Processing line: ~ end~ +- Inside source: true +*** True Line Result + end ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ def ifloor int~ +** Processing line: ~ # @gtk~ - Inside source: true *** True Line Result - def ifloor int -** Processing line: ~ (self.idiv int.to_i) * int.to_i~ + # @gtk +** Processing line: ~ def start seed_number = nil~ - Inside source: true *** True Line Result - (self.idiv int.to_i) * int.to_i -** Processing line: ~ end~ + def start seed_number = nil +** Processing line: ~ start_recording seed_number~ - Inside source: true *** True Line Result - end -** Processing line: ~ end~ + start_recording seed_number +** Processing line: ~ end~ - Inside source: true *** True Line Result - end + end ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ class Integer~ +** Processing line: ~ def is_replaying?~ - Inside source: true *** True Line Result - class Integer -** Processing line: ~ alias_method :__original_round__, :round unless Integer.instance_methods.include? :__original_round__~ + def is_replaying? +** Processing line: ~ @is_replaying~ - Inside source: true *** True Line Result - alias_method :__original_round__, :round unless Integer.instance_methods.include? :__original_round__ -** Processing line: ~ alias_method :__original_add__, :+ unless Integer.instance_methods.include? :__original_add__~ + @is_replaying +** Processing line: ~ end~ - Inside source: true *** True Line Result - alias_method :__original_add__, :+ unless Integer.instance_methods.include? :__original_add__ -** Processing line: ~ alias_method :__original_subtract__, :- unless Integer.instance_methods.include? :__original_subtract__~ + end +** Processing line: ~~ - Inside source: true *** True Line Result - alias_method :__original_subtract__, :- unless Integer.instance_methods.include? :__original_subtract__ -** Processing line: ~ alias_method :__original_multiply__, :* unless Integer.instance_methods.include? :__original_multiply__~ + +** Processing line: ~ def is_recording?~ - Inside source: true *** True Line Result - alias_method :__original_multiply__, :* unless Integer.instance_methods.include? :__original_multiply__ -** Processing line: ~ alias_method :__original_divide__, :- unless Integer.instance_methods.include? :__original_divide__~ + def is_recording? +** Processing line: ~ @is_recording~ - Inside source: true *** True Line Result - alias_method :__original_divide__, :- unless Integer.instance_methods.include? :__original_divide__ + @is_recording +** Processing line: ~ end~ +- Inside source: true +*** True Line Result + end ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ def round *args~ +** Processing line: ~ # @gtk~ - Inside source: true *** True Line Result - def round *args -** Processing line: ~ __original_round__~ + # @gtk +** Processing line: ~ def stop file_name = nil~ - Inside source: true *** True Line Result - __original_round__ -** Processing line: ~ end~ + def stop file_name = nil +** Processing line: ~ stop_recording file_name~ - Inside source: true *** True Line Result - end + stop_recording file_name +** Processing line: ~ end~ +- Inside source: true +*** True Line Result + end ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ def nan?~ +** Processing line: ~ # @gtk~ - Inside source: true *** True Line Result - def nan? -** Processing line: ~ false~ + # @gtk +** Processing line: ~ def cancel~ - Inside source: true *** True Line Result - false -** Processing line: ~ end~ + def cancel +** Processing line: ~ stop_recording_core~ - Inside source: true *** True Line Result - end + stop_recording_core +** Processing line: ~ @runtime.notify! "Recording cancelled."~ +- Inside source: true +*** True Line Result + @runtime.notify! "Recording cancelled." +** Processing line: ~ end~ +- Inside source: true +*** True Line Result + end ** Processing line: ~~ - Inside source: true *** True Line Result -** Processing line: ~ def center other~ +** Processing line: ~ def stop_recording file_name = nil~ - Inside source: true *** True Line Result - def center other -** Processing line: ~ (self - other).abs.fdiv(2)~ + def stop_recording file_name = nil +** Processing line: ~ if !file_name~ - Inside source: true *** True Line Result - (self - other).abs.fdiv(2) + if !file_name +** Processing line: ~ log <<-S~ +- Inside source: true +*** True Line Result + log <<-S +** Processing line: ~ * ERROR:~ +- Inside source: true +*** True Line Result + * ERROR: +** Processing line: ~ To please specify a file name when calling:~ +- Inside source: true +*** True Line Result + To please specify a file name when calling: +** Processing line: ~ $recording.stop FILE_NAME~ +- Inside source: true +*** True Line Result + $recording.stop FILE_NAME +** Processing line: ~~ +- Inside source: true +*** True Line Result + +** Processing line: ~ If you do NOT want to save the recording, call:~ +- Inside source: true +*** True Line Result + If you do NOT want to save the recording, call: +** Processing line: ~ $recording.cancel~ +- Inside source: true +*** True Line Result + $recording.cancel +** Processing line: ~ S~ +- Inside source: true +*** True Line Result + S +** Processing line: ~ $console.set_command "$recording.stop 'replay.txt'"~ +- Inside source: true +*** True Line Result + $console.set_command "$recording.stop 'replay.txt'" +** Processing line: ~ return~ +- Inside source: true +*** True Line Result + return +** Processing line: ~ end~ +- Inside source: true +*** True Line Result + end +** Processing line: ~~ +- Inside source: true +*** True Line Result + +** Processing line: ~ if !@is_recording~ +- Inside source: true +*** True Line Result + if !@is_recording +** Processing line: ~ log_info "You are not currently recording. Use start_recording(seed_number) to start recording."~ +- Inside source: true +*** True Line Result + log_info "You are not currently recording. Use start_recording(seed_number) to start recording." +** Processing line: ~ $console.set_command "$recording.start"~ +- Inside source: true +*** True Line Result + $console.set_command "$recording.start" +** Processing line: ~ return~ +- Inside source: true +*** True Line Result + return +** Processing line: ~ end~ +- Inside source: true +*** True Line Result + end +** Processing line: ~~ +- Inside source: true +*** True Line Result + +** Processing line: ~ if file_name~ +- Inside source: true +*** True Line Result + if file_name +** Processing line: ~ text = "replay_version 2.0\n"~ +- Inside source: true +*** True Line Result + text = "replay_version 2.0\n" +** Processing line: ~ text << "stopped_at #{@tick_count}\n"~ +- Inside source: true +*** True Line Result + text << "stopped_at #{@tick_count}\n" +** Processing line: ~ text << "seed #{@seed_number}\n"~ +- Inside source: true +*** True Line Result + text << "seed #{@seed_number}\n" +** Processing line: ~ text << "recorded_at #{Time.now.to_s}\n"~ +- Inside source: true +*** True Line Result + text << "recorded_at #{Time.now.to_s}\n" +** Processing line: ~ @input_history.each do |items|~ +- Inside source: true +*** True Line Result + @input_history.each do |items| +** Processing line: ~ text << "#{items}\n"~ +- Inside source: true +*** True Line Result + text << "#{items}\n" +** Processing line: ~ end~ +- Inside source: true +*** True Line Result + end +** Processing line: ~ @runtime.write_file file_name, text~ +- Inside source: true +*** True Line Result + @runtime.write_file file_name, text +** Processing line: ~ @runtime.write_file 'last_replay.txt', text~ +- Inside source: true +*** True Line Result + @runtime.write_file 'last_replay.txt', text +** Processing line: ~ log_info "The recording has been saved successfully at #{file_name}. You can use start_replay(\"#{file_name}\") to replay the recording."~ +- Inside source: true +*** True Line Result + log_info "The recording has been saved successfully at #{file_name}. You can use start_replay(\"#{file_name}\") to replay the recording." +** Processing line: ~ end~ +- Inside source: true +*** True Line Result + end +** Processing line: ~~ +- Inside source: true +*** True Line Result + +** Processing line: ~ $console.set_command "$replay.start '#{file_name}'"~ +- Inside source: true +*** True Line Result + $console.set_command "$replay.start '#{file_name}'" +** Processing line: ~ stop_recording_core~ +- Inside source: true +*** True Line Result + stop_recording_core +** Processing line: ~ @runtime.notify! "Recording saved to #{file_name}. To replay it: $replay.start \"#{file_name}\"."~ +- Inside source: true +*** True Line Result + @runtime.notify! "Recording saved to #{file_name}. To replay it: $replay.start \"#{file_name}\"." +** Processing line: ~ log_info "You can run the replay later on startup using: ./dragonruby mygame --replay #{@replay_file_name}"~ +- Inside source: true +*** True Line Result + log_info "You can run the replay later on startup using: ./dragonruby mygame --replay #{@replay_file_name}" +** Processing line: ~ nil~ +- Inside source: true +*** True Line Result + nil +** Processing line: ~ end~ +- Inside source: true +*** True Line Result + end +** Processing line: ~~ +- Inside source: true +*** True Line Result + +** Processing line: ~ def stop_recording_core~ +- Inside source: true +*** True Line Result + def stop_recording_core +** Processing line: ~ @is_recording = false~ +- Inside source: true +*** True Line Result + @is_recording = false +** Processing line: ~ @input_history = nil~ +- Inside source: true +*** True Line Result + @input_history = nil +** Processing line: ~ @last_history = nil~ +- Inside source: true +*** True Line Result + @last_history = nil +** Processing line: ~ @runtime.__reset__~ +- Inside source: true +*** True Line Result + @runtime.__reset__ +** Processing line: ~ end~ +- Inside source: true +*** True Line Result + end +** Processing line: ~~ +- Inside source: true +*** True Line Result + +** Processing line: ~ def start_replay file_name = nil~ +- Inside source: true +*** True Line Result + def start_replay file_name = nil +** Processing line: ~ if !file_name~ +- Inside source: true +*** True Line Result + if !file_name +** Processing line: ~ log <<-S~ +- Inside source: true +*** True Line Result + log <<-S +** Processing line: ~ * ERROR:~ +- Inside source: true +*** True Line Result + * ERROR: +** Processing line: ~ Please provide a file name to $recording.start.~ +- Inside source: true +*** True Line Result + Please provide a file name to $recording.start. +** Processing line: ~ S~ +- Inside source: true +*** True Line Result + S +** Processing line: ~ $console.set_command "$replay.start 'replay.txt'"~ +- Inside source: true +*** True Line Result + $console.set_command "$replay.start 'replay.txt'" +** Processing line: ~ return~ +- Inside source: true +*** True Line Result + return +** Processing line: ~ end~ +- Inside source: true +*** True Line Result + end +** Processing line: ~~ +- Inside source: true +*** True Line Result + +** Processing line: ~ text = @runtime.read_file file_name~ +- Inside source: true +*** True Line Result + text = @runtime.read_file file_name +** Processing line: ~ return false unless text~ +- Inside source: true +*** True Line Result + return false unless text +** Processing line: ~~ +- Inside source: true +*** True Line Result + +** Processing line: ~ if text.each_line.first.strip != "replay_version 2.0"~ +- Inside source: true +*** True Line Result + if text.each_line.first.strip != "replay_version 2.0" +** Processing line: ~ raise "The replay file #{file_name} is not compatible with this version of DragonRuby Game Toolkit. Please recreate the replay (sorry)."~ +- Inside source: true +*** True Line Result + raise "The replay file #{file_name} is not compatible with this version of DragonRuby Game Toolkit. Please recreate the replay (sorry)." +** Processing line: ~ end~ +- Inside source: true +*** True Line Result + end +** Processing line: ~~ +- Inside source: true +*** True Line Result + +** Processing line: ~ @replay_file_name = file_name~ +- Inside source: true +*** True Line Result + @replay_file_name = file_name +** Processing line: ~~ +- Inside source: true +*** True Line Result + +** Processing line: ~ $replay_data = { input_history: { } }~ +- Inside source: true +*** True Line Result + $replay_data = { input_history: { } } +** Processing line: ~ text.each_line do |l|~ +- Inside source: true +*** True Line Result + text.each_line do |l| +** Processing line: ~ if l.strip.length == 0~ +- Inside source: true +*** True Line Result + if l.strip.length == 0 +** Processing line: ~ next~ +- Inside source: true +*** True Line Result + next +** Processing line: ~ elsif l.start_with? 'replay_version'~ +- Inside source: true +*** True Line Result + elsif l.start_with? 'replay_version' +** Processing line: ~ next~ +- Inside source: true +*** True Line Result + next +** Processing line: ~ elsif l.start_with? 'seed'~ +- Inside source: true +*** True Line Result + elsif l.start_with? 'seed' +** Processing line: ~ $replay_data[:seed] = l.split(' ').last.to_i~ +- Inside source: true +*** True Line Result + $replay_data[:seed] = l.split(' ').last.to_i +** Processing line: ~ elsif l.start_with? 'stopped_at'~ +- Inside source: true +*** True Line Result + elsif l.start_with? 'stopped_at' +** Processing line: ~ $replay_data[:stopped_at] = l.split(' ').last.to_i~ +- Inside source: true +*** True Line Result + $replay_data[:stopped_at] = l.split(' ').last.to_i +** Processing line: ~ elsif l.start_with? 'recorded_at'~ +- Inside source: true +*** True Line Result + elsif l.start_with? 'recorded_at' +** Processing line: ~ $replay_data[:recorded_at] = l.split(' ')[1..-1].join(' ')~ +- Inside source: true +*** True Line Result + $replay_data[:recorded_at] = l.split(' ')[1..-1].join(' ') +** Processing line: ~ elsif l.start_with? '['~ +- Inside source: true +*** True Line Result + elsif l.start_with? '[' +** Processing line: ~ name, value_1, value_2, value_count, id, tick_count = l.strip.gsub('[', '').gsub(']', '').split(',')~ +- Inside source: true +*** True Line Result + name, value_1, value_2, value_count, id, tick_count = l.strip.gsub('[', '').gsub(']', '').split(',') +** Processing line: ~ $replay_data[:input_history][tick_count.to_i] ||= []~ +- Inside source: true +*** True Line Result + $replay_data[:input_history][tick_count.to_i] ||= [] +** Processing line: ~ $replay_data[:input_history][tick_count.to_i] << {~ +- Inside source: true +*** True Line Result + $replay_data[:input_history][tick_count.to_i] << { +** Processing line: ~ id: id.to_i,~ +- Inside source: true +*** True Line Result + id: id.to_i, +** Processing line: ~ name: name.gsub(':', '').to_sym,~ +- Inside source: true +*** True Line Result + name: name.gsub(':', '').to_sym, +** Processing line: ~ value_1: value_1.to_f,~ +- Inside source: true +*** True Line Result + value_1: value_1.to_f, +** Processing line: ~ value_2: value_2.to_f,~ +- Inside source: true +*** True Line Result + value_2: value_2.to_f, +** Processing line: ~ value_count: value_count.to_i~ +- Inside source: true +*** True Line Result + value_count: value_count.to_i +** Processing line: ~ }~ +- Inside source: true +*** True Line Result + } +** Processing line: ~ else~ +- Inside source: true +*** True Line Result + else +** Processing line: ~ raise "Replay data seems corrupt. I don't know how to parse #{l}."~ +- Inside source: true +*** True Line Result + raise "Replay data seems corrupt. I don't know how to parse #{l}." +** Processing line: ~ end~ +- Inside source: true +*** True Line Result + end +** Processing line: ~ end~ +- Inside source: true +*** True Line Result + end +** Processing line: ~~ +- Inside source: true +*** True Line Result + +** Processing line: ~ $replay_data[:input_history].keys.each do |key|~ +- Inside source: true +*** True Line Result + $replay_data[:input_history].keys.each do |key| +** Processing line: ~ $replay_data[:input_history][key] = $replay_data[:input_history][key].sort_by {|input| input[:id]}~ +- Inside source: true +*** True Line Result + $replay_data[:input_history][key] = $replay_data[:input_history][key].sort_by {|input| input[:id]} +** Processing line: ~ end~ +- Inside source: true +*** True Line Result + end +** Processing line: ~~ +- Inside source: true +*** True Line Result + +** Processing line: ~ @runtime.__reset__~ +- Inside source: true +*** True Line Result + @runtime.__reset__ +** Processing line: ~ @runtime.set_rng $replay_data[:seed]~ +- Inside source: true +*** True Line Result + @runtime.set_rng $replay_data[:seed] +** Processing line: ~ @tick_count = 0~ +- Inside source: true +*** True Line Result + @tick_count = 0 +** Processing line: ~ @is_replaying = true~ +- Inside source: true +*** True Line Result + @is_replaying = true +** Processing line: ~ log_info "Replay has been started."~ +- Inside source: true +*** True Line Result + log_info "Replay has been started." +** Processing line: ~ @runtime.notify! "Replay started [#{@replay_file_name}]."~ +- Inside source: true +*** True Line Result + @runtime.notify! "Replay started [#{@replay_file_name}]." +** Processing line: ~ end~ +- Inside source: true +*** True Line Result + end +** Processing line: ~~ +- Inside source: true +*** True Line Result + +** Processing line: ~ def stop_replay notification_message = "Replay has been stopped."~ +- Inside source: true +*** True Line Result + def stop_replay notification_message = "Replay has been stopped." +** Processing line: ~ if !is_replaying?~ +- Inside source: true +*** True Line Result + if !is_replaying? +** Processing line: ~ log <<-S~ +- Inside source: true +*** True Line Result + log <<-S +** Processing line: ~ * ERROR:~ +- Inside source: true +*** True Line Result + * ERROR: +** Processing line: ~ No replay is currently running. Call $replay.start FILE_NAME to start a replay.~ +- Inside source: true +*** True Line Result + No replay is currently running. Call $replay.start FILE_NAME to start a replay. +** Processing line: ~ S~ +- Inside source: true +*** True Line Result + S +** Processing line: ~~ +- Inside source: true +*** True Line Result + +** Processing line: ~ $console.set_command "$replay.start 'replay.txt'"~ +- Inside source: true +*** True Line Result + $console.set_command "$replay.start 'replay.txt'" +** Processing line: ~ return~ +- Inside source: true +*** True Line Result + return +** Processing line: ~ end~ +- Inside source: true +*** True Line Result + end +** Processing line: ~ log_info notification_message~ +- Inside source: true +*** True Line Result + log_info notification_message +** Processing line: ~ @is_replaying = false~ +- Inside source: true +*** True Line Result + @is_replaying = false +** Processing line: ~ $replay_data = nil~ +- Inside source: true +*** True Line Result + $replay_data = nil +** Processing line: ~ @tick_count = 0~ +- Inside source: true +*** True Line Result + @tick_count = 0 +** Processing line: ~ @global_input_order = 1~ +- Inside source: true +*** True Line Result + @global_input_order = 1 +** Processing line: ~ $console.set_command_silent "$replay.start '#{@replay_file_name}'"~ +- Inside source: true +*** True Line Result + $console.set_command_silent "$replay.start '#{@replay_file_name}'" +** Processing line: ~ @runtime.__reset__~ +- Inside source: true +*** True Line Result + @runtime.__reset__ +** Processing line: ~ @runtime.notify! notification_message~ +- Inside source: true +*** True Line Result + @runtime.notify! notification_message +** Processing line: ~ end~ +- Inside source: true +*** True Line Result + end +** Processing line: ~~ +- Inside source: true +*** True Line Result + +** Processing line: ~ def record_input_history name, value_1, value_2, value_count, clear_cache = false~ +- Inside source: true +*** True Line Result + def record_input_history name, value_1, value_2, value_count, clear_cache = false +** Processing line: ~ return if @is_replaying~ +- Inside source: true +*** True Line Result + return if @is_replaying +** Processing line: ~ return unless @is_recording~ +- Inside source: true +*** True Line Result + return unless @is_recording +** Processing line: ~ @input_history << [name, value_1, value_2, value_count, @global_input_order, @tick_count]~ +- Inside source: true +*** True Line Result + @input_history << [name, value_1, value_2, value_count, @global_input_order, @tick_count] +** Processing line: ~ @global_input_order += 1~ +- Inside source: true +*** True Line Result + @global_input_order += 1 +** Processing line: ~ end~ +- Inside source: true +*** True Line Result + end +** Processing line: ~~ +- Inside source: true +*** True Line Result + +** Processing line: ~ def stage_replay_values~ +- Inside source: true +*** True Line Result + def stage_replay_values +** Processing line: ~ return unless @is_replaying~ +- Inside source: true +*** True Line Result + return unless @is_replaying +** Processing line: ~ return unless $replay_data~ +- Inside source: true +*** True Line Result + return unless $replay_data +** Processing line: ~~ +- Inside source: true +*** True Line Result + +** Processing line: ~ if $replay_data[:stopped_at] <= @tick_count~ +- Inside source: true +*** True Line Result + if $replay_data[:stopped_at] <= @tick_count +** Processing line: ~ stop_replay "Replay completed [#{@replay_file_name}]. To rerun, bring up the Console and press enter."~ +- Inside source: true +*** True Line Result + stop_replay "Replay completed [#{@replay_file_name}]. To rerun, bring up the Console and press enter." +** Processing line: ~ return~ +- Inside source: true +*** True Line Result + return +** Processing line: ~ end~ +- Inside source: true +*** True Line Result + end +** Processing line: ~~ +- Inside source: true +*** True Line Result + +** Processing line: ~ inputs_this_tick = $replay_data[:input_history][@tick_count]~ +- Inside source: true +*** True Line Result + inputs_this_tick = $replay_data[:input_history][@tick_count] +** Processing line: ~~ +- Inside source: true +*** True Line Result + +** Processing line: ~ if @tick_count.zmod? 60~ +- Inside source: true +*** True Line Result + if @tick_count.zmod? 60 +** Processing line: ~ log_info "Replay ends in #{($replay_data[:stopped_at] - @tick_count).idiv 60} second(s)."~ +- Inside source: true +*** True Line Result + log_info "Replay ends in #{($replay_data[:stopped_at] - @tick_count).idiv 60} second(s)." +** Processing line: ~ end~ +- Inside source: true +*** True Line Result + end +** Processing line: ~~ +- Inside source: true +*** True Line Result + +** Processing line: ~ return unless inputs_this_tick~ +- Inside source: true +*** True Line Result + return unless inputs_this_tick +** Processing line: ~ inputs_this_tick.each do |v|~ +- Inside source: true +*** True Line Result + inputs_this_tick.each do |v| +** Processing line: ~ args = []~ +- Inside source: true +*** True Line Result + args = [] +** Processing line: ~ args << v[:value_1] if v[:value_count] >= 1~ +- Inside source: true +*** True Line Result + args << v[:value_1] if v[:value_count] >= 1 +** Processing line: ~ args << v[:value_2] if v[:value_count] >= 2~ +- Inside source: true +*** True Line Result + args << v[:value_2] if v[:value_count] >= 2 +** Processing line: ~ args << :replay~ +- Inside source: true +*** True Line Result + args << :replay +** Processing line: ~ $gtk.send v[:name], *args~ +- Inside source: true +*** True Line Result + $gtk.send v[:name], *args +** Processing line: ~ end~ +- Inside source: true +*** True Line Result + end +** Processing line: ~ end~ +- Inside source: true +*** True Line Result + end ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -180018,10 +187038,6 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result S -** Processing line: ~ time_start = Time.now~ -- Inside source: true -*** True Line Result - time_start = Time.now ** Processing line: ~ idx = 0~ - Inside source: true *** True Line Result @@ -180030,6 +187046,10 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result r = nil +** Processing line: ~ time_start = Time.now~ +- Inside source: true +*** True Line Result + time_start = Time.now ** Processing line: ~ while idx < iterations~ - Inside source: true *** True Line Result @@ -180046,10 +187066,6 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result end -** Processing line: ~~ -- Inside source: true -*** True Line Result - ** Processing line: ~ result = (Time.now - time_start).round 3~ - Inside source: true *** True Line Result @@ -180550,10 +187566,10 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result -** Processing line: ~ if !$gtk.production~ +** Processing line: ~ if !self.production~ - Inside source: true *** True Line Result - if !$gtk.production + if !self.production ** Processing line: ~ fn.each_send pass.debug, self, :draw_primitive~ - Inside source: true *** True Line Result @@ -180618,6 +187634,10 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result else +** Processing line: ~ s = s.as_hash if s.is_a? OpenEntity~ +- Inside source: true +*** True Line Result + s = s.as_hash if s.is_a? OpenEntity ** Processing line: ~ @ffi_draw.draw_solid_2 s.x, s.y, s.w, s.h,~ - Inside source: true *** True Line Result @@ -180670,6 +187690,10 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result else +** Processing line: ~ s = s.as_hash if s.is_a? OpenEntity~ +- Inside source: true +*** True Line Result + s = s.as_hash if s.is_a? OpenEntity ** Processing line: ~ @ffi_draw.draw_sprite_4 s.x, s.y, s.w, s.h,~ - Inside source: true *** True Line Result @@ -180746,6 +187770,10 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result else +** Processing line: ~ s = s.as_hash if s.is_a? OpenEntity~ +- Inside source: true +*** True Line Result + s = s.as_hash if s.is_a? OpenEntity ** Processing line: ~ @ffi_draw.draw_screenshot (s.path || '').to_s,~ - Inside source: true *** True Line Result @@ -180818,6 +187846,10 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result else +** Processing line: ~ l = l.as_hash if l.is_a? OpenEntity~ +- Inside source: true +*** True Line Result + l = l.as_hash if l.is_a? OpenEntity ** Processing line: ~ @ffi_draw.draw_label_3 l.x, l.y,~ - Inside source: true *** True Line Result @@ -180886,6 +187918,10 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result else +** Processing line: ~ l = l.as_hash if l.is_a? OpenEntity~ +- Inside source: true +*** True Line Result + l = l.as_hash if l.is_a? OpenEntity ** Processing line: ~ if l.x2~ - Inside source: true *** True Line Result @@ -180986,6 +188022,10 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result else +** Processing line: ~ s = s.as_hash if s.is_a? OpenEntity~ +- Inside source: true +*** True Line Result + s = s.as_hash if s.is_a? OpenEntity ** Processing line: ~ @ffi_draw.draw_border_2 s.x, s.y, s.w, s.h,~ - Inside source: true *** True Line Result @@ -181258,10 +188298,10 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result @last_framerate = current_framerate -** Processing line: ~ if !@console.visible?~ +** Processing line: ~ if !@console.visible? && !@recording.is_replaying?~ - Inside source: true *** True Line Result - if !@console.visible? + if !@console.visible? && !@recording.is_replaying? ** Processing line: ~ log framerate_warning_message~ - Inside source: true *** True Line Result @@ -184914,18 +191954,18 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result if (os.first.is_a? Numeric) -** Processing line: ~ sld! *os~ +** Processing line: ~ sld!(*os)~ - Inside source: true *** True Line Result - sld! *os + sld!(*os) ** Processing line: ~ else~ - Inside source: true *** True Line Result else -** Processing line: ~ os.each { |o| sld! *o }~ +** Processing line: ~ os.each { |o| sld!(*o) }~ - Inside source: true *** True Line Result - os.each { |o| sld! *o } + os.each { |o| sld!(*o) } ** Processing line: ~ end~ - Inside source: true *** True Line Result @@ -185114,6 +192154,106 @@ Follows is a source code listing for all files that have been open sourced. This - Inside source: true *** True Line Result +** Processing line: ~ =begin~ +- Inside source: true +*** True Line Result + =begin +** Processing line: ~ wht = [255] * 3~ +- Inside source: true +*** True Line Result + wht = [255] * 3 +** Processing line: ~ red = [255, 0, 0]~ +- Inside source: true +*** True Line Result + red = [255, 0, 0] +** Processing line: ~ blu = [0, 130, 255]~ +- Inside source: true +*** True Line Result + blu = [0, 130, 255] +** Processing line: ~ purp = [150, 80, 255]~ +- Inside source: true +*** True Line Result + purp = [150, 80, 255] +** Processing line: ~~ +- Inside source: true +*** True Line Result + +** Processing line: ~ TICK {~ +- Inside source: true +*** True Line Result + TICK { +** Processing line: ~ bg! 0~ +- Inside source: true +*** True Line Result + bg! 0 +** Processing line: ~~ +- Inside source: true +*** True Line Result + +** Processing line: ~ slds << [0, 0, 3, 3, 0, 255, 0, 255]~ +- Inside source: true +*** True Line Result + slds << [0, 0, 3, 3, 0, 255, 0, 255] +** Processing line: ~~ +- Inside source: true +*** True Line Result + +** Processing line: ~ sld! 10, 10~ +- Inside source: true +*** True Line Result + sld! 10, 10 +** Processing line: ~ sld! 20, 20, 3, 2~ +- Inside source: true +*** True Line Result + sld! 20, 20, 3, 2 +** Processing line: ~ sld! 30, 30, 2, 2, red~ +- Inside source: true +*** True Line Result + sld! 30, 30, 2, 2, red +** Processing line: ~ sld! 35, 35, blu~ +- Inside source: true +*** True Line Result + sld! 35, 35, blu +** Processing line: ~~ +- Inside source: true +*** True Line Result + +** Processing line: ~ slds! 40, 40~ +- Inside source: true +*** True Line Result + slds! 40, 40 +** Processing line: ~~ +- Inside source: true +*** True Line Result + +** Processing line: ~ slds! [50, 50],~ +- Inside source: true +*** True Line Result + slds! [50, 50], +** Processing line: ~ [60, 60, purp],~ +- Inside source: true +*** True Line Result + [60, 60, purp], +** Processing line: ~ [70, 70, 10, 10, wht],~ +- Inside source: true +*** True Line Result + [70, 70, 10, 10, wht], +** Processing line: ~ [80, 80, 4, 4, 255, 0, 255]~ +- Inside source: true +*** True Line Result + [80, 80, 4, 4, 255, 0, 255] +** Processing line: ~ }~ +- Inside source: true +*** True Line Result + } +** Processing line: ~ =end~ +- Inside source: true +*** True Line Result + =end +** Processing line: ~~ +- Inside source: true +*** True Line Result + ** Processing line: ~#+end_src~ - Line was identified as the end of a code block. *** True Line Result @@ -192219,6 +199359,28 @@ Follows is a source code listing for all files that have been open sourced. This - Formatting line: ~Hides the mouse cursor.~ - Line's tilde count is: 0 - Line contains link marker: false +** Processing line: ~*** ~.set_cursor path, dx, dy~~ +- H3 detected. +- Determining if line is a header. +- Line contains ~*** ~... gsub-ing empty string +- Formatting line: ~~.set_cursor path, dx, dy~~ +- Line's tilde count is: 2 +- Line contains link marker: false +- CODE detected. +- Determining if line is a header. +- Line contains ~*** ~... gsub-ing empty string +- Formatting line: ~~.set_cursor path, dx, dy~~ +- Line's tilde count is: 2 +- Line contains link marker: false +- CODE detected. +** Processing line: ~Sets the system cursor to a sprite ~path~ with an offset of ~dx~ and ~dy~.~ +- P detected. +- Determining if line is a header. +- Line does not appear to be a header. +- Formatting line: ~Sets the system cursor to a sprite ~path~ with an offset of ~dx~ and ~dy~.~ +- Line's tilde count is: 6 +- Line contains link marker: false +- CODE detected. ** Processing line: ~*** ~.cursor_shown?~~ - H3 detected. - Determining if line is a header. @@ -192397,6 +199559,50 @@ Follows is a source code listing for all files that have been open sourced. This - PRE end detected. ** Processing line: ~~ ** Processing line: ~~ +** Processing line: ~* DOCS: ~GTK::Runtime#benchmark~~ +- H1 detected. +- Determining if line is a header. +- Line contains ~* ~... gsub-ing empty string +- Formatting line: ~DOCS: ~GTK::Runtime#benchmark~~ +- Line's tilde count is: 2 +- Line contains link marker: false +- CODE detected. +** Processing line: ~You can use this function to compare the relative performance of methods.~ +- P detected. +- Determining if line is a header. +- Line does not appear to be a header. +- Formatting line: ~You can use this function to compare the relative performance of methods.~ +- Line's tilde count is: 0 +- Line contains link marker: false +** Processing line: ~~ +** Processing line: ~#+begin_src ruby~ +- PRE start detected. +** Processing line: ~ def tick args~ +** Processing line: ~ # press r to run benchmark~ +** Processing line: ~ if args.inputs.keyboard.key_down.r~ +** Processing line: ~ args.gtk.console.show~ +** Processing line: ~ args.gtk.benchmark iterations: 1000, # number of iterations~ +** Processing line: ~ # label for experiment~ +** Processing line: ~ using_numeric_map: -> () {~ +** Processing line: ~ # experiment body~ +** Processing line: ~ v = 100.map do |i|~ +** Processing line: ~ i * 100~ +** Processing line: ~ end~ +** Processing line: ~ },~ +** Processing line: ~ # label for experiment~ +** Processing line: ~ using_numeric_times: -> () {~ +** Processing line: ~ # experiment body~ +** Processing line: ~ v = []~ +** Processing line: ~ 100.times do |i|~ +** Processing line: ~ v << i * 100~ +** Processing line: ~ end~ +** Processing line: ~ }~ +** Processing line: ~ end~ +** Processing line: ~ end~ +** Processing line: ~#+end_src~ +- PRE end detected. +** Processing line: ~~ +** Processing line: ~~ ** Processing line: ~* DOCS: ~Array~~ - H1 detected. - Determining if line is a header. @@ -196288,7 +203494,7 @@ Follows is a source code listing for all files that have been open sourced. This ** Processing line: ~ # Use args.inputs.mouse.click.created_at~ ** Processing line: ~~ ** Processing line: ~ # To see how many frames its been since the click occurred~ -** Processing line: ~ # Use args.inputs.mouse.click.creat_at_elapsed~ +** Processing line: ~ # Use args.inputs.mouse.click.created_at_elapsed~ ** Processing line: ~~ ** Processing line: ~ # Saving the click in args.state can be quite useful~ ** Processing line: ~~ @@ -199139,17 +206345,17 @@ Follows is a source code listing for all files that have been open sourced. This ** Processing line: ~ end~ ** Processing line: ~~ ** Processing line: ~ def calc_player_dx~ -** Processing line: ~ player.y += player.dy~ -** Processing line: ~ player.dy += state.gravity~ -** Processing line: ~ player.dy += player.dy * state.drag ** 2 * -1~ -** Processing line: ~ end~ -** Processing line: ~~ -** Processing line: ~ def calc_player_dy~ ** Processing line: ~ player.dx = player.dx.clamp(-5, 5)~ ** Processing line: ~ player.dx *= 0.9~ ** Processing line: ~ player.x += player.dx~ ** Processing line: ~ end~ ** Processing line: ~~ +** Processing line: ~ def calc_player_dy~ +** Processing line: ~ player.y += player.dy~ +** Processing line: ~ player.dy += state.gravity~ +** Processing line: ~ player.dy += player.dy * state.drag ** 2 * -1~ +** Processing line: ~ end~ +** Processing line: ~~ ** Processing line: ~ def reset_player~ ** Processing line: ~ player.x = 100~ ** Processing line: ~ player.y = 720~ @@ -199308,8 +206514,7 @@ Follows is a source code listing for all files that have been open sourced. This ** Processing line: ~ input~ ** Processing line: ~ end~ ** Processing line: ~~ -** Processing line: ~ # Sets default values~ -** Processing line: ~ def defaults~ +** Processing line: ~ def init_game~ ** Processing line: ~ s.platforms ||= [ # initializes platforms collection with two platforms using hashes~ ** Processing line: ~ new_platform(x: 0, y: 0, w: 700, h: 32, dx: 1, speed: 0, rect: nil),~ ** Processing line: ~ new_platform(x: 0, y: 300, w: 700, h: 32, dx: 1, speed: 0, rect: nil), # 300 pixels higher~ @@ -199332,6 +206537,11 @@ Follows is a source code listing for all files that have been open sourced. This ** Processing line: ~ s.camera ||= { y: -100 } # shows view on screen (as the player moves upward, the camera does too)~ ** Processing line: ~ end~ ** Processing line: ~~ +** Processing line: ~ # Sets default values~ +** Processing line: ~ def defaults~ +** Processing line: ~ init_game~ +** Processing line: ~ end~ +** Processing line: ~~ ** Processing line: ~ # Outputs objects onto the screen~ ** Processing line: ~ def render~ ** Processing line: ~ outputs.solids << s.platforms.map do |p| # outputs platforms onto screen~ @@ -199419,7 +206629,9 @@ Follows is a source code listing for all files that have been open sourced. This ** Processing line: ~ rect: nil)~ ** Processing line: ~ end~ ** Processing line: ~ else~ +** Processing line: ~ # game over~ ** Processing line: ~ s.as_hash.clear # otherwise clear the hash (no new platform is necessary)~ +** Processing line: ~ init_game~ ** Processing line: ~ end~ ** Processing line: ~ end~ ** Processing line: ~~ @@ -202435,12 +209647,23 @@ Follows is a source code listing for all files that have been open sourced. This ** Processing line: ~ # Starts the game with player x's turn and creates an array (to_a) for space combinations.~ ** Processing line: ~ # Calls methods necessary for the game to run properly.~ ** Processing line: ~ def tick~ -** Processing line: ~ state.current_turn ||= :x~ -** Processing line: ~ state.space_combinations = [-1, 0, 1].product([-1, 0, 1]).to_a~ +** Processing line: ~ init_new_game~ ** Processing line: ~ render_board~ ** Processing line: ~ input_board~ ** Processing line: ~ end~ ** Processing line: ~~ +** Processing line: ~ def init_new_game~ +** Processing line: ~ state.current_turn ||= :x~ +** Processing line: ~ state.space_combinations ||= [-1, 0, 1].product([-1, 0, 1]).to_a~ +** Processing line: ~~ +** Processing line: ~ state.spaces ||= {}~ +** Processing line: ~~ +** Processing line: ~ state.space_combinations.each do |x, y|~ +** Processing line: ~ state.spaces[x] ||= {}~ +** Processing line: ~ state.spaces[x][y] ||= state.new_entity(:space)~ +** Processing line: ~ end~ +** Processing line: ~ end~ +** Processing line: ~~ ** Processing line: ~ # Uses borders to create grid squares for the game's board. Also outputs the game pieces using labels.~ ** Processing line: ~ def render_board~ ** Processing line: ~ square_size = 80~ @@ -202516,6 +209739,7 @@ Follows is a source code listing for all files that have been open sourced. This ** Processing line: ~ def input_restart_game~ ** Processing line: ~ return unless state.game_over~ ** Processing line: ~ gtk.reset~ +** Processing line: ~ init_new_game~ ** Processing line: ~ end~ ** Processing line: ~~ ** Processing line: ~ # Checks if x or o won the game.~ @@ -202847,7 +210071,7 @@ Follows is a source code listing for all files that have been open sourced. This ** Processing line: ~ def calc_kill_zombie~ ** Processing line: ~~ ** Processing line: ~ # Find all zombies that intersect with the player. They are considered killed.~ -** Processing line: ~ killed_this_frame = state.zombies.find_all { |z| z.sprite.intersect_rect? state.player_sprite }~ +** Processing line: ~ killed_this_frame = state.zombies.find_all { |z| z.sprite && (z.sprite.intersect_rect? state.player_sprite) }~ ** Processing line: ~ state.zombies = state.zombies - killed_this_frame # remove newly killed zombies from zombies collection~ ** Processing line: ~ state.killed_zombies += killed_this_frame # add newly killed zombies to killed zombies~ ** Processing line: ~~ @@ -203811,6 +211035,7 @@ Follows is a source code listing for all files that have been open sourced. This ** Processing line: ~ end~ ** Processing line: ~~ ** Processing line: ~ def playtime_str t~ +** Processing line: ~ return "" unless t~ ** Processing line: ~ minutes = (t / 60.0).floor~ ** Processing line: ~ seconds = t - (minutes * 60.0).to_f~ ** Processing line: ~ return minutes.to_s + ':' + seconds.floor.to_s + ((seconds - seconds.floor).to_s + "000")[1..3]~ @@ -203923,7 +211148,7 @@ Follows is a source code listing for all files that have been open sourced. This ** Processing line: ~ results.playtime_slider_rect = progress_bar(args: args,~ ** Processing line: ~ row: 2.5,~ ** Processing line: ~ col: 2,~ -** Processing line: ~ percentage: audio_entry.playtime / audio_entry.length_,~ +** Processing line: ~ percentage: (audio_entry.playtime || 1) / (audio_entry.length_ || 1),~ ** Processing line: ~ text: "#{playtime_str(audio_entry.playtime)} / #{playtime_str(audio_entry.length_)}")~ ** Processing line: ~~ ** Processing line: ~ results.primitives << results.playtime_slider_rect.primitives~ @@ -204060,7 +211285,7 @@ Follows is a source code listing for all files that have been open sourced. This ** Processing line: ~ args.state.sound_files ||= [~ ** Processing line: ~ { name: :tada, path: "sounds/tada.wav" },~ ** Processing line: ~ { name: :splash, path: "sounds/splash.wav" },~ -** Processing line: ~ { name: :drum, path: "sounds/drum.wav" },~ +** Processing line: ~ { name: :drum, path: "sounds/drum.mp3" },~ ** Processing line: ~ { name: :spring, path: "sounds/spring.wav" },~ ** Processing line: ~ { name: :music, path: "sounds/music.ogg" }~ ** Processing line: ~ ]~ @@ -204140,36 +211365,6 @@ Follows is a source code listing for all files that have been open sourced. This - PRE end detected. ** Processing line: ~~ ** Processing line: ~~ -** Processing line: ~*** Advanced Audio - Audio Mixer - Metadata - ios_metadata.txt~ -- H3 detected. -- Determining if line is a header. -- Line contains ~*** ~... gsub-ing empty string -- Formatting line: ~Advanced Audio - Audio Mixer - Metadata - ios_metadata.txt~ -- Line's tilde count is: 0 -- Line contains link marker: false -- Determining if line is a header. -- Line contains ~*** ~... gsub-ing empty string -- Formatting line: ~Advanced Audio - Audio Mixer - Metadata - ios_metadata.txt~ -- Line's tilde count is: 0 -- Line contains link marker: false -** Processing line: ~~ -** Processing line: ~#+begin_src ruby~ -- PRE start detected. -** Processing line: ~ # ./samples/07_advanced_audio/01_audio_mixer/metadata/ios_metadata.txt~ -** Processing line: ~ # ios_metadata.txt is used by the Pro version of DragonRuby Game Toolkit to create iOS apps.~ -** Processing line: ~ # Information about the Pro version can be found at: http://dragonruby.org/toolkit/game#purchase~ -** Processing line: ~~ -** Processing line: ~ # teamid needs to be set to your assigned Team Id which can be found at https://developer.apple.com/account/#/membership/~ -** Processing line: ~ teamid=~ -** Processing line: ~ # appid needs to be set to your application identifier which can be found at https://developer.apple.com/account/resources/identifiers/list~ -** Processing line: ~ appid=~ -** Processing line: ~ # appname is the name you want to show up underneath the app icon on the device. Keep it under 10 characters.~ -** Processing line: ~ appname=~ -** Processing line: ~~ -** Processing line: ~#+end_src~ -- PRE end detected. -** Processing line: ~~ -** Processing line: ~~ ** Processing line: ~*** Advanced Audio - Sound Synthesis - main.rb~ - H3 detected. - Determining if line is a header. @@ -204784,6 +211979,168 @@ Follows is a source code listing for all files that have been open sourced. This - PRE end detected. ** Processing line: ~~ ** Processing line: ~~ +** Processing line: ~*** Advanced Rendering - Labels With Wrapped Text - main.rb~ +- H3 detected. +- Determining if line is a header. +- Line contains ~*** ~... gsub-ing empty string +- Formatting line: ~Advanced Rendering - Labels With Wrapped Text - main.rb~ +- Line's tilde count is: 0 +- Line contains link marker: false +- Determining if line is a header. +- Line contains ~*** ~... gsub-ing empty string +- Formatting line: ~Advanced Rendering - Labels With Wrapped Text - main.rb~ +- Line's tilde count is: 0 +- Line contains link marker: false +** Processing line: ~~ +** Processing line: ~#+begin_src ruby~ +- PRE start detected. +** Processing line: ~ # ./samples/07_advanced_rendering/00_labels_with_wrapped_text/app/main.rb~ +** Processing line: ~ def tick args~ +** Processing line: ~ # defaults~ +** Processing line: ~ args.state.scroll_location ||= 0~ +** Processing line: ~ args.state.textbox.messages ||= []~ +** Processing line: ~ args.state.textbox.scroll ||= 0~ +** Processing line: ~~ +** Processing line: ~ # render~ +** Processing line: ~ args.outputs.background_color = [0, 0, 0, 255]~ +** Processing line: ~ render_messages args~ +** Processing line: ~ render_instructions args~ +** Processing line: ~~ +** Processing line: ~ # inputs~ +** Processing line: ~ if args.inputs.keyboard.key_down.one~ +** Processing line: ~ queue_message args, "Hello there neighbour! my name is mark, how is your day today?"~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ if args.inputs.keyboard.key_down.two~ +** Processing line: ~ queue_message args, "I'm doing great sir, actually I'm having a picnic today"~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ if args.inputs.keyboard.key_down.three~ +** Processing line: ~ queue_message args, "Well that sounds wonderful!"~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ if args.inputs.keyboard.key_down.home~ +** Processing line: ~ args.state.scroll_location = 1~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ if args.inputs.keyboard.key_down.delete~ +** Processing line: ~ clear_message_queue args~ +** Processing line: ~ end~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ def queue_message args, msg~ +** Processing line: ~ args.state.textbox.messages.concat msg.wrapped_lines 50~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ def clear_message_queue args~ +** Processing line: ~ args.state.textbox.messages = nil~ +** Processing line: ~ args.state.textbox.scroll = 0~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ def render_messages args~ +** Processing line: ~ args.outputs[:textbox].w = 400~ +** Processing line: ~ args.outputs[:textbox].h = 720~ +** Processing line: ~~ +** Processing line: ~ args.outputs.primitives << args.state.textbox.messages.each_with_index.map do |s, idx|~ +** Processing line: ~ {~ +** Processing line: ~ x: 0,~ +** Processing line: ~ y: 20 * (args.state.textbox.messages.size - idx) + args.state.textbox.scroll * 20,~ +** Processing line: ~ text: s,~ +** Processing line: ~ size_enum: -3,~ +** Processing line: ~ alignment_enum: 0,~ +** Processing line: ~ r: 255, g:255, b: 255, a: 255~ +** Processing line: ~ }~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ args.outputs[:textbox].labels << args.state.textbox.messages.each_with_index.map do |s, idx|~ +** Processing line: ~ {~ +** Processing line: ~ x: 0,~ +** Processing line: ~ y: 20 * (args.state.textbox.messages.size - idx) + args.state.textbox.scroll * 20,~ +** Processing line: ~ text: s,~ +** Processing line: ~ size_enum: -3,~ +** Processing line: ~ alignment_enum: 0,~ +** Processing line: ~ r: 255, g:255, b: 255, a: 255~ +** Processing line: ~ }~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ args.outputs[:textbox].borders << [0, 0, args.outputs[:textbox].w, 720]~ +** Processing line: ~~ +** Processing line: ~ args.state.textbox.scroll += args.inputs.mouse.wheel.y unless args.inputs.mouse.wheel.nil?~ +** Processing line: ~~ +** Processing line: ~ if args.state.scroll_location > 0~ +** Processing line: ~ args.state.textbox.scroll = 0~ +** Processing line: ~ args.state.scroll_location = 0~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ args.outputs.sprites << [900, 0, args.outputs[:textbox].w, 720, :textbox]~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ def render_instructions args~ +** Processing line: ~ args.outputs.labels << [30,~ +** Processing line: ~ 30.from_top,~ +** Processing line: ~ "press 1, 2, 3 to display messages, MOUSE WHEEL to scroll, HOME to go to top, BACKSPACE to delete.",~ +** Processing line: ~ 0, 255, 255]~ +** Processing line: ~~ +** Processing line: ~ args.outputs.primitives << [0, 55.from_top, 1280, 30, :pixel, 0, 255, 0, 0, 0].sprite~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~#+end_src~ +- PRE end detected. +** Processing line: ~~ +** Processing line: ~~ +** Processing line: ~*** Advanced Rendering - Rotating Label - main.rb~ +- H3 detected. +- Determining if line is a header. +- Line contains ~*** ~... gsub-ing empty string +- Formatting line: ~Advanced Rendering - Rotating Label - main.rb~ +- Line's tilde count is: 0 +- Line contains link marker: false +- Determining if line is a header. +- Line contains ~*** ~... gsub-ing empty string +- Formatting line: ~Advanced Rendering - Rotating Label - main.rb~ +- Line's tilde count is: 0 +- Line contains link marker: false +** Processing line: ~~ +** Processing line: ~#+begin_src ruby~ +- PRE start detected. +** Processing line: ~ # ./samples/07_advanced_rendering/00_rotating_label/app/main.rb~ +** Processing line: ~ def tick args~ +** Processing line: ~ # set the render target width and height to match the label~ +** Processing line: ~ args.outputs[:scene].w = 220~ +** Processing line: ~ args.outputs[:scene].h = 30~ +** Processing line: ~~ +** Processing line: ~~ +** Processing line: ~ # make the background transparent~ +** Processing line: ~ args.outputs[:scene].background_color = [255, 255, 255, 0]~ +** Processing line: ~~ +** Processing line: ~ # set the blendmode of the label to 0 (no blending)~ +** Processing line: ~ # center it inside of the scene~ +** Processing line: ~ # set the vertical_alignment_enum to 1 (center)~ +** Processing line: ~ args.outputs[:scene].labels << { x: 0,~ +** Processing line: ~ y: 15,~ +** Processing line: ~ text: "label in render target",~ +** Processing line: ~ blendmode_enum: 0,~ +** Processing line: ~ vertical_alignment_enum: 1 }~ +** Processing line: ~~ +** Processing line: ~ # add a border to the render target~ +** Processing line: ~ args.outputs[:scene].borders << { x: 0,~ +** Processing line: ~ y: 0,~ +** Processing line: ~ w: args.outputs[:scene].w,~ +** Processing line: ~ h: args.outputs[:scene].h }~ +** Processing line: ~~ +** Processing line: ~ # add the rendertarget to the main output as a sprite~ +** Processing line: ~ args.outputs.sprites << { x: 640 - args.outputs[:scene].w.half,~ +** Processing line: ~ y: 360 - args.outputs[:scene].h.half,~ +** Processing line: ~ w: args.outputs[:scene].w,~ +** Processing line: ~ h: args.outputs[:scene].h,~ +** Processing line: ~ angle: args.state.tick_count,~ +** Processing line: ~ path: :scene }~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~#+end_src~ +- PRE end detected. +** Processing line: ~~ +** Processing line: ~~ ** Processing line: ~*** Advanced Rendering - Simple Render Targets - main.rb~ - H3 detected. - Determining if line is a header. @@ -206155,6 +213512,7 @@ Follows is a source code listing for all files that have been open sourced. This ** Processing line: ~ default_camera(0,0,1280,720)~ ** Processing line: ~ end~ ** Processing line: ~~ +** Processing line: ~~ ** Processing line: ~ def new_room~ ** Processing line: ~ default_floor_tile(0,0,1024,1024,'sprites/rooms/camera_room.png')~ ** Processing line: ~ end~ @@ -207410,6 +214768,109 @@ Follows is a source code listing for all files that have been open sourced. This - PRE end detected. ** Processing line: ~~ ** Processing line: ~~ +** Processing line: ~*** Performance - Sprites As Struct - main.rb~ +- H3 detected. +- Determining if line is a header. +- Line contains ~*** ~... gsub-ing empty string +- Formatting line: ~Performance - Sprites As Struct - main.rb~ +- Line's tilde count is: 0 +- Line contains link marker: false +- Determining if line is a header. +- Line contains ~*** ~... gsub-ing empty string +- Formatting line: ~Performance - Sprites As Struct - main.rb~ +- Line's tilde count is: 0 +- Line contains link marker: false +** Processing line: ~~ +** Processing line: ~#+begin_src ruby~ +- PRE start detected. +** Processing line: ~ # ./samples/09_performance/03_sprites_as_struct/app/main.rb~ +** Processing line: ~ # create a Struct variant that allows for named parameters on construction.~ +** Processing line: ~ class NamedStruct < Struct~ +** Processing line: ~ def initialize **opts~ +** Processing line: ~ super(*members.map { |k| opts[k] })~ +** Processing line: ~ end~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ # create a Star NamedStruct~ +** Processing line: ~ Star = NamedStruct.new(:x, :y, :w, :h, :path, :s,~ +** Processing line: ~ :angle, :angle_anchor_x, :angle_anchor_y,~ +** Processing line: ~ :r, :g, :b, :a,~ +** Processing line: ~ :tile_x, :tile_y,~ +** Processing line: ~ :tile_w, :tile_h,~ +** Processing line: ~ :source_x, :source_y,~ +** Processing line: ~ :source_w, :source_h,~ +** Processing line: ~ :flip_horizontally, :flip_vertically,~ +** Processing line: ~ :blendmode_enum)~ +** Processing line: ~~ +** Processing line: ~ # Sprites represented as Structs. They require a little bit more code than Hashes,~ +** Processing line: ~ # but are the a little faster to render too.~ +** Processing line: ~ def random_x args~ +** Processing line: ~ (args.grid.w.randomize :ratio) * -1~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ def random_y args~ +** Processing line: ~ (args.grid.h.randomize :ratio) * -1~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ def random_speed~ +** Processing line: ~ 1 + (4.randomize :ratio)~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ def new_star args~ +** Processing line: ~ Star.new x: (random_x args),~ +** Processing line: ~ y: (random_y args),~ +** Processing line: ~ w: 4, h: 4,~ +** Processing line: ~ path: 'sprites/tiny-star.png',~ +** Processing line: ~ s: random_speed~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ def move_star args, star~ +** Processing line: ~ star.x += star[:s]~ +** Processing line: ~ star.y += star[:s]~ +** Processing line: ~ if star.x > args.grid.w || star.y > args.grid.h~ +** Processing line: ~ star.x = (random_x args)~ +** Processing line: ~ star.y = (random_y args)~ +** Processing line: ~ star[:s] = random_speed~ +** Processing line: ~ end~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ def tick args~ +** Processing line: ~ args.state.star_count ||= 0~ +** Processing line: ~~ +** Processing line: ~ # sets console command when sample app initially opens~ +** Processing line: ~ if Kernel.global_tick_count == 0~ +** Processing line: ~ puts ""~ +** Processing line: ~ puts ""~ +** Processing line: ~ puts "========================================================="~ +** Processing line: ~ puts "* INFO: Sprites, Structs"~ +** Processing line: ~ puts "* INFO: Please specify the number of sprites to render."~ +** Processing line: ~ args.gtk.console.set_command "reset_with count: 100"~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ # init~ +** Processing line: ~ if args.state.tick_count == 0~ +** Processing line: ~ args.state.stars = args.state.star_count.map { |i| new_star args }~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ # update~ +** Processing line: ~ args.state.stars.each { |s| move_star args, s }~ +** Processing line: ~~ +** Processing line: ~ # render~ +** Processing line: ~ args.outputs.sprites << args.state.stars~ +** Processing line: ~ args.outputs.background_color = [0, 0, 0]~ +** Processing line: ~ args.outputs.primitives << args.gtk.current_framerate_primitives~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ # resets game, and assigns star count given by user~ +** Processing line: ~ def reset_with count: count~ +** Processing line: ~ $gtk.reset~ +** Processing line: ~ $gtk.args.state.star_count = count~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~#+end_src~ +- PRE end detected. +** Processing line: ~~ +** Processing line: ~~ ** Processing line: ~*** Performance - Sprites As Strict Entities - main.rb~ - H3 detected. - Determining if line is a header. @@ -207425,7 +214886,7 @@ Follows is a source code listing for all files that have been open sourced. This ** Processing line: ~~ ** Processing line: ~#+begin_src ruby~ - PRE start detected. -** Processing line: ~ # ./samples/09_performance/03_sprites_as_strict_entities/app/main.rb~ +** Processing line: ~ # ./samples/09_performance/04_sprites_as_strict_entities/app/main.rb~ ** Processing line: ~ # Sprites represented as StrictEntities using the queue ~args.outputs.sprites~~ ** Processing line: ~ # yields apis access similar to Entities, but all properties that can be set on the~ ** Processing line: ~ # entity must be predefined with a default value. Strict entities do not support the~ @@ -207518,7 +214979,7 @@ Follows is a source code listing for all files that have been open sourced. This ** Processing line: ~~ ** Processing line: ~#+begin_src ruby~ - PRE start detected. -** Processing line: ~ # ./samples/09_performance/04_sprites_as_classes/app/main.rb~ +** Processing line: ~ # ./samples/09_performance/05_sprites_as_classes/app/main.rb~ ** Processing line: ~ # Sprites represented as Classes using the queue ~args.outputs.sprites~.~ ** Processing line: ~ # gives you full control of property declaration and method invocation.~ ** Processing line: ~ # They are more performant than OpenEntities and StrictEntities, but more code upfront.~ @@ -207594,7 +215055,7 @@ Follows is a source code listing for all files that have been open sourced. This ** Processing line: ~~ ** Processing line: ~#+begin_src ruby~ - PRE start detected. -** Processing line: ~ # ./samples/09_performance/05_static_sprites_as_classes/app/main.rb~ +** Processing line: ~ # ./samples/09_performance/06_static_sprites_as_classes/app/main.rb~ ** Processing line: ~ # Sprites represented as Classes using the queue ~args.outputs.static_sprites~.~ ** Processing line: ~ # bypasses the queue behavior of ~args.outputs.sprites~. All instances are held~ ** Processing line: ~ # by reference. You get better performance, but you are mutating state of held objects~ @@ -207671,7 +215132,7 @@ Follows is a source code listing for all files that have been open sourced. This ** Processing line: ~~ ** Processing line: ~#+begin_src ruby~ - PRE start detected. -** Processing line: ~ # ./samples/09_performance/06_static_sprites_as_classes_with_custom_drawing/app/main.rb~ +** Processing line: ~ # ./samples/09_performance/07_static_sprites_as_classes_with_custom_drawing/app/main.rb~ ** Processing line: ~ # Sprites represented as Classes, with a draw_override method, and using the queue ~args.outputs.static_sprites~.~ ** Processing line: ~ # is the fastest approach. This is comparable to what other game engines set as the default behavior.~ ** Processing line: ~ # There are tradeoffs for all this speed if the creation of a full blown class, and bypassing~ @@ -207780,7 +215241,7 @@ Follows is a source code listing for all files that have been open sourced. This ** Processing line: ~~ ** Processing line: ~#+begin_src ruby~ - PRE start detected. -** Processing line: ~ # ./samples/09_performance/07_collision_limits/app/main.rb~ +** Processing line: ~ # ./samples/09_performance/08_collision_limits/app/main.rb~ ** Processing line: ~ =begin~ ** Processing line: ~~ ** Processing line: ~ Reminders:~ @@ -207841,6 +215302,46 @@ Follows is a source code listing for all files that have been open sourced. This - PRE end detected. ** Processing line: ~~ ** Processing line: ~~ +** Processing line: ~*** Advanced Debugging - Logging - main.rb~ +- H3 detected. +- Determining if line is a header. +- Line contains ~*** ~... gsub-ing empty string +- Formatting line: ~Advanced Debugging - Logging - main.rb~ +- Line's tilde count is: 0 +- Line contains link marker: false +- Determining if line is a header. +- Line contains ~*** ~... gsub-ing empty string +- Formatting line: ~Advanced Debugging - Logging - main.rb~ +- Line's tilde count is: 0 +- Line contains link marker: false +** Processing line: ~~ +** Processing line: ~#+begin_src ruby~ +- PRE start detected. +** Processing line: ~ # ./samples/10_advanced_debugging/00_logging/app/main.rb~ +** Processing line: ~ def tick args~ +** Processing line: ~ args.outputs.background_color = [255, 255, 255, 0]~ +** Processing line: ~ if args.state.tick_count == 0~ +** Processing line: ~ args.gtk.log_spam "log level spam"~ +** Processing line: ~ args.gtk.log_debug "log level debug"~ +** Processing line: ~ args.gtk.log_info "log level info"~ +** Processing line: ~ args.gtk.log_warn "log level warn"~ +** Processing line: ~ args.gtk.log_error "log level error"~ +** Processing line: ~ args.gtk.log_unfiltered "log level unfiltered"~ +** Processing line: ~ puts "This is a puts call"~ +** Processing line: ~ args.gtk.console.show~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ if args.state.tick_count == 60~ +** Processing line: ~ puts "This is a puts call on tick 60"~ +** Processing line: ~ elsif args.state.tick_count == 120~ +** Processing line: ~ puts "This is a puts call on tick 120"~ +** Processing line: ~ end~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~#+end_src~ +- PRE end detected. +** Processing line: ~~ +** Processing line: ~~ ** Processing line: ~*** Advanced Debugging - Trace Debugging - main.rb~ - H3 detected. - Determining if line is a header. @@ -209222,11 +216723,13 @@ Follows is a source code listing for all files that have been open sourced. This ** Processing line: ~#+begin_src ruby~ - PRE start detected. ** Processing line: ~ # ./samples/11_http/01_retrieve_images/app/main.rb~ +** Processing line: ~ $gtk.register_cvar 'app.warn_seconds', "seconds to wait before starting", :uint, 11~ +** Processing line: ~~ ** Processing line: ~ def tick args~ ** Processing line: ~ args.outputs.background_color = [0, 0, 0]~ ** Processing line: ~~ ** Processing line: ~ # Show a warning at the start.~ -** Processing line: ~ args.state.warning_debounce ||= 11 * 60~ +** Processing line: ~ args.state.warning_debounce ||= args.cvars['app.warn_seconds'].value * 60~ ** Processing line: ~ if args.state.warning_debounce > 0~ ** Processing line: ~ args.state.warning_debounce -= 1~ ** Processing line: ~ args.outputs.labels << [640, 600, "This app shows random images from the Internet.", 10, 1, 255, 255, 255]~ @@ -209280,24 +216783,25 @@ Follows is a source code listing for all files that have been open sourced. This - PRE end detected. ** Processing line: ~~ ** Processing line: ~~ -** Processing line: ~*** Http - Web Server - main.rb~ +** Processing line: ~*** Http - In Game Web Server Http Get - main.rb~ - H3 detected. - Determining if line is a header. - Line contains ~*** ~... gsub-ing empty string -- Formatting line: ~Http - Web Server - main.rb~ +- Formatting line: ~Http - In Game Web Server Http Get - main.rb~ - Line's tilde count is: 0 - Line contains link marker: false - Determining if line is a header. - Line contains ~*** ~... gsub-ing empty string -- Formatting line: ~Http - Web Server - main.rb~ +- Formatting line: ~Http - In Game Web Server Http Get - main.rb~ - Line's tilde count is: 0 - Line contains link marker: false ** Processing line: ~~ ** Processing line: ~#+begin_src ruby~ - PRE start detected. -** Processing line: ~ # ./samples/11_http/02_web_server/app/main.rb~ +** Processing line: ~ # ./samples/11_http/02_in_game_web_server_http_get/app/main.rb~ ** Processing line: ~ def tick args~ ** Processing line: ~ args.state.port ||= 3000~ +** Processing line: ~ args.state.reqnum ||= 0~ ** Processing line: ~ # by default the embedded webserver runs on port 9001 (the port number is over 9000) and is disabled in a production build~ ** Processing line: ~ # to enable the http server in a production build, you need to manually start~ ** Processing line: ~ # the server up:~ @@ -209328,6 +216832,99 @@ Follows is a source code listing for all files that have been open sourced. This - PRE end detected. ** Processing line: ~~ ** Processing line: ~~ +** Processing line: ~*** Http - In Game Web Server Http Post - main.rb~ +- H3 detected. +- Determining if line is a header. +- Line contains ~*** ~... gsub-ing empty string +- Formatting line: ~Http - In Game Web Server Http Post - main.rb~ +- Line's tilde count is: 0 +- Line contains link marker: false +- Determining if line is a header. +- Line contains ~*** ~... gsub-ing empty string +- Formatting line: ~Http - In Game Web Server Http Post - main.rb~ +- Line's tilde count is: 0 +- Line contains link marker: false +** Processing line: ~~ +** Processing line: ~#+begin_src ruby~ +- PRE start detected. +** Processing line: ~ # ./samples/11_http/03_in_game_web_server_http_post/app/main.rb~ +** Processing line: ~ def tick args~ +** Processing line: ~ # defaults~ +** Processing line: ~ args.state.post_button = args.layout.rect(row: 0, col: 0, w: 5, h: 1).merge(text: "execute http_post")~ +** Processing line: ~ args.state.post_body_button = args.layout.rect(row: 1, col: 0, w: 5, h: 1).merge(text: "execute http_post_body")~ +** Processing line: ~ args.state.request_to_s ||= ""~ +** Processing line: ~ args.state.request_body ||= ""~ +** Processing line: ~~ +** Processing line: ~ # render~ +** Processing line: ~ args.state.post_button.yield_self do |b|~ +** Processing line: ~ args.outputs.borders << b~ +** Processing line: ~ args.outputs.labels << b.merge(text: b.text,~ +** Processing line: ~ y: b.y + 30,~ +** Processing line: ~ x: b.x + 10)~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ args.state.post_body_button.yield_self do |b|~ +** Processing line: ~ args.outputs.borders << b~ +** Processing line: ~ args.outputs.labels << b.merge(text: b.text,~ +** Processing line: ~ y: b.y + 30,~ +** Processing line: ~ x: b.x + 10)~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ draw_label args, 0, 6, "Request:", args.state.request_to_s~ +** Processing line: ~ draw_label args, 0, 14, "Request Body Unaltered:", args.state.request_body~ +** Processing line: ~~ +** Processing line: ~ # input~ +** Processing line: ~ if args.inputs.mouse.click~ +** Processing line: ~ # ============= HTTP_POST =============~ +** Processing line: ~ if (args.inputs.mouse.inside_rect? args.state.post_button)~ +** Processing line: ~ # ========= DATA TO SEND ===========~ +** Processing line: ~ form_fields = { "userId" => "#{Time.now.to_i}" }~ +** Processing line: ~ # ==================================~ +** Processing line: ~~ +** Processing line: ~ args.gtk.http_post "http://localhost:9001/testing",~ +** Processing line: ~ form_fields,~ +** Processing line: ~ ["Content-Type: application/x-www-form-urlencoded"]~ +** Processing line: ~~ +** Processing line: ~ args.gtk.notify! "http_post"~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ # ============= HTTP_POST_BODY =============~ +** Processing line: ~ if (args.inputs.mouse.inside_rect? args.state.post_body_button)~ +** Processing line: ~ # =========== DATA TO SEND ==============~ +** Processing line: ~ json = "{ \"userId\": \"#{Time.now.to_i}\"}"~ +** Processing line: ~ # ==================================~ +** Processing line: ~~ +** Processing line: ~ args.gtk.http_post_body "http://localhost:9001/testing",~ +** Processing line: ~ json,~ +** Processing line: ~ ["Content-Type: application/json", "Content-Length: #{json.length}"]~ +** Processing line: ~~ +** Processing line: ~ args.gtk.notify! "http_post_body"~ +** Processing line: ~ end~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ # calc~ +** Processing line: ~ args.inputs.http_requests.each do |r|~ +** Processing line: ~ puts "#{r}"~ +** Processing line: ~ if r.uri == "/testing"~ +** Processing line: ~ puts r~ +** Processing line: ~ args.state.request_to_s = "#{r}"~ +** Processing line: ~ args.state.request_body = r.raw_body~ +** Processing line: ~ r.respond 200, "ok"~ +** Processing line: ~ end~ +** Processing line: ~ end~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ def draw_label args, row, col, header, text~ +** Processing line: ~ label_pos = args.layout.rect(row: row, col: col, w: 0, h: 0)~ +** Processing line: ~ args.outputs.labels << "#{header}\n\n#{text}".wrapped_lines(80).map_with_index do |l, i|~ +** Processing line: ~ { x: label_pos.x, y: label_pos.y - (i * 15), text: l, size_enum: -2 }~ +** Processing line: ~ end~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~#+end_src~ +- PRE end detected. +** Processing line: ~~ +** Processing line: ~~ ** Processing line: ~*** C Extensions - Basics - main.rb~ - H3 detected. - Determining if line is a header. @@ -211360,7 +218957,7 @@ Follows is a source code listing for all files that have been open sourced. This ** Processing line: ~ end~ ** Processing line: ~~ ** Processing line: ~ # Every tick, new args are passed, and the Breadth First Search tick is called~ -** Processing line: ~ $breadcrumbs ||= Breadcrumbs.new(args)~ +** Processing line: ~ $breadcrumbs ||= Breadcrumbs.new~ ** Processing line: ~ $breadcrumbs.args = args~ ** Processing line: ~ $breadcrumbs.tick~ ** Processing line: ~ end~ @@ -212026,7 +219623,7 @@ Follows is a source code listing for all files that have been open sourced. This ** Processing line: ~ end~ ** Processing line: ~~ ** Processing line: ~ # Every tick, new args are passed, and the Breadth First Search tick is called~ -** Processing line: ~ $early_exit_breadth_first_search ||= EarlyExitBreadthFirstSearch.new(args)~ +** Processing line: ~ $early_exit_breadth_first_search ||= EarlyExitBreadthFirstSearch.new~ ** Processing line: ~ $early_exit_breadth_first_search.args = args~ ** Processing line: ~ $early_exit_breadth_first_search.tick~ ** Processing line: ~ end~ @@ -212891,7 +220488,7 @@ Follows is a source code listing for all files that have been open sourced. This ** Processing line: ~ end~ ** Processing line: ~~ ** Processing line: ~ # Every tick, new args are passed, and the Dijkstra tick method is called~ -** Processing line: ~ $movement_costs ||= Movement_Costs.new(args)~ +** Processing line: ~ $movement_costs ||= Movement_Costs.new~ ** Processing line: ~ $movement_costs.args = args~ ** Processing line: ~ $movement_costs.tick~ ** Processing line: ~ end~ @@ -213892,7 +221489,7 @@ Follows is a source code listing for all files that have been open sourced. This ** Processing line: ~ end~ ** Processing line: ~~ ** Processing line: ~ # Every tick, new args are passed, and the Breadth First Search tick is called~ -** Processing line: ~ $heuristic_with_walls ||= Heuristic_With_Walls.new(args)~ +** Processing line: ~ $heuristic_with_walls ||= Heuristic_With_Walls.new~ ** Processing line: ~ $heuristic_with_walls.args = args~ ** Processing line: ~ $heuristic_with_walls.tick~ ** Processing line: ~ end~ @@ -214926,7 +222523,7 @@ Follows is a source code listing for all files that have been open sourced. This ** Processing line: ~ end~ ** Processing line: ~~ ** Processing line: ~ # Every tick, new args are passed, and the Breadth First Search tick is called~ -** Processing line: ~ $heuristic ||= Heuristic.new(args)~ +** Processing line: ~ $heuristic ||= Heuristic.new~ ** Processing line: ~ $heuristic.args = args~ ** Processing line: ~ $heuristic.tick~ ** Processing line: ~ end~ @@ -215976,7 +223573,7 @@ Follows is a source code listing for all files that have been open sourced. This ** Processing line: ~ end~ ** Processing line: ~~ ** Processing line: ~ # Every tick, new args are passed, and the Breadth First Search tick is called~ -** Processing line: ~ $a_star_algorithm ||= A_Star_Algorithm.new(args)~ +** Processing line: ~ $a_star_algorithm ||= A_Star_Algorithm.new~ ** Processing line: ~ $a_star_algorithm.args = args~ ** Processing line: ~ $a_star_algorithm.tick~ ** Processing line: ~ end~ @@ -216574,6 +224171,378 @@ Follows is a source code listing for all files that have been open sourced. This - PRE end detected. ** Processing line: ~~ ** Processing line: ~~ +** Processing line: ~*** 3d - Yaw Pitch Roll - main.rb~ +- H3 detected. +- Determining if line is a header. +- Line contains ~*** ~... gsub-ing empty string +- Formatting line: ~3d - Yaw Pitch Roll - main.rb~ +- Line's tilde count is: 0 +- Line contains link marker: false +- Determining if line is a header. +- Line contains ~*** ~... gsub-ing empty string +- Formatting line: ~3d - Yaw Pitch Roll - main.rb~ +- Line's tilde count is: 0 +- Line contains link marker: false +** Processing line: ~~ +** Processing line: ~#+begin_src ruby~ +- PRE start detected. +** Processing line: ~ # ./samples/99_genre_3d/03_yaw_pitch_roll/app/main.rb~ +** Processing line: ~ class Game~ +** Processing line: ~ attr_gtk~ +** Processing line: ~~ +** Processing line: ~ def tick~ +** Processing line: ~ defaults~ +** Processing line: ~ render~ +** Processing line: ~ input~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ def matrix_mul m, v~ +** Processing line: ~ (hmap x: ((m.x.x * v.x) + (m.x.y * v.y) + (m.x.z * v.z) + (m.x.w * v.w)),~ +** Processing line: ~ y: ((m.y.x * v.x) + (m.y.y * v.y) + (m.y.z * v.z) + (m.y.w * v.w)),~ +** Processing line: ~ z: ((m.z.x * v.x) + (m.z.y * v.y) + (m.z.z * v.z) + (m.z.w * v.w)),~ +** Processing line: ~ w: ((m.w.x * v.x) + (m.w.y * v.y) + (m.w.z * v.z) + (m.w.w * v.w)))~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ def player_ship~ +** Processing line: ~ [~ +** Processing line: ~ # engine back~ +** Processing line: ~ { x: -1, y: -1, z: 1, w: 0 },~ +** Processing line: ~ { x: -1, y: 1, z: 1, w: 0 },~ +** Processing line: ~~ +** Processing line: ~ { x: -1, y: 1, z: 1, w: 0 },~ +** Processing line: ~ { x: 1, y: 1, z: 1, w: 0 },~ +** Processing line: ~~ +** Processing line: ~ { x: 1, y: 1, z: 1, w: 0 },~ +** Processing line: ~ { x: 1, y: -1, z: 1, w: 0 },~ +** Processing line: ~~ +** Processing line: ~ { x: 1, y: -1, z: 1, w: 0 },~ +** Processing line: ~ { x: -1, y: -1, z: 1, w: 0 },~ +** Processing line: ~~ +** Processing line: ~ # engine front~ +** Processing line: ~ { x: -1, y: -1, z: -1, w: 0 },~ +** Processing line: ~ { x: -1, y: 1, z: -1, w: 0 },~ +** Processing line: ~~ +** Processing line: ~ { x: -1, y: 1, z: -1, w: 0 },~ +** Processing line: ~ { x: 1, y: 1, z: -1, w: 0 },~ +** Processing line: ~~ +** Processing line: ~ { x: 1, y: 1, z: -1, w: 0 },~ +** Processing line: ~ { x: 1, y: -1, z: -1, w: 0 },~ +** Processing line: ~~ +** Processing line: ~ { x: 1, y: -1, z: -1, w: 0 },~ +** Processing line: ~ { x: -1, y: -1, z: -1, w: 0 },~ +** Processing line: ~~ +** Processing line: ~ # engine left~ +** Processing line: ~ { x: -1, z: -1, y: -1, w: 0 },~ +** Processing line: ~ { x: -1, z: -1, y: 1, w: 0 },~ +** Processing line: ~~ +** Processing line: ~ { x: -1, z: -1, y: 1, w: 0 },~ +** Processing line: ~ { x: -1, z: 1, y: 1, w: 0 },~ +** Processing line: ~~ +** Processing line: ~ { x: -1, z: 1, y: 1, w: 0 },~ +** Processing line: ~ { x: -1, z: 1, y: -1, w: 0 },~ +** Processing line: ~~ +** Processing line: ~ { x: -1, z: 1, y: -1, w: 0 },~ +** Processing line: ~ { x: -1, z: -1, y: -1, w: 0 },~ +** Processing line: ~~ +** Processing line: ~ # engine right~ +** Processing line: ~ { x: 1, z: -1, y: -1, w: 0 },~ +** Processing line: ~ { x: 1, z: -1, y: 1, w: 0 },~ +** Processing line: ~~ +** Processing line: ~ { x: 1, z: -1, y: 1, w: 0 },~ +** Processing line: ~ { x: 1, z: 1, y: 1, w: 0 },~ +** Processing line: ~~ +** Processing line: ~ { x: 1, z: 1, y: 1, w: 0 },~ +** Processing line: ~ { x: 1, z: 1, y: -1, w: 0 },~ +** Processing line: ~~ +** Processing line: ~ { x: 1, z: 1, y: -1, w: 0 },~ +** Processing line: ~ { x: 1, z: -1, y: -1, w: 0 },~ +** Processing line: ~~ +** Processing line: ~ # top front of engine to front of ship~ +** Processing line: ~ { x: 1, y: 1, z: 1, w: 0 },~ +** Processing line: ~ { x: 0, y: -1, z: 9, w: 0 },~ +** Processing line: ~~ +** Processing line: ~ { x: 0, y: -1, z: 9, w: 0 },~ +** Processing line: ~ { x: -1, y: 1, z: 1, w: 0 },~ +** Processing line: ~~ +** Processing line: ~ # bottom front of engine~ +** Processing line: ~ { x: 1, y: -1, z: 1, w: 0 },~ +** Processing line: ~ { x: 0, y: -1, z: 9, w: 0 },~ +** Processing line: ~~ +** Processing line: ~ { x: -1, y: -1, z: 1, w: 0 },~ +** Processing line: ~ { x: 0, y: -1, z: 9, w: 0 },~ +** Processing line: ~~ +** Processing line: ~ # right wing~ +** Processing line: ~ # front of wing~ +** Processing line: ~ { x: 1, y: 0.10, z: 1, w: 0 },~ +** Processing line: ~ { x: 9, y: 0.10, z: -1, w: 0 },~ +** Processing line: ~~ +** Processing line: ~ { x: 9, y: 0.10, z: -1, w: 0 },~ +** Processing line: ~ { x: 10, y: 0.10, z: -2, w: 0 },~ +** Processing line: ~~ +** Processing line: ~ # back of wing~ +** Processing line: ~ { x: 1, y: 0.10, z: -1, w: 0 },~ +** Processing line: ~ { x: 9, y: 0.10, z: -1, w: 0 },~ +** Processing line: ~~ +** Processing line: ~ { x: 10, y: 0.10, z: -2, w: 0 },~ +** Processing line: ~ { x: 8, y: 0.10, z: -1, w: 0 },~ +** Processing line: ~~ +** Processing line: ~ # front of wing~ +** Processing line: ~ { x: 1, y: -0.10, z: 1, w: 0 },~ +** Processing line: ~ { x: 9, y: -0.10, z: -1, w: 0 },~ +** Processing line: ~~ +** Processing line: ~ { x: 9, y: -0.10, z: -1, w: 0 },~ +** Processing line: ~ { x: 10, y: -0.10, z: -2, w: 0 },~ +** Processing line: ~~ +** Processing line: ~ # back of wing~ +** Processing line: ~ { x: 1, y: -0.10, z: -1, w: 0 },~ +** Processing line: ~ { x: 9, y: -0.10, z: -1, w: 0 },~ +** Processing line: ~~ +** Processing line: ~ { x: 10, y: -0.10, z: -2, w: 0 },~ +** Processing line: ~ { x: 8, y: -0.10, z: -1, w: 0 },~ +** Processing line: ~~ +** Processing line: ~ # left wing~ +** Processing line: ~ # front of wing~ +** Processing line: ~ { x: -1, y: 0.10, z: 1, w: 0 },~ +** Processing line: ~ { x: -9, y: 0.10, z: -1, w: 0 },~ +** Processing line: ~~ +** Processing line: ~ { x: -9, y: 0.10, z: -1, w: 0 },~ +** Processing line: ~ { x: -10, y: 0.10, z: -2, w: 0 },~ +** Processing line: ~~ +** Processing line: ~ # back of wing~ +** Processing line: ~ { x: -1, y: 0.10, z: -1, w: 0 },~ +** Processing line: ~ { x: -9, y: 0.10, z: -1, w: 0 },~ +** Processing line: ~~ +** Processing line: ~ { x: -10, y: 0.10, z: -2, w: 0 },~ +** Processing line: ~ { x: -8, y: 0.10, z: -1, w: 0 },~ +** Processing line: ~~ +** Processing line: ~ # front of wing~ +** Processing line: ~ { x: -1, y: -0.10, z: 1, w: 0 },~ +** Processing line: ~ { x: -9, y: -0.10, z: -1, w: 0 },~ +** Processing line: ~~ +** Processing line: ~ { x: -9, y: -0.10, z: -1, w: 0 },~ +** Processing line: ~ { x: -10, y: -0.10, z: -2, w: 0 },~ +** Processing line: ~~ +** Processing line: ~ # back of wing~ +** Processing line: ~ { x: -1, y: -0.10, z: -1, w: 0 },~ +** Processing line: ~ { x: -9, y: -0.10, z: -1, w: 0 },~ +** Processing line: ~~ +** Processing line: ~ { x: -10, y: -0.10, z: -2, w: 0 },~ +** Processing line: ~ { x: -8, y: -0.10, z: -1, w: 0 },~ +** Processing line: ~~ +** Processing line: ~ # left fin~ +** Processing line: ~ # top~ +** Processing line: ~ { x: -1, y: 0.10, z: 1, w: 0 },~ +** Processing line: ~ { x: -1, y: 3, z: -3, w: 0 },~ +** Processing line: ~~ +** Processing line: ~ { x: -1, y: 0.10, z: -1, w: 0 },~ +** Processing line: ~ { x: -1, y: 3, z: -3, w: 0 },~ +** Processing line: ~~ +** Processing line: ~ { x: -1.1, y: 0.10, z: 1, w: 0 },~ +** Processing line: ~ { x: -1.1, y: 3, z: -3, w: 0 },~ +** Processing line: ~~ +** Processing line: ~ { x: -1.1, y: 0.10, z: -1, w: 0 },~ +** Processing line: ~ { x: -1.1, y: 3, z: -3, w: 0 },~ +** Processing line: ~~ +** Processing line: ~ # bottom~ +** Processing line: ~ { x: -1, y: -0.10, z: 1, w: 0 },~ +** Processing line: ~ { x: -1, y: -2, z: -2, w: 0 },~ +** Processing line: ~~ +** Processing line: ~ { x: -1, y: -0.10, z: -1, w: 0 },~ +** Processing line: ~ { x: -1, y: -2, z: -2, w: 0 },~ +** Processing line: ~~ +** Processing line: ~ { x: -1.1, y: -0.10, z: 1, w: 0 },~ +** Processing line: ~ { x: -1.1, y: -2, z: -2, w: 0 },~ +** Processing line: ~~ +** Processing line: ~ { x: -1.1, y: -0.10, z: -1, w: 0 },~ +** Processing line: ~ { x: -1.1, y: -2, z: -2, w: 0 },~ +** Processing line: ~~ +** Processing line: ~ # right fin~ +** Processing line: ~ { x: 1, y: 0.10, z: 1, w: 0 },~ +** Processing line: ~ { x: 1, y: 3, z: -3, w: 0 },~ +** Processing line: ~~ +** Processing line: ~ { x: 1, y: 0.10, z: -1, w: 0 },~ +** Processing line: ~ { x: 1, y: 3, z: -3, w: 0 },~ +** Processing line: ~~ +** Processing line: ~ { x: 1.1, y: 0.10, z: 1, w: 0 },~ +** Processing line: ~ { x: 1.1, y: 3, z: -3, w: 0 },~ +** Processing line: ~~ +** Processing line: ~ { x: 1.1, y: 0.10, z: -1, w: 0 },~ +** Processing line: ~ { x: 1.1, y: 3, z: -3, w: 0 },~ +** Processing line: ~~ +** Processing line: ~ # bottom~ +** Processing line: ~ { x: 1, y: -0.10, z: 1, w: 0 },~ +** Processing line: ~ { x: 1, y: -2, z: -2, w: 0 },~ +** Processing line: ~~ +** Processing line: ~ { x: 1, y: -0.10, z: -1, w: 0 },~ +** Processing line: ~ { x: 1, y: -2, z: -2, w: 0 },~ +** Processing line: ~~ +** Processing line: ~ { x: 1.1, y: -0.10, z: 1, w: 0 },~ +** Processing line: ~ { x: 1.1, y: -2, z: -2, w: 0 },~ +** Processing line: ~~ +** Processing line: ~ { x: 1.1, y: -0.10, z: -1, w: 0 },~ +** Processing line: ~ { x: 1.1, y: -2, z: -2, w: 0 },~ +** Processing line: ~ ]~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ def defaults~ +** Processing line: ~ state.points ||= player_ship~ +** Processing line: ~ state.shifted_points ||= state.points.map { |point| point }~ +** Processing line: ~~ +** Processing line: ~ state.scale ||= 1~ +** Processing line: ~ state.angle_x ||= 0~ +** Processing line: ~ state.angle_y ||= 0~ +** Processing line: ~ state.angle_z ||= 0~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ def matrix_new x0, y0, z0, w0, x1, y1, z1, w1, x2, y2, z2, w2, x3, y3, z3, w3~ +** Processing line: ~ (hmap x: (hmap x: x0, y: y0, z: z0, w: w0),~ +** Processing line: ~ y: (hmap x: x1, y: y1, z: z1, w: w1),~ +** Processing line: ~ z: (hmap x: x2, y: y2, z: z2, w: w2),~ +** Processing line: ~ w: (hmap x: x3, y: y3, z: z3, w: w3))~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ def angle_z_matrix degrees~ +** Processing line: ~ cos_t = Math.cos degrees.to_radians~ +** Processing line: ~ sin_t = Math.sin degrees.to_radians~ +** Processing line: ~ (matrix_new cos_t, -sin_t, 0, 0,~ +** Processing line: ~ sin_t, cos_t, 0, 0,~ +** Processing line: ~ 0, 0, 1, 0,~ +** Processing line: ~ 0, 0, 0, 1)~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ def angle_y_matrix degrees~ +** Processing line: ~ cos_t = Math.cos degrees.to_radians~ +** Processing line: ~ sin_t = Math.sin degrees.to_radians~ +** Processing line: ~ (matrix_new cos_t, 0, sin_t, 0,~ +** Processing line: ~ 0, 1, 0, 0,~ +** Processing line: ~ -sin_t, 0, cos_t, 0,~ +** Processing line: ~ 0, 0, 0, 1)~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ def angle_x_matrix degrees~ +** Processing line: ~ cos_t = Math.cos degrees.to_radians~ +** Processing line: ~ sin_t = Math.sin degrees.to_radians~ +** Processing line: ~ (matrix_new 1, 0, 0, 0,~ +** Processing line: ~ 0, cos_t, -sin_t, 0,~ +** Processing line: ~ 0, sin_t, cos_t, 0,~ +** Processing line: ~ 0, 0, 0, 1)~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ def scale_matrix factor~ +** Processing line: ~ (matrix_new factor, 0, 0, 0,~ +** Processing line: ~ 0, factor, 0, 0,~ +** Processing line: ~ 0, 0, factor, 0,~ +** Processing line: ~ 0, 0, 0, 1)~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ def input~ +** Processing line: ~ if (inputs.keyboard.shift && inputs.keyboard.p)~ +** Processing line: ~ state.scale -= 0.1~ +** Processing line: ~ elsif inputs.keyboard.p~ +** Processing line: ~ state.scale += 0.1~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ if inputs.mouse.wheel~ +** Processing line: ~ state.scale += inputs.mouse.wheel.y~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ state.scale = state.scale.clamp(0.1, 1000)~ +** Processing line: ~~ +** Processing line: ~ if (inputs.keyboard.shift && inputs.keyboard.y) || inputs.keyboard.right~ +** Processing line: ~ state.angle_y += 1~ +** Processing line: ~ elsif (inputs.keyboard.y) || inputs.keyboard.left~ +** Processing line: ~ state.angle_y -= 1~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ if (inputs.keyboard.shift && inputs.keyboard.x) || inputs.keyboard.down~ +** Processing line: ~ state.angle_x -= 1~ +** Processing line: ~ elsif (inputs.keyboard.x || inputs.keyboard.up)~ +** Processing line: ~ state.angle_x += 1~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ if inputs.keyboard.shift && inputs.keyboard.z~ +** Processing line: ~ state.angle_z += 1~ +** Processing line: ~ elsif inputs.keyboard.z~ +** Processing line: ~ state.angle_z -= 1~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ if inputs.keyboard.zero~ +** Processing line: ~ state.angle_x = 0~ +** Processing line: ~ state.angle_y = 0~ +** Processing line: ~ state.angle_z = 0~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ angle_x = state.angle_x~ +** Processing line: ~ angle_y = state.angle_y~ +** Processing line: ~ angle_z = state.angle_z~ +** Processing line: ~ scale = state.scale~ +** Processing line: ~~ +** Processing line: ~ s_matrix = scale_matrix state.scale~ +** Processing line: ~ x_matrix = angle_z_matrix angle_z~ +** Processing line: ~ y_matrix = angle_y_matrix angle_y~ +** Processing line: ~ z_matrix = angle_x_matrix angle_x~ +** Processing line: ~~ +** Processing line: ~ state.shifted_points = state.points.map do |point|~ +** Processing line: ~ (matrix_mul s_matrix,~ +** Processing line: ~ (matrix_mul z_matrix,~ +** Processing line: ~ (matrix_mul x_matrix,~ +** Processing line: ~ (matrix_mul y_matrix, point)))).merge(original: point)~ +** Processing line: ~ end~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ def thick_line line~ +** Processing line: ~ [~ +** Processing line: ~ line.merge(y: line.y - 1, y2: line.y2 - 1, r: 0, g: 0, b: 0),~ +** Processing line: ~ line.merge(x: line.x - 1, x2: line.x2 - 1, r: 0, g: 0, b: 0),~ +** Processing line: ~ line.merge(x: line.x - 0, x2: line.x2 - 0, r: 0, g: 0, b: 0),~ +** Processing line: ~ line.merge(y: line.y + 1, y2: line.y2 + 1, r: 0, g: 0, b: 0),~ +** Processing line: ~ line.merge(x: line.x + 1, x2: line.x2 + 1, r: 0, g: 0, b: 0)~ +** Processing line: ~ ]~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ def render~ +** Processing line: ~ outputs.lines << state.shifted_points.each_slice(2).map do |(p1, p2)|~ +** Processing line: ~ perc = 0~ +** Processing line: ~ thick_line({ x: p1.x.*(10) + 640, y: p1.y.*(10) + 320,~ +** Processing line: ~ x2: p2.x.*(10) + 640, y2: p2.y.*(10) + 320,~ +** Processing line: ~ r: 255 * perc,~ +** Processing line: ~ g: 255 * perc,~ +** Processing line: ~ b: 255 * perc })~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ outputs.labels << [ 10, 700, "angle_x: #{state.angle_x.to_sf}", 0]~ +** Processing line: ~ outputs.labels << [ 10, 670, "x, shift+x", 0]~ +** Processing line: ~~ +** Processing line: ~ outputs.labels << [210, 700, "angle_y: #{state.angle_y.to_sf}", 0]~ +** Processing line: ~ outputs.labels << [210, 670, "y, shift+y", 0]~ +** Processing line: ~~ +** Processing line: ~ outputs.labels << [410, 700, "angle_z: #{state.angle_z.to_sf}", 0]~ +** Processing line: ~ outputs.labels << [410, 670, "z, shift+z", 0]~ +** Processing line: ~~ +** Processing line: ~ outputs.labels << [610, 700, "scale: #{state.scale.to_sf}", 0]~ +** Processing line: ~ outputs.labels << [610, 670, "p, shift+p", 0]~ +** Processing line: ~ end~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ $game = Game.new~ +** Processing line: ~~ +** Processing line: ~ def tick args~ +** Processing line: ~ $game.args = args~ +** Processing line: ~ $game.tick~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ def set_angles x, y, z~ +** Processing line: ~ $game.state.angle_x = x~ +** Processing line: ~ $game.state.angle_y = y~ +** Processing line: ~ $game.state.angle_z = z~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ $gtk.reset~ +** Processing line: ~~ +** Processing line: ~#+end_src~ +- PRE end detected. +** Processing line: ~~ +** Processing line: ~~ ** Processing line: ~*** Arcade - Bullet Hell - main.rb~ - H3 detected. - Determining if line is a header. @@ -217250,31 +225219,36 @@ Follows is a source code listing for all files that have been open sourced. This ** Processing line: ~ end~ ** Processing line: ~~ ** Processing line: ~ def render_score~ -** Processing line: ~ outputs.primitives << [10, 710, "HI SCORE: #{state.hi_score}", large_white_typeset].label~ -** Processing line: ~ outputs.primitives << [10, 680, "SCORE: #{state.score}", large_white_typeset].label~ -** Processing line: ~ outputs.primitives << [10, 650, "DIFFICULTY: #{state.difficulty.upcase}", large_white_typeset].label~ +** Processing line: ~ outputs.primitives << { x: 10, y: 710, text: "HI SCORE: #{state.hi_score}", **large_white_typeset }~ +** Processing line: ~ outputs.primitives << { x: 10, y: 680, text: "SCORE: #{state.score}", **large_white_typeset }~ +** Processing line: ~ outputs.primitives << { x: 10, y: 650, text: "DIFFICULTY: #{state.difficulty.upcase}", **large_white_typeset }~ ** Processing line: ~ end~ ** Processing line: ~~ ** Processing line: ~ def render_menu~ ** Processing line: ~ return unless state.scene == :menu~ ** Processing line: ~ render_overlay~ ** Processing line: ~~ -** Processing line: ~ outputs.labels << [640, 700, "Flappy Dragon", 50, 1, 255, 255, 255]~ -** Processing line: ~ outputs.labels << [640, 500, "Instructions: Press Spacebar to flap. Don't die.", 4, 1, 255, 255, 255]~ -** Processing line: ~ outputs.labels << [430, 430, "[Tab] Change difficulty", 4, 0, 255, 255, 255]~ -** Processing line: ~ outputs.labels << [430, 400, "[Enter] Start at New Difficulty ", 4, 0, 255, 255, 255]~ -** Processing line: ~ outputs.labels << [430, 370, "[Escape] Cancel/Resume ", 4, 0, 255, 255, 255]~ -** Processing line: ~ outputs.labels << [640, 300, "(mouse, touch, and game controllers work, too!) ", 4, 1, 255, 255, 255]~ -** Processing line: ~ outputs.labels << [640, 200, "Difficulty: #{state.new_difficulty.capitalize}", 4, 1, 255, 255, 255]~ +** Processing line: ~ outputs.labels << { x: 640, y: 700, text: "Flappy Dragon", size_enum: 50, alignment_enum: 1, **white }~ +** Processing line: ~ outputs.labels << { x: 640, y: 500, text: "Instructions: Press Spacebar to flap. Don't die.", size_enum: 4, alignment_enum: 1, **white }~ +** Processing line: ~ outputs.labels << { x: 430, y: 430, text: "[Tab] Change difficulty", size_enum: 4, alignment_enum: 0, **white }~ +** Processing line: ~ outputs.labels << { x: 430, y: 400, text: "[Enter] Start at New Difficulty ", size_enum: 4, alignment_enum: 0, **white }~ +** Processing line: ~ outputs.labels << { x: 430, y: 370, text: "[Escape] Cancel/Resume ", size_enum: 4, alignment_enum: 0, **white }~ +** Processing line: ~ outputs.labels << { x: 640, y: 300, text: "(mouse, touch, and game controllers work, too!) ", size_enum: 4, alignment_enum: 1, **white }~ +** Processing line: ~ outputs.labels << { x: 640, y: 200, text: "Difficulty: #{state.new_difficulty.capitalize}", size_enum: 4, alignment_enum: 1, **white }~ ** Processing line: ~~ -** Processing line: ~ outputs.labels << [10, 100, "Code: @amirrajan", 255, 255, 255]~ -** Processing line: ~ outputs.labels << [10, 80, "Art: @mobypixel", 255, 255, 255]~ -** Processing line: ~ outputs.labels << [10, 60, "Music: @mobypixel", 255, 255, 255]~ -** Processing line: ~ outputs.labels << [10, 40, "Engine: DragonRuby GTK", 255, 255, 255]~ +** Processing line: ~ outputs.labels << { x: 10, y: 100, text: "Code: @amirrajan", **white }~ +** Processing line: ~ outputs.labels << { x: 10, y: 80, text: "Art: @mobypixel", **white }~ +** Processing line: ~ outputs.labels << { x: 10, y: 60, text: "Music: @mobypixel", **white }~ +** Processing line: ~ outputs.labels << { x: 10, y: 40, text: "Engine: DragonRuby GTK", **white }~ ** Processing line: ~ end~ ** Processing line: ~~ ** Processing line: ~ def render_overlay~ -** Processing line: ~ outputs.primitives << [grid.rect.scale_rect(1.1, 0, 0), 0, 0, 0, 230].solid~ +** Processing line: ~ overlay_rect = grid.rect.scale_rect(1.1, 0, 0)~ +** Processing line: ~ outputs.primitives << { x: overlay_rect.x,~ +** Processing line: ~ y: overlay_rect.y,~ +** Processing line: ~ w: overlay_rect.w,~ +** Processing line: ~ h: overlay_rect.h,~ +** Processing line: ~ r: 0, g: 0, b: 0, a: 230 }.solid!~ ** Processing line: ~ end~ ** Processing line: ~~ ** Processing line: ~ def render_game~ @@ -217287,14 +225261,14 @@ Follows is a source code listing for all files that have been open sourced. This ** Processing line: ~~ ** Processing line: ~ def render_game_over~ ** Processing line: ~ return unless state.scene == :game~ -** Processing line: ~ outputs.labels << [638, 358, score_text, 20, 1]~ -** Processing line: ~ outputs.labels << [635, 360, score_text, 20, 1, 255, 255, 255]~ -** Processing line: ~ outputs.labels << [638, 428, countdown_text, 20, 1]~ -** Processing line: ~ outputs.labels << [635, 430, countdown_text, 20, 1, 255, 255, 255]~ +** Processing line: ~ outputs.labels << { x: 638, y: 358, text: score_text, size_enum: 20, alignment_enum: 1 }~ +** Processing line: ~ outputs.labels << { x: 635, y: 360, text: score_text, size_enum: 20, alignment_enum: 1, r: 255, g: 255, b: 255 }~ +** Processing line: ~ outputs.labels << { x: 638, y: 428, text: countdown_text, size_enum: 20, alignment_enum: 1 }~ +** Processing line: ~ outputs.labels << { x: 635, y: 430, text: countdown_text, size_enum: 20, alignment_enum: 1, r: 255, g: 255, b: 255 }~ ** Processing line: ~ end~ ** Processing line: ~~ ** Processing line: ~ def render_background~ -** Processing line: ~ outputs.sprites << [0, 0, 1280, 720, 'sprites/background.png']~ +** Processing line: ~ outputs.sprites << { x: 0, y: 0, w: 1280, h: 720, path: 'sprites/background.png' }~ ** Processing line: ~~ ** Processing line: ~ scroll_point_at = state.tick_count~ ** Processing line: ~ scroll_point_at = state.scene_at if state.scene == :menu~ @@ -217306,11 +225280,18 @@ Follows is a source code listing for all files that have been open sourced. This ** Processing line: ~ outputs.sprites << scrolling_background(scroll_point_at, 'sprites/parallax_front.png', 1.00, -80)~ ** Processing line: ~ end~ ** Processing line: ~~ +** Processing line: ~ def scrolling_background at, path, rate, y = 0~ +** Processing line: ~ [~ +** Processing line: ~ { x: 0 - at.*(rate) % 1440, y: y, w: 1440, h: 720, path: path },~ +** Processing line: ~ { x: 1440 - at.*(rate) % 1440, y: y, w: 1440, h: 720, path: path }~ +** Processing line: ~ ]~ +** Processing line: ~ end~ +** Processing line: ~~ ** Processing line: ~ def render_walls~ ** Processing line: ~ state.walls.each do |w|~ ** Processing line: ~ w.sprites = [~ -** Processing line: ~ [w.x, w.bottom_height - 720, 100, 720, 'sprites/wall.png', 180],~ -** Processing line: ~ [w.x, w.top_y, 100, 720, 'sprites/wallbottom.png', 0]~ +** Processing line: ~ { x: w.x, y: w.bottom_height - 720, w: 100, h: 720, path: 'sprites/wall.png', angle: 180 },~ +** Processing line: ~ { x: w.x, y: w.top_y, w: 100, h: 720, path: 'sprites/wallbottom.png', angle: 0 }~ ** Processing line: ~ ]~ ** Processing line: ~ end~ ** Processing line: ~ outputs.sprites << state.walls.map(&:sprites)~ @@ -217319,15 +225300,13 @@ Follows is a source code listing for all files that have been open sourced. This ** Processing line: ~ def render_dragon~ ** Processing line: ~ state.show_death = true if state.countdown == 3.seconds~ ** Processing line: ~~ -** Processing line: ~ render_debug_hitbox false~ -** Processing line: ~~ ** Processing line: ~ if state.show_death == false || !state.death_at~ ** Processing line: ~ animation_index = state.flapped_at.frame_index 6, 2, false if state.flapped_at~ ** Processing line: ~ sprite_name = "sprites/dragon_fly#{animation_index.or(0) + 1}.png"~ -** Processing line: ~ state.dragon_sprite = [state.x, state.y, 100, 80, sprite_name, state.dy * 1.2]~ +** Processing line: ~ state.dragon_sprite = { x: state.x, y: state.y, w: 100, h: 80, path: sprite_name, angle: state.dy * 1.2 }~ ** Processing line: ~ else~ ** Processing line: ~ sprite_name = "sprites/dragon_die.png"~ -** Processing line: ~ state.dragon_sprite = [state.x, state.y, 100, 80, sprite_name, state.dy * 1.2]~ +** Processing line: ~ state.dragon_sprite = { x: state.x, y: state.y, w: 100, h: 80, path: sprite_name, angle: state.dy * 1.2 }~ ** Processing line: ~ sprite_changed_elapsed = state.death_at.elapsed_time - 1.seconds~ ** Processing line: ~ state.dragon_sprite.angle += (sprite_changed_elapsed ** 1.3) * state.death_fall_direction * -1~ ** Processing line: ~ state.dragon_sprite.x += (sprite_changed_elapsed ** 1.2) * state.death_fall_direction~ @@ -217337,20 +225316,12 @@ Follows is a source code listing for all files that have been open sourced. This ** Processing line: ~ outputs.sprites << state.dragon_sprite~ ** Processing line: ~ end~ ** Processing line: ~~ -** Processing line: ~ def render_debug_hitbox show~ -** Processing line: ~ return unless show~ -** Processing line: ~ outputs.borders << [dragon_collision_box.rect, 255, 0, 0] if state.dragon_sprite~ -** Processing line: ~ outputs.borders << state.walls.flat_map do |w|~ -** Processing line: ~ w.sprites.map { |s| [s.rect, 255, 0, 0] }~ -** Processing line: ~ end~ -** Processing line: ~ end~ -** Processing line: ~~ ** Processing line: ~ def render_flash~ ** Processing line: ~ return unless state.flash_at~ ** Processing line: ~~ -** Processing line: ~ outputs.primitives << [grid.rect,~ -** Processing line: ~ white,~ -** Processing line: ~ 255 * state.flash_at.ease(20, :flip)].solid~ +** Processing line: ~ outputs.primitives << { **grid.rect.to_hash,~ +** Processing line: ~ **white,~ +** Processing line: ~ a: 255 * state.flash_at.ease(20, :flip) }.solid!~ ** Processing line: ~~ ** Processing line: ~ state.flash_at = 0 if state.flash_at.elapsed_time > 20~ ** Processing line: ~ end~ @@ -217470,19 +225441,12 @@ Follows is a source code listing for all files that have been open sourced. This ** Processing line: ~ end~ ** Processing line: ~ end~ ** Processing line: ~~ -** Processing line: ~ def scrolling_background at, path, rate, y = 0~ -** Processing line: ~ [~ -** Processing line: ~ [ 0 - at.*(rate) % 1440, y, 1440, 720, path],~ -** Processing line: ~ [1440 - at.*(rate) % 1440, y, 1440, 720, path]~ -** Processing line: ~ ]~ -** Processing line: ~ end~ -** Processing line: ~~ ** Processing line: ~ def white~ -** Processing line: ~ [255, 255, 255]~ +** Processing line: ~ { r: 255, g: 255, b: 255 }~ ** Processing line: ~ end~ ** Processing line: ~~ ** Processing line: ~ def large_white_typeset~ -** Processing line: ~ [5, 0, 255, 255, 255]~ +** Processing line: ~ { size_enum: 5, alignment_enum: 0, r: 255, g: 255, b: 255 }~ ** Processing line: ~ end~ ** Processing line: ~~ ** Processing line: ~ def at_beginning?~ @@ -217491,9 +225455,9 @@ Follows is a source code listing for all files that have been open sourced. This ** Processing line: ~~ ** Processing line: ~ def dragon_collision_box~ ** Processing line: ~ state.dragon_sprite~ -** Processing line: ~ .scale_rect(1.0 - collision_forgiveness, 0.5, 0.5)~ -** Processing line: ~ .rect_shift_right(10)~ -** Processing line: ~ .rect_shift_up(state.dy * 2)~ +** Processing line: ~ .scale_rect(1.0 - collision_forgiveness, 0.5, 0.5)~ +** Processing line: ~ .rect_shift_right(10)~ +** Processing line: ~ .rect_shift_up(state.dy * 2)~ ** Processing line: ~ end~ ** Processing line: ~~ ** Processing line: ~ def game_over?~ @@ -217502,7 +225466,7 @@ Follows is a source code listing for all files that have been open sourced. This ** Processing line: ~ state.walls~ ** Processing line: ~ .flat_map { |w| w.sprites }~ ** Processing line: ~ .any? do |s|~ -** Processing line: ~ s.intersect_rect?(dragon_collision_box)~ +** Processing line: ~ s && s.intersect_rect?(dragon_collision_box)~ ** Processing line: ~ end~ ** Processing line: ~ end~ ** Processing line: ~~ @@ -219001,334 +226965,6 @@ Follows is a source code listing for all files that have been open sourced. This - PRE end detected. ** Processing line: ~~ ** Processing line: ~~ -** Processing line: ~*** Crafting - Farming Game Starting Point - repl.rb~ -- H3 detected. -- Determining if line is a header. -- Line contains ~*** ~... gsub-ing empty string -- Formatting line: ~Crafting - Farming Game Starting Point - repl.rb~ -- Line's tilde count is: 0 -- Line contains link marker: false -- Determining if line is a header. -- Line contains ~*** ~... gsub-ing empty string -- Formatting line: ~Crafting - Farming Game Starting Point - repl.rb~ -- Line's tilde count is: 0 -- Line contains link marker: false -** Processing line: ~~ -** Processing line: ~#+begin_src ruby~ -- PRE start detected. -** Processing line: ~ # ./samples/99_genre_crafting/farming_game_starting_point/app/repl.rb~ -** Processing line: ~ # ===============================================================~ -** Processing line: ~ # Welcome to repl.rb~ -** Processing line: ~ # ===============================================================~ -** Processing line: ~ # You can experiement with code within this file. Code in this~ -** Processing line: ~ # file is only executed when you save (and only excecuted ONCE).~ -** Processing line: ~ # ===============================================================~ -** Processing line: ~~ -** Processing line: ~ # ===============================================================~ -** Processing line: ~ # REMOVE the "x" from the word "xrepl" and save the file to RUN~ -** Processing line: ~ # the code in between the do/end block delimiters.~ -** Processing line: ~ # ===============================================================~ -** Processing line: ~~ -** Processing line: ~ # ===============================================================~ -** Processing line: ~ # ADD the "x" to the word "repl" (make it xrepl) and save the~ -** Processing line: ~ # file to IGNORE the code in between the do/end block delimiters.~ -** Processing line: ~ # ===============================================================~ -** Processing line: ~~ -** Processing line: ~ # Remove the x from xrepl to run the code. Add the x back to ignore to code.~ -** Processing line: ~ xrepl do~ -** Processing line: ~ puts "The result of 1 + 2 is: #{1 + 2}"~ -** Processing line: ~ end~ -** Processing line: ~~ -** Processing line: ~ # ====================================================================================~ -** Processing line: ~ # Ruby Crash Course:~ -** Processing line: ~ # Strings, Numeric, Booleans, Conditionals, Looping, Enumerables, Arrays~ -** Processing line: ~ # ====================================================================================~ -** Processing line: ~~ -** Processing line: ~ # ====================================================================================~ -** Processing line: ~ # Strings~ -** Processing line: ~ # ====================================================================================~ -** Processing line: ~ # Remove the x from xrepl to run the code. Add the x back to ignore to code.~ -** Processing line: ~ xrepl do~ -** Processing line: ~ message = "Hello World"~ -** Processing line: ~ puts "The value of message is: " + message~ -** Processing line: ~ puts "Any value can be interpolated within a string using \#{}."~ -** Processing line: ~ puts "Interpolated message: #{message}."~ -** Processing line: ~ puts 'This #{message} is not interpolated because the string uses single quotes.'~ -** Processing line: ~ end~ -** Processing line: ~~ -** Processing line: ~ # ====================================================================================~ -** Processing line: ~ # Numerics~ -** Processing line: ~ # ====================================================================================~ -** Processing line: ~ # Remove the x from xrepl to run the code. Add the x back to ignore to code.~ -** Processing line: ~ xrepl do~ -** Processing line: ~ a = 10~ -** Processing line: ~ puts "The value of a is: #{a}"~ -** Processing line: ~ puts "a + 1 is: #{a + 1}"~ -** Processing line: ~ puts "a / 3 is: #{a / 3}"~ -** Processing line: ~ end~ -** Processing line: ~~ -** Processing line: ~ # Remove the x from xrepl to run the code. Add the x back to ignore to code.~ -** Processing line: ~ xrepl do~ -** Processing line: ~ b = 10.12~ -** Processing line: ~ puts "The value of b is: #{b}"~ -** Processing line: ~ puts "b + 1 is: #{b + 1}"~ -** Processing line: ~ puts "b as an integer is: #{b.to_i}"~ -** Processing line: ~ puts ''~ -** Processing line: ~ end~ -** Processing line: ~~ -** Processing line: ~ # ====================================================================================~ -** Processing line: ~ # Booleans~ -** Processing line: ~ # ====================================================================================~ -** Processing line: ~ # Remove the x from xrepl to run the code. Add the x back to ignore to code.~ -** Processing line: ~ xrepl do~ -** Processing line: ~ c = 30~ -** Processing line: ~ puts "The value of c is #{c}."~ -** Processing line: ~~ -** Processing line: ~ if c~ -** Processing line: ~ puts "This if statement ran because c is truthy."~ -** Processing line: ~ end~ -** Processing line: ~ end~ -** Processing line: ~~ -** Processing line: ~ # Remove the x from xrepl to run the code. Add the x back to ignore to code.~ -** Processing line: ~ xrepl do~ -** Processing line: ~ d = false~ -** Processing line: ~ puts "The value of d is #{d}."~ -** Processing line: ~~ -** Processing line: ~ if !d~ -** Processing line: ~ puts "This if statement ran because d is falsey, using the not operator (!) makes d evaluate to true."~ -** Processing line: ~ end~ -** Processing line: ~~ -** Processing line: ~ e = nil~ -** Processing line: ~ puts "Nil is also considered falsey. The value of e is: #{e}."~ -** Processing line: ~~ -** Processing line: ~ if !e~ -** Processing line: ~ puts "This if statement ran because e is nil (a falsey value)."~ -** Processing line: ~ end~ -** Processing line: ~ end~ -** Processing line: ~~ -** Processing line: ~ # ====================================================================================~ -** Processing line: ~ # Conditionals~ -** Processing line: ~ # ====================================================================================~ -** Processing line: ~ # Remove the x from xrepl to run the code. Add the x back to ignore to code.~ -** Processing line: ~ xrepl do~ -** Processing line: ~ i_am_true = true~ -** Processing line: ~ i_am_nil = nil~ -** Processing line: ~ i_am_false = false~ -** Processing line: ~ i_am_hi = "hi"~ -** Processing line: ~~ -** Processing line: ~ puts "======== if statement"~ -** Processing line: ~ i_am_one = 1~ -** Processing line: ~ if i_am_one~ -** Processing line: ~ puts "This was printed because i_am_one is truthy."~ -** Processing line: ~ end~ -** Processing line: ~~ -** Processing line: ~ puts "======== if/else statement"~ -** Processing line: ~ if i_am_false~ -** Processing line: ~ puts "This will NOT get printed because i_am_false is false."~ -** Processing line: ~ else~ -** Processing line: ~ puts "This was printed because i_am_false is false."~ -** Processing line: ~ end~ -** Processing line: ~~ -** Processing line: ~ puts "======== if/elsif/else statement"~ -** Processing line: ~ if i_am_false~ -** Processing line: ~ puts "This will NOT get printed because i_am_false is false."~ -** Processing line: ~ elsif i_am_true~ -** Processing line: ~ puts "This was printed because i_am_true is true."~ -** Processing line: ~ else~ -** Processing line: ~ puts "This will NOT get printed i_am_true was true."~ -** Processing line: ~ end~ -** Processing line: ~~ -** Processing line: ~ puts "======== case statement "~ -** Processing line: ~ i_am_one = 1~ -** Processing line: ~ case i_am_one~ -** Processing line: ~ when 10~ -** Processing line: ~ puts "case equaled: 10"~ -** Processing line: ~ when 9~ -** Processing line: ~ puts "case equaled: 9"~ -** Processing line: ~ when 5~ -** Processing line: ~ puts "case equaled: 5"~ -** Processing line: ~ when 1~ -** Processing line: ~ puts "case equaled: 1"~ -** Processing line: ~ else~ -** Processing line: ~ puts "Value wasn't cased."~ -** Processing line: ~ end~ -** Processing line: ~~ -** Processing line: ~ puts "======== different types of comparisons"~ -** Processing line: ~ if 4 == 4~ -** Processing line: ~ puts "equal (4 == 4)"~ -** Processing line: ~ end~ -** Processing line: ~~ -** Processing line: ~ if 4 != 3~ -** Processing line: ~ puts "not equal (4 != 3)"~ -** Processing line: ~ end~ -** Processing line: ~~ -** Processing line: ~ if 3 < 4~ -** Processing line: ~ puts "less than (3 < 4)"~ -** Processing line: ~ end~ -** Processing line: ~~ -** Processing line: ~ if 4 > 3~ -** Processing line: ~ puts "greater than (4 > 3)"~ -** Processing line: ~ end~ -** Processing line: ~~ -** Processing line: ~ if ((4 > 3) || (3 < 4) || false)~ -** Processing line: ~ puts "or statement ((4 > 3) || (3 < 4) || false)"~ -** Processing line: ~ end~ -** Processing line: ~~ -** Processing line: ~ if ((4 > 3) && (3 < 4))~ -** Processing line: ~ puts "and statement ((4 > 3) && (3 < 4))"~ -** Processing line: ~ end~ -** Processing line: ~ end~ -** Processing line: ~~ -** Processing line: ~ # ====================================================================================~ -** Processing line: ~ # Looping~ -** Processing line: ~ # ====================================================================================~ -** Processing line: ~ # Remove the x from xrepl to run the code. Add the x back to ignore to code.~ -** Processing line: ~ xrepl do~ -** Processing line: ~ puts "======== times block"~ -** Processing line: ~ 3.times do |i|~ -** Processing line: ~ puts i~ -** Processing line: ~ end~ -** Processing line: ~ puts "======== range block exclusive"~ -** Processing line: ~ (0...3).each do |i|~ -** Processing line: ~ puts i~ -** Processing line: ~ end~ -** Processing line: ~ puts "======== range block inclusive"~ -** Processing line: ~ (0..3).each do |i|~ -** Processing line: ~ puts i~ -** Processing line: ~ end~ -** Processing line: ~ end~ -** Processing line: ~~ -** Processing line: ~ # ====================================================================================~ -** Processing line: ~ # Enumerables~ -** Processing line: ~ # ====================================================================================~ -** Processing line: ~ # Remove the x from xrepl to run the code. Add the x back to ignore to code.~ -** Processing line: ~ xrepl do~ -** Processing line: ~ puts "======== array each"~ -** Processing line: ~ colors = ["red", "blue", "yellow"]~ -** Processing line: ~ colors.each do |color|~ -** Processing line: ~ puts color~ -** Processing line: ~ end~ -** Processing line: ~~ -** Processing line: ~ puts '======== array each_with_index'~ -** Processing line: ~ colors = ["red", "blue", "yellow"]~ -** Processing line: ~ colors.each_with_index do |color, i|~ -** Processing line: ~ puts "#{color} at index #{i}"~ -** Processing line: ~ end~ -** Processing line: ~ end~ -** Processing line: ~~ -** Processing line: ~ # Remove the x from xrepl to run the code. Add the x back to ignore to code.~ -** Processing line: ~ xrepl do~ -** Processing line: ~ puts "======== single parameter function"~ -** Processing line: ~ def add_one_to n~ -** Processing line: ~ n + 5~ -** Processing line: ~ end~ -** Processing line: ~~ -** Processing line: ~ puts add_one_to(3)~ -** Processing line: ~~ -** Processing line: ~ puts "======== function with default value"~ -** Processing line: ~ def function_with_default_value v = 10~ -** Processing line: ~ v * 10~ -** Processing line: ~ end~ -** Processing line: ~~ -** Processing line: ~ puts "passing three: #{function_with_default_value(3)}"~ -** Processing line: ~ puts "passing nil: #{function_with_default_value}"~ -** Processing line: ~~ -** Processing line: ~ puts "======== Or Equal (||=) operator for nil values"~ -** Processing line: ~ def function_with_nil_default_with_local a = nil~ -** Processing line: ~ result = a~ -** Processing line: ~ result ||= "or equal operator was exected and set a default value"~ -** Processing line: ~ end~ -** Processing line: ~~ -** Processing line: ~ puts "passing 'hi': #{function_with_nil_default_with_local 'hi'}"~ -** Processing line: ~ puts "passing nil: #{function_with_nil_default_with_local}"~ -** Processing line: ~ end~ -** Processing line: ~~ -** Processing line: ~ # ====================================================================================~ -** Processing line: ~ # Arrays~ -** Processing line: ~ # ====================================================================================~ -** Processing line: ~ # Remove the x from xrepl to run the code. Add the x back to ignore to code.~ -** Processing line: ~ xrepl do~ -** Processing line: ~ puts "======== Create an array with the numbers 1 to 10."~ -** Processing line: ~ one_to_ten = (1..10).to_a~ -** Processing line: ~ puts one_to_ten~ -** Processing line: ~~ -** Processing line: ~ puts "======== Create a new array that only contains even numbers from the previous array."~ -** Processing line: ~ one_to_ten = (1..10).to_a~ -** Processing line: ~ evens = one_to_ten.find_all do |number|~ -** Processing line: ~ number % 2 == 0~ -** Processing line: ~ end~ -** Processing line: ~ puts evens~ -** Processing line: ~~ -** Processing line: ~ puts "======== Create a new array that rejects odd numbers."~ -** Processing line: ~ one_to_ten = (1..10).to_a~ -** Processing line: ~ also_even = one_to_ten.reject do |number|~ -** Processing line: ~ number % 2 != 0~ -** Processing line: ~ end~ -** Processing line: ~ puts also_even~ -** Processing line: ~~ -** Processing line: ~ puts "======== Create an array that doubles every number."~ -** Processing line: ~ one_to_ten = (1..10).to_a~ -** Processing line: ~ doubled = one_to_ten.map do |number|~ -** Processing line: ~ number * 2~ -** Processing line: ~ end~ -** Processing line: ~ puts doubled~ -** Processing line: ~~ -** Processing line: ~ puts "======== Create an array that selects only odd numbers and then multiply those by 10."~ -** Processing line: ~ one_to_ten = (1..10).to_a~ -** Processing line: ~ odd_doubled = one_to_ten.find_all do |number|~ -** Processing line: ~ number % 2 != 0~ -** Processing line: ~ end.map do |odd_number|~ -** Processing line: ~ odd_number * 10~ -** Processing line: ~ end~ -** Processing line: ~ puts odd_doubled~ -** Processing line: ~~ -** Processing line: ~ puts "======== All combination of numbers 1 to 10."~ -** Processing line: ~ one_to_ten = (1..10).to_a~ -** Processing line: ~ all_combinations = one_to_ten.product(one_to_ten)~ -** Processing line: ~ puts all_combinations~ -** Processing line: ~~ -** Processing line: ~ puts "======== All uniq combinations of numbers. For example: [1, 2] is the same as [2, 1]."~ -** Processing line: ~ one_to_ten = (1..10).to_a~ -** Processing line: ~ uniq_combinations =~ -** Processing line: ~ one_to_ten.product(one_to_ten)~ -** Processing line: ~ .map do |unsorted_number|~ -** Processing line: ~ unsorted_number.sort~ -** Processing line: ~ end.uniq~ -** Processing line: ~ puts uniq_combinations~ -** Processing line: ~ end~ -** Processing line: ~~ -** Processing line: ~ # ====================================================================================~ -** Processing line: ~ # Advanced Arrays~ -** Processing line: ~ # ====================================================================================~ -** Processing line: ~ # Remove the x from xrepl to run the code. Add the x back to ignore to code.~ -** Processing line: ~ xrepl do~ -** Processing line: ~ puts "======== All unique Pythagorean Triples between 1 and 40 sorted by area of the triangle."~ -** Processing line: ~~ -** Processing line: ~ one_to_hundred = (1..40).to_a~ -** Processing line: ~ triples =~ -** Processing line: ~ one_to_hundred.product(one_to_hundred).map do |width, height|~ -** Processing line: ~ [width, height, Math.sqrt(width ** 2 + height ** 2)]~ -** Processing line: ~ end.find_all do |_, _, hypotenuse|~ -** Processing line: ~ hypotenuse.to_i == hypotenuse~ -** Processing line: ~ end.map do |triangle|~ -** Processing line: ~ triangle.map(&:to_i)~ -** Processing line: ~ end.uniq do |triangle|~ -** Processing line: ~ triangle.sort~ -** Processing line: ~ end.map do |width, height, hypotenuse|~ -** Processing line: ~ [width, height, hypotenuse, (width * height) / 2]~ -** Processing line: ~ end.sort_by do |_, _, _, area|~ -** Processing line: ~ area~ -** Processing line: ~ end~ -** Processing line: ~~ -** Processing line: ~ triples.each do |width, height, hypotenuse, area|~ -** Processing line: ~ puts "(#{width}, #{height}, #{hypotenuse}) = #{area}"~ -** Processing line: ~ end~ -** Processing line: ~ end~ -** Processing line: ~~ -** Processing line: ~#+end_src~ -- PRE end detected. -** Processing line: ~~ -** Processing line: ~~ ** Processing line: ~*** Crafting - Farming Game Starting Point - tests.rb~ - H3 detected. - Determining if line is a header. @@ -222639,6 +230275,407 @@ Follows is a source code listing for all files that have been open sourced. This - PRE end detected. ** Processing line: ~~ ** Processing line: ~~ +** Processing line: ~*** Mario - Jumping - main.rb~ +- H3 detected. +- Determining if line is a header. +- Line contains ~*** ~... gsub-ing empty string +- Formatting line: ~Mario - Jumping - main.rb~ +- Line's tilde count is: 0 +- Line contains link marker: false +- Determining if line is a header. +- Line contains ~*** ~... gsub-ing empty string +- Formatting line: ~Mario - Jumping - main.rb~ +- Line's tilde count is: 0 +- Line contains link marker: false +** Processing line: ~~ +** Processing line: ~#+begin_src ruby~ +- PRE start detected. +** Processing line: ~ # ./samples/99_genre_mario/01_jumping/app/main.rb~ +** Processing line: ~ def tick args~ +** Processing line: ~ defaults args~ +** Processing line: ~ render args~ +** Processing line: ~ input args~ +** Processing line: ~ calc args~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ def defaults args~ +** Processing line: ~ args.state.player.x ||= args.grid.w.half~ +** Processing line: ~ args.state.player.y ||= 0~ +** Processing line: ~ args.state.player.size ||= 100~ +** Processing line: ~ args.state.player.dy ||= 0~ +** Processing line: ~ args.state.player.action ||= :jumping~ +** Processing line: ~ args.state.jump.power = 20~ +** Processing line: ~ args.state.jump.increase_frames = 10~ +** Processing line: ~ args.state.jump.increase_power = 1~ +** Processing line: ~ args.state.gravity = -1~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ def render args~ +** Processing line: ~ args.outputs.sprites << {~ +** Processing line: ~ x: args.state.player.x -~ +** Processing line: ~ args.state.player.size.half,~ +** Processing line: ~ y: args.state.player.y,~ +** Processing line: ~ w: args.state.player.size,~ +** Processing line: ~ h: args.state.player.size,~ +** Processing line: ~ path: 'sprites/square/red.png'~ +** Processing line: ~ }~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ def input args~ +** Processing line: ~ if args.inputs.keyboard.key_down.space~ +** Processing line: ~ if args.state.player.action == :standing~ +** Processing line: ~ args.state.player.action = :jumping~ +** Processing line: ~ args.state.player.dy = args.state.jump.power~ +** Processing line: ~~ +** Processing line: ~ # record when the action took place~ +** Processing line: ~ current_frame = args.state.tick_count~ +** Processing line: ~ args.state.player.action_at = current_frame~ +** Processing line: ~ end~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ # if the space bar is being held~ +** Processing line: ~ if args.inputs.keyboard.key_held.space~ +** Processing line: ~ # is the player jumping~ +** Processing line: ~ is_jumping = args.state.player.action == :jumping~ +** Processing line: ~~ +** Processing line: ~ # when was the jump performed~ +** Processing line: ~ time_of_jump = args.state.player.action_at~ +** Processing line: ~~ +** Processing line: ~ # how much time has passed since the jump~ +** Processing line: ~ jump_elapsed_time = time_of_jump.elapsed_time~ +** Processing line: ~~ +** Processing line: ~ # how much time is allowed for increasing power~ +** Processing line: ~ time_allowed = args.state.jump.increase_frames~ +** Processing line: ~~ +** Processing line: ~ # if the player is jumping~ +** Processing line: ~ # and the elapsed time is less than~ +** Processing line: ~ # the allowed time~ +** Processing line: ~ if is_jumping && jump_elapsed_time < time_allowed~ +** Processing line: ~ # increase the dy by the increase power~ +** Processing line: ~ power_to_add = args.state.jump.increase_power~ +** Processing line: ~ args.state.player.dy += power_to_add~ +** Processing line: ~ end~ +** Processing line: ~ end~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ def calc args~ +** Processing line: ~ if args.state.player.action == :jumping~ +** Processing line: ~ args.state.player.y += args.state.player.dy~ +** Processing line: ~ args.state.player.dy += args.state.gravity~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ if args.state.player.y < 0~ +** Processing line: ~ args.state.player.y = 0~ +** Processing line: ~ args.state.player.action = :standing~ +** Processing line: ~ end~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~#+end_src~ +- PRE end detected. +** Processing line: ~~ +** Processing line: ~~ +** Processing line: ~*** Mario - Jumping And Collisions - main.rb~ +- H3 detected. +- Determining if line is a header. +- Line contains ~*** ~... gsub-ing empty string +- Formatting line: ~Mario - Jumping And Collisions - main.rb~ +- Line's tilde count is: 0 +- Line contains link marker: false +- Determining if line is a header. +- Line contains ~*** ~... gsub-ing empty string +- Formatting line: ~Mario - Jumping And Collisions - main.rb~ +- Line's tilde count is: 0 +- Line contains link marker: false +** Processing line: ~~ +** Processing line: ~#+begin_src ruby~ +- PRE start detected. +** Processing line: ~ # ./samples/99_genre_mario/02_jumping_and_collisions/app/main.rb~ +** Processing line: ~ class Game~ +** Processing line: ~ attr_gtk~ +** Processing line: ~~ +** Processing line: ~ def tick~ +** Processing line: ~ defaults~ +** Processing line: ~ render~ +** Processing line: ~ input~ +** Processing line: ~ calc~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ def defaults~ +** Processing line: ~ return if state.tick_count != 0~ +** Processing line: ~~ +** Processing line: ~ player.x = 64~ +** Processing line: ~ player.y = 800~ +** Processing line: ~ player.size = 50~ +** Processing line: ~ player.dx = 0~ +** Processing line: ~ player.dy = 0~ +** Processing line: ~ player.action = :falling~ +** Processing line: ~~ +** Processing line: ~ player.max_speed = 20~ +** Processing line: ~ player.jump_power = 15~ +** Processing line: ~ player.jump_air_time = 15~ +** Processing line: ~ player.jump_increase_power = 1~ +** Processing line: ~~ +** Processing line: ~ state.gravity = -1~ +** Processing line: ~ state.drag = 0.001~ +** Processing line: ~ state.tile_size = 64~ +** Processing line: ~ state.tiles ||= [~ +** Processing line: ~ { ordinal_x: 0, ordinal_y: 0 },~ +** Processing line: ~ { ordinal_x: 1, ordinal_y: 0 },~ +** Processing line: ~ { ordinal_x: 2, ordinal_y: 0 },~ +** Processing line: ~ { ordinal_x: 3, ordinal_y: 0 },~ +** Processing line: ~ { ordinal_x: 4, ordinal_y: 0 },~ +** Processing line: ~ { ordinal_x: 5, ordinal_y: 0 },~ +** Processing line: ~ { ordinal_x: 6, ordinal_y: 0 },~ +** Processing line: ~ { ordinal_x: 7, ordinal_y: 0 },~ +** Processing line: ~ { ordinal_x: 8, ordinal_y: 0 },~ +** Processing line: ~ { ordinal_x: 9, ordinal_y: 0 },~ +** Processing line: ~ { ordinal_x: 10, ordinal_y: 0 },~ +** Processing line: ~ { ordinal_x: 11, ordinal_y: 0 },~ +** Processing line: ~ { ordinal_x: 12, ordinal_y: 0 },~ +** Processing line: ~~ +** Processing line: ~ { ordinal_x: 9, ordinal_y: 3 },~ +** Processing line: ~ { ordinal_x: 10, ordinal_y: 3 },~ +** Processing line: ~ { ordinal_x: 11, ordinal_y: 3 },~ +** Processing line: ~ ]~ +** Processing line: ~~ +** Processing line: ~ tiles.each do |t|~ +** Processing line: ~ t.rect = { x: t.ordinal_x * 64,~ +** Processing line: ~ y: t.ordinal_y * 64,~ +** Processing line: ~ w: 64,~ +** Processing line: ~ h: 64 }~ +** Processing line: ~ end~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ def render~ +** Processing line: ~ render_player~ +** Processing line: ~ render_tiles~ +** Processing line: ~ # render_grid~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ def input~ +** Processing line: ~ input_jump~ +** Processing line: ~ input_move~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ def calc~ +** Processing line: ~ calc_player_rect~ +** Processing line: ~ calc_left~ +** Processing line: ~ calc_right~ +** Processing line: ~ calc_below~ +** Processing line: ~ calc_above~ +** Processing line: ~ calc_player_dy~ +** Processing line: ~ calc_player_dx~ +** Processing line: ~ calc_game_over~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ def render_player~ +** Processing line: ~ outputs.sprites << {~ +** Processing line: ~ x: player.x,~ +** Processing line: ~ y: player.y,~ +** Processing line: ~ w: player.size,~ +** Processing line: ~ h: player.size,~ +** Processing line: ~ path: 'sprites/square/red.png'~ +** Processing line: ~ }~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ def render_tiles~ +** Processing line: ~ outputs.sprites << state.tiles.map do |t|~ +** Processing line: ~ t.merge path: 'sprites/square/white.png',~ +** Processing line: ~ x: t.ordinal_x * 64,~ +** Processing line: ~ y: t.ordinal_y * 64,~ +** Processing line: ~ w: 64,~ +** Processing line: ~ h: 64~ +** Processing line: ~ end~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ def render_grid~ +** Processing line: ~ if state.tick_count == 0~ +** Processing line: ~ outputs[:grid].background_color = [0, 0, 0, 0]~ +** Processing line: ~ outputs[:grid].borders << available_brick_locations~ +** Processing line: ~ outputs[:grid].labels << available_brick_locations.map do |b|~ +** Processing line: ~ [~ +** Processing line: ~ b.merge(text: "#{b.ordinal_x},#{b.ordinal_y}",~ +** Processing line: ~ x: b.x + 2,~ +** Processing line: ~ y: b.y + 2,~ +** Processing line: ~ size_enum: -3,~ +** Processing line: ~ vertical_alignment_enum: 0,~ +** Processing line: ~ blendmode_enum: 0),~ +** Processing line: ~ b.merge(text: "#{b.x},#{b.y}",~ +** Processing line: ~ x: b.x + 2,~ +** Processing line: ~ y: b.y + 2 + 20,~ +** Processing line: ~ size_enum: -3,~ +** Processing line: ~ vertical_alignment_enum: 0,~ +** Processing line: ~ blendmode_enum: 0)~ +** Processing line: ~ ]~ +** Processing line: ~ end~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ outputs.sprites << { x: 0, y: 0, w: 1280, h: 720, path: :grid }~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ def input_jump~ +** Processing line: ~ if inputs.keyboard.key_down.space~ +** Processing line: ~ player_jump~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ if inputs.keyboard.key_held.space~ +** Processing line: ~ player_jump_increase_air_time~ +** Processing line: ~ end~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ def input_move~ +** Processing line: ~ if player.dx.abs < 20~ +** Processing line: ~ if inputs.keyboard.left~ +** Processing line: ~ player.dx -= 2~ +** Processing line: ~ elsif inputs.keyboard.right~ +** Processing line: ~ player.dx += 2~ +** Processing line: ~ end~ +** Processing line: ~ end~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ def calc_game_over~ +** Processing line: ~ if player.y < -64~ +** Processing line: ~ player.x = 64~ +** Processing line: ~ player.y = 800~ +** Processing line: ~ player.dx = 0~ +** Processing line: ~ player.dy = 0~ +** Processing line: ~ end~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ def calc_player_rect~ +** Processing line: ~ player.rect = player_current_rect~ +** Processing line: ~ player.next_rect = player_next_rect~ +** Processing line: ~ player.prev_rect = player_prev_rect~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ def calc_player_dx~ +** Processing line: ~ player.dx = player_next_dx~ +** Processing line: ~ player.x += player.dx~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ def calc_player_dy~ +** Processing line: ~ player.y += player.dy~ +** Processing line: ~ player.dy = player_next_dy~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ def calc_below~ +** Processing line: ~ return unless player.dy < 0~ +** Processing line: ~ tiles_below = tiles_find { |t| t.rect.top <= player.prev_rect.y }~ +** Processing line: ~ collision = tiles_find_colliding tiles_below, (player.rect.merge y: player.next_rect.y)~ +** Processing line: ~ if collision~ +** Processing line: ~ player.y = collision.rect.y + state.tile_size~ +** Processing line: ~ player.dy = 0~ +** Processing line: ~ player.action = :standing~ +** Processing line: ~ else~ +** Processing line: ~ player.action = :falling~ +** Processing line: ~ end~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ def calc_left~ +** Processing line: ~ return unless player.dx < 0 && player_next_dx < 0~ +** Processing line: ~ tiles_left = tiles_find { |t| t.rect.right <= player.prev_rect.left }~ +** Processing line: ~ collision = tiles_find_colliding tiles_left, (player.rect.merge x: player.next_rect.x)~ +** Processing line: ~ return unless collision~ +** Processing line: ~ player.x = collision.rect.right~ +** Processing line: ~ player.dx = 0~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ def calc_right~ +** Processing line: ~ return unless player.dx > 0 && player_next_dx > 0~ +** Processing line: ~ tiles_right = tiles_find { |t| t.rect.left >= player.prev_rect.right }~ +** Processing line: ~ collision = tiles_find_colliding tiles_right, (player.rect.merge x: player.next_rect.x)~ +** Processing line: ~ return unless collision~ +** Processing line: ~ player.x = collision.rect.left - player.rect.w~ +** Processing line: ~ player.dx = 0~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ def calc_above~ +** Processing line: ~ return unless player.dy > 0~ +** Processing line: ~ tiles_above = tiles_find { |t| t.rect.y >= player.prev_rect.y }~ +** Processing line: ~ collision = tiles_find_colliding tiles_above, (player.rect.merge y: player.next_rect.y)~ +** Processing line: ~ return unless collision~ +** Processing line: ~ player.dy = 0~ +** Processing line: ~ player.y = collision.rect.bottom - player.rect.h~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ def player_current_rect~ +** Processing line: ~ { x: player.x, y: player.y, w: player.size, h: player.size }~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ def available_brick_locations~ +** Processing line: ~ (0..19).to_a~ +** Processing line: ~ .product(0..11)~ +** Processing line: ~ .map do |(ordinal_x, ordinal_y)|~ +** Processing line: ~ { ordinal_x: ordinal_x,~ +** Processing line: ~ ordinal_y: ordinal_y,~ +** Processing line: ~ x: ordinal_x * 64,~ +** Processing line: ~ y: ordinal_y * 64,~ +** Processing line: ~ w: 64,~ +** Processing line: ~ h: 64 }~ +** Processing line: ~ end~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ def player~ +** Processing line: ~ state.player ||= args.state.new_entity :player~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ def player_next_dy~ +** Processing line: ~ player.dy + state.gravity + state.drag ** 2 * -1~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ def player_next_dx~ +** Processing line: ~ player.dx * 0.8~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ def player_next_rect~ +** Processing line: ~ player.rect.merge x: player.x + player_next_dx,~ +** Processing line: ~ y: player.y + player_next_dy~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ def player_prev_rect~ +** Processing line: ~ player.rect.merge x: player.x - player.dx,~ +** Processing line: ~ y: player.y - player.dy~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ def player_jump~ +** Processing line: ~ return if player.action != :standing~ +** Processing line: ~ player.action = :jumping~ +** Processing line: ~ player.dy = state.player.jump_power~ +** Processing line: ~ current_frame = state.tick_count~ +** Processing line: ~ player.action_at = current_frame~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ def player_jump_increase_air_time~ +** Processing line: ~ return if player.action != :jumping~ +** Processing line: ~ return if player.action_at.elapsed_time >= player.jump_air_time~ +** Processing line: ~ player.dy += player.jump_increase_power~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ def tiles~ +** Processing line: ~ state.tiles~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ def tiles_find_colliding tiles, target~ +** Processing line: ~ tiles.find { |t| t.rect.intersect_rect? target }~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ def tiles_find &block~ +** Processing line: ~ tiles.find_all(&block)~ +** Processing line: ~ end~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ def tick args~ +** Processing line: ~ $game ||= Game.new~ +** Processing line: ~ $game.args = args~ +** Processing line: ~ $game.tick~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ $gtk.reset~ +** Processing line: ~~ +** Processing line: ~#+end_src~ +- PRE end detected. +** Processing line: ~~ +** Processing line: ~~ ** Processing line: ~*** Platformer - Clepto Frog - main.rb~ - H3 detected. - Determining if line is a header. @@ -222655,7 +230692,7 @@ Follows is a source code listing for all files that have been open sourced. This ** Processing line: ~#+begin_src ruby~ - PRE start detected. ** Processing line: ~ # ./samples/99_genre_platformer/clepto_frog/app/main.rb~ -** Processing line: ~ MAP_FILE_PATH = 'app/map.txt'~ +** Processing line: ~ MAP_FILE_PATH = 'map.txt'~ ** Processing line: ~~ ** Processing line: ~ require 'app/map.rb'~ ** Processing line: ~~ @@ -222710,35 +230747,7 @@ Follows is a source code listing for all files that have been open sourced. This ** Processing line: ~~ ** Processing line: ~ def render_intro~ ** Processing line: ~ outputs.labels << [640, 700, "Clepto Frog", 4, 1]~ -** Processing line: ~ if state.tick_count >= 120~ -** Processing line: ~ outputs.labels << [640, 620, "\"Uh... your office has a pet frog?\" - New Guy",~ -** Processing line: ~ 4, 1, 0, 0, 0, 255 * 120.ease(60)]~ -** Processing line: ~ end~ -** Processing line: ~~ -** Processing line: ~ if state.tick_count >= 240~ -** Processing line: ~ outputs.labels << [640, 580, "\"Yep! His name is Clepto.\" - Jim",~ -** Processing line: ~ 4, 1, 0, 0, 0, 255 * 240.ease(60)]~ -** Processing line: ~ end~ -** Processing line: ~~ -** Processing line: ~ if state.tick_count >= 360~ -** Processing line: ~ outputs.labels << [640, 540, "\"Uh...\" - New Guy",~ -** Processing line: ~ 4, 1, 0, 0, 0, 255 * 360.ease(60)]~ -** Processing line: ~ end~ -** Processing line: ~~ -** Processing line: ~ if state.tick_count >= 480~ -** Processing line: ~ outputs.labels << [640, 500, "\"He steals mugs while we're away...\" - Jim",~ -** Processing line: ~ 4, 1, 0, 0, 0, 255 * 480.ease(60)]~ -** Processing line: ~ end~ -** Processing line: ~~ -** Processing line: ~ if state.tick_count >= 600~ -** Processing line: ~ outputs.labels << [640, 460, "\"It's not a big deal, we take them back in the morning.\" - Jim",~ -** Processing line: ~ 4, 1, 0, 0, 0, 255 * 600.ease(60)]~ -** Processing line: ~ end~ -** Processing line: ~~ -** Processing line: ~ outputs.sprites << [640 - 50, 360 - 50, 100, 100,~ -** Processing line: ~ "sprites/square-green.png"]~ -** Processing line: ~~ -** Processing line: ~ if state.tick_count == 800~ +** Processing line: ~ if state.tick_count == 120~ ** Processing line: ~ state.scene = :game~ ** Processing line: ~ state.game_start_at = state.tick_count~ ** Processing line: ~ end~ @@ -222746,7 +230755,7 @@ Follows is a source code listing for all files that have been open sourced. This ** Processing line: ~~ ** Processing line: ~ def tick~ ** Processing line: ~ defaults~ -** Processing line: ~ if state.scene == :intro && state.tick_count <= 800~ +** Processing line: ~ if state.scene == :intro && state.tick_count <= 120~ ** Processing line: ~ render_intro~ ** Processing line: ~ elsif state.scene == :ending~ ** Processing line: ~ render_ending~ @@ -222849,15 +230858,15 @@ Follows is a source code listing for all files that have been open sourced. This ** Processing line: ~~ ** Processing line: ~ if state.god_mode~ ** Processing line: ~ # SHOW HIDE COLLISIONS~ -** Processing line: ~ outputs.sprites << state.world.map do |x, y, w, h|~ -** Processing line: ~ x = vx(x)~ -** Processing line: ~ y = vy(y)~ +** Processing line: ~ outputs.sprites << state.world.map do |rect|~ +** Processing line: ~ x = vx(rect.x)~ +** Processing line: ~ y = vy(rect.y)~ ** Processing line: ~ if x > -80 && x < 1280 && y > -80 && y < 720~ ** Processing line: ~ {~ ** Processing line: ~ x: x,~ ** Processing line: ~ y: y,~ -** Processing line: ~ w: vw(w || state.tile_size),~ -** Processing line: ~ h: vh(h || state.tile_size),~ +** Processing line: ~ w: vw(rect.w || state.tile_size),~ +** Processing line: ~ h: vh(rect.h || state.tile_size),~ ** Processing line: ~ path: 'sprites/square-gray.png',~ ** Processing line: ~ a: 128~ ** Processing line: ~ }~ @@ -222880,8 +230889,10 @@ Follows is a source code listing for all files that have been open sourced. This ** Processing line: ~~ ** Processing line: ~~ ** Processing line: ~ # Creates sprite following mouse to help indicate which sprite you have selected~ -** Processing line: ~ outputs.primitives << [inputs.mouse.position.x, inputs.mouse.position.y,~ -** Processing line: ~ state.tile_size, state.tile_size, 'sprites/square-indigo.png', 0, 100].sprite~ +** Processing line: ~ outputs.primitives << [inputs.mouse.position.x - 32 * state.camera_scale,~ +** Processing line: ~ inputs.mouse.position.y - 32 * state.camera_scale,~ +** Processing line: ~ state.tile_size * state.camera_scale,~ +** Processing line: ~ state.tile_size * state.camera_scale, 'sprites/square-indigo.png', 0, 100].sprite~ ** Processing line: ~ end~ ** Processing line: ~~ ** Processing line: ~ render_mini_map~ @@ -222962,6 +230973,29 @@ Follows is a source code listing for all files that have been open sourced. This ** Processing line: ~ set_camera_scale 1~ ** Processing line: ~ end~ ** Processing line: ~~ +** Processing line: ~ if inputs.mouse.click~ +** Processing line: ~ state.id_seed += 1~ +** Processing line: ~ id = state.id_seed~ +** Processing line: ~ x = state.camera_x + (inputs.mouse.click.x.fdiv(state.camera_scale) - 32)~ +** Processing line: ~ y = state.camera_y + (inputs.mouse.click.y.fdiv(state.camera_scale) - 32)~ +** Processing line: ~ x = ((x + 2).idiv 4) * 4~ +** Processing line: ~ y = ((y + 2).idiv 4) * 4~ +** Processing line: ~ w = 64~ +** Processing line: ~ h = 64~ +** Processing line: ~ candidate_rect = { id: id, x: x, y: y, w: w, h: h }~ +** Processing line: ~ scaled_candidate_rect = { x: x + 30, y: y + 30, w: w - 60, h: h - 60 }~ +** Processing line: ~ to_remove = state.world.find { |r| r.intersect_rect? scaled_candidate_rect }~ +** Processing line: ~ if to_remove && args.inputs.keyboard.x~ +** Processing line: ~ state.world.reject! { |r| r.id == to_remove.id }~ +** Processing line: ~ else~ +** Processing line: ~ state.world << candidate_rect~ +** Processing line: ~ end~ +** Processing line: ~ export_map~ +** Processing line: ~ state.world_lookup = {}~ +** Processing line: ~ state.world_collision_rects = nil~ +** Processing line: ~ calc_world_lookup~ +** Processing line: ~ end~ +** Processing line: ~~ ** Processing line: ~ if input_up?~ ** Processing line: ~ state.y += 10~ ** Processing line: ~ state.dy = 0~ @@ -222983,12 +231017,6 @@ Follows is a source code listing for all files that have been open sourced. This ** Processing line: ~ if state.scene == :game~ ** Processing line: ~ process_inputs_player_movement~ ** Processing line: ~ process_inputs_god_mode~ -** Processing line: ~ elsif state.scene == :intro~ -** Processing line: ~ if args.inputs.keyboard.key_down.enter || args.inputs.keyboard.key_down.space~ -** Processing line: ~ if Kernel.tick_count < 600~ -** Processing line: ~ Kernel.tick_count = 600~ -** Processing line: ~ end~ -** Processing line: ~ end~ ** Processing line: ~ end~ ** Processing line: ~ end~ ** Processing line: ~~ @@ -223086,17 +231114,6 @@ Follows is a source code listing for all files that have been open sourced. This ** Processing line: ~ end~ ** Processing line: ~ end~ ** Processing line: ~~ -** Processing line: ~ def add_floors~ -** Processing line: ~ # floors~ -** Processing line: ~ state.world += [~ -** Processing line: ~ [0, 0, 10000, 40],~ -** Processing line: ~ [0, 1670, 3250, 60],~ -** Processing line: ~ [6691, 1653, 3290, 60],~ -** Processing line: ~ [1521, 3792, 7370, 60],~ -** Processing line: ~ [0, 5137, 3290, 60]~ -** Processing line: ~ ]~ -** Processing line: ~ end~ -** Processing line: ~~ ** Processing line: ~ def attempt_load_world_from_file~ ** Processing line: ~ return if state.world~ ** Processing line: ~ # exported_world = gtk.read_file(MAP_FILE_PATH)~ @@ -223104,26 +231121,11 @@ Follows is a source code listing for all files that have been open sourced. This ** Processing line: ~ state.objects = []~ ** Processing line: ~~ ** Processing line: ~ if $collisions~ -** Processing line: ~ $collisions.map do |x, y, w, h|~ -** Processing line: ~ state.world << [x, y, w, h]~ +** Processing line: ~ state.id_seed ||= 0~ +** Processing line: ~ $collisions.each do |x, y, w, h|~ +** Processing line: ~ state.id_seed += 1~ +** Processing line: ~ state.world << { id: state.id_seed, x: x, y: y, w: w, h: h }~ ** Processing line: ~ end~ -** Processing line: ~~ -** Processing line: ~ add_floors~ -** Processing line: ~ # elsif exported_world~ -** Processing line: ~ # exported_world.each_line.map do |l|~ -** Processing line: ~ # tokens = l.strip.split(',')~ -** Processing line: ~ # x = tokens[0].to_i~ -** Processing line: ~ # y = tokens[1].to_i~ -** Processing line: ~ # type = tokens[2].to_i~ -** Processing line: ~ # if type == 1~ -** Processing line: ~ # state.world << [x, y, state.tile_size, state.tile_size]~ -** Processing line: ~ # elsif type == 2~ -** Processing line: ~ # w, h, path = tokens[3..-1]~ -** Processing line: ~ # state.objects << [x, y, w.to_i, h.to_i, path]~ -** Processing line: ~ # end~ -** Processing line: ~ # end~ -** Processing line: ~~ -** Processing line: ~ # add_floors~ ** Processing line: ~ end~ ** Processing line: ~~ ** Processing line: ~ if $mugs~ @@ -223144,23 +231146,24 @@ Follows is a source code listing for all files that have been open sourced. This ** Processing line: ~~ ** Processing line: ~ # Searches through the world and finds the cordinates that exist~ ** Processing line: ~ state.world_lookup = {}~ -** Processing line: ~ state.world.each do |x, y, w, h|~ -** Processing line: ~ state.world_lookup[[x, y, w || state.tile_size, h || state.tile_size]] = true~ +** Processing line: ~ state.world.each do |rect|~ +** Processing line: ~ state.world_lookup[rect.id] = rect~ ** Processing line: ~ end~ ** Processing line: ~~ ** Processing line: ~ # Assigns collision rects for every sprite drawn~ ** Processing line: ~ state.world_collision_rects =~ ** Processing line: ~ state.world_lookup~ ** Processing line: ~ .keys~ -** Processing line: ~ .map do |x, y, w, h|~ +** Processing line: ~ .map do |key|~ +** Processing line: ~ rect = state.world_lookup[key]~ ** Processing line: ~ s = state.tile_size~ -** Processing line: ~ w ||= s~ -** Processing line: ~ h ||= s~ +** Processing line: ~ rect.w ||= s~ +** Processing line: ~ rect.h ||= s~ ** Processing line: ~ {~ -** Processing line: ~ args: [x, y, w, h],~ -** Processing line: ~ left_right: [x, y + 4, w, h - 6],~ -** Processing line: ~ top: [x + 4, y + 6, w - 8, h - 6],~ -** Processing line: ~ bottom: [x + 1, y - 1, w - 2, h - 8],~ +** Processing line: ~ args: rect,~ +** Processing line: ~ left_right: { x: rect.x, y: rect.y + 4, w: rect.w, h: rect.h - 6 },~ +** Processing line: ~ top: { x: rect.x + 4, y: rect.y + 6, w: rect.w - 8, h: rect.h - 6 },~ +** Processing line: ~ bottom: { x: rect.x + 1, y: rect.y - 1, w: rect.w - 2, h: rect.h - 8 },~ ** Processing line: ~ }~ ** Processing line: ~ end~ ** Processing line: ~~ @@ -223216,12 +231219,21 @@ Follows is a source code listing for all files that have been open sourced. This ** Processing line: ~~ ** Processing line: ~ def end_of_tongue~ ** Processing line: ~ p = state.tongue_angle.vector(state.tongue_length)~ -** Processing line: ~ [start_of_tongue.x + p.x, start_of_tongue.y + p.y]~ +** Processing line: ~ { x: start_of_tongue.x + p.x, y: start_of_tongue.y + p.y }~ ** Processing line: ~ end~ ** Processing line: ~~ ** Processing line: ~ def calc_shooting~ +** Processing line: ~ calc_shooting_increment~ +** Processing line: ~ calc_shooting_increment~ +** Processing line: ~ calc_shooting_increment~ +** Processing line: ~ calc_shooting_increment~ +** Processing line: ~ calc_shooting_increment~ +** Processing line: ~ calc_shooting_increment~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ def calc_shooting_increment~ ** Processing line: ~ return unless state.action == :shooting~ -** Processing line: ~ state.tongue_length += 30~ +** Processing line: ~ state.tongue_length += 5~ ** Processing line: ~ potential_anchor = end_of_tongue~ ** Processing line: ~ if potential_anchor.x <= 0~ ** Processing line: ~ state.anchor_point = potential_anchor~ @@ -223240,9 +231252,9 @@ Follows is a source code listing for all files that have been open sourced. This ** Processing line: ~ state.action = :anchored~ ** Processing line: ~ outputs.sounds << 'sounds/attached.wav'~ ** Processing line: ~ else~ -** Processing line: ~ anchor_rect = [potential_anchor.x - 5, potential_anchor.y - 5, 10, 10]~ +** Processing line: ~ anchor_rect = { x: potential_anchor.x - 5, y: potential_anchor.y - 5, w: 10, h: 10 }~ ** Processing line: ~ collision = state.world_collision_rects.find_all do |v|~ -** Processing line: ~ [v[:args].x, v[:args].y, v[:args].w, v[:args].h].intersect_rect?(anchor_rect)~ +** Processing line: ~ v[:args].intersect_rect?(anchor_rect)~ ** Processing line: ~ end.first~ ** Processing line: ~ if collision~ ** Processing line: ~ state.anchor_point = potential_anchor~ @@ -223338,7 +231350,7 @@ Follows is a source code listing for all files that have been open sourced. This ** Processing line: ~ .first~ ** Processing line: ~~ ** Processing line: ~ return unless left_side_collisions~ -** Processing line: ~ state.x = left_side_collisions[:left_right].right~ +** Processing line: ~ state.x = left_side_collisions[:left_right].right + 1~ ** Processing line: ~ state.dx = state.dy.abs * 0.8~ ** Processing line: ~ state.collision_on_x = true~ ** Processing line: ~ end~ @@ -223353,7 +231365,7 @@ Follows is a source code listing for all files that have been open sourced. This ** Processing line: ~ .first~ ** Processing line: ~~ ** Processing line: ~ return unless right_side_collisions~ -** Processing line: ~ state.x = right_side_collisions[:left_right].left - state.tile_size~ +** Processing line: ~ state.x = right_side_collisions[:left_right].left - state.tile_size - 1~ ** Processing line: ~ state.dx = state.dx.abs * 0.8 * -1~ ** Processing line: ~ state.collision_on_x = true~ ** Processing line: ~ end~ @@ -223369,7 +231381,7 @@ Follows is a source code listing for all files that have been open sourced. This ** Processing line: ~ .first~ ** Processing line: ~~ ** Processing line: ~ return unless ceil_collisions~ -** Processing line: ~ state.y = ceil_collisions[:bottom].y - state.tile_size~ +** Processing line: ~ state.y = ceil_collisions[:bottom].y - state.tile_size - 1~ ** Processing line: ~ state.dy = state.dy.abs * 0.8 * -1~ ** Processing line: ~ state.collision_on_y = true~ ** Processing line: ~ end~ @@ -223382,13 +231394,17 @@ Follows is a source code listing for all files that have been open sourced. This ** Processing line: ~ end~ ** Processing line: ~~ ** Processing line: ~ def export_map~ -** Processing line: ~ export_string = state.world.map do |x, y|~ -** Processing line: ~ "#{x},#{y},1"~ -** Processing line: ~ end~ +** Processing line: ~ export_string = "$collisions = [\n"~ +** Processing line: ~ export_string += state.world.map do |rect|~ +** Processing line: ~ "[#{rect.x},#{rect.y},#{rect.w},#{rect.h}],"~ +** Processing line: ~ end.join "\n"~ +** Processing line: ~ export_string += "\n]\n\n"~ +** Processing line: ~ export_string += "$mugs = [\n"~ ** Processing line: ~ export_string += state.objects.map do |x, y, w, h, path|~ -** Processing line: ~ "#{x},#{y},2,#{w},#{h},#{path}"~ -** Processing line: ~ end~ -** Processing line: ~ gtk.write_file(MAP_FILE_PATH, export_string.join("\n"))~ +** Processing line: ~ "[#{x},#{y},#{w},#{h},'#{path}'],"~ +** Processing line: ~ end.join "\n"~ +** Processing line: ~ export_string += "\n]\n\n"~ +** Processing line: ~ gtk.write_file(MAP_FILE_PATH, export_string)~ ** Processing line: ~ state.map_saved_at = state.tick_count~ ** Processing line: ~ end~ ** Processing line: ~~ @@ -224531,6 +232547,11 @@ Follows is a source code listing for all files that have been open sourced. This ** Processing line: ~ [4459, 3997, 64, 64],~ ** Processing line: ~ [76, 5215, 64, 64],~ ** Processing line: ~ [39, 5217, 64, 64],~ +** Processing line: ~ [0, 0, 10000, 40],~ +** Processing line: ~ [0, 1670, 3250, 60],~ +** Processing line: ~ [6691, 1653, 3290, 60],~ +** Processing line: ~ [1521, 3792, 7370, 60],~ +** Processing line: ~ [0, 5137, 3290, 60]~ ** Processing line: ~ ]~ ** Processing line: ~~ ** Processing line: ~ $mugs = [~ @@ -225461,6 +233482,7 @@ Follows is a source code listing for all files that have been open sourced. This ** Processing line: ~ end~ ** Processing line: ~~ ** Processing line: ~ def load_lines file~ +** Processing line: ~ return unless state.snaps~ ** Processing line: ~ data = gtk.read_file(file) || ""~ ** Processing line: ~ data.each_line~ ** Processing line: ~ .reject { |l| l.strip.length == 0 }~ @@ -225519,10 +233541,10 @@ Follows is a source code listing for all files that have been open sourced. This ** Processing line: ~ results[:point] = { x: x, y: y }~ ** Processing line: ~ results[:rect] = { x: x - radius, y: y - radius, w: radius * 2, h: radius * 2 }~ ** Processing line: ~ results[:trajectory] = trajectory(results)~ -** Processing line: ~ results[:impacts] = terrain.find_all { |t| line_near_rect? results[:rect], t }.map do |t|~ +** Processing line: ~ results[:impacts] = terrain.find_all { |t| t && (line_near_rect? results[:rect], t) }.map do |t|~ ** Processing line: ~ {~ ** Processing line: ~ terrain: t,~ -** Processing line: ~ point: geometry.line_intersect(results[:trajectory], t),~ +** Processing line: ~ point: geometry.line_intersect(results[:trajectory], t, replace_infinity: 1000),~ ** Processing line: ~ type: :terrain~ ** Processing line: ~ }~ ** Processing line: ~ end.reject { |t| !point_within_line? t[:point], t[:terrain] }~ @@ -225530,10 +233552,10 @@ Follows is a source code listing for all files that have been open sourced. This ** Processing line: ~ results[:impacts] += lava.find_all { |t| line_near_rect? results[:rect], t }.map do |t|~ ** Processing line: ~ {~ ** Processing line: ~ terrain: t,~ -** Processing line: ~ point: geometry.line_intersect(results[:trajectory], t),~ +** Processing line: ~ point: geometry.line_intersect(results[:trajectory], t, replace_infinity: 1000),~ ** Processing line: ~ type: :lava~ ** Processing line: ~ }~ -** Processing line: ~ end.reject { |t| !point_within_line? t[:point], t[:terrain] }~ +** Processing line: ~ end.reject { |t| !t || (!point_within_line? t[:point], t[:terrain]) }~ ** Processing line: ~~ ** Processing line: ~ results~ ** Processing line: ~ end~ @@ -225546,6 +233568,7 @@ Follows is a source code listing for all files that have been open sourced. This ** Processing line: ~ end~ ** Processing line: ~~ ** Processing line: ~ def calc_terrains_to_monitor~ +** Processing line: ~ return unless circle.impacts~ ** Processing line: ~ circle.impact = nil~ ** Processing line: ~ circle.impacts.each do |i|~ ** Processing line: ~ circle.terrains_to_monitor[i[:terrain]] ||= {~ @@ -231457,6 +239480,166 @@ Follows is a source code listing for all files that have been open sourced. This - PRE end detected. ** Processing line: ~~ ** Processing line: ~~ +** Processing line: ~*** Rpg Topdown - Topdown Casino - main.rb~ +- H3 detected. +- Determining if line is a header. +- Line contains ~*** ~... gsub-ing empty string +- Formatting line: ~Rpg Topdown - Topdown Casino - main.rb~ +- Line's tilde count is: 0 +- Line contains link marker: false +- Determining if line is a header. +- Line contains ~*** ~... gsub-ing empty string +- Formatting line: ~Rpg Topdown - Topdown Casino - main.rb~ +- Line's tilde count is: 0 +- Line contains link marker: false +** Processing line: ~~ +** Processing line: ~#+begin_src ruby~ +- PRE start detected. +** Processing line: ~ # ./samples/99_genre_rpg_topdown/topdown_casino/app/main.rb~ +** Processing line: ~ $gtk.reset~ +** Processing line: ~~ +** Processing line: ~ def coinflip~ +** Processing line: ~ rand < 0.5~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ class Game~ +** Processing line: ~ attr_accessor :args~ +** Processing line: ~~ +** Processing line: ~ def text_font~ +** Processing line: ~ return nil #"rpg.ttf"~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ def text_color~ +** Processing line: ~ [ 255, 255, 255, 255 ]~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ def set_gem_values~ +** Processing line: ~ @args.state.gem0 = ((coinflip) ? 100 : 20)~ +** Processing line: ~ @args.state.gem1 = ((coinflip) ? -10 : -50)~ +** Processing line: ~ @args.state.gem2 = ((coinflip) ? -10 : -30)~ +** Processing line: ~ if coinflip~ +** Processing line: ~ tmp = @args.state.gem0~ +** Processing line: ~ @args.state.gem0 = @args.state.gem1~ +** Processing line: ~ @args.state.gem1 = tmp~ +** Processing line: ~ end~ +** Processing line: ~ if coinflip~ +** Processing line: ~ tmp = @args.state.gem1~ +** Processing line: ~ @args.state.gem1 = @args.state.gem2~ +** Processing line: ~ @args.state.gem2 = tmp~ +** Processing line: ~ end~ +** Processing line: ~ if coinflip~ +** Processing line: ~ tmp = @args.state.gem0~ +** Processing line: ~ @args.state.gem0 = @args.state.gem2~ +** Processing line: ~ @args.state.gem2 = tmp~ +** Processing line: ~ end~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ def initialize args~ +** Processing line: ~ @args = args~ +** Processing line: ~ @args.state.animticks = 0~ +** Processing line: ~ @args.state.score = 0~ +** Processing line: ~ @args.state.gem_chosen = false~ +** Processing line: ~ @args.state.round_finished = false~ +** Processing line: ~ @args.state.gem0_x = 197~ +** Processing line: ~ @args.state.gem0_y = 720-274~ +** Processing line: ~ @args.state.gem1_x = 623~ +** Processing line: ~ @args.state.gem1_y = 720-274~ +** Processing line: ~ @args.state.gem2_x = 1049~ +** Processing line: ~ @args.state.gem2_y = 720-274~ +** Processing line: ~ @args.state.hero_sprite = "sprites/herodown100.png"~ +** Processing line: ~ @args.state.hero_x = 608~ +** Processing line: ~ @args.state.hero_y = 720-656~ +** Processing line: ~ set_gem_values~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ def render_gem_value x, y, gem~ +** Processing line: ~ if @args.state.gem_chosen~ +** Processing line: ~ @args.outputs.labels << [ x, y + 96, gem.to_s, 1, 1, *text_color, text_font ]~ +** Processing line: ~ end~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ def render~ +** Processing line: ~ gemsprite = ((@args.state.animticks % 400) < 200) ? 'sprites/gem200.png' : 'sprites/gem400.png'~ +** Processing line: ~ @args.outputs.background_color = [ 0, 0, 0, 255 ]~ +** Processing line: ~ @args.outputs.sprites << [608, 720-150, 64, 64, 'sprites/oldman.png']~ +** Processing line: ~ @args.outputs.sprites << [300, 720-150, 64, 64, 'sprites/fire.png']~ +** Processing line: ~ @args.outputs.sprites << [900, 720-150, 64, 64, 'sprites/fire.png']~ +** Processing line: ~ @args.outputs.sprites << [@args.state.gem0_x, @args.state.gem0_y, 32, 64, gemsprite]~ +** Processing line: ~ @args.outputs.sprites << [@args.state.gem1_x, @args.state.gem1_y, 32, 64, gemsprite]~ +** Processing line: ~ @args.outputs.sprites << [@args.state.gem2_x, @args.state.gem2_y, 32, 64, gemsprite]~ +** Processing line: ~ @args.outputs.sprites << [@args.state.hero_x, @args.state.hero_y, 64, 64, @args.state.hero_sprite]~ +** Processing line: ~~ +** Processing line: ~ @args.outputs.labels << [ 630, 720-30, "IT'S A SECRET TO EVERYONE.", 1, 1, *text_color, text_font ]~ +** Processing line: ~ @args.outputs.labels << [ 50, 720-85, @args.state.score.to_s, 1, 1, *text_color, text_font ]~ +** Processing line: ~ render_gem_value @args.state.gem0_x, @args.state.gem0_y, @args.state.gem0~ +** Processing line: ~ render_gem_value @args.state.gem1_x, @args.state.gem1_y, @args.state.gem1~ +** Processing line: ~ render_gem_value @args.state.gem2_x, @args.state.gem2_y, @args.state.gem2~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ def calc~ +** Processing line: ~ @args.state.animticks += 16~ +** Processing line: ~~ +** Processing line: ~ return unless @args.state.gem_chosen~ +** Processing line: ~ @args.state.round_finished_debounce ||= 60 * 3~ +** Processing line: ~ @args.state.round_finished_debounce -= 1~ +** Processing line: ~ return if @args.state.round_finished_debounce > 0~ +** Processing line: ~~ +** Processing line: ~ @args.state.gem_chosen = false~ +** Processing line: ~ @args.state.hero.sprite[0] = 'sprites/herodown100.png'~ +** Processing line: ~ @args.state.hero.sprite[1] = 608~ +** Processing line: ~ @args.state.hero.sprite[2] = 656~ +** Processing line: ~ @args.state.round_finished_debounce = nil~ +** Processing line: ~ set_gem_values~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ def walk xdir, ydir, anim~ +** Processing line: ~ @args.state.hero_sprite = "sprites/#{anim}#{(((@args.state.animticks % 200) < 100) ? '100' : '200')}.png"~ +** Processing line: ~ @args.state.hero_x += 5 * xdir~ +** Processing line: ~ @args.state.hero_y += 5 * ydir~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ def check_gem_touching gem_x, gem_y, gem~ +** Processing line: ~ return if @args.state.gem_chosen~ +** Processing line: ~ herorect = [ @args.state.hero_x, @args.state.hero_y, 64, 64 ]~ +** Processing line: ~ return if !herorect.intersect_rect?([gem_x, gem_y, 32, 64])~ +** Processing line: ~ @args.state.gem_chosen = true~ +** Processing line: ~ @args.state.score += gem~ +** Processing line: ~ @args.outputs.sounds << ((gem < 0) ? 'sounds/lose.wav' : 'sounds/win.wav')~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ def input~ +** Processing line: ~ if @args.inputs.keyboard.key_held.left~ +** Processing line: ~ walk(-1.0, 0.0, 'heroleft')~ +** Processing line: ~ elsif @args.inputs.keyboard.key_held.right~ +** Processing line: ~ walk(1.0, 0.0, 'heroright')~ +** Processing line: ~ elsif @args.inputs.keyboard.key_held.up~ +** Processing line: ~ walk(0.0, 1.0, 'heroup')~ +** Processing line: ~ elsif @args.inputs.keyboard.key_held.down~ +** Processing line: ~ walk(0.0, -1.0, 'herodown')~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ check_gem_touching(@args.state.gem0_x, @args.state.gem0_y, @args.state.gem0)~ +** Processing line: ~ check_gem_touching(@args.state.gem1_x, @args.state.gem1_y, @args.state.gem1)~ +** Processing line: ~ check_gem_touching(@args.state.gem2_x, @args.state.gem2_y, @args.state.gem2)~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ def tick~ +** Processing line: ~ input~ +** Processing line: ~ calc~ +** Processing line: ~ render~ +** Processing line: ~ end~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ def tick args~ +** Processing line: ~ args.state.game ||= Game.new args~ +** Processing line: ~ args.state.game.args = args~ +** Processing line: ~ args.state.game.tick~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~#+end_src~ +- PRE end detected. +** Processing line: ~~ +** Processing line: ~~ ** Processing line: ~*** Rpg Topdown - Topdown Starting Point - main.rb~ - H3 detected. - Determining if line is a header. @@ -231586,22 +239769,22 @@ Follows is a source code listing for all files that have been open sourced. This - PRE end detected. ** Processing line: ~~ ** Processing line: ~~ -** Processing line: ~*** Teentiny - main.rb~ +** Processing line: ~*** Teenytiny - Teenytiny Starting Point - main.rb~ - H3 detected. - Determining if line is a header. - Line contains ~*** ~... gsub-ing empty string -- Formatting line: ~Teentiny - main.rb~ +- Formatting line: ~Teenytiny - Teenytiny Starting Point - main.rb~ - Line's tilde count is: 0 - Line contains link marker: false - Determining if line is a header. - Line contains ~*** ~... gsub-ing empty string -- Formatting line: ~Teentiny - main.rb~ +- Formatting line: ~Teenytiny - Teenytiny Starting Point - main.rb~ - Line's tilde count is: 0 - Line contains link marker: false ** Processing line: ~~ ** Processing line: ~#+begin_src ruby~ - PRE start detected. -** Processing line: ~ # ./samples/99_genre_teentiny/app/main.rb~ +** Processing line: ~ # ./samples/99_genre_teenytiny/teenytiny_starting_point/app/main.rb~ ** Processing line: ~ # full documenation is at http://docs.dragonruby.org~ ** Processing line: ~ # be sure to come to the discord if you hit any snags: http://discord.dragonruby.org~ ** Processing line: ~ def tick args~ @@ -231769,22 +239952,22 @@ Follows is a source code listing for all files that have been open sourced. This - PRE end detected. ** Processing line: ~~ ** Processing line: ~~ -** Processing line: ~*** Teentiny - license.txt~ +** Processing line: ~*** Teenytiny - Teenytiny Starting Point - license.txt~ - H3 detected. - Determining if line is a header. - Line contains ~*** ~... gsub-ing empty string -- Formatting line: ~Teentiny - license.txt~ +- Formatting line: ~Teenytiny - Teenytiny Starting Point - license.txt~ - Line's tilde count is: 0 - Line contains link marker: false - Determining if line is a header. - Line contains ~*** ~... gsub-ing empty string -- Formatting line: ~Teentiny - license.txt~ +- Formatting line: ~Teenytiny - Teenytiny Starting Point - license.txt~ - Line's tilde count is: 0 - Line contains link marker: false ** Processing line: ~~ ** Processing line: ~#+begin_src ruby~ - PRE start detected. -** Processing line: ~ # ./samples/99_genre_teentiny/license.txt~ +** Processing line: ~ # ./samples/99_genre_teenytiny/teenytiny_starting_point/license.txt~ ** Processing line: ~ Copyright 2019 DragonRuby LLC~ ** Processing line: ~~ ** Processing line: ~ MIT License~ @@ -231819,6 +240002,661 @@ Follows is a source code listing for all files that have been open sourced. This - Line's tilde count is: 0 - Line contains link marker: true - LINK detected. +** Processing line: ~*** api.rb~ +- H3 detected. +- Determining if line is a header. +- Line contains ~*** ~... gsub-ing empty string +- Formatting line: ~api.rb~ +- Line's tilde count is: 0 +- Line contains link marker: false +- Determining if line is a header. +- Line contains ~*** ~... gsub-ing empty string +- Formatting line: ~api.rb~ +- Line's tilde count is: 0 +- Line contains link marker: false +** Processing line: ~~ +** Processing line: ~#+begin_src ruby~ +- PRE start detected. +** Processing line: ~ # ./dragon/api.rb~ +** Processing line: ~ # coding: utf-8~ +** Processing line: ~ # Copyright 2019 DragonRuby LLC~ +** Processing line: ~ # MIT License~ +** Processing line: ~ # api.rb has been released under MIT (*only this file*).~ +** Processing line: ~~ +** Processing line: ~ module GTK~ +** Processing line: ~ class Api~ +** Processing line: ~ def initialize~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ def get_api_autocomplete args, req~ +** Processing line: ~ html = <<-S~ +** Processing line: ~ ~ +** Processing line: ~ ~ +** Processing line: ~ ~ +** Processing line: ~ DragonRuby Game Toolkit Documentation~ +** Processing line: ~ ~ +** Processing line: ~ ~ +** Processing line: ~ ~ +** Processing line: ~ ~ +** Processing line: ~
    ~ +** Processing line: ~
    index
    ~ +** Processing line: ~ ~ +** Processing line: ~
    code
    ~ +** Processing line: ~ ~ +** Processing line: ~
    ~ +** Processing line: ~ ~ +** Processing line: ~ ~ +** Processing line: ~
    ~ +** Processing line: ~
    ~
    +** Processing line: ~        
    ~ +** Processing line: ~~ +** Processing line: ~ #{links}~ +** Processing line: ~ ~ +** Processing line: ~ ~ +** Processing line: ~ S~ +** Processing line: ~~ +** Processing line: ~ req.respond 200,~ +** Processing line: ~ html,~ +** Processing line: ~ { 'Content-Type' => 'text/html' }~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ def post_api_autocomplete args, req~ +** Processing line: ~ json = ($gtk.parse_json req.body)~ +** Processing line: ~ index = json["index"].to_i~ +** Processing line: ~ text = json["text"]~ +** Processing line: ~ suggestions = args.gtk.suggest_autocompletion index: index, text: text~ +** Processing line: ~ list_as_string = suggestions.join("\n")~ +** Processing line: ~ req.respond 200, list_as_string, { 'Content-Type' => 'text/plain' }~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ define_method :links do~ +** Processing line: ~ <<-S~ +** Processing line: ~
      ~ +** Processing line: ~
    • Home
    • ~ +** Processing line: ~
    • Docs
    • ~ +** Processing line: ~
    • Control Panel
    • ~ +** Processing line: ~
    • Console
    • ~ +** Processing line: ~
    • Logs
    • ~ +** Processing line: ~
    • Puts
    • ~ +** Processing line: ~
    • Code
    • ~ +** Processing line: ~
    ~ +** Processing line: ~ S~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ def get_index args, req~ +** Processing line: ~ req.respond 200, <<-S, { 'Content-Type' => 'text/html' }~ +** Processing line: ~ ~ +** Processing line: ~ ~ +** Processing line: ~ ~ +** Processing line: ~ DragonRuby Game Toolkit Documentation~ +** Processing line: ~ ~ +** Processing line: ~ ~ +** Processing line: ~ #{links}~ +** Processing line: ~ ~ +** Processing line: ~ ~ +** Processing line: ~ S~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ def source_code_links args~ +** Processing line: ~ links = args.gtk.reload_list_history.keys.map do |f|~ +** Processing line: ~ "
  • #{f}
  • "~ +** Processing line: ~ end~ +** Processing line: ~ <<-S~ +** Processing line: ~
      ~ +** Processing line: ~ #{links.join("\n")}~ +** Processing line: ~
    ~ +** Processing line: ~ S~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ def get_api_code args, req~ +** Processing line: ~ view = <<-S~ +** Processing line: ~ ~ +** Processing line: ~ ~ +** Processing line: ~ ~ +** Processing line: ~ DragonRuby Game Toolkit Documentation~ +** Processing line: ~ ~ +** Processing line: ~ ~ +** Processing line: ~ #{source_code_links args}~ +** Processing line: ~~ +** Processing line: ~ #{links}~ +** Processing line: ~ ~ +** Processing line: ~ ~ +** Processing line: ~ S~ +** Processing line: ~ req.respond 200,~ +** Processing line: ~ view,~ +** Processing line: ~ { 'Content-Type' => 'text/html' }~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ def code_edit_view args, file~ +** Processing line: ~ view = <<-S~ +** Processing line: ~ ~ +** Processing line: ~ ~ +** Processing line: ~ ~ +** Processing line: ~ DragonRuby Game Toolkit Documentation~ +** Processing line: ~ ~ +** Processing line: ~ ~ +** Processing line: ~ ~ +** Processing line: ~
    ~ +** Processing line: ~
    #{file}:
    ~ +** Processing line: ~ ~ +** Processing line: ~
    ~ +** Processing line: ~ ~ +** Processing line: ~ ~ +** Processing line: ~
    ~ +** Processing line: ~ #{source_code_links args}~ +** Processing line: ~~ +** Processing line: ~ #{links}~ +** Processing line: ~ ~ +** Processing line: ~ ~ +** Processing line: ~ S~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ def get_api_code_edit args, req~ +** Processing line: ~ file = req.uri.split('?').last.gsub("file=", "")~ +** Processing line: ~ view = code_edit_view args, file~ +** Processing line: ~ req.respond 200,~ +** Processing line: ~ view,~ +** Processing line: ~ { 'Content-Type' => 'text/html' }~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ def post_api_code_update args, req~ +** Processing line: ~ file = req.uri.split('?').last.gsub("file=", "")~ +** Processing line: ~ code = ($gtk.parse_json req.body)["code"]~ +** Processing line: ~ args.gtk.write_file file, code~ +** Processing line: ~ view = code_edit_view args, file~ +** Processing line: ~ req.respond 200,~ +** Processing line: ~ view,~ +** Processing line: ~ { 'Content-Type' => 'text/html' }~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ def get_api_boot args, req~ +** Processing line: ~ req.respond 200,~ +** Processing line: ~ args.gtk.read_file("tmp/src_backup/boot.txt"),~ +** Processing line: ~ { 'Content-Type' => 'text/plain' }~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ def get_api_trace args, req~ +** Processing line: ~ req.respond 200,~ +** Processing line: ~ args.gtk.read_file("logs/trace.txt"),~ +** Processing line: ~ { 'Content-Type' => 'text/plain' }~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ def get_api_log args, req~ +** Processing line: ~ req.respond 200,~ +** Processing line: ~ args.gtk.read_file("logs/log.txt"),~ +** Processing line: ~ { 'Content-Type' => 'text/plain' }~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ def post_api_log args, req~ +** Processing line: ~ Log.log req.body~ +** Processing line: ~~ +** Processing line: ~ req.respond 200,~ +** Processing line: ~ "ok",~ +** Processing line: ~ { 'Content-Type' => 'text/plain' }~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ def get_api_puts args, req~ +** Processing line: ~ req.respond 200,~ +** Processing line: ~ args.gtk.read_file("logs/puts.txt"),~ +** Processing line: ~ { 'Content-Type' => 'text/plain' }~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ def get_api_changes args, req~ +** Processing line: ~ req.respond 200,~ +** Processing line: ~ args.gtk.read_file("tmp/src_backup/src_backup_changes.txt"),~ +** Processing line: ~ { 'Content-Type' => 'text/plain' }~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ def get_favicon_ico args, req~ +** Processing line: ~ @favicon ||= args.gtk.read_file('docs/favicon.ico')~ +** Processing line: ~ req.respond 200, @favicon, { "Content-Type" => 'image/x-icon' }~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ def get_src_backup args, req~ +** Processing line: ~ file_name = req.uri.gsub("/dragon/", "")~ +** Processing line: ~ req.respond 200,~ +** Processing line: ~ args.gtk.read_file("tmp/src_backup/#{file_name}"),~ +** Processing line: ~ { 'Content-Type' => 'text/plain' }~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ def get_not_found args, req~ +** Processing line: ~ puts("METHOD: #{req.method}");~ +** Processing line: ~ puts("URI: #{req.uri}");~ +** Processing line: ~ puts("HEADERS:");~ +** Processing line: ~ req.headers.each { |k,v| puts(" #{k}: #{v}") }~ +** Processing line: ~ req.respond 404, "not found: #{req.uri}", { }~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ def get_docs_html args, req~ +** Processing line: ~ req.respond 200,~ +** Processing line: ~ args.gtk.read_file("docs/docs.html"),~ +** Processing line: ~ { 'Content-Type' => 'text/html' }~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ def get_docs_css args, req~ +** Processing line: ~ req.respond 200,~ +** Processing line: ~ args.gtk.read_file("docs/docs.css"),~ +** Processing line: ~ { 'Content-Type' => 'text/css' }~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ def get_docs_search_gif args, req~ +** Processing line: ~ req.respond 200,~ +** Processing line: ~ args.gtk.read_file("docs/docs_search.gif"),~ +** Processing line: ~ { 'Content-Type' => 'image/gif' }~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ def get_src_backup_index_html args, req~ +** Processing line: ~ req.respond 200,~ +** Processing line: ~ args.gtk.read_file("/tmp/src_backup/src_backup_index.html"),~ +** Processing line: ~ { 'Content-Type' => 'text/html' }~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ def get_src_backup_index_txt args, req~ +** Processing line: ~ req.respond 200,~ +** Processing line: ~ args.gtk.read_file("/tmp/src_backup/src_backup_index.txt"),~ +** Processing line: ~ { 'Content-Type' => 'text/txt' }~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ def get_src_backup_css args, req~ +** Processing line: ~ req.respond 200,~ +** Processing line: ~ args.gtk.read_file("/tmp/src_backup/src_backup.css"),~ +** Processing line: ~ { 'Content-Type' => 'text/css' }~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ def get_src_backup_changes_html args, req~ +** Processing line: ~ req.respond 200,~ +** Processing line: ~ args.gtk.read_file("/tmp/src_backup/src_backup_changes.html"),~ +** Processing line: ~ { 'Content-Type' => 'text/html' }~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ def get_src_backup_changes_txt args, req~ +** Processing line: ~ req.respond 200,~ +** Processing line: ~ args.gtk.read_file("/tmp/src_backup/src_backup_changes.txt"),~ +** Processing line: ~ { 'Content-Type' => 'text/txt' }~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ def get_api_eval args, req~ +** Processing line: ~ eval_view = <<-S~ +** Processing line: ~ ~ +** Processing line: ~ Eval~ +** Processing line: ~ ~ +** Processing line: ~ ~ +** Processing line: ~ ~ +** Processing line: ~
    ~ +** Processing line: ~ ~ +** Processing line: ~
    ~ +** Processing line: ~ ~ +** Processing line: ~
    ~ +** Processing line: ~
    curl -H "Content-Type: application/json" --data '{ "code": "$result = $args.state" }' -X POST http://localhost:9001/dragon/eval/
    ~ +** Processing line: ~
    Eval Result:
    ~ +** Processing line: ~
    ~
    +** Processing line: ~      #{links}~
    +** Processing line: ~    ~
    +** Processing line: ~  ~
    +** Processing line: ~  S~
    +** Processing line: ~        req.respond 200,~
    +** Processing line: ~                    eval_view,~
    +** Processing line: ~                    { 'Content-Type' => 'text/html' }~
    +** Processing line: ~      end~
    +** Processing line: ~~
    +** Processing line: ~      def post_api_eval args, req~
    +** Processing line: ~        if json? req~
    +** Processing line: ~          code = ($gtk.parse_json req.body)["code"]~
    +** Processing line: ~          code = code.gsub("$result", "$eval_result")~
    +** Processing line: ~          Object.new.instance_eval do~
    +** Processing line: ~            begin~
    +** Processing line: ~              Kernel.eval code~
    +** Processing line: ~            rescue Exception => e~
    +** Processing line: ~              $eval_result = e~
    +** Processing line: ~            end~
    +** Processing line: ~          end~
    +** Processing line: ~        end~
    +** Processing line: ~~
    +** Processing line: ~        req.respond 200,~
    +** Processing line: ~                    "#{$eval_result || $eval_results || "nil"}",~
    +** Processing line: ~                    { 'Content-Type' => 'text/plain' }~
    +** Processing line: ~~
    +** Processing line: ~        $eval_result  = nil~
    +** Processing line: ~        $eval_results = nil~
    +** Processing line: ~      end~
    +** Processing line: ~~
    +** Processing line: ~      def api_css_string~
    +** Processing line: ~~
    +** Processing line: ~      end~
    +** Processing line: ~~
    +** Processing line: ~      def get_api_console args, req~
    +** Processing line: ~        html = console_view "# write your code here and set $result.\n$result = $gtk.args.state"~
    +** Processing line: ~        req.respond 200,~
    +** Processing line: ~                    html,~
    +** Processing line: ~                    { 'Content-Type' => 'text/html' }~
    +** Processing line: ~      end~
    +** Processing line: ~~
    +** Processing line: ~      def control_panel_view~
    +** Processing line: ~        <<-S~
    +** Processing line: ~  ~
    +** Processing line: ~    console~
    +** Processing line: ~    ~
    +** Processing line: ~      ~
    +** Processing line: ~      
    ~ +** Processing line: ~ ~ +** Processing line: ~
    ~ +** Processing line: ~
    ~ +** Processing line: ~ ~ +** Processing line: ~
    ~ +** Processing line: ~
    ~ +** Processing line: ~ ~ +** Processing line: ~
    ~ +** Processing line: ~
    ~ +** Processing line: ~ ~ +** Processing line: ~
    ~ +** Processing line: ~
    ~ +** Processing line: ~ ~ +** Processing line: ~
    ~ +** Processing line: ~
    ~ +** Processing line: ~ #{links}~ +** Processing line: ~ ~ +** Processing line: ~ ~ +** Processing line: ~ S~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ def get_api_control_panel args, req~ +** Processing line: ~ req.respond 200,~ +** Processing line: ~ control_panel_view,~ +** Processing line: ~ { 'Content-Type' => 'text/html' }~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ def json? req~ +** Processing line: ~ req.headers.find { |k, v| k == "Content-Type" && (v.include? "application/json") }~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ def post_api_reset args, req~ +** Processing line: ~ $gtk.reset if json? req~ +** Processing line: ~ req.respond 200,~ +** Processing line: ~ control_panel_view,~ +** Processing line: ~ { 'Content-Type' => 'text/html' }~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ def post_api_record args, req~ +** Processing line: ~ $recording.start 100 if json? req~ +** Processing line: ~ req.respond 200,~ +** Processing line: ~ control_panel_view,~ +** Processing line: ~ { 'Content-Type' => 'text/html' }~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ def post_api_record_stop args, req~ +** Processing line: ~ $recording.stop 'replay.txt' if json? req~ +** Processing line: ~ req.respond 200,~ +** Processing line: ~ control_panel_view,~ +** Processing line: ~ { 'Content-Type' => 'text/html' }~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ def post_api_replay args, req~ +** Processing line: ~ $replay.start 'replay.txt' if json? req~ +** Processing line: ~ req.respond 200,~ +** Processing line: ~ control_panel_view,~ +** Processing line: ~ { 'Content-Type' => 'text/html' }~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ def post_api_show_console args, req~ +** Processing line: ~ $gtk.console.show if json? req~ +** Processing line: ~ req.respond 200,~ +** Processing line: ~ control_panel_view,~ +** Processing line: ~ { 'Content-Type' => 'text/html' }~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ def tick args~ +** Processing line: ~ args.inputs.http_requests.each do |req|~ +** Processing line: ~ match_candidate = { method: req.method.downcase.to_sym,~ +** Processing line: ~ uri: req.uri,~ +** Processing line: ~ uri_without_query_string: (req.uri.split '?').first,~ +** Processing line: ~ query_string: (req.uri.split '?').last,~ +** Processing line: ~ has_query_string: !!(req.uri.split '?').last,~ +** Processing line: ~ has_api_prefix: (req.uri.start_with? "/dragon"),~ +** Processing line: ~ end_with_rb: (req.uri.end_with? ".rb"),~ +** Processing line: ~ has_file_extension: file_extensions.find { |f| req.uri.include? f },~ +** Processing line: ~ has_trailing_slash: (req.uri.split('?').first.end_with? "/") }~ +** Processing line: ~~ +** Processing line: ~ if !match_candidate[:has_file_extension]~ +** Processing line: ~ if !match_candidate[:has_trailing_slash]~ +** Processing line: ~ match_candidate[:uri] = match_candidate[:uri_without_query_string] + "/"~ +** Processing line: ~ if match_candidate[:query_string]~ +** Processing line: ~ match_candidate[:uri] += "?#{match_candidate[:query_string]}"~ +** Processing line: ~ end~ +** Processing line: ~ end~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ context = { args: args, req: req, match_candidate: match_candidate }~ +** Processing line: ~~ +** Processing line: ~ process! context: context, routes: routes~ +** Processing line: ~ end~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ def url_decode args, string~ +** Processing line: ~ args.fn.gsub string,~ +** Processing line: ~ '+', " ",~ +** Processing line: ~ '%27', "'",~ +** Processing line: ~ '%22', '"',~ +** Processing line: ~ '%0D%0A', "\n",~ +** Processing line: ~ '%3D', "=",~ +** Processing line: ~ '%3B', ";",~ +** Processing line: ~ '%7C', "|",~ +** Processing line: ~ '%28', "(",~ +** Processing line: ~ '%29', ")",~ +** Processing line: ~ '%7B', "{",~ +** Processing line: ~ '%7D', "}",~ +** Processing line: ~ '%2C', ",",~ +** Processing line: ~ '%3A', ":",~ +** Processing line: ~ '%5B', "[",~ +** Processing line: ~ '%5D', "]",~ +** Processing line: ~ '%23', "#",~ +** Processing line: ~ '%21', "!",~ +** Processing line: ~ '%3C', "<",~ +** Processing line: ~ '%3E', ">",~ +** Processing line: ~ '%2B', "+",~ +** Processing line: ~ '%2F', "/",~ +** Processing line: ~ '%40', "@",~ +** Processing line: ~ '%3F', "?",~ +** Processing line: ~ '%26', "&",~ +** Processing line: ~ '%24', "$",~ +** Processing line: ~ '%5C', "\\",~ +** Processing line: ~ '%60', "`",~ +** Processing line: ~ '%7E', "~",~ +** Processing line: ~ '%C2%B2', "²",~ +** Processing line: ~ '%5E', "^",~ +** Processing line: ~ '%C2%BA', "º",~ +** Processing line: ~ '%C2%A7', "§",~ +** Processing line: ~ '%20', " ",~ +** Processing line: ~ '%0A', "\n",~ +** Processing line: ~ '%25', "%",~ +** Processing line: ~ '%2A', "*"~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ def file_extensions~ +** Processing line: ~ [".html", ".css", ".gif", ".txt", ".ico", ".rb"]~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ def routes~ +** Processing line: ~ [{ match_criteria: { method: :get, uri: "/" },~ +** Processing line: ~ handler: :get_index },~ +** Processing line: ~ { match_criteria: { method: :get, uri: "/dragon/" },~ +** Processing line: ~ handler: :get_index },~ +** Processing line: ~~ +** Processing line: ~ { match_criteria: { method: :get, uri: "/dragon/boot/" },~ +** Processing line: ~ handler: :get_api_boot },~ +** Processing line: ~ { match_criteria: { method: :get, uri: "/dragon/trace/" },~ +** Processing line: ~ handler: :get_api_trace },~ +** Processing line: ~ { match_criteria: { method: :get, uri: "/dragon/puts/" },~ +** Processing line: ~ handler: :get_api_puts },~ +** Processing line: ~ { match_criteria: { method: :get, uri: "/dragon/log/" },~ +** Processing line: ~ handler: :get_api_log },~ +** Processing line: ~ { match_criteria: { method: :post, uri: "/dragon/log/" },~ +** Processing line: ~ handler: :post_api_log },~ +** Processing line: ~ { match_criteria: { method: :get, uri: "/dragon/changes/" },~ +** Processing line: ~ handler: :get_api_changes },~ +** Processing line: ~ { match_criteria: { method: :get, uri: "/dragon/eval/" },~ +** Processing line: ~ handler: :get_api_eval },~ +** Processing line: ~ { match_criteria: { method: :post, uri: "/dragon/eval/" },~ +** Processing line: ~ handler: :post_api_eval },~ +** Processing line: ~ { match_criteria: { method: :get, uri: "/dragon/console/" },~ +** Processing line: ~ handler: :get_api_console },~ +** Processing line: ~ { match_criteria: { method: :post, uri: "/dragon/console/" },~ +** Processing line: ~ handler: :post_api_console },~ +** Processing line: ~ { match_criteria: { method: :get, uri: "/dragon/control_panel/" },~ +** Processing line: ~ handler: :get_api_control_panel },~ +** Processing line: ~ { match_criteria: { method: :post, uri: "/dragon/reset/" },~ +** Processing line: ~ handler: :post_api_reset },~ +** Processing line: ~ { match_criteria: { method: :post, uri: "/dragon/record/" },~ +** Processing line: ~ handler: :post_api_record },~ +** Processing line: ~ { match_criteria: { method: :post, uri: "/dragon/record_stop/" },~ +** Processing line: ~ handler: :post_api_record_stop },~ +** Processing line: ~ { match_criteria: { method: :post, uri: "/dragon/replay/" },~ +** Processing line: ~ handler: :post_api_replay },~ +** Processing line: ~ { match_criteria: { method: :post, uri: "/dragon/show_console/" },~ +** Processing line: ~ handler: :post_api_show_console },~ +** Processing line: ~ { match_criteria: { method: :get, uri: "/dragon/code/" },~ +** Processing line: ~ handler: :get_api_code },~ +** Processing line: ~ { match_criteria: { method: :get, uri: "/dragon/autocomplete/" },~ +** Processing line: ~ handler: :get_api_autocomplete },~ +** Processing line: ~ { match_criteria: { method: :post, uri: "/dragon/autocomplete/" },~ +** Processing line: ~ handler: :post_api_autocomplete },~ +** Processing line: ~ { match_criteria: { method: :get, uri_without_query_string: "/dragon/code/edit/", has_query_string: true },~ +** Processing line: ~ handler: :get_api_code_edit },~ +** Processing line: ~ { match_criteria: { method: :post, uri_without_query_string: "/dragon/code/update/", has_query_string: true },~ +** Processing line: ~ handler: :post_api_code_update },~ +** Processing line: ~~ +** Processing line: ~~ +** Processing line: ~ { match_criteria: { method: :get, uri: "/docs.html" },~ +** Processing line: ~ handler: :get_docs_html },~ +** Processing line: ~ { match_criteria: { method: :get, uri_without_query_string: "/docs.css" },~ +** Processing line: ~ handler: :get_docs_css },~ +** Processing line: ~ { match_criteria: { method: :get, uri: "/docs_search.gif" },~ +** Processing line: ~ handler: :get_docs_search_gif },~ +** Processing line: ~~ +** Processing line: ~ { match_criteria: { method: :get, uri: "/src_backup_index.html" },~ +** Processing line: ~ handler: :get_src_backup_index_html },~ +** Processing line: ~~ +** Processing line: ~ { match_criteria: { method: :get, uri: "/src_backup_index.txt" },~ +** Processing line: ~ handler: :get_src_backup_index_txt },~ +** Processing line: ~~ +** Processing line: ~ { match_criteria: { method: :get, uri: "/src_backup_changes.html" },~ +** Processing line: ~ handler: :get_src_backup_changes_html },~ +** Processing line: ~~ +** Processing line: ~ { match_criteria: { method: :get, uri: "/src_backup_changes.txt" },~ +** Processing line: ~ handler: :get_src_backup_changes_txt },~ +** Processing line: ~~ +** Processing line: ~ { match_criteria: { method: :get, uri: "/src_backup.css" },~ +** Processing line: ~ handler: :get_src_backup_css },~ +** Processing line: ~~ +** Processing line: ~ { match_criteria: { method: :get, uri: "/favicon.ico" },~ +** Processing line: ~ handler: :get_favicon_ico },~ +** Processing line: ~~ +** Processing line: ~ { match_criteria: { method: :get, end_with_rb: true },~ +** Processing line: ~ handler: :get_src_backup },~ +** Processing line: ~~ +** Processing line: ~ { match_criteria: { method: :get, end_with_rb: true },~ +** Processing line: ~ handler: :get_src_backup }~ +** Processing line: ~~ +** Processing line: ~ ]~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ def process! opts~ +** Processing line: ~ routes = opts[:routes]~ +** Processing line: ~ context = opts[:context]~ +** Processing line: ~ routes.each do |route|~ +** Processing line: ~ match_found = (process_single! route: route, context: context)~ +** Processing line: ~ return if match_found~ +** Processing line: ~ end~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ def process_single! opts~ +** Processing line: ~ match_criteria = opts[:route][:match_criteria]~ +** Processing line: ~ m = opts[:route][:handler]~ +** Processing line: ~ args = opts[:context][:args]~ +** Processing line: ~ req = opts[:context][:req]~ +** Processing line: ~ match_candidate = opts[:context][:match_candidate]~ +** Processing line: ~ match_criteria.each do |k, v|~ +** Processing line: ~ return false if match_candidate[k] != v~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ begin~ +** Processing line: ~ send m, args, req~ +** Processing line: ~ rescue Exception => e~ +** Processing line: ~ req.respond 200,~ +** Processing line: ~ "#{e}\n#{e.__backtrace_to_org__}",~ +** Processing line: ~ { 'Content-Type' => 'text/plain' }~ +** Processing line: ~ end~ +** Processing line: ~ return true~ +** Processing line: ~ end~ +** Processing line: ~ end~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~#+end_src~ +- PRE end detected. +** Processing line: ~~ +** Processing line: ~~ ** Processing line: ~*** args.rb~ - H3 detected. - Determining if line is a header. @@ -231847,6 +240685,7 @@ Follows is a source code listing for all files that have been open sourced. This ** Processing line: ~ class Args~ ** Processing line: ~ include ArgsDeprecated~ ** Processing line: ~ include Serialize~ +** Processing line: ~ attr_accessor :cvars~ ** Processing line: ~ attr_accessor :inputs~ ** Processing line: ~ attr_accessor :outputs~ ** Processing line: ~ attr_accessor :audio~ @@ -231867,6 +240706,7 @@ Follows is a source code listing for all files that have been open sourced. This ** Processing line: ~ def initialize runtime, recording~ ** Processing line: ~ @inputs = Inputs.new~ ** Processing line: ~ @outputs = Outputs.new args: self~ +** Processing line: ~ @cvars = {}~ ** Processing line: ~ @audio = {}~ ** Processing line: ~ @passes = []~ ** Processing line: ~ @state = OpenEntity.new~ @@ -232409,14 +241249,17 @@ Follows is a source code listing for all files that have been open sourced. This ** Processing line: ~ class Console~ ** Processing line: ~ include ConsoleDeprecated~ ** Processing line: ~~ -** Processing line: ~ attr_accessor :show_reason, :log, :logo, :background_color,~ -** Processing line: ~ :text_color, :animation_duration,~ +** Processing line: ~ attr_accessor :show_reason, :log, :logo,~ +** Processing line: ~ :animation_duration,~ ** Processing line: ~ :max_log_lines, :max_history, :log,~ -** Processing line: ~ :last_command_errored, :last_command, :error_color, :shown_at,~ -** Processing line: ~ :header_color, :archived_log, :last_log_lines, :last_log_lines_count,~ +** Processing line: ~ :last_command_errored, :last_command, :shown_at,~ +** Processing line: ~ :archived_log, :last_log_lines, :last_log_lines_count,~ ** Processing line: ~ :suppress_left_arrow_behavior, :command_set_at,~ ** Processing line: ~ :toast_ids, :bottom,~ -** Processing line: ~ :font_style, :menu~ +** Processing line: ~ :font_style, :menu,~ +** Processing line: ~ :background_color, :spam_color, :text_color, :warn_color,~ +** Processing line: ~ :error_color, :header_color, :code_color, :comment_color,~ +** Processing line: ~ :debug_color, :unfiltered_color~ ** Processing line: ~~ ** Processing line: ~ def initialize~ ** Processing line: ~ @font_style = FontStyle.new(font: 'font.ttf', size_enum: -1.5, line_height: 1.1)~ @@ -232434,15 +241277,22 @@ Follows is a source code listing for all files that have been open sourced. This ** Processing line: ~ @command_history_index = -1~ ** Processing line: ~ @nonhistory_input = ''~ ** Processing line: ~ @logo = 'console-logo.png'~ -** Processing line: ~ @history_fname = 'console_history.txt'~ +** Processing line: ~ @history_fname = 'logs/console_history.txt'~ ** Processing line: ~ @background_color = Color.new [0, 0, 0, 224]~ -** Processing line: ~ @text_color = Color.new [255, 255, 255]~ -** Processing line: ~ @error_color = Color.new [200, 50, 50]~ ** Processing line: ~ @header_color = Color.new [100, 200, 220]~ ** Processing line: ~ @code_color = Color.new [210, 168, 255]~ -** Processing line: ~ @comment_color = Color.new [0, 200, 100]~ +** Processing line: ~ @comment_color = Color.new [0, 200, 100]~ ** Processing line: ~ @animation_duration = 1.seconds~ ** Processing line: ~ @shown_at = -1~ +** Processing line: ~~ +** Processing line: ~ # these are the colors for text at various log levels.~ +** Processing line: ~ @spam_color = Color.new [160, 160, 160]~ +** Processing line: ~ @debug_color = Color.new [0, 255, 0]~ +** Processing line: ~ @text_color = Color.new [255, 255, 255]~ +** Processing line: ~ @warn_color = Color.new [255, 255, 0]~ +** Processing line: ~ @error_color = Color.new [200, 50, 50]~ +** Processing line: ~ @unfiltered_color = Color.new [0, 255, 255]~ +** Processing line: ~~ ** Processing line: ~ load_history~ ** Processing line: ~ end~ ** Processing line: ~~ @@ -232508,7 +241358,13 @@ Follows is a source code listing for all files that have been open sourced. This ** Processing line: ~ nil~ ** Processing line: ~ end~ ** Processing line: ~~ -** Processing line: ~ def add_text obj~ +** Processing line: ~ def add_text obj, loglevel=-1~ +** Processing line: ~ # loglevel is one of the values of LogLevel in logging.h, or -1 to say "we don't care, colorize it with your special string parsing magic"~ +** Processing line: ~ loglevel = -1 if loglevel < 0~ +** Processing line: ~ loglevel = 5 if loglevel > 5 # 5 == unfiltered (it's 0x7FFFFFFE in C, clamp it down)~ +** Processing line: ~ loglevel = 2 if (loglevel == -1) && obj.start_with?('!c!') # oh well~ +** Processing line: ~ colorstr = (loglevel != -1) ? "!c!#{loglevel}" : nil~ +** Processing line: ~~ ** Processing line: ~ @last_log_lines_count ||= 1~ ** Processing line: ~ @log_invocation_count += 1~ ** Processing line: ~~ @@ -232517,12 +241373,18 @@ Follows is a source code listing for all files that have been open sourced. This ** Processing line: ~ log_lines = []~ ** Processing line: ~~ ** Processing line: ~ str.each_line do |s|~ -** Processing line: ~ s.wrapped_lines(self.console_text_width).each do |l|~ -** Processing line: ~ log_lines << l~ +** Processing line: ~ if colorstr.nil?~ +** Processing line: ~ s.wrapped_lines(self.console_text_width).each do |l|~ +** Processing line: ~ log_lines << l~ +** Processing line: ~ end~ +** Processing line: ~ else~ +** Processing line: ~ s.wrapped_lines(self.console_text_width).each do |l|~ +** Processing line: ~ log_lines << "#{colorstr}#{l}"~ +** Processing line: ~ end~ ** Processing line: ~ end~ ** Processing line: ~ end~ ** Processing line: ~~ -** Processing line: ~ if log_lines == @last_log_lines~ +** Processing line: ~ if log_lines == @last_log_lines && log_lines.length != 0~ ** Processing line: ~ @last_log_lines_count += 1~ ** Processing line: ~ new_log_line_with_count = @last_log_lines.last + " (#{@last_log_lines_count})"~ ** Processing line: ~ if log_lines.length > 1~ @@ -232797,10 +241659,12 @@ Follows is a source code listing for all files that have been open sourced. This ** Processing line: ~ def mouse_wheel_scroll args~ ** Processing line: ~ @inertia ||= 0~ ** Processing line: ~~ -** Processing line: ~ if args.inputs.mouse.wheel && args.inputs.mouse.wheel.y > 0~ -** Processing line: ~ @inertia = 1~ -** Processing line: ~ elsif args.inputs.mouse.wheel && args.inputs.mouse.wheel.y < 0~ -** Processing line: ~ @inertia = -1~ +** Processing line: ~ if args.inputs.mouse.wheel~ +** Processing line: ~ if args.inputs.mouse.wheel.y > 0~ +** Processing line: ~ @inertia = 1~ +** Processing line: ~ elsif args.inputs.mouse.wheel.y < 0~ +** Processing line: ~ @inertia = -1~ +** Processing line: ~ end~ ** Processing line: ~ end~ ** Processing line: ~~ ** Processing line: ~ if args.inputs.mouse.click~ @@ -232809,13 +241673,11 @@ Follows is a source code listing for all files that have been open sourced. This ** Processing line: ~~ ** Processing line: ~ return if @inertia == 0~ ** Processing line: ~~ -** Processing line: ~ if @inertia != 0~ -** Processing line: ~ @inertia = (@inertia * 0.7)~ -** Processing line: ~ if @inertia > 0~ -** Processing line: ~ @log_offset -= 1~ -** Processing line: ~ elsif @inertia < 0~ -** Processing line: ~ @log_offset += 1~ -** Processing line: ~ end~ +** Processing line: ~ @inertia = (@inertia * 0.7)~ +** Processing line: ~ if @inertia > 0~ +** Processing line: ~ @log_offset += 1~ +** Processing line: ~ elsif @inertia < 0~ +** Processing line: ~ @log_offset -= 1~ ** Processing line: ~ end~ ** Processing line: ~~ ** Processing line: ~ if @inertia.abs < 0.01~ @@ -232931,7 +241793,7 @@ Follows is a source code listing for all files that have been open sourced. This ** Processing line: ~ def write_line(args, left, y, str, archived: false)~ ** Processing line: ~ color = color_for_log_entry(str)~ ** Processing line: ~ color = color.mult_alpha(0.5) if archived~ -** Processing line: ~~ +** Processing line: ~ str = str[4..-1] if str.start_with?('!c!') # chop off loglevel color~ ** Processing line: ~ args.outputs.reserved << font_style.label(x: left.shift_right(10), y: y, text: str, color: color)~ ** Processing line: ~ end~ ** Processing line: ~~ @@ -233167,7 +242029,9 @@ Follows is a source code listing for all files that have been open sourced. This ** Processing line: ~ return false~ ** Processing line: ~ end~ ** Processing line: ~~ -** Processing line: ~ def color_for_log_entry(log_entry)~ +** Processing line: ~ def color_for_plain_text log_entry~ +** Processing line: ~ log_entry = log_entry[4..-1] if log_entry.start_with? "!c!"~ +** Processing line: ~~ ** Processing line: ~ if code? log_entry~ ** Processing line: ~ @code_color~ ** Processing line: ~ elsif code_comment? log_entry~ @@ -233187,6 +242051,29 @@ Follows is a source code listing for all files that have been open sourced. This ** Processing line: ~ end~ ** Processing line: ~ end~ ** Processing line: ~~ +** Processing line: ~ def color_for_log_entry(log_entry)~ +** Processing line: ~ if log_entry.start_with?('!c!') # loglevel color specified.~ +** Processing line: ~ return case log_entry[3..3].to_i~ +** Processing line: ~ when 0 # spam~ +** Processing line: ~ @spam_color~ +** Processing line: ~ when 1 # debug~ +** Processing line: ~ @debug_color~ +** Processing line: ~ #when 2 # info (caught by the `else` block.)~ +** Processing line: ~ # @text_color~ +** Processing line: ~ when 3 # warn~ +** Processing line: ~ @warn_color~ +** Processing line: ~ when 4 # error~ +** Processing line: ~ @error_color~ +** Processing line: ~ when 5 # unfiltered~ +** Processing line: ~ @unfiltered_color~ +** Processing line: ~ else~ +** Processing line: ~ color_for_plain_text log_entry~ +** Processing line: ~ end~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ return color_for_plain_text log_entry~ +** Processing line: ~ end~ +** Processing line: ~~ ** Processing line: ~ def prompt~ ** Processing line: ~ @prompt ||= Prompt.new(font_style: font_style, text_color: @text_color, console_text_width: console_text_width)~ ** Processing line: ~ end~ @@ -233698,11 +242585,11 @@ Follows is a source code listing for all files that have been open sourced. This ** Processing line: ~~ ** Processing line: ~ # partition the original list of items into a string to be printed~ ** Processing line: ~ items.each_slice(columns).each_with_index do |cells, i|~ -** Processing line: ~ pretty_print_row_seperator string_width, cell_width, column_width, columns~ +** Processing line: ~ pretty_print_row_separator string_width, cell_width, column_width, columns~ ** Processing line: ~ pretty_print_row cells, string_width, cell_width, column_width, columns~ ** Processing line: ~ end~ ** Processing line: ~~ -** Processing line: ~ pretty_print_row_seperator string_width, cell_width, column_width, columns~ +** Processing line: ~ pretty_print_row_separator string_width, cell_width, column_width, columns~ ** Processing line: ~ end~ ** Processing line: ~ end~ ** Processing line: ~~ @@ -234614,8 +243501,8 @@ Follows is a source code listing for all files that have been open sourced. This ** Processing line: ~ ease_extended start_tick,~ ** Processing line: ~ current_tick,~ ** Processing line: ~ start_tick + duration,~ -** Processing line: ~ (initial_value *definitions),~ -** Processing line: ~ (final_value *definitions),~ +** Processing line: ~ initial_value(*definitions),~ +** Processing line: ~ final_value(*definitions),~ ** Processing line: ~ *definitions~ ** Processing line: ~ end~ ** Processing line: ~~ @@ -234840,8 +243727,8 @@ Follows is a source code listing for all files that have been open sourced. This ** Processing line: ~ module GTK~ ** Processing line: ~ module Geometry~ ** Processing line: ~ def self.rotate_point point, angle, around = nil~ -** Processing line: ~ s = Math.sin a.to_radians~ -** Processing line: ~ c = Math.cos a.to_radians~ +** Processing line: ~ s = Math.sin angle.to_radians~ +** Processing line: ~ c = Math.cos angle.to_radians~ ** Processing line: ~ px = point.x~ ** Processing line: ~ py = point.y~ ** Processing line: ~ cx = 0~ @@ -235022,8 +243909,16 @@ Follows is a source code listing for all files that have been open sourced. This ** Processing line: ~ end~ ** Processing line: ~~ ** Processing line: ~ # @gtk~ -** Processing line: ~ def self.line_y_intercept line~ -** Processing line: ~ line.y - line_slope(line) * line.x~ +** Processing line: ~ def self.line_y_intercept line, replace_infinity: nil~ +** Processing line: ~ line.y - line_slope(line, replace_infinity: replace_infinity) * line.x~ +** Processing line: ~ rescue Exception => e~ +** Processing line: ~ raise <<-S~ +** Processing line: ~ * ERROR: ~Geometry::line_y_intercept~~ +** Processing line: ~ The following exception was thrown for line: #{line}~ +** Processing line: ~ #{e}~ +** Processing line: ~~ +** Processing line: ~ Consider passing in ~replace_infinity: VALUE~ to handle for vertical lines.~ +** Processing line: ~ S~ ** Processing line: ~ end~ ** Processing line: ~~ ** Processing line: ~ # @gtk~ @@ -235099,14 +243994,22 @@ Follows is a source code listing for all files that have been open sourced. This ** Processing line: ~ end~ ** Processing line: ~~ ** Processing line: ~ # @gtk~ -** Processing line: ~ def self.line_intersect line_one, line_two~ -** Processing line: ~ m1 = line_slope(line_one)~ -** Processing line: ~ m2 = line_slope(line_two)~ -** Processing line: ~ b1 = line_y_intercept(line_one)~ -** Processing line: ~ b2 = line_y_intercept(line_two)~ +** Processing line: ~ def self.line_intersect line_one, line_two, replace_infinity: nil~ +** Processing line: ~ m1 = line_slope(line_one, replace_infinity: replace_infinity)~ +** Processing line: ~ m2 = line_slope(line_two, replace_infinity: replace_infinity)~ +** Processing line: ~ b1 = line_y_intercept(line_one, replace_infinity: replace_infinity)~ +** Processing line: ~ b2 = line_y_intercept(line_two, replace_infinity: replace_infinity)~ ** Processing line: ~ x = (b1 - b2) / (m2 - m1)~ ** Processing line: ~ y = (-b2.fdiv(m2) + b1.fdiv(m1)).fdiv(1.fdiv(m1) - 1.fdiv(m2))~ ** Processing line: ~ [x, y]~ +** Processing line: ~ rescue Exception => e~ +** Processing line: ~ raise <<-S~ +** Processing line: ~ * ERROR: ~Geometry::line_intersect~~ +** Processing line: ~ The following exception was thrown for line_one: #{line_one}, line_two: #{line_two}~ +** Processing line: ~ #{e}~ +** Processing line: ~~ +** Processing line: ~ Consider passing in ~replace_infinity: VALUE~ to handle for vertical lines.~ +** Processing line: ~ S~ ** Processing line: ~ end~ ** Processing line: ~~ ** Processing line: ~ def self.contract_intersect_rect?~ @@ -235821,7 +244724,8 @@ Follows is a source code listing for all files that have been open sourced. This ** Processing line: ~ value = Kernel.tick_count if value~ ** Processing line: ~~ ** Processing line: ~ collection.each do |m|~ -** Processing line: ~ self.instance_variable_set("@#{m.to_s}".to_sym, value)~ +** Processing line: ~ m_to_s = m.to_s~ +** Processing line: ~ self.instance_variable_set("@#{m_to_s}".to_sym, value) if m_to_s.strip.length > 0~ ** Processing line: ~ rescue Exception => e~ ** Processing line: ~ raise e, <<-S~ ** Processing line: ~ * ERROR:~ @@ -236380,6 +245284,7 @@ Follows is a source code listing for all files that have been open sourced. This ** Processing line: ~ :check_for_dev_profile,~ ** Processing line: ~~ ** Processing line: ~ *app_metadata_retrieval_steps,~ +** Processing line: ~ :determine_devcert,~ ** Processing line: ~~ ** Processing line: ~ :clear_tmp_directory,~ ** Processing line: ~ :stage_app,~ @@ -236408,6 +245313,7 @@ Follows is a source code listing for all files that have been open sourced. This ** Processing line: ~ :determine_app_version,~ ** Processing line: ~~ ** Processing line: ~ *app_metadata_retrieval_steps,~ +** Processing line: ~ :determine_prodcert,~ ** Processing line: ~~ ** Processing line: ~ :clear_tmp_directory,~ ** Processing line: ~ :stage_app,~ @@ -236602,6 +245508,10 @@ Follows is a source code listing for all files that have been open sourced. This ** Processing line: ~ appid=~ ** Processing line: ~ # appname is the name you want to show up underneath the app icon on the device. Keep it under 10 characters.~ ** Processing line: ~ appname=~ +** Processing line: ~ # devcert is the certificate to use for development/deploying to your local device~ +** Processing line: ~ devcert=~ +** Processing line: ~ # prodcert is the certificate to use for distribution to the app store~ +** Processing line: ~ prodcert=~ ** Processing line: ~ S~ ** Processing line: ~ end~ ** Processing line: ~~ @@ -236637,7 +245547,7 @@ Follows is a source code listing for all files that have been open sourced. This ** Processing line: ~ def raise_ios_metadata_required~ ** Processing line: ~ raise WizardException.new(~ ** Processing line: ~ "* mygame/metadata/ios_metadata.txt needs to be filled out.",~ -** Processing line: ~ "You need to update metadata/ios_metadata.txt with a valid teamid, appname, and appid.",~ +** Processing line: ~ "You need to update metadata/ios_metadata.txt with a valid teamid, appname, appid, devcert, and prodcert.",~ ** Processing line: ~ "Instructions for where the values should come from are within metadata/ios_metadata.txt."~ ** Processing line: ~ )~ ** Processing line: ~ end~ @@ -236677,7 +245587,19 @@ Follows is a source code listing for all files that have been open sourced. This ** Processing line: ~ def determine_app_id~ ** Processing line: ~ @app_id = ios_metadata.appid~ ** Processing line: ~ raise_ios_metadata_required if @app_id.strip.length == 0~ -** Processing line: ~ log_info "App Identifier is set to : #{@app_id}"~ +** Processing line: ~ log_info "App Identifier is set to: #{@app_id}"~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ def determine_devcert~ +** Processing line: ~ @certificate_name = ios_metadata.devcert~ +** Processing line: ~ raise_ios_metadata_required if @certificate_name.strip.length == 0~ +** Processing line: ~ log_info "Dev Certificate is set to: #{@certificate_name}"~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ def determine_prodcert~ +** Processing line: ~ @certificate_name = ios_metadata.prodcert~ +** Processing line: ~ raise_ios_metadata_required if @certificate_name.strip.length == 0~ +** Processing line: ~ log_info "Production (Distribution) Certificate is set to: #{@certificate_name}"~ ** Processing line: ~ end~ ** Processing line: ~~ ** Processing line: ~ def set_app_name name~ @@ -236699,12 +245621,6 @@ Follows is a source code listing for all files that have been open sourced. This ** Processing line: ~ sh "rm -rf #{tmp_directory}"~ ** Processing line: ~ end~ ** Processing line: ~~ -** Processing line: ~ def stage_app~ -** Processing line: ~ log_info "Staging."~ -** Processing line: ~ sh "mkdir -p #{tmp_directory}"~ -** Processing line: ~ sh "cp -R #{relative_path}/dragonruby-ios.app \"#{tmp_directory}/#{@app_name}.app\""~ -** Processing line: ~ end~ -** Processing line: ~~ ** Processing line: ~ def set_app_id id~ ** Processing line: ~ log_info = "App Id set to: #{id}"~ ** Processing line: ~ @app_id = id~ @@ -236735,34 +245651,13 @@ Follows is a source code listing for all files that have been open sourced. This ** Processing line: ~ def check_for_certs~ ** Processing line: ~ log_info "Attempting to find certificates on your computer."~ ** Processing line: ~~ -** Processing line: ~ if !cli_app_exist?(security_cli_app)~ -** Processing line: ~ raise WizardException.new(~ -** Processing line: ~ "* It doesn't look like you have #{security_cli_app}.",~ -** Processing line: ~ "** 1. Open Disk Utility and run First Aid.",~ -** Processing line: ~ { w: 700, h: 148, path: get_reserved_sprite("disk-utility.png") },~ -** Processing line: ~ )~ -** Processing line: ~ end~ -** Processing line: ~~ -** Processing line: ~ if valid_certs.length == 0~ -** Processing line: ~ raise WizardException.new(~ -** Processing line: ~ "* It doesn't look like you have any valid certs installed.",~ -** Processing line: ~ "** 1. Open Xcode.",~ -** Processing line: ~ "** 2. Log into your developer account. Xcode -> Preferences -> Accounts.",~ -** Processing line: ~ { w: 700, h: 98, path: get_reserved_sprite("login-xcode.png") },~ -** Processing line: ~ "** 3. After loggin in, select Manage Certificates...",~ -** Processing line: ~ { w: 700, h: 115, path: get_reserved_sprite("manage-certificates.png") },~ -** Processing line: ~ "** 4. Add a certificate for Apple Development.",~ -** Processing line: ~ { w: 700, h: 217, path: get_reserved_sprite("add-cert.png") },~ -** Processing line: ~ )~ -** Processing line: ~ raise "You do not have any Apple development certs on this computer."~ -** Processing line: ~ end~ -** Processing line: ~~ ** Processing line: ~ if @production_build~ -** Processing line: ~ @certificate_name = valid_certs.find_all { |f| f[:name].include? "Distribution" }.first[:name]~ +** Processing line: ~ @certificate_name = ios_metadata[:prodcert]~ ** Processing line: ~ else~ -** Processing line: ~ @certificate_name = valid_certs.find_all { |f| f[:name].include? "Development" }.first[:name]~ +** Processing line: ~ @certificate_name = ios_metadata[:devcert]~ ** Processing line: ~ end~ -** Processing line: ~ log_info "I will be using Certificate: '#{@certificate_name}'."~ +** Processing line: ~~ +** Processing line: ~ log_info "I will be using certificate: '#{@certificate_name}'."~ ** Processing line: ~ end~ ** Processing line: ~~ ** Processing line: ~ def idevice_id_cli_app~ @@ -236777,24 +245672,6 @@ Follows is a source code listing for all files that have been open sourced. This ** Processing line: ~ "xcodebuild"~ ** Processing line: ~ end~ ** Processing line: ~~ -** Processing line: ~ def valid_certs~ -** Processing line: ~ certs = sh("#{security_cli_app} -q find-identity -p codesigning -v").each_line.map do |l|~ -** Processing line: ~ if l.include?(")") && !l.include?("Developer ID") && (l.include?("Development") || l.include?("Distribution"))~ -** Processing line: ~ l.strip~ -** Processing line: ~ else~ -** Processing line: ~ nil~ -** Processing line: ~ end~ -** Processing line: ~ end.reject_nil.map do |l|~ -** Processing line: ~ number, id, name = l.split(' ', 3)~ -** Processing line: ~ name = name.gsub("\"", "") if name~ -** Processing line: ~ {~ -** Processing line: ~ number: 1,~ -** Processing line: ~ id: id,~ -** Processing line: ~ name: name~ -** Processing line: ~ }~ -** Processing line: ~ end~ -** Processing line: ~ end~ -** Processing line: ~~ ** Processing line: ~ def connected_devices~ ** Processing line: ~ sh("idevice_id -l").strip.each_line.map do |l|~ ** Processing line: ~ l.strip~ @@ -237324,6 +246201,9 @@ Follows is a source code listing for all files that have been open sourced. This ** Processing line: ~ end~ ** Processing line: ~~ ** Processing line: ~ def stage_app~ +** Processing line: ~ log_info "Staging."~ +** Processing line: ~ sh "mkdir -p #{tmp_directory}"~ +** Processing line: ~ sh "cp -R #{relative_path}/dragonruby-ios.app \"#{tmp_directory}/#{@app_name}.app\""~ ** Processing line: ~ sh %Q[cp -r "#{root_folder}/app/" "#{app_path}/app/"]~ ** Processing line: ~ sh %Q[cp -r "#{root_folder}/sounds/" "#{app_path}/sounds/"]~ ** Processing line: ~ sh %Q[cp -r "#{root_folder}/sprites/" "#{app_path}/sprites/"]~ @@ -239236,26 +248116,6 @@ Follows is a source code listing for all files that have been open sourced. This ** Processing line: ~ (0..self).to_a~ ** Processing line: ~ end~ ** Processing line: ~~ -** Processing line: ~ def >= other~ -** Processing line: ~ return false if !other~ -** Processing line: ~ return gte other~ -** Processing line: ~ end~ -** Processing line: ~~ -** Processing line: ~ def > other~ -** Processing line: ~ return false if !other~ -** Processing line: ~ return gt other~ -** Processing line: ~ end~ -** Processing line: ~~ -** Processing line: ~ def <= other~ -** Processing line: ~ return false if !other~ -** Processing line: ~ return lte other~ -** Processing line: ~ end~ -** Processing line: ~~ -** Processing line: ~ def < other~ -** Processing line: ~ return false if !other~ -** Processing line: ~ return gt other~ -** Processing line: ~ end~ -** Processing line: ~~ ** Processing line: ~ # @gtk~ ** Processing line: ~ def map~ ** Processing line: ~ unless block_given?~ @@ -239341,34 +248201,6 @@ Follows is a source code listing for all files that have been open sourced. This ** Processing line: ~ S~ ** Processing line: ~ end~ ** Processing line: ~~ -** Processing line: ~ def - other~ -** Processing line: ~ return self unless other~ -** Processing line: ~ self - other~ -** Processing line: ~ rescue Exception => e~ -** Processing line: ~ __raise_arithmetic_exception__ other, :-, e~ -** Processing line: ~ end~ -** Processing line: ~~ -** Processing line: ~ def + other~ -** Processing line: ~ return self unless other~ -** Processing line: ~ self + other~ -** Processing line: ~ rescue Exception => e~ -** Processing line: ~ __raise_arithmetic_exception__ other, :+, e~ -** Processing line: ~ end~ -** Processing line: ~~ -** Processing line: ~ def * other~ -** Processing line: ~ return self unless other~ -** Processing line: ~ self * other~ -** Processing line: ~ rescue Exception => e~ -** Processing line: ~ __raise_arithmetic_exception__ other, :*, e~ -** Processing line: ~ end~ -** Processing line: ~~ -** Processing line: ~ def / other~ -** Processing line: ~ return self unless other~ -** Processing line: ~ self / other~ -** Processing line: ~ rescue Exception => e~ -** Processing line: ~ __raise_arithmetic_exception__ other, :/, e~ -** Processing line: ~ end~ -** Processing line: ~~ ** Processing line: ~ def serialize~ ** Processing line: ~ self~ ** Processing line: ~ end~ @@ -239423,34 +248255,6 @@ Follows is a source code listing for all files that have been open sourced. This ** Processing line: ~ return !even?~ ** Processing line: ~ end~ ** Processing line: ~~ -** Processing line: ~ def + other~ -** Processing line: ~ return self unless other~ -** Processing line: ~ self + other~ -** Processing line: ~ rescue Exception => e~ -** Processing line: ~ __raise_arithmetic_exception__ other, :+, e~ -** Processing line: ~ end~ -** Processing line: ~~ -** Processing line: ~ def * other~ -** Processing line: ~ return self unless other~ -** Processing line: ~ self * other~ -** Processing line: ~ rescue Exception => e~ -** Processing line: ~ __raise_arithmetic_exception__ other, :*, e~ -** Processing line: ~ end~ -** Processing line: ~~ -** Processing line: ~ def / other~ -** Processing line: ~ return self unless other~ -** Processing line: ~ self / other~ -** Processing line: ~ rescue Exception => e~ -** Processing line: ~ __raise_arithmetic_exception__ other, :/, e~ -** Processing line: ~ end~ -** Processing line: ~~ -** Processing line: ~ def - other~ -** Processing line: ~ return self unless other~ -** Processing line: ~ self - other~ -** Processing line: ~ rescue Exception => e~ -** Processing line: ~ __raise_arithmetic_exception__ other, :-, e~ -** Processing line: ~ end~ -** Processing line: ~~ ** Processing line: ~ # Returns `-1` if the number is less than `0`. `+1` if the number~ ** Processing line: ~ # is greater than `0`. Returns `0` if the number is equal to `0`.~ ** Processing line: ~ #~ @@ -239506,34 +248310,6 @@ Follows is a source code listing for all files that have been open sourced. This ** Processing line: ~ alias_method :__original_multiply__, :* unless Float.instance_methods.include? :__original_multiply__~ ** Processing line: ~ alias_method :__original_divide__, :- unless Float.instance_methods.include? :__original_divide__~ ** Processing line: ~~ -** Processing line: ~ def - other~ -** Processing line: ~ return self unless other~ -** Processing line: ~ super~ -** Processing line: ~ rescue Exception => e~ -** Processing line: ~ __raise_arithmetic_exception__ other, :-, e~ -** Processing line: ~ end~ -** Processing line: ~~ -** Processing line: ~ def + other~ -** Processing line: ~ return self unless other~ -** Processing line: ~ super~ -** Processing line: ~ rescue Exception => e~ -** Processing line: ~ __raise_arithmetic_exception__ other, :+, e~ -** Processing line: ~ end~ -** Processing line: ~~ -** Processing line: ~ def * other~ -** Processing line: ~ return self unless other~ -** Processing line: ~ super~ -** Processing line: ~ rescue Exception => e~ -** Processing line: ~ __raise_arithmetic_exception__ other, :*, e~ -** Processing line: ~ end~ -** Processing line: ~~ -** Processing line: ~ def / other~ -** Processing line: ~ return self unless other~ -** Processing line: ~ super~ -** Processing line: ~ rescue Exception => e~ -** Processing line: ~ __raise_arithmetic_exception__ other, :/, e~ -** Processing line: ~ end~ -** Processing line: ~~ ** Processing line: ~ def serialize~ ** Processing line: ~ self~ ** Processing line: ~ end~ @@ -239585,6 +248361,287 @@ Follows is a source code listing for all files that have been open sourced. This - PRE end detected. ** Processing line: ~~ ** Processing line: ~~ +** Processing line: ~*** recording.rb~ +- H3 detected. +- Determining if line is a header. +- Line contains ~*** ~... gsub-ing empty string +- Formatting line: ~recording.rb~ +- Line's tilde count is: 0 +- Line contains link marker: false +- Determining if line is a header. +- Line contains ~*** ~... gsub-ing empty string +- Formatting line: ~recording.rb~ +- Line's tilde count is: 0 +- Line contains link marker: false +** Processing line: ~~ +** Processing line: ~#+begin_src ruby~ +- PRE start detected. +** Processing line: ~ # ./dragon/recording.rb~ +** Processing line: ~ # coding: utf-8~ +** Processing line: ~ # Copyright 2019 DragonRuby LLC~ +** Processing line: ~ # MIT License~ +** Processing line: ~ # recording.rb has been released under MIT (*only this file*).~ +** Processing line: ~~ +** Processing line: ~ module GTK~ +** Processing line: ~ # FIXME: Gross~ +** Processing line: ~ # @gtk~ +** Processing line: ~ class Replay~ +** Processing line: ~ # @gtk~ +** Processing line: ~ def self.start file_name = nil~ +** Processing line: ~ $recording.start_replay file_name~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ # @gtk~ +** Processing line: ~ def self.stop~ +** Processing line: ~ $recording.stop_replay~ +** Processing line: ~ end~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ # @gtk~ +** Processing line: ~ class Recording~ +** Processing line: ~ def initialize runtime~ +** Processing line: ~ @runtime = runtime~ +** Processing line: ~ @tick_count = 0~ +** Processing line: ~ @global_input_order = 1~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ def tick~ +** Processing line: ~ @tick_count += 1~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ def start_recording seed_number = nil~ +** Processing line: ~ if !seed_number~ +** Processing line: ~ log <<-S~ +** Processing line: ~ * ERROR:~ +** Processing line: ~ To start recording, you must provide an integer value to~ +** Processing line: ~ seed random number generation.~ +** Processing line: ~ S~ +** Processing line: ~ $console.set_command "$recording.start SEED_NUMBER"~ +** Processing line: ~ return~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ if @is_recording~ +** Processing line: ~ log <<-S~ +** Processing line: ~ * ERROR:~ +** Processing line: ~ You are already recording, first cancel (or stop) the current recording.~ +** Processing line: ~ S~ +** Processing line: ~ $console.set_command "$recording.cancel"~ +** Processing line: ~ return~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ if @is_replaying~ +** Processing line: ~ log <<-S~ +** Processing line: ~ * ERROR:~ +** Processing line: ~ You are currently replaying a recording, first stop the replay.~ +** Processing line: ~ S~ +** Processing line: ~ return~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ log_info <<-S~ +** Processing line: ~ Recording has begun with RNG seed value set to #{seed_number}.~ +** Processing line: ~ To stop recording use stop_recording(filename).~ +** Processing line: ~ The recording will stop without saving a file if a filename is nil.~ +** Processing line: ~ S~ +** Processing line: ~~ +** Processing line: ~ $console.set_command "$recording.stop 'replay.txt'"~ +** Processing line: ~ @runtime.__reset__~ +** Processing line: ~ @seed_number = seed_number~ +** Processing line: ~ @runtime.set_rng seed_number~ +** Processing line: ~~ +** Processing line: ~ @tick_count = 0~ +** Processing line: ~ @global_input_order = 1~ +** Processing line: ~ @is_recording = true~ +** Processing line: ~ @input_history = []~ +** Processing line: ~ @runtime.notify! "Recording started. When completed, open the console to save it using $recording.stop FILE_NAME (or cancel).", 300~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ # @gtk~ +** Processing line: ~ def start seed_number = nil~ +** Processing line: ~ start_recording seed_number~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ def is_replaying?~ +** Processing line: ~ @is_replaying~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ def is_recording?~ +** Processing line: ~ @is_recording~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ # @gtk~ +** Processing line: ~ def stop file_name = nil~ +** Processing line: ~ stop_recording file_name~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ # @gtk~ +** Processing line: ~ def cancel~ +** Processing line: ~ stop_recording_core~ +** Processing line: ~ @runtime.notify! "Recording cancelled."~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ def stop_recording file_name = nil~ +** Processing line: ~ if !file_name~ +** Processing line: ~ log <<-S~ +** Processing line: ~ * ERROR:~ +** Processing line: ~ To please specify a file name when calling:~ +** Processing line: ~ $recording.stop FILE_NAME~ +** Processing line: ~~ +** Processing line: ~ If you do NOT want to save the recording, call:~ +** Processing line: ~ $recording.cancel~ +** Processing line: ~ S~ +** Processing line: ~ $console.set_command "$recording.stop 'replay.txt'"~ +** Processing line: ~ return~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ if !@is_recording~ +** Processing line: ~ log_info "You are not currently recording. Use start_recording(seed_number) to start recording."~ +** Processing line: ~ $console.set_command "$recording.start"~ +** Processing line: ~ return~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ if file_name~ +** Processing line: ~ text = "replay_version 2.0\n"~ +** Processing line: ~ text << "stopped_at #{@tick_count}\n"~ +** Processing line: ~ text << "seed #{@seed_number}\n"~ +** Processing line: ~ text << "recorded_at #{Time.now.to_s}\n"~ +** Processing line: ~ @input_history.each do |items|~ +** Processing line: ~ text << "#{items}\n"~ +** Processing line: ~ end~ +** Processing line: ~ @runtime.write_file file_name, text~ +** Processing line: ~ @runtime.write_file 'last_replay.txt', text~ +** Processing line: ~ log_info "The recording has been saved successfully at #{file_name}. You can use start_replay(\"#{file_name}\") to replay the recording."~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ $console.set_command "$replay.start '#{file_name}'"~ +** Processing line: ~ stop_recording_core~ +** Processing line: ~ @runtime.notify! "Recording saved to #{file_name}. To replay it: $replay.start \"#{file_name}\"."~ +** Processing line: ~ log_info "You can run the replay later on startup using: ./dragonruby mygame --replay #{@replay_file_name}"~ +** Processing line: ~ nil~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ def stop_recording_core~ +** Processing line: ~ @is_recording = false~ +** Processing line: ~ @input_history = nil~ +** Processing line: ~ @last_history = nil~ +** Processing line: ~ @runtime.__reset__~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ def start_replay file_name = nil~ +** Processing line: ~ if !file_name~ +** Processing line: ~ log <<-S~ +** Processing line: ~ * ERROR:~ +** Processing line: ~ Please provide a file name to $recording.start.~ +** Processing line: ~ S~ +** Processing line: ~ $console.set_command "$replay.start 'replay.txt'"~ +** Processing line: ~ return~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ text = @runtime.read_file file_name~ +** Processing line: ~ return false unless text~ +** Processing line: ~~ +** Processing line: ~ if text.each_line.first.strip != "replay_version 2.0"~ +** Processing line: ~ raise "The replay file #{file_name} is not compatible with this version of DragonRuby Game Toolkit. Please recreate the replay (sorry)."~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ @replay_file_name = file_name~ +** Processing line: ~~ +** Processing line: ~ $replay_data = { input_history: { } }~ +** Processing line: ~ text.each_line do |l|~ +** Processing line: ~ if l.strip.length == 0~ +** Processing line: ~ next~ +** Processing line: ~ elsif l.start_with? 'replay_version'~ +** Processing line: ~ next~ +** Processing line: ~ elsif l.start_with? 'seed'~ +** Processing line: ~ $replay_data[:seed] = l.split(' ').last.to_i~ +** Processing line: ~ elsif l.start_with? 'stopped_at'~ +** Processing line: ~ $replay_data[:stopped_at] = l.split(' ').last.to_i~ +** Processing line: ~ elsif l.start_with? 'recorded_at'~ +** Processing line: ~ $replay_data[:recorded_at] = l.split(' ')[1..-1].join(' ')~ +** Processing line: ~ elsif l.start_with? '['~ +** Processing line: ~ name, value_1, value_2, value_count, id, tick_count = l.strip.gsub('[', '').gsub(']', '').split(',')~ +** Processing line: ~ $replay_data[:input_history][tick_count.to_i] ||= []~ +** Processing line: ~ $replay_data[:input_history][tick_count.to_i] << {~ +** Processing line: ~ id: id.to_i,~ +** Processing line: ~ name: name.gsub(':', '').to_sym,~ +** Processing line: ~ value_1: value_1.to_f,~ +** Processing line: ~ value_2: value_2.to_f,~ +** Processing line: ~ value_count: value_count.to_i~ +** Processing line: ~ }~ +** Processing line: ~ else~ +** Processing line: ~ raise "Replay data seems corrupt. I don't know how to parse #{l}."~ +** Processing line: ~ end~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ $replay_data[:input_history].keys.each do |key|~ +** Processing line: ~ $replay_data[:input_history][key] = $replay_data[:input_history][key].sort_by {|input| input[:id]}~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ @runtime.__reset__~ +** Processing line: ~ @runtime.set_rng $replay_data[:seed]~ +** Processing line: ~ @tick_count = 0~ +** Processing line: ~ @is_replaying = true~ +** Processing line: ~ log_info "Replay has been started."~ +** Processing line: ~ @runtime.notify! "Replay started [#{@replay_file_name}]."~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ def stop_replay notification_message = "Replay has been stopped."~ +** Processing line: ~ if !is_replaying?~ +** Processing line: ~ log <<-S~ +** Processing line: ~ * ERROR:~ +** Processing line: ~ No replay is currently running. Call $replay.start FILE_NAME to start a replay.~ +** Processing line: ~ S~ +** Processing line: ~~ +** Processing line: ~ $console.set_command "$replay.start 'replay.txt'"~ +** Processing line: ~ return~ +** Processing line: ~ end~ +** Processing line: ~ log_info notification_message~ +** Processing line: ~ @is_replaying = false~ +** Processing line: ~ $replay_data = nil~ +** Processing line: ~ @tick_count = 0~ +** Processing line: ~ @global_input_order = 1~ +** Processing line: ~ $console.set_command_silent "$replay.start '#{@replay_file_name}'"~ +** Processing line: ~ @runtime.__reset__~ +** Processing line: ~ @runtime.notify! notification_message~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ def record_input_history name, value_1, value_2, value_count, clear_cache = false~ +** Processing line: ~ return if @is_replaying~ +** Processing line: ~ return unless @is_recording~ +** Processing line: ~ @input_history << [name, value_1, value_2, value_count, @global_input_order, @tick_count]~ +** Processing line: ~ @global_input_order += 1~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ def stage_replay_values~ +** Processing line: ~ return unless @is_replaying~ +** Processing line: ~ return unless $replay_data~ +** Processing line: ~~ +** Processing line: ~ if $replay_data[:stopped_at] <= @tick_count~ +** Processing line: ~ stop_replay "Replay completed [#{@replay_file_name}]. To rerun, bring up the Console and press enter."~ +** Processing line: ~ return~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ inputs_this_tick = $replay_data[:input_history][@tick_count]~ +** Processing line: ~~ +** Processing line: ~ if @tick_count.zmod? 60~ +** Processing line: ~ log_info "Replay ends in #{($replay_data[:stopped_at] - @tick_count).idiv 60} second(s)."~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~ return unless inputs_this_tick~ +** Processing line: ~ inputs_this_tick.each do |v|~ +** Processing line: ~ args = []~ +** Processing line: ~ args << v[:value_1] if v[:value_count] >= 1~ +** Processing line: ~ args << v[:value_2] if v[:value_count] >= 2~ +** Processing line: ~ args << :replay~ +** Processing line: ~ $gtk.send v[:name], *args~ +** Processing line: ~ end~ +** Processing line: ~ end~ +** Processing line: ~ end~ +** Processing line: ~ end~ +** Processing line: ~~ +** Processing line: ~#+end_src~ +- PRE end detected. +** Processing line: ~~ +** Processing line: ~~ ** Processing line: ~*** remote_hotload_client.rb~ - H3 detected. - Determining if line is a header. @@ -239999,14 +249056,13 @@ Follows is a source code listing for all files that have been open sourced. This ** Processing line: ~ log <<-S~ ** Processing line: ~ ** Invoking :#{name}...~ ** Processing line: ~ S~ -** Processing line: ~ time_start = Time.now~ ** Processing line: ~ idx = 0~ ** Processing line: ~ r = nil~ +** Processing line: ~ time_start = Time.now~ ** Processing line: ~ while idx < iterations~ ** Processing line: ~ r = proc.call~ ** Processing line: ~ idx += 1~ ** Processing line: ~ end~ -** Processing line: ~~ ** Processing line: ~ result = (Time.now - time_start).round 3~ ** Processing line: ~~ ** Processing line: ~ { name: name,~ @@ -240146,7 +249202,7 @@ Follows is a source code listing for all files that have been open sourced. This ** Processing line: ~ fn.each_send pass.borders, self, :draw_border~ ** Processing line: ~ fn.each_send pass.static_borders, self, :draw_border~ ** Processing line: ~~ -** Processing line: ~ if !$gtk.production~ +** Processing line: ~ if !self.production~ ** Processing line: ~ fn.each_send pass.debug, self, :draw_primitive~ ** Processing line: ~ fn.each_send pass.static_debug, self, :draw_primitive~ ** Processing line: ~ end~ @@ -240163,6 +249219,7 @@ Follows is a source code listing for all files that have been open sourced. This ** Processing line: ~ if s.respond_to? :draw_override~ ** Processing line: ~ s.draw_override @ffi_draw~ ** Processing line: ~ else~ +** Processing line: ~ s = s.as_hash if s.is_a? OpenEntity~ ** Processing line: ~ @ffi_draw.draw_solid_2 s.x, s.y, s.w, s.h,~ ** Processing line: ~ s.r, s.g, s.b, s.a,~ ** Processing line: ~ (s.blendmode_enum || 1)~ @@ -240176,6 +249233,7 @@ Follows is a source code listing for all files that have been open sourced. This ** Processing line: ~ if s.respond_to? :draw_override~ ** Processing line: ~ s.draw_override @ffi_draw~ ** Processing line: ~ else~ +** Processing line: ~ s = s.as_hash if s.is_a? OpenEntity~ ** Processing line: ~ @ffi_draw.draw_sprite_4 s.x, s.y, s.w, s.h,~ ** Processing line: ~ (s.path || '').to_s,~ ** Processing line: ~ s.angle,~ @@ -240195,6 +249253,7 @@ Follows is a source code listing for all files that have been open sourced. This ** Processing line: ~ if s.respond_to? :draw_override~ ** Processing line: ~ s.draw_override @ffi_draw~ ** Processing line: ~ else~ +** Processing line: ~ s = s.as_hash if s.is_a? OpenEntity~ ** Processing line: ~ @ffi_draw.draw_screenshot (s.path || '').to_s,~ ** Processing line: ~ s.x, s.y, s.w, s.h,~ ** Processing line: ~ s.angle,~ @@ -240213,6 +249272,7 @@ Follows is a source code listing for all files that have been open sourced. This ** Processing line: ~ if l.respond_to? :draw_override~ ** Processing line: ~ l.draw_override @ffi_draw~ ** Processing line: ~ else~ +** Processing line: ~ l = l.as_hash if l.is_a? OpenEntity~ ** Processing line: ~ @ffi_draw.draw_label_3 l.x, l.y,~ ** Processing line: ~ (l.text || '').to_s,~ ** Processing line: ~ l.size_enum, l.alignment_enum,~ @@ -240230,6 +249290,7 @@ Follows is a source code listing for all files that have been open sourced. This ** Processing line: ~ if l.respond_to? :draw_override~ ** Processing line: ~ l.draw_override @ffi_draw~ ** Processing line: ~ else~ +** Processing line: ~ l = l.as_hash if l.is_a? OpenEntity~ ** Processing line: ~ if l.x2~ ** Processing line: ~ @ffi_draw.draw_line_2 l.x, l.y, l.x2, l.y2,~ ** Processing line: ~ l.r, l.g, l.b, l.a,~ @@ -240255,6 +249316,7 @@ Follows is a source code listing for all files that have been open sourced. This ** Processing line: ~ if s.respond_to? :draw_override~ ** Processing line: ~ s.draw_override @ffi_draw~ ** Processing line: ~ else~ +** Processing line: ~ s = s.as_hash if s.is_a? OpenEntity~ ** Processing line: ~ @ffi_draw.draw_border_2 s.x, s.y, s.w, s.h,~ ** Processing line: ~ s.r, s.g, s.b, s.a,~ ** Processing line: ~ (s.blendmode_enum || 1)~ @@ -240337,7 +249399,7 @@ Follows is a source code listing for all files that have been open sourced. This ** Processing line: ~ if @tick_speed_count > 60 * 2~ ** Processing line: ~ if framerate_below_threshold?~ ** Processing line: ~ @last_framerate = current_framerate~ -** Processing line: ~ if !@console.visible?~ +** Processing line: ~ if !@console.visible? && !@recording.is_replaying?~ ** Processing line: ~ log framerate_warning_message~ ** Processing line: ~ end~ ** Processing line: ~ end~ @@ -241335,9 +250397,9 @@ Follows is a source code listing for all files that have been open sourced. This ** Processing line: ~~ ** Processing line: ~ def $top_level.slds! *os~ ** Processing line: ~ if (os.first.is_a? Numeric)~ -** Processing line: ~ sld! *os~ +** Processing line: ~ sld!(*os)~ ** Processing line: ~ else~ -** Processing line: ~ os.each { |o| sld! *o }~ +** Processing line: ~ os.each { |o| sld!(*o) }~ ** Processing line: ~ end~ ** Processing line: ~ end~ ** Processing line: ~~ @@ -241385,6 +250447,31 @@ Follows is a source code listing for all files that have been open sourced. This ** Processing line: ~ end~ ** Processing line: ~ end~ ** Processing line: ~~ +** Processing line: ~ =begin~ +** Processing line: ~ wht = [255] * 3~ +** Processing line: ~ red = [255, 0, 0]~ +** Processing line: ~ blu = [0, 130, 255]~ +** Processing line: ~ purp = [150, 80, 255]~ +** Processing line: ~~ +** Processing line: ~ TICK {~ +** Processing line: ~ bg! 0~ +** Processing line: ~~ +** Processing line: ~ slds << [0, 0, 3, 3, 0, 255, 0, 255]~ +** Processing line: ~~ +** Processing line: ~ sld! 10, 10~ +** Processing line: ~ sld! 20, 20, 3, 2~ +** Processing line: ~ sld! 30, 30, 2, 2, red~ +** Processing line: ~ sld! 35, 35, blu~ +** Processing line: ~~ +** Processing line: ~ slds! 40, 40~ +** Processing line: ~~ +** Processing line: ~ slds! [50, 50],~ +** Processing line: ~ [60, 60, purp],~ +** Processing line: ~ [70, 70, 10, 10, wht],~ +** Processing line: ~ [80, 80, 4, 4, 255, 0, 255]~ +** Processing line: ~ }~ +** Processing line: ~ =end~ +** Processing line: ~~ ** Processing line: ~#+end_src~ - PRE end detected. ** Processing line: ~~ diff --git a/docs/todo/05-sprites.md b/docs/todo/05-sprites.md index e2be250..e8030ab 100644 --- a/docs/todo/05-sprites.md +++ b/docs/todo/05-sprites.md @@ -179,14 +179,26 @@ args.outputs.sprites << { ## Duck Typing (Advanced) -You can also create a class with sprite properties and render it as a primitive, -using the `attr_sprite` helper. +You can also create a class with sprite properties and render it as a primitive. +ALL properties must on the class. ADDITIONALLY, a method called `primitive_marker` +must be defined on the class. Here is an example: ```ruby -class PlayerSprite - attr_sprite +# Create type with ALL sprite properties AND primitive_marker +class Sprite + attr_accessor :x, :y, :w, :h, :path, :angle, :a, :r, :g, :b, :source_x, + :source_y, :source_w, :source_h, :flip_horizontally, + :flip_vertically, :angle_anchor_x, :angle_anchor_y + + def primitive_marker + :sprite + end +end + +# Inherit from type +class PlayerSprite < Sprite # constructor def initialize x, y, w, h diff --git a/dragon/args.rb b/dragon/args.rb index 5bb0ccf..d13d867 100644 --- a/dragon/args.rb +++ b/dragon/args.rb @@ -10,6 +10,7 @@ module GTK class Args include ArgsDeprecated include Serialize + attr_accessor :cvars attr_accessor :inputs attr_accessor :outputs attr_accessor :audio @@ -30,6 +31,7 @@ module GTK def initialize runtime, recording @inputs = Inputs.new @outputs = Outputs.new args: self + @cvars = {} @audio = {} @passes = [] @state = OpenEntity.new diff --git a/dragon/benchmark.rb b/dragon/benchmark.rb index d7e8945..38ea991 100644 --- a/dragon/benchmark.rb +++ b/dragon/benchmark.rb @@ -10,14 +10,13 @@ module GTK log <<-S ** Invoking :#{name}... S - time_start = Time.now idx = 0 r = nil + time_start = Time.now while idx < iterations r = proc.call idx += 1 end - result = (Time.now - time_start).round 3 { name: name, diff --git a/dragon/console.rb b/dragon/console.rb index 34183ae..6d9733d 100644 --- a/dragon/console.rb +++ b/dragon/console.rb @@ -10,14 +10,17 @@ module GTK class Console include ConsoleDeprecated - attr_accessor :show_reason, :log, :logo, :background_color, - :text_color, :animation_duration, + attr_accessor :show_reason, :log, :logo, + :animation_duration, :max_log_lines, :max_history, :log, - :last_command_errored, :last_command, :error_color, :shown_at, - :header_color, :archived_log, :last_log_lines, :last_log_lines_count, + :last_command_errored, :last_command, :shown_at, + :archived_log, :last_log_lines, :last_log_lines_count, :suppress_left_arrow_behavior, :command_set_at, :toast_ids, :bottom, - :font_style, :menu + :font_style, :menu, + :background_color, :spam_color, :text_color, :warn_color, + :error_color, :header_color, :code_color, :comment_color, + :debug_color, :unfiltered_color def initialize @font_style = FontStyle.new(font: 'font.ttf', size_enum: -1.5, line_height: 1.1) @@ -35,15 +38,22 @@ module GTK @command_history_index = -1 @nonhistory_input = '' @logo = 'console-logo.png' - @history_fname = 'console_history.txt' + @history_fname = 'logs/console_history.txt' @background_color = Color.new [0, 0, 0, 224] - @text_color = Color.new [255, 255, 255] - @error_color = Color.new [200, 50, 50] @header_color = Color.new [100, 200, 220] @code_color = Color.new [210, 168, 255] - @comment_color = Color.new [0, 200, 100] + @comment_color = Color.new [0, 200, 100] @animation_duration = 1.seconds @shown_at = -1 + + # these are the colors for text at various log levels. + @spam_color = Color.new [160, 160, 160] + @debug_color = Color.new [0, 255, 0] + @text_color = Color.new [255, 255, 255] + @warn_color = Color.new [255, 255, 0] + @error_color = Color.new [200, 50, 50] + @unfiltered_color = Color.new [0, 255, 255] + load_history end @@ -109,7 +119,13 @@ module GTK nil end - def add_text obj + def add_text obj, loglevel=-1 + # loglevel is one of the values of LogLevel in logging.h, or -1 to say "we don't care, colorize it with your special string parsing magic" + loglevel = -1 if loglevel < 0 + loglevel = 5 if loglevel > 5 # 5 == unfiltered (it's 0x7FFFFFFE in C, clamp it down) + loglevel = 2 if (loglevel == -1) && obj.start_with?('!c!') # oh well + colorstr = (loglevel != -1) ? "!c!#{loglevel}" : nil + @last_log_lines_count ||= 1 @log_invocation_count += 1 @@ -118,12 +134,18 @@ module GTK log_lines = [] str.each_line do |s| - s.wrapped_lines(self.console_text_width).each do |l| - log_lines << l + if colorstr.nil? + s.wrapped_lines(self.console_text_width).each do |l| + log_lines << l + end + else + s.wrapped_lines(self.console_text_width).each do |l| + log_lines << "#{colorstr}#{l}" + end end end - if log_lines == @last_log_lines + if log_lines == @last_log_lines && log_lines.length != 0 @last_log_lines_count += 1 new_log_line_with_count = @last_log_lines.last + " (#{@last_log_lines_count})" if log_lines.length > 1 @@ -398,10 +420,12 @@ S def mouse_wheel_scroll args @inertia ||= 0 - if args.inputs.mouse.wheel && args.inputs.mouse.wheel.y > 0 - @inertia = 1 - elsif args.inputs.mouse.wheel && args.inputs.mouse.wheel.y < 0 - @inertia = -1 + if args.inputs.mouse.wheel + if args.inputs.mouse.wheel.y > 0 + @inertia = 1 + elsif args.inputs.mouse.wheel.y < 0 + @inertia = -1 + end end if args.inputs.mouse.click @@ -410,13 +434,11 @@ S return if @inertia == 0 - if @inertia != 0 - @inertia = (@inertia * 0.7) - if @inertia > 0 - @log_offset -= 1 - elsif @inertia < 0 - @log_offset += 1 - end + @inertia = (@inertia * 0.7) + if @inertia > 0 + @log_offset += 1 + elsif @inertia < 0 + @log_offset -= 1 end if @inertia.abs < 0.01 @@ -532,7 +554,7 @@ S def write_line(args, left, y, str, archived: false) color = color_for_log_entry(str) color = color.mult_alpha(0.5) if archived - + str = str[4..-1] if str.start_with?('!c!') # chop off loglevel color args.outputs.reserved << font_style.label(x: left.shift_right(10), y: y, text: str, color: color) end @@ -768,7 +790,9 @@ S return false end - def color_for_log_entry(log_entry) + def color_for_plain_text log_entry + log_entry = log_entry[4..-1] if log_entry.start_with? "!c!" + if code? log_entry @code_color elsif code_comment? log_entry @@ -788,6 +812,29 @@ S end end + def color_for_log_entry(log_entry) + if log_entry.start_with?('!c!') # loglevel color specified. + return case log_entry[3..3].to_i + when 0 # spam + @spam_color + when 1 # debug + @debug_color + #when 2 # info (caught by the `else` block.) + # @text_color + when 3 # warn + @warn_color + when 4 # error + @error_color + when 5 # unfiltered + @unfiltered_color + else + color_for_plain_text log_entry + end + end + + return color_for_plain_text log_entry + end + def prompt @prompt ||= Prompt.new(font_style: font_style, text_color: @text_color, console_text_width: console_text_width) end diff --git a/dragon/docs.rb b/dragon/docs.rb index cd39483..17a6e9a 100644 --- a/dragon/docs.rb +++ b/dragon/docs.rb @@ -260,7 +260,7 @@ S -
    +
    S html_toc_end_to_content_start = <<-S
    diff --git a/dragon/draw.rb b/dragon/draw.rb index 7136994..2963315 100644 --- a/dragon/draw.rb +++ b/dragon/draw.rb @@ -24,7 +24,7 @@ module GTK fn.each_send pass.borders, self, :draw_border fn.each_send pass.static_borders, self, :draw_border - if !$gtk.production + if !self.production fn.each_send pass.debug, self, :draw_primitive fn.each_send pass.static_debug, self, :draw_primitive end @@ -41,6 +41,7 @@ module GTK if s.respond_to? :draw_override s.draw_override @ffi_draw else + s = s.as_hash if s.is_a? OpenEntity @ffi_draw.draw_solid_2 s.x, s.y, s.w, s.h, s.r, s.g, s.b, s.a, (s.blendmode_enum || 1) @@ -54,6 +55,7 @@ module GTK if s.respond_to? :draw_override s.draw_override @ffi_draw else + s = s.as_hash if s.is_a? OpenEntity @ffi_draw.draw_sprite_4 s.x, s.y, s.w, s.h, (s.path || '').to_s, s.angle, @@ -73,6 +75,7 @@ module GTK if s.respond_to? :draw_override s.draw_override @ffi_draw else + s = s.as_hash if s.is_a? OpenEntity @ffi_draw.draw_screenshot (s.path || '').to_s, s.x, s.y, s.w, s.h, s.angle, @@ -91,6 +94,7 @@ module GTK if l.respond_to? :draw_override l.draw_override @ffi_draw else + l = l.as_hash if l.is_a? OpenEntity @ffi_draw.draw_label_3 l.x, l.y, (l.text || '').to_s, l.size_enum, l.alignment_enum, @@ -108,6 +112,7 @@ module GTK if l.respond_to? :draw_override l.draw_override @ffi_draw else + l = l.as_hash if l.is_a? OpenEntity if l.x2 @ffi_draw.draw_line_2 l.x, l.y, l.x2, l.y2, l.r, l.g, l.b, l.a, @@ -133,6 +138,7 @@ module GTK if s.respond_to? :draw_override s.draw_override @ffi_draw else + s = s.as_hash if s.is_a? OpenEntity @ffi_draw.draw_border_2 s.x, s.y, s.w, s.h, s.r, s.g, s.b, s.a, (s.blendmode_enum || 1) diff --git a/dragon/easing.rb b/dragon/easing.rb index ef8ca0c..8b41fa6 100644 --- a/dragon/easing.rb +++ b/dragon/easing.rb @@ -9,8 +9,8 @@ module GTK ease_extended start_tick, current_tick, start_tick + duration, - (initial_value *definitions), - (final_value *definitions), + initial_value(*definitions), + final_value(*definitions), *definitions end diff --git a/dragon/framerate.rb b/dragon/framerate.rb index ff2f1c5..478b340 100644 --- a/dragon/framerate.rb +++ b/dragon/framerate.rb @@ -34,7 +34,7 @@ module GTK if @tick_speed_count > 60 * 2 if framerate_below_threshold? @last_framerate = current_framerate - if !@console.visible? + if !@console.visible? && !@recording.is_replaying? log framerate_warning_message end end diff --git a/dragon/geometry.rb b/dragon/geometry.rb index 6bceea8..d7c8ffc 100644 --- a/dragon/geometry.rb +++ b/dragon/geometry.rb @@ -6,8 +6,8 @@ module GTK module Geometry def self.rotate_point point, angle, around = nil - s = Math.sin a.to_radians - c = Math.cos a.to_radians + s = Math.sin angle.to_radians + c = Math.cos angle.to_radians px = point.x py = point.y cx = 0 @@ -188,8 +188,16 @@ S end # @gtk - def self.line_y_intercept line - line.y - line_slope(line) * line.x + def self.line_y_intercept line, replace_infinity: nil + line.y - line_slope(line, replace_infinity: replace_infinity) * line.x + rescue Exception => e +raise <<-S +* ERROR: ~Geometry::line_y_intercept~ +The following exception was thrown for line: #{line} +#{e} + +Consider passing in ~replace_infinity: VALUE~ to handle for vertical lines. +S end # @gtk @@ -265,14 +273,22 @@ S end # @gtk - def self.line_intersect line_one, line_two - m1 = line_slope(line_one) - m2 = line_slope(line_two) - b1 = line_y_intercept(line_one) - b2 = line_y_intercept(line_two) + def self.line_intersect line_one, line_two, replace_infinity: nil + m1 = line_slope(line_one, replace_infinity: replace_infinity) + m2 = line_slope(line_two, replace_infinity: replace_infinity) + b1 = line_y_intercept(line_one, replace_infinity: replace_infinity) + b2 = line_y_intercept(line_two, replace_infinity: replace_infinity) x = (b1 - b2) / (m2 - m1) y = (-b2.fdiv(m2) + b1.fdiv(m1)).fdiv(1.fdiv(m1) - 1.fdiv(m2)) [x, y] + rescue Exception => e +raise <<-S +* ERROR: ~Geometry::line_intersect~ +The following exception was thrown for line_one: #{line_one}, line_two: #{line_two} +#{e} + +Consider passing in ~replace_infinity: VALUE~ to handle for vertical lines. +S end def self.contract_intersect_rect? diff --git a/dragon/inputs.rb b/dragon/inputs.rb index 163fc16..8be97f9 100644 --- a/dragon/inputs.rb +++ b/dragon/inputs.rb @@ -313,7 +313,8 @@ module GTK value = Kernel.tick_count if value collection.each do |m| - self.instance_variable_set("@#{m.to_s}".to_sym, value) + m_to_s = m.to_s + self.instance_variable_set("@#{m_to_s}".to_sym, value) if m_to_s.strip.length > 0 rescue Exception => e raise e, <<-S * ERROR: diff --git a/dragon/ios_wizard.rb b/dragon/ios_wizard.rb index a64cdc9..c040dea 100644 --- a/dragon/ios_wizard.rb +++ b/dragon/ios_wizard.rb @@ -42,6 +42,7 @@ class IOSWizard < Wizard :check_for_dev_profile, *app_metadata_retrieval_steps, + :determine_devcert, :clear_tmp_directory, :stage_app, @@ -70,6 +71,7 @@ class IOSWizard < Wizard :determine_app_version, *app_metadata_retrieval_steps, + :determine_prodcert, :clear_tmp_directory, :stage_app, @@ -264,6 +266,10 @@ teamid= appid= # appname is the name you want to show up underneath the app icon on the device. Keep it under 10 characters. appname= +# devcert is the certificate to use for development/deploying to your local device +devcert= +# prodcert is the certificate to use for distribution to the app store +prodcert= S end @@ -299,7 +305,7 @@ S def raise_ios_metadata_required raise WizardException.new( "* mygame/metadata/ios_metadata.txt needs to be filled out.", - "You need to update metadata/ios_metadata.txt with a valid teamid, appname, and appid.", + "You need to update metadata/ios_metadata.txt with a valid teamid, appname, appid, devcert, and prodcert.", "Instructions for where the values should come from are within metadata/ios_metadata.txt." ) end @@ -339,7 +345,19 @@ S def determine_app_id @app_id = ios_metadata.appid raise_ios_metadata_required if @app_id.strip.length == 0 - log_info "App Identifier is set to : #{@app_id}" + log_info "App Identifier is set to: #{@app_id}" + end + + def determine_devcert + @certificate_name = ios_metadata.devcert + raise_ios_metadata_required if @certificate_name.strip.length == 0 + log_info "Dev Certificate is set to: #{@certificate_name}" + end + + def determine_prodcert + @certificate_name = ios_metadata.prodcert + raise_ios_metadata_required if @certificate_name.strip.length == 0 + log_info "Production (Distribution) Certificate is set to: #{@certificate_name}" end def set_app_name name @@ -361,12 +379,6 @@ S sh "rm -rf #{tmp_directory}" end - def stage_app - log_info "Staging." - sh "mkdir -p #{tmp_directory}" - sh "cp -R #{relative_path}/dragonruby-ios.app \"#{tmp_directory}/#{@app_name}.app\"" - end - def set_app_id id log_info = "App Id set to: #{id}" @app_id = id @@ -397,34 +409,13 @@ S def check_for_certs log_info "Attempting to find certificates on your computer." - if !cli_app_exist?(security_cli_app) - raise WizardException.new( - "* It doesn't look like you have #{security_cli_app}.", - "** 1. Open Disk Utility and run First Aid.", - { w: 700, h: 148, path: get_reserved_sprite("disk-utility.png") }, - ) - end - - if valid_certs.length == 0 - raise WizardException.new( - "* It doesn't look like you have any valid certs installed.", - "** 1. Open Xcode.", - "** 2. Log into your developer account. Xcode -> Preferences -> Accounts.", - { w: 700, h: 98, path: get_reserved_sprite("login-xcode.png") }, - "** 3. After loggin in, select Manage Certificates...", - { w: 700, h: 115, path: get_reserved_sprite("manage-certificates.png") }, - "** 4. Add a certificate for Apple Development.", - { w: 700, h: 217, path: get_reserved_sprite("add-cert.png") }, - ) - raise "You do not have any Apple development certs on this computer." - end - if @production_build - @certificate_name = valid_certs.find_all { |f| f[:name].include? "Distribution" }.first[:name] + @certificate_name = ios_metadata[:prodcert] else - @certificate_name = valid_certs.find_all { |f| f[:name].include? "Development" }.first[:name] + @certificate_name = ios_metadata[:devcert] end - log_info "I will be using Certificate: '#{@certificate_name}'." + + log_info "I will be using certificate: '#{@certificate_name}'." end def idevice_id_cli_app @@ -439,24 +430,6 @@ S "xcodebuild" end - def valid_certs - certs = sh("#{security_cli_app} -q find-identity -p codesigning -v").each_line.map do |l| - if l.include?(")") && !l.include?("Developer ID") && (l.include?("Development") || l.include?("Distribution")) - l.strip - else - nil - end - end.reject_nil.map do |l| - number, id, name = l.split(' ', 3) - name = name.gsub("\"", "") if name - { - number: 1, - id: id, - name: name - } - end - end - def connected_devices sh("idevice_id -l").strip.each_line.map do |l| l.strip @@ -986,6 +959,9 @@ XML end def stage_app + log_info "Staging." + sh "mkdir -p #{tmp_directory}" + sh "cp -R #{relative_path}/dragonruby-ios.app \"#{tmp_directory}/#{@app_name}.app\"" sh %Q[cp -r "#{root_folder}/app/" "#{app_path}/app/"] sh %Q[cp -r "#{root_folder}/sounds/" "#{app_path}/sounds/"] sh %Q[cp -r "#{root_folder}/sprites/" "#{app_path}/sprites/"] diff --git a/dragon/numeric.rb b/dragon/numeric.rb index 27cf02e..52ddf61 100644 --- a/dragon/numeric.rb +++ b/dragon/numeric.rb @@ -472,26 +472,6 @@ S (0..self).to_a end - def >= other - return false if !other - return gte other - end - - def > other - return false if !other - return gt other - end - - def <= other - return false if !other - return lte other - end - - def < other - return false if !other - return gt other - end - # @gtk def map unless block_given? @@ -577,34 +557,6 @@ The object above is not a Numeric. S end - def - other - return self unless other - self - other - rescue Exception => e - __raise_arithmetic_exception__ other, :-, e - end - - def + other - return self unless other - self + other - rescue Exception => e - __raise_arithmetic_exception__ other, :+, e - end - - def * other - return self unless other - self * other - rescue Exception => e - __raise_arithmetic_exception__ other, :*, e - end - - def / other - return self unless other - self / other - rescue Exception => e - __raise_arithmetic_exception__ other, :/, e - end - def serialize self end @@ -659,34 +611,6 @@ class Fixnum return !even? end - def + other - return self unless other - self + other - rescue Exception => e - __raise_arithmetic_exception__ other, :+, e - end - - def * other - return self unless other - self * other - rescue Exception => e - __raise_arithmetic_exception__ other, :*, e - end - - def / other - return self unless other - self / other - rescue Exception => e - __raise_arithmetic_exception__ other, :/, e - end - - def - other - return self unless other - self - other - rescue Exception => e - __raise_arithmetic_exception__ other, :-, e - end - # Returns `-1` if the number is less than `0`. `+1` if the number # is greater than `0`. Returns `0` if the number is equal to `0`. # @@ -742,34 +666,6 @@ class Float alias_method :__original_multiply__, :* unless Float.instance_methods.include? :__original_multiply__ alias_method :__original_divide__, :- unless Float.instance_methods.include? :__original_divide__ - def - other - return self unless other - super - rescue Exception => e - __raise_arithmetic_exception__ other, :-, e - end - - def + other - return self unless other - super - rescue Exception => e - __raise_arithmetic_exception__ other, :+, e - end - - def * other - return self unless other - super - rescue Exception => e - __raise_arithmetic_exception__ other, :*, e - end - - def / other - return self unless other - super - rescue Exception => e - __raise_arithmetic_exception__ other, :/, e - end - def serialize self end diff --git a/dragon/outputs_docs.rb b/dragon/outputs_docs.rb index 776d850..db15989 100644 --- a/dragon/outputs_docs.rb +++ b/dragon/outputs_docs.rb @@ -206,21 +206,27 @@ be provided in any order. end #+end_src -** Rendering a sprite using a Class +** Rendering a solid using a Class -You can also create a class with sprite properties and render it as a primitive. +You can also create a class with solid/border properties and render it as a primitive. +ALL properties must be on the class. *Additionally*, a method called ~primitive_marker~ +must be defined on the class. Here is an example: #+begin_src - # Create type with ALL sprite properties + # Create type with ALL sprite properties AND primitive_marker class Sprite - attr_sprite + attr_accessor :x, :y, :w, :h, :path, :angle, :angle_anchor_x, :angle_anchor_y, :tile_x, :tile_y, :tile_w, :tile_h, :source_x, :source_y, :source_w, :source_h, :flip_horizontally, :flip_vertically, :a, :r, :g, :b + + def primitive_marker + :sprite + end end # Inherit from type class Circle < Sprite - # constructor + # constructor def initialize x, y, size, path self.x = x self.y = y diff --git a/dragon/runtime_docs.rb b/dragon/runtime_docs.rb index 6da72d0..1f4a509 100644 --- a/dragon/runtime_docs.rb +++ b/dragon/runtime_docs.rb @@ -12,7 +12,8 @@ module RuntimeDocs :docs_api_summary, :docs_reset, :docs_calcstringbox, - :docs_write_file + :docs_write_file, + :docs_benchmark ] end @@ -485,6 +486,8 @@ Invalids the texture cache of a sprite. Shows the mouse cursor. *** ~.hide_cursor~ Hides the mouse cursor. +*** ~.set_cursor path, dx, dy~ +Sets the system cursor to a sprite ~path~ with an offset of ~dx~ and ~dy~. *** ~.cursor_shown?~ Returns ~true~ if the mouse cursor is shown. *** ~.set_window_fullscreen enabled~ @@ -538,6 +541,39 @@ is currently in the file. Use ~GTK::Runtime#append_file~ to append to the file a #+end_src S end + + def docs_benchmark +<<-S +* DOCS: ~GTK::Runtime#benchmark~ +You can use this function to compare the relative performance of methods. + +#+begin_src ruby + def tick args + # press r to run benchmark + if args.inputs.keyboard.key_down.r + args.gtk.console.show + args.gtk.benchmark iterations: 1000, # number of iterations + # label for experiment + using_numeric_map: -> () { + # experiment body + v = 100.map do |i| + i * 100 + end + }, + # label for experiment + using_numeric_times: -> () { + # experiment body + v = [] + 100.times do |i| + v << i * 100 + end + } + end + end +#+end_src +S + end + end class GTK::Runtime diff --git a/dragon/tweetcart.rb b/dragon/tweetcart.rb index 9e278b3..67e950e 100644 --- a/dragon/tweetcart.rb +++ b/dragon/tweetcart.rb @@ -26,9 +26,9 @@ def $top_level.TICK &block def $top_level.slds! *os if (os.first.is_a? Numeric) - sld! *os + sld!(*os) else - os.each { |o| sld! *o } + os.each { |o| sld!(*o) } end end diff --git a/samples/02_input_basics/01_moving_a_sprite/replay.txt b/samples/02_input_basics/01_moving_a_sprite/replay.txt new file mode 100644 index 0000000..1ec5f3a --- /dev/null +++ b/samples/02_input_basics/01_moving_a_sprite/replay.txt @@ -0,0 +1,73 @@ +replay_version 2.0 +stopped_at 442 +seed 100 +recorded_at 2021-11-20 11:06:58 -0600 +[:mouse_button_up, 1, 0, 1, 1, 5] +[:key_down_raw, 1073741903, 0, 2, 2, 147] +[:key_down_raw, 1073741903, 0, 2, 3, 162] +[:key_down_raw, 1073741903, 0, 2, 4, 164] +[:key_down_raw, 1073741903, 0, 2, 5, 166] +[:key_down_raw, 1073741903, 0, 2, 6, 168] +[:key_down_raw, 1073741903, 0, 2, 7, 170] +[:key_down_raw, 1073741903, 0, 2, 8, 172] +[:key_down_raw, 1073741906, 0, 2, 9, 172] +[:key_down_raw, 1073741905, 0, 2, 10, 182] +[:key_up_raw, 1073741903, 0, 2, 11, 185] +[:key_up_raw, 1073741906, 0, 2, 12, 188] +[:key_down_raw, 1073741904, 0, 2, 13, 195] +[:key_up_raw, 1073741905, 0, 2, 14, 202] +[:key_up_raw, 1073741904, 0, 2, 15, 208] +[:key_down_raw, 1073741903, 0, 2, 16, 210] +[:key_down_raw, 1073741903, 0, 2, 17, 225] +[:key_down_raw, 1073741903, 0, 2, 18, 227] +[:key_down_raw, 1073741903, 0, 2, 19, 229] +[:key_down_raw, 1073741903, 0, 2, 20, 231] +[:key_down_raw, 1073741903, 0, 2, 21, 233] +[:key_down_raw, 1073741903, 0, 2, 22, 235] +[:key_down_raw, 1073741903, 0, 2, 23, 237] +[:key_down_raw, 1073741903, 0, 2, 24, 239] +[:key_down_raw, 1073741903, 0, 2, 25, 241] +[:key_down_raw, 1073741903, 0, 2, 26, 243] +[:key_down_raw, 1073741903, 0, 2, 27, 245] +[:key_down_raw, 1073741903, 0, 2, 28, 247] +[:key_down_raw, 1073741903, 0, 2, 29, 249] +[:key_down_raw, 1073741903, 0, 2, 30, 251] +[:key_down_raw, 1073741903, 0, 2, 31, 253] +[:key_down_raw, 1073741903, 0, 2, 32, 255] +[:key_down_raw, 1073741903, 0, 2, 33, 257] +[:key_down_raw, 1073741903, 0, 2, 34, 259] +[:key_down_raw, 1073741903, 0, 2, 35, 261] +[:key_down_raw, 1073741903, 0, 2, 36, 263] +[:key_down_raw, 1073741903, 0, 2, 37, 265] +[:key_down_raw, 1073741903, 0, 2, 38, 267] +[:key_down_raw, 1073741903, 0, 2, 39, 269] +[:key_down_raw, 1073741903, 0, 2, 40, 271] +[:key_down_raw, 1073741906, 0, 2, 41, 271] +[:key_up_raw, 1073741903, 0, 2, 42, 282] +[:key_down_raw, 1073741906, 0, 2, 43, 286] +[:key_down_raw, 1073741906, 0, 2, 44, 288] +[:key_down_raw, 1073741906, 0, 2, 45, 290] +[:key_down_raw, 1073741906, 0, 2, 46, 292] +[:key_down_raw, 1073741906, 0, 2, 47, 294] +[:key_down_raw, 1073741906, 0, 2, 48, 296] +[:key_down_raw, 1073741906, 0, 2, 49, 298] +[:key_down_raw, 1073741906, 0, 2, 50, 301] +[:key_down_raw, 1073741905, 0, 2, 51, 302] +[:key_up_raw, 1073741906, 0, 2, 52, 313] +[:key_down_raw, 1073741904, 0, 2, 53, 315] +[:key_up_raw, 1073741905, 0, 2, 54, 322] +[:key_down_raw, 1073741904, 0, 2, 55, 330] +[:key_down_raw, 1073741904, 0, 2, 56, 332] +[:key_down_raw, 1073741904, 0, 2, 57, 334] +[:key_down_raw, 1073741904, 0, 2, 58, 336] +[:key_down_raw, 1073741904, 0, 2, 59, 338] +[:key_down_raw, 1073741904, 0, 2, 60, 340] +[:key_down_raw, 1073741904, 0, 2, 61, 342] +[:key_down_raw, 1073741904, 0, 2, 62, 344] +[:key_down_raw, 1073741904, 0, 2, 63, 346] +[:key_down_raw, 1073741904, 0, 2, 64, 348] +[:key_down_raw, 1073741904, 0, 2, 65, 350] +[:key_up_raw, 1073741904, 0, 2, 66, 351] +[:key_down_raw, 96, 0, 2, 67, 359] +[:key_up_raw, 96, 0, 2, 68, 364] +[:key_down_raw, 13, 0, 2, 69, 442] diff --git a/samples/04_physics_and_collisions/06_box_collision_3/app/main.rb b/samples/04_physics_and_collisions/06_box_collision_3/app/main.rb index ae447fd..e2210c2 100644 --- a/samples/04_physics_and_collisions/06_box_collision_3/app/main.rb +++ b/samples/04_physics_and_collisions/06_box_collision_3/app/main.rb @@ -152,17 +152,17 @@ class Game end def calc_player_dx - player.y += player.dy - player.dy += state.gravity - player.dy += player.dy * state.drag ** 2 * -1 - end - - def calc_player_dy player.dx = player.dx.clamp(-5, 5) player.dx *= 0.9 player.x += player.dx end + def calc_player_dy + player.y += player.dy + player.dy += state.gravity + player.dy += player.dy * state.drag ** 2 * -1 + end + def reset_player player.x = 100 player.y = 720 diff --git a/samples/04_physics_and_collisions/07_jump_physics/app/main.rb b/samples/04_physics_and_collisions/07_jump_physics/app/main.rb index 3fcb9e9..8db98be 100644 --- a/samples/04_physics_and_collisions/07_jump_physics/app/main.rb +++ b/samples/04_physics_and_collisions/07_jump_physics/app/main.rb @@ -45,8 +45,7 @@ class VerticalPlatformer input end - # Sets default values - def defaults + def init_game s.platforms ||= [ # initializes platforms collection with two platforms using hashes new_platform(x: 0, y: 0, w: 700, h: 32, dx: 1, speed: 0, rect: nil), new_platform(x: 0, y: 300, w: 700, h: 32, dx: 1, speed: 0, rect: nil), # 300 pixels higher @@ -69,6 +68,11 @@ class VerticalPlatformer s.camera ||= { y: -100 } # shows view on screen (as the player moves upward, the camera does too) end + # Sets default values + def defaults + init_game + end + # Outputs objects onto the screen def render outputs.solids << s.platforms.map do |p| # outputs platforms onto screen @@ -156,7 +160,9 @@ class VerticalPlatformer rect: nil) end else + # game over s.as_hash.clear # otherwise clear the hash (no new platform is necessary) + init_game end end diff --git a/samples/05_mouse/01_mouse_click/app/main.rb b/samples/05_mouse/01_mouse_click/app/main.rb index 8969a6e..e37a753 100644 --- a/samples/05_mouse/01_mouse_click/app/main.rb +++ b/samples/05_mouse/01_mouse_click/app/main.rb @@ -49,12 +49,23 @@ class TicTacToe # Starts the game with player x's turn and creates an array (to_a) for space combinations. # Calls methods necessary for the game to run properly. def tick - state.current_turn ||= :x - state.space_combinations = [-1, 0, 1].product([-1, 0, 1]).to_a + init_new_game render_board input_board end + def init_new_game + state.current_turn ||= :x + state.space_combinations ||= [-1, 0, 1].product([-1, 0, 1]).to_a + + state.spaces ||= {} + + state.space_combinations.each do |x, y| + state.spaces[x] ||= {} + state.spaces[x][y] ||= state.new_entity(:space) + end + end + # Uses borders to create grid squares for the game's board. Also outputs the game pieces using labels. def render_board square_size = 80 @@ -130,6 +141,7 @@ class TicTacToe def input_restart_game return unless state.game_over gtk.reset + init_new_game end # Checks if x or o won the game. diff --git a/samples/05_mouse/02_mouse_move/app/main.rb b/samples/05_mouse/02_mouse_move/app/main.rb index 97edbe7..d9387dc 100644 --- a/samples/05_mouse/02_mouse_move/app/main.rb +++ b/samples/05_mouse/02_mouse_move/app/main.rb @@ -196,7 +196,7 @@ class ProtectThePuppiesFromTheZombies def calc_kill_zombie # Find all zombies that intersect with the player. They are considered killed. - killed_this_frame = state.zombies.find_all { |z| z.sprite.intersect_rect? state.player_sprite } + killed_this_frame = state.zombies.find_all { |z| z.sprite && (z.sprite.intersect_rect? state.player_sprite) } state.zombies = state.zombies - killed_this_frame # remove newly killed zombies from zombies collection state.killed_zombies += killed_this_frame # add newly killed zombies to killed zombies diff --git a/samples/05_mouse/04_coordinate_systems/app/main.rb b/samples/05_mouse/04_coordinate_systems/app/main.rb index cbf3329..fcfa090 100644 --- a/samples/05_mouse/04_coordinate_systems/app/main.rb +++ b/samples/05_mouse/04_coordinate_systems/app/main.rb @@ -2,7 +2,7 @@ APIs listing that haven't been encountered in previous sample apps: - - args.inputs.mouse.position: Coordinates of the mouse's position on the screen. + - args.inputs.mouse.click.position: Coordinates of the mouse's position on the screen. Unlike args.inputs.mouse.click.point, the mouse does not need to be pressed down for position to know the mouse's coordinates. For more information about the mouse, go to mygame/documentation/07-mouse.md. @@ -43,7 +43,7 @@ def tick args # ensure that the outputs don't overlap each other. Try removing them and see what happens. pos = args.inputs.mouse.position # stores coordinates of mouse's position args.outputs.labels << [pos.x + 10, pos.y + 10, "#{pos}"] # outputs label of coordinates - args.outputs.solids << [pos.x - 2, pos.y - 2, 5, 5] # outputs small black box placed where mouse is hovering + args.outputs.solids << [pos.x - 2, pos.y - 2, 5, 5] # outputs small blackk box placed where mouse is hovering button = [0, 0, 370, 50] # sets definition of toggle button args.outputs.borders << button # outputs button as border (not filled in) diff --git a/samples/07_advanced_audio/01_audio_mixer/app/main.rb b/samples/07_advanced_audio/01_audio_mixer/app/main.rb index 3a85d47..9cdc62f 100644 --- a/samples/07_advanced_audio/01_audio_mixer/app/main.rb +++ b/samples/07_advanced_audio/01_audio_mixer/app/main.rb @@ -71,6 +71,7 @@ def render_sources args end def playtime_str t + return "" unless t minutes = (t / 60.0).floor seconds = t - (minutes * 60.0).to_f return minutes.to_s + ':' + seconds.floor.to_s + ((seconds - seconds.floor).to_s + "000")[1..3] @@ -183,7 +184,7 @@ def panel_primitives args, audio_entry results.playtime_slider_rect = progress_bar(args: args, row: 2.5, col: 2, - percentage: audio_entry.playtime / audio_entry.length_, + percentage: (audio_entry.playtime || 1) / (audio_entry.length_ || 1), text: "#{playtime_str(audio_entry.playtime)} / #{playtime_str(audio_entry.length_)}") results.primitives << results.playtime_slider_rect.primitives @@ -320,7 +321,7 @@ def defaults args args.state.sound_files ||= [ { name: :tada, path: "sounds/tada.wav" }, { name: :splash, path: "sounds/splash.wav" }, - { name: :drum, path: "sounds/drum.wav" }, + { name: :drum, path: "sounds/drum.mp3" }, { name: :spring, path: "sounds/spring.wav" }, { name: :music, path: "sounds/music.ogg" } ] diff --git a/samples/07_advanced_audio/01_audio_mixer/sounds/drum.mp3 b/samples/07_advanced_audio/01_audio_mixer/sounds/drum.mp3 new file mode 100644 index 0000000..e41e671 Binary files /dev/null and b/samples/07_advanced_audio/01_audio_mixer/sounds/drum.mp3 differ diff --git a/samples/07_advanced_rendering/00_labels_with_wrapped_text/app/main.rb b/samples/07_advanced_rendering/00_labels_with_wrapped_text/app/main.rb new file mode 100644 index 0000000..71eefa9 --- /dev/null +++ b/samples/07_advanced_rendering/00_labels_with_wrapped_text/app/main.rb @@ -0,0 +1,88 @@ +def tick args + # defaults + args.state.scroll_location ||= 0 + args.state.textbox.messages ||= [] + args.state.textbox.scroll ||= 0 + + # render + args.outputs.background_color = [0, 0, 0, 255] + render_messages args + render_instructions args + + # inputs + if args.inputs.keyboard.key_down.one + queue_message args, "Hello there neighbour! my name is mark, how is your day today?" + end + + if args.inputs.keyboard.key_down.two + queue_message args, "I'm doing great sir, actually I'm having a picnic today" + end + + if args.inputs.keyboard.key_down.three + queue_message args, "Well that sounds wonderful!" + end + + if args.inputs.keyboard.key_down.home + args.state.scroll_location = 1 + end + + if args.inputs.keyboard.key_down.delete + clear_message_queue args + end +end + +def queue_message args, msg + args.state.textbox.messages.concat msg.wrapped_lines 50 +end + +def clear_message_queue args + args.state.textbox.messages = nil + args.state.textbox.scroll = 0 +end + +def render_messages args + args.outputs[:textbox].w = 400 + args.outputs[:textbox].h = 720 + + args.outputs.primitives << args.state.textbox.messages.each_with_index.map do |s, idx| + { + x: 0, + y: 20 * (args.state.textbox.messages.size - idx) + args.state.textbox.scroll * 20, + text: s, + size_enum: -3, + alignment_enum: 0, + r: 255, g:255, b: 255, a: 255 + } + end + + args.outputs[:textbox].labels << args.state.textbox.messages.each_with_index.map do |s, idx| + { + x: 0, + y: 20 * (args.state.textbox.messages.size - idx) + args.state.textbox.scroll * 20, + text: s, + size_enum: -3, + alignment_enum: 0, + r: 255, g:255, b: 255, a: 255 + } + end + + args.outputs[:textbox].borders << [0, 0, args.outputs[:textbox].w, 720] + + args.state.textbox.scroll += args.inputs.mouse.wheel.y unless args.inputs.mouse.wheel.nil? + + if args.state.scroll_location > 0 + args.state.textbox.scroll = 0 + args.state.scroll_location = 0 + end + + args.outputs.sprites << [900, 0, args.outputs[:textbox].w, 720, :textbox] +end + +def render_instructions args + args.outputs.labels << [30, + 30.from_top, + "press 1, 2, 3 to display messages, MOUSE WHEEL to scroll, HOME to go to top, BACKSPACE to delete.", + 0, 255, 255] + + args.outputs.primitives << [0, 55.from_top, 1280, 30, :pixel, 0, 255, 0, 0, 0].sprite +end diff --git a/samples/07_advanced_rendering/00_labels_with_wrapped_text/replay.txt b/samples/07_advanced_rendering/00_labels_with_wrapped_text/replay.txt new file mode 100644 index 0000000..8153881 --- /dev/null +++ b/samples/07_advanced_rendering/00_labels_with_wrapped_text/replay.txt @@ -0,0 +1,93 @@ +replay_version 2.0 +stopped_at 461 +seed 100 +recorded_at 2021-11-20 11:11:30 -0600 +[:mouse_button_up, 1, 0, 1, 1, 5] +[:mouse_move, 789, 84, 2, 2, 33] +[:mouse_move, 790, 84, 2, 3, 35] +[:mouse_move, 791, 84, 2, 4, 37] +[:key_down_raw, 49, 0, 2, 5, 72] +[:key_up_raw, 49, 0, 2, 6, 78] +[:key_down_raw, 50, 0, 2, 7, 90] +[:key_up_raw, 50, 0, 2, 8, 97] +[:mouse_move, 789, 85, 2, 9, 108] +[:mouse_move, 784, 86, 2, 10, 109] +[:mouse_move, 780, 88, 2, 11, 110] +[:mouse_move, 780, 89, 2, 12, 112] +[:mouse_move, 780, 90, 2, 13, 114] +[:mouse_move, 780, 91, 2, 14, 115] +[:key_down_raw, 49, 0, 2, 15, 123] +[:key_up_raw, 49, 0, 2, 16, 131] +[:key_down_raw, 49, 0, 2, 17, 150] +[:key_up_raw, 49, 0, 2, 18, 157] +[:key_down_raw, 50, 0, 2, 19, 161] +[:key_up_raw, 50, 0, 2, 20, 169] +[:key_down_raw, 51, 0, 2, 21, 179] +[:key_up_raw, 51, 0, 2, 22, 186] +[:mouse_move, 780, 92, 2, 23, 186] +[:mouse_move, 781, 92, 2, 24, 187] +[:mouse_move, 777, 92, 2, 25, 225] +[:mouse_move, 769, 94, 2, 26, 226] +[:mouse_move, 761, 96, 2, 27, 227] +[:mouse_move, 759, 97, 2, 28, 228] +[:mouse_move, 760, 99, 2, 29, 231] +[:mouse_move, 762, 101, 2, 30, 232] +[:mouse_move, 768, 112, 2, 31, 233] +[:mouse_move, 769, 112, 2, 32, 234] +[:mouse_wheel, 0, 1, 2, 33, 234] +[:mouse_move, 769, 113, 2, 34, 234] +[:mouse_wheel, 0, 2, 2, 35, 235] +[:mouse_move, 770, 114, 2, 36, 235] +[:mouse_wheel, 0, 4, 2, 37, 236] +[:mouse_move, 771, 115, 2, 38, 237] +[:mouse_wheel, 0, 6, 2, 39, 237] +[:mouse_move, 771, 116, 2, 40, 239] +[:mouse_wheel, 0, 7, 2, 41, 239] +[:mouse_move, 772, 119, 2, 42, 240] +[:mouse_move, 773, 120, 2, 43, 241] +[:mouse_move, 773, 121, 2, 44, 242] +[:mouse_move, 774, 121, 2, 45, 243] +[:mouse_move, 774, 122, 2, 46, 244] +[:mouse_move, 775, 124, 2, 47, 246] +[:mouse_move, 780, 132, 2, 48, 247] +[:mouse_move, 784, 142, 2, 49, 248] +[:mouse_move, 788, 149, 2, 50, 249] +[:mouse_move, 789, 150, 2, 51, 250] +[:mouse_move, 789, 151, 2, 52, 251] +[:mouse_move, 790, 151, 2, 53, 252] +[:mouse_move, 790, 152, 2, 54, 262] +[:mouse_wheel, 0, 1, 2, 55, 273] +[:mouse_wheel, 0, 1, 2, 56, 274] +[:mouse_wheel, 0, 4, 2, 57, 275] +[:mouse_wheel, 0, 6, 2, 58, 277] +[:mouse_move, 790, 151, 2, 59, 288] +[:mouse_wheel, 0, -1, 2, 60, 297] +[:mouse_wheel, 0, -1, 2, 61, 299] +[:mouse_wheel, 0, -4, 2, 62, 300] +[:mouse_wheel, 0, -6, 2, 63, 301] +[:mouse_wheel, 0, -1, 2, 64, 317] +[:mouse_wheel, 0, -1, 2, 65, 318] +[:mouse_wheel, 0, -4, 2, 66, 319] +[:mouse_wheel, 0, -6, 2, 67, 320] +[:mouse_wheel, 0, -7, 2, 68, 321] +[:mouse_move, 791, 151, 2, 69, 322] +[:key_down_raw, 49, 0, 2, 70, 339] +[:key_up_raw, 49, 0, 2, 71, 343] +[:mouse_move, 791, 150, 2, 72, 343] +[:key_down_raw, 49, 0, 2, 73, 348] +[:key_up_raw, 49, 0, 2, 74, 351] +[:key_down_raw, 49, 0, 2, 75, 356] +[:key_up_raw, 49, 0, 2, 76, 361] +[:key_down_raw, 96, 0, 2, 77, 388] +[:mouse_move, 792, 150, 2, 78, 389] +[:key_up_raw, 96, 0, 2, 79, 392] +[:mouse_move, 792, 149, 2, 80, 394] +[:mouse_move, 787, 157, 2, 81, 418] +[:mouse_move, 776, 165, 2, 82, 419] +[:mouse_move, 768, 168, 2, 83, 420] +[:mouse_move, 766, 168, 2, 84, 421] +[:mouse_move, 767, 168, 2, 85, 424] +[:mouse_move, 772, 168, 2, 86, 425] +[:mouse_move, 777, 168, 2, 87, 426] +[:mouse_move, 778, 168, 2, 88, 427] +[:key_down_raw, 13, 0, 2, 89, 461] diff --git a/samples/07_advanced_rendering/00_rotating_label/app/main.rb b/samples/07_advanced_rendering/00_rotating_label/app/main.rb new file mode 100644 index 0000000..8b21fb8 --- /dev/null +++ b/samples/07_advanced_rendering/00_rotating_label/app/main.rb @@ -0,0 +1,32 @@ +def tick args + # set the render target width and height to match the label + args.outputs[:scene].w = 220 + args.outputs[:scene].h = 30 + + + # make the background transparent + args.outputs[:scene].background_color = [255, 255, 255, 0] + + # set the blendmode of the label to 0 (no blending) + # center it inside of the scene + # set the vertical_alignment_enum to 1 (center) + args.outputs[:scene].labels << { x: 0, + y: 15, + text: "label in render target", + blendmode_enum: 0, + vertical_alignment_enum: 1 } + + # add a border to the render target + args.outputs[:scene].borders << { x: 0, + y: 0, + w: args.outputs[:scene].w, + h: args.outputs[:scene].h } + + # add the rendertarget to the main output as a sprite + args.outputs.sprites << { x: 640 - args.outputs[:scene].w.half, + y: 360 - args.outputs[:scene].h.half, + w: args.outputs[:scene].w, + h: args.outputs[:scene].h, + angle: args.state.tick_count, + path: :scene } +end diff --git a/samples/07_advanced_rendering/08_splitscreen_camera/app/main.rb b/samples/07_advanced_rendering/08_splitscreen_camera/app/main.rb index 9b08e1e..9d22918 100644 --- a/samples/07_advanced_rendering/08_splitscreen_camera/app/main.rb +++ b/samples/07_advanced_rendering/08_splitscreen_camera/app/main.rb @@ -6,7 +6,7 @@ class CameraMovement def serialize {state: state, inputs: inputs, outputs: outputs, grid: grid } end - + def inspect serialize.to_s end @@ -76,12 +76,12 @@ class CameraMovement default_player(0, 0, 64, 64, "sprites/player/player_#{state.player_cyan.orientation}_standing.png") end - + def new_player_magenta default_player(64, 0, 64, 64, "sprites/player/player_#{state.player_magenta.orientation}_standing.png") end - + def new_camera_magenta default_camera(0,0,720,720) end @@ -93,7 +93,8 @@ class CameraMovement def new_camera_center default_camera(0,0,1280,720) end - + + def new_room default_floor_tile(0,0,1024,1024,'sprites/rooms/camera_room.png') end @@ -118,7 +119,7 @@ class CameraMovement state.player_cyan.x += state.player_cyan.dx state.player_cyan.y += state.player_cyan.dy end - + def calc_player_magenta state.player_magenta.x += state.player_magenta.dx state.player_magenta.y += state.player_magenta.dy @@ -133,7 +134,7 @@ class CameraMovement state.camera_center.x += (targetX - state.camera_center.x) * 0.1 * timeScale state.camera_center.y += (targetY - state.camera_center.y) * 0.1 * timeScale end - + def calc_camera_magenta timeScale = 1 @@ -170,7 +171,7 @@ class CameraMovement def calc_trauma_decay state.trauma = state.trauma * 0.9 end - + def calc_random_float_range(min, max) rand * (max-min) + min end @@ -198,7 +199,7 @@ class CameraMovement g: 255, b: 255} end - + def render_player_magenta outputs[:scene].sprites << {x: state.player_magenta.x, y: state.player_magenta.y, @@ -244,16 +245,16 @@ class CameraMovement render_camera_magenta_scene render_camera_cyan_scene - angle = Math.atan((state.player_magenta.y - state.player_cyan.y)/(state.player_magenta.x- state.player_cyan.x)) * 180/Math::PI + angle = Math.atan((state.player_magenta.y - state.player_cyan.y)/(state.player_magenta.x- state.player_cyan.x)) * 180/Math::PI output_split_camera angle - + end def render_camera_magenta_scene zoomFactor = 1 offsetX = 32 offsetY = 32 - + outputs[:scene_magenta].sprites << {x: (-state.camera_magenta.x*2), y: (-state.camera_magenta.y), w: outputs[:scene].width*2, @@ -279,7 +280,7 @@ class CameraMovement outputs.labels << [128,64,"#{quadrant}",8,2,255,0,255,255] if quadrant == 1 set_camera_attributes(w: 640, h: 720, m_x: 640, m_y: 0, c_x: 0, c_y: 0) - + elsif quadrant == 2 set_camera_attributes(w: 1280, h: 360, m_x: 0, m_y: 360, c_x: 0, c_y: 0) @@ -297,7 +298,7 @@ class CameraMovement state.camera_cyan.h = h + 64 outputs[:scene_cyan].width = (w) * 2 outputs[:scene_cyan].height = h - + state.camera_magenta.w = w + 64 state.camera_magenta.h = h + 64 outputs[:scene_magenta].width = (w) * 2 @@ -309,7 +310,7 @@ class CameraMovement path: :scene_magenta} outputs.sprites << {x: c_x, y: c_y, - w: w, + w: w, h: h, path: :scene_cyan} end @@ -317,7 +318,7 @@ class CameraMovement def add_trauma amount state.trauma = [state.trauma + amount, 1.0].min end - + def remove_trauma amount state.trauma = [state.trauma - amount, 0.0].max end @@ -357,7 +358,7 @@ class CameraMovement outputs.labels << [128,512,"#{state.player_cyan.x.round()}",8,2,0,255,255,255] outputs.labels << [128,480,"#{state.player_cyan.y.round()}",8,2,0,255,255,255] end - + def input_move_magenta if inputs.keyboard.key_held.w state.player_magenta.dy = 5 @@ -391,5 +392,5 @@ def tick args $camera_movement.outputs = args.outputs $camera_movement.state = args.state $camera_movement.grid = args.grid - $camera_movement.tick + $camera_movement.tick end diff --git a/samples/09_performance/03_sprites_as_struct/app/main.rb b/samples/09_performance/03_sprites_as_struct/app/main.rb new file mode 100644 index 0000000..7b738b7 --- /dev/null +++ b/samples/09_performance/03_sprites_as_struct/app/main.rb @@ -0,0 +1,82 @@ +# create a Struct variant that allows for named parameters on construction. +class NamedStruct < Struct + def initialize **opts + super(*members.map { |k| opts[k] }) + end +end + +# create a Star NamedStruct +Star = NamedStruct.new(:x, :y, :w, :h, :path, :s, + :angle, :angle_anchor_x, :angle_anchor_y, + :r, :g, :b, :a, + :tile_x, :tile_y, + :tile_w, :tile_h, + :source_x, :source_y, + :source_w, :source_h, + :flip_horizontally, :flip_vertically, + :blendmode_enum) + +# Sprites represented as Structs. They require a little bit more code than Hashes, +# but are the a little faster to render too. +def random_x args + (args.grid.w.randomize :ratio) * -1 +end + +def random_y args + (args.grid.h.randomize :ratio) * -1 +end + +def random_speed + 1 + (4.randomize :ratio) +end + +def new_star args + Star.new x: (random_x args), + y: (random_y args), + w: 4, h: 4, + path: 'sprites/tiny-star.png', + s: random_speed +end + +def move_star args, star + star.x += star[:s] + star.y += star[:s] + if star.x > args.grid.w || star.y > args.grid.h + star.x = (random_x args) + star.y = (random_y args) + star[:s] = random_speed + end +end + +def tick args + args.state.star_count ||= 0 + + # sets console command when sample app initially opens + if Kernel.global_tick_count == 0 + puts "" + puts "" + puts "=========================================================" + puts "* INFO: Sprites, Structs" + puts "* INFO: Please specify the number of sprites to render." + args.gtk.console.set_command "reset_with count: 100" + end + + # init + if args.state.tick_count == 0 + args.state.stars = args.state.star_count.map { |i| new_star args } + end + + # update + args.state.stars.each { |s| move_star args, s } + + # render + args.outputs.sprites << args.state.stars + args.outputs.background_color = [0, 0, 0] + args.outputs.primitives << args.gtk.current_framerate_primitives +end + +# resets game, and assigns star count given by user +def reset_with count: count + $gtk.reset + $gtk.args.state.star_count = count +end diff --git a/samples/09_performance/03_sprites_as_struct/license-for-sample.txt b/samples/09_performance/03_sprites_as_struct/license-for-sample.txt new file mode 100644 index 0000000..175ac25 --- /dev/null +++ b/samples/09_performance/03_sprites_as_struct/license-for-sample.txt @@ -0,0 +1,9 @@ +Copyright 2021 DragonRuby LLC + +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/09_performance/03_sprites_as_struct/sprites/tiny-star.png b/samples/09_performance/03_sprites_as_struct/sprites/tiny-star.png new file mode 100644 index 0000000..e04786a Binary files /dev/null and b/samples/09_performance/03_sprites_as_struct/sprites/tiny-star.png differ diff --git a/samples/09_performance/04_sprites_as_strict_entities/app/main.rb b/samples/09_performance/04_sprites_as_strict_entities/app/main.rb new file mode 100644 index 0000000..a2688c2 --- /dev/null +++ b/samples/09_performance/04_sprites_as_strict_entities/app/main.rb @@ -0,0 +1,72 @@ +# Sprites represented as StrictEntities using the queue ~args.outputs.sprites~ +# yields apis access similar to Entities, but all properties that can be set on the +# entity must be predefined with a default value. Strict entities do not support the +# addition of new properties after the fact. They are more performant than OpenEntities +# because of this constraint. +def random_x args + (args.grid.w.randomize :ratio) * -1 +end + +def random_y args + (args.grid.h.randomize :ratio) * -1 +end + +def random_speed + 1 + (4.randomize :ratio) +end + +def new_star args + args.state.new_entity_strict(:star, + x: (random_x args), + y: (random_y args), + w: 4, h: 4, + path: 'sprites/tiny-star.png', + s: random_speed) do |entity| + # invoke attr_sprite so that it responds to + # all properties that are required to render a sprite + entity.attr_sprite + end +end + +def move_star args, star + star.x += star.s + star.y += star.s + if star.x > args.grid.w || star.y > args.grid.h + star.x = (random_x args) + star.y = (random_y args) + star.s = random_speed + end +end + +def tick args + args.state.star_count ||= 0 + + # sets console command when sample app initially opens + if Kernel.global_tick_count == 0 + puts "" + puts "" + puts "=========================================================" + puts "* INFO: Sprites, Strict Entities" + puts "* INFO: Please specify the number of sprites to render." + args.gtk.console.set_command "reset_with count: 100" + end + + # init + if args.state.tick_count == 0 + args.state.stars = args.state.star_count.map { |i| new_star args } + end + + # update + args.state.stars.each { |s| move_star args, s } + + # render + args.outputs.sprites << args.state.stars + args.outputs.background_color = [0, 0, 0] + args.outputs.primitives << args.gtk.current_framerate_primitives +end + +# resets game, and assigns star count given by user +def reset_with count: count + $gtk.reset + $gtk.args.state.star_count = count +end diff --git a/samples/09_performance/04_sprites_as_strict_entities/license-for-sample.txt b/samples/09_performance/04_sprites_as_strict_entities/license-for-sample.txt new file mode 100644 index 0000000..100dcec --- /dev/null +++ b/samples/09_performance/04_sprites_as_strict_entities/license-for-sample.txt @@ -0,0 +1,9 @@ +Copyright 2019 DragonRuby LLC + +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/09_performance/04_sprites_as_strict_entities/sprites/tiny-star.png b/samples/09_performance/04_sprites_as_strict_entities/sprites/tiny-star.png new file mode 100644 index 0000000..e04786a Binary files /dev/null and b/samples/09_performance/04_sprites_as_strict_entities/sprites/tiny-star.png differ diff --git a/samples/09_performance/05_sprites_as_classes/app/main.rb b/samples/09_performance/05_sprites_as_classes/app/main.rb new file mode 100644 index 0000000..67cde79 --- /dev/null +++ b/samples/09_performance/05_sprites_as_classes/app/main.rb @@ -0,0 +1,55 @@ +# Sprites represented as Classes using the queue ~args.outputs.sprites~. +# gives you full control of property declaration and method invocation. +# They are more performant than OpenEntities and StrictEntities, but more code upfront. +class Star + attr_sprite + + def initialize grid + @grid = grid + @x = (rand @grid.w) * -1 + @y = (rand @grid.h) * -1 + @w = 4 + @h = 4 + @s = 1 + (4.randomize :ratio) + @path = 'sprites/tiny-star.png' + end + + def move + @x += @s + @y += @s + @x = (rand @grid.w) * -1 if @x > @grid.right + @y = (rand @grid.h) * -1 if @y > @grid.top + end +end + +# calls methods needed for game to run properly +def tick args + # sets console command when sample app initially opens + if Kernel.global_tick_count == 0 + puts "" + puts "" + puts "=========================================================" + puts "* INFO: Sprites, Classes" + puts "* INFO: Please specify the number of sprites to render." + args.gtk.console.set_command "reset_with count: 100" + end + + # init + if args.state.tick_count == 0 + args.state.stars = args.state.star_count.map { |i| Star.new args.grid } + end + + # update + args.state.stars.each(&:move) + + # render + args.outputs.sprites << args.state.stars + args.outputs.background_color = [0, 0, 0] + args.outputs.primitives << args.gtk.current_framerate_primitives +end + +# resets game, and assigns star count given by user +def reset_with count: count + $gtk.reset + $gtk.args.state.star_count = count +end diff --git a/samples/09_performance/05_sprites_as_classes/license-for-sample.txt b/samples/09_performance/05_sprites_as_classes/license-for-sample.txt new file mode 100644 index 0000000..100dcec --- /dev/null +++ b/samples/09_performance/05_sprites_as_classes/license-for-sample.txt @@ -0,0 +1,9 @@ +Copyright 2019 DragonRuby LLC + +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/09_performance/05_sprites_as_classes/sprites/tiny-star.png b/samples/09_performance/05_sprites_as_classes/sprites/tiny-star.png new file mode 100644 index 0000000..e04786a Binary files /dev/null and b/samples/09_performance/05_sprites_as_classes/sprites/tiny-star.png differ diff --git a/samples/09_performance/06_static_sprites_as_classes/app/main.rb b/samples/09_performance/06_static_sprites_as_classes/app/main.rb new file mode 100644 index 0000000..db5bf8e --- /dev/null +++ b/samples/09_performance/06_static_sprites_as_classes/app/main.rb @@ -0,0 +1,56 @@ +# Sprites represented as Classes using the queue ~args.outputs.static_sprites~. +# bypasses the queue behavior of ~args.outputs.sprites~. All instances are held +# by reference. You get better performance, but you are mutating state of held objects +# which is less functional/data oriented. +class Star + attr_sprite + + def initialize grid + @grid = grid + @x = (rand @grid.w) * -1 + @y = (rand @grid.h) * -1 + @w = 4 + @h = 4 + @s = 1 + (4.randomize :ratio) + @path = 'sprites/tiny-star.png' + end + + def move + @x += @s + @y += @s + @x = (rand @grid.w) * -1 if @x > @grid.right + @y = (rand @grid.h) * -1 if @y > @grid.top + end +end + +# calls methods needed for game to run properly +def tick args + # sets console command when sample app initially opens + if Kernel.global_tick_count == 0 + puts "" + puts "" + puts "=========================================================" + puts "* INFO: Static Sprites, Classes" + puts "* INFO: Please specify the number of sprites to render." + args.gtk.console.set_command "reset_with count: 100" + end + + # init + if args.state.tick_count == 0 + args.state.stars = args.state.star_count.map { |i| Star.new args.grid } + args.outputs.static_sprites << args.state.stars + end + + # update + args.state.stars.each(&:move) + + # render + args.outputs.background_color = [0, 0, 0] + args.outputs.primitives << args.gtk.current_framerate_primitives +end + +# resets game, and assigns star count given by user +def reset_with count: count + $gtk.reset + $gtk.args.state.star_count = count +end diff --git a/samples/09_performance/06_static_sprites_as_classes/license-for-sample.txt b/samples/09_performance/06_static_sprites_as_classes/license-for-sample.txt new file mode 100644 index 0000000..100dcec --- /dev/null +++ b/samples/09_performance/06_static_sprites_as_classes/license-for-sample.txt @@ -0,0 +1,9 @@ +Copyright 2019 DragonRuby LLC + +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/09_performance/06_static_sprites_as_classes/sprites/tiny-star.png b/samples/09_performance/06_static_sprites_as_classes/sprites/tiny-star.png new file mode 100644 index 0000000..e04786a Binary files /dev/null and b/samples/09_performance/06_static_sprites_as_classes/sprites/tiny-star.png differ diff --git a/samples/09_performance/07_static_sprites_as_classes_with_custom_drawing/app/main.rb b/samples/09_performance/07_static_sprites_as_classes_with_custom_drawing/app/main.rb new file mode 100644 index 0000000..3291f5e --- /dev/null +++ b/samples/09_performance/07_static_sprites_as_classes_with_custom_drawing/app/main.rb @@ -0,0 +1,88 @@ +# Sprites represented as Classes, with a draw_override method, and using the queue ~args.outputs.static_sprites~. +# is the fastest approach. This is comparable to what other game engines set as the default behavior. +# There are tradeoffs for all this speed if the creation of a full blown class, and bypassing +# functional/data-oriented practices. +class Star + def initialize grid + @grid = grid + @x = (rand @grid.w) * -1 + @y = (rand @grid.h) * -1 + @w = 4 + @h = 4 + @s = 1 + (4.randomize :ratio) + @path = 'sprites/tiny-star.png' + end + + def move + @x += @s + @y += @s + @x = (rand @grid.w) * -1 if @x > @grid.right + @y = (rand @grid.h) * -1 if @y > @grid.top + end + + # if the object that is in args.outputs.sprites (or static_sprites) + # respond_to? :draw_override, then the method is invoked giving you + # access to the class used to draw to the canvas. + def draw_override ffi_draw + # first move then draw + move + + # The argument order for ffi.draw_sprite is: + # x, y, w, h, path + ffi_draw.draw_sprite @x, @y, @w, @h, @path + + # The argument order for ffi_draw.draw_sprite_2 is (pass in nil for default value): + # x, y, w, h, path, + # angle, alpha + + # The argument order for ffi_draw.draw_sprite_3 is: + # x, y, w, h, + # path, + # angle, + # alpha, red_saturation, green_saturation, blue_saturation + # tile_x, tile_y, tile_w, tile_h, + # flip_horizontally, flip_vertically, + # angle_anchor_x, angle_anchor_y, + # source_x, source_y, source_w, source_h + + # The argument order for ffi_draw.draw_sprite_4 is: + # x, y, w, h, + # path, + # angle, + # alpha, red_saturation, green_saturation, blue_saturation + # tile_x, tile_y, tile_w, tile_h, + # flip_horizontally, flip_vertically, + # angle_anchor_x, angle_anchor_y, + # source_x, source_y, source_w, source_h, + # blendmode_enum + end +end + +# calls methods needed for game to run properly +def tick args + # sets console command when sample app initially opens + if Kernel.global_tick_count == 0 + puts "" + puts "" + puts "=========================================================" + puts "* INFO: Static Sprites, Classes, Draw Override" + puts "* INFO: Please specify the number of sprites to render." + args.gtk.console.set_command "reset_with count: 100" + end + + # init + if args.state.tick_count == 0 + args.state.stars = args.state.star_count.map { |i| Star.new args.grid } + args.outputs.static_sprites << args.state.stars + end + + # render framerate + args.outputs.background_color = [0, 0, 0] + args.outputs.primitives << args.gtk.current_framerate_primitives +end + +# resets game, and assigns star count given by user +def reset_with count: count + $gtk.reset + $gtk.args.state.star_count = count +end diff --git a/samples/09_performance/07_static_sprites_as_classes_with_custom_drawing/license-for-sample.txt b/samples/09_performance/07_static_sprites_as_classes_with_custom_drawing/license-for-sample.txt new file mode 100644 index 0000000..100dcec --- /dev/null +++ b/samples/09_performance/07_static_sprites_as_classes_with_custom_drawing/license-for-sample.txt @@ -0,0 +1,9 @@ +Copyright 2019 DragonRuby LLC + +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/09_performance/07_static_sprites_as_classes_with_custom_drawing/sprites/tiny-star.png b/samples/09_performance/07_static_sprites_as_classes_with_custom_drawing/sprites/tiny-star.png new file mode 100644 index 0000000..e04786a Binary files /dev/null and b/samples/09_performance/07_static_sprites_as_classes_with_custom_drawing/sprites/tiny-star.png differ diff --git a/samples/09_performance/08_collision_limits/app/main.rb b/samples/09_performance/08_collision_limits/app/main.rb new file mode 100644 index 0000000..01ad308 --- /dev/null +++ b/samples/09_performance/08_collision_limits/app/main.rb @@ -0,0 +1,55 @@ +=begin + + Reminders: + - find_all: Finds all elements of a collection that meet certain requirements. + In this sample app, we're finding all bodies that intersect with the center body. + + - args.outputs.solids: An array. The values generate a solid. + The parameters are [X, Y, WIDTH, HEIGHT, RED, GREEN, BLUE] + For more information about solids, go to mygame/documentation/03-solids-and-borders.md. + + - args.outputs.labels: An array. The values generate a label. + The parameters are [X, Y, TEXT, SIZE, ALIGNMENT, RED, GREEN, BLUE, ALPHA, FONT STYLE] + For more information about labels, go to mygame/documentation/02-labels.md. + + - ARRAY#intersect_rect?: Returns true or false depending on if two rectangles intersect. + +=end + +# This code demonstrates moving objects that loop around once they exceed the scope of the screen, +# which has dimensions of 1280 by 720, and also detects collisions between objects called "bodies". + +def body_count num + $gtk.args.state.other_bodies = num.map { [1280 * rand, 720 * rand, 10, 10] } # other_bodies set using num collection +end + +def tick args + + # Center body's values are set using an array + # Map is used to set values of 2000 other bodies + # All bodies that intersect with center body are stored in collisions collection + args.state.center_body ||= [640 - 100, 360 - 100, 200, 200] # calculations done to place body in center + args.state.other_bodies ||= 2000.map { [1280 * rand, 720 * rand, 10, 10] } # 2000 bodies given random position on screen + + # finds all bodies that intersect with center body, stores them in collisions + collisions = args.state.other_bodies.find_all { |b| b.intersect_rect? args.state.center_body } + + args.borders << args.state.center_body # outputs center body as a black border + + # transparency changes based on number of collisions; the more collisions, the redder (more transparent) the box becomes + args.solids << [args.state.center_body, 255, 0, 0, collisions.length * 5] # center body is red solid + args.solids << args.state.other_bodies # other bodies are output as (black) solids, as well + + args.labels << [10, 30, args.gtk.current_framerate] # outputs frame rate in bottom left corner + + # Bodies are returned to bottom left corner if positions exceed scope of screen + args.state.other_bodies.each do |b| # for each body in the other_bodies collection + b.x += 5 # x and y are both incremented by 5 + b.y += 5 + b.x = 0 if b.x > 1280 # x becomes 0 if star exceeds scope of screen (goes too far right) + b.y = 0 if b.y > 720 # y becomes 0 if star exceeds scope of screen (goes too far up) + end +end + +# Resets the game. +$gtk.reset diff --git a/samples/09_performance/08_collision_limits/license-for-sample.txt b/samples/09_performance/08_collision_limits/license-for-sample.txt new file mode 100644 index 0000000..100dcec --- /dev/null +++ b/samples/09_performance/08_collision_limits/license-for-sample.txt @@ -0,0 +1,9 @@ +Copyright 2019 DragonRuby LLC + +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/10_advanced_debugging/00_logging/app/main.rb b/samples/10_advanced_debugging/00_logging/app/main.rb new file mode 100644 index 0000000..f97b9d8 --- /dev/null +++ b/samples/10_advanced_debugging/00_logging/app/main.rb @@ -0,0 +1,19 @@ +def tick args + args.outputs.background_color = [255, 255, 255, 0] + if args.state.tick_count == 0 + args.gtk.log_spam "log level spam" + args.gtk.log_debug "log level debug" + args.gtk.log_info "log level info" + args.gtk.log_warn "log level warn" + args.gtk.log_error "log level error" + args.gtk.log_unfiltered "log level unfiltered" + puts "This is a puts call" + args.gtk.console.show + end + + if args.state.tick_count == 60 + puts "This is a puts call on tick 60" + elsif args.state.tick_count == 120 + puts "This is a puts call on tick 120" + end +end diff --git a/samples/11_http/01_retrieve_images/app/main.rb b/samples/11_http/01_retrieve_images/app/main.rb index 53ece84..2a6a294 100644 --- a/samples/11_http/01_retrieve_images/app/main.rb +++ b/samples/11_http/01_retrieve_images/app/main.rb @@ -1,8 +1,10 @@ +$gtk.register_cvar 'app.warn_seconds', "seconds to wait before starting", :uint, 11 + def tick args args.outputs.background_color = [0, 0, 0] # Show a warning at the start. - args.state.warning_debounce ||= 11 * 60 + args.state.warning_debounce ||= args.cvars['app.warn_seconds'].value * 60 if args.state.warning_debounce > 0 args.state.warning_debounce -= 1 args.outputs.labels << [640, 600, "This app shows random images from the Internet.", 10, 1, 255, 255, 255] diff --git a/samples/11_http/02_in_game_web_server_http_get/app/main.rb b/samples/11_http/02_in_game_web_server_http_get/app/main.rb new file mode 100644 index 0000000..7fd67f7 --- /dev/null +++ b/samples/11_http/02_in_game_web_server_http_get/app/main.rb @@ -0,0 +1,28 @@ +def tick args + args.state.port ||= 3000 + args.state.reqnum ||= 0 + # by default the embedded webserver runs on port 9001 (the port number is over 9000) and is disabled in a production build + # to enable the http server in a production build, you need to manually start + # the server up: + args.gtk.start_server! port: args.state.port, enable_in_prod: true + args.outputs.background_color = [0, 0, 0] + args.outputs.labels << [640, 600, "Point your web browser at http://localhost:#{args.state.port}/", 10, 1, 255, 255, 255] + + args.inputs.http_requests.each { |req| + puts("METHOD: #{req.method}"); + puts("URI: #{req.uri}"); + puts("HEADERS:"); + req.headers.each { |k,v| puts(" #{k}: #{v}") } + + if (req.uri == '/') + # headers and body can be nil if you don't care about them. + # If you don't set the Content-Type, it will default to + # "text/html; charset=utf-8". + # Don't set Content-Length; we'll ignore it and calculate it for you + args.state.reqnum += 1 + req.respond 200, "hello

    This #{req.method} was request number #{args.state.reqnum}!

    \n", { 'X-DRGTK-header' => 'Powered by DragonRuby!' } + else + req.reject + end + } +end diff --git a/samples/11_http/02_in_game_web_server_http_get/license-for-sample.txt b/samples/11_http/02_in_game_web_server_http_get/license-for-sample.txt new file mode 100644 index 0000000..175ac25 --- /dev/null +++ b/samples/11_http/02_in_game_web_server_http_get/license-for-sample.txt @@ -0,0 +1,9 @@ +Copyright 2021 DragonRuby LLC + +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/11_http/03_in_game_web_server_http_post/app/main.rb b/samples/11_http/03_in_game_web_server_http_post/app/main.rb new file mode 100644 index 0000000..8116358 --- /dev/null +++ b/samples/11_http/03_in_game_web_server_http_post/app/main.rb @@ -0,0 +1,72 @@ +def tick args + # defaults + args.state.post_button = args.layout.rect(row: 0, col: 0, w: 5, h: 1).merge(text: "execute http_post") + args.state.post_body_button = args.layout.rect(row: 1, col: 0, w: 5, h: 1).merge(text: "execute http_post_body") + args.state.request_to_s ||= "" + args.state.request_body ||= "" + + # render + args.state.post_button.yield_self do |b| + args.outputs.borders << b + args.outputs.labels << b.merge(text: b.text, + y: b.y + 30, + x: b.x + 10) + end + + args.state.post_body_button.yield_self do |b| + args.outputs.borders << b + args.outputs.labels << b.merge(text: b.text, + y: b.y + 30, + x: b.x + 10) + end + + draw_label args, 0, 6, "Request:", args.state.request_to_s + draw_label args, 0, 14, "Request Body Unaltered:", args.state.request_body + + # input + if args.inputs.mouse.click + # ============= HTTP_POST ============= + if (args.inputs.mouse.inside_rect? args.state.post_button) + # ========= DATA TO SEND =========== + form_fields = { "userId" => "#{Time.now.to_i}" } + # ================================== + + args.gtk.http_post "http://localhost:9001/testing", + form_fields, + ["Content-Type: application/x-www-form-urlencoded"] + + args.gtk.notify! "http_post" + end + + # ============= HTTP_POST_BODY ============= + if (args.inputs.mouse.inside_rect? args.state.post_body_button) + # =========== DATA TO SEND ============== + json = "{ \"userId\": \"#{Time.now.to_i}\"}" + # ================================== + + args.gtk.http_post_body "http://localhost:9001/testing", + json, + ["Content-Type: application/json", "Content-Length: #{json.length}"] + + args.gtk.notify! "http_post_body" + end + end + + # calc + args.inputs.http_requests.each do |r| + puts "#{r}" + if r.uri == "/testing" + puts r + args.state.request_to_s = "#{r}" + args.state.request_body = r.raw_body + r.respond 200, "ok" + end + end +end + +def draw_label args, row, col, header, text + label_pos = args.layout.rect(row: row, col: col, w: 0, h: 0) + args.outputs.labels << "#{header}\n\n#{text}".wrapped_lines(80).map_with_index do |l, i| + { x: label_pos.x, y: label_pos.y - (i * 15), text: l, size_enum: -2 } + end +end diff --git a/samples/11_http/03_in_game_web_server_http_post/replay.txt b/samples/11_http/03_in_game_web_server_http_post/replay.txt new file mode 100644 index 0000000..527f46d --- /dev/null +++ b/samples/11_http/03_in_game_web_server_http_post/replay.txt @@ -0,0 +1,415 @@ +replay_version 2.0 +stopped_at 680 +seed 100 +recorded_at 2021-11-20 11:16:26 -0600 +[:mouse_button_up, 1, 0, 1, 1, 3] +[:mouse_move, 782, 90, 2, 2, 12] +[:mouse_move, 780, 90, 2, 3, 13] +[:mouse_move, 771, 90, 2, 4, 14] +[:mouse_move, 759, 90, 2, 5, 15] +[:mouse_move, 739, 90, 2, 6, 16] +[:mouse_move, 703, 90, 2, 7, 17] +[:mouse_move, 681, 94, 2, 8, 18] +[:mouse_move, 657, 95, 2, 9, 19] +[:mouse_move, 631, 99, 2, 10, 20] +[:mouse_move, 599, 99, 2, 11, 21] +[:mouse_move, 560, 99, 2, 12, 22] +[:mouse_move, 518, 97, 2, 13, 23] +[:mouse_move, 476, 92, 2, 14, 24] +[:mouse_move, 435, 90, 2, 15, 25] +[:mouse_move, 391, 90, 2, 16, 26] +[:mouse_move, 345, 90, 2, 17, 27] +[:mouse_move, 304, 90, 2, 18, 28] +[:mouse_move, 254, 90, 2, 19, 29] +[:mouse_move, 230, 90, 2, 20, 30] +[:mouse_move, 213, 90, 2, 21, 31] +[:mouse_move, 207, 90, 2, 22, 32] +[:mouse_move, 207, 89, 2, 23, 34] +[:mouse_move, 207, 87, 2, 24, 35] +[:mouse_move, 209, 84, 2, 25, 36] +[:mouse_move, 210, 82, 2, 26, 37] +[:mouse_move, 211, 82, 2, 27, 38] +[:mouse_move, 211, 81, 2, 28, 40] +[:mouse_move, 212, 80, 2, 29, 41] +[:mouse_move, 212, 79, 2, 30, 42] +[:mouse_button_pressed, 1, 0, 1, 31, 89] +[:mouse_button_up, 1, 0, 1, 32, 93] +[:mouse_move, 212, 83, 2, 33, 151] +[:mouse_move, 216, 104, 2, 34, 152] +[:mouse_move, 229, 135, 2, 35, 153] +[:mouse_move, 242, 168, 2, 36, 154] +[:mouse_move, 250, 197, 2, 37, 155] +[:mouse_move, 254, 218, 2, 38, 156] +[:mouse_move, 264, 240, 2, 39, 157] +[:mouse_move, 274, 266, 2, 40, 158] +[:mouse_move, 285, 293, 2, 41, 159] +[:mouse_move, 295, 316, 2, 42, 160] +[:mouse_move, 304, 345, 2, 43, 161] +[:mouse_move, 308, 358, 2, 44, 162] +[:mouse_move, 316, 381, 2, 45, 163] +[:mouse_move, 328, 408, 2, 46, 164] +[:mouse_move, 333, 431, 2, 47, 165] +[:mouse_move, 336, 447, 2, 48, 166] +[:mouse_move, 337, 455, 2, 49, 167] +[:mouse_move, 337, 459, 2, 50, 168] +[:mouse_move, 336, 459, 2, 51, 175] +[:mouse_move, 336, 460, 2, 52, 177] +[:mouse_move, 336, 461, 2, 53, 178] +[:mouse_move, 334, 462, 2, 54, 179] +[:mouse_move, 331, 462, 2, 55, 180] +[:mouse_move, 328, 462, 2, 56, 181] +[:mouse_move, 323, 462, 2, 57, 182] +[:mouse_move, 318, 455, 2, 58, 183] +[:mouse_move, 310, 438, 2, 59, 184] +[:mouse_move, 306, 414, 2, 60, 185] +[:mouse_move, 306, 405, 2, 61, 186] +[:mouse_move, 307, 402, 2, 62, 187] +[:mouse_move, 310, 395, 2, 63, 188] +[:mouse_move, 318, 384, 2, 64, 189] +[:mouse_move, 327, 374, 2, 65, 190] +[:mouse_move, 338, 364, 2, 66, 191] +[:mouse_move, 351, 355, 2, 67, 192] +[:mouse_move, 367, 347, 2, 68, 193] +[:mouse_move, 385, 340, 2, 69, 194] +[:mouse_move, 406, 335, 2, 70, 195] +[:mouse_move, 431, 330, 2, 71, 196] +[:mouse_move, 471, 330, 2, 72, 197] +[:mouse_move, 491, 335, 2, 73, 198] +[:mouse_move, 505, 339, 2, 74, 199] +[:mouse_move, 514, 342, 2, 75, 200] +[:mouse_move, 520, 346, 2, 76, 201] +[:mouse_move, 526, 352, 2, 77, 202] +[:mouse_move, 530, 363, 2, 78, 203] +[:mouse_move, 530, 378, 2, 79, 204] +[:mouse_move, 530, 396, 2, 80, 205] +[:mouse_move, 530, 415, 2, 81, 206] +[:mouse_move, 524, 434, 2, 82, 207] +[:mouse_move, 517, 446, 2, 83, 208] +[:mouse_move, 509, 458, 2, 84, 209] +[:mouse_move, 503, 466, 2, 85, 210] +[:mouse_move, 499, 472, 2, 86, 211] +[:mouse_move, 496, 478, 2, 87, 212] +[:mouse_move, 493, 486, 2, 88, 213] +[:mouse_move, 488, 493, 2, 89, 214] +[:mouse_move, 476, 501, 2, 90, 215] +[:mouse_move, 465, 509, 2, 91, 216] +[:mouse_move, 453, 515, 2, 92, 217] +[:mouse_move, 441, 521, 2, 93, 218] +[:mouse_move, 426, 524, 2, 94, 219] +[:mouse_move, 410, 524, 2, 95, 220] +[:mouse_move, 391, 527, 2, 96, 221] +[:mouse_move, 379, 527, 2, 97, 222] +[:mouse_move, 368, 527, 2, 98, 223] +[:mouse_move, 360, 528, 2, 99, 224] +[:mouse_move, 359, 528, 2, 100, 225] +[:mouse_move, 358, 528, 2, 101, 226] +[:mouse_move, 364, 529, 2, 102, 232] +[:mouse_move, 387, 533, 2, 103, 233] +[:mouse_move, 410, 535, 2, 104, 234] +[:mouse_move, 434, 535, 2, 105, 235] +[:mouse_move, 468, 535, 2, 106, 236] +[:mouse_move, 506, 535, 2, 107, 237] +[:mouse_move, 546, 535, 2, 108, 238] +[:mouse_move, 582, 535, 2, 109, 239] +[:mouse_move, 614, 531, 2, 110, 240] +[:mouse_move, 647, 521, 2, 111, 241] +[:mouse_move, 679, 510, 2, 112, 242] +[:mouse_move, 705, 496, 2, 113, 243] +[:mouse_move, 722, 479, 2, 114, 244] +[:mouse_move, 727, 447, 2, 115, 245] +[:mouse_move, 715, 426, 2, 116, 246] +[:mouse_move, 692, 401, 2, 117, 247] +[:mouse_move, 665, 382, 2, 118, 248] +[:mouse_move, 641, 371, 2, 119, 249] +[:mouse_move, 601, 361, 2, 120, 250] +[:mouse_move, 582, 358, 2, 121, 251] +[:mouse_move, 510, 350, 2, 122, 252] +[:mouse_move, 486, 350, 2, 123, 253] +[:mouse_move, 439, 350, 2, 124, 254] +[:mouse_move, 395, 350, 2, 125, 255] +[:mouse_move, 362, 355, 2, 126, 256] +[:mouse_move, 322, 370, 2, 127, 257] +[:mouse_move, 306, 380, 2, 128, 258] +[:mouse_move, 298, 395, 2, 129, 259] +[:mouse_move, 296, 420, 2, 130, 260] +[:mouse_move, 303, 439, 2, 131, 261] +[:mouse_move, 310, 450, 2, 132, 262] +[:mouse_move, 345, 476, 2, 133, 263] +[:mouse_move, 376, 489, 2, 134, 264] +[:mouse_move, 408, 495, 2, 135, 265] +[:mouse_move, 447, 498, 2, 136, 266] +[:mouse_move, 487, 498, 2, 137, 267] +[:mouse_move, 526, 492, 2, 138, 268] +[:mouse_move, 588, 476, 2, 139, 269] +[:mouse_move, 630, 455, 2, 140, 270] +[:mouse_move, 682, 424, 2, 141, 271] +[:mouse_move, 733, 384, 2, 142, 272] +[:mouse_move, 774, 341, 2, 143, 273] +[:mouse_move, 811, 302, 2, 144, 274] +[:mouse_move, 825, 270, 2, 145, 275] +[:mouse_move, 828, 240, 2, 146, 276] +[:mouse_move, 824, 211, 2, 147, 277] +[:mouse_move, 810, 185, 2, 148, 278] +[:mouse_move, 799, 170, 2, 149, 279] +[:mouse_move, 793, 165, 2, 150, 280] +[:mouse_move, 787, 162, 2, 151, 281] +[:mouse_move, 779, 158, 2, 152, 282] +[:mouse_move, 768, 154, 2, 153, 283] +[:mouse_move, 759, 151, 2, 154, 284] +[:mouse_move, 757, 150, 2, 155, 285] +[:mouse_move, 757, 151, 2, 156, 288] +[:mouse_move, 765, 159, 2, 157, 289] +[:mouse_move, 775, 168, 2, 158, 290] +[:mouse_move, 790, 172, 2, 159, 291] +[:mouse_move, 812, 177, 2, 160, 292] +[:mouse_move, 859, 180, 2, 161, 293] +[:mouse_move, 902, 180, 2, 162, 294] +[:mouse_move, 944, 178, 2, 163, 295] +[:mouse_move, 985, 172, 2, 164, 296] +[:mouse_move, 1025, 163, 2, 165, 297] +[:mouse_move, 1053, 152, 2, 166, 298] +[:mouse_move, 1075, 142, 2, 167, 299] +[:mouse_move, 1090, 131, 2, 168, 300] +[:mouse_move, 1096, 121, 2, 169, 301] +[:mouse_move, 1096, 110, 2, 170, 302] +[:mouse_move, 1088, 96, 2, 171, 303] +[:mouse_move, 1065, 77, 2, 172, 304] +[:mouse_move, 1030, 58, 2, 173, 305] +[:mouse_move, 1014, 54, 2, 174, 306] +[:mouse_move, 999, 50, 2, 175, 307] +[:mouse_move, 978, 45, 2, 176, 308] +[:mouse_move, 951, 41, 2, 177, 309] +[:mouse_move, 912, 36, 2, 178, 310] +[:mouse_move, 870, 33, 2, 179, 311] +[:mouse_move, 833, 33, 2, 180, 312] +[:mouse_move, 809, 39, 2, 181, 313] +[:mouse_move, 793, 45, 2, 182, 314] +[:mouse_move, 782, 51, 2, 183, 315] +[:mouse_move, 777, 55, 2, 184, 316] +[:mouse_move, 776, 70, 2, 185, 317] +[:mouse_move, 784, 90, 2, 186, 318] +[:mouse_move, 802, 114, 2, 187, 319] +[:mouse_move, 827, 138, 2, 188, 320] +[:mouse_move, 865, 156, 2, 189, 321] +[:mouse_move, 905, 168, 2, 190, 322] +[:mouse_move, 942, 171, 2, 191, 323] +[:mouse_move, 972, 171, 2, 192, 324] +[:mouse_move, 992, 167, 2, 193, 325] +[:mouse_move, 1000, 157, 2, 194, 326] +[:mouse_move, 1000, 140, 2, 195, 327] +[:mouse_move, 982, 117, 2, 196, 328] +[:mouse_move, 958, 99, 2, 197, 329] +[:mouse_move, 903, 81, 2, 198, 330] +[:mouse_move, 880, 75, 2, 199, 331] +[:mouse_move, 763, 60, 2, 200, 332] +[:mouse_move, 716, 58, 2, 201, 333] +[:mouse_move, 604, 58, 2, 202, 334] +[:mouse_move, 440, 65, 2, 203, 335] +[:mouse_move, 355, 82, 2, 204, 336] +[:mouse_move, 282, 95, 2, 205, 337] +[:mouse_move, 221, 103, 2, 206, 338] +[:mouse_move, 179, 109, 2, 207, 339] +[:mouse_move, 146, 109, 2, 208, 340] +[:mouse_move, 128, 109, 2, 209, 341] +[:mouse_move, 116, 109, 2, 210, 342] +[:mouse_move, 112, 108, 2, 211, 343] +[:mouse_move, 115, 111, 2, 212, 349] +[:mouse_move, 117, 113, 2, 213, 350] +[:mouse_move, 118, 115, 2, 214, 351] +[:mouse_move, 118, 116, 2, 215, 352] +[:mouse_move, 119, 117, 2, 216, 353] +[:mouse_move, 123, 119, 2, 217, 354] +[:mouse_move, 127, 120, 2, 218, 355] +[:mouse_move, 128, 120, 2, 219, 356] +[:mouse_button_pressed, 1, 0, 1, 220, 369] +[:mouse_button_up, 1, 0, 1, 221, 372] +[:mouse_move, 131, 121, 2, 222, 399] +[:mouse_move, 147, 128, 2, 223, 400] +[:mouse_move, 165, 133, 2, 224, 401] +[:mouse_move, 186, 138, 2, 225, 402] +[:mouse_move, 210, 145, 2, 226, 403] +[:mouse_move, 231, 151, 2, 227, 404] +[:mouse_move, 252, 160, 2, 228, 405] +[:mouse_move, 276, 176, 2, 229, 406] +[:mouse_move, 304, 197, 2, 230, 407] +[:mouse_move, 332, 224, 2, 231, 408] +[:mouse_move, 352, 261, 2, 232, 409] +[:mouse_move, 360, 293, 2, 233, 410] +[:mouse_move, 365, 322, 2, 234, 411] +[:mouse_move, 366, 351, 2, 235, 412] +[:mouse_move, 358, 385, 2, 236, 413] +[:mouse_move, 344, 403, 2, 237, 414] +[:mouse_move, 331, 412, 2, 238, 415] +[:mouse_move, 318, 417, 2, 239, 416] +[:mouse_move, 307, 420, 2, 240, 417] +[:mouse_move, 303, 422, 2, 241, 418] +[:mouse_move, 302, 422, 2, 242, 419] +[:mouse_move, 301, 422, 2, 243, 421] +[:mouse_move, 298, 418, 2, 244, 422] +[:mouse_move, 295, 410, 2, 245, 423] +[:mouse_move, 295, 407, 2, 246, 424] +[:mouse_move, 293, 403, 2, 247, 425] +[:mouse_move, 293, 399, 2, 248, 426] +[:mouse_move, 293, 396, 2, 249, 427] +[:mouse_move, 294, 391, 2, 250, 428] +[:mouse_move, 300, 380, 2, 251, 429] +[:mouse_move, 306, 370, 2, 252, 430] +[:mouse_move, 315, 361, 2, 253, 431] +[:mouse_move, 318, 360, 2, 254, 432] +[:mouse_move, 319, 360, 2, 255, 433] +[:mouse_move, 321, 362, 2, 256, 434] +[:mouse_move, 321, 363, 2, 257, 435] +[:mouse_move, 322, 364, 2, 258, 439] +[:mouse_move, 333, 367, 2, 259, 440] +[:mouse_move, 357, 372, 2, 260, 441] +[:mouse_move, 387, 375, 2, 261, 442] +[:mouse_move, 426, 380, 2, 262, 443] +[:mouse_move, 468, 387, 2, 263, 444] +[:mouse_move, 506, 389, 2, 264, 445] +[:mouse_move, 539, 389, 2, 265, 446] +[:mouse_move, 570, 387, 2, 266, 447] +[:mouse_move, 593, 381, 2, 267, 448] +[:mouse_move, 614, 376, 2, 268, 449] +[:mouse_move, 622, 376, 2, 269, 450] +[:mouse_move, 626, 377, 2, 270, 451] +[:mouse_move, 628, 379, 2, 271, 452] +[:mouse_move, 628, 382, 2, 272, 453] +[:mouse_move, 627, 388, 2, 273, 454] +[:mouse_move, 621, 400, 2, 274, 455] +[:mouse_move, 609, 411, 2, 275, 456] +[:mouse_move, 594, 422, 2, 276, 457] +[:mouse_move, 573, 429, 2, 277, 458] +[:mouse_move, 551, 433, 2, 278, 459] +[:mouse_move, 523, 437, 2, 279, 460] +[:mouse_move, 481, 440, 2, 280, 461] +[:mouse_move, 453, 439, 2, 281, 462] +[:mouse_move, 425, 432, 2, 282, 463] +[:mouse_move, 393, 423, 2, 283, 464] +[:mouse_move, 368, 416, 2, 284, 465] +[:mouse_move, 353, 415, 2, 285, 466] +[:mouse_move, 343, 413, 2, 286, 467] +[:mouse_move, 337, 409, 2, 287, 468] +[:mouse_move, 332, 405, 2, 288, 469] +[:mouse_move, 327, 395, 2, 289, 470] +[:mouse_move, 324, 382, 2, 290, 471] +[:mouse_move, 324, 375, 2, 291, 472] +[:mouse_move, 336, 367, 2, 292, 473] +[:mouse_move, 351, 361, 2, 293, 474] +[:mouse_move, 369, 357, 2, 294, 475] +[:mouse_move, 388, 356, 2, 295, 476] +[:mouse_move, 405, 353, 2, 296, 477] +[:mouse_move, 423, 352, 2, 297, 478] +[:mouse_move, 441, 355, 2, 298, 479] +[:mouse_move, 464, 367, 2, 299, 480] +[:mouse_move, 482, 380, 2, 300, 481] +[:mouse_move, 494, 395, 2, 301, 482] +[:mouse_move, 496, 405, 2, 302, 483] +[:mouse_move, 491, 413, 2, 303, 484] +[:mouse_move, 467, 428, 2, 304, 485] +[:mouse_move, 447, 439, 2, 305, 486] +[:mouse_move, 427, 447, 2, 306, 487] +[:mouse_move, 407, 450, 2, 307, 488] +[:mouse_move, 385, 450, 2, 308, 489] +[:mouse_move, 361, 449, 2, 309, 490] +[:mouse_move, 345, 447, 2, 310, 491] +[:mouse_move, 332, 441, 2, 311, 492] +[:mouse_move, 321, 434, 2, 312, 493] +[:mouse_move, 312, 424, 2, 313, 494] +[:mouse_move, 307, 412, 2, 314, 495] +[:mouse_move, 306, 401, 2, 315, 496] +[:mouse_move, 310, 384, 2, 316, 497] +[:mouse_move, 322, 369, 2, 317, 498] +[:mouse_move, 346, 357, 2, 318, 499] +[:mouse_move, 388, 346, 2, 319, 500] +[:mouse_move, 434, 332, 2, 320, 501] +[:mouse_move, 500, 314, 2, 321, 502] +[:mouse_move, 564, 295, 2, 322, 503] +[:mouse_move, 630, 276, 2, 323, 504] +[:mouse_move, 676, 262, 2, 324, 505] +[:mouse_move, 716, 248, 2, 325, 506] +[:mouse_move, 753, 232, 2, 326, 507] +[:mouse_move, 785, 217, 2, 327, 508] +[:mouse_move, 820, 194, 2, 328, 509] +[:mouse_move, 831, 186, 2, 329, 510] +[:mouse_move, 832, 185, 2, 330, 511] +[:mouse_move, 833, 184, 2, 331, 512] +[:mouse_move, 834, 186, 2, 332, 518] +[:mouse_move, 835, 189, 2, 333, 519] +[:mouse_move, 833, 190, 2, 334, 521] +[:mouse_move, 821, 188, 2, 335, 522] +[:mouse_move, 793, 174, 2, 336, 523] +[:mouse_move, 753, 152, 2, 337, 524] +[:mouse_move, 725, 132, 2, 338, 525] +[:mouse_move, 715, 117, 2, 339, 526] +[:mouse_move, 710, 93, 2, 340, 527] +[:mouse_move, 709, 69, 2, 341, 528] +[:mouse_move, 713, 47, 2, 342, 529] +[:mouse_move, 730, 29, 2, 343, 530] +[:mouse_move, 763, 18, 2, 344, 531] +[:mouse_move, 812, 16, 2, 345, 532] +[:mouse_move, 894, 24, 2, 346, 533] +[:mouse_move, 965, 43, 2, 347, 534] +[:mouse_move, 1015, 64, 2, 348, 535] +[:mouse_move, 1049, 80, 2, 349, 536] +[:mouse_move, 1070, 97, 2, 350, 537] +[:mouse_move, 1079, 114, 2, 351, 538] +[:mouse_move, 1079, 126, 2, 352, 539] +[:mouse_move, 1071, 139, 2, 353, 540] +[:mouse_move, 1052, 147, 2, 354, 541] +[:mouse_move, 1026, 151, 2, 355, 542] +[:mouse_move, 986, 152, 2, 356, 543] +[:mouse_move, 937, 152, 2, 357, 544] +[:mouse_move, 835, 143, 2, 358, 545] +[:mouse_move, 768, 125, 2, 359, 546] +[:mouse_move, 711, 105, 2, 360, 547] +[:mouse_move, 667, 86, 2, 361, 548] +[:mouse_move, 639, 74, 2, 362, 549] +[:mouse_move, 630, 69, 2, 363, 550] +[:mouse_move, 630, 64, 2, 364, 551] +[:mouse_move, 638, 53, 2, 365, 552] +[:mouse_move, 659, 41, 2, 366, 553] +[:mouse_move, 688, 33, 2, 367, 554] +[:mouse_move, 723, 23, 2, 368, 555] +[:mouse_move, 759, 19, 2, 369, 556] +[:mouse_move, 810, 19, 2, 370, 557] +[:mouse_move, 840, 25, 2, 371, 558] +[:mouse_move, 866, 37, 2, 372, 559] +[:mouse_move, 878, 47, 2, 373, 560] +[:mouse_move, 878, 57, 2, 374, 561] +[:mouse_move, 866, 69, 2, 375, 562] +[:mouse_move, 835, 76, 2, 376, 563] +[:mouse_move, 783, 77, 2, 377, 564] +[:mouse_move, 722, 77, 2, 378, 565] +[:mouse_move, 652, 77, 2, 379, 566] +[:mouse_move, 559, 67, 2, 380, 567] +[:mouse_move, 445, 36, 2, 381, 568] +[:mouse_move, 274, 0, 2, 382, 569] +[:mouse_move, 110, 0, 2, 383, 598] +[:mouse_move, 131, 5, 2, 384, 599] +[:mouse_move, 162, 14, 2, 385, 600] +[:mouse_move, 201, 24, 2, 386, 601] +[:mouse_move, 244, 32, 2, 387, 602] +[:key_down_raw, 96, 0, 2, 388, 602] +[:mouse_move, 288, 38, 2, 389, 603] +[:mouse_move, 338, 46, 2, 390, 604] +[:mouse_move, 422, 70, 2, 391, 605] +[:mouse_move, 490, 90, 2, 392, 606] +[:mouse_move, 553, 113, 2, 393, 607] +[:key_up_raw, 96, 0, 2, 394, 608] +[:mouse_move, 600, 129, 2, 395, 608] +[:mouse_move, 638, 146, 2, 396, 609] +[:mouse_move, 663, 159, 2, 397, 610] +[:mouse_move, 686, 168, 2, 398, 611] +[:mouse_move, 708, 177, 2, 399, 612] +[:mouse_move, 725, 184, 2, 400, 613] +[:mouse_move, 733, 189, 2, 401, 614] +[:mouse_move, 735, 189, 2, 402, 615] +[:mouse_move, 729, 189, 2, 403, 616] +[:mouse_move, 704, 185, 2, 404, 617] +[:mouse_move, 721, 189, 2, 405, 628] +[:mouse_move, 744, 191, 2, 406, 629] +[:mouse_move, 745, 191, 2, 407, 630] +[:mouse_move, 744, 191, 2, 408, 637] +[:mouse_move, 743, 191, 2, 409, 638] +[:mouse_move, 744, 191, 2, 410, 665] +[:key_down_raw, 13, 0, 2, 411, 680] diff --git a/samples/12_c_extensions/.gitignore b/samples/12_c_extensions/.gitignore new file mode 100644 index 0000000..a90a836 --- /dev/null +++ b/samples/12_c_extensions/.gitignore @@ -0,0 +1,2 @@ +ext.dylib + diff --git a/samples/12_c_extensions/01_basics/native/ext-bindings.c b/samples/12_c_extensions/01_basics/native/ext-bindings.c index c805961..86b7090 100644 --- a/samples/12_c_extensions/01_basics/native/ext-bindings.c +++ b/samples/12_c_extensions/01_basics/native/ext-bindings.c @@ -14,7 +14,13 @@ #undef mrb_int #endif +void *(*drb_symbol_lookup)(const char *sym) = NULL; + static void (*drb_free_foreign_object_f)(mrb_state *, void *); +static void (*drb_typecheck_float_f)(mrb_state *, mrb_value); +static void (*drb_typecheck_int_f)(mrb_state *, mrb_value); +static void (*drb_typecheck_bool_f)(mrb_state *, mrb_value); +static void (*drb_typecheck_aggregate_f)(mrb_state *, mrb_value, struct RClass *, mrb_data_type *); static struct RClass *(*mrb_module_get_f)(mrb_state *, const char *); static mrb_int (*mrb_get_args_f)(mrb_state *, mrb_args_format, ...); static struct RClass *(*mrb_module_get_under_f)(mrb_state *, struct RClass *, const char *); @@ -27,7 +33,13 @@ static void (*mrb_define_class_method_f)(mrb_state *, struct RClass *, const cha static struct RData *(*mrb_data_object_alloc_f)(mrb_state *, struct RClass *, void *, const mrb_data_type *); static mrb_value (*mrb_str_new_cstr_f)(mrb_state *, const char *); static void (*mrb_raise_f)(mrb_state *, struct RClass *, const char *); +static mrb_value (*drb_float_value_f)(mrb_state *, mrb_float); +static struct RClass *(*drb_getruntime_error_f)(mrb_state *); +static void drb_free_foreign_object_indirect(mrb_state *state, void *pointer) { + drb_free_foreign_object_f(state, pointer); +} static int drb_ffi__ZTSi_FromRuby(mrb_state *state, mrb_value self) { + drb_typecheck_int_f(state, self); return mrb_fixnum(self); } static mrb_value drb_ffi__ZTSi_ToRuby(mrb_state *state, int value) { @@ -51,18 +63,25 @@ void drb_register_c_extensions(void *(*lookup)(const char *), mrb_state *state, mrb_define_module_function_f(state, module, "square", drb_ffi_square_Binding, MRB_ARGS_REQ(1)); } static int drb_ffi_init_indirect_functions(void *(*lookup)(const char *fnname)) { - if (!(mrb_raise_f = (void (*)(mrb_state *, struct RClass *, const char *)) lookup("mrb_raise"))) return -1; - if (!(mrb_module_get_f = (struct RClass *(*)(mrb_state *, const char *)) lookup("mrb_module_get"))) return -1; - if (!(mrb_class_get_under_f = (struct RClass *(*)(mrb_state *, struct RClass *, const char *)) lookup("mrb_class_get_under"))) return -1; - if (!(mrb_get_args_f = (mrb_int (*)(mrb_state *, mrb_args_format, ...)) lookup("mrb_get_args"))) return -1; + drb_symbol_lookup = lookup; + if (!(drb_float_value_f = (mrb_value (*)(mrb_state *, mrb_float)) lookup("drb_float_value"))) return -1; if (!(drb_free_foreign_object_f = (void (*)(mrb_state *, void *)) lookup("drb_free_foreign_object"))) return -1; - if (!(mrb_define_module_under_f = (struct RClass *(*)(mrb_state *, struct RClass *, const char *)) lookup("mrb_define_module_under"))) return -1; - if (!(mrb_str_new_cstr_f = (mrb_value (*)(mrb_state *, const char *)) lookup("mrb_str_new_cstr"))) return -1; + if (!(drb_getruntime_error_f = (struct RClass *(*)(mrb_state *)) lookup("drb_getruntime_error"))) return -1; + if (!(drb_typecheck_aggregate_f = (void (*)(mrb_state *, mrb_value, struct RClass *, mrb_data_type *)) lookup("drb_typecheck_aggregate"))) return -1; + if (!(drb_typecheck_bool_f = (void (*)(mrb_state *, mrb_value)) lookup("drb_typecheck_bool"))) return -1; + if (!(drb_typecheck_float_f = (void (*)(mrb_state *, mrb_value)) lookup("drb_typecheck_float"))) return -1; + if (!(drb_typecheck_int_f = (void (*)(mrb_state *, mrb_value)) lookup("drb_typecheck_int"))) return -1; + if (!(mrb_class_get_under_f = (struct RClass *(*)(mrb_state *, struct RClass *, const char *)) lookup("mrb_class_get_under"))) return -1; + if (!(mrb_data_object_alloc_f = (struct RData *(*)(mrb_state *, struct RClass *, void *, const mrb_data_type *)) lookup("mrb_data_object_alloc"))) return -1; + if (!(mrb_define_class_method_f = (void (*)(mrb_state *, struct RClass *, const char *, mrb_func_t, mrb_aspec)) lookup("mrb_define_class_method"))) return -1; if (!(mrb_define_class_under_f = (struct RClass *(*)(mrb_state *, struct RClass *, const char *, struct RClass *)) lookup("mrb_define_class_under"))) return -1; + if (!(mrb_define_method_f = (void (*)(mrb_state *, struct RClass *, const char *, mrb_func_t, mrb_aspec)) lookup("mrb_define_method"))) return -1; if (!(mrb_define_module_function_f = (void (*)(mrb_state *, struct RClass *, const char *, mrb_func_t, mrb_aspec)) lookup("mrb_define_module_function"))) return -1; - if (!(mrb_data_object_alloc_f = (struct RData *(*)(mrb_state *, struct RClass *, void *, const mrb_data_type *)) lookup("mrb_data_object_alloc"))) return -1; + if (!(mrb_define_module_under_f = (struct RClass *(*)(mrb_state *, struct RClass *, const char *)) lookup("mrb_define_module_under"))) return -1; + if (!(mrb_get_args_f = (mrb_int (*)(mrb_state *, mrb_args_format, ...)) lookup("mrb_get_args"))) return -1; + if (!(mrb_module_get_f = (struct RClass *(*)(mrb_state *, const char *)) lookup("mrb_module_get"))) return -1; if (!(mrb_module_get_under_f = (struct RClass *(*)(mrb_state *, struct RClass *, const char *)) lookup("mrb_module_get_under"))) return -1; - if (!(mrb_define_method_f = (void (*)(mrb_state *, struct RClass *, const char *, mrb_func_t, mrb_aspec)) lookup("mrb_define_method"))) return -1; - if (!(mrb_define_class_method_f = (void (*)(mrb_state *, struct RClass *, const char *, mrb_func_t, mrb_aspec)) lookup("mrb_define_class_method"))) return -1; + if (!(mrb_raise_f = (void (*)(mrb_state *, struct RClass *, const char *)) lookup("mrb_raise"))) return -1; + if (!(mrb_str_new_cstr_f = (mrb_value (*)(mrb_state *, const char *)) lookup("mrb_str_new_cstr"))) return -1; return 0; } diff --git a/samples/12_c_extensions/02_intermediate/native/re-bindings.c b/samples/12_c_extensions/02_intermediate/native/re-bindings.c index 6aa5630..6bd9869 100644 --- a/samples/12_c_extensions/02_intermediate/native/re-bindings.c +++ b/samples/12_c_extensions/02_intermediate/native/re-bindings.c @@ -14,7 +14,13 @@ #undef mrb_int #endif +void *(*drb_symbol_lookup)(const char *sym) = NULL; + static void (*drb_free_foreign_object_f)(mrb_state *, void *); +static void (*drb_typecheck_float_f)(mrb_state *, mrb_value); +static void (*drb_typecheck_int_f)(mrb_state *, mrb_value); +static void (*drb_typecheck_bool_f)(mrb_state *, mrb_value); +static void (*drb_typecheck_aggregate_f)(mrb_state *, mrb_value, struct RClass *, mrb_data_type *); static struct RClass *(*mrb_module_get_f)(mrb_state *, const char *); static mrb_int (*mrb_get_args_f)(mrb_state *, mrb_args_format, ...); static struct RClass *(*mrb_module_get_under_f)(mrb_state *, struct RClass *, const char *); @@ -27,10 +33,18 @@ static void (*mrb_define_class_method_f)(mrb_state *, struct RClass *, const cha static struct RData *(*mrb_data_object_alloc_f)(mrb_state *, struct RClass *, void *, const mrb_data_type *); static mrb_value (*mrb_str_new_cstr_f)(mrb_state *, const char *); static void (*mrb_raise_f)(mrb_state *, struct RClass *, const char *); -static struct RClass *(*mrb_exc_get_f)(mrb_state *, const char *); +static mrb_value (*drb_float_value_f)(mrb_state *, mrb_float); +static struct RClass *(*drb_getruntime_error_f)(mrb_state *); static void drb_free_foreign_object_indirect(mrb_state *state, void *pointer) { drb_free_foreign_object_f(state, pointer); } +static int drb_ffi__ZTSi_FromRuby(mrb_state *state, mrb_value self) { + drb_typecheck_int_f(state, self); + return mrb_fixnum(self); +} +static mrb_value drb_ffi__ZTSi_ToRuby(mrb_state *state, int value) { + return mrb_fixnum_value(value); +} struct drb_foreign_object_ZTSP7regex_t { drb_foreign_object_kind kind; struct regex_t *value; @@ -40,6 +54,10 @@ static mrb_data_type ForeignObjectType_ZTSP7regex_t = {"regex_t*", drb_free_fore static struct regex_t *drb_ffi__ZTSP7regex_t_FromRuby(mrb_state *state, mrb_value self) { if (mrb_nil_p(self)) return 0; + struct RClass *FFI = mrb_module_get_f(state, "FFI"); + struct RClass *module = mrb_module_get_under_f(state, FFI, "RE"); + struct RClass *klass = mrb_class_get_under_f(state, module, "Regex_tPointer"); + drb_typecheck_aggregate_f(state, self, klass, &ForeignObjectType_ZTSP7regex_t); return ((struct drb_foreign_object_ZTSP7regex_t *)DATA_PTR(self))->value; } static mrb_value drb_ffi__ZTSP7regex_t_ToRuby(mrb_state *state, struct regex_t *value) { @@ -63,6 +81,10 @@ static char *drb_ffi__ZTSPc_FromRuby(mrb_state *state, mrb_value self) { return 0; if (mrb_type(self) == MRB_TT_STRING) return RSTRING_PTR(self); + struct RClass *FFI = mrb_module_get_f(state, "FFI"); + struct RClass *module = mrb_module_get_under_f(state, FFI, "RE"); + struct RClass *klass = mrb_class_get_under_f(state, module, "CharPointer"); + drb_typecheck_aggregate_f(state, self, klass, &ForeignObjectType_ZTSPc); return ((struct drb_foreign_object_ZTSPc *)DATA_PTR(self))->value; } static mrb_value drb_ffi__ZTSPc_ToRuby(mrb_state *state, char *value) { @@ -75,12 +97,6 @@ static mrb_value drb_ffi__ZTSPc_ToRuby(mrb_state *state, char *value) { struct RData *rdata = mrb_data_object_alloc_f(state, klass, ptr, &ForeignObjectType_ZTSPc); return mrb_obj_value(rdata); } -static int drb_ffi__ZTSi_FromRuby(mrb_state *state, mrb_value self) { - return mrb_fixnum(self); -} -static mrb_value drb_ffi__ZTSi_ToRuby(mrb_state *state, int value) { - return mrb_fixnum_value(value); -} struct drb_foreign_object_ZTSPi { drb_foreign_object_kind kind; int *value; @@ -90,6 +106,10 @@ static mrb_data_type ForeignObjectType_ZTSPi = {"int*", drb_free_foreign_object_ static int *drb_ffi__ZTSPi_FromRuby(mrb_state *state, mrb_value self) { if (mrb_nil_p(self)) return 0; + struct RClass *FFI = mrb_module_get_f(state, "FFI"); + struct RClass *module = mrb_module_get_under_f(state, FFI, "RE"); + struct RClass *klass = mrb_class_get_under_f(state, module, "IntPointer"); + drb_typecheck_aggregate_f(state, self, klass, &ForeignObjectType_ZTSPi); return ((struct drb_foreign_object_ZTSPi *)DATA_PTR(self))->value; } static mrb_value drb_ffi__ZTSPi_ToRuby(mrb_state *state, int *value) { @@ -103,17 +123,18 @@ static mrb_value drb_ffi__ZTSPi_ToRuby(mrb_state *state, int *value) { return mrb_obj_value(rdata); } static char drb_ffi__ZTSc_FromRuby(mrb_state *state, mrb_value self) { + drb_typecheck_int_f(state, self); return mrb_fixnum(self); } static mrb_value drb_ffi__ZTSc_ToRuby(mrb_state *state, char value) { return mrb_fixnum_value(value); } static mrb_value drb_ffi__ZTSP7regex_t_New(mrb_state *mrb, mrb_value self) { - mrb_raise_f(mrb, mrb_exc_get_f(mrb, "RuntimeError"), "Cannot allocate pointer of incomplete type"); + mrb_raise_f(mrb, drb_getruntime_error_f(mrb), "Cannot allocate pointer of incomplete type"); return mrb_nil_value(); } static mrb_value drb_ffi__ZTSP7regex_t_GetValue(mrb_state *mrb, mrb_value value) { - mrb_raise_f(mrb, mrb_exc_get_f(mrb, "RuntimeError"), "Cannot access value of incomplete type"); + mrb_raise_f(mrb, drb_getruntime_error_f(mrb), "Cannot access value of incomplete type"); return mrb_nil_value(); } static mrb_value drb_ffi__ZTSP7regex_t_IsNil(mrb_state *state, mrb_value self) { @@ -123,11 +144,11 @@ static mrb_value drb_ffi__ZTSP7regex_t_IsNil(mrb_state *state, mrb_value self) { return mrb_false_value(); } static mrb_value drb_ffi__ZTSP7regex_t_GetAt(mrb_state *mrb, mrb_value self) { - mrb_raise_f(mrb, mrb_exc_get_f(mrb, "RuntimeError"), "Cannot access value of incomplete type"); + mrb_raise_f(mrb, drb_getruntime_error_f(mrb), "Cannot access value of incomplete type"); return mrb_nil_value(); } static mrb_value drb_ffi__ZTSP7regex_t_SetAt(mrb_state *mrb, mrb_value self) { - mrb_raise_f(mrb, mrb_exc_get_f(mrb, "RuntimeError"), "Cannot change value of incomplete type"); + mrb_raise_f(mrb, drb_getruntime_error_f(mrb), "Cannot change value of incomplete type"); return mrb_nil_value(); } static mrb_value drb_ffi__ZTSPc_New(mrb_state *mrb, mrb_value self) { @@ -264,19 +285,25 @@ void drb_register_c_extensions(void *(*lookup)(const char *), mrb_state *state, mrb_define_method_f(state, IntPointerClass, "nil?", drb_ffi__ZTSPi_IsNil, MRB_ARGS_REQ(0)); } static int drb_ffi_init_indirect_functions(void *(*lookup)(const char *fnname)) { - if (!(mrb_raise_f = (void (*)(mrb_state *, struct RClass *, const char *)) lookup("mrb_raise"))) return -1; - if (!(mrb_str_new_cstr_f = (mrb_value (*)(mrb_state *, const char *)) lookup("mrb_str_new_cstr"))) return -1; - if (!(mrb_define_class_under_f = (struct RClass *(*)(mrb_state *, struct RClass *, const char *, struct RClass *)) lookup("mrb_define_class_under"))) return -1; - if (!(mrb_define_class_method_f = (void (*)(mrb_state *, struct RClass *, const char *, mrb_func_t, mrb_aspec)) lookup("mrb_define_class_method"))) return -1; - if (!(mrb_class_get_under_f = (struct RClass *(*)(mrb_state *, struct RClass *, const char *)) lookup("mrb_class_get_under"))) return -1; - if (!(mrb_module_get_under_f = (struct RClass *(*)(mrb_state *, struct RClass *, const char *)) lookup("mrb_module_get_under"))) return -1; + drb_symbol_lookup = lookup; + if (!(drb_float_value_f = (mrb_value (*)(mrb_state *, mrb_float)) lookup("drb_float_value"))) return -1; if (!(drb_free_foreign_object_f = (void (*)(mrb_state *, void *)) lookup("drb_free_foreign_object"))) return -1; + if (!(drb_getruntime_error_f = (struct RClass *(*)(mrb_state *)) lookup("drb_getruntime_error"))) return -1; + if (!(drb_typecheck_aggregate_f = (void (*)(mrb_state *, mrb_value, struct RClass *, mrb_data_type *)) lookup("drb_typecheck_aggregate"))) return -1; + if (!(drb_typecheck_bool_f = (void (*)(mrb_state *, mrb_value)) lookup("drb_typecheck_bool"))) return -1; + if (!(drb_typecheck_float_f = (void (*)(mrb_state *, mrb_value)) lookup("drb_typecheck_float"))) return -1; + if (!(drb_typecheck_int_f = (void (*)(mrb_state *, mrb_value)) lookup("drb_typecheck_int"))) return -1; + if (!(mrb_class_get_under_f = (struct RClass *(*)(mrb_state *, struct RClass *, const char *)) lookup("mrb_class_get_under"))) return -1; if (!(mrb_data_object_alloc_f = (struct RData *(*)(mrb_state *, struct RClass *, void *, const mrb_data_type *)) lookup("mrb_data_object_alloc"))) return -1; - if (!(mrb_get_args_f = (mrb_int (*)(mrb_state *, mrb_args_format, ...)) lookup("mrb_get_args"))) return -1; - if (!(mrb_module_get_f = (struct RClass *(*)(mrb_state *, const char *)) lookup("mrb_module_get"))) return -1; + if (!(mrb_define_class_method_f = (void (*)(mrb_state *, struct RClass *, const char *, mrb_func_t, mrb_aspec)) lookup("mrb_define_class_method"))) return -1; + if (!(mrb_define_class_under_f = (struct RClass *(*)(mrb_state *, struct RClass *, const char *, struct RClass *)) lookup("mrb_define_class_under"))) return -1; if (!(mrb_define_method_f = (void (*)(mrb_state *, struct RClass *, const char *, mrb_func_t, mrb_aspec)) lookup("mrb_define_method"))) return -1; - if (!(mrb_exc_get_f = (struct RClass *(*)(mrb_state *, const char *)) lookup("mrb_exc_get"))) return -1; if (!(mrb_define_module_function_f = (void (*)(mrb_state *, struct RClass *, const char *, mrb_func_t, mrb_aspec)) lookup("mrb_define_module_function"))) return -1; if (!(mrb_define_module_under_f = (struct RClass *(*)(mrb_state *, struct RClass *, const char *)) lookup("mrb_define_module_under"))) return -1; + if (!(mrb_get_args_f = (mrb_int (*)(mrb_state *, mrb_args_format, ...)) lookup("mrb_get_args"))) return -1; + if (!(mrb_module_get_f = (struct RClass *(*)(mrb_state *, const char *)) lookup("mrb_module_get"))) return -1; + if (!(mrb_module_get_under_f = (struct RClass *(*)(mrb_state *, struct RClass *, const char *)) lookup("mrb_module_get_under"))) return -1; + if (!(mrb_raise_f = (void (*)(mrb_state *, struct RClass *, const char *)) lookup("mrb_raise"))) return -1; + if (!(mrb_str_new_cstr_f = (mrb_value (*)(mrb_state *, const char *)) lookup("mrb_str_new_cstr"))) return -1; return 0; } diff --git a/samples/12_c_extensions/03_native_pixel_arrays/native/ext-bindings.c b/samples/12_c_extensions/03_native_pixel_arrays/native/ext-bindings.c index c0a923c..bdba6e7 100644 --- a/samples/12_c_extensions/03_native_pixel_arrays/native/ext-bindings.c +++ b/samples/12_c_extensions/03_native_pixel_arrays/native/ext-bindings.c @@ -17,6 +17,10 @@ void *(*drb_symbol_lookup)(const char *sym) = NULL; static void (*drb_free_foreign_object_f)(mrb_state *, void *); +static void (*drb_typecheck_float_f)(mrb_state *, mrb_value); +static void (*drb_typecheck_int_f)(mrb_state *, mrb_value); +static void (*drb_typecheck_bool_f)(mrb_state *, mrb_value); +static void (*drb_typecheck_aggregate_f)(mrb_state *, mrb_value, struct RClass *, mrb_data_type *); static struct RClass *(*mrb_module_get_f)(mrb_state *, const char *); static mrb_int (*mrb_get_args_f)(mrb_state *, mrb_args_format, ...); static struct RClass *(*mrb_module_get_under_f)(mrb_state *, struct RClass *, const char *); @@ -29,10 +33,18 @@ static void (*mrb_define_class_method_f)(mrb_state *, struct RClass *, const cha static struct RData *(*mrb_data_object_alloc_f)(mrb_state *, struct RClass *, void *, const mrb_data_type *); static mrb_value (*mrb_str_new_cstr_f)(mrb_state *, const char *); static void (*mrb_raise_f)(mrb_state *, struct RClass *, const char *); -static struct RClass *(*mrb_exc_get_f)(mrb_state *, const char *); +static mrb_value (*drb_float_value_f)(mrb_state *, mrb_float); +static struct RClass *(*drb_getruntime_error_f)(mrb_state *); static void drb_free_foreign_object_indirect(mrb_state *state, void *pointer) { drb_free_foreign_object_f(state, pointer); } +static int drb_ffi__ZTSi_FromRuby(mrb_state *state, mrb_value self) { + drb_typecheck_int_f(state, self); + return mrb_fixnum(self); +} +static mrb_value drb_ffi__ZTSi_ToRuby(mrb_state *state, int value) { + return mrb_fixnum_value(value); +} static mrb_value drb_ffi_update_scanner_texture_Binding(mrb_state *state, mrb_value value) { update_scanner_texture(); return mrb_nil_value(); @@ -48,19 +60,24 @@ void drb_register_c_extensions(void *(*lookup)(const char *), mrb_state *state, } static int drb_ffi_init_indirect_functions(void *(*lookup)(const char *fnname)) { drb_symbol_lookup = lookup; - if (!(mrb_exc_get_f = (struct RClass *(*)(mrb_state *, const char *)) lookup("mrb_exc_get"))) return -1; - if (!(mrb_raise_f = (void (*)(mrb_state *, struct RClass *, const char *)) lookup("mrb_raise"))) return -1; - if (!(mrb_class_get_under_f = (struct RClass *(*)(mrb_state *, struct RClass *, const char *)) lookup("mrb_class_get_under"))) return -1; - if (!(mrb_module_get_under_f = (struct RClass *(*)(mrb_state *, struct RClass *, const char *)) lookup("mrb_module_get_under"))) return -1; + if (!(drb_float_value_f = (mrb_value (*)(mrb_state *, mrb_float)) lookup("drb_float_value"))) return -1; if (!(drb_free_foreign_object_f = (void (*)(mrb_state *, void *)) lookup("drb_free_foreign_object"))) return -1; - if (!(mrb_module_get_f = (struct RClass *(*)(mrb_state *, const char *)) lookup("mrb_module_get"))) return -1; - if (!(mrb_define_module_under_f = (struct RClass *(*)(mrb_state *, struct RClass *, const char *)) lookup("mrb_define_module_under"))) return -1; + if (!(drb_getruntime_error_f = (struct RClass *(*)(mrb_state *)) lookup("drb_getruntime_error"))) return -1; + if (!(drb_typecheck_aggregate_f = (void (*)(mrb_state *, mrb_value, struct RClass *, mrb_data_type *)) lookup("drb_typecheck_aggregate"))) return -1; + if (!(drb_typecheck_bool_f = (void (*)(mrb_state *, mrb_value)) lookup("drb_typecheck_bool"))) return -1; + if (!(drb_typecheck_float_f = (void (*)(mrb_state *, mrb_value)) lookup("drb_typecheck_float"))) return -1; + if (!(drb_typecheck_int_f = (void (*)(mrb_state *, mrb_value)) lookup("drb_typecheck_int"))) return -1; + if (!(mrb_class_get_under_f = (struct RClass *(*)(mrb_state *, struct RClass *, const char *)) lookup("mrb_class_get_under"))) return -1; if (!(mrb_data_object_alloc_f = (struct RData *(*)(mrb_state *, struct RClass *, void *, const mrb_data_type *)) lookup("mrb_data_object_alloc"))) return -1; + if (!(mrb_define_class_method_f = (void (*)(mrb_state *, struct RClass *, const char *, mrb_func_t, mrb_aspec)) lookup("mrb_define_class_method"))) return -1; + if (!(mrb_define_class_under_f = (struct RClass *(*)(mrb_state *, struct RClass *, const char *, struct RClass *)) lookup("mrb_define_class_under"))) return -1; + if (!(mrb_define_method_f = (void (*)(mrb_state *, struct RClass *, const char *, mrb_func_t, mrb_aspec)) lookup("mrb_define_method"))) return -1; if (!(mrb_define_module_function_f = (void (*)(mrb_state *, struct RClass *, const char *, mrb_func_t, mrb_aspec)) lookup("mrb_define_module_function"))) return -1; + if (!(mrb_define_module_under_f = (struct RClass *(*)(mrb_state *, struct RClass *, const char *)) lookup("mrb_define_module_under"))) return -1; if (!(mrb_get_args_f = (mrb_int (*)(mrb_state *, mrb_args_format, ...)) lookup("mrb_get_args"))) return -1; - if (!(mrb_define_method_f = (void (*)(mrb_state *, struct RClass *, const char *, mrb_func_t, mrb_aspec)) lookup("mrb_define_method"))) return -1; - if (!(mrb_define_class_method_f = (void (*)(mrb_state *, struct RClass *, const char *, mrb_func_t, mrb_aspec)) lookup("mrb_define_class_method"))) return -1; + if (!(mrb_module_get_f = (struct RClass *(*)(mrb_state *, const char *)) lookup("mrb_module_get"))) return -1; + if (!(mrb_module_get_under_f = (struct RClass *(*)(mrb_state *, struct RClass *, const char *)) lookup("mrb_module_get_under"))) return -1; + if (!(mrb_raise_f = (void (*)(mrb_state *, struct RClass *, const char *)) lookup("mrb_raise"))) return -1; if (!(mrb_str_new_cstr_f = (mrb_value (*)(mrb_state *, const char *)) lookup("mrb_str_new_cstr"))) return -1; - if (!(mrb_define_class_under_f = (struct RClass *(*)(mrb_state *, struct RClass *, const char *, struct RClass *)) lookup("mrb_define_class_under"))) return -1; return 0; } diff --git a/samples/13_path_finding_algorithms/01_breadth_first_search/replay.txt b/samples/13_path_finding_algorithms/01_breadth_first_search/replay.txt new file mode 100644 index 0000000..62f4aca --- /dev/null +++ b/samples/13_path_finding_algorithms/01_breadth_first_search/replay.txt @@ -0,0 +1,203 @@ +replay_version 2.0 +stopped_at 213 +seed 100 +recorded_at 2021-11-20 11:17:21 -0600 +[:mouse_button_up, 1, 0, 1, 1, 4] +[:mouse_move, 780, 95, 2, 2, 11] +[:mouse_move, 781, 95, 2, 3, 12] +[:mouse_move, 782, 95, 2, 4, 13] +[:mouse_move, 783, 95, 2, 5, 14] +[:mouse_move, 771, 95, 2, 6, 32] +[:mouse_move, 752, 95, 2, 7, 32] +[:mouse_move, 718, 95, 2, 8, 34] +[:mouse_move, 652, 95, 2, 9, 34] +[:mouse_move, 549, 95, 2, 10, 35] +[:mouse_move, 462, 101, 2, 11, 36] +[:mouse_move, 425, 106, 2, 12, 37] +[:mouse_move, 405, 108, 2, 13, 38] +[:mouse_move, 406, 109, 2, 14, 39] +[:mouse_move, 412, 111, 2, 15, 40] +[:mouse_move, 429, 111, 2, 16, 41] +[:mouse_move, 450, 109, 2, 17, 42] +[:mouse_move, 460, 107, 2, 18, 42] +[:mouse_move, 460, 106, 2, 19, 43] +[:mouse_move, 460, 105, 2, 20, 45] +[:mouse_move, 460, 104, 2, 21, 46] +[:mouse_move, 456, 104, 2, 22, 47] +[:mouse_move, 469, 104, 2, 23, 49] +[:mouse_move, 489, 103, 2, 24, 50] +[:mouse_move, 512, 100, 2, 25, 51] +[:mouse_move, 536, 96, 2, 26, 52] +[:mouse_move, 565, 92, 2, 27, 52] +[:mouse_move, 587, 92, 2, 28, 53] +[:mouse_move, 597, 92, 2, 29, 54] +[:mouse_move, 599, 92, 2, 30, 55] +[:mouse_button_pressed, 1, 0, 1, 31, 59] +[:mouse_button_up, 1, 0, 1, 32, 62] +[:mouse_move, 599, 91, 2, 33, 65] +[:mouse_move, 590, 86, 2, 34, 65] +[:mouse_move, 570, 78, 2, 35, 66] +[:mouse_move, 543, 70, 2, 36, 66] +[:mouse_move, 516, 65, 2, 37, 67] +[:mouse_move, 481, 61, 2, 38, 68] +[:mouse_move, 449, 59, 2, 39, 69] +[:mouse_move, 429, 57, 2, 40, 69] +[:mouse_move, 424, 56, 2, 41, 70] +[:mouse_move, 426, 56, 2, 42, 74] +[:mouse_move, 429, 56, 2, 43, 75] +[:mouse_move, 431, 56, 2, 44, 75] +[:mouse_move, 433, 56, 2, 45, 76] +[:mouse_move, 435, 55, 2, 46, 77] +[:mouse_move, 437, 55, 2, 47, 78] +[:mouse_move, 440, 55, 2, 48, 78] +[:mouse_move, 444, 55, 2, 49, 79] +[:mouse_move, 445, 54, 2, 50, 79] +[:mouse_move, 444, 53, 2, 51, 81] +[:mouse_move, 444, 52, 2, 52, 82] +[:mouse_move, 443, 51, 2, 53, 89] +[:mouse_button_pressed, 1, 0, 1, 54, 89] +[:mouse_move, 442, 51, 2, 55, 89] +[:mouse_move, 436, 51, 2, 56, 90] +[:mouse_move, 432, 49, 2, 57, 91] +[:mouse_move, 431, 49, 2, 58, 91] +[:mouse_move, 429, 49, 2, 59, 92] +[:mouse_move, 428, 49, 2, 60, 93] +[:mouse_move, 426, 49, 2, 61, 94] +[:mouse_move, 425, 49, 2, 62, 94] +[:mouse_move, 424, 49, 2, 63, 95] +[:mouse_move, 423, 49, 2, 64, 96] +[:mouse_move, 422, 49, 2, 65, 98] +[:mouse_move, 421, 49, 2, 66, 99] +[:mouse_move, 420, 49, 2, 67, 99] +[:mouse_move, 419, 49, 2, 68, 100] +[:mouse_move, 417, 49, 2, 69, 100] +[:mouse_move, 415, 49, 2, 70, 101] +[:mouse_move, 414, 49, 2, 71, 102] +[:mouse_move, 413, 49, 2, 72, 108] +[:mouse_move, 415, 49, 2, 73, 124] +[:mouse_move, 416, 49, 2, 74, 125] +[:mouse_move, 420, 49, 2, 75, 126] +[:mouse_move, 424, 49, 2, 76, 127] +[:mouse_move, 429, 49, 2, 77, 128] +[:mouse_move, 433, 49, 2, 78, 128] +[:mouse_move, 441, 49, 2, 79, 129] +[:mouse_move, 450, 49, 2, 80, 129] +[:mouse_move, 460, 49, 2, 81, 130] +[:mouse_move, 472, 49, 2, 82, 131] +[:mouse_move, 480, 49, 2, 83, 131] +[:mouse_move, 486, 49, 2, 84, 132] +[:mouse_move, 488, 49, 2, 85, 132] +[:mouse_move, 492, 49, 2, 86, 132] +[:mouse_move, 498, 49, 2, 87, 133] +[:mouse_move, 507, 49, 2, 88, 133] +[:mouse_move, 513, 48, 2, 89, 134] +[:mouse_move, 518, 47, 2, 90, 134] +[:mouse_move, 523, 47, 2, 91, 134] +[:mouse_move, 529, 46, 2, 92, 135] +[:mouse_move, 533, 46, 2, 93, 135] +[:mouse_move, 538, 46, 2, 94, 135] +[:mouse_move, 543, 46, 2, 95, 136] +[:mouse_move, 545, 46, 2, 96, 136] +[:mouse_move, 546, 46, 2, 97, 136] +[:mouse_move, 551, 46, 2, 98, 137] +[:mouse_move, 558, 46, 2, 99, 137] +[:mouse_move, 567, 46, 2, 100, 138] +[:mouse_move, 573, 46, 2, 101, 138] +[:mouse_move, 576, 45, 2, 102, 138] +[:mouse_move, 579, 45, 2, 103, 138] +[:mouse_move, 581, 45, 2, 104, 138] +[:mouse_move, 584, 45, 2, 105, 139] +[:mouse_move, 590, 45, 2, 106, 139] +[:mouse_move, 597, 45, 2, 107, 139] +[:mouse_move, 602, 45, 2, 108, 140] +[:mouse_move, 606, 45, 2, 109, 140] +[:mouse_move, 611, 45, 2, 110, 140] +[:mouse_move, 617, 45, 2, 111, 140] +[:mouse_move, 625, 45, 2, 112, 140] +[:mouse_move, 632, 45, 2, 113, 140] +[:mouse_move, 638, 45, 2, 114, 141] +[:mouse_move, 643, 45, 2, 115, 141] +[:mouse_move, 644, 44, 2, 116, 141] +[:mouse_move, 646, 44, 2, 117, 141] +[:mouse_move, 647, 44, 2, 118, 142] +[:mouse_move, 650, 44, 2, 119, 142] +[:mouse_move, 653, 44, 2, 120, 142] +[:mouse_move, 656, 44, 2, 121, 142] +[:mouse_move, 658, 43, 2, 122, 142] +[:mouse_move, 659, 43, 2, 123, 143] +[:mouse_move, 663, 43, 2, 124, 143] +[:mouse_move, 665, 43, 2, 125, 143] +[:mouse_move, 667, 43, 2, 126, 143] +[:mouse_move, 669, 43, 2, 127, 143] +[:mouse_move, 670, 43, 2, 128, 143] +[:mouse_move, 671, 43, 2, 129, 143] +[:mouse_move, 672, 43, 2, 130, 144] +[:mouse_move, 674, 43, 2, 131, 144] +[:mouse_move, 677, 43, 2, 132, 144] +[:mouse_move, 679, 43, 2, 133, 144] +[:mouse_move, 680, 43, 2, 134, 144] +[:mouse_move, 681, 43, 2, 135, 144] +[:mouse_move, 683, 43, 2, 136, 145] +[:mouse_move, 684, 43, 2, 137, 145] +[:mouse_move, 685, 43, 2, 138, 145] +[:mouse_move, 686, 43, 2, 139, 145] +[:mouse_move, 687, 43, 2, 140, 145] +[:mouse_move, 688, 43, 2, 141, 146] +[:mouse_button_up, 1, 0, 1, 142, 150] +[:mouse_move, 688, 44, 2, 143, 150] +[:mouse_move, 685, 45, 2, 144, 150] +[:mouse_move, 674, 47, 2, 145, 150] +[:mouse_move, 657, 52, 2, 146, 150] +[:mouse_move, 621, 57, 2, 147, 151] +[:mouse_move, 593, 62, 2, 148, 151] +[:mouse_move, 568, 65, 2, 149, 151] +[:mouse_move, 550, 68, 2, 150, 151] +[:mouse_move, 542, 69, 2, 151, 152] +[:mouse_move, 539, 69, 2, 152, 152] +[:mouse_move, 536, 70, 2, 153, 152] +[:mouse_move, 534, 70, 2, 154, 153] +[:mouse_move, 531, 72, 2, 155, 153] +[:mouse_move, 528, 73, 2, 156, 153] +[:mouse_move, 522, 75, 2, 157, 154] +[:mouse_move, 515, 80, 2, 158, 154] +[:mouse_move, 514, 81, 2, 159, 154] +[:mouse_move, 513, 81, 2, 160, 154] +[:mouse_move, 509, 84, 2, 161, 156] +[:mouse_move, 502, 88, 2, 162, 156] +[:mouse_move, 491, 93, 2, 163, 156] +[:mouse_move, 487, 97, 2, 164, 156] +[:mouse_move, 486, 97, 2, 165, 156] +[:mouse_move, 487, 96, 2, 166, 157] +[:mouse_button_pressed, 1, 0, 1, 167, 159] +[:mouse_button_up, 1, 0, 1, 168, 160] +[:mouse_button_pressed, 1, 0, 1, 169, 161] +[:mouse_move, 488, 96, 2, 170, 161] +[:mouse_button_up, 1, 0, 1, 171, 161] +[:mouse_move, 488, 97, 2, 172, 166] +[:mouse_move, 487, 97, 2, 173, 166] +[:mouse_move, 486, 97, 2, 174, 167] +[:mouse_move, 485, 97, 2, 175, 167] +[:mouse_move, 484, 97, 2, 176, 168] +[:mouse_button_pressed, 1, 0, 1, 177, 172] +[:mouse_button_up, 1, 0, 1, 178, 173] +[:mouse_move, 485, 97, 2, 179, 185] +[:key_down_raw, 96, 0, 2, 180, 191] +[:mouse_move, 486, 96, 2, 181, 192] +[:mouse_move, 488, 96, 2, 182, 192] +[:mouse_move, 495, 94, 2, 183, 192] +[:key_up_raw, 96, 0, 2, 184, 192] +[:mouse_move, 503, 93, 2, 185, 193] +[:mouse_move, 514, 92, 2, 186, 193] +[:mouse_move, 544, 92, 2, 187, 193] +[:mouse_move, 573, 92, 2, 188, 194] +[:mouse_move, 607, 92, 2, 189, 194] +[:mouse_move, 641, 89, 2, 190, 194] +[:mouse_move, 674, 89, 2, 191, 194] +[:mouse_move, 705, 89, 2, 192, 194] +[:mouse_move, 735, 89, 2, 193, 195] +[:mouse_move, 759, 89, 2, 194, 195] +[:mouse_move, 776, 89, 2, 195, 195] +[:mouse_move, 784, 89, 2, 196, 195] +[:mouse_move, 786, 89, 2, 197, 196] +[:mouse_move, 786, 90, 2, 198, 204] +[:key_down_raw, 13, 0, 2, 199, 213] diff --git a/samples/13_path_finding_algorithms/02_detailed_breadth_first_search/replay.txt b/samples/13_path_finding_algorithms/02_detailed_breadth_first_search/replay.txt new file mode 100644 index 0000000..aa8719b --- /dev/null +++ b/samples/13_path_finding_algorithms/02_detailed_breadth_first_search/replay.txt @@ -0,0 +1,241 @@ +replay_version 2.0 +stopped_at 435 +seed 100 +recorded_at 2021-11-20 11:18:03 -0600 +[:mouse_button_up, 1, 0, 1, 1, 4] +[:mouse_move, 789, 89, 2, 2, 27] +[:mouse_move, 785, 90, 2, 3, 28] +[:mouse_move, 768, 94, 2, 4, 29] +[:mouse_move, 752, 99, 2, 5, 30] +[:mouse_move, 737, 104, 2, 6, 31] +[:mouse_move, 729, 104, 2, 7, 32] +[:mouse_move, 724, 104, 2, 8, 33] +[:mouse_move, 720, 103, 2, 9, 34] +[:mouse_move, 711, 103, 2, 10, 35] +[:mouse_move, 702, 103, 2, 11, 36] +[:mouse_move, 698, 103, 2, 12, 37] +[:mouse_move, 697, 103, 2, 13, 38] +[:mouse_move, 696, 103, 2, 14, 40] +[:mouse_move, 694, 104, 2, 15, 41] +[:mouse_move, 684, 104, 2, 16, 42] +[:mouse_move, 666, 104, 2, 17, 43] +[:mouse_move, 645, 105, 2, 18, 44] +[:mouse_move, 626, 106, 2, 19, 45] +[:mouse_move, 615, 106, 2, 20, 46] +[:mouse_move, 609, 106, 2, 21, 47] +[:mouse_move, 606, 106, 2, 22, 48] +[:mouse_move, 605, 106, 2, 23, 49] +[:mouse_move, 600, 104, 2, 24, 50] +[:mouse_move, 590, 100, 2, 25, 51] +[:mouse_move, 579, 97, 2, 26, 52] +[:mouse_move, 575, 96, 2, 27, 53] +[:mouse_move, 581, 96, 2, 28, 58] +[:mouse_move, 596, 98, 2, 29, 59] +[:mouse_move, 614, 98, 2, 30, 60] +[:mouse_move, 635, 97, 2, 31, 61] +[:mouse_move, 652, 94, 2, 32, 62] +[:mouse_move, 657, 93, 2, 33, 63] +[:mouse_move, 658, 92, 2, 34, 64] +[:mouse_button_pressed, 1, 0, 1, 35, 70] +[:mouse_move, 659, 92, 2, 36, 70] +[:mouse_button_up, 1, 0, 1, 37, 74] +[:mouse_move, 660, 92, 2, 38, 87] +[:mouse_button_pressed, 1, 0, 1, 39, 92] +[:mouse_button_up, 1, 0, 1, 40, 98] +[:mouse_move, 661, 92, 2, 41, 101] +[:mouse_button_pressed, 1, 0, 1, 42, 103] +[:mouse_button_up, 1, 0, 1, 43, 108] +[:mouse_move, 662, 92, 2, 44, 112] +[:mouse_button_pressed, 1, 0, 1, 45, 113] +[:mouse_button_up, 1, 0, 1, 46, 119] +[:mouse_move, 657, 92, 2, 47, 125] +[:mouse_move, 641, 92, 2, 48, 126] +[:mouse_move, 623, 93, 2, 49, 127] +[:mouse_move, 610, 95, 2, 50, 128] +[:mouse_move, 599, 97, 2, 51, 129] +[:mouse_move, 588, 98, 2, 52, 130] +[:mouse_move, 584, 99, 2, 53, 131] +[:mouse_move, 581, 99, 2, 54, 132] +[:mouse_move, 580, 99, 2, 55, 133] +[:mouse_move, 575, 99, 2, 56, 134] +[:mouse_move, 572, 99, 2, 57, 135] +[:mouse_move, 570, 99, 2, 58, 136] +[:mouse_move, 564, 101, 2, 59, 137] +[:mouse_move, 559, 101, 2, 60, 138] +[:mouse_move, 557, 101, 2, 61, 139] +[:mouse_move, 555, 102, 2, 62, 140] +[:mouse_move, 554, 102, 2, 63, 141] +[:mouse_button_pressed, 1, 0, 1, 64, 145] +[:mouse_button_up, 1, 0, 1, 65, 149] +[:mouse_button_pressed, 1, 0, 1, 66, 154] +[:mouse_move, 555, 102, 2, 67, 154] +[:mouse_button_up, 1, 0, 1, 68, 159] +[:mouse_button_pressed, 1, 0, 1, 69, 163] +[:mouse_button_up, 1, 0, 1, 70, 168] +[:mouse_move, 555, 103, 2, 71, 168] +[:mouse_move, 539, 103, 2, 72, 169] +[:mouse_move, 519, 100, 2, 73, 170] +[:mouse_move, 498, 95, 2, 74, 171] +[:mouse_move, 488, 90, 2, 75, 172] +[:mouse_move, 484, 88, 2, 76, 173] +[:mouse_move, 475, 81, 2, 77, 174] +[:mouse_move, 460, 73, 2, 78, 175] +[:mouse_move, 441, 64, 2, 79, 176] +[:mouse_move, 424, 57, 2, 80, 177] +[:mouse_move, 413, 53, 2, 81, 178] +[:mouse_move, 408, 50, 2, 82, 179] +[:mouse_move, 407, 49, 2, 83, 182] +[:mouse_move, 405, 47, 2, 84, 183] +[:mouse_move, 404, 46, 2, 85, 184] +[:mouse_move, 404, 45, 2, 86, 185] +[:mouse_move, 403, 45, 2, 87, 186] +[:mouse_button_pressed, 1, 0, 1, 88, 195] +[:mouse_move, 406, 45, 2, 89, 197] +[:mouse_move, 413, 45, 2, 90, 198] +[:mouse_move, 423, 45, 2, 91, 199] +[:mouse_move, 434, 45, 2, 92, 200] +[:mouse_move, 446, 45, 2, 93, 201] +[:mouse_move, 461, 45, 2, 94, 202] +[:mouse_move, 472, 45, 2, 95, 203] +[:mouse_move, 480, 45, 2, 96, 204] +[:mouse_move, 486, 45, 2, 97, 205] +[:mouse_move, 492, 45, 2, 98, 206] +[:mouse_move, 495, 45, 2, 99, 207] +[:mouse_move, 496, 45, 2, 100, 208] +[:mouse_move, 497, 45, 2, 101, 209] +[:mouse_move, 498, 45, 2, 102, 210] +[:mouse_move, 501, 45, 2, 103, 211] +[:mouse_move, 507, 45, 2, 104, 212] +[:mouse_move, 512, 45, 2, 105, 213] +[:mouse_move, 516, 45, 2, 106, 214] +[:mouse_move, 518, 45, 2, 107, 215] +[:mouse_move, 519, 45, 2, 108, 216] +[:mouse_move, 520, 45, 2, 109, 217] +[:mouse_move, 522, 45, 2, 110, 218] +[:mouse_move, 525, 45, 2, 111, 219] +[:mouse_move, 533, 45, 2, 112, 220] +[:mouse_move, 537, 45, 2, 113, 221] +[:mouse_move, 541, 45, 2, 114, 222] +[:mouse_move, 545, 45, 2, 115, 223] +[:mouse_move, 546, 45, 2, 116, 224] +[:mouse_move, 547, 45, 2, 117, 226] +[:mouse_move, 549, 45, 2, 118, 227] +[:mouse_move, 554, 45, 2, 119, 228] +[:mouse_move, 556, 45, 2, 120, 229] +[:mouse_move, 560, 45, 2, 121, 230] +[:mouse_move, 566, 45, 2, 122, 231] +[:mouse_move, 570, 45, 2, 123, 232] +[:mouse_move, 577, 45, 2, 124, 233] +[:mouse_move, 585, 45, 2, 125, 234] +[:mouse_move, 593, 46, 2, 126, 235] +[:mouse_move, 602, 48, 2, 127, 236] +[:mouse_move, 609, 48, 2, 128, 237] +[:mouse_move, 614, 48, 2, 129, 238] +[:mouse_move, 619, 48, 2, 130, 239] +[:mouse_move, 625, 49, 2, 131, 240] +[:mouse_move, 633, 49, 2, 132, 241] +[:mouse_move, 643, 49, 2, 133, 242] +[:mouse_move, 651, 49, 2, 134, 243] +[:mouse_move, 658, 49, 2, 135, 243] +[:mouse_move, 664, 49, 2, 136, 244] +[:mouse_move, 669, 49, 2, 137, 245] +[:mouse_move, 675, 49, 2, 138, 246] +[:mouse_move, 679, 49, 2, 139, 247] +[:mouse_move, 682, 49, 2, 140, 248] +[:mouse_move, 686, 49, 2, 141, 249] +[:mouse_move, 689, 49, 2, 142, 250] +[:mouse_move, 691, 49, 2, 143, 251] +[:mouse_move, 697, 49, 2, 144, 252] +[:mouse_move, 706, 49, 2, 145, 253] +[:mouse_move, 715, 49, 2, 146, 254] +[:mouse_move, 723, 49, 2, 147, 255] +[:mouse_move, 730, 49, 2, 148, 256] +[:mouse_move, 733, 49, 2, 149, 256] +[:mouse_move, 734, 49, 2, 150, 257] +[:mouse_move, 737, 49, 2, 151, 258] +[:mouse_move, 742, 49, 2, 152, 259] +[:mouse_move, 749, 49, 2, 153, 260] +[:mouse_move, 755, 49, 2, 154, 261] +[:mouse_move, 758, 49, 2, 155, 262] +[:mouse_move, 760, 49, 2, 156, 263] +[:mouse_move, 761, 49, 2, 157, 264] +[:mouse_move, 762, 49, 2, 158, 266] +[:mouse_move, 763, 49, 2, 159, 268] +[:mouse_move, 763, 48, 2, 160, 269] +[:mouse_move, 757, 48, 2, 161, 290] +[:mouse_move, 746, 48, 2, 162, 291] +[:mouse_move, 732, 48, 2, 163, 291] +[:mouse_move, 716, 48, 2, 164, 292] +[:mouse_move, 698, 48, 2, 165, 293] +[:mouse_move, 684, 47, 2, 166, 294] +[:mouse_move, 673, 46, 2, 167, 295] +[:mouse_move, 665, 44, 2, 168, 296] +[:mouse_move, 660, 44, 2, 169, 297] +[:mouse_move, 656, 44, 2, 170, 297] +[:mouse_move, 652, 44, 2, 171, 298] +[:mouse_move, 648, 44, 2, 172, 299] +[:mouse_move, 637, 44, 2, 173, 300] +[:mouse_move, 628, 44, 2, 174, 301] +[:mouse_move, 618, 44, 2, 175, 302] +[:mouse_move, 609, 44, 2, 176, 303] +[:mouse_move, 602, 44, 2, 177, 304] +[:mouse_move, 598, 43, 2, 178, 305] +[:mouse_move, 596, 43, 2, 179, 306] +[:mouse_move, 595, 43, 2, 180, 307] +[:mouse_move, 594, 42, 2, 181, 308] +[:mouse_move, 593, 42, 2, 182, 308] +[:mouse_move, 591, 42, 2, 183, 309] +[:mouse_move, 588, 42, 2, 184, 310] +[:mouse_move, 586, 42, 2, 185, 311] +[:mouse_move, 584, 42, 2, 186, 312] +[:mouse_move, 582, 42, 2, 187, 313] +[:mouse_move, 576, 42, 2, 188, 314] +[:mouse_move, 570, 42, 2, 189, 315] +[:mouse_move, 562, 42, 2, 190, 316] +[:mouse_move, 554, 42, 2, 191, 317] +[:mouse_move, 547, 42, 2, 192, 318] +[:mouse_move, 537, 42, 2, 193, 319] +[:mouse_move, 532, 42, 2, 194, 320] +[:mouse_move, 528, 42, 2, 195, 321] +[:mouse_move, 527, 42, 2, 196, 322] +[:mouse_move, 526, 42, 2, 197, 323] +[:mouse_move, 525, 42, 2, 198, 324] +[:mouse_move, 524, 42, 2, 199, 325] +[:mouse_move, 522, 42, 2, 200, 326] +[:mouse_move, 521, 42, 2, 201, 327] +[:mouse_move, 520, 42, 2, 202, 328] +[:mouse_move, 519, 42, 2, 203, 329] +[:mouse_move, 516, 42, 2, 204, 330] +[:mouse_move, 513, 42, 2, 205, 331] +[:mouse_move, 512, 42, 2, 206, 332] +[:mouse_move, 509, 42, 2, 207, 333] +[:mouse_move, 497, 42, 2, 208, 334] +[:mouse_move, 490, 42, 2, 209, 335] +[:mouse_move, 486, 42, 2, 210, 336] +[:mouse_move, 483, 42, 2, 211, 337] +[:mouse_move, 482, 42, 2, 212, 338] +[:mouse_move, 481, 42, 2, 213, 339] +[:mouse_button_up, 1, 0, 1, 214, 354] +[:mouse_move, 484, 43, 2, 215, 361] +[:mouse_move, 497, 47, 2, 216, 362] +[:mouse_move, 513, 51, 2, 217, 363] +[:mouse_move, 530, 55, 2, 218, 364] +[:mouse_move, 544, 58, 2, 219, 365] +[:mouse_move, 562, 63, 2, 220, 366] +[:mouse_move, 589, 71, 2, 221, 367] +[:mouse_move, 623, 81, 2, 222, 368] +[:mouse_move, 656, 91, 2, 223, 369] +[:mouse_move, 687, 95, 2, 224, 370] +[:mouse_move, 731, 102, 2, 225, 371] +[:mouse_move, 762, 110, 2, 226, 372] +[:mouse_move, 792, 117, 2, 227, 373] +[:mouse_move, 819, 123, 2, 228, 374] +[:key_down_raw, 96, 0, 2, 229, 375] +[:mouse_move, 842, 125, 2, 230, 375] +[:mouse_move, 859, 128, 2, 231, 376] +[:mouse_move, 871, 130, 2, 232, 377] +[:mouse_move, 878, 131, 2, 233, 378] +[:mouse_move, 879, 131, 2, 234, 379] +[:key_up_raw, 96, 0, 2, 235, 379] +[:mouse_move, 878, 131, 2, 236, 411] +[:key_down_raw, 13, 0, 2, 237, 435] diff --git a/samples/13_path_finding_algorithms/03_breadcrumbs/app/main.rb b/samples/13_path_finding_algorithms/03_breadcrumbs/app/main.rb index 648805a..533a962 100644 --- a/samples/13_path_finding_algorithms/03_breadcrumbs/app/main.rb +++ b/samples/13_path_finding_algorithms/03_breadcrumbs/app/main.rb @@ -12,8 +12,8 @@ class Breadcrumbs calc # Calc Path end - render - input + render + input end def defaults @@ -90,7 +90,7 @@ class Breadcrumbs [24, 9] => true, [25, 8] => true, [25, 9] => true, - } + } # Variables that are used by the breadth first search # Storing cells that the search has visited, prevents unnecessary steps @@ -109,36 +109,36 @@ class Breadcrumbs # We store this value, because we want to remember the value even when # the user's cursor is no longer over what they're interacting with, but # they are still clicking down on the mouse. - state.current_input ||= :none + state.current_input ||= :none end def calc # Setup the search to start from the star - search.frontier << grid.star + search.frontier << grid.star search.came_from[grid.star] = nil # Until there are no more cells to expand from - until search.frontier.empty? + until search.frontier.empty? # Takes the next frontier cell - new_frontier = search.frontier.shift + new_frontier = search.frontier.shift # For each of its neighbors - adjacent_neighbors(new_frontier).each do |neighbor| + adjacent_neighbors(new_frontier).each do |neighbor| # That have not been visited and are not walls - unless search.came_from.has_key?(neighbor) || grid.walls.has_key?(neighbor) + unless search.came_from.has_key?(neighbor) || grid.walls.has_key?(neighbor) # Add them to the frontier and mark them as visited in the first grid # Unless the target has been visited # Add the neighbor to the frontier and remember which cell it came from - search.frontier << neighbor + search.frontier << neighbor search.came_from[neighbor] = new_frontier end end end end - + # Draws everything onto the screen def render - render_background + render_background # render_heat_map render_walls # render_path @@ -157,7 +157,7 @@ class Breadcrumbs if current_cell && parent_cell outputs.lines << [(current_cell.x + 0.5) * grid.cell_size, (current_cell.y + 0.5) * grid.cell_size, (parent_cell.x + 0.5) * grid.cell_size, (parent_cell.y + 0.5) * grid.cell_size, purple] - + end render_trail(parent_cell) end @@ -183,8 +183,8 @@ class Breadcrumbs # Draws what the grid looks like with nothing on it def render_background - render_unvisited - render_grid_lines + render_unvisited + render_grid_lines end # Draws both grids @@ -199,7 +199,7 @@ class Breadcrumbs end for y in 0..grid.height - outputs.lines << horizontal_line(y) + outputs.lines << horizontal_line(y) end end @@ -215,7 +215,7 @@ class Breadcrumbs # Draws the walls on both grids def render_walls - grid.walls.each_key do |wall| + grid.walls.each_key do |wall| outputs.solids << [scale_up(wall), wall_color] end end @@ -223,12 +223,12 @@ class Breadcrumbs # Renders the star on both grids def render_star outputs.sprites << [scale_up(grid.star), 'star.png'] - end + end # Renders the target on both grids def render_target outputs.sprites << [scale_up(grid.target), 'target.png'] - end + end # Labels the grids def render_labels @@ -288,14 +288,14 @@ class Breadcrumbs # The program has to remember that the user is dragging an object # even when the mouse is no longer over that object # So detecting input and processing input is separate - # detect_input - # process_input + # detect_input + # process_input if inputs.mouse.up state.current_input = :none elsif star_clicked? state.current_input = :star end - + if mouse_inside_grid? unless grid.target == cell_closest_to_mouse grid.target = cell_closest_to_mouse @@ -313,33 +313,33 @@ class Breadcrumbs # mouse left click is held def detect_input # When the mouse is up, nothing is being edited - if inputs.mouse.up - state.current_input = :none + if inputs.mouse.up + state.current_input = :none # When the star in the no second grid is clicked - elsif star_clicked? - state.current_input = :star + elsif star_clicked? + state.current_input = :star # When the target in the no second grid is clicked - elsif target_clicked? - state.current_input = :target + elsif target_clicked? + state.current_input = :target # When a wall in the first grid is clicked - elsif wall_clicked? - state.current_input = :remove_wall + elsif wall_clicked? + state.current_input = :remove_wall # When the first grid is clicked - elsif grid_clicked? + elsif grid_clicked? state.current_input = :add_wall end end # Processes click and drag based on what the user is currently dragging def process_input - if state.current_input == :star - input_star - elsif state.current_input == :target - input_target - elsif state.current_input == :remove_wall - input_remove_wall - elsif state.current_input == :add_wall - input_add_wall + if state.current_input == :star + input_star + elsif state.current_input == :target + input_target + elsif state.current_input == :remove_wall + input_remove_wall + elsif state.current_input == :add_wall + input_add_wall end end @@ -347,10 +347,10 @@ class Breadcrumbs # Only resets the search if the star changes position # Called whenever the user is editing the star (puts mouse down on star) def input_star - old_star = grid.star.clone + old_star = grid.star.clone grid.star = cell_closest_to_mouse - unless old_star == grid.star - reset_search + unless old_star == grid.star + reset_search end end @@ -358,10 +358,10 @@ class Breadcrumbs # Only reset_searchs the search if the target changes position # Called whenever the user is editing the target (puts mouse down on target) def input_target - old_target = grid.target.clone + old_target = grid.target.clone grid.target = cell_closest_to_mouse - unless old_target == grid.target - reset_search + unless old_target == grid.target + reset_search end end @@ -370,32 +370,32 @@ class Breadcrumbs # The mouse needs to be inside the grid, because we only want to remove walls # the cursor is directly over # Recalculations should only occur when a wall is actually deleted - if mouse_inside_grid? + if mouse_inside_grid? if grid.walls.has_key?(cell_closest_to_mouse) - grid.walls.delete(cell_closest_to_mouse) - reset_search + grid.walls.delete(cell_closest_to_mouse) + reset_search end end end # Adds a wall in the first grid in the cell the mouse is over def input_add_wall - if mouse_inside_grid? + if mouse_inside_grid? unless grid.walls.has_key?(cell_closest_to_mouse) - grid.walls[cell_closest_to_mouse] = true - reset_search + grid.walls[cell_closest_to_mouse] = true + reset_search end end end - + # Whenever the user edits the grid, # The search has to be reset_searchd upto the current step # with the current grid as the initial state of the grid def reset_search # Reset_Searchs the search - search.frontier = [] - search.came_from = {} + search.frontier = [] + search.came_from = {} search.path = {} end @@ -403,21 +403,21 @@ class Breadcrumbs # Returns a list of adjacent cells # Used to determine what the next cells to be added to the frontier are def adjacent_neighbors(cell) - neighbors = [] + neighbors = [] # Gets all the valid neighbors into the array # From southern neighbor, clockwise - neighbors << [cell.x, cell.y - 1] unless cell.y == 0 - neighbors << [cell.x - 1, cell.y] unless cell.x == 0 - neighbors << [cell.x, cell.y + 1] unless cell.y == grid.height - 1 - neighbors << [cell.x + 1, cell.y] unless cell.x == grid.width - 1 + neighbors << [cell.x, cell.y - 1] unless cell.y == 0 + neighbors << [cell.x - 1, cell.y] unless cell.x == 0 + neighbors << [cell.x, cell.y + 1] unless cell.y == grid.height - 1 + neighbors << [cell.x + 1, cell.y] unless cell.x == grid.width - 1 # Sorts the neighbors so the rendered path is a zigzag path # Cells in a diagonal direction are given priority # Comment this line to see the difference neighbors = neighbors.sort_by { |neighbor_x, neighbor_y| proximity_to_star(neighbor_x, neighbor_y) } - neighbors + neighbors end # Finds the vertical and horizontal distance of a cell from the star @@ -442,13 +442,13 @@ class Breadcrumbs # Finding the cell closest to the mouse helps with this def cell_closest_to_mouse # Closest cell to the mouse in the first grid - x = (inputs.mouse.point.x / grid.cell_size).to_i - y = (inputs.mouse.point.y / grid.cell_size).to_i + x = (inputs.mouse.point.x / grid.cell_size).to_i + y = (inputs.mouse.point.y / grid.cell_size).to_i # Bound x and y to the grid - x = grid.width - 1 if x > grid.width - 1 - y = grid.height - 1 if y > grid.height - 1 + x = grid.width - 1 if x > grid.width - 1 + y = grid.height - 1 if y > grid.height - 1 # Return closest cell - [x, y] + [x, y] end # Signal that the user is going to be moving the star from the first grid @@ -476,13 +476,13 @@ class Breadcrumbs # Light brown def unvisited_color - [221, 212, 213] + [221, 212, 213] # [255, 255, 255] end # Camo Green def wall_color - [134, 134, 120] + [134, 134, 120] end # Pastel White @@ -520,7 +520,7 @@ def tick args end # Every tick, new args are passed, and the Breadth First Search tick is called - $breadcrumbs ||= Breadcrumbs.new(args) + $breadcrumbs ||= Breadcrumbs.new $breadcrumbs.args = args $breadcrumbs.tick end diff --git a/samples/13_path_finding_algorithms/03_breadcrumbs/replay.txt b/samples/13_path_finding_algorithms/03_breadcrumbs/replay.txt new file mode 100644 index 0000000..4e98cf7 --- /dev/null +++ b/samples/13_path_finding_algorithms/03_breadcrumbs/replay.txt @@ -0,0 +1,365 @@ +replay_version 2.0 +stopped_at 211 +seed 100 +recorded_at 2021-11-20 11:18:41 -0600 +[:mouse_button_up, 1, 0, 1, 1, 1] +[:mouse_move, 778, 91, 2, 2, 7] +[:mouse_move, 778, 90, 2, 3, 7] +[:mouse_move, 773, 94, 2, 4, 10] +[:mouse_move, 748, 101, 2, 5, 11] +[:mouse_move, 704, 112, 2, 6, 11] +[:mouse_move, 656, 127, 2, 7, 11] +[:mouse_move, 617, 138, 2, 8, 12] +[:mouse_move, 595, 142, 2, 9, 12] +[:mouse_move, 582, 143, 2, 10, 13] +[:mouse_move, 574, 143, 2, 11, 13] +[:mouse_move, 561, 144, 2, 12, 13] +[:mouse_move, 550, 148, 2, 13, 13] +[:mouse_move, 536, 155, 2, 14, 14] +[:mouse_move, 519, 162, 2, 15, 14] +[:mouse_move, 497, 168, 2, 16, 14] +[:mouse_move, 475, 174, 2, 17, 15] +[:mouse_move, 450, 179, 2, 18, 15] +[:mouse_move, 420, 188, 2, 19, 15] +[:mouse_move, 385, 200, 2, 20, 16] +[:mouse_move, 350, 219, 2, 21, 16] +[:mouse_move, 317, 239, 2, 22, 16] +[:mouse_move, 278, 272, 2, 23, 17] +[:mouse_move, 251, 292, 2, 24, 17] +[:mouse_move, 229, 314, 2, 25, 17] +[:mouse_move, 213, 335, 2, 26, 18] +[:mouse_move, 205, 355, 2, 27, 18] +[:mouse_move, 201, 375, 2, 28, 19] +[:mouse_move, 199, 394, 2, 29, 19] +[:mouse_move, 199, 409, 2, 30, 20] +[:mouse_move, 199, 419, 2, 31, 20] +[:mouse_move, 198, 427, 2, 32, 20] +[:mouse_move, 198, 434, 2, 33, 20] +[:mouse_move, 198, 441, 2, 34, 21] +[:mouse_move, 198, 453, 2, 35, 21] +[:mouse_move, 197, 457, 2, 36, 21] +[:mouse_move, 188, 464, 2, 37, 22] +[:mouse_move, 178, 470, 2, 38, 22] +[:mouse_move, 169, 477, 2, 39, 22] +[:mouse_move, 161, 484, 2, 40, 23] +[:mouse_move, 148, 491, 2, 41, 23] +[:mouse_move, 128, 499, 2, 42, 24] +[:mouse_move, 109, 509, 2, 43, 24] +[:mouse_move, 94, 521, 2, 44, 25] +[:mouse_move, 86, 530, 2, 45, 25] +[:mouse_move, 80, 540, 2, 46, 25] +[:mouse_move, 76, 550, 2, 47, 25] +[:mouse_move, 76, 552, 2, 48, 26] +[:mouse_move, 77, 555, 2, 49, 26] +[:mouse_move, 78, 556, 2, 50, 27] +[:mouse_move, 86, 560, 2, 51, 27] +[:mouse_move, 99, 564, 2, 52, 27] +[:mouse_move, 111, 568, 2, 53, 27] +[:mouse_move, 125, 571, 2, 54, 28] +[:mouse_move, 142, 572, 2, 55, 28] +[:mouse_move, 164, 572, 2, 56, 29] +[:mouse_move, 190, 572, 2, 57, 29] +[:mouse_move, 215, 572, 2, 58, 29] +[:mouse_move, 249, 568, 2, 59, 30] +[:mouse_move, 271, 565, 2, 60, 30] +[:mouse_move, 288, 563, 2, 61, 31] +[:mouse_move, 303, 561, 2, 62, 31] +[:mouse_move, 314, 559, 2, 63, 31] +[:mouse_move, 323, 556, 2, 64, 31] +[:mouse_move, 330, 553, 2, 65, 32] +[:mouse_move, 335, 550, 2, 66, 32] +[:mouse_move, 342, 547, 2, 67, 32] +[:mouse_move, 351, 543, 2, 68, 33] +[:mouse_move, 359, 538, 2, 69, 33] +[:mouse_move, 370, 533, 2, 70, 34] +[:mouse_move, 393, 521, 2, 71, 34] +[:mouse_move, 412, 511, 2, 72, 34] +[:mouse_move, 432, 503, 2, 73, 35] +[:mouse_move, 451, 497, 2, 74, 35] +[:mouse_move, 468, 493, 2, 75, 35] +[:mouse_move, 479, 492, 2, 76, 36] +[:mouse_move, 487, 490, 2, 77, 36] +[:mouse_move, 494, 489, 2, 78, 37] +[:mouse_move, 501, 489, 2, 79, 37] +[:mouse_move, 506, 487, 2, 80, 37] +[:mouse_move, 507, 487, 2, 81, 38] +[:mouse_move, 508, 486, 2, 82, 38] +[:mouse_move, 502, 486, 2, 83, 38] +[:mouse_move, 500, 486, 2, 84, 39] +[:mouse_move, 496, 487, 2, 85, 39] +[:mouse_move, 491, 489, 2, 86, 40] +[:mouse_move, 492, 489, 2, 87, 45] +[:mouse_move, 499, 487, 2, 88, 46] +[:mouse_move, 509, 484, 2, 89, 46] +[:mouse_move, 526, 480, 2, 90, 46] +[:mouse_move, 548, 475, 2, 91, 47] +[:mouse_move, 580, 468, 2, 92, 47] +[:mouse_move, 598, 465, 2, 93, 47] +[:mouse_move, 615, 461, 2, 94, 48] +[:mouse_move, 628, 459, 2, 95, 48] +[:mouse_move, 636, 459, 2, 96, 49] +[:mouse_move, 641, 459, 2, 97, 49] +[:mouse_move, 645, 459, 2, 98, 49] +[:mouse_move, 647, 459, 2, 99, 50] +[:mouse_move, 648, 459, 2, 100, 50] +[:mouse_move, 650, 459, 2, 101, 51] +[:mouse_move, 651, 459, 2, 102, 51] +[:mouse_move, 652, 459, 2, 103, 52] +[:mouse_move, 655, 459, 2, 104, 52] +[:mouse_move, 661, 459, 2, 105, 52] +[:mouse_move, 667, 459, 2, 106, 53] +[:mouse_move, 674, 459, 2, 107, 53] +[:mouse_move, 680, 460, 2, 108, 54] +[:mouse_move, 687, 461, 2, 109, 54] +[:mouse_move, 695, 462, 2, 110, 54] +[:mouse_move, 699, 463, 2, 111, 55] +[:mouse_move, 700, 463, 2, 112, 55] +[:mouse_move, 702, 463, 2, 113, 56] +[:mouse_move, 705, 463, 2, 114, 56] +[:mouse_move, 709, 464, 2, 115, 56] +[:mouse_move, 714, 464, 2, 116, 57] +[:mouse_move, 718, 464, 2, 117, 57] +[:mouse_move, 721, 464, 2, 118, 57] +[:mouse_move, 723, 464, 2, 119, 58] +[:mouse_move, 726, 465, 2, 120, 58] +[:mouse_move, 729, 465, 2, 121, 59] +[:mouse_move, 731, 465, 2, 122, 59] +[:mouse_move, 732, 465, 2, 123, 60] +[:mouse_move, 733, 465, 2, 124, 61] +[:mouse_move, 734, 465, 2, 125, 61] +[:mouse_move, 737, 465, 2, 126, 61] +[:mouse_move, 739, 465, 2, 127, 62] +[:mouse_move, 743, 465, 2, 128, 62] +[:mouse_move, 751, 467, 2, 129, 62] +[:mouse_move, 761, 469, 2, 130, 63] +[:mouse_move, 772, 469, 2, 131, 63] +[:mouse_move, 782, 469, 2, 132, 63] +[:mouse_move, 793, 471, 2, 133, 64] +[:mouse_move, 808, 471, 2, 134, 64] +[:mouse_move, 818, 472, 2, 135, 64] +[:mouse_move, 829, 473, 2, 136, 65] +[:mouse_move, 839, 475, 2, 137, 65] +[:mouse_move, 849, 477, 2, 138, 66] +[:mouse_move, 861, 479, 2, 139, 66] +[:mouse_move, 876, 480, 2, 140, 66] +[:mouse_move, 893, 480, 2, 141, 67] +[:mouse_move, 912, 480, 2, 142, 67] +[:mouse_move, 933, 482, 2, 143, 68] +[:mouse_move, 952, 482, 2, 144, 68] +[:mouse_move, 967, 482, 2, 145, 68] +[:mouse_move, 983, 482, 2, 146, 68] +[:mouse_move, 1007, 482, 2, 147, 69] +[:mouse_move, 1021, 482, 2, 148, 69] +[:mouse_move, 1031, 482, 2, 149, 70] +[:mouse_move, 1041, 482, 2, 150, 70] +[:mouse_move, 1045, 482, 2, 151, 71] +[:mouse_move, 1049, 481, 2, 152, 71] +[:mouse_move, 1052, 481, 2, 153, 71] +[:mouse_move, 1053, 481, 2, 154, 71] +[:mouse_move, 1054, 481, 2, 155, 72] +[:mouse_move, 1055, 480, 2, 156, 73] +[:mouse_move, 1057, 480, 2, 157, 73] +[:mouse_move, 1060, 479, 2, 158, 74] +[:mouse_move, 1062, 479, 2, 159, 74] +[:mouse_move, 1063, 478, 2, 160, 75] +[:mouse_move, 1064, 478, 2, 161, 75] +[:mouse_move, 1065, 478, 2, 162, 77] +[:mouse_move, 1066, 478, 2, 163, 77] +[:mouse_move, 1067, 478, 2, 164, 78] +[:mouse_move, 1069, 478, 2, 165, 83] +[:mouse_move, 1074, 477, 2, 166, 84] +[:mouse_move, 1082, 476, 2, 167, 84] +[:mouse_move, 1093, 469, 2, 168, 85] +[:mouse_move, 1106, 459, 2, 169, 85] +[:mouse_move, 1117, 447, 2, 170, 85] +[:mouse_move, 1125, 433, 2, 171, 85] +[:mouse_move, 1130, 414, 2, 172, 85] +[:mouse_move, 1130, 382, 2, 173, 86] +[:mouse_move, 1127, 358, 2, 174, 86] +[:mouse_move, 1119, 333, 2, 175, 87] +[:mouse_move, 1109, 309, 2, 176, 87] +[:mouse_move, 1102, 293, 2, 177, 87] +[:mouse_move, 1094, 280, 2, 178, 88] +[:mouse_move, 1089, 272, 2, 179, 88] +[:mouse_move, 1087, 264, 2, 180, 89] +[:mouse_move, 1086, 258, 2, 181, 89] +[:mouse_move, 1086, 248, 2, 182, 89] +[:mouse_move, 1084, 241, 2, 183, 89] +[:mouse_move, 1084, 240, 2, 184, 90] +[:mouse_button_pressed, 1, 0, 1, 185, 95] +[:mouse_button_up, 1, 0, 1, 186, 97] +[:mouse_move, 1086, 251, 2, 187, 105] +[:mouse_move, 1086, 267, 2, 188, 105] +[:mouse_move, 1087, 287, 2, 189, 106] +[:mouse_move, 1087, 310, 2, 190, 106] +[:mouse_move, 1087, 339, 2, 191, 107] +[:mouse_move, 1078, 387, 2, 192, 107] +[:mouse_move, 1064, 422, 2, 193, 107] +[:mouse_move, 1050, 449, 2, 194, 108] +[:mouse_move, 1033, 470, 2, 195, 108] +[:mouse_move, 1015, 485, 2, 196, 108] +[:mouse_move, 995, 494, 2, 197, 109] +[:mouse_move, 973, 500, 2, 198, 109] +[:mouse_move, 955, 505, 2, 199, 109] +[:mouse_move, 936, 506, 2, 200, 110] +[:mouse_move, 919, 510, 2, 201, 110] +[:mouse_move, 906, 510, 2, 202, 110] +[:mouse_move, 891, 513, 2, 203, 111] +[:mouse_move, 873, 516, 2, 204, 111] +[:mouse_move, 854, 520, 2, 205, 111] +[:mouse_move, 843, 522, 2, 206, 112] +[:mouse_move, 830, 525, 2, 207, 112] +[:mouse_move, 816, 526, 2, 208, 112] +[:mouse_move, 804, 527, 2, 209, 113] +[:mouse_move, 794, 527, 2, 210, 113] +[:mouse_move, 784, 527, 2, 211, 114] +[:mouse_move, 775, 526, 2, 212, 114] +[:mouse_move, 765, 522, 2, 213, 114] +[:mouse_move, 755, 518, 2, 214, 115] +[:mouse_move, 746, 513, 2, 215, 115] +[:mouse_move, 732, 505, 2, 216, 116] +[:mouse_move, 706, 483, 2, 217, 116] +[:mouse_move, 694, 463, 2, 218, 116] +[:mouse_move, 689, 446, 2, 219, 116] +[:mouse_move, 689, 429, 2, 220, 117] +[:mouse_move, 689, 409, 2, 221, 117] +[:mouse_move, 689, 388, 2, 222, 118] +[:mouse_move, 689, 361, 2, 223, 118] +[:mouse_move, 683, 327, 2, 224, 119] +[:mouse_move, 677, 295, 2, 225, 119] +[:mouse_move, 666, 266, 2, 226, 119] +[:mouse_move, 656, 245, 2, 227, 119] +[:mouse_move, 650, 233, 2, 228, 120] +[:mouse_move, 640, 215, 2, 229, 120] +[:mouse_move, 630, 203, 2, 230, 121] +[:mouse_move, 612, 189, 2, 231, 121] +[:mouse_move, 586, 178, 2, 232, 121] +[:mouse_move, 553, 168, 2, 233, 121] +[:mouse_move, 528, 166, 2, 234, 122] +[:mouse_move, 510, 165, 2, 235, 122] +[:mouse_move, 498, 165, 2, 236, 123] +[:mouse_move, 482, 165, 2, 237, 123] +[:mouse_move, 466, 165, 2, 238, 123] +[:mouse_move, 450, 165, 2, 239, 124] +[:mouse_move, 426, 165, 2, 240, 124] +[:mouse_move, 416, 165, 2, 241, 125] +[:mouse_move, 411, 166, 2, 242, 125] +[:mouse_move, 407, 168, 2, 243, 126] +[:mouse_move, 405, 169, 2, 244, 126] +[:mouse_move, 400, 172, 2, 245, 126] +[:mouse_move, 391, 178, 2, 246, 126] +[:mouse_move, 381, 185, 2, 247, 127] +[:mouse_move, 368, 195, 2, 248, 127] +[:mouse_move, 355, 207, 2, 249, 128] +[:mouse_move, 345, 223, 2, 250, 128] +[:mouse_move, 343, 243, 2, 251, 128] +[:mouse_move, 343, 273, 2, 252, 129] +[:mouse_move, 343, 290, 2, 253, 129] +[:mouse_move, 343, 308, 2, 254, 129] +[:mouse_move, 342, 326, 2, 255, 130] +[:mouse_move, 340, 343, 2, 256, 130] +[:mouse_move, 339, 363, 2, 257, 130] +[:mouse_move, 339, 384, 2, 258, 131] +[:mouse_move, 339, 407, 2, 259, 131] +[:mouse_move, 338, 427, 2, 260, 132] +[:mouse_move, 333, 446, 2, 261, 132] +[:mouse_move, 330, 463, 2, 262, 132] +[:mouse_move, 325, 477, 2, 263, 133] +[:mouse_move, 317, 488, 2, 264, 133] +[:mouse_move, 313, 494, 2, 265, 133] +[:mouse_move, 308, 500, 2, 266, 134] +[:mouse_move, 302, 511, 2, 267, 134] +[:mouse_move, 295, 522, 2, 268, 135] +[:mouse_move, 285, 535, 2, 269, 135] +[:mouse_move, 277, 547, 2, 270, 135] +[:mouse_move, 267, 558, 2, 271, 136] +[:mouse_move, 259, 568, 2, 272, 136] +[:mouse_move, 250, 574, 2, 273, 137] +[:mouse_move, 241, 580, 2, 274, 137] +[:mouse_move, 233, 586, 2, 275, 137] +[:mouse_move, 222, 593, 2, 276, 138] +[:mouse_move, 213, 599, 2, 277, 138] +[:mouse_move, 206, 606, 2, 278, 138] +[:mouse_move, 203, 615, 2, 279, 139] +[:mouse_move, 202, 622, 2, 280, 139] +[:mouse_move, 200, 625, 2, 281, 139] +[:mouse_move, 199, 627, 2, 282, 140] +[:mouse_move, 198, 628, 2, 283, 140] +[:mouse_move, 197, 628, 2, 284, 141] +[:mouse_move, 194, 630, 2, 285, 141] +[:mouse_move, 190, 632, 2, 286, 141] +[:mouse_move, 186, 633, 2, 287, 142] +[:mouse_move, 180, 635, 2, 288, 142] +[:mouse_move, 175, 636, 2, 289, 143] +[:mouse_move, 174, 636, 2, 290, 144] +[:mouse_move, 173, 636, 2, 291, 144] +[:mouse_move, 170, 636, 2, 292, 144] +[:mouse_move, 164, 636, 2, 293, 144] +[:mouse_move, 155, 636, 2, 294, 145] +[:mouse_move, 147, 634, 2, 295, 145] +[:mouse_move, 141, 634, 2, 296, 146] +[:mouse_move, 139, 634, 2, 297, 146] +[:mouse_move, 138, 634, 2, 298, 146] +[:mouse_move, 136, 634, 2, 299, 147] +[:mouse_move, 135, 633, 2, 300, 148] +[:mouse_move, 134, 633, 2, 301, 148] +[:mouse_move, 133, 633, 2, 302, 148] +[:key_down_raw, 96, 0, 2, 303, 159] +[:mouse_move, 134, 632, 2, 304, 160] +[:mouse_move, 138, 632, 2, 305, 161] +[:key_up_raw, 96, 0, 2, 306, 161] +[:mouse_move, 144, 630, 2, 307, 161] +[:mouse_move, 155, 628, 2, 308, 161] +[:mouse_move, 170, 623, 2, 309, 161] +[:mouse_move, 189, 618, 2, 310, 161] +[:mouse_move, 213, 611, 2, 311, 162] +[:mouse_move, 243, 600, 2, 312, 162] +[:mouse_move, 281, 586, 2, 313, 163] +[:mouse_move, 330, 565, 2, 314, 163] +[:mouse_move, 400, 533, 2, 315, 163] +[:mouse_move, 476, 492, 2, 316, 164] +[:mouse_move, 564, 445, 2, 317, 164] +[:mouse_move, 703, 362, 2, 318, 164] +[:mouse_move, 797, 306, 2, 319, 165] +[:mouse_move, 872, 251, 2, 320, 165] +[:mouse_move, 951, 196, 2, 321, 165] +[:mouse_move, 1012, 147, 2, 322, 166] +[:mouse_move, 1058, 112, 2, 323, 166] +[:mouse_move, 1085, 87, 2, 324, 166] +[:mouse_move, 1100, 67, 2, 325, 166] +[:mouse_move, 1111, 51, 2, 326, 167] +[:mouse_move, 1117, 42, 2, 327, 167] +[:mouse_move, 1118, 39, 2, 328, 168] +[:mouse_move, 1110, 35, 2, 329, 170] +[:mouse_move, 1101, 34, 2, 330, 171] +[:mouse_move, 1095, 34, 2, 331, 171] +[:mouse_move, 1087, 34, 2, 332, 171] +[:mouse_move, 1076, 34, 2, 333, 172] +[:mouse_move, 1064, 34, 2, 334, 172] +[:mouse_move, 1045, 38, 2, 335, 172] +[:mouse_move, 1031, 42, 2, 336, 172] +[:mouse_move, 1018, 45, 2, 337, 173] +[:mouse_move, 1002, 50, 2, 338, 173] +[:mouse_move, 978, 53, 2, 339, 173] +[:mouse_move, 947, 54, 2, 340, 174] +[:mouse_move, 908, 54, 2, 341, 174] +[:mouse_move, 864, 54, 2, 342, 174] +[:mouse_move, 830, 54, 2, 343, 174] +[:mouse_move, 810, 58, 2, 344, 175] +[:mouse_move, 807, 59, 2, 345, 175] +[:mouse_move, 808, 59, 2, 346, 177] +[:mouse_move, 810, 61, 2, 347, 178] +[:mouse_move, 814, 65, 2, 348, 178] +[:mouse_move, 816, 66, 2, 349, 178] +[:mouse_move, 818, 69, 2, 350, 178] +[:mouse_move, 819, 71, 2, 351, 179] +[:mouse_move, 820, 73, 2, 352, 179] +[:mouse_move, 820, 74, 2, 353, 179] +[:mouse_move, 819, 75, 2, 354, 183] +[:mouse_move, 817, 77, 2, 355, 183] +[:mouse_move, 814, 81, 2, 356, 184] +[:mouse_move, 810, 84, 2, 357, 184] +[:mouse_move, 809, 85, 2, 358, 184] +[:mouse_move, 810, 85, 2, 359, 211] +[:key_down_raw, 13, 0, 2, 360, 211] +[:mouse_move, 811, 85, 2, 361, 211] diff --git a/samples/13_path_finding_algorithms/04_early_exit/app/main.rb b/samples/13_path_finding_algorithms/04_early_exit/app/main.rb index 1e9305b..40a3ba5 100644 --- a/samples/13_path_finding_algorithms/04_early_exit/app/main.rb +++ b/samples/13_path_finding_algorithms/04_early_exit/app/main.rb @@ -26,8 +26,8 @@ class EarlyExitBreadthFirstSearch # And calculate the path calc_path end - render - input + render + input end def defaults @@ -43,14 +43,14 @@ class EarlyExitBreadthFirstSearch # This step is roughly the grid's width * height # When anim_steps equals max_steps no more calculations will occur # and the slider will be at the end - state.max_steps ||= args.state.grid.width * args.state.grid.height + state.max_steps ||= args.state.grid.width * args.state.grid.height # The location of the star and walls of the grid # They can be modified to have a different initial grid # Walls are stored in a hash for quick look up when doing the search state.star ||= [2, 8] state.target ||= [10, 5] - state.walls ||= {} + state.walls ||= {} # Variables that are used by the breadth first search # Storing cells that the search has visited, prevents unnecessary steps @@ -73,12 +73,12 @@ class EarlyExitBreadthFirstSearch # We store this value, because we want to remember the value even when # the user's cursor is no longer over what they're interacting with, but # they are still clicking down on the mouse. - state.current_input ||= :none + state.current_input ||= :none end # Draws everything onto the screen def render - render_background + render_background render_heat_map render_walls render_path @@ -91,8 +91,8 @@ class EarlyExitBreadthFirstSearch # Draws what the grid looks like with nothing on it def render_background - render_unvisited - render_grid_lines + render_unvisited + render_grid_lines end # Draws both grids @@ -109,7 +109,7 @@ class EarlyExitBreadthFirstSearch end for y in 0..grid.height - outputs.lines << horizontal_line(y) + outputs.lines << horizontal_line(y) outputs.lines << early_exit_horizontal_line(y) end end @@ -136,7 +136,7 @@ class EarlyExitBreadthFirstSearch # Draws the walls on both grids def render_walls - state.walls.each_key do |wall| + state.walls.each_key do |wall| outputs.solids << [scale_up(wall), wall_color] outputs.solids << [early_exit_scale_up(wall), wall_color] end @@ -146,13 +146,13 @@ class EarlyExitBreadthFirstSearch def render_star outputs.sprites << [scale_up(state.star), 'star.png'] outputs.sprites << [early_exit_scale_up(state.star), 'star.png'] - end + end # Renders the target on both grids def render_target outputs.sprites << [scale_up(state.target), 'target.png'] outputs.sprites << [early_exit_scale_up(state.target), 'target.png'] - end + end # Labels the grids def render_labels @@ -244,8 +244,8 @@ class EarlyExitBreadthFirstSearch # The program has to remember that the user is dragging an object # even when the mouse is no longer over that object # So detecting input and processing input is separate - detect_input - process_input + detect_input + process_input end # Determines what the user is editing and stores the value @@ -253,53 +253,53 @@ class EarlyExitBreadthFirstSearch # mouse left click is held def detect_input # When the mouse is up, nothing is being edited - if inputs.mouse.up - state.current_input = :none + if inputs.mouse.up + state.current_input = :none # When the star in the no second grid is clicked - elsif star_clicked? - state.current_input = :star + elsif star_clicked? + state.current_input = :star # When the star in the second grid is clicked - elsif star2_clicked? - state.current_input = :star2 + elsif star2_clicked? + state.current_input = :star2 # When the target in the no second grid is clicked - elsif target_clicked? - state.current_input = :target + elsif target_clicked? + state.current_input = :target # When the target in the second grid is clicked - elsif target2_clicked? - state.current_input = :target2 + elsif target2_clicked? + state.current_input = :target2 # When a wall in the first grid is clicked - elsif wall_clicked? - state.current_input = :remove_wall + elsif wall_clicked? + state.current_input = :remove_wall # When a wall in the second grid is clicked - elsif wall2_clicked? + elsif wall2_clicked? state.current_input = :remove_wall2 # When the first grid is clicked - elsif grid_clicked? + elsif grid_clicked? state.current_input = :add_wall # When the second grid is clicked - elsif grid2_clicked? + elsif grid2_clicked? state.current_input = :add_wall2 end end # Processes click and drag based on what the user is currently dragging def process_input - if state.current_input == :star - input_star + if state.current_input == :star + input_star elsif state.current_input == :star2 - input_star2 - elsif state.current_input == :target - input_target - elsif state.current_input == :target2 - input_target2 - elsif state.current_input == :remove_wall - input_remove_wall + input_star2 + elsif state.current_input == :target + input_target + elsif state.current_input == :target2 + input_target2 + elsif state.current_input == :remove_wall + input_remove_wall elsif state.current_input == :remove_wall2 - input_remove_wall2 - elsif state.current_input == :add_wall - input_add_wall - elsif state.current_input == :add_wall2 - input_add_wall2 + input_remove_wall2 + elsif state.current_input == :add_wall + input_add_wall + elsif state.current_input == :add_wall2 + input_add_wall2 end end @@ -307,10 +307,10 @@ class EarlyExitBreadthFirstSearch # Only resets the search if the star changes position # Called whenever the user is editing the star (puts mouse down on star) def input_star - old_star = state.star.clone + old_star = state.star.clone state.star = cell_closest_to_mouse - unless old_star == state.star - reset_search + unless old_star == state.star + reset_search end end @@ -318,10 +318,10 @@ class EarlyExitBreadthFirstSearch # Only resets the search if the star changes position # Called whenever the user is editing the star (puts mouse down on star) def input_star2 - old_star = state.star.clone + old_star = state.star.clone state.star = cell_closest_to_mouse2 - unless old_star == state.star - reset_search + unless old_star == state.star + reset_search end end @@ -329,10 +329,10 @@ class EarlyExitBreadthFirstSearch # Only reset_searchs the search if the target changes position # Called whenever the user is editing the target (puts mouse down on target) def input_target - old_target = state.target.clone + old_target = state.target.clone state.target = cell_closest_to_mouse - unless old_target == state.target - reset_search + unless old_target == state.target + reset_search end end @@ -340,10 +340,10 @@ class EarlyExitBreadthFirstSearch # Only reset_searchs the search if the target changes position # Called whenever the user is editing the target (puts mouse down on target) def input_target2 - old_target = state.target.clone + old_target = state.target.clone state.target = cell_closest_to_mouse2 - unless old_target == state.target - reset_search + unless old_target == state.target + reset_search end end @@ -352,10 +352,10 @@ class EarlyExitBreadthFirstSearch # The mouse needs to be inside the grid, because we only want to remove walls # the cursor is directly over # Recalculations should only occur when a wall is actually deleted - if mouse_inside_grid? + if mouse_inside_grid? if state.walls.has_key?(cell_closest_to_mouse) - state.walls.delete(cell_closest_to_mouse) - reset_search + state.walls.delete(cell_closest_to_mouse) + reset_search end end end @@ -365,31 +365,31 @@ class EarlyExitBreadthFirstSearch # The mouse needs to be inside the grid, because we only want to remove walls # the cursor is directly over # Recalculations should only occur when a wall is actually deleted - if mouse_inside_grid2? + if mouse_inside_grid2? if state.walls.has_key?(cell_closest_to_mouse2) - state.walls.delete(cell_closest_to_mouse2) - reset_search + state.walls.delete(cell_closest_to_mouse2) + reset_search end end end # Adds a wall in the first grid in the cell the mouse is over def input_add_wall - if mouse_inside_grid? + if mouse_inside_grid? unless state.walls.has_key?(cell_closest_to_mouse) - state.walls[cell_closest_to_mouse] = true - reset_search + state.walls[cell_closest_to_mouse] = true + reset_search end end end - + # Adds a wall in the second grid in the cell the mouse is over def input_add_wall2 - if mouse_inside_grid2? + if mouse_inside_grid2? unless state.walls.has_key?(cell_closest_to_mouse2) - state.walls[cell_closest_to_mouse2] = true - reset_search + state.walls[cell_closest_to_mouse2] = true + reset_search end end end @@ -399,10 +399,10 @@ class EarlyExitBreadthFirstSearch # with the current grid as the initial state of the grid def reset_search # Reset_Searchs the search - state.frontier = [] - state.visited = {} - state.early_exit_visited = {} - state.came_from = {} + state.frontier = [] + state.visited = {} + state.early_exit_visited = {} + state.came_from = {} state.path = {} end @@ -410,23 +410,23 @@ class EarlyExitBreadthFirstSearch def step # The setup to the search # Runs once when there are no visited cells - if state.visited.empty? - state.visited[state.star] = true - state.early_exit_visited[state.star] = true - state.frontier << state.star + if state.visited.empty? + state.visited[state.star] = true + state.early_exit_visited[state.star] = true + state.frontier << state.star state.came_from[state.star] = nil end # A step in the search - unless state.frontier.empty? + unless state.frontier.empty? # Takes the next frontier cell - new_frontier = state.frontier.shift + new_frontier = state.frontier.shift # For each of its neighbors - adjacent_neighbors(new_frontier).each do |neighbor| + adjacent_neighbors(new_frontier).each do |neighbor| # That have not been visited and are not walls - unless state.visited.has_key?(neighbor) || state.walls.has_key?(neighbor) + unless state.visited.has_key?(neighbor) || state.walls.has_key?(neighbor) # Add them to the frontier and mark them as visited in the first grid - state.visited[neighbor] = true + state.visited[neighbor] = true # Unless the target has been visited unless state.visited.has_key?(state.target) # Mark the neighbor as visited in the second grid as well @@ -434,32 +434,32 @@ class EarlyExitBreadthFirstSearch end # Add the neighbor to the frontier and remember which cell it came from - state.frontier << neighbor + state.frontier << neighbor state.came_from[neighbor] = new_frontier end end end end - + # Returns a list of adjacent cells # Used to determine what the next cells to be added to the frontier are def adjacent_neighbors(cell) - neighbors = [] + neighbors = [] # Gets all the valid neighbors into the array # From southern neighbor, clockwise - neighbors << [cell.x, cell.y - 1] unless cell.y == 0 - neighbors << [cell.x - 1, cell.y] unless cell.x == 0 - neighbors << [cell.x, cell.y + 1] unless cell.y == grid.height - 1 - neighbors << [cell.x + 1, cell.y] unless cell.x == grid.width - 1 + neighbors << [cell.x, cell.y - 1] unless cell.y == 0 + neighbors << [cell.x - 1, cell.y] unless cell.x == 0 + neighbors << [cell.x, cell.y + 1] unless cell.y == grid.height - 1 + neighbors << [cell.x + 1, cell.y] unless cell.x == grid.width - 1 # Sorts the neighbors so the rendered path is a zigzag path # Cells in a diagonal direction are given priority # Comment this line to see the difference neighbors = neighbors.sort_by { |neighbor_x, neighbor_y| proximity_to_star(neighbor_x, neighbor_y) } - neighbors + neighbors end # Finds the vertical and horizontal distance of a cell from the star @@ -484,13 +484,13 @@ class EarlyExitBreadthFirstSearch # Finding the cell closest to the mouse helps with this def cell_closest_to_mouse # Closest cell to the mouse in the first grid - x = (inputs.mouse.point.x / grid.cell_size).to_i - y = (inputs.mouse.point.y / grid.cell_size).to_i + x = (inputs.mouse.point.x / grid.cell_size).to_i + y = (inputs.mouse.point.y / grid.cell_size).to_i # Bound x and y to the grid - x = grid.width - 1 if x > grid.width - 1 - y = grid.height - 1 if y > grid.height - 1 + x = grid.width - 1 if x > grid.width - 1 + y = grid.height - 1 if y > grid.height - 1 # Return closest cell - [x, y] + [x, y] end # When the user grabs the star and puts their cursor to the far right @@ -498,15 +498,15 @@ class EarlyExitBreadthFirstSearch # Finding the cell closest to the mouse in the second grid helps with this def cell_closest_to_mouse2 # Closest cell grid to the mouse in the second - x = (inputs.mouse.point.x / grid.cell_size).to_i - y = (inputs.mouse.point.y / grid.cell_size).to_i + x = (inputs.mouse.point.x / grid.cell_size).to_i + y = (inputs.mouse.point.y / grid.cell_size).to_i # Translate the cell to the first grid x -= grid.width + 1 # Bound x and y to the first grid - x = grid.width - 1 if x > grid.width - 1 - y = grid.height - 1 if y > grid.height - 1 + x = grid.width - 1 if x > grid.width - 1 + y = grid.height - 1 if y > grid.height - 1 # Return closest cell - [x, y] + [x, y] end # Signal that the user is going to be moving the star from the first grid @@ -585,12 +585,12 @@ class EarlyExitBreadthFirstSearch # Light brown def unvisited_color - [221, 212, 213] + [221, 212, 213] end # Camo Green def wall_color - [134, 134, 120] + [134, 134, 120] end # Pastel White @@ -620,7 +620,7 @@ def tick args end # Every tick, new args are passed, and the Breadth First Search tick is called - $early_exit_breadth_first_search ||= EarlyExitBreadthFirstSearch.new(args) + $early_exit_breadth_first_search ||= EarlyExitBreadthFirstSearch.new $early_exit_breadth_first_search.args = args $early_exit_breadth_first_search.tick end diff --git a/samples/13_path_finding_algorithms/04_early_exit/replay.txt b/samples/13_path_finding_algorithms/04_early_exit/replay.txt new file mode 100644 index 0000000..3ec9254 --- /dev/null +++ b/samples/13_path_finding_algorithms/04_early_exit/replay.txt @@ -0,0 +1,364 @@ +replay_version 2.0 +stopped_at 322 +seed 100 +recorded_at 2021-11-20 11:19:30 -0600 +[:mouse_button_up, 1, 0, 1, 1, 1] +[:mouse_move, 806, 92, 2, 2, 12] +[:mouse_move, 799, 105, 2, 3, 13] +[:mouse_move, 786, 126, 2, 4, 13] +[:mouse_move, 761, 154, 2, 5, 13] +[:mouse_move, 722, 199, 2, 6, 14] +[:mouse_move, 692, 230, 2, 7, 14] +[:mouse_move, 659, 263, 2, 8, 14] +[:mouse_move, 629, 297, 2, 9, 14] +[:mouse_move, 598, 337, 2, 10, 15] +[:mouse_move, 569, 376, 2, 11, 15] +[:mouse_move, 538, 412, 2, 12, 15] +[:mouse_move, 510, 438, 2, 13, 16] +[:mouse_move, 488, 456, 2, 14, 16] +[:mouse_move, 471, 467, 2, 15, 16] +[:mouse_move, 459, 477, 2, 16, 17] +[:mouse_move, 455, 481, 2, 17, 17] +[:mouse_move, 455, 484, 2, 18, 18] +[:mouse_move, 454, 485, 2, 19, 18] +[:mouse_move, 464, 481, 2, 20, 23] +[:mouse_move, 482, 477, 2, 21, 23] +[:mouse_move, 490, 470, 2, 22, 23] +[:mouse_move, 491, 469, 2, 23, 24] +[:mouse_move, 492, 467, 2, 24, 24] +[:mouse_move, 493, 466, 2, 25, 25] +[:mouse_move, 485, 466, 2, 26, 26] +[:mouse_move, 474, 468, 2, 27, 27] +[:mouse_move, 460, 472, 2, 28, 27] +[:mouse_move, 441, 476, 2, 29, 27] +[:mouse_move, 419, 479, 2, 30, 27] +[:mouse_move, 392, 480, 2, 31, 28] +[:mouse_move, 359, 480, 2, 32, 28] +[:mouse_move, 329, 483, 2, 33, 29] +[:mouse_move, 306, 486, 2, 34, 29] +[:mouse_move, 281, 493, 2, 35, 30] +[:mouse_move, 271, 496, 2, 36, 30] +[:mouse_move, 270, 496, 2, 37, 30] +[:mouse_move, 272, 496, 2, 38, 32] +[:mouse_move, 275, 496, 2, 39, 32] +[:mouse_move, 279, 495, 2, 40, 32] +[:mouse_move, 283, 494, 2, 41, 33] +[:mouse_move, 289, 494, 2, 42, 33] +[:mouse_move, 292, 494, 2, 43, 34] +[:mouse_move, 293, 495, 2, 44, 35] +[:mouse_button_pressed, 1, 0, 1, 45, 39] +[:mouse_button_up, 1, 0, 1, 46, 40] +[:mouse_move, 294, 495, 2, 47, 49] +[:mouse_move, 294, 494, 2, 48, 50] +[:mouse_move, 295, 491, 2, 49, 50] +[:mouse_move, 296, 488, 2, 50, 50] +[:mouse_move, 297, 484, 2, 51, 50] +[:mouse_move, 297, 481, 2, 52, 51] +[:mouse_move, 298, 477, 2, 53, 51] +[:mouse_move, 298, 476, 2, 54, 51] +[:mouse_move, 299, 475, 2, 55, 52] +[:mouse_move, 300, 473, 2, 56, 52] +[:mouse_move, 300, 472, 2, 57, 53] +[:mouse_move, 300, 471, 2, 58, 55] +[:mouse_move, 300, 470, 2, 59, 56] +[:mouse_move, 300, 469, 2, 60, 57] +[:mouse_move, 300, 467, 2, 61, 57] +[:mouse_move, 300, 466, 2, 62, 57] +[:mouse_button_pressed, 1, 0, 1, 63, 59] +[:mouse_button_up, 1, 0, 1, 64, 61] +[:mouse_move, 300, 465, 2, 65, 61] +[:mouse_move, 300, 462, 2, 66, 62] +[:mouse_move, 300, 456, 2, 67, 62] +[:mouse_move, 300, 449, 2, 68, 62] +[:mouse_move, 300, 443, 2, 69, 63] +[:mouse_move, 299, 441, 2, 70, 63] +[:mouse_move, 299, 440, 2, 71, 63] +[:mouse_move, 299, 438, 2, 72, 64] +[:mouse_move, 299, 437, 2, 73, 65] +[:mouse_move, 299, 436, 2, 74, 65] +[:mouse_move, 299, 434, 2, 75, 65] +[:mouse_move, 299, 432, 2, 76, 65] +[:mouse_move, 299, 431, 2, 77, 67] +[:mouse_move, 299, 430, 2, 78, 67] +[:mouse_move, 299, 429, 2, 79, 68] +[:mouse_move, 299, 428, 2, 80, 68] +[:mouse_move, 299, 424, 2, 81, 68] +[:mouse_move, 300, 417, 2, 82, 69] +[:mouse_move, 301, 413, 2, 83, 69] +[:mouse_move, 302, 412, 2, 84, 70] +[:mouse_button_pressed, 1, 0, 1, 85, 72] +[:mouse_move, 302, 411, 2, 86, 72] +[:mouse_button_up, 1, 0, 1, 87, 74] +[:mouse_move, 302, 408, 2, 88, 94] +[:mouse_move, 302, 396, 2, 89, 94] +[:mouse_move, 302, 383, 2, 90, 95] +[:mouse_move, 302, 375, 2, 91, 95] +[:mouse_move, 303, 374, 2, 92, 95] +[:mouse_move, 303, 373, 2, 93, 95] +[:mouse_move, 303, 374, 2, 94, 99] +[:mouse_button_pressed, 1, 0, 1, 95, 101] +[:mouse_button_up, 1, 0, 1, 96, 103] +[:mouse_move, 303, 375, 2, 97, 103] +[:mouse_move, 306, 375, 2, 98, 132] +[:mouse_move, 317, 376, 2, 99, 132] +[:mouse_move, 333, 380, 2, 100, 133] +[:mouse_move, 352, 384, 2, 101, 133] +[:mouse_move, 374, 385, 2, 102, 133] +[:mouse_move, 401, 390, 2, 103, 134] +[:mouse_move, 424, 392, 2, 104, 134] +[:mouse_move, 442, 395, 2, 105, 134] +[:mouse_move, 455, 397, 2, 106, 135] +[:mouse_move, 458, 398, 2, 107, 135] +[:mouse_move, 460, 398, 2, 108, 136] +[:mouse_move, 466, 398, 2, 109, 136] +[:mouse_move, 473, 398, 2, 110, 136] +[:mouse_move, 477, 398, 2, 111, 136] +[:mouse_move, 478, 397, 2, 112, 136] +[:mouse_move, 479, 397, 2, 113, 137] +[:mouse_move, 480, 396, 2, 114, 137] +[:mouse_move, 480, 395, 2, 115, 138] +[:mouse_move, 480, 396, 2, 116, 138] +[:mouse_move, 478, 404, 2, 117, 139] +[:mouse_move, 474, 418, 2, 118, 139] +[:mouse_move, 472, 426, 2, 119, 139] +[:mouse_move, 466, 438, 2, 120, 140] +[:mouse_move, 461, 453, 2, 121, 140] +[:mouse_move, 453, 466, 2, 122, 140] +[:mouse_move, 448, 473, 2, 123, 141] +[:mouse_move, 446, 475, 2, 124, 141] +[:mouse_move, 444, 477, 2, 125, 142] +[:mouse_move, 441, 481, 2, 126, 142] +[:mouse_move, 435, 489, 2, 127, 142] +[:mouse_move, 426, 496, 2, 128, 143] +[:mouse_move, 422, 498, 2, 129, 143] +[:mouse_move, 422, 499, 2, 130, 143] +[:mouse_move, 421, 499, 2, 131, 145] +[:mouse_move, 420, 499, 2, 132, 145] +[:mouse_button_pressed, 1, 0, 1, 133, 147] +[:mouse_move, 419, 499, 2, 134, 148] +[:mouse_move, 419, 497, 2, 135, 148] +[:mouse_move, 421, 494, 2, 136, 149] +[:mouse_move, 426, 484, 2, 137, 149] +[:mouse_move, 432, 472, 2, 138, 149] +[:mouse_move, 439, 460, 2, 139, 150] +[:mouse_move, 445, 450, 2, 140, 150] +[:mouse_move, 456, 434, 2, 141, 150] +[:mouse_move, 466, 422, 2, 142, 150] +[:mouse_move, 474, 411, 2, 143, 151] +[:mouse_move, 480, 403, 2, 144, 151] +[:mouse_move, 485, 397, 2, 145, 151] +[:mouse_move, 489, 392, 2, 146, 151] +[:mouse_move, 491, 389, 2, 147, 151] +[:mouse_move, 494, 384, 2, 148, 151] +[:mouse_move, 495, 381, 2, 149, 152] +[:mouse_move, 497, 378, 2, 150, 152] +[:mouse_move, 499, 376, 2, 151, 152] +[:mouse_move, 500, 373, 2, 152, 152] +[:mouse_move, 501, 372, 2, 153, 152] +[:mouse_move, 501, 371, 2, 154, 152] +[:mouse_move, 502, 370, 2, 155, 153] +[:mouse_move, 502, 369, 2, 156, 153] +[:mouse_move, 503, 369, 2, 157, 157] +[:mouse_move, 504, 369, 2, 158, 158] +[:mouse_move, 505, 368, 2, 159, 158] +[:mouse_move, 508, 366, 2, 160, 158] +[:mouse_move, 512, 364, 2, 161, 159] +[:mouse_move, 513, 364, 2, 162, 159] +[:mouse_move, 514, 364, 2, 163, 159] +[:mouse_move, 515, 364, 2, 164, 160] +[:mouse_move, 519, 364, 2, 165, 161] +[:mouse_move, 526, 366, 2, 166, 161] +[:mouse_move, 538, 372, 2, 167, 161] +[:mouse_move, 550, 382, 2, 168, 161] +[:mouse_move, 563, 397, 2, 169, 162] +[:mouse_move, 570, 411, 2, 170, 162] +[:mouse_move, 574, 425, 2, 171, 162] +[:mouse_move, 576, 439, 2, 172, 163] +[:mouse_move, 576, 448, 2, 173, 163] +[:mouse_move, 576, 459, 2, 174, 163] +[:mouse_move, 576, 470, 2, 175, 163] +[:mouse_move, 576, 477, 2, 176, 163] +[:mouse_move, 576, 481, 2, 177, 163] +[:mouse_move, 576, 483, 2, 178, 163] +[:mouse_move, 576, 485, 2, 179, 164] +[:mouse_move, 576, 488, 2, 180, 164] +[:mouse_move, 576, 494, 2, 181, 164] +[:mouse_move, 577, 500, 2, 182, 164] +[:mouse_move, 577, 501, 2, 183, 164] +[:mouse_move, 579, 504, 2, 184, 164] +[:mouse_move, 579, 505, 2, 185, 164] +[:mouse_move, 581, 509, 2, 186, 165] +[:mouse_move, 583, 512, 2, 187, 165] +[:mouse_move, 584, 514, 2, 188, 165] +[:mouse_move, 585, 516, 2, 189, 165] +[:mouse_move, 586, 519, 2, 190, 165] +[:mouse_move, 587, 521, 2, 191, 165] +[:mouse_move, 588, 523, 2, 192, 166] +[:mouse_move, 588, 524, 2, 193, 166] +[:mouse_move, 588, 525, 2, 194, 166] +[:mouse_move, 588, 526, 2, 195, 167] +[:mouse_move, 588, 527, 2, 196, 167] +[:mouse_move, 588, 526, 2, 197, 173] +[:mouse_move, 586, 521, 2, 198, 173] +[:mouse_move, 586, 516, 2, 199, 174] +[:mouse_move, 585, 508, 2, 200, 174] +[:mouse_move, 582, 500, 2, 201, 174] +[:mouse_move, 578, 489, 2, 202, 174] +[:mouse_move, 573, 476, 2, 203, 175] +[:mouse_move, 568, 466, 2, 204, 175] +[:mouse_move, 566, 461, 2, 205, 176] +[:mouse_move, 565, 460, 2, 206, 176] +[:mouse_move, 564, 460, 2, 207, 176] +[:mouse_move, 563, 459, 2, 208, 176] +[:mouse_move, 562, 459, 2, 209, 177] +[:mouse_move, 561, 459, 2, 210, 177] +[:mouse_move, 549, 459, 2, 211, 177] +[:mouse_move, 522, 456, 2, 212, 177] +[:mouse_move, 484, 456, 2, 213, 177] +[:mouse_move, 423, 456, 2, 214, 177] +[:mouse_move, 385, 454, 2, 215, 177] +[:mouse_move, 359, 454, 2, 216, 178] +[:mouse_move, 345, 452, 2, 217, 178] +[:mouse_move, 343, 452, 2, 218, 178] +[:mouse_move, 342, 451, 2, 219, 180] +[:mouse_move, 343, 451, 2, 220, 180] +[:mouse_move, 344, 449, 2, 221, 180] +[:mouse_move, 348, 446, 2, 222, 180] +[:mouse_move, 352, 444, 2, 223, 180] +[:mouse_move, 362, 442, 2, 224, 181] +[:mouse_move, 369, 441, 2, 225, 181] +[:mouse_move, 376, 440, 2, 226, 181] +[:mouse_move, 381, 439, 2, 227, 182] +[:mouse_move, 385, 438, 2, 228, 182] +[:mouse_move, 386, 438, 2, 229, 182] +[:mouse_move, 387, 437, 2, 230, 183] +[:mouse_move, 387, 436, 2, 231, 183] +[:mouse_move, 388, 434, 2, 232, 183] +[:mouse_move, 388, 430, 2, 233, 183] +[:mouse_move, 387, 428, 2, 234, 183] +[:mouse_move, 387, 427, 2, 235, 183] +[:mouse_move, 386, 425, 2, 236, 184] +[:mouse_move, 383, 425, 2, 237, 184] +[:mouse_move, 382, 425, 2, 238, 185] +[:mouse_move, 381, 425, 2, 239, 185] +[:mouse_move, 380, 424, 2, 240, 185] +[:mouse_move, 379, 424, 2, 241, 187] +[:mouse_move, 378, 424, 2, 242, 189] +[:mouse_move, 377, 424, 2, 243, 192] +[:mouse_move, 376, 424, 2, 244, 192] +[:mouse_move, 375, 424, 2, 245, 194] +[:mouse_move, 374, 424, 2, 246, 195] +[:mouse_move, 373, 424, 2, 247, 196] +[:mouse_move, 372, 424, 2, 248, 197] +[:mouse_move, 370, 425, 2, 249, 197] +[:mouse_move, 368, 425, 2, 250, 198] +[:mouse_move, 367, 425, 2, 251, 198] +[:mouse_move, 366, 425, 2, 252, 198] +[:mouse_button_up, 1, 0, 1, 253, 203] +[:mouse_move, 365, 423, 2, 254, 204] +[:mouse_move, 360, 418, 2, 255, 204] +[:mouse_move, 356, 413, 2, 256, 205] +[:mouse_move, 350, 407, 2, 257, 205] +[:mouse_move, 344, 401, 2, 258, 205] +[:mouse_move, 337, 396, 2, 259, 206] +[:mouse_move, 326, 390, 2, 260, 206] +[:mouse_move, 311, 381, 2, 261, 207] +[:mouse_move, 303, 377, 2, 262, 207] +[:mouse_move, 297, 374, 2, 263, 207] +[:mouse_move, 296, 374, 2, 264, 207] +[:mouse_button_pressed, 1, 0, 1, 265, 211] +[:mouse_button_up, 1, 0, 1, 266, 212] +[:mouse_move, 297, 374, 2, 267, 213] +[:mouse_move, 298, 374, 2, 268, 220] +[:mouse_move, 300, 378, 2, 269, 221] +[:mouse_move, 301, 384, 2, 270, 221] +[:mouse_move, 301, 393, 2, 271, 222] +[:mouse_move, 301, 401, 2, 272, 222] +[:mouse_move, 301, 409, 2, 273, 223] +[:mouse_move, 301, 412, 2, 274, 223] +[:mouse_move, 301, 413, 2, 275, 224] +[:mouse_move, 301, 415, 2, 276, 224] +[:mouse_move, 302, 418, 2, 277, 225] +[:mouse_move, 303, 419, 2, 278, 225] +[:mouse_move, 303, 420, 2, 279, 226] +[:mouse_button_pressed, 1, 0, 1, 280, 228] +[:mouse_button_up, 1, 0, 1, 281, 230] +[:mouse_move, 303, 421, 2, 282, 230] +[:mouse_move, 303, 422, 2, 283, 231] +[:mouse_move, 303, 426, 2, 284, 231] +[:mouse_move, 302, 429, 2, 285, 232] +[:mouse_move, 302, 430, 2, 286, 232] +[:mouse_move, 302, 432, 2, 287, 232] +[:mouse_move, 302, 436, 2, 288, 233] +[:mouse_move, 302, 438, 2, 289, 233] +[:mouse_move, 302, 440, 2, 290, 233] +[:mouse_move, 302, 441, 2, 291, 234] +[:mouse_move, 302, 442, 2, 292, 234] +[:mouse_move, 302, 443, 2, 293, 235] +[:mouse_move, 302, 444, 2, 294, 236] +[:mouse_move, 302, 445, 2, 295, 236] +[:mouse_move, 303, 447, 2, 296, 237] +[:mouse_move, 304, 451, 2, 297, 237] +[:mouse_move, 304, 454, 2, 298, 237] +[:mouse_move, 304, 456, 2, 299, 238] +[:mouse_move, 304, 458, 2, 300, 238] +[:mouse_move, 304, 460, 2, 301, 238] +[:mouse_move, 304, 463, 2, 302, 239] +[:mouse_button_pressed, 1, 0, 1, 303, 242] +[:mouse_button_up, 1, 0, 1, 304, 244] +[:mouse_move, 304, 464, 2, 305, 244] +[:mouse_move, 304, 465, 2, 306, 245] +[:mouse_move, 304, 470, 2, 307, 246] +[:mouse_move, 304, 476, 2, 308, 246] +[:mouse_move, 303, 485, 2, 309, 246] +[:mouse_move, 301, 495, 2, 310, 247] +[:mouse_move, 300, 500, 2, 311, 247] +[:mouse_move, 300, 503, 2, 312, 247] +[:mouse_move, 300, 506, 2, 313, 248] +[:mouse_move, 301, 508, 2, 314, 248] +[:mouse_move, 302, 510, 2, 315, 248] +[:mouse_move, 302, 511, 2, 316, 249] +[:mouse_move, 303, 512, 2, 317, 249] +[:mouse_move, 303, 513, 2, 318, 251] +[:mouse_button_pressed, 1, 0, 1, 319, 253] +[:mouse_button_up, 1, 0, 1, 320, 255] +[:mouse_move, 303, 512, 2, 321, 255] +[:mouse_move, 304, 511, 2, 322, 265] +[:mouse_move, 305, 511, 2, 323, 265] +[:mouse_move, 307, 510, 2, 324, 266] +[:mouse_move, 311, 509, 2, 325, 266] +[:mouse_move, 315, 505, 2, 326, 266] +[:mouse_move, 317, 504, 2, 327, 267] +[:mouse_move, 317, 503, 2, 328, 268] +[:mouse_move, 316, 503, 2, 329, 269] +[:mouse_move, 316, 502, 2, 330, 289] +[:mouse_move, 317, 501, 2, 331, 291] +[:mouse_move, 318, 501, 2, 332, 292] +[:mouse_move, 319, 501, 2, 333, 302] +[:mouse_move, 319, 500, 2, 334, 303] +[:key_down_raw, 96, 0, 2, 335, 303] +[:mouse_move, 320, 500, 2, 336, 304] +[:mouse_move, 323, 498, 2, 337, 304] +[:mouse_move, 331, 496, 2, 338, 305] +[:key_up_raw, 96, 0, 2, 339, 305] +[:mouse_move, 341, 493, 2, 340, 305] +[:mouse_move, 351, 489, 2, 341, 305] +[:mouse_move, 363, 484, 2, 342, 306] +[:mouse_move, 372, 482, 2, 343, 306] +[:mouse_move, 384, 479, 2, 344, 306] +[:mouse_move, 395, 479, 2, 345, 307] +[:mouse_move, 402, 477, 2, 346, 307] +[:mouse_move, 406, 475, 2, 347, 308] +[:mouse_move, 403, 475, 2, 348, 308] +[:mouse_move, 397, 473, 2, 349, 309] +[:mouse_move, 394, 467, 2, 350, 311] +[:mouse_move, 393, 467, 2, 351, 311] +[:mouse_move, 397, 466, 2, 352, 312] +[:mouse_move, 398, 465, 2, 353, 313] +[:mouse_move, 399, 465, 2, 354, 313] +[:mouse_move, 399, 464, 2, 355, 313] +[:mouse_move, 400, 464, 2, 356, 314] +[:mouse_move, 400, 463, 2, 357, 316] +[:mouse_move, 401, 463, 2, 358, 318] +[:mouse_move, 401, 462, 2, 359, 319] +[:key_down_raw, 13, 0, 2, 360, 322] diff --git a/samples/13_path_finding_algorithms/05_dijkstra/app/main.rb b/samples/13_path_finding_algorithms/05_dijkstra/app/main.rb index b335447..1223779 100644 --- a/samples/13_path_finding_algorithms/05_dijkstra/app/main.rb +++ b/samples/13_path_finding_algorithms/05_dijkstra/app/main.rb @@ -19,8 +19,8 @@ class Movement_Costs # The next step in the search is calculated def tick defaults - render - input + render + input calc end @@ -37,7 +37,7 @@ class Movement_Costs # Walls are stored in a hash for quick look up when doing the search state.star ||= [1, 5] state.target ||= [8, 4] - state.walls ||= {[1, 1] => true, [2, 1] => true, [3, 1] => true, [1, 2] => true, [2, 2] => true, [3, 2] => true} + state.walls ||= {[1, 1] => true, [2, 1] => true, [3, 1] => true, [1, 2] => true, [2, 2] => true, [3, 2] => true} state.hills ||= { [4, 1] => true, [5, 1] => true, @@ -72,7 +72,7 @@ class Movement_Costs # We store this value, because we want to remember the value even when # the user's cursor is no longer over what they're interacting with, but # they are still clicking down on the mouse. - state.user_input ||= :none + state.user_input ||= :none # Values that are used for the breadth first search # Keeping track of what cells were visited prevents counting cells multiple times @@ -96,7 +96,7 @@ class Movement_Costs # Draws everything onto the screen def render - render_background + render_background render_heat_maps @@ -111,8 +111,8 @@ class Movement_Costs # Draws what the grid looks like with nothing on it def render_background - render_unvisited - render_grid_lines + render_unvisited + render_grid_lines render_labels end @@ -131,7 +131,7 @@ class Movement_Costs end for y in 0..grid.height - outputs.lines << horizontal_line(y) + outputs.lines << horizontal_line(y) outputs.lines << shifted_horizontal_line(y) end end @@ -244,16 +244,16 @@ class Movement_Costs def render_star outputs.sprites << [scale_up(state.star), 'star.png'] outputs.sprites << [move_and_scale_up(state.star), 'star.png'] - end + end # Renders the target on both grids def render_target outputs.sprites << [scale_up(state.target), 'target.png'] outputs.sprites << [move_and_scale_up(state.target), 'target.png'] - end + end def render_hills - state.hills.each_key do |hill| + state.hills.each_key do |hill| outputs.solids << [scale_up(hill), hill_color] outputs.solids << [move_and_scale_up(hill), hill_color] end @@ -261,7 +261,7 @@ class Movement_Costs # Draws the walls on both grids def render_walls - state.walls.each_key do |wall| + state.walls.each_key do |wall| outputs.solids << [scale_up(wall), wall_color] outputs.solids << [move_and_scale_up(wall), wall_color] end @@ -344,7 +344,7 @@ class Movement_Costs # If the mouse was clicked this tick if inputs.mouse.down # Determine what the user is editing and edit the state.user_input variable - determine_input + determine_input end # Process user input based on user_input variable and current mouse position @@ -357,43 +357,43 @@ class Movement_Costs # mouse left click is held def determine_input # If the mouse is over the star in the first grid - if mouse_over_star? + if mouse_over_star? # The user is editing the star from the first grid - state.user_input = :star + state.user_input = :star # If the mouse is over the star in the second grid - elsif mouse_over_star2? + elsif mouse_over_star2? # The user is editing the star from the second grid - state.user_input = :star2 + state.user_input = :star2 # If the mouse is over the target in the first grid - elsif mouse_over_target? + elsif mouse_over_target? # The user is editing the target from the first grid - state.user_input = :target + state.user_input = :target # If the mouse is over the target in the second grid - elsif mouse_over_target2? + elsif mouse_over_target2? # The user is editing the target from the second grid - state.user_input = :target2 + state.user_input = :target2 # If the mouse is over a wall in the first grid - elsif mouse_over_wall? + elsif mouse_over_wall? # The user is removing a wall from the first grid - state.user_input = :remove_wall + state.user_input = :remove_wall # If the mouse is over a wall in the second grid - elsif mouse_over_wall2? + elsif mouse_over_wall2? # The user is removing a wall from the second grid state.user_input = :remove_wall2 # If the mouse is over a hill in the first grid - elsif mouse_over_hill? + elsif mouse_over_hill? # The user is adding a wall from the first grid - state.user_input = :add_wall + state.user_input = :add_wall # If the mouse is over a hill in the second grid - elsif mouse_over_hill2? + elsif mouse_over_hill2? # The user is adding a wall from the second grid state.user_input = :add_wall2 # If the mouse is over the first grid - elsif mouse_over_grid? + elsif mouse_over_grid? # The user is adding a hill from the first grid state.user_input = :add_hill # If the mouse is over the second grid - elsif mouse_over_grid2? + elsif mouse_over_grid2? # The user is adding a hill from the second grid state.user_input = :add_hill2 end @@ -401,26 +401,26 @@ class Movement_Costs # Processes click and drag based on what the user is currently dragging def process_input - if state.user_input == :star - input_star + if state.user_input == :star + input_star elsif state.user_input == :star2 - input_star2 - elsif state.user_input == :target - input_target - elsif state.user_input == :target2 - input_target2 - elsif state.user_input == :remove_wall - input_remove_wall + input_star2 + elsif state.user_input == :target + input_target + elsif state.user_input == :target2 + input_target2 + elsif state.user_input == :remove_wall + input_remove_wall elsif state.user_input == :remove_wall2 - input_remove_wall2 - elsif state.user_input == :add_hill - input_add_hill - elsif state.user_input == :add_hill2 - input_add_hill2 - elsif state.user_input == :add_wall - input_add_wall - elsif state.user_input == :add_wall2 - input_add_wall2 + input_remove_wall2 + elsif state.user_input == :add_hill + input_add_hill + elsif state.user_input == :add_hill2 + input_add_hill2 + elsif state.user_input == :add_wall + input_add_wall + elsif state.user_input == :add_wall2 + input_add_wall2 end end @@ -433,26 +433,26 @@ class Movement_Costs calc_dijkstra end end - + def calc_breadth_first # Sets up the Breadth First Search - breadth_first_search.visited[state.star] = true - breadth_first_search.frontier << state.star + breadth_first_search.visited[state.star] = true + breadth_first_search.frontier << state.star breadth_first_search.came_from[state.star] = nil until breadth_first_search.frontier.empty? return if breadth_first_search.visited.has_key?(state.target) # A step in the search # Takes the next frontier cell - new_frontier = breadth_first_search.frontier.shift + new_frontier = breadth_first_search.frontier.shift # For each of its neighbors - adjacent_neighbors(new_frontier).each do | neighbor | + adjacent_neighbors(new_frontier).each do | neighbor | # That have not been visited and are not walls - unless breadth_first_search.visited.has_key?(neighbor) || state.walls.has_key?(neighbor) + unless breadth_first_search.visited.has_key?(neighbor) || state.walls.has_key?(neighbor) # Add them to the frontier and mark them as visited in the first grid - breadth_first_search.visited[neighbor] = true - breadth_first_search.frontier << neighbor + breadth_first_search.visited[neighbor] = true + breadth_first_search.frontier << neighbor # Remember which cell the neighbor came from breadth_first_search.came_from[neighbor] = new_frontier end @@ -512,12 +512,12 @@ class Movement_Costs # Only resets the search if the star changes position # Called whenever the user is editing the star (puts mouse down on star) def input_star - old_star = state.star.clone + old_star = state.star.clone unless cell_closest_to_mouse == state.target - state.star = cell_closest_to_mouse + state.star = cell_closest_to_mouse end - unless old_star == state.star - reset_search + unless old_star == state.star + reset_search end end @@ -525,12 +525,12 @@ class Movement_Costs # Only resets the search if the star changes position # Called whenever the user is editing the star (puts mouse down on star) def input_star2 - old_star = state.star.clone + old_star = state.star.clone unless cell_closest_to_mouse2 == state.target state.star = cell_closest_to_mouse2 end - unless old_star == state.star - reset_search + unless old_star == state.star + reset_search end end @@ -538,12 +538,12 @@ class Movement_Costs # Only reset_searchs the search if the target changes position # Called whenever the user is editing the target (puts mouse down on target) def input_target - old_target = state.target.clone + old_target = state.target.clone unless cell_closest_to_mouse == state.star state.target = cell_closest_to_mouse end - unless old_target == state.target - reset_search + unless old_target == state.target + reset_search end end @@ -551,12 +551,12 @@ class Movement_Costs # Only reset_searchs the search if the target changes position # Called whenever the user is editing the target (puts mouse down on target) def input_target2 - old_target = state.target.clone + old_target = state.target.clone unless cell_closest_to_mouse2 == state.star state.target = cell_closest_to_mouse2 end - unless old_target == state.target - reset_search + unless old_target == state.target + reset_search end end @@ -565,11 +565,11 @@ class Movement_Costs # The mouse needs to be inside the grid, because we only want to remove walls # the cursor is directly over # Recalculations should only occur when a wall is actually deleted - if mouse_over_grid? + if mouse_over_grid? if state.walls.has_key?(cell_closest_to_mouse) or state.hills.has_key?(cell_closest_to_mouse) - state.walls.delete(cell_closest_to_mouse) - state.hills.delete(cell_closest_to_mouse) - reset_search + state.walls.delete(cell_closest_to_mouse) + state.hills.delete(cell_closest_to_mouse) + reset_search end end end @@ -579,21 +579,21 @@ class Movement_Costs # The mouse needs to be inside the grid, because we only want to remove walls # the cursor is directly over # Recalculations should only occur when a wall is actually deleted - if mouse_over_grid2? + if mouse_over_grid2? if state.walls.has_key?(cell_closest_to_mouse2) or state.hills.has_key?(cell_closest_to_mouse2) - state.walls.delete(cell_closest_to_mouse2) - state.hills.delete(cell_closest_to_mouse2) - reset_search + state.walls.delete(cell_closest_to_mouse2) + state.hills.delete(cell_closest_to_mouse2) + reset_search end end end # Adds a hill in the first grid in the cell the mouse is over def input_add_hill - if mouse_over_grid? + if mouse_over_grid? unless state.hills.has_key?(cell_closest_to_mouse) - state.hills[cell_closest_to_mouse] = true - reset_search + state.hills[cell_closest_to_mouse] = true + reset_search end end end @@ -601,32 +601,32 @@ class Movement_Costs # Adds a hill in the second grid in the cell the mouse is over def input_add_hill2 - if mouse_over_grid2? + if mouse_over_grid2? unless state.hills.has_key?(cell_closest_to_mouse2) - state.hills[cell_closest_to_mouse2] = true - reset_search + state.hills[cell_closest_to_mouse2] = true + reset_search end end end # Adds a wall in the first grid in the cell the mouse is over def input_add_wall - if mouse_over_grid? + if mouse_over_grid? unless state.walls.has_key?(cell_closest_to_mouse) - state.hills.delete(cell_closest_to_mouse) - state.walls[cell_closest_to_mouse] = true - reset_search + state.hills.delete(cell_closest_to_mouse) + state.walls[cell_closest_to_mouse] = true + reset_search end end end # Adds a wall in the second grid in the cell the mouse is over def input_add_wall2 - if mouse_over_grid2? + if mouse_over_grid2? unless state.walls.has_key?(cell_closest_to_mouse2) - state.hills.delete(cell_closest_to_mouse2) - state.walls[cell_closest_to_mouse2] = true - reset_search + state.hills.delete(cell_closest_to_mouse2) + state.walls[cell_closest_to_mouse2] = true + reset_search end end end @@ -649,21 +649,21 @@ class Movement_Costs # Returns a list of adjacent cells # Used to determine what the next cells to be added to the frontier are def adjacent_neighbors(cell) - neighbors = [] + neighbors = [] # Gets all the valid neighbors into the array # From southern neighbor, clockwise - neighbors << [cell.x , cell.y - 1] unless cell.y == 0 - neighbors << [cell.x - 1, cell.y ] unless cell.x == 0 - neighbors << [cell.x , cell.y + 1] unless cell.y == grid.height - 1 - neighbors << [cell.x + 1, cell.y ] unless cell.x == grid.width - 1 + neighbors << [cell.x , cell.y - 1] unless cell.y == 0 + neighbors << [cell.x - 1, cell.y ] unless cell.x == 0 + neighbors << [cell.x , cell.y + 1] unless cell.y == grid.height - 1 + neighbors << [cell.x + 1, cell.y ] unless cell.x == grid.width - 1 # Sorts the neighbors so the rendered path is a zigzag path # Cells in a diagonal direction are given priority # Comment this line to see the difference neighbors = neighbors.sort_by { |neighbor_x, neighbor_y| proximity_to_star(neighbor_x, neighbor_y) } - neighbors + neighbors end # Finds the vertical and horizontal distance of a cell from the star @@ -688,13 +688,13 @@ class Movement_Costs # Finding the cell closest to the mouse helps with this def cell_closest_to_mouse # Closest cell to the mouse in the first grid - x = (inputs.mouse.point.x / grid.cell_size).to_i - y = (inputs.mouse.point.y / grid.cell_size).to_i + x = (inputs.mouse.point.x / grid.cell_size).to_i + y = (inputs.mouse.point.y / grid.cell_size).to_i # Bound x and y to the grid - x = grid.width - 1 if x > grid.width - 1 - y = grid.height - 1 if y > grid.height - 1 + x = grid.width - 1 if x > grid.width - 1 + y = grid.height - 1 if y > grid.height - 1 # Return closest cell - [x, y] + [x, y] end # When the user grabs the star and puts their cursor to the far right @@ -702,17 +702,17 @@ class Movement_Costs # Finding the cell closest to the mouse in the second grid helps with this def cell_closest_to_mouse2 # Closest cell grid to the mouse in the second - x = (inputs.mouse.point.x / grid.cell_size).to_i - y = (inputs.mouse.point.y / grid.cell_size).to_i + x = (inputs.mouse.point.x / grid.cell_size).to_i + y = (inputs.mouse.point.y / grid.cell_size).to_i # Translate the cell to the first grid x -= grid.width + 1 # Bound x and y to the first grid x = 0 if x < 0 y = 0 if y < 0 - x = grid.width - 1 if x > grid.width - 1 - y = grid.height - 1 if y > grid.height - 1 + x = grid.width - 1 if x > grid.width - 1 + y = grid.height - 1 if y > grid.height - 1 # Return closest cell - [x, y] + [x, y] end # Signal that the user is going to be moving the star from the first grid @@ -785,12 +785,12 @@ class Movement_Costs # Light brown def unvisited_color - [221, 212, 213] + [221, 212, 213] end # Camo Green def wall_color - [134, 134, 120] + [134, 134, 120] end # Pastel White @@ -833,7 +833,7 @@ def tick args end # Every tick, new args are passed, and the Dijkstra tick method is called - $movement_costs ||= Movement_Costs.new(args) + $movement_costs ||= Movement_Costs.new $movement_costs.args = args $movement_costs.tick end diff --git a/samples/13_path_finding_algorithms/05_dijkstra/replay.txt b/samples/13_path_finding_algorithms/05_dijkstra/replay.txt new file mode 100644 index 0000000..a459873 --- /dev/null +++ b/samples/13_path_finding_algorithms/05_dijkstra/replay.txt @@ -0,0 +1,686 @@ +replay_version 2.0 +stopped_at 730 +seed 100 +recorded_at 2021-11-20 11:20:27 -0600 +[:mouse_button_up, 1, 0, 1, 1, 1] +[:mouse_move, 782, 97, 2, 2, 14] +[:mouse_move, 782, 98, 2, 3, 15] +[:mouse_move, 782, 99, 2, 4, 15] +[:mouse_move, 782, 100, 2, 5, 16] +[:mouse_move, 780, 102, 2, 6, 16] +[:mouse_move, 773, 111, 2, 7, 17] +[:mouse_move, 768, 123, 2, 8, 17] +[:mouse_move, 759, 142, 2, 9, 18] +[:mouse_move, 740, 166, 2, 10, 18] +[:mouse_move, 718, 196, 2, 11, 19] +[:mouse_move, 699, 232, 2, 12, 19] +[:mouse_move, 686, 272, 2, 13, 20] +[:mouse_move, 673, 314, 2, 14, 20] +[:mouse_move, 648, 355, 2, 15, 21] +[:mouse_move, 594, 404, 2, 16, 21] +[:mouse_move, 562, 427, 2, 17, 22] +[:mouse_move, 532, 446, 2, 18, 22] +[:mouse_move, 509, 458, 2, 19, 23] +[:mouse_move, 490, 464, 2, 20, 23] +[:mouse_move, 482, 466, 2, 21, 23] +[:mouse_move, 481, 466, 2, 22, 24] +[:mouse_move, 481, 460, 2, 23, 25] +[:mouse_move, 490, 451, 2, 24, 26] +[:mouse_move, 501, 443, 2, 25, 26] +[:mouse_move, 506, 441, 2, 26, 26] +[:mouse_move, 506, 442, 2, 27, 29] +[:mouse_move, 507, 442, 2, 28, 31] +[:mouse_move, 508, 442, 2, 29, 32] +[:mouse_move, 509, 442, 2, 30, 37] +[:mouse_move, 510, 442, 2, 31, 48] +[:mouse_move, 507, 442, 2, 32, 63] +[:mouse_move, 500, 444, 2, 33, 63] +[:mouse_move, 488, 446, 2, 34, 64] +[:mouse_move, 476, 447, 2, 35, 64] +[:mouse_move, 466, 449, 2, 36, 65] +[:mouse_move, 459, 450, 2, 37, 65] +[:mouse_move, 449, 452, 2, 38, 66] +[:mouse_move, 440, 453, 2, 39, 66] +[:mouse_move, 433, 454, 2, 40, 67] +[:mouse_move, 432, 454, 2, 41, 67] +[:mouse_move, 436, 455, 2, 42, 69] +[:mouse_move, 442, 455, 2, 43, 69] +[:mouse_move, 446, 455, 2, 44, 70] +[:mouse_move, 450, 455, 2, 45, 70] +[:mouse_move, 456, 448, 2, 46, 70] +[:mouse_move, 458, 437, 2, 47, 71] +[:mouse_move, 458, 422, 2, 48, 72] +[:mouse_move, 451, 402, 2, 49, 72] +[:mouse_move, 440, 376, 2, 50, 72] +[:mouse_move, 414, 334, 2, 51, 73] +[:mouse_move, 393, 303, 2, 52, 74] +[:mouse_move, 378, 280, 2, 53, 74] +[:mouse_move, 367, 265, 2, 54, 75] +[:mouse_move, 358, 255, 2, 55, 75] +[:mouse_move, 353, 251, 2, 56, 75] +[:mouse_move, 349, 248, 2, 57, 76] +[:mouse_move, 348, 248, 2, 58, 76] +[:mouse_move, 345, 249, 2, 59, 77] +[:mouse_move, 344, 249, 2, 60, 78] +[:mouse_move, 338, 246, 2, 61, 79] +[:mouse_move, 332, 240, 2, 62, 79] +[:mouse_move, 328, 231, 2, 63, 80] +[:mouse_move, 326, 222, 2, 64, 80] +[:mouse_move, 326, 214, 2, 65, 81] +[:mouse_move, 331, 208, 2, 66, 81] +[:mouse_move, 340, 204, 2, 67, 82] +[:mouse_move, 348, 202, 2, 68, 82] +[:mouse_move, 357, 202, 2, 69, 83] +[:mouse_move, 363, 202, 2, 70, 84] +[:mouse_move, 365, 202, 2, 71, 84] +[:mouse_move, 366, 202, 2, 72, 84] +[:mouse_move, 374, 203, 2, 73, 85] +[:mouse_move, 380, 204, 2, 74, 85] +[:mouse_move, 382, 204, 2, 75, 86] +[:mouse_move, 383, 204, 2, 76, 86] +[:mouse_button_pressed, 1, 0, 1, 77, 88] +[:mouse_button_up, 1, 0, 1, 78, 89] +[:mouse_move, 384, 204, 2, 79, 99] +[:mouse_move, 384, 205, 2, 80, 100] +[:mouse_move, 389, 210, 2, 81, 101] +[:mouse_move, 394, 214, 2, 82, 101] +[:mouse_move, 399, 220, 2, 83, 101] +[:mouse_move, 405, 228, 2, 84, 102] +[:mouse_move, 410, 242, 2, 85, 103] +[:mouse_move, 416, 261, 2, 86, 103] +[:mouse_move, 422, 276, 2, 87, 104] +[:mouse_move, 428, 284, 2, 88, 104] +[:mouse_move, 430, 287, 2, 89, 104] +[:mouse_move, 431, 288, 2, 90, 105] +[:mouse_move, 433, 290, 2, 91, 105] +[:mouse_move, 434, 295, 2, 92, 106] +[:mouse_move, 435, 306, 2, 93, 106] +[:mouse_move, 436, 311, 2, 94, 107] +[:mouse_move, 436, 312, 2, 95, 108] +[:mouse_move, 438, 314, 2, 96, 112] +[:mouse_move, 441, 320, 2, 97, 113] +[:mouse_move, 447, 341, 2, 98, 113] +[:mouse_move, 453, 376, 2, 99, 114] +[:mouse_move, 456, 413, 2, 100, 114] +[:mouse_move, 456, 445, 2, 101, 115] +[:mouse_move, 455, 475, 2, 102, 115] +[:mouse_move, 450, 498, 2, 103, 116] +[:mouse_move, 446, 519, 2, 104, 116] +[:mouse_move, 446, 541, 2, 105, 117] +[:mouse_move, 452, 559, 2, 106, 117] +[:mouse_move, 458, 569, 2, 107, 117] +[:mouse_move, 464, 573, 2, 108, 118] +[:mouse_move, 468, 573, 2, 109, 119] +[:mouse_move, 471, 570, 2, 110, 119] +[:mouse_move, 474, 559, 2, 111, 120] +[:mouse_move, 476, 539, 2, 112, 120] +[:mouse_move, 483, 527, 2, 113, 120] +[:mouse_move, 489, 519, 2, 114, 121] +[:mouse_move, 493, 515, 2, 115, 121] +[:mouse_move, 493, 511, 2, 116, 122] +[:mouse_move, 493, 505, 2, 117, 122] +[:mouse_move, 493, 499, 2, 118, 123] +[:mouse_move, 490, 496, 2, 119, 123] +[:mouse_move, 488, 493, 2, 120, 124] +[:mouse_move, 487, 493, 2, 121, 124] +[:mouse_move, 484, 493, 2, 122, 125] +[:mouse_move, 482, 493, 2, 123, 125] +[:mouse_move, 479, 494, 2, 124, 126] +[:mouse_move, 474, 495, 2, 125, 126] +[:mouse_move, 470, 499, 2, 126, 127] +[:mouse_move, 470, 503, 2, 127, 127] +[:mouse_move, 470, 506, 2, 128, 128] +[:mouse_button_pressed, 1, 0, 1, 129, 131] +[:mouse_button_up, 1, 0, 1, 130, 132] +[:mouse_move, 470, 503, 2, 131, 135] +[:mouse_move, 470, 495, 2, 132, 135] +[:mouse_move, 470, 488, 2, 133, 135] +[:mouse_move, 472, 478, 2, 134, 136] +[:mouse_move, 473, 470, 2, 135, 137] +[:mouse_move, 474, 459, 2, 136, 137] +[:mouse_move, 474, 450, 2, 137, 138] +[:mouse_move, 474, 445, 2, 138, 138] +[:mouse_move, 472, 441, 2, 139, 138] +[:mouse_move, 470, 439, 2, 140, 139] +[:mouse_move, 467, 438, 2, 141, 139] +[:mouse_move, 465, 438, 2, 142, 140] +[:mouse_move, 464, 438, 2, 143, 140] +[:mouse_move, 463, 438, 2, 144, 141] +[:mouse_move, 460, 438, 2, 145, 141] +[:mouse_move, 459, 438, 2, 146, 142] +[:mouse_button_pressed, 1, 0, 1, 147, 144] +[:mouse_button_up, 1, 0, 1, 148, 145] +[:mouse_move, 459, 439, 2, 149, 153] +[:mouse_move, 459, 438, 2, 150, 164] +[:mouse_move, 458, 434, 2, 151, 164] +[:mouse_move, 458, 426, 2, 152, 165] +[:mouse_move, 458, 414, 2, 153, 165] +[:mouse_move, 461, 400, 2, 154, 166] +[:mouse_move, 461, 397, 2, 155, 166] +[:mouse_move, 461, 396, 2, 156, 166] +[:mouse_move, 461, 395, 2, 157, 167] +[:mouse_button_pressed, 1, 0, 1, 158, 170] +[:mouse_button_up, 1, 0, 1, 159, 171] +[:mouse_move, 461, 394, 2, 160, 174] +[:mouse_move, 461, 391, 2, 161, 175] +[:mouse_move, 461, 387, 2, 162, 175] +[:mouse_move, 461, 381, 2, 163, 176] +[:mouse_move, 461, 379, 2, 164, 176] +[:mouse_move, 461, 378, 2, 165, 177] +[:mouse_move, 461, 377, 2, 166, 177] +[:mouse_move, 461, 375, 2, 167, 179] +[:mouse_move, 461, 374, 2, 168, 179] +[:mouse_move, 461, 373, 2, 169, 180] +[:mouse_move, 461, 372, 2, 170, 181] +[:mouse_move, 461, 370, 2, 171, 181] +[:mouse_move, 460, 365, 2, 172, 182] +[:mouse_move, 460, 362, 2, 173, 182] +[:mouse_move, 460, 359, 2, 174, 182] +[:mouse_move, 460, 358, 2, 175, 184] +[:mouse_move, 459, 356, 2, 176, 185] +[:mouse_move, 459, 355, 2, 177, 186] +[:mouse_move, 459, 352, 2, 178, 186] +[:mouse_move, 459, 351, 2, 179, 187] +[:mouse_move, 458, 350, 2, 180, 187] +[:mouse_move, 458, 349, 2, 181, 187] +[:mouse_move, 457, 352, 2, 182, 191] +[:mouse_move, 456, 369, 2, 183, 192] +[:mouse_move, 456, 381, 2, 184, 192] +[:mouse_move, 456, 393, 2, 185, 193] +[:mouse_move, 460, 412, 2, 186, 193] +[:mouse_move, 466, 429, 2, 187, 193] +[:mouse_move, 471, 448, 2, 188, 194] +[:mouse_move, 472, 464, 2, 189, 194] +[:mouse_move, 473, 477, 2, 190, 195] +[:mouse_move, 474, 488, 2, 191, 196] +[:mouse_move, 474, 497, 2, 192, 196] +[:mouse_move, 474, 499, 2, 193, 196] +[:mouse_move, 472, 504, 2, 194, 197] +[:mouse_move, 470, 513, 2, 195, 197] +[:mouse_move, 470, 516, 2, 196, 197] +[:mouse_move, 470, 517, 2, 197, 198] +[:mouse_move, 470, 519, 2, 198, 199] +[:mouse_move, 470, 521, 2, 199, 199] +[:mouse_move, 470, 522, 2, 200, 200] +[:mouse_move, 470, 523, 2, 201, 201] +[:mouse_move, 467, 521, 2, 202, 203] +[:mouse_move, 464, 518, 2, 203, 203] +[:mouse_move, 462, 515, 2, 204, 204] +[:mouse_move, 461, 511, 2, 205, 205] +[:mouse_button_pressed, 1, 0, 1, 206, 210] +[:mouse_button_up, 1, 0, 1, 207, 211] +[:mouse_move, 462, 511, 2, 208, 218] +[:mouse_move, 465, 510, 2, 209, 218] +[:mouse_move, 470, 508, 2, 210, 218] +[:mouse_move, 475, 505, 2, 211, 219] +[:mouse_move, 483, 502, 2, 212, 219] +[:mouse_move, 493, 498, 2, 213, 220] +[:mouse_move, 506, 491, 2, 214, 221] +[:mouse_move, 517, 479, 2, 215, 221] +[:mouse_move, 521, 471, 2, 216, 221] +[:mouse_move, 523, 467, 2, 217, 222] +[:mouse_move, 523, 464, 2, 218, 222] +[:mouse_move, 522, 464, 2, 219, 227] +[:mouse_move, 521, 464, 2, 220, 227] +[:mouse_move, 518, 464, 2, 221, 228] +[:mouse_move, 513, 460, 2, 222, 228] +[:mouse_move, 513, 459, 2, 223, 228] +[:mouse_move, 512, 459, 2, 224, 229] +[:mouse_move, 512, 458, 2, 225, 229] +[:mouse_button_pressed, 1, 0, 1, 226, 232] +[:mouse_move, 513, 458, 2, 227, 233] +[:mouse_move, 514, 458, 2, 228, 234] +[:mouse_move, 516, 458, 2, 229, 234] +[:mouse_move, 517, 458, 2, 230, 235] +[:mouse_move, 523, 453, 2, 231, 235] +[:mouse_move, 531, 444, 2, 232, 235] +[:mouse_move, 537, 436, 2, 233, 236] +[:mouse_move, 541, 428, 2, 234, 236] +[:mouse_move, 543, 421, 2, 235, 237] +[:mouse_move, 545, 413, 2, 236, 237] +[:mouse_move, 546, 405, 2, 237, 237] +[:mouse_move, 547, 396, 2, 238, 237] +[:mouse_move, 547, 389, 2, 239, 237] +[:mouse_move, 547, 383, 2, 240, 237] +[:mouse_move, 547, 379, 2, 241, 238] +[:mouse_move, 547, 378, 2, 242, 238] +[:mouse_move, 547, 376, 2, 243, 238] +[:mouse_move, 546, 375, 2, 244, 238] +[:mouse_move, 546, 374, 2, 245, 238] +[:mouse_move, 546, 372, 2, 246, 239] +[:mouse_move, 545, 368, 2, 247, 239] +[:mouse_move, 544, 366, 2, 248, 239] +[:mouse_move, 543, 363, 2, 249, 240] +[:mouse_move, 540, 357, 2, 250, 240] +[:mouse_move, 534, 350, 2, 251, 241] +[:mouse_move, 528, 344, 2, 252, 241] +[:mouse_move, 520, 339, 2, 253, 241] +[:mouse_move, 517, 339, 2, 254, 241] +[:mouse_move, 514, 337, 2, 255, 241] +[:mouse_move, 513, 337, 2, 256, 242] +[:mouse_move, 511, 336, 2, 257, 242] +[:mouse_move, 509, 336, 2, 258, 242] +[:mouse_move, 508, 336, 2, 259, 242] +[:mouse_move, 507, 336, 2, 260, 242] +[:mouse_move, 505, 335, 2, 261, 242] +[:mouse_move, 502, 335, 2, 262, 243] +[:mouse_move, 498, 335, 2, 263, 244] +[:mouse_move, 494, 335, 2, 264, 244] +[:mouse_move, 484, 335, 2, 265, 244] +[:mouse_move, 475, 335, 2, 266, 245] +[:mouse_move, 469, 335, 2, 267, 245] +[:mouse_move, 459, 338, 2, 268, 246] +[:mouse_move, 451, 342, 2, 269, 246] +[:mouse_move, 441, 347, 2, 270, 246] +[:mouse_move, 430, 352, 2, 271, 246] +[:mouse_move, 421, 357, 2, 272, 247] +[:mouse_move, 408, 366, 2, 273, 247] +[:mouse_move, 398, 375, 2, 274, 247] +[:mouse_move, 390, 386, 2, 275, 248] +[:mouse_move, 380, 402, 2, 276, 248] +[:mouse_move, 374, 412, 2, 277, 248] +[:mouse_move, 368, 420, 2, 278, 248] +[:mouse_move, 364, 427, 2, 279, 248] +[:mouse_move, 362, 437, 2, 280, 249] +[:mouse_move, 362, 448, 2, 281, 249] +[:mouse_move, 362, 455, 2, 282, 249] +[:mouse_move, 362, 463, 2, 283, 249] +[:mouse_move, 362, 467, 2, 284, 249] +[:mouse_move, 362, 473, 2, 285, 250] +[:mouse_move, 364, 483, 2, 286, 250] +[:mouse_move, 368, 490, 2, 287, 251] +[:mouse_move, 372, 496, 2, 288, 251] +[:mouse_move, 379, 505, 2, 289, 251] +[:mouse_move, 384, 509, 2, 290, 251] +[:mouse_move, 385, 511, 2, 291, 251] +[:mouse_move, 387, 511, 2, 292, 252] +[:mouse_move, 387, 512, 2, 293, 252] +[:mouse_move, 388, 512, 2, 294, 253] +[:mouse_move, 390, 514, 2, 295, 254] +[:mouse_move, 392, 516, 2, 296, 254] +[:mouse_move, 392, 517, 2, 297, 254] +[:mouse_move, 393, 518, 2, 298, 255] +[:mouse_move, 394, 520, 2, 299, 255] +[:mouse_move, 395, 523, 2, 300, 256] +[:mouse_move, 395, 527, 2, 301, 257] +[:mouse_move, 395, 533, 2, 302, 257] +[:mouse_move, 392, 542, 2, 303, 258] +[:mouse_move, 392, 555, 2, 304, 258] +[:mouse_move, 392, 567, 2, 305, 258] +[:mouse_move, 392, 576, 2, 306, 259] +[:mouse_move, 392, 583, 2, 307, 259] +[:mouse_move, 392, 587, 2, 308, 259] +[:mouse_move, 392, 590, 2, 309, 259] +[:mouse_move, 392, 592, 2, 310, 260] +[:mouse_move, 391, 594, 2, 311, 260] +[:mouse_move, 391, 595, 2, 312, 261] +[:mouse_move, 389, 597, 2, 313, 262] +[:mouse_move, 382, 602, 2, 314, 262] +[:mouse_move, 372, 608, 2, 315, 263] +[:mouse_move, 359, 612, 2, 316, 263] +[:mouse_move, 345, 619, 2, 317, 263] +[:mouse_move, 329, 626, 2, 318, 263] +[:mouse_move, 314, 633, 2, 319, 263] +[:mouse_move, 301, 639, 2, 320, 263] +[:mouse_move, 286, 643, 2, 321, 264] +[:mouse_move, 270, 646, 2, 322, 264] +[:mouse_move, 255, 647, 2, 323, 264] +[:mouse_move, 236, 650, 2, 324, 264] +[:mouse_move, 227, 650, 2, 325, 265] +[:mouse_move, 216, 650, 2, 326, 265] +[:mouse_move, 207, 650, 2, 327, 265] +[:mouse_move, 203, 651, 2, 328, 265] +[:mouse_move, 202, 651, 2, 329, 265] +[:mouse_move, 201, 651, 2, 330, 265] +[:mouse_move, 200, 651, 2, 331, 267] +[:mouse_move, 199, 651, 2, 332, 267] +[:mouse_move, 198, 651, 2, 333, 268] +[:mouse_move, 195, 652, 2, 334, 268] +[:mouse_move, 194, 653, 2, 335, 269] +[:mouse_move, 193, 654, 2, 336, 269] +[:mouse_move, 193, 655, 2, 337, 272] +[:mouse_move, 192, 655, 2, 338, 272] +[:mouse_move, 192, 656, 2, 339, 274] +[:mouse_move, 192, 658, 2, 340, 275] +[:mouse_move, 192, 661, 2, 341, 275] +[:mouse_move, 192, 662, 2, 342, 275] +[:mouse_move, 192, 664, 2, 343, 276] +[:mouse_move, 192, 665, 2, 344, 277] +[:mouse_button_up, 1, 0, 1, 345, 329] +[:mouse_move, 192, 664, 2, 346, 337] +[:mouse_move, 193, 664, 2, 347, 354] +[:mouse_move, 195, 663, 2, 348, 355] +[:mouse_move, 201, 662, 2, 349, 355] +[:mouse_move, 211, 660, 2, 350, 356] +[:mouse_move, 227, 659, 2, 351, 357] +[:mouse_move, 283, 651, 2, 352, 357] +[:mouse_move, 348, 641, 2, 353, 358] +[:mouse_move, 431, 632, 2, 354, 358] +[:mouse_move, 522, 622, 2, 355, 359] +[:mouse_move, 605, 609, 2, 356, 359] +[:mouse_move, 661, 603, 2, 357, 360] +[:mouse_move, 687, 599, 2, 358, 361] +[:mouse_move, 702, 596, 2, 359, 361] +[:mouse_move, 708, 595, 2, 360, 362] +[:mouse_move, 711, 593, 2, 361, 362] +[:mouse_move, 712, 592, 2, 362, 364] +[:mouse_move, 714, 590, 2, 363, 364] +[:mouse_move, 715, 589, 2, 364, 365] +[:mouse_move, 715, 587, 2, 365, 365] +[:mouse_move, 713, 584, 2, 366, 366] +[:mouse_move, 712, 584, 2, 367, 367] +[:mouse_move, 711, 583, 2, 368, 368] +[:mouse_move, 712, 582, 2, 369, 369] +[:mouse_move, 716, 579, 2, 370, 370] +[:mouse_move, 719, 578, 2, 371, 371] +[:mouse_move, 740, 571, 2, 372, 372] +[:mouse_move, 757, 569, 2, 373, 372] +[:mouse_move, 764, 568, 2, 374, 372] +[:mouse_move, 764, 567, 2, 375, 374] +[:mouse_button_pressed, 1, 0, 1, 376, 376] +[:mouse_button_up, 1, 0, 1, 377, 377] +[:mouse_move, 764, 571, 2, 378, 390] +[:mouse_move, 764, 579, 2, 379, 391] +[:mouse_move, 764, 584, 2, 380, 391] +[:mouse_move, 763, 586, 2, 381, 392] +[:mouse_move, 760, 592, 2, 382, 393] +[:mouse_move, 755, 600, 2, 383, 393] +[:mouse_move, 752, 606, 2, 384, 393] +[:mouse_move, 750, 607, 2, 385, 394] +[:mouse_move, 750, 608, 2, 386, 395] +[:mouse_move, 750, 610, 2, 387, 396] +[:mouse_move, 750, 614, 2, 388, 396] +[:mouse_move, 750, 615, 2, 389, 396] +[:mouse_move, 750, 617, 2, 390, 397] +[:mouse_move, 750, 618, 2, 391, 398] +[:mouse_move, 750, 620, 2, 392, 399] +[:mouse_move, 749, 622, 2, 393, 400] +[:mouse_button_pressed, 1, 0, 1, 394, 401] +[:mouse_button_up, 1, 0, 1, 395, 403] +[:mouse_move, 749, 623, 2, 396, 408] +[:mouse_move, 750, 623, 2, 397, 410] +[:mouse_move, 754, 624, 2, 398, 410] +[:mouse_move, 760, 625, 2, 399, 411] +[:mouse_move, 769, 628, 2, 400, 411] +[:mouse_move, 785, 630, 2, 401, 412] +[:mouse_move, 791, 631, 2, 402, 413] +[:mouse_move, 792, 631, 2, 403, 414] +[:mouse_move, 793, 631, 2, 404, 414] +[:mouse_move, 794, 631, 2, 405, 415] +[:mouse_move, 795, 631, 2, 406, 415] +[:mouse_move, 796, 631, 2, 407, 416] +[:mouse_move, 798, 631, 2, 408, 417] +[:mouse_move, 799, 631, 2, 409, 422] +[:mouse_move, 799, 630, 2, 410, 423] +[:mouse_move, 800, 627, 2, 411, 426] +[:mouse_move, 802, 621, 2, 412, 427] +[:mouse_move, 804, 609, 2, 413, 427] +[:mouse_move, 806, 601, 2, 414, 428] +[:mouse_move, 804, 595, 2, 415, 429] +[:mouse_move, 799, 591, 2, 416, 430] +[:mouse_move, 796, 591, 2, 417, 430] +[:mouse_move, 792, 591, 2, 418, 430] +[:mouse_move, 786, 593, 2, 419, 431] +[:mouse_move, 775, 597, 2, 420, 432] +[:mouse_move, 766, 600, 2, 421, 433] +[:mouse_move, 763, 600, 2, 422, 434] +[:mouse_move, 762, 600, 2, 423, 434] +[:mouse_move, 761, 599, 2, 424, 435] +[:mouse_move, 759, 592, 2, 425, 435] +[:mouse_move, 756, 578, 2, 426, 436] +[:mouse_move, 755, 571, 2, 427, 437] +[:mouse_move, 755, 566, 2, 428, 437] +[:mouse_button_pressed, 1, 0, 1, 429, 440] +[:mouse_button_up, 1, 0, 1, 430, 442] +[:mouse_move, 755, 567, 2, 431, 443] +[:mouse_move, 756, 567, 2, 432, 444] +[:mouse_move, 756, 568, 2, 433, 446] +[:mouse_move, 756, 573, 2, 434, 446] +[:mouse_move, 756, 582, 2, 435, 447] +[:mouse_move, 756, 592, 2, 436, 448] +[:mouse_move, 758, 599, 2, 437, 448] +[:mouse_move, 758, 604, 2, 438, 449] +[:mouse_move, 759, 607, 2, 439, 449] +[:mouse_move, 760, 610, 2, 440, 450] +[:mouse_move, 760, 611, 2, 441, 451] +[:mouse_move, 760, 612, 2, 442, 451] +[:mouse_move, 760, 613, 2, 443, 452] +[:mouse_move, 760, 614, 2, 444, 452] +[:mouse_move, 760, 615, 2, 445, 454] +[:mouse_move, 759, 616, 2, 446, 455] +[:mouse_move, 759, 617, 2, 447, 455] +[:mouse_move, 759, 618, 2, 448, 456] +[:mouse_move, 759, 619, 2, 449, 457] +[:mouse_move, 759, 621, 2, 450, 459] +[:mouse_move, 758, 621, 2, 451, 460] +[:mouse_move, 758, 622, 2, 452, 463] +[:mouse_move, 758, 623, 2, 453, 464] +[:mouse_move, 759, 623, 2, 454, 467] +[:mouse_move, 759, 624, 2, 455, 468] +[:mouse_move, 767, 624, 2, 456, 468] +[:mouse_move, 776, 625, 2, 457, 469] +[:mouse_move, 787, 627, 2, 458, 469] +[:mouse_move, 795, 629, 2, 459, 470] +[:mouse_move, 797, 630, 2, 460, 470] +[:mouse_move, 798, 630, 2, 461, 471] +[:mouse_button_pressed, 1, 0, 1, 462, 476] +[:mouse_move, 799, 630, 2, 463, 476] +[:mouse_button_up, 1, 0, 1, 464, 478] +[:mouse_move, 799, 625, 2, 465, 478] +[:mouse_move, 800, 615, 2, 466, 479] +[:mouse_move, 801, 602, 2, 467, 480] +[:mouse_move, 801, 590, 2, 468, 481] +[:mouse_move, 801, 580, 2, 469, 481] +[:mouse_move, 801, 571, 2, 470, 482] +[:mouse_move, 801, 570, 2, 471, 482] +[:mouse_move, 801, 569, 2, 472, 483] +[:mouse_move, 801, 568, 2, 473, 485] +[:mouse_move, 802, 567, 2, 474, 487] +[:mouse_move, 803, 567, 2, 475, 488] +[:mouse_button_pressed, 1, 0, 1, 476, 491] +[:mouse_button_up, 1, 0, 1, 477, 493] +[:mouse_move, 804, 567, 2, 478, 494] +[:mouse_move, 811, 567, 2, 479, 495] +[:mouse_move, 822, 567, 2, 480, 495] +[:mouse_move, 837, 567, 2, 481, 496] +[:mouse_move, 850, 567, 2, 482, 496] +[:mouse_move, 861, 567, 2, 483, 497] +[:mouse_move, 873, 568, 2, 484, 497] +[:mouse_move, 875, 568, 2, 485, 498] +[:mouse_move, 876, 568, 2, 486, 500] +[:mouse_move, 877, 568, 2, 487, 501] +[:mouse_move, 877, 569, 2, 488, 501] +[:mouse_move, 868, 570, 2, 489, 516] +[:mouse_move, 850, 574, 2, 490, 516] +[:mouse_move, 835, 577, 2, 491, 517] +[:mouse_move, 818, 577, 2, 492, 517] +[:mouse_move, 810, 577, 2, 493, 518] +[:mouse_move, 810, 578, 2, 494, 519] +[:mouse_move, 813, 578, 2, 495, 520] +[:mouse_move, 816, 578, 2, 496, 521] +[:mouse_move, 819, 578, 2, 497, 521] +[:mouse_move, 820, 578, 2, 498, 522] +[:mouse_button_pressed, 1, 0, 1, 499, 526] +[:mouse_button_up, 1, 0, 1, 500, 527] +[:mouse_move, 822, 579, 2, 501, 529] +[:mouse_move, 823, 581, 2, 502, 530] +[:mouse_move, 824, 581, 2, 503, 531] +[:mouse_move, 825, 581, 2, 504, 531] +[:mouse_move, 829, 581, 2, 505, 531] +[:mouse_move, 836, 581, 2, 506, 532] +[:mouse_move, 843, 580, 2, 507, 533] +[:mouse_move, 852, 577, 2, 508, 534] +[:mouse_move, 862, 574, 2, 509, 534] +[:mouse_move, 864, 574, 2, 510, 535] +[:mouse_move, 865, 574, 2, 511, 541] +[:mouse_button_pressed, 1, 0, 1, 512, 542] +[:mouse_button_up, 1, 0, 1, 513, 544] +[:mouse_move, 866, 581, 2, 514, 545] +[:mouse_move, 868, 587, 2, 515, 545] +[:mouse_move, 870, 592, 2, 516, 546] +[:mouse_move, 871, 595, 2, 517, 546] +[:mouse_move, 873, 598, 2, 518, 547] +[:mouse_move, 874, 602, 2, 519, 548] +[:mouse_move, 875, 608, 2, 520, 548] +[:mouse_move, 875, 610, 2, 521, 549] +[:mouse_move, 875, 613, 2, 522, 549] +[:mouse_move, 875, 616, 2, 523, 550] +[:mouse_move, 875, 617, 2, 524, 551] +[:mouse_move, 875, 618, 2, 525, 552] +[:mouse_move, 874, 620, 2, 526, 553] +[:mouse_move, 872, 625, 2, 527, 553] +[:mouse_move, 871, 627, 2, 528, 554] +[:mouse_move, 871, 628, 2, 529, 554] +[:mouse_move, 871, 629, 2, 530, 555] +[:mouse_move, 870, 630, 2, 531, 556] +[:mouse_button_pressed, 1, 0, 1, 532, 558] +[:mouse_move, 871, 630, 2, 533, 558] +[:mouse_button_up, 1, 0, 1, 534, 560] +[:mouse_move, 869, 630, 2, 535, 564] +[:mouse_move, 864, 631, 2, 536, 565] +[:mouse_move, 857, 632, 2, 537, 566] +[:mouse_move, 845, 633, 2, 538, 567] +[:mouse_move, 830, 635, 2, 539, 567] +[:mouse_move, 815, 636, 2, 540, 568] +[:mouse_move, 800, 636, 2, 541, 568] +[:mouse_move, 782, 636, 2, 542, 569] +[:mouse_move, 773, 636, 2, 543, 570] +[:mouse_move, 764, 636, 2, 544, 570] +[:mouse_move, 757, 636, 2, 545, 571] +[:mouse_move, 748, 636, 2, 546, 571] +[:mouse_move, 741, 634, 2, 547, 572] +[:mouse_move, 734, 634, 2, 548, 573] +[:mouse_move, 728, 634, 2, 549, 574] +[:mouse_move, 720, 634, 2, 550, 574] +[:mouse_move, 713, 633, 2, 551, 575] +[:mouse_move, 723, 632, 2, 552, 579] +[:mouse_move, 734, 629, 2, 553, 580] +[:mouse_move, 745, 626, 2, 554, 581] +[:mouse_move, 761, 623, 2, 555, 581] +[:mouse_move, 784, 617, 2, 556, 582] +[:mouse_move, 811, 610, 2, 557, 582] +[:mouse_move, 834, 601, 2, 558, 583] +[:mouse_move, 850, 594, 2, 559, 584] +[:mouse_move, 857, 590, 2, 560, 584] +[:mouse_move, 858, 589, 2, 561, 585] +[:mouse_move, 858, 588, 2, 562, 585] +[:mouse_move, 858, 587, 2, 563, 586] +[:mouse_move, 858, 586, 2, 564, 587] +[:mouse_move, 858, 585, 2, 565, 588] +[:mouse_move, 858, 584, 2, 566, 593] +[:mouse_button_pressed, 1, 0, 1, 567, 595] +[:mouse_button_up, 1, 0, 1, 568, 597] +[:mouse_move, 851, 587, 2, 569, 599] +[:mouse_move, 840, 590, 2, 570, 599] +[:mouse_move, 825, 594, 2, 571, 600] +[:mouse_move, 803, 600, 2, 572, 600] +[:mouse_move, 777, 605, 2, 573, 601] +[:mouse_move, 751, 607, 2, 574, 602] +[:mouse_move, 729, 611, 2, 575, 602] +[:mouse_move, 713, 614, 2, 576, 603] +[:mouse_move, 701, 615, 2, 577, 603] +[:mouse_move, 695, 615, 2, 578, 604] +[:mouse_move, 694, 616, 2, 579, 605] +[:mouse_move, 692, 615, 2, 580, 605] +[:mouse_move, 690, 614, 2, 581, 606] +[:mouse_move, 689, 614, 2, 582, 607] +[:mouse_move, 688, 613, 2, 583, 607] +[:mouse_move, 688, 610, 2, 584, 608] +[:mouse_move, 687, 605, 2, 585, 608] +[:mouse_move, 686, 598, 2, 586, 609] +[:mouse_move, 686, 589, 2, 587, 610] +[:mouse_move, 686, 582, 2, 588, 610] +[:mouse_move, 687, 576, 2, 589, 611] +[:mouse_move, 688, 576, 2, 590, 611] +[:mouse_move, 688, 575, 2, 591, 612] +[:mouse_move, 689, 574, 2, 592, 613] +[:mouse_move, 689, 573, 2, 593, 613] +[:mouse_move, 690, 573, 2, 594, 614] +[:mouse_button_pressed, 1, 0, 1, 595, 615] +[:mouse_move, 690, 572, 2, 596, 616] +[:mouse_button_up, 1, 0, 1, 597, 617] +[:mouse_move, 690, 573, 2, 598, 617] +[:mouse_move, 690, 574, 2, 599, 619] +[:mouse_move, 690, 575, 2, 600, 620] +[:mouse_move, 690, 576, 2, 601, 621] +[:mouse_move, 690, 578, 2, 602, 621] +[:mouse_move, 690, 579, 2, 603, 622] +[:mouse_move, 690, 583, 2, 604, 622] +[:mouse_move, 691, 594, 2, 605, 622] +[:mouse_move, 693, 605, 2, 606, 623] +[:mouse_move, 696, 614, 2, 607, 624] +[:mouse_move, 698, 619, 2, 608, 625] +[:mouse_move, 699, 621, 2, 609, 625] +[:mouse_move, 700, 622, 2, 610, 626] +[:mouse_move, 701, 622, 2, 611, 634] +[:mouse_move, 702, 622, 2, 612, 649] +[:mouse_move, 702, 621, 2, 613, 656] +[:mouse_move, 705, 620, 2, 614, 656] +[:mouse_move, 718, 614, 2, 615, 657] +[:mouse_move, 750, 600, 2, 616, 657] +[:mouse_move, 811, 576, 2, 617, 658] +[:mouse_move, 895, 538, 2, 618, 659] +[:mouse_move, 984, 489, 2, 619, 659] +[:mouse_move, 1076, 432, 2, 620, 660] +[:mouse_move, 1151, 376, 2, 621, 661] +[:mouse_move, 1205, 336, 2, 622, 661] +[:mouse_move, 1232, 312, 2, 623, 662] +[:mouse_move, 1244, 292, 2, 624, 662] +[:mouse_move, 1244, 286, 2, 625, 663] +[:mouse_move, 1243, 284, 2, 626, 663] +[:mouse_move, 1244, 284, 2, 627, 667] +[:key_down_raw, 96, 0, 2, 628, 675] +[:mouse_move, 1243, 284, 2, 629, 676] +[:mouse_move, 1243, 283, 2, 630, 676] +[:mouse_move, 1243, 282, 2, 631, 676] +[:mouse_move, 1243, 281, 2, 632, 677] +[:key_up_raw, 96, 0, 2, 633, 677] +[:mouse_move, 1243, 280, 2, 634, 677] +[:mouse_move, 1242, 279, 2, 635, 678] +[:mouse_move, 1242, 277, 2, 636, 678] +[:mouse_move, 1242, 274, 2, 637, 679] +[:mouse_move, 1241, 271, 2, 638, 679] +[:mouse_move, 1239, 268, 2, 639, 680] +[:mouse_move, 1237, 264, 2, 640, 680] +[:mouse_move, 1233, 261, 2, 641, 681] +[:mouse_move, 1231, 259, 2, 642, 682] +[:mouse_move, 1231, 258, 2, 643, 682] +[:mouse_move, 1230, 256, 2, 644, 683] +[:mouse_move, 1229, 255, 2, 645, 683] +[:mouse_move, 1227, 252, 2, 646, 684] +[:mouse_move, 1222, 247, 2, 647, 685] +[:mouse_move, 1219, 244, 2, 648, 685] +[:mouse_move, 1217, 242, 2, 649, 685] +[:mouse_move, 1216, 241, 2, 650, 686] +[:mouse_move, 1214, 240, 2, 651, 686] +[:mouse_move, 1206, 237, 2, 652, 687] +[:mouse_move, 1194, 232, 2, 653, 688] +[:mouse_move, 1176, 228, 2, 654, 688] +[:mouse_move, 1161, 224, 2, 655, 688] +[:mouse_move, 1157, 224, 2, 656, 689] +[:mouse_move, 1154, 222, 2, 657, 689] +[:mouse_move, 1148, 217, 2, 658, 690] +[:mouse_move, 1139, 205, 2, 659, 691] +[:mouse_move, 1127, 186, 2, 660, 691] +[:mouse_move, 1118, 165, 2, 661, 691] +[:mouse_move, 1109, 140, 2, 662, 692] +[:mouse_move, 1105, 120, 2, 663, 692] +[:mouse_move, 1107, 107, 2, 664, 693] +[:mouse_move, 1108, 105, 2, 665, 693] +[:mouse_move, 1108, 104, 2, 666, 694] +[:mouse_move, 1100, 103, 2, 667, 697] +[:mouse_move, 1085, 101, 2, 668, 697] +[:mouse_move, 1067, 99, 2, 669, 698] +[:mouse_move, 1051, 96, 2, 670, 698] +[:mouse_move, 1026, 94, 2, 671, 698] +[:mouse_move, 988, 90, 2, 672, 699] +[:mouse_move, 919, 86, 2, 673, 700] +[:mouse_move, 868, 83, 2, 674, 700] +[:mouse_move, 822, 83, 2, 675, 701] +[:mouse_move, 796, 85, 2, 676, 701] +[:mouse_move, 787, 87, 2, 677, 701] +[:mouse_move, 786, 88, 2, 678, 702] +[:mouse_move, 787, 88, 2, 679, 710] +[:mouse_move, 789, 88, 2, 680, 718] +[:mouse_move, 790, 89, 2, 681, 720] +[:key_down_raw, 13, 0, 2, 682, 730] diff --git a/samples/13_path_finding_algorithms/06_heuristic/app/main.rb b/samples/13_path_finding_algorithms/06_heuristic/app/main.rb index cbdfca7..ad4c5ce 100644 --- a/samples/13_path_finding_algorithms/06_heuristic/app/main.rb +++ b/samples/13_path_finding_algorithms/06_heuristic/app/main.rb @@ -969,7 +969,7 @@ def tick args end # Every tick, new args are passed, and the Breadth First Search tick is called - $heuristic_with_walls ||= Heuristic_With_Walls.new(args) + $heuristic_with_walls ||= Heuristic_With_Walls.new $heuristic_with_walls.args = args $heuristic_with_walls.tick end diff --git a/samples/13_path_finding_algorithms/06_heuristic/replay.txt b/samples/13_path_finding_algorithms/06_heuristic/replay.txt new file mode 100644 index 0000000..1683449 --- /dev/null +++ b/samples/13_path_finding_algorithms/06_heuristic/replay.txt @@ -0,0 +1,719 @@ +replay_version 2.0 +stopped_at 1004 +seed 100 +recorded_at 2021-11-20 11:21:45 -0600 +[:mouse_button_up, 1, 0, 1, 1, 3] +[:mouse_move, 767, 87, 2, 2, 22] +[:mouse_move, 742, 87, 2, 3, 22] +[:mouse_move, 713, 87, 2, 4, 23] +[:mouse_move, 685, 87, 2, 5, 24] +[:mouse_move, 656, 87, 2, 6, 25] +[:mouse_move, 633, 87, 2, 7, 26] +[:mouse_move, 616, 87, 2, 8, 27] +[:mouse_move, 603, 85, 2, 9, 28] +[:mouse_move, 587, 77, 2, 10, 29] +[:mouse_move, 567, 69, 2, 11, 30] +[:mouse_move, 543, 60, 2, 12, 31] +[:mouse_move, 528, 55, 2, 13, 31] +[:mouse_move, 517, 53, 2, 14, 32] +[:mouse_move, 513, 51, 2, 15, 33] +[:mouse_move, 511, 50, 2, 16, 34] +[:mouse_move, 506, 49, 2, 17, 35] +[:mouse_move, 501, 48, 2, 18, 36] +[:mouse_move, 497, 46, 2, 19, 36] +[:mouse_move, 496, 46, 2, 20, 37] +[:mouse_move, 495, 46, 2, 21, 38] +[:mouse_move, 490, 46, 2, 22, 39] +[:mouse_move, 483, 46, 2, 23, 40] +[:mouse_move, 470, 46, 2, 24, 41] +[:mouse_move, 461, 46, 2, 25, 41] +[:mouse_move, 456, 46, 2, 26, 42] +[:mouse_move, 457, 46, 2, 27, 55] +[:mouse_button_pressed, 1, 0, 1, 28, 58] +[:mouse_move, 458, 46, 2, 29, 59] +[:mouse_move, 460, 46, 2, 30, 62] +[:mouse_move, 461, 46, 2, 31, 62] +[:mouse_move, 463, 46, 2, 32, 63] +[:mouse_move, 464, 46, 2, 33, 64] +[:mouse_move, 465, 46, 2, 34, 64] +[:mouse_move, 466, 46, 2, 35, 65] +[:mouse_move, 467, 46, 2, 36, 65] +[:mouse_move, 469, 46, 2, 37, 66] +[:mouse_move, 470, 46, 2, 38, 66] +[:mouse_move, 472, 46, 2, 39, 67] +[:mouse_move, 473, 46, 2, 40, 67] +[:mouse_move, 474, 46, 2, 41, 68] +[:mouse_move, 477, 46, 2, 42, 68] +[:mouse_move, 479, 46, 2, 43, 68] +[:mouse_move, 480, 46, 2, 44, 69] +[:mouse_move, 481, 46, 2, 45, 70] +[:mouse_move, 483, 46, 2, 46, 71] +[:mouse_move, 484, 46, 2, 47, 71] +[:mouse_move, 485, 46, 2, 48, 71] +[:mouse_move, 487, 46, 2, 49, 72] +[:mouse_move, 489, 46, 2, 50, 72] +[:mouse_move, 492, 46, 2, 51, 72] +[:mouse_move, 496, 46, 2, 52, 72] +[:mouse_move, 502, 47, 2, 53, 73] +[:mouse_move, 507, 47, 2, 54, 73] +[:mouse_move, 513, 47, 2, 55, 73] +[:mouse_move, 519, 47, 2, 56, 73] +[:mouse_move, 521, 47, 2, 57, 74] +[:mouse_move, 524, 47, 2, 58, 74] +[:mouse_move, 527, 47, 2, 59, 74] +[:mouse_move, 531, 47, 2, 60, 74] +[:mouse_move, 535, 47, 2, 61, 75] +[:mouse_move, 539, 47, 2, 62, 75] +[:mouse_move, 542, 47, 2, 63, 75] +[:mouse_move, 544, 47, 2, 64, 75] +[:mouse_move, 546, 47, 2, 65, 76] +[:mouse_move, 550, 47, 2, 66, 76] +[:mouse_move, 552, 47, 2, 67, 76] +[:mouse_move, 553, 47, 2, 68, 76] +[:mouse_move, 555, 47, 2, 69, 76] +[:mouse_move, 556, 47, 2, 70, 77] +[:mouse_move, 557, 47, 2, 71, 77] +[:mouse_move, 558, 47, 2, 72, 77] +[:mouse_move, 561, 47, 2, 73, 77] +[:mouse_move, 563, 47, 2, 74, 78] +[:mouse_move, 564, 47, 2, 75, 78] +[:mouse_move, 566, 47, 2, 76, 78] +[:mouse_move, 570, 47, 2, 77, 78] +[:mouse_move, 571, 47, 2, 78, 78] +[:mouse_move, 572, 47, 2, 79, 79] +[:mouse_move, 573, 47, 2, 80, 79] +[:mouse_move, 575, 47, 2, 81, 79] +[:mouse_move, 581, 47, 2, 82, 80] +[:mouse_move, 582, 47, 2, 83, 80] +[:mouse_move, 585, 47, 2, 84, 80] +[:mouse_move, 586, 47, 2, 85, 80] +[:mouse_move, 588, 47, 2, 86, 80] +[:mouse_move, 589, 47, 2, 87, 81] +[:mouse_move, 591, 47, 2, 88, 81] +[:mouse_move, 593, 47, 2, 89, 81] +[:mouse_move, 594, 47, 2, 90, 81] +[:mouse_move, 595, 47, 2, 91, 81] +[:mouse_move, 596, 47, 2, 92, 82] +[:mouse_move, 600, 47, 2, 93, 82] +[:mouse_move, 602, 47, 2, 94, 82] +[:mouse_move, 607, 47, 2, 95, 82] +[:mouse_move, 611, 46, 2, 96, 82] +[:mouse_move, 613, 46, 2, 97, 82] +[:mouse_move, 614, 46, 2, 98, 83] +[:mouse_move, 617, 46, 2, 99, 83] +[:mouse_move, 621, 46, 2, 100, 83] +[:mouse_move, 623, 46, 2, 101, 83] +[:mouse_move, 625, 46, 2, 102, 83] +[:mouse_move, 626, 46, 2, 103, 83] +[:mouse_move, 627, 46, 2, 104, 84] +[:mouse_move, 629, 46, 2, 105, 84] +[:mouse_move, 632, 46, 2, 106, 84] +[:mouse_move, 634, 46, 2, 107, 84] +[:mouse_move, 636, 46, 2, 108, 84] +[:mouse_move, 637, 46, 2, 109, 84] +[:mouse_move, 639, 45, 2, 110, 85] +[:mouse_move, 641, 45, 2, 111, 85] +[:mouse_move, 643, 45, 2, 112, 85] +[:mouse_move, 646, 44, 2, 113, 85] +[:mouse_move, 648, 43, 2, 114, 85] +[:mouse_move, 650, 43, 2, 115, 85] +[:mouse_move, 652, 43, 2, 116, 85] +[:mouse_move, 654, 43, 2, 117, 86] +[:mouse_move, 661, 42, 2, 118, 86] +[:mouse_move, 667, 42, 2, 119, 86] +[:mouse_move, 676, 42, 2, 120, 86] +[:mouse_move, 682, 42, 2, 121, 86] +[:mouse_move, 691, 41, 2, 122, 86] +[:mouse_move, 694, 41, 2, 123, 86] +[:mouse_move, 697, 41, 2, 124, 87] +[:mouse_move, 700, 41, 2, 125, 87] +[:mouse_move, 703, 41, 2, 126, 87] +[:mouse_move, 704, 41, 2, 127, 87] +[:mouse_move, 706, 41, 2, 128, 87] +[:mouse_move, 707, 41, 2, 129, 87] +[:mouse_move, 709, 41, 2, 130, 87] +[:mouse_move, 710, 41, 2, 131, 87] +[:mouse_move, 713, 41, 2, 132, 88] +[:mouse_move, 717, 41, 2, 133, 88] +[:mouse_move, 721, 41, 2, 134, 88] +[:mouse_move, 725, 41, 2, 135, 88] +[:mouse_move, 726, 41, 2, 136, 88] +[:mouse_move, 728, 41, 2, 137, 88] +[:mouse_move, 732, 41, 2, 138, 88] +[:mouse_move, 742, 41, 2, 139, 88] +[:mouse_move, 754, 43, 2, 140, 89] +[:mouse_move, 769, 45, 2, 141, 89] +[:mouse_move, 772, 45, 2, 142, 89] +[:mouse_move, 776, 45, 2, 143, 89] +[:mouse_move, 777, 45, 2, 144, 89] +[:mouse_move, 778, 45, 2, 145, 91] +[:mouse_move, 778, 44, 2, 146, 91] +[:mouse_move, 779, 44, 2, 147, 91] +[:mouse_move, 780, 44, 2, 148, 91] +[:mouse_move, 781, 44, 2, 149, 91] +[:mouse_move, 782, 44, 2, 150, 92] +[:mouse_move, 784, 44, 2, 151, 92] +[:mouse_move, 785, 44, 2, 152, 92] +[:mouse_move, 786, 44, 2, 153, 92] +[:mouse_move, 787, 44, 2, 154, 92] +[:mouse_move, 788, 44, 2, 155, 92] +[:mouse_move, 789, 44, 2, 156, 93] +[:mouse_move, 790, 44, 2, 157, 93] +[:mouse_move, 790, 43, 2, 158, 93] +[:mouse_move, 791, 43, 2, 159, 93] +[:mouse_move, 792, 43, 2, 160, 93] +[:mouse_move, 793, 43, 2, 161, 93] +[:mouse_move, 791, 43, 2, 162, 94] +[:mouse_move, 790, 43, 2, 163, 95] +[:mouse_move, 785, 43, 2, 164, 95] +[:mouse_move, 775, 43, 2, 165, 95] +[:mouse_move, 762, 43, 2, 166, 95] +[:mouse_move, 745, 43, 2, 167, 95] +[:mouse_move, 727, 43, 2, 168, 95] +[:mouse_move, 704, 43, 2, 169, 95] +[:mouse_move, 680, 43, 2, 170, 95] +[:mouse_move, 653, 43, 2, 171, 95] +[:mouse_move, 628, 43, 2, 172, 95] +[:mouse_move, 606, 43, 2, 173, 96] +[:mouse_move, 589, 43, 2, 174, 96] +[:mouse_move, 577, 43, 2, 175, 96] +[:mouse_move, 568, 43, 2, 176, 96] +[:mouse_move, 558, 43, 2, 177, 96] +[:mouse_move, 552, 43, 2, 178, 96] +[:mouse_move, 544, 43, 2, 179, 96] +[:mouse_move, 532, 43, 2, 180, 97] +[:mouse_move, 523, 43, 2, 181, 97] +[:mouse_move, 517, 43, 2, 182, 97] +[:mouse_move, 512, 43, 2, 183, 97] +[:mouse_move, 508, 43, 2, 184, 97] +[:mouse_move, 506, 43, 2, 185, 98] +[:mouse_move, 503, 43, 2, 186, 98] +[:mouse_move, 501, 43, 2, 187, 98] +[:mouse_move, 500, 43, 2, 188, 98] +[:mouse_move, 498, 43, 2, 189, 98] +[:mouse_move, 495, 43, 2, 190, 99] +[:mouse_move, 492, 43, 2, 191, 99] +[:mouse_move, 489, 43, 2, 192, 99] +[:mouse_move, 485, 43, 2, 193, 99] +[:mouse_move, 480, 43, 2, 194, 100] +[:mouse_move, 476, 43, 2, 195, 100] +[:mouse_move, 472, 43, 2, 196, 100] +[:mouse_move, 471, 43, 2, 197, 101] +[:mouse_move, 470, 43, 2, 198, 102] +[:mouse_move, 469, 43, 2, 199, 102] +[:mouse_move, 468, 43, 2, 200, 103] +[:mouse_move, 467, 43, 2, 201, 105] +[:mouse_move, 467, 44, 2, 202, 111] +[:mouse_move, 468, 43, 2, 203, 114] +[:mouse_move, 469, 43, 2, 204, 115] +[:mouse_move, 474, 43, 2, 205, 115] +[:mouse_move, 479, 43, 2, 206, 116] +[:mouse_move, 482, 43, 2, 207, 116] +[:mouse_move, 484, 42, 2, 208, 117] +[:mouse_move, 486, 42, 2, 209, 118] +[:mouse_move, 488, 42, 2, 210, 118] +[:mouse_move, 490, 42, 2, 211, 118] +[:mouse_move, 492, 42, 2, 212, 118] +[:mouse_move, 493, 42, 2, 213, 120] +[:mouse_button_up, 1, 0, 1, 214, 123] +[:mouse_move, 495, 47, 2, 215, 127] +[:mouse_move, 498, 56, 2, 216, 128] +[:mouse_move, 500, 63, 2, 217, 128] +[:mouse_move, 500, 71, 2, 218, 129] +[:mouse_move, 500, 73, 2, 219, 129] +[:mouse_move, 500, 75, 2, 220, 130] +[:mouse_move, 499, 78, 2, 221, 131] +[:mouse_move, 497, 80, 2, 222, 131] +[:mouse_move, 495, 82, 2, 223, 132] +[:mouse_move, 494, 83, 2, 224, 132] +[:mouse_move, 493, 83, 2, 225, 133] +[:mouse_move, 493, 84, 2, 226, 141] +[:mouse_move, 498, 90, 2, 227, 141] +[:mouse_move, 506, 95, 2, 228, 142] +[:mouse_move, 509, 98, 2, 229, 142] +[:mouse_move, 510, 98, 2, 230, 143] +[:mouse_move, 509, 98, 2, 231, 147] +[:mouse_move, 507, 98, 2, 232, 148] +[:mouse_move, 506, 97, 2, 233, 151] +[:mouse_button_pressed, 1, 0, 1, 234, 152] +[:mouse_button_up, 1, 0, 1, 235, 154] +[:mouse_button_pressed, 1, 0, 1, 236, 170] +[:mouse_move, 507, 97, 2, 237, 170] +[:mouse_button_up, 1, 0, 1, 238, 173] +[:mouse_button_pressed, 1, 0, 1, 239, 174] +[:mouse_button_up, 1, 0, 1, 240, 178] +[:mouse_button_pressed, 1, 0, 1, 241, 180] +[:mouse_button_up, 1, 0, 1, 242, 183] +[:mouse_button_pressed, 1, 0, 1, 243, 185] +[:mouse_button_up, 1, 0, 1, 244, 189] +[:mouse_button_pressed, 1, 0, 1, 245, 190] +[:mouse_button_up, 1, 0, 1, 246, 195] +[:mouse_button_pressed, 1, 0, 1, 247, 196] +[:mouse_button_up, 1, 0, 1, 248, 199] +[:mouse_button_pressed, 1, 0, 1, 249, 201] +[:mouse_button_up, 1, 0, 1, 250, 203] +[:mouse_move, 508, 97, 2, 251, 205] +[:mouse_button_pressed, 1, 0, 1, 252, 205] +[:mouse_button_up, 1, 0, 1, 253, 209] +[:mouse_button_pressed, 1, 0, 1, 254, 210] +[:mouse_button_up, 1, 0, 1, 255, 214] +[:mouse_button_pressed, 1, 0, 1, 256, 215] +[:mouse_button_up, 1, 0, 1, 257, 219] +[:mouse_button_pressed, 1, 0, 1, 258, 222] +[:mouse_button_up, 1, 0, 1, 259, 226] +[:mouse_move, 508, 98, 2, 260, 226] +[:mouse_button_pressed, 1, 0, 1, 261, 229] +[:mouse_button_up, 1, 0, 1, 262, 232] +[:mouse_move, 509, 98, 2, 263, 235] +[:mouse_move, 509, 97, 2, 264, 237] +[:mouse_move, 515, 96, 2, 265, 238] +[:mouse_move, 529, 94, 2, 266, 239] +[:mouse_move, 573, 93, 2, 267, 240] +[:mouse_move, 609, 93, 2, 268, 242] +[:mouse_move, 639, 93, 2, 269, 242] +[:mouse_move, 663, 93, 2, 270, 243] +[:mouse_move, 680, 93, 2, 271, 244] +[:mouse_move, 691, 93, 2, 272, 245] +[:mouse_move, 695, 93, 2, 273, 246] +[:mouse_move, 696, 93, 2, 274, 247] +[:mouse_move, 698, 93, 2, 275, 248] +[:mouse_move, 701, 94, 2, 276, 249] +[:mouse_move, 702, 94, 2, 277, 250] +[:mouse_move, 703, 94, 2, 278, 251] +[:mouse_move, 705, 94, 2, 279, 256] +[:mouse_move, 707, 94, 2, 280, 256] +[:mouse_move, 712, 94, 2, 281, 257] +[:mouse_move, 718, 94, 2, 282, 258] +[:mouse_move, 727, 94, 2, 283, 259] +[:mouse_move, 734, 94, 2, 284, 260] +[:mouse_move, 736, 94, 2, 285, 261] +[:mouse_move, 737, 94, 2, 286, 265] +[:mouse_move, 738, 94, 2, 287, 271] +[:mouse_button_pressed, 1, 0, 1, 288, 272] +[:mouse_button_up, 1, 0, 1, 289, 275] +[:mouse_button_pressed, 1, 0, 1, 290, 280] +[:mouse_button_up, 1, 0, 1, 291, 284] +[:mouse_move, 739, 94, 2, 292, 287] +[:mouse_button_pressed, 1, 0, 1, 293, 288] +[:mouse_button_up, 1, 0, 1, 294, 292] +[:mouse_button_pressed, 1, 0, 1, 295, 296] +[:mouse_button_up, 1, 0, 1, 296, 300] +[:mouse_button_pressed, 1, 0, 1, 297, 303] +[:mouse_button_up, 1, 0, 1, 298, 306] +[:mouse_move, 740, 94, 2, 299, 308] +[:mouse_button_pressed, 1, 0, 1, 300, 309] +[:mouse_button_up, 1, 0, 1, 301, 312] +[:mouse_button_pressed, 1, 0, 1, 302, 317] +[:mouse_button_up, 1, 0, 1, 303, 319] +[:mouse_move, 733, 100, 2, 304, 321] +[:mouse_move, 716, 115, 2, 305, 322] +[:mouse_move, 694, 133, 2, 306, 322] +[:mouse_move, 669, 152, 2, 307, 323] +[:mouse_move, 645, 172, 2, 308, 324] +[:mouse_move, 618, 207, 2, 309, 325] +[:mouse_move, 602, 229, 2, 310, 325] +[:mouse_move, 586, 244, 2, 311, 326] +[:mouse_move, 571, 255, 2, 312, 326] +[:mouse_move, 560, 263, 2, 313, 327] +[:mouse_move, 558, 268, 2, 314, 328] +[:mouse_move, 557, 274, 2, 315, 329] +[:mouse_move, 559, 279, 2, 316, 329] +[:mouse_move, 559, 284, 2, 317, 329] +[:mouse_move, 553, 295, 2, 318, 330] +[:mouse_move, 538, 310, 2, 319, 331] +[:mouse_move, 515, 328, 2, 320, 332] +[:mouse_move, 476, 357, 2, 321, 332] +[:mouse_move, 448, 381, 2, 322, 333] +[:mouse_move, 423, 406, 2, 323, 333] +[:mouse_move, 404, 428, 2, 324, 334] +[:mouse_move, 381, 448, 2, 325, 335] +[:mouse_move, 354, 469, 2, 326, 336] +[:mouse_move, 325, 492, 2, 327, 336] +[:mouse_move, 297, 512, 2, 328, 337] +[:mouse_move, 274, 526, 2, 329, 337] +[:mouse_move, 252, 535, 2, 330, 338] +[:mouse_move, 237, 544, 2, 331, 339] +[:mouse_move, 227, 553, 2, 332, 340] +[:mouse_move, 226, 555, 2, 333, 340] +[:mouse_move, 226, 556, 2, 334, 341] +[:mouse_move, 228, 557, 2, 335, 342] +[:mouse_move, 239, 558, 2, 336, 343] +[:mouse_move, 266, 563, 2, 337, 343] +[:mouse_move, 303, 568, 2, 338, 344] +[:mouse_move, 333, 575, 2, 339, 344] +[:mouse_move, 356, 581, 2, 340, 345] +[:mouse_move, 375, 587, 2, 341, 346] +[:mouse_move, 390, 591, 2, 342, 347] +[:mouse_move, 407, 598, 2, 343, 347] +[:mouse_move, 414, 600, 2, 344, 348] +[:mouse_move, 415, 600, 2, 345, 348] +[:mouse_move, 416, 601, 2, 346, 349] +[:mouse_move, 419, 602, 2, 347, 350] +[:mouse_move, 420, 602, 2, 348, 350] +[:mouse_button_pressed, 1, 0, 1, 349, 352] +[:mouse_button_up, 1, 0, 1, 350, 354] +[:mouse_move, 421, 602, 2, 351, 354] +[:mouse_move, 422, 602, 2, 352, 356] +[:mouse_move, 422, 603, 2, 353, 370] +[:mouse_move, 422, 602, 2, 354, 373] +[:mouse_move, 423, 595, 2, 355, 374] +[:mouse_move, 426, 589, 2, 356, 374] +[:mouse_move, 429, 583, 2, 357, 375] +[:mouse_move, 429, 582, 2, 358, 376] +[:mouse_move, 424, 580, 2, 359, 377] +[:mouse_move, 416, 580, 2, 360, 378] +[:mouse_move, 410, 579, 2, 361, 378] +[:mouse_move, 406, 577, 2, 362, 379] +[:mouse_move, 401, 575, 2, 363, 380] +[:mouse_move, 392, 573, 2, 364, 380] +[:mouse_move, 381, 571, 2, 365, 381] +[:mouse_move, 369, 571, 2, 366, 382] +[:mouse_move, 354, 571, 2, 367, 382] +[:mouse_move, 333, 571, 2, 368, 383] +[:mouse_move, 306, 571, 2, 369, 383] +[:mouse_move, 281, 576, 2, 370, 384] +[:mouse_move, 249, 585, 2, 371, 385] +[:mouse_move, 230, 586, 2, 372, 385] +[:mouse_move, 213, 590, 2, 373, 386] +[:mouse_move, 201, 593, 2, 374, 386] +[:mouse_move, 192, 597, 2, 375, 387] +[:mouse_move, 188, 599, 2, 376, 388] +[:mouse_move, 186, 601, 2, 377, 388] +[:mouse_move, 185, 601, 2, 378, 391] +[:mouse_move, 183, 599, 2, 379, 391] +[:mouse_move, 183, 598, 2, 380, 393] +[:mouse_move, 184, 596, 2, 381, 393] +[:mouse_move, 188, 594, 2, 382, 394] +[:mouse_move, 199, 591, 2, 383, 395] +[:mouse_move, 221, 586, 2, 384, 395] +[:mouse_move, 246, 578, 2, 385, 395] +[:mouse_move, 262, 574, 2, 386, 396] +[:mouse_move, 266, 573, 2, 387, 397] +[:mouse_move, 271, 573, 2, 388, 398] +[:mouse_move, 279, 573, 2, 389, 398] +[:mouse_move, 285, 573, 2, 390, 399] +[:mouse_move, 293, 574, 2, 391, 399] +[:mouse_move, 302, 576, 2, 392, 400] +[:mouse_move, 316, 580, 2, 393, 401] +[:mouse_move, 333, 583, 2, 394, 402] +[:mouse_move, 351, 583, 2, 395, 402] +[:mouse_move, 363, 583, 2, 396, 403] +[:mouse_move, 369, 583, 2, 397, 403] +[:mouse_move, 379, 583, 2, 398, 404] +[:mouse_move, 385, 583, 2, 399, 404] +[:mouse_move, 390, 583, 2, 400, 405] +[:mouse_move, 392, 583, 2, 401, 406] +[:mouse_move, 394, 583, 2, 402, 406] +[:mouse_move, 395, 583, 2, 403, 407] +[:mouse_move, 395, 580, 2, 404, 408] +[:mouse_move, 395, 578, 2, 405, 408] +[:mouse_move, 395, 572, 2, 406, 409] +[:mouse_move, 396, 565, 2, 407, 410] +[:mouse_move, 402, 560, 2, 408, 410] +[:mouse_move, 404, 559, 2, 409, 411] +[:mouse_move, 405, 559, 2, 410, 413] +[:mouse_move, 406, 559, 2, 411, 414] +[:mouse_move, 407, 560, 2, 412, 416] +[:mouse_move, 407, 561, 2, 413, 417] +[:mouse_move, 408, 561, 2, 414, 418] +[:mouse_move, 409, 563, 2, 415, 419] +[:mouse_move, 410, 564, 2, 416, 420] +[:mouse_move, 411, 565, 2, 417, 421] +[:mouse_move, 411, 566, 2, 418, 423] +[:mouse_button_pressed, 1, 0, 1, 419, 424] +[:mouse_button_up, 1, 0, 1, 420, 425] +[:mouse_move, 411, 562, 2, 421, 426] +[:mouse_move, 411, 547, 2, 422, 426] +[:mouse_move, 411, 532, 2, 423, 427] +[:mouse_move, 417, 513, 2, 424, 427] +[:mouse_move, 421, 503, 2, 425, 428] +[:mouse_move, 424, 496, 2, 426, 429] +[:mouse_move, 425, 494, 2, 427, 430] +[:mouse_move, 425, 493, 2, 428, 430] +[:mouse_move, 426, 492, 2, 429, 432] +[:mouse_move, 426, 493, 2, 430, 436] +[:mouse_move, 426, 494, 2, 431, 437] +[:mouse_move, 426, 495, 2, 432, 438] +[:mouse_move, 426, 496, 2, 433, 438] +[:mouse_move, 425, 498, 2, 434, 440] +[:mouse_move, 423, 503, 2, 435, 441] +[:mouse_move, 422, 506, 2, 436, 441] +[:mouse_move, 422, 507, 2, 437, 442] +[:mouse_move, 422, 508, 2, 438, 446] +[:mouse_move, 422, 514, 2, 439, 447] +[:mouse_move, 421, 525, 2, 440, 448] +[:mouse_move, 418, 533, 2, 441, 448] +[:mouse_move, 416, 536, 2, 442, 449] +[:mouse_move, 415, 537, 2, 443, 449] +[:mouse_move, 415, 538, 2, 444, 450] +[:mouse_button_pressed, 1, 0, 1, 445, 455] +[:mouse_move, 414, 538, 2, 446, 456] +[:mouse_button_up, 1, 0, 1, 447, 456] +[:mouse_move, 412, 535, 2, 448, 456] +[:mouse_move, 409, 529, 2, 449, 456] +[:mouse_move, 408, 514, 2, 450, 457] +[:mouse_move, 408, 502, 2, 451, 458] +[:mouse_move, 411, 497, 2, 452, 458] +[:mouse_move, 413, 492, 2, 453, 459] +[:mouse_move, 415, 491, 2, 454, 460] +[:mouse_move, 415, 490, 2, 455, 460] +[:mouse_move, 415, 489, 2, 456, 461] +[:mouse_move, 416, 489, 2, 457, 461] +[:mouse_move, 416, 488, 2, 458, 462] +[:mouse_move, 416, 487, 2, 459, 464] +[:mouse_button_pressed, 1, 0, 1, 460, 465] +[:mouse_button_up, 1, 0, 1, 461, 468] +[:mouse_move, 417, 487, 2, 462, 470] +[:mouse_move, 417, 486, 2, 463, 471] +[:mouse_move, 418, 486, 2, 464, 471] +[:mouse_move, 418, 485, 2, 465, 472] +[:mouse_move, 418, 483, 2, 466, 473] +[:mouse_move, 418, 478, 2, 467, 474] +[:mouse_move, 418, 473, 2, 468, 474] +[:mouse_move, 419, 471, 2, 469, 475] +[:mouse_move, 420, 470, 2, 470, 475] +[:mouse_move, 420, 469, 2, 471, 477] +[:mouse_move, 420, 468, 2, 472, 477] +[:mouse_move, 421, 467, 2, 473, 479] +[:mouse_move, 421, 464, 2, 474, 479] +[:mouse_move, 421, 462, 2, 475, 480] +[:mouse_move, 422, 460, 2, 476, 480] +[:mouse_button_pressed, 1, 0, 1, 477, 482] +[:mouse_button_up, 1, 0, 1, 478, 484] +[:mouse_move, 422, 459, 2, 479, 484] +[:mouse_move, 422, 451, 2, 480, 484] +[:mouse_move, 424, 443, 2, 481, 485] +[:mouse_move, 428, 436, 2, 482, 486] +[:mouse_move, 431, 431, 2, 483, 487] +[:mouse_move, 433, 428, 2, 484, 487] +[:mouse_move, 435, 424, 2, 485, 488] +[:mouse_move, 435, 422, 2, 486, 488] +[:mouse_move, 435, 420, 2, 487, 489] +[:mouse_move, 435, 419, 2, 488, 490] +[:mouse_move, 435, 418, 2, 489, 490] +[:mouse_button_pressed, 1, 0, 1, 490, 494] +[:mouse_button_up, 1, 0, 1, 491, 497] +[:mouse_move, 435, 415, 2, 492, 501] +[:mouse_move, 435, 408, 2, 493, 502] +[:mouse_move, 435, 401, 2, 494, 503] +[:mouse_move, 435, 398, 2, 495, 503] +[:mouse_move, 435, 396, 2, 496, 504] +[:mouse_move, 435, 395, 2, 497, 504] +[:mouse_move, 435, 394, 2, 498, 507] +[:mouse_move, 434, 393, 2, 499, 507] +[:mouse_move, 434, 389, 2, 500, 508] +[:mouse_move, 433, 388, 2, 501, 509] +[:mouse_move, 433, 385, 2, 502, 509] +[:mouse_move, 433, 384, 2, 503, 510] +[:mouse_button_pressed, 1, 0, 1, 504, 514] +[:mouse_button_up, 1, 0, 1, 505, 516] +[:mouse_move, 433, 383, 2, 506, 517] +[:mouse_move, 433, 377, 2, 507, 518] +[:mouse_move, 433, 372, 2, 508, 518] +[:mouse_move, 433, 365, 2, 509, 519] +[:mouse_move, 433, 360, 2, 510, 520] +[:mouse_move, 433, 353, 2, 511, 520] +[:mouse_move, 433, 346, 2, 512, 520] +[:mouse_move, 432, 338, 2, 513, 521] +[:mouse_move, 431, 331, 2, 514, 522] +[:mouse_move, 431, 328, 2, 515, 523] +[:mouse_move, 431, 326, 2, 516, 523] +[:mouse_move, 431, 325, 2, 517, 524] +[:mouse_move, 430, 324, 2, 518, 524] +[:mouse_button_pressed, 1, 0, 1, 519, 528] +[:mouse_button_up, 1, 0, 1, 520, 531] +[:mouse_move, 430, 323, 2, 521, 533] +[:mouse_move, 430, 322, 2, 522, 534] +[:mouse_move, 430, 321, 2, 523, 534] +[:mouse_move, 429, 319, 2, 524, 535] +[:mouse_move, 428, 316, 2, 525, 536] +[:mouse_move, 428, 315, 2, 526, 537] +[:mouse_move, 428, 314, 2, 527, 540] +[:mouse_move, 428, 313, 2, 528, 540] +[:mouse_move, 427, 309, 2, 529, 540] +[:mouse_move, 427, 308, 2, 530, 541] +[:mouse_move, 426, 306, 2, 531, 542] +[:mouse_move, 426, 304, 2, 532, 543] +[:mouse_move, 426, 303, 2, 533, 543] +[:mouse_button_pressed, 1, 0, 1, 534, 544] +[:mouse_button_up, 1, 0, 1, 535, 546] +[:mouse_move, 426, 302, 2, 536, 548] +[:mouse_move, 426, 299, 2, 537, 548] +[:mouse_move, 426, 294, 2, 538, 549] +[:mouse_move, 426, 288, 2, 539, 550] +[:mouse_move, 426, 282, 2, 540, 550] +[:mouse_move, 426, 276, 2, 541, 550] +[:mouse_move, 426, 273, 2, 542, 551] +[:mouse_move, 426, 272, 2, 543, 552] +[:mouse_move, 426, 271, 2, 544, 553] +[:mouse_button_pressed, 1, 0, 1, 545, 556] +[:mouse_button_up, 1, 0, 1, 546, 557] +[:mouse_move, 426, 269, 2, 547, 558] +[:mouse_move, 426, 266, 2, 548, 559] +[:mouse_move, 426, 263, 2, 549, 559] +[:mouse_move, 426, 258, 2, 550, 560] +[:mouse_move, 425, 256, 2, 551, 561] +[:mouse_move, 424, 251, 2, 552, 561] +[:mouse_move, 424, 246, 2, 553, 562] +[:mouse_move, 424, 244, 2, 554, 563] +[:mouse_move, 424, 241, 2, 555, 563] +[:mouse_move, 424, 238, 2, 556, 563] +[:mouse_move, 423, 236, 2, 557, 564] +[:mouse_move, 423, 235, 2, 558, 565] +[:mouse_button_pressed, 1, 0, 1, 559, 568] +[:mouse_button_up, 1, 0, 1, 560, 569] +[:mouse_move, 423, 233, 2, 561, 570] +[:mouse_move, 423, 228, 2, 562, 570] +[:mouse_move, 423, 224, 2, 563, 571] +[:mouse_move, 423, 218, 2, 564, 572] +[:mouse_move, 423, 214, 2, 565, 572] +[:mouse_move, 423, 210, 2, 566, 573] +[:mouse_move, 423, 209, 2, 567, 573] +[:mouse_move, 423, 208, 2, 568, 574] +[:mouse_move, 423, 207, 2, 569, 575] +[:mouse_move, 423, 206, 2, 570, 577] +[:mouse_button_pressed, 1, 0, 1, 571, 582] +[:mouse_button_up, 1, 0, 1, 572, 583] +[:mouse_move, 423, 205, 2, 573, 586] +[:mouse_move, 423, 204, 2, 574, 587] +[:mouse_move, 423, 201, 2, 575, 587] +[:mouse_move, 423, 197, 2, 576, 588] +[:mouse_move, 422, 195, 2, 577, 589] +[:mouse_move, 422, 191, 2, 578, 589] +[:mouse_move, 422, 189, 2, 579, 589] +[:mouse_move, 422, 188, 2, 580, 590] +[:mouse_move, 422, 187, 2, 581, 591] +[:mouse_move, 422, 186, 2, 582, 592] +[:mouse_move, 422, 188, 2, 583, 606] +[:mouse_move, 422, 193, 2, 584, 607] +[:mouse_move, 423, 202, 2, 585, 608] +[:mouse_move, 425, 216, 2, 586, 609] +[:mouse_move, 426, 223, 2, 587, 609] +[:mouse_move, 426, 225, 2, 588, 609] +[:mouse_button_pressed, 1, 0, 1, 589, 613] +[:mouse_button_up, 1, 0, 1, 590, 615] +[:mouse_move, 426, 224, 2, 591, 615] +[:mouse_move, 424, 220, 2, 592, 615] +[:mouse_move, 424, 209, 2, 593, 616] +[:mouse_move, 421, 192, 2, 594, 617] +[:mouse_move, 419, 182, 2, 595, 617] +[:mouse_move, 418, 180, 2, 596, 618] +[:mouse_move, 418, 179, 2, 597, 618] +[:mouse_button_pressed, 1, 0, 1, 598, 624] +[:mouse_button_up, 1, 0, 1, 599, 625] +[:mouse_move, 418, 178, 2, 600, 626] +[:mouse_move, 418, 174, 2, 601, 627] +[:mouse_move, 418, 171, 2, 602, 628] +[:mouse_move, 418, 164, 2, 603, 628] +[:mouse_move, 417, 161, 2, 604, 629] +[:mouse_move, 415, 156, 2, 605, 630] +[:mouse_move, 415, 155, 2, 606, 631] +[:mouse_move, 415, 154, 2, 607, 633] +[:mouse_move, 415, 153, 2, 608, 634] +[:mouse_move, 415, 152, 2, 609, 635] +[:mouse_move, 416, 151, 2, 610, 635] +[:mouse_move, 416, 150, 2, 611, 636] +[:mouse_move, 416, 149, 2, 612, 637] +[:mouse_move, 417, 147, 2, 613, 638] +[:mouse_move, 418, 144, 2, 614, 639] +[:mouse_move, 418, 142, 2, 615, 640] +[:mouse_move, 419, 141, 2, 616, 640] +[:mouse_move, 419, 139, 2, 617, 641] +[:mouse_move, 420, 138, 2, 618, 642] +[:mouse_move, 420, 137, 2, 619, 642] +[:mouse_button_pressed, 1, 0, 1, 620, 643] +[:mouse_button_up, 1, 0, 1, 621, 645] +[:mouse_move, 420, 138, 2, 622, 649] +[:mouse_move, 420, 141, 2, 623, 650] +[:mouse_move, 421, 142, 2, 624, 651] +[:mouse_move, 421, 147, 2, 625, 652] +[:mouse_move, 421, 148, 2, 626, 653] +[:mouse_move, 421, 149, 2, 627, 653] +[:mouse_move, 421, 148, 2, 628, 674] +[:mouse_move, 420, 147, 2, 629, 675] +[:mouse_move, 420, 146, 2, 630, 675] +[:mouse_move, 420, 142, 2, 631, 677] +[:mouse_move, 422, 139, 2, 632, 677] +[:mouse_move, 422, 138, 2, 633, 681] +[:mouse_move, 421, 138, 2, 634, 686] +[:mouse_move, 441, 132, 2, 635, 691] +[:mouse_move, 483, 120, 2, 636, 692] +[:mouse_move, 539, 103, 2, 637, 693] +[:mouse_move, 590, 85, 2, 638, 693] +[:mouse_move, 658, 61, 2, 639, 694] +[:mouse_move, 677, 52, 2, 640, 694] +[:mouse_move, 725, 34, 2, 641, 695] +[:mouse_move, 739, 30, 2, 642, 696] +[:mouse_move, 775, 26, 2, 643, 697] +[:mouse_move, 791, 26, 2, 644, 697] +[:mouse_move, 796, 26, 2, 645, 698] +[:mouse_move, 801, 25, 2, 646, 699] +[:mouse_move, 802, 25, 2, 647, 700] +[:mouse_move, 803, 25, 2, 648, 701] +[:mouse_move, 804, 25, 2, 649, 702] +[:mouse_move, 804, 28, 2, 650, 703] +[:mouse_move, 804, 33, 2, 651, 704] +[:mouse_move, 793, 48, 2, 652, 705] +[:mouse_move, 787, 54, 2, 653, 705] +[:mouse_move, 769, 66, 2, 654, 706] +[:mouse_move, 766, 69, 2, 655, 707] +[:mouse_move, 759, 75, 2, 656, 708] +[:mouse_move, 756, 78, 2, 657, 708] +[:mouse_move, 754, 82, 2, 658, 709] +[:mouse_move, 750, 88, 2, 659, 710] +[:mouse_move, 747, 97, 2, 660, 710] +[:mouse_move, 747, 98, 2, 661, 711] +[:mouse_move, 747, 100, 2, 662, 712] +[:mouse_move, 747, 101, 2, 663, 717] +[:mouse_button_pressed, 1, 0, 1, 664, 717] +[:mouse_button_up, 1, 0, 1, 665, 720] +[:mouse_button_pressed, 1, 0, 1, 666, 723] +[:mouse_button_up, 1, 0, 1, 667, 727] +[:mouse_button_pressed, 1, 0, 1, 668, 731] +[:mouse_move, 747, 100, 2, 669, 731] +[:mouse_button_up, 1, 0, 1, 670, 734] +[:mouse_button_pressed, 1, 0, 1, 671, 737] +[:mouse_button_up, 1, 0, 1, 672, 741] +[:mouse_button_pressed, 1, 0, 1, 673, 744] +[:mouse_button_up, 1, 0, 1, 674, 747] +[:mouse_button_pressed, 1, 0, 1, 675, 751] +[:mouse_button_up, 1, 0, 1, 676, 753] +[:mouse_button_pressed, 1, 0, 1, 677, 757] +[:mouse_move, 748, 100, 2, 678, 757] +[:mouse_button_up, 1, 0, 1, 679, 760] +[:mouse_button_pressed, 1, 0, 1, 680, 764] +[:mouse_button_up, 1, 0, 1, 681, 766] +[:mouse_button_pressed, 1, 0, 1, 682, 769] +[:mouse_button_up, 1, 0, 1, 683, 772] +[:mouse_button_pressed, 1, 0, 1, 684, 775] +[:mouse_button_up, 1, 0, 1, 685, 778] +[:mouse_move, 748, 99, 2, 686, 779] +[:mouse_move, 749, 99, 2, 687, 781] +[:mouse_button_pressed, 1, 0, 1, 688, 781] +[:mouse_button_up, 1, 0, 1, 689, 785] +[:mouse_button_pressed, 1, 0, 1, 690, 788] +[:mouse_button_up, 1, 0, 1, 691, 790] +[:mouse_button_pressed, 1, 0, 1, 692, 795] +[:mouse_button_up, 1, 0, 1, 693, 797] +[:mouse_button_pressed, 1, 0, 1, 694, 800] +[:mouse_button_up, 1, 0, 1, 695, 802] +[:mouse_move, 748, 99, 2, 696, 802] +[:mouse_move, 738, 99, 2, 697, 803] +[:mouse_move, 729, 99, 2, 698, 803] +[:mouse_move, 709, 99, 2, 699, 804] +[:mouse_move, 689, 96, 2, 700, 805] +[:mouse_move, 674, 95, 2, 701, 806] +[:mouse_move, 654, 92, 2, 702, 806] +[:mouse_move, 629, 90, 2, 703, 806] +[:mouse_move, 623, 90, 2, 704, 807] +[:mouse_move, 611, 90, 2, 705, 808] +[:mouse_move, 610, 90, 2, 706, 808] +[:mouse_move, 609, 90, 2, 707, 809] +[:mouse_move, 611, 90, 2, 708, 811] +[:mouse_button_pressed, 1, 0, 1, 709, 811] +[:mouse_move, 612, 90, 2, 710, 811] +[:mouse_button_up, 1, 0, 1, 711, 813] +[:mouse_move, 613, 90, 2, 712, 813] +[:key_down_raw, 96, 0, 2, 713, 986] +[:key_up_raw, 96, 0, 2, 714, 987] +[:key_down_raw, 13, 0, 2, 715, 1004] diff --git a/samples/13_path_finding_algorithms/07_heuristic_with_walls/app/main.rb b/samples/13_path_finding_algorithms/07_heuristic_with_walls/app/main.rb index b106e34..2dc3e74 100644 --- a/samples/13_path_finding_algorithms/07_heuristic_with_walls/app/main.rb +++ b/samples/13_path_finding_algorithms/07_heuristic_with_walls/app/main.rb @@ -1002,7 +1002,7 @@ def tick args end # Every tick, new args are passed, and the Breadth First Search tick is called - $heuristic ||= Heuristic.new(args) + $heuristic ||= Heuristic.new $heuristic.args = args $heuristic.tick end diff --git a/samples/13_path_finding_algorithms/07_heuristic_with_walls/replay.txt b/samples/13_path_finding_algorithms/07_heuristic_with_walls/replay.txt new file mode 100644 index 0000000..4c5a2a6 --- /dev/null +++ b/samples/13_path_finding_algorithms/07_heuristic_with_walls/replay.txt @@ -0,0 +1,352 @@ +replay_version 2.0 +stopped_at 637 +seed 100 +recorded_at 2021-11-20 11:23:35 -0600 +[:mouse_button_up, 1, 0, 1, 1, 2] +[:mouse_move, 777, 81, 2, 2, 5] +[:mouse_move, 778, 83, 2, 3, 23] +[:mouse_move, 778, 91, 2, 4, 24] +[:mouse_move, 778, 97, 2, 5, 25] +[:mouse_move, 778, 101, 2, 6, 26] +[:mouse_move, 777, 106, 2, 7, 26] +[:mouse_move, 774, 112, 2, 8, 27] +[:mouse_move, 769, 116, 2, 9, 28] +[:mouse_move, 765, 119, 2, 10, 29] +[:mouse_move, 763, 120, 2, 11, 29] +[:mouse_move, 762, 120, 2, 12, 30] +[:mouse_move, 761, 121, 2, 13, 31] +[:mouse_move, 761, 122, 2, 14, 32] +[:mouse_move, 760, 123, 2, 15, 32] +[:mouse_move, 760, 124, 2, 16, 33] +[:mouse_move, 759, 125, 2, 17, 34] +[:mouse_move, 758, 126, 2, 18, 36] +[:mouse_move, 757, 126, 2, 19, 37] +[:mouse_move, 754, 127, 2, 20, 38] +[:mouse_move, 753, 127, 2, 21, 39] +[:mouse_move, 752, 127, 2, 22, 40] +[:mouse_move, 753, 127, 2, 23, 56] +[:mouse_move, 752, 127, 2, 24, 65] +[:mouse_move, 745, 127, 2, 25, 66] +[:mouse_move, 737, 127, 2, 26, 67] +[:mouse_move, 726, 125, 2, 27, 68] +[:mouse_move, 716, 122, 2, 28, 68] +[:mouse_move, 709, 120, 2, 29, 69] +[:mouse_move, 697, 117, 2, 30, 70] +[:mouse_move, 691, 115, 2, 31, 71] +[:mouse_move, 689, 114, 2, 32, 72] +[:mouse_move, 686, 113, 2, 33, 72] +[:mouse_move, 686, 112, 2, 34, 73] +[:mouse_move, 685, 112, 2, 35, 74] +[:mouse_move, 684, 112, 2, 36, 75] +[:mouse_move, 683, 112, 2, 37, 76] +[:mouse_move, 682, 111, 2, 38, 77] +[:mouse_move, 679, 110, 2, 39, 77] +[:mouse_move, 674, 108, 2, 40, 78] +[:mouse_move, 665, 104, 2, 41, 79] +[:mouse_move, 660, 101, 2, 42, 80] +[:mouse_move, 657, 101, 2, 43, 81] +[:mouse_move, 657, 100, 2, 44, 89] +[:mouse_button_pressed, 1, 0, 1, 45, 109] +[:mouse_button_up, 1, 0, 1, 46, 113] +[:mouse_button_pressed, 1, 0, 1, 47, 228] +[:mouse_button_up, 1, 0, 1, 48, 229] +[:mouse_move, 657, 99, 2, 49, 240] +[:mouse_move, 656, 96, 2, 50, 240] +[:mouse_move, 655, 95, 2, 51, 240] +[:mouse_move, 654, 94, 2, 52, 241] +[:mouse_move, 654, 87, 2, 53, 242] +[:mouse_move, 654, 80, 2, 54, 242] +[:mouse_move, 654, 74, 2, 55, 242] +[:mouse_move, 654, 69, 2, 56, 242] +[:mouse_move, 654, 67, 2, 57, 243] +[:mouse_move, 654, 63, 2, 58, 243] +[:mouse_move, 654, 62, 2, 59, 244] +[:mouse_move, 653, 61, 2, 60, 244] +[:mouse_move, 651, 61, 2, 61, 245] +[:mouse_move, 648, 60, 2, 62, 246] +[:mouse_move, 645, 60, 2, 63, 246] +[:mouse_move, 637, 57, 2, 64, 246] +[:mouse_move, 633, 55, 2, 65, 246] +[:mouse_move, 626, 53, 2, 66, 247] +[:mouse_move, 620, 51, 2, 67, 247] +[:mouse_move, 593, 47, 2, 68, 247] +[:mouse_move, 580, 45, 2, 69, 248] +[:mouse_move, 577, 45, 2, 70, 248] +[:mouse_move, 576, 45, 2, 71, 248] +[:mouse_move, 576, 44, 2, 72, 251] +[:mouse_button_pressed, 1, 0, 1, 73, 251] +[:mouse_button_up, 1, 0, 1, 74, 253] +[:mouse_move, 577, 44, 2, 75, 257] +[:mouse_move, 578, 45, 2, 76, 257] +[:mouse_move, 584, 45, 2, 77, 258] +[:mouse_move, 594, 47, 2, 78, 258] +[:mouse_move, 606, 48, 2, 79, 258] +[:mouse_move, 619, 50, 2, 80, 259] +[:mouse_move, 627, 50, 2, 81, 259] +[:mouse_move, 629, 50, 2, 82, 259] +[:mouse_move, 630, 50, 2, 83, 259] +[:mouse_move, 631, 50, 2, 84, 260] +[:mouse_move, 632, 50, 2, 85, 261] +[:mouse_button_pressed, 1, 0, 1, 86, 263] +[:mouse_move, 629, 50, 2, 87, 264] +[:mouse_move, 624, 50, 2, 88, 264] +[:mouse_move, 617, 50, 2, 89, 264] +[:mouse_move, 612, 50, 2, 90, 264] +[:mouse_move, 609, 50, 2, 91, 264] +[:mouse_move, 607, 50, 2, 92, 264] +[:mouse_move, 603, 49, 2, 93, 264] +[:mouse_move, 600, 49, 2, 94, 264] +[:mouse_move, 597, 48, 2, 95, 265] +[:mouse_move, 595, 48, 2, 96, 265] +[:mouse_move, 594, 48, 2, 97, 265] +[:mouse_move, 593, 48, 2, 98, 265] +[:mouse_move, 592, 48, 2, 99, 265] +[:mouse_move, 590, 48, 2, 100, 265] +[:mouse_move, 587, 48, 2, 101, 265] +[:mouse_move, 582, 48, 2, 102, 265] +[:mouse_move, 575, 48, 2, 103, 265] +[:mouse_move, 571, 47, 2, 104, 265] +[:mouse_move, 568, 47, 2, 105, 265] +[:mouse_move, 567, 47, 2, 106, 266] +[:mouse_move, 566, 47, 2, 107, 266] +[:mouse_move, 565, 46, 2, 108, 266] +[:mouse_move, 564, 46, 2, 109, 266] +[:mouse_move, 563, 46, 2, 110, 266] +[:mouse_move, 562, 46, 2, 111, 266] +[:mouse_move, 561, 46, 2, 112, 266] +[:mouse_move, 560, 46, 2, 113, 267] +[:mouse_move, 559, 46, 2, 114, 267] +[:mouse_move, 558, 46, 2, 115, 267] +[:mouse_move, 555, 46, 2, 116, 268] +[:mouse_move, 551, 46, 2, 117, 268] +[:mouse_move, 549, 46, 2, 118, 268] +[:mouse_move, 548, 46, 2, 119, 268] +[:mouse_move, 547, 46, 2, 120, 268] +[:mouse_move, 546, 46, 2, 121, 269] +[:mouse_move, 545, 46, 2, 122, 269] +[:mouse_move, 540, 46, 2, 123, 269] +[:mouse_move, 534, 46, 2, 124, 269] +[:mouse_move, 531, 46, 2, 125, 269] +[:mouse_move, 527, 46, 2, 126, 269] +[:mouse_move, 525, 46, 2, 127, 269] +[:mouse_button_up, 1, 0, 1, 128, 276] +[:mouse_move, 526, 47, 2, 129, 287] +[:mouse_move, 527, 47, 2, 130, 288] +[:mouse_move, 528, 48, 2, 131, 290] +[:mouse_move, 531, 51, 2, 132, 290] +[:mouse_move, 534, 54, 2, 133, 290] +[:mouse_move, 539, 61, 2, 134, 291] +[:mouse_move, 548, 71, 2, 135, 291] +[:mouse_move, 558, 81, 2, 136, 292] +[:mouse_move, 570, 94, 2, 137, 292] +[:mouse_move, 585, 110, 2, 138, 293] +[:mouse_move, 595, 123, 2, 139, 293] +[:mouse_move, 607, 136, 2, 140, 293] +[:mouse_move, 618, 146, 2, 141, 294] +[:mouse_move, 626, 154, 2, 142, 295] +[:mouse_move, 632, 161, 2, 143, 295] +[:mouse_move, 633, 162, 2, 144, 296] +[:mouse_move, 633, 163, 2, 145, 296] +[:mouse_move, 634, 164, 2, 146, 296] +[:mouse_move, 634, 165, 2, 147, 297] +[:mouse_move, 635, 168, 2, 148, 297] +[:mouse_move, 635, 172, 2, 149, 298] +[:mouse_move, 635, 178, 2, 150, 299] +[:mouse_move, 635, 182, 2, 151, 299] +[:mouse_move, 635, 183, 2, 152, 299] +[:mouse_move, 635, 184, 2, 153, 300] +[:mouse_move, 634, 187, 2, 154, 300] +[:mouse_move, 632, 191, 2, 155, 301] +[:mouse_move, 629, 193, 2, 156, 301] +[:mouse_move, 627, 194, 2, 157, 302] +[:mouse_move, 625, 194, 2, 158, 302] +[:mouse_move, 625, 195, 2, 159, 303] +[:mouse_move, 624, 195, 2, 160, 304] +[:mouse_move, 619, 195, 2, 161, 305] +[:mouse_move, 608, 195, 2, 162, 305] +[:mouse_move, 597, 194, 2, 163, 305] +[:mouse_move, 584, 188, 2, 164, 306] +[:mouse_move, 572, 180, 2, 165, 307] +[:mouse_move, 563, 173, 2, 166, 307] +[:mouse_move, 556, 166, 2, 167, 308] +[:mouse_move, 550, 160, 2, 168, 308] +[:mouse_move, 548, 157, 2, 169, 308] +[:mouse_move, 547, 154, 2, 170, 309] +[:mouse_move, 542, 149, 2, 171, 309] +[:mouse_move, 538, 142, 2, 172, 310] +[:mouse_move, 533, 134, 2, 173, 310] +[:mouse_move, 531, 132, 2, 174, 311] +[:mouse_move, 530, 132, 2, 175, 311] +[:mouse_move, 530, 131, 2, 176, 312] +[:mouse_move, 528, 129, 2, 177, 312] +[:mouse_move, 524, 127, 2, 178, 312] +[:mouse_move, 523, 126, 2, 179, 313] +[:mouse_move, 522, 126, 2, 180, 314] +[:mouse_move, 520, 124, 2, 181, 314] +[:mouse_move, 512, 118, 2, 182, 315] +[:mouse_move, 502, 112, 2, 183, 316] +[:mouse_move, 498, 108, 2, 184, 316] +[:mouse_move, 495, 107, 2, 185, 317] +[:mouse_move, 495, 106, 2, 186, 317] +[:mouse_move, 493, 105, 2, 187, 317] +[:mouse_move, 493, 104, 2, 188, 318] +[:mouse_move, 492, 104, 2, 189, 318] +[:mouse_move, 492, 103, 2, 190, 319] +[:mouse_button_pressed, 1, 0, 1, 191, 326] +[:mouse_button_up, 1, 0, 1, 192, 328] +[:mouse_button_pressed, 1, 0, 1, 193, 339] +[:mouse_button_up, 1, 0, 1, 194, 342] +[:mouse_button_pressed, 1, 0, 1, 195, 343] +[:mouse_button_up, 1, 0, 1, 196, 344] +[:mouse_button_pressed, 1, 0, 1, 197, 345] +[:mouse_button_up, 1, 0, 1, 198, 347] +[:mouse_move, 493, 103, 2, 199, 348] +[:mouse_move, 497, 103, 2, 200, 348] +[:mouse_move, 507, 103, 2, 201, 348] +[:mouse_move, 522, 103, 2, 202, 349] +[:mouse_move, 542, 103, 2, 203, 349] +[:mouse_move, 566, 103, 2, 204, 350] +[:mouse_move, 595, 103, 2, 205, 350] +[:mouse_move, 627, 103, 2, 206, 351] +[:mouse_move, 655, 103, 2, 207, 351] +[:mouse_move, 678, 103, 2, 208, 352] +[:mouse_move, 693, 103, 2, 209, 352] +[:mouse_move, 698, 103, 2, 210, 353] +[:mouse_move, 699, 103, 2, 211, 353] +[:mouse_move, 702, 103, 2, 212, 354] +[:mouse_move, 704, 103, 2, 213, 354] +[:mouse_move, 708, 103, 2, 214, 354] +[:mouse_move, 709, 103, 2, 215, 355] +[:mouse_move, 711, 103, 2, 216, 356] +[:mouse_move, 714, 103, 2, 217, 357] +[:mouse_move, 715, 103, 2, 218, 357] +[:mouse_move, 719, 103, 2, 219, 357] +[:mouse_move, 721, 103, 2, 220, 358] +[:mouse_move, 723, 103, 2, 221, 359] +[:mouse_move, 724, 103, 2, 222, 359] +[:mouse_move, 725, 103, 2, 223, 364] +[:mouse_move, 729, 101, 2, 224, 365] +[:mouse_move, 732, 101, 2, 225, 365] +[:mouse_move, 734, 100, 2, 226, 366] +[:mouse_move, 735, 99, 2, 227, 367] +[:mouse_button_pressed, 1, 0, 1, 228, 368] +[:mouse_button_up, 1, 0, 1, 229, 371] +[:mouse_button_pressed, 1, 0, 1, 230, 373] +[:mouse_button_up, 1, 0, 1, 231, 375] +[:mouse_button_pressed, 1, 0, 1, 232, 378] +[:mouse_button_up, 1, 0, 1, 233, 380] +[:mouse_button_pressed, 1, 0, 1, 234, 383] +[:mouse_button_up, 1, 0, 1, 235, 385] +[:mouse_button_pressed, 1, 0, 1, 236, 387] +[:mouse_button_up, 1, 0, 1, 237, 389] +[:mouse_move, 736, 99, 2, 238, 390] +[:mouse_button_pressed, 1, 0, 1, 239, 392] +[:mouse_button_up, 1, 0, 1, 240, 395] +[:mouse_button_pressed, 1, 0, 1, 241, 432] +[:mouse_button_up, 1, 0, 1, 242, 434] +[:mouse_move, 736, 103, 2, 243, 446] +[:mouse_move, 736, 113, 2, 244, 446] +[:mouse_move, 734, 125, 2, 245, 447] +[:mouse_move, 732, 140, 2, 246, 447] +[:mouse_move, 726, 158, 2, 247, 448] +[:mouse_move, 718, 174, 2, 248, 448] +[:mouse_move, 712, 193, 2, 249, 448] +[:mouse_move, 709, 203, 2, 250, 449] +[:mouse_move, 709, 208, 2, 251, 449] +[:mouse_move, 708, 211, 2, 252, 450] +[:mouse_move, 708, 212, 2, 253, 451] +[:mouse_move, 708, 213, 2, 254, 451] +[:mouse_move, 707, 215, 2, 255, 451] +[:mouse_move, 704, 217, 2, 256, 452] +[:mouse_move, 700, 221, 2, 257, 452] +[:mouse_move, 698, 223, 2, 258, 453] +[:mouse_move, 697, 223, 2, 259, 454] +[:mouse_move, 699, 223, 2, 260, 455] +[:mouse_move, 700, 222, 2, 261, 455] +[:mouse_move, 701, 222, 2, 262, 456] +[:mouse_move, 702, 222, 2, 263, 456] +[:mouse_move, 702, 221, 2, 264, 457] +[:mouse_button_pressed, 1, 0, 1, 265, 458] +[:mouse_button_up, 1, 0, 1, 266, 459] +[:mouse_move, 695, 221, 2, 267, 468] +[:mouse_move, 684, 221, 2, 268, 469] +[:mouse_move, 673, 221, 2, 269, 469] +[:mouse_move, 663, 221, 2, 270, 470] +[:mouse_move, 656, 221, 2, 271, 470] +[:mouse_move, 655, 221, 2, 272, 471] +[:mouse_button_pressed, 1, 0, 1, 273, 475] +[:mouse_button_up, 1, 0, 1, 274, 476] +[:mouse_move, 657, 218, 2, 275, 479] +[:mouse_move, 661, 213, 2, 276, 479] +[:mouse_move, 670, 201, 2, 277, 479] +[:mouse_move, 679, 190, 2, 278, 479] +[:mouse_move, 687, 178, 2, 279, 480] +[:mouse_move, 695, 165, 2, 280, 481] +[:mouse_move, 703, 151, 2, 281, 481] +[:mouse_move, 712, 139, 2, 282, 482] +[:mouse_move, 720, 129, 2, 283, 482] +[:mouse_move, 727, 121, 2, 284, 482] +[:mouse_move, 735, 111, 2, 285, 483] +[:mouse_move, 737, 108, 2, 286, 483] +[:mouse_move, 739, 105, 2, 287, 484] +[:mouse_move, 739, 104, 2, 288, 484] +[:mouse_move, 740, 103, 2, 289, 485] +[:mouse_move, 740, 102, 2, 290, 485] +[:mouse_move, 740, 101, 2, 291, 486] +[:mouse_move, 740, 100, 2, 292, 488] +[:mouse_button_pressed, 1, 0, 1, 293, 489] +[:mouse_move, 740, 99, 2, 294, 490] +[:mouse_button_up, 1, 0, 1, 295, 491] +[:mouse_button_pressed, 1, 0, 1, 296, 493] +[:mouse_move, 740, 100, 2, 297, 493] +[:mouse_button_up, 1, 0, 1, 298, 496] +[:mouse_button_pressed, 1, 0, 1, 299, 498] +[:mouse_button_up, 1, 0, 1, 300, 500] +[:mouse_button_pressed, 1, 0, 1, 301, 502] +[:mouse_button_up, 1, 0, 1, 302, 505] +[:mouse_button_pressed, 1, 0, 1, 303, 508] +[:mouse_button_up, 1, 0, 1, 304, 509] +[:mouse_button_pressed, 1, 0, 1, 305, 511] +[:mouse_button_up, 1, 0, 1, 306, 514] +[:mouse_button_pressed, 1, 0, 1, 307, 516] +[:mouse_button_up, 1, 0, 1, 308, 518] +[:mouse_button_pressed, 1, 0, 1, 309, 520] +[:mouse_button_up, 1, 0, 1, 310, 522] +[:mouse_button_pressed, 1, 0, 1, 311, 524] +[:mouse_button_up, 1, 0, 1, 312, 526] +[:mouse_move, 738, 100, 2, 313, 528] +[:mouse_move, 732, 101, 2, 314, 528] +[:mouse_move, 715, 101, 2, 315, 529] +[:mouse_move, 690, 101, 2, 316, 529] +[:mouse_move, 677, 101, 2, 317, 530] +[:mouse_move, 666, 101, 2, 318, 530] +[:mouse_move, 662, 101, 2, 319, 531] +[:mouse_move, 661, 101, 2, 320, 531] +[:mouse_button_pressed, 1, 0, 1, 321, 534] +[:mouse_button_up, 1, 0, 1, 322, 536] +[:mouse_move, 660, 100, 2, 323, 550] +[:mouse_move, 661, 100, 2, 324, 550] +[:mouse_move, 662, 100, 2, 325, 553] +[:key_down_raw, 96, 0, 2, 326, 615] +[:key_up_raw, 96, 0, 2, 327, 616] +[:mouse_move, 660, 102, 2, 328, 625] +[:mouse_move, 657, 104, 2, 329, 626] +[:mouse_move, 655, 107, 2, 330, 626] +[:mouse_move, 653, 110, 2, 331, 626] +[:mouse_move, 653, 117, 2, 332, 626] +[:mouse_move, 655, 122, 2, 333, 626] +[:mouse_move, 658, 124, 2, 334, 627] +[:mouse_move, 664, 126, 2, 335, 627] +[:mouse_move, 671, 128, 2, 336, 627] +[:mouse_move, 681, 133, 2, 337, 627] +[:mouse_move, 693, 141, 2, 338, 628] +[:mouse_move, 710, 154, 2, 339, 628] +[:mouse_move, 731, 167, 2, 340, 628] +[:mouse_move, 753, 176, 2, 341, 628] +[:mouse_move, 772, 181, 2, 342, 629] +[:mouse_move, 786, 182, 2, 343, 629] +[:mouse_move, 791, 184, 2, 344, 629] +[:mouse_move, 790, 185, 2, 345, 629] +[:mouse_move, 789, 187, 2, 346, 630] +[:mouse_move, 788, 187, 2, 347, 630] +[:key_down_raw, 13, 0, 2, 348, 637] diff --git a/samples/13_path_finding_algorithms/08_a_star/app/main.rb b/samples/13_path_finding_algorithms/08_a_star/app/main.rb index e9fcb8c..eaf7e09 100644 --- a/samples/13_path_finding_algorithms/08_a_star/app/main.rb +++ b/samples/13_path_finding_algorithms/08_a_star/app/main.rb @@ -11,8 +11,8 @@ class A_Star_Algorithm def tick defaults - render - input + render + input if dijkstra.came_from.empty? calc_searches @@ -65,7 +65,7 @@ class A_Star_Algorithm # We store this value, because we want to remember the value even when # the user's cursor is no longer over what they're interacting with, but # they are still clicking down on the mouse. - state.user_input ||= :none + state.user_input ||= :none # These variables allow the breadth first search to take place # Came_from is a hash with a key of a cell and a value of the cell that was expanded from to find the key. @@ -143,7 +143,7 @@ class A_Star_Algorithm # If the mouse was clicked this tick if inputs.mouse.down # Determine what the user is editing and appropriately edit the state.user_input variable - determine_input + determine_input end # Process user input based on user_input variable and current mouse position @@ -154,51 +154,51 @@ class A_Star_Algorithm # This method is called when the mouse is clicked down def determine_input # If the mouse is over the star in the first grid - if dijkstra_mouse_over_star? + if dijkstra_mouse_over_star? # The user is editing the star from the first grid - state.user_input = :dijkstra_star + state.user_input = :dijkstra_star # If the mouse is over the star in the second grid - elsif greedy_mouse_over_star? + elsif greedy_mouse_over_star? # The user is editing the star from the second grid - state.user_input = :greedy_star + state.user_input = :greedy_star # If the mouse is over the star in the third grid - elsif a_star_mouse_over_star? + elsif a_star_mouse_over_star? # The user is editing the star from the third grid - state.user_input = :a_star_star + state.user_input = :a_star_star # If the mouse is over the target in the first grid - elsif dijkstra_mouse_over_target? + elsif dijkstra_mouse_over_target? # The user is editing the target from the first grid - state.user_input = :dijkstra_target + state.user_input = :dijkstra_target # If the mouse is over the target in the second grid - elsif greedy_mouse_over_target? + elsif greedy_mouse_over_target? # The user is editing the target from the second grid - state.user_input = :greedy_target + state.user_input = :greedy_target # If the mouse is over the target in the third grid - elsif a_star_mouse_over_target? + elsif a_star_mouse_over_target? # The user is editing the target from the third grid - state.user_input = :a_star_target + state.user_input = :a_star_target # If the mouse is over a wall in the first grid - elsif dijkstra_mouse_over_wall? + elsif dijkstra_mouse_over_wall? # The user is removing a wall from the first grid - state.user_input = :dijkstra_remove_wall + state.user_input = :dijkstra_remove_wall # If the mouse is over a wall in the second grid - elsif greedy_mouse_over_wall? + elsif greedy_mouse_over_wall? # The user is removing a wall from the second grid state.user_input = :greedy_remove_wall # If the mouse is over a wall in the third grid - elsif a_star_mouse_over_wall? + elsif a_star_mouse_over_wall? # The user is removing a wall from the third grid state.user_input = :a_star_remove_wall # If the mouse is over the first grid - elsif dijkstra_mouse_over_grid? + elsif dijkstra_mouse_over_grid? # The user is adding a wall from the first grid state.user_input = :dijkstra_add_wall # If the mouse is over the second grid - elsif greedy_mouse_over_grid? + elsif greedy_mouse_over_grid? # The user is adding a wall from the second grid state.user_input = :greedy_add_wall # If the mouse is over the third grid - elsif a_star_mouse_over_grid? + elsif a_star_mouse_over_grid? # The user is adding a wall from the third grid state.user_input = :a_star_add_wall end @@ -206,30 +206,30 @@ class A_Star_Algorithm # Processes click and drag based on what the user is currently dragging def process_input - if state.user_input == :dijkstra_star - process_input_dijkstra_star + if state.user_input == :dijkstra_star + process_input_dijkstra_star elsif state.user_input == :greedy_star - process_input_greedy_star + process_input_greedy_star elsif state.user_input == :a_star_star - process_input_a_star_star - elsif state.user_input == :dijkstra_target - process_input_dijkstra_target - elsif state.user_input == :greedy_target - process_input_greedy_target - elsif state.user_input == :a_star_target - process_input_a_star_target - elsif state.user_input == :dijkstra_remove_wall - process_input_dijkstra_remove_wall + process_input_a_star_star + elsif state.user_input == :dijkstra_target + process_input_dijkstra_target + elsif state.user_input == :greedy_target + process_input_greedy_target + elsif state.user_input == :a_star_target + process_input_a_star_target + elsif state.user_input == :dijkstra_remove_wall + process_input_dijkstra_remove_wall elsif state.user_input == :greedy_remove_wall - process_input_greedy_remove_wall + process_input_greedy_remove_wall elsif state.user_input == :a_star_remove_wall - process_input_a_star_remove_wall - elsif state.user_input == :dijkstra_add_wall - process_input_dijkstra_add_wall - elsif state.user_input == :greedy_add_wall - process_input_greedy_add_wall - elsif state.user_input == :a_star_add_wall - process_input_a_star_add_wall + process_input_a_star_remove_wall + elsif state.user_input == :dijkstra_add_wall + process_input_dijkstra_add_wall + elsif state.user_input == :greedy_add_wall + process_input_greedy_add_wall + elsif state.user_input == :a_star_add_wall + process_input_a_star_add_wall end end @@ -244,7 +244,7 @@ class A_Star_Algorithm # The horizontal grid lines for y in 0..grid.height - outputs.lines << dijkstra_horizontal_line(y) + outputs.lines << dijkstra_horizontal_line(y) end end @@ -259,7 +259,7 @@ class A_Star_Algorithm # The horizontal grid lines for y in 0..grid.height - outputs.lines << greedy_horizontal_line(y) + outputs.lines << greedy_horizontal_line(y) end end @@ -274,10 +274,10 @@ class A_Star_Algorithm # The horizontal grid lines for y in 0..grid.height - outputs.lines << a_star_horizontal_line(y) + outputs.lines << a_star_horizontal_line(y) end end - + # Returns a vertical line for a column of the first grid def dijkstra_vertical_line column dijkstra_scale_up([column, 0, column, grid.height]) @@ -327,7 +327,7 @@ class A_Star_Algorithm def render_dijkstra_target outputs.sprites << [dijkstra_scale_up(grid.target), 'target.png'] end - + # Renders the target on the second grid def render_greedy_target outputs.sprites << [greedy_scale_up(grid.target), 'target.png'] @@ -340,21 +340,21 @@ class A_Star_Algorithm # Renders the walls on the first grid def render_dijkstra_walls - grid.walls.each_key do | wall | + grid.walls.each_key do | wall | outputs.solids << [dijkstra_scale_up(wall), wall_color] end end # Renders the walls on the second grid def render_greedy_walls - grid.walls.each_key do | wall | + grid.walls.each_key do | wall | outputs.solids << [greedy_scale_up(wall), wall_color] end end # Renders the walls on the third grid def render_a_star_walls - grid.walls.each_key do | wall | + grid.walls.each_key do | wall | outputs.solids << [a_star_scale_up(wall), wall_color] end end @@ -554,12 +554,12 @@ class A_Star_Algorithm # Only resets the search if the star changes position # Called whenever the user is editing the star (puts mouse down on star) def process_input_dijkstra_star - old_star = grid.star.clone + old_star = grid.star.clone unless dijkstra_cell_closest_to_mouse == grid.target - grid.star = dijkstra_cell_closest_to_mouse + grid.star = dijkstra_cell_closest_to_mouse end - unless old_star == grid.star - reset_searches + unless old_star == grid.star + reset_searches end end @@ -567,12 +567,12 @@ class A_Star_Algorithm # Only resets the search if the star changes position # Called whenever the user is editing the star (puts mouse down on star) def process_input_greedy_star - old_star = grid.star.clone + old_star = grid.star.clone unless greedy_cell_closest_to_mouse == grid.target grid.star = greedy_cell_closest_to_mouse end - unless old_star == grid.star - reset_searches + unless old_star == grid.star + reset_searches end end @@ -580,12 +580,12 @@ class A_Star_Algorithm # Only resets the search if the star changes position # Called whenever the user is editing the star (puts mouse down on star) def process_input_a_star_star - old_star = grid.star.clone + old_star = grid.star.clone unless a_star_cell_closest_to_mouse == grid.target grid.star = a_star_cell_closest_to_mouse end - unless old_star == grid.star - reset_searches + unless old_star == grid.star + reset_searches end end @@ -593,12 +593,12 @@ class A_Star_Algorithm # Only reset_searchess the search if the target changes position # Called whenever the user is editing the target (puts mouse down on target) def process_input_dijkstra_target - old_target = grid.target.clone + old_target = grid.target.clone unless dijkstra_cell_closest_to_mouse == grid.star grid.target = dijkstra_cell_closest_to_mouse end - unless old_target == grid.target - reset_searches + unless old_target == grid.target + reset_searches end end @@ -606,12 +606,12 @@ class A_Star_Algorithm # Only reset_searchess the search if the target changes position # Called whenever the user is editing the target (puts mouse down on target) def process_input_greedy_target - old_target = grid.target.clone + old_target = grid.target.clone unless greedy_cell_closest_to_mouse == grid.star grid.target = greedy_cell_closest_to_mouse end - unless old_target == grid.target - reset_searches + unless old_target == grid.target + reset_searches end end @@ -619,12 +619,12 @@ class A_Star_Algorithm # Only reset_searchess the search if the target changes position # Called whenever the user is editing the target (puts mouse down on target) def process_input_a_star_target - old_target = grid.target.clone + old_target = grid.target.clone unless a_star_cell_closest_to_mouse == grid.star grid.target = a_star_cell_closest_to_mouse end - unless old_target == grid.target - reset_searches + unless old_target == grid.target + reset_searches end end @@ -633,10 +633,10 @@ class A_Star_Algorithm # The mouse needs to be inside the grid, because we only want to remove walls # the cursor is directly over # Recalculations should only occur when a wall is actually deleted - if dijkstra_mouse_over_grid? + if dijkstra_mouse_over_grid? if grid.walls.has_key?(dijkstra_cell_closest_to_mouse) - grid.walls.delete(dijkstra_cell_closest_to_mouse) - reset_searches + grid.walls.delete(dijkstra_cell_closest_to_mouse) + reset_searches end end end @@ -646,10 +646,10 @@ class A_Star_Algorithm # The mouse needs to be inside the grid, because we only want to remove walls # the cursor is directly over # Recalculations should only occur when a wall is actually deleted - if greedy_mouse_over_grid? + if greedy_mouse_over_grid? if grid.walls.has_key?(greedy_cell_closest_to_mouse) - grid.walls.delete(greedy_cell_closest_to_mouse) - reset_searches + grid.walls.delete(greedy_cell_closest_to_mouse) + reset_searches end end end @@ -659,40 +659,40 @@ class A_Star_Algorithm # The mouse needs to be inside the grid, because we only want to remove walls # the cursor is directly over # Recalculations should only occur when a wall is actually deleted - if a_star_mouse_over_grid? + if a_star_mouse_over_grid? if grid.walls.has_key?(a_star_cell_closest_to_mouse) - grid.walls.delete(a_star_cell_closest_to_mouse) - reset_searches + grid.walls.delete(a_star_cell_closest_to_mouse) + reset_searches end end end # Adds a wall in the first grid in the cell the mouse is over def process_input_dijkstra_add_wall - if dijkstra_mouse_over_grid? + if dijkstra_mouse_over_grid? unless grid.walls.has_key?(dijkstra_cell_closest_to_mouse) - grid.walls[dijkstra_cell_closest_to_mouse] = true - reset_searches + grid.walls[dijkstra_cell_closest_to_mouse] = true + reset_searches end end end # Adds a wall in the second grid in the cell the mouse is over def process_input_greedy_add_wall - if greedy_mouse_over_grid? + if greedy_mouse_over_grid? unless grid.walls.has_key?(greedy_cell_closest_to_mouse) - grid.walls[greedy_cell_closest_to_mouse] = true - reset_searches + grid.walls[greedy_cell_closest_to_mouse] = true + reset_searches end end end # Adds a wall in the third grid in the cell the mouse is over def process_input_a_star_add_wall - if a_star_mouse_over_grid? + if a_star_mouse_over_grid? unless grid.walls.has_key?(a_star_cell_closest_to_mouse) - grid.walls[a_star_cell_closest_to_mouse] = true - reset_searches + grid.walls[a_star_cell_closest_to_mouse] = true + reset_searches end end end @@ -702,13 +702,13 @@ class A_Star_Algorithm # Finding the cell closest to the mouse helps with this def dijkstra_cell_closest_to_mouse # Closest cell to the mouse in the first grid - x = (inputs.mouse.point.x / grid.cell_size).to_i - y = (inputs.mouse.point.y / grid.cell_size).to_i + x = (inputs.mouse.point.x / grid.cell_size).to_i + y = (inputs.mouse.point.y / grid.cell_size).to_i # Bound x and y to the grid - x = grid.width - 1 if x > grid.width - 1 - y = grid.height - 1 if y > grid.height - 1 + x = grid.width - 1 if x > grid.width - 1 + y = grid.height - 1 if y > grid.height - 1 # Return closest cell - [x, y] + [x, y] end # When the user grabs the star and puts their cursor to the far right @@ -716,17 +716,17 @@ class A_Star_Algorithm # Finding the cell closest to the mouse in the second grid helps with this def greedy_cell_closest_to_mouse # Closest cell grid to the mouse in the second - x = (inputs.mouse.point.x / grid.cell_size).to_i - y = (inputs.mouse.point.y / grid.cell_size).to_i + x = (inputs.mouse.point.x / grid.cell_size).to_i + y = (inputs.mouse.point.y / grid.cell_size).to_i # Translate the cell to the first grid x -= grid.width + 1 # Bound x and y to the first grid x = 0 if x < 0 y = 0 if y < 0 - x = grid.width - 1 if x > grid.width - 1 - y = grid.height - 1 if y > grid.height - 1 + x = grid.width - 1 if x > grid.width - 1 + y = grid.height - 1 if y > grid.height - 1 # Return closest cell - [x, y] + [x, y] end # When the user grabs the star and puts their cursor to the far right @@ -734,17 +734,17 @@ class A_Star_Algorithm # Finding the cell closest to the mouse in the third grid helps with this def a_star_cell_closest_to_mouse # Closest cell grid to the mouse in the second - x = (inputs.mouse.point.x / grid.cell_size).to_i - y = (inputs.mouse.point.y / grid.cell_size).to_i + x = (inputs.mouse.point.x / grid.cell_size).to_i + y = (inputs.mouse.point.y / grid.cell_size).to_i # Translate the cell to the first grid x -= (grid.width + 1) * 2 # Bound x and y to the first grid x = 0 if x < 0 y = 0 if y < 0 - x = grid.width - 1 if x > grid.width - 1 - y = grid.height - 1 if y > grid.height - 1 + x = grid.width - 1 if x > grid.width - 1 + y = grid.height - 1 if y > grid.height - 1 # Return closest cell - [x, y] + [x, y] end def reset_searches @@ -772,21 +772,21 @@ class A_Star_Algorithm def calc_dijkstra # Sets up the search to begin from the star - dijkstra.frontier << grid.star - dijkstra.came_from[grid.star] = nil - dijkstra.cost_so_far[grid.star] = 0 + dijkstra.frontier << grid.star + dijkstra.came_from[grid.star] = nil + dijkstra.cost_so_far[grid.star] = 0 # Until the target is found or there are no more cells to explore from until dijkstra.came_from.has_key?(grid.target) or dijkstra.frontier.empty? # Take the next frontier cell. The first element is the cell, the second is the priority. new_frontier = dijkstra.frontier.shift#[0] # For each of its neighbors - adjacent_neighbors(new_frontier).each do | neighbor | + adjacent_neighbors(new_frontier).each do | neighbor | # That have not been visited and are not walls - unless dijkstra.came_from.has_key?(neighbor) or grid.walls.has_key?(neighbor) + unless dijkstra.came_from.has_key?(neighbor) or grid.walls.has_key?(neighbor) # Add them to the frontier and mark them as visited dijkstra.frontier << neighbor - dijkstra.came_from[neighbor] = new_frontier + dijkstra.came_from[neighbor] = new_frontier dijkstra.cost_so_far[neighbor] = dijkstra.cost_so_far[new_frontier] + 1 end end @@ -807,20 +807,20 @@ class A_Star_Algorithm def calc_greedy # Sets up the search to begin from the star - greedy.frontier << grid.star - greedy.came_from[grid.star] = nil + greedy.frontier << grid.star + greedy.came_from[grid.star] = nil # Until the target is found or there are no more cells to explore from until greedy.came_from.has_key?(grid.target) or greedy.frontier.empty? # Take the next frontier cell - new_frontier = greedy.frontier.shift + new_frontier = greedy.frontier.shift # For each of its neighbors - adjacent_neighbors(new_frontier).each do | neighbor | + adjacent_neighbors(new_frontier).each do | neighbor | # That have not been visited and are not walls - unless greedy.came_from.has_key?(neighbor) or grid.walls.has_key?(neighbor) + unless greedy.came_from.has_key?(neighbor) or grid.walls.has_key?(neighbor) # Add them to the frontier and mark them as visited - greedy.frontier << neighbor - greedy.came_from[neighbor] = new_frontier + greedy.frontier << neighbor + greedy.came_from[neighbor] = new_frontier end end # Sort the frontier so that cells that are in a zigzag pattern are prioritized over those in an line @@ -850,12 +850,12 @@ class A_Star_Algorithm current_frontier = a_star.frontier.shift # For each of that cells neighbors - adjacent_neighbors(current_frontier).each do | neighbor | + adjacent_neighbors(current_frontier).each do | neighbor | # That have not been visited and are not walls - unless a_star.came_from.has_key?(neighbor) or grid.walls.has_key?(neighbor) + unless a_star.came_from.has_key?(neighbor) or grid.walls.has_key?(neighbor) # Add them to the frontier and mark them as visited - a_star.frontier << neighbor - a_star.came_from[neighbor] = current_frontier + a_star.frontier << neighbor + a_star.came_from[neighbor] = current_frontier a_star.cost_so_far[neighbor] = a_star.cost_so_far[current_frontier] + 1 end end @@ -937,16 +937,16 @@ class A_Star_Algorithm # Returns a list of adjacent cells # Used to determine what the next cells to be added to the frontier are def adjacent_neighbors(cell) - neighbors = [] + neighbors = [] # Gets all the valid neighbors into the array # From southern neighbor, clockwise - neighbors << [cell.x , cell.y - 1] unless cell.y == 0 - neighbors << [cell.x - 1, cell.y ] unless cell.x == 0 - neighbors << [cell.x , cell.y + 1] unless cell.y == grid.height - 1 - neighbors << [cell.x + 1, cell.y ] unless cell.x == grid.width - 1 + neighbors << [cell.x , cell.y - 1] unless cell.y == 0 + neighbors << [cell.x - 1, cell.y ] unless cell.x == 0 + neighbors << [cell.x , cell.y + 1] unless cell.y == grid.height - 1 + neighbors << [cell.x + 1, cell.y ] unless cell.x == grid.width - 1 - neighbors + neighbors end # Finds the vertical and horizontal distance of a cell from the star @@ -991,11 +991,11 @@ class A_Star_Algorithm def wall_color [134, 134, 120] # Camo Green end - + def visited_color [204, 191, 179] # Dark Brown end - + def path_color [231, 230, 228] # Pastel White end @@ -1018,7 +1018,7 @@ def tick args end # Every tick, new args are passed, and the Breadth First Search tick is called - $a_star_algorithm ||= A_Star_Algorithm.new(args) + $a_star_algorithm ||= A_Star_Algorithm.new $a_star_algorithm.args = args $a_star_algorithm.tick end diff --git a/samples/13_path_finding_algorithms/08_a_star/replay.txt b/samples/13_path_finding_algorithms/08_a_star/replay.txt new file mode 100644 index 0000000..001a564 --- /dev/null +++ b/samples/13_path_finding_algorithms/08_a_star/replay.txt @@ -0,0 +1,434 @@ +replay_version 2.0 +stopped_at 341 +seed 100 +recorded_at 2021-11-20 11:24:45 -0600 +[:mouse_button_up, 1, 0, 1, 1, 1] +[:mouse_move, 769, 97, 2, 2, 8] +[:mouse_move, 763, 101, 2, 3, 8] +[:mouse_move, 755, 109, 2, 4, 8] +[:mouse_move, 748, 123, 2, 5, 8] +[:mouse_move, 746, 148, 2, 6, 9] +[:mouse_move, 742, 180, 2, 7, 9] +[:mouse_move, 733, 215, 2, 8, 9] +[:mouse_move, 719, 278, 2, 9, 9] +[:mouse_move, 712, 336, 2, 10, 9] +[:mouse_move, 701, 397, 2, 11, 10] +[:mouse_move, 685, 440, 2, 12, 10] +[:mouse_move, 667, 472, 2, 13, 10] +[:mouse_move, 654, 493, 2, 14, 10] +[:mouse_move, 644, 506, 2, 15, 11] +[:mouse_move, 637, 514, 2, 16, 11] +[:mouse_move, 635, 516, 2, 17, 11] +[:mouse_move, 634, 517, 2, 18, 11] +[:mouse_move, 630, 518, 2, 19, 12] +[:mouse_move, 624, 524, 2, 20, 12] +[:mouse_move, 619, 537, 2, 21, 12] +[:mouse_move, 612, 553, 2, 22, 13] +[:mouse_move, 609, 561, 2, 23, 13] +[:mouse_move, 608, 565, 2, 24, 13] +[:mouse_move, 613, 565, 2, 25, 14] +[:mouse_move, 627, 565, 2, 26, 14] +[:mouse_move, 641, 565, 2, 27, 14] +[:mouse_move, 654, 565, 2, 28, 14] +[:mouse_move, 658, 565, 2, 29, 15] +[:mouse_move, 659, 565, 2, 30, 15] +[:mouse_move, 662, 565, 2, 31, 15] +[:mouse_move, 667, 566, 2, 32, 15] +[:mouse_move, 671, 566, 2, 33, 16] +[:mouse_move, 676, 566, 2, 34, 16] +[:mouse_move, 685, 566, 2, 35, 16] +[:mouse_move, 701, 565, 2, 36, 16] +[:mouse_move, 719, 562, 2, 37, 17] +[:mouse_move, 731, 560, 2, 38, 17] +[:mouse_move, 744, 559, 2, 39, 17] +[:mouse_move, 750, 559, 2, 40, 17] +[:mouse_move, 757, 559, 2, 41, 17] +[:mouse_move, 763, 559, 2, 42, 17] +[:mouse_move, 767, 559, 2, 43, 18] +[:mouse_move, 769, 559, 2, 44, 18] +[:mouse_move, 770, 558, 2, 45, 18] +[:mouse_move, 774, 557, 2, 46, 18] +[:mouse_move, 784, 555, 2, 47, 18] +[:mouse_move, 796, 551, 2, 48, 19] +[:mouse_move, 804, 550, 2, 49, 19] +[:mouse_move, 810, 548, 2, 50, 19] +[:mouse_move, 814, 547, 2, 51, 20] +[:mouse_move, 817, 547, 2, 52, 20] +[:mouse_move, 818, 547, 2, 53, 20] +[:mouse_move, 819, 547, 2, 54, 20] +[:mouse_move, 819, 546, 2, 55, 20] +[:mouse_move, 819, 545, 2, 56, 20] +[:mouse_move, 820, 545, 2, 57, 21] +[:mouse_move, 820, 544, 2, 58, 21] +[:mouse_move, 820, 543, 2, 59, 21] +[:mouse_move, 820, 542, 2, 60, 22] +[:mouse_move, 820, 541, 2, 61, 22] +[:mouse_move, 820, 540, 2, 62, 23] +[:mouse_move, 819, 540, 2, 63, 23] +[:mouse_button_pressed, 1, 0, 1, 64, 24] +[:mouse_button_up, 1, 0, 1, 65, 25] +[:mouse_move, 820, 540, 2, 66, 29] +[:mouse_move, 820, 541, 2, 67, 29] +[:mouse_move, 820, 542, 2, 68, 29] +[:mouse_move, 820, 543, 2, 69, 30] +[:mouse_move, 819, 543, 2, 70, 31] +[:mouse_move, 818, 543, 2, 71, 31] +[:mouse_move, 817, 542, 2, 72, 31] +[:mouse_move, 816, 542, 2, 73, 32] +[:mouse_move, 812, 542, 2, 74, 32] +[:mouse_move, 808, 542, 2, 75, 32] +[:mouse_move, 802, 542, 2, 76, 33] +[:mouse_move, 796, 542, 2, 77, 33] +[:mouse_move, 790, 542, 2, 78, 33] +[:mouse_move, 784, 540, 2, 79, 33] +[:mouse_move, 783, 540, 2, 80, 34] +[:mouse_move, 782, 538, 2, 81, 34] +[:mouse_move, 782, 533, 2, 82, 34] +[:mouse_move, 785, 525, 2, 83, 34] +[:mouse_move, 788, 512, 2, 84, 34] +[:mouse_move, 791, 494, 2, 85, 35] +[:mouse_move, 791, 469, 2, 86, 35] +[:mouse_move, 785, 442, 2, 87, 35] +[:mouse_move, 776, 417, 2, 88, 35] +[:mouse_move, 767, 398, 2, 89, 36] +[:mouse_move, 759, 381, 2, 90, 36] +[:mouse_move, 747, 365, 2, 91, 36] +[:mouse_move, 737, 356, 2, 92, 36] +[:mouse_move, 718, 345, 2, 93, 36] +[:mouse_move, 702, 337, 2, 94, 37] +[:mouse_move, 693, 333, 2, 95, 37] +[:mouse_move, 689, 331, 2, 96, 37] +[:mouse_move, 688, 331, 2, 97, 38] +[:mouse_move, 687, 331, 2, 98, 38] +[:mouse_move, 686, 342, 2, 99, 38] +[:mouse_move, 684, 352, 2, 100, 39] +[:mouse_move, 682, 359, 2, 101, 39] +[:mouse_move, 682, 362, 2, 102, 39] +[:mouse_move, 682, 364, 2, 103, 40] +[:mouse_move, 683, 364, 2, 104, 40] +[:mouse_move, 686, 364, 2, 105, 40] +[:mouse_move, 688, 363, 2, 106, 40] +[:mouse_move, 692, 362, 2, 107, 40] +[:mouse_move, 698, 362, 2, 108, 41] +[:mouse_move, 702, 362, 2, 109, 41] +[:mouse_move, 705, 362, 2, 110, 41] +[:mouse_move, 706, 362, 2, 111, 42] +[:mouse_move, 706, 361, 2, 112, 42] +[:mouse_move, 707, 361, 2, 113, 42] +[:mouse_move, 708, 360, 2, 114, 42] +[:mouse_move, 709, 359, 2, 115, 43] +[:mouse_move, 709, 358, 2, 116, 43] +[:mouse_move, 710, 358, 2, 117, 43] +[:mouse_button_pressed, 1, 0, 1, 118, 44] +[:mouse_button_up, 1, 0, 1, 119, 45] +[:mouse_move, 710, 357, 2, 120, 56] +[:mouse_move, 713, 357, 2, 121, 56] +[:mouse_move, 715, 357, 2, 122, 57] +[:mouse_move, 716, 357, 2, 123, 57] +[:mouse_move, 717, 357, 2, 124, 57] +[:mouse_move, 719, 357, 2, 125, 58] +[:mouse_move, 720, 357, 2, 126, 58] +[:mouse_move, 720, 356, 2, 127, 59] +[:mouse_move, 721, 356, 2, 128, 59] +[:mouse_move, 723, 356, 2, 129, 59] +[:mouse_move, 724, 356, 2, 130, 59] +[:mouse_move, 727, 356, 2, 131, 59] +[:mouse_move, 728, 356, 2, 132, 59] +[:mouse_move, 730, 356, 2, 133, 60] +[:mouse_move, 731, 355, 2, 134, 60] +[:mouse_move, 732, 355, 2, 135, 60] +[:mouse_move, 734, 355, 2, 136, 60] +[:mouse_move, 735, 355, 2, 137, 60] +[:mouse_button_pressed, 1, 0, 1, 138, 62] +[:mouse_move, 737, 358, 2, 139, 63] +[:mouse_move, 739, 364, 2, 140, 63] +[:mouse_move, 739, 372, 2, 141, 63] +[:mouse_move, 739, 381, 2, 142, 64] +[:mouse_move, 740, 390, 2, 143, 64] +[:mouse_move, 742, 403, 2, 144, 64] +[:mouse_move, 744, 415, 2, 145, 64] +[:mouse_move, 744, 426, 2, 146, 64] +[:mouse_move, 745, 438, 2, 147, 64] +[:mouse_move, 746, 445, 2, 148, 64] +[:mouse_move, 747, 449, 2, 149, 64] +[:mouse_move, 747, 450, 2, 150, 64] +[:mouse_move, 747, 451, 2, 151, 64] +[:mouse_move, 748, 452, 2, 152, 64] +[:mouse_move, 749, 452, 2, 153, 64] +[:mouse_move, 750, 452, 2, 154, 64] +[:mouse_move, 751, 452, 2, 155, 64] +[:mouse_move, 753, 454, 2, 156, 64] +[:mouse_move, 754, 455, 2, 157, 64] +[:mouse_move, 756, 456, 2, 158, 64] +[:mouse_move, 759, 459, 2, 159, 64] +[:mouse_move, 765, 465, 2, 160, 64] +[:mouse_move, 769, 469, 2, 161, 64] +[:mouse_move, 773, 474, 2, 162, 64] +[:mouse_move, 776, 479, 2, 163, 64] +[:mouse_move, 781, 486, 2, 164, 64] +[:mouse_move, 782, 490, 2, 165, 65] +[:mouse_move, 783, 494, 2, 166, 65] +[:mouse_move, 783, 498, 2, 167, 65] +[:mouse_move, 784, 506, 2, 168, 65] +[:mouse_move, 786, 515, 2, 169, 65] +[:mouse_move, 789, 526, 2, 170, 65] +[:mouse_move, 791, 534, 2, 171, 65] +[:mouse_move, 795, 549, 2, 172, 65] +[:mouse_move, 798, 556, 2, 173, 65] +[:mouse_move, 799, 561, 2, 174, 65] +[:mouse_move, 799, 564, 2, 175, 65] +[:mouse_move, 801, 570, 2, 176, 65] +[:mouse_move, 802, 577, 2, 177, 65] +[:mouse_move, 804, 583, 2, 178, 65] +[:mouse_move, 804, 587, 2, 179, 65] +[:mouse_move, 805, 590, 2, 180, 65] +[:mouse_move, 807, 594, 2, 181, 65] +[:mouse_move, 809, 598, 2, 182, 65] +[:mouse_move, 811, 601, 2, 183, 65] +[:mouse_move, 812, 602, 2, 184, 65] +[:mouse_move, 812, 603, 2, 185, 65] +[:mouse_move, 813, 604, 2, 186, 65] +[:mouse_move, 814, 604, 2, 187, 65] +[:mouse_move, 817, 599, 2, 188, 65] +[:mouse_move, 819, 595, 2, 189, 65] +[:mouse_move, 820, 594, 2, 190, 65] +[:mouse_move, 819, 594, 2, 191, 77] +[:mouse_button_up, 1, 0, 1, 192, 77] +[:mouse_move, 818, 594, 2, 193, 77] +[:mouse_move, 817, 594, 2, 194, 78] +[:mouse_move, 816, 594, 2, 195, 79] +[:mouse_move, 815, 593, 2, 196, 109] +[:mouse_move, 812, 592, 2, 197, 109] +[:mouse_move, 808, 592, 2, 198, 109] +[:mouse_move, 799, 591, 2, 199, 109] +[:mouse_move, 780, 588, 2, 200, 110] +[:mouse_move, 758, 584, 2, 201, 110] +[:mouse_move, 738, 584, 2, 202, 110] +[:mouse_move, 724, 584, 2, 203, 110] +[:mouse_move, 710, 584, 2, 204, 110] +[:mouse_move, 691, 583, 2, 205, 111] +[:mouse_move, 668, 579, 2, 206, 111] +[:mouse_move, 647, 577, 2, 207, 111] +[:mouse_move, 630, 577, 2, 208, 111] +[:mouse_move, 610, 577, 2, 209, 112] +[:mouse_move, 602, 577, 2, 210, 112] +[:mouse_move, 597, 576, 2, 211, 112] +[:mouse_move, 595, 575, 2, 212, 112] +[:mouse_move, 603, 575, 2, 213, 114] +[:mouse_move, 626, 575, 2, 214, 114] +[:mouse_move, 651, 575, 2, 215, 114] +[:mouse_move, 680, 579, 2, 216, 114] +[:mouse_move, 723, 583, 2, 217, 114] +[:mouse_move, 745, 585, 2, 218, 114] +[:mouse_move, 756, 585, 2, 219, 115] +[:mouse_move, 758, 585, 2, 220, 115] +[:mouse_move, 759, 585, 2, 221, 115] +[:mouse_move, 760, 584, 2, 222, 115] +[:mouse_move, 761, 584, 2, 223, 116] +[:mouse_move, 764, 584, 2, 224, 116] +[:mouse_move, 767, 584, 2, 225, 116] +[:mouse_move, 769, 584, 2, 226, 116] +[:mouse_move, 773, 584, 2, 227, 117] +[:mouse_move, 791, 588, 2, 228, 117] +[:mouse_move, 803, 596, 2, 229, 117] +[:mouse_move, 807, 599, 2, 230, 118] +[:mouse_move, 808, 599, 2, 231, 118] +[:mouse_move, 809, 599, 2, 232, 119] +[:mouse_move, 812, 599, 2, 233, 120] +[:mouse_move, 813, 599, 2, 234, 120] +[:mouse_move, 814, 599, 2, 235, 120] +[:mouse_move, 815, 599, 2, 236, 122] +[:mouse_move, 816, 598, 2, 237, 122] +[:mouse_move, 817, 598, 2, 238, 123] +[:mouse_button_pressed, 1, 0, 1, 239, 123] +[:mouse_move, 805, 598, 2, 240, 124] +[:mouse_move, 777, 598, 2, 241, 124] +[:mouse_move, 748, 598, 2, 242, 124] +[:mouse_move, 722, 598, 2, 243, 124] +[:mouse_move, 692, 598, 2, 244, 124] +[:mouse_move, 668, 598, 2, 245, 124] +[:mouse_move, 648, 598, 2, 246, 125] +[:mouse_move, 624, 598, 2, 247, 125] +[:mouse_move, 615, 598, 2, 248, 125] +[:mouse_move, 610, 598, 2, 249, 125] +[:mouse_move, 609, 598, 2, 250, 125] +[:mouse_move, 607, 598, 2, 251, 125] +[:mouse_move, 606, 598, 2, 252, 125] +[:mouse_move, 604, 595, 2, 253, 127] +[:mouse_move, 598, 590, 2, 254, 128] +[:mouse_move, 592, 584, 2, 255, 128] +[:mouse_move, 588, 581, 2, 256, 129] +[:mouse_move, 588, 580, 2, 257, 129] +[:mouse_move, 587, 580, 2, 258, 129] +[:mouse_move, 586, 579, 2, 259, 130] +[:mouse_move, 585, 579, 2, 260, 130] +[:mouse_move, 584, 578, 2, 261, 131] +[:mouse_move, 584, 577, 2, 262, 131] +[:mouse_move, 584, 576, 2, 263, 132] +[:mouse_move, 583, 576, 2, 264, 133] +[:mouse_move, 584, 576, 2, 265, 135] +[:mouse_button_up, 1, 0, 1, 266, 147] +[:mouse_move, 585, 575, 2, 267, 153] +[:mouse_move, 585, 571, 2, 268, 196] +[:mouse_move, 585, 568, 2, 269, 197] +[:mouse_move, 586, 563, 2, 270, 197] +[:mouse_move, 587, 558, 2, 271, 197] +[:mouse_move, 587, 557, 2, 272, 198] +[:mouse_move, 587, 555, 2, 273, 199] +[:mouse_move, 588, 555, 2, 274, 200] +[:mouse_move, 588, 554, 2, 275, 200] +[:mouse_move, 588, 550, 2, 276, 235] +[:mouse_move, 594, 541, 2, 277, 236] +[:mouse_move, 605, 525, 2, 278, 236] +[:mouse_move, 622, 502, 2, 279, 236] +[:mouse_move, 654, 458, 2, 280, 237] +[:mouse_move, 672, 425, 2, 281, 237] +[:mouse_move, 682, 391, 2, 282, 238] +[:mouse_move, 688, 358, 2, 283, 239] +[:mouse_move, 692, 333, 2, 284, 239] +[:mouse_move, 694, 319, 2, 285, 239] +[:mouse_move, 697, 308, 2, 286, 240] +[:mouse_move, 698, 303, 2, 287, 240] +[:mouse_move, 700, 299, 2, 288, 241] +[:mouse_move, 702, 295, 2, 289, 241] +[:mouse_move, 703, 291, 2, 290, 242] +[:mouse_move, 704, 289, 2, 291, 242] +[:mouse_move, 705, 288, 2, 292, 243] +[:mouse_move, 706, 288, 2, 293, 245] +[:mouse_move, 706, 291, 2, 294, 246] +[:mouse_move, 706, 294, 2, 295, 246] +[:mouse_move, 706, 298, 2, 296, 247] +[:mouse_move, 706, 303, 2, 297, 247] +[:mouse_move, 707, 308, 2, 298, 247] +[:mouse_move, 709, 315, 2, 299, 248] +[:mouse_move, 710, 321, 2, 300, 248] +[:mouse_move, 711, 324, 2, 301, 249] +[:mouse_move, 711, 325, 2, 302, 249] +[:mouse_move, 712, 325, 2, 303, 250] +[:mouse_move, 713, 325, 2, 304, 252] +[:mouse_move, 713, 324, 2, 305, 252] +[:mouse_move, 714, 324, 2, 306, 253] +[:mouse_button_pressed, 1, 0, 1, 307, 254] +[:mouse_button_up, 1, 0, 1, 308, 255] +[:mouse_move, 714, 325, 2, 309, 263] +[:mouse_move, 714, 331, 2, 310, 263] +[:mouse_move, 714, 344, 2, 311, 264] +[:mouse_move, 714, 365, 2, 312, 264] +[:mouse_move, 710, 394, 2, 313, 264] +[:mouse_move, 696, 432, 2, 314, 265] +[:mouse_move, 678, 472, 2, 315, 265] +[:mouse_move, 654, 506, 2, 316, 266] +[:mouse_move, 637, 532, 2, 317, 267] +[:mouse_move, 624, 549, 2, 318, 267] +[:mouse_move, 615, 559, 2, 319, 267] +[:mouse_move, 612, 562, 2, 320, 268] +[:mouse_move, 609, 563, 2, 321, 268] +[:mouse_move, 608, 564, 2, 322, 269] +[:mouse_move, 606, 566, 2, 323, 269] +[:mouse_move, 606, 568, 2, 324, 270] +[:mouse_move, 606, 572, 2, 325, 270] +[:mouse_move, 606, 573, 2, 326, 271] +[:mouse_move, 606, 574, 2, 327, 271] +[:mouse_move, 605, 573, 2, 328, 273] +[:mouse_move, 606, 571, 2, 329, 273] +[:mouse_move, 606, 566, 2, 330, 274] +[:mouse_move, 606, 565, 2, 331, 274] +[:mouse_move, 605, 565, 2, 332, 275] +[:mouse_move, 601, 565, 2, 333, 275] +[:mouse_move, 593, 565, 2, 334, 276] +[:mouse_move, 583, 565, 2, 335, 276] +[:mouse_move, 573, 567, 2, 336, 277] +[:mouse_move, 570, 567, 2, 337, 278] +[:mouse_move, 569, 567, 2, 338, 278] +[:mouse_move, 570, 568, 2, 339, 284] +[:mouse_move, 572, 568, 2, 340, 284] +[:mouse_move, 573, 568, 2, 341, 286] +[:mouse_button_pressed, 1, 0, 1, 342, 290] +[:mouse_move, 574, 568, 2, 343, 290] +[:mouse_move, 576, 568, 2, 344, 291] +[:mouse_move, 586, 564, 2, 345, 292] +[:mouse_move, 601, 560, 2, 346, 292] +[:mouse_move, 622, 552, 2, 347, 292] +[:mouse_move, 648, 544, 2, 348, 293] +[:mouse_move, 675, 537, 2, 349, 293] +[:mouse_move, 702, 533, 2, 350, 293] +[:mouse_move, 726, 530, 2, 351, 293] +[:mouse_move, 747, 526, 2, 352, 293] +[:mouse_move, 771, 518, 2, 353, 293] +[:mouse_move, 786, 514, 2, 354, 293] +[:mouse_move, 802, 511, 2, 355, 294] +[:mouse_move, 815, 508, 2, 356, 294] +[:mouse_move, 827, 505, 2, 357, 294] +[:mouse_move, 833, 504, 2, 358, 294] +[:mouse_move, 835, 503, 2, 359, 294] +[:mouse_move, 832, 503, 2, 360, 294] +[:mouse_move, 830, 504, 2, 361, 294] +[:mouse_move, 826, 506, 2, 362, 294] +[:mouse_move, 822, 508, 2, 363, 294] +[:mouse_move, 818, 511, 2, 364, 294] +[:mouse_move, 816, 511, 2, 365, 294] +[:mouse_move, 813, 513, 2, 366, 294] +[:mouse_move, 813, 514, 2, 367, 294] +[:mouse_move, 812, 515, 2, 368, 294] +[:mouse_move, 812, 516, 2, 369, 294] +[:mouse_move, 812, 517, 2, 370, 294] +[:mouse_move, 813, 518, 2, 371, 295] +[:mouse_move, 814, 518, 2, 372, 295] +[:mouse_move, 815, 518, 2, 373, 295] +[:mouse_move, 816, 518, 2, 374, 295] +[:mouse_move, 817, 518, 2, 375, 295] +[:mouse_button_up, 1, 0, 1, 376, 302] +[:mouse_move, 817, 517, 2, 377, 313] +[:key_down_raw, 96, 0, 2, 378, 320] +[:key_up_raw, 96, 0, 2, 379, 321] +[:mouse_move, 817, 518, 2, 380, 323] +[:mouse_move, 819, 515, 2, 381, 324] +[:mouse_move, 819, 510, 2, 382, 324] +[:mouse_move, 811, 498, 2, 383, 324] +[:mouse_move, 797, 486, 2, 384, 324] +[:mouse_move, 786, 482, 2, 385, 324] +[:mouse_move, 780, 479, 2, 386, 324] +[:mouse_move, 779, 478, 2, 387, 324] +[:mouse_move, 778, 479, 2, 388, 327] +[:mouse_move, 779, 484, 2, 389, 327] +[:mouse_move, 780, 487, 2, 390, 327] +[:mouse_move, 781, 488, 2, 391, 327] +[:mouse_move, 782, 488, 2, 392, 327] +[:mouse_move, 782, 487, 2, 393, 328] +[:mouse_move, 789, 485, 2, 394, 328] +[:mouse_move, 800, 481, 2, 395, 328] +[:mouse_move, 816, 472, 2, 396, 328] +[:mouse_move, 839, 456, 2, 397, 328] +[:mouse_move, 870, 434, 2, 398, 329] +[:mouse_move, 904, 409, 2, 399, 329] +[:mouse_move, 944, 380, 2, 400, 329] +[:mouse_move, 996, 331, 2, 401, 329] +[:mouse_move, 1011, 312, 2, 402, 329] +[:mouse_move, 1042, 278, 2, 403, 329] +[:mouse_move, 1081, 231, 2, 404, 329] +[:mouse_move, 1101, 213, 2, 405, 330] +[:mouse_move, 1114, 202, 2, 406, 330] +[:mouse_move, 1118, 196, 2, 407, 330] +[:mouse_move, 1118, 195, 2, 408, 330] +[:mouse_move, 1117, 194, 2, 409, 331] +[:mouse_move, 1115, 194, 2, 410, 331] +[:mouse_move, 1110, 193, 2, 411, 331] +[:mouse_move, 1102, 189, 2, 412, 331] +[:mouse_move, 1084, 184, 2, 413, 331] +[:mouse_move, 1052, 175, 2, 414, 332] +[:mouse_move, 1005, 162, 2, 415, 332] +[:mouse_move, 938, 144, 2, 416, 332] +[:mouse_move, 892, 138, 2, 417, 332] +[:mouse_move, 860, 134, 2, 418, 332] +[:mouse_move, 833, 128, 2, 419, 333] +[:mouse_move, 809, 120, 2, 420, 333] +[:mouse_move, 782, 108, 2, 421, 333] +[:mouse_move, 772, 104, 2, 422, 333] +[:mouse_move, 770, 103, 2, 423, 333] +[:mouse_move, 769, 103, 2, 424, 333] +[:mouse_move, 766, 101, 2, 425, 334] +[:mouse_move, 764, 100, 2, 426, 334] +[:mouse_move, 763, 100, 2, 427, 334] +[:mouse_move, 761, 99, 2, 428, 334] +[:mouse_move, 760, 98, 2, 429, 334] +[:key_down_raw, 13, 0, 2, 430, 341] diff --git a/samples/99_genre_3d/02_wireframe/replay.txt b/samples/99_genre_3d/02_wireframe/replay.txt new file mode 100644 index 0000000..2786904 --- /dev/null +++ b/samples/99_genre_3d/02_wireframe/replay.txt @@ -0,0 +1,242 @@ +replay_version 2.0 +stopped_at 706 +seed 100 +recorded_at 2021-11-20 11:26:04 -0600 +[:mouse_button_up, 1, 0, 1, 1, 4] +[:key_down_raw, 1073741906, 0, 2, 2, 63] +[:key_down_raw, 1073741906, 0, 2, 3, 77] +[:key_down_raw, 1073741906, 0, 2, 4, 79] +[:key_down_raw, 1073741906, 0, 2, 5, 81] +[:key_down_raw, 1073741906, 0, 2, 6, 84] +[:key_down_raw, 1073741906, 0, 2, 7, 85] +[:key_down_raw, 1073741906, 0, 2, 8, 87] +[:key_down_raw, 1073741906, 0, 2, 9, 90] +[:key_down_raw, 1073741906, 0, 2, 10, 92] +[:key_down_raw, 1073741906, 0, 2, 11, 94] +[:key_down_raw, 1073741906, 0, 2, 12, 96] +[:key_down_raw, 1073741906, 0, 2, 13, 98] +[:key_down_raw, 1073741906, 0, 2, 14, 100] +[:key_down_raw, 1073741906, 0, 2, 15, 102] +[:key_up_raw, 1073741906, 0, 2, 16, 103] +[:key_down_raw, 1073741905, 0, 2, 17, 110] +[:key_down_raw, 1073741905, 0, 2, 18, 125] +[:key_down_raw, 1073741905, 0, 2, 19, 127] +[:key_down_raw, 1073741905, 0, 2, 20, 129] +[:key_down_raw, 1073741905, 0, 2, 21, 131] +[:key_down_raw, 1073741905, 0, 2, 22, 133] +[:key_down_raw, 1073741905, 0, 2, 23, 135] +[:key_down_raw, 1073741905, 0, 2, 24, 137] +[:key_down_raw, 1073741905, 0, 2, 25, 139] +[:key_down_raw, 1073741905, 0, 2, 26, 141] +[:key_down_raw, 1073741905, 0, 2, 27, 143] +[:key_down_raw, 1073741905, 0, 2, 28, 145] +[:key_down_raw, 1073741905, 0, 2, 29, 147] +[:key_down_raw, 1073741905, 0, 2, 30, 149] +[:key_down_raw, 1073741905, 0, 2, 31, 151] +[:key_down_raw, 1073741905, 0, 2, 32, 153] +[:key_down_raw, 1073741905, 0, 2, 33, 155] +[:key_down_raw, 1073741905, 0, 2, 34, 157] +[:key_down_raw, 1073741905, 0, 2, 35, 159] +[:key_down_raw, 1073741905, 0, 2, 36, 161] +[:key_down_raw, 1073741905, 0, 2, 37, 163] +[:key_down_raw, 1073741905, 0, 2, 38, 165] +[:key_down_raw, 1073741905, 0, 2, 39, 167] +[:key_down_raw, 1073741905, 0, 2, 40, 169] +[:key_down_raw, 1073741905, 0, 2, 41, 171] +[:key_up_raw, 1073741905, 0, 2, 42, 171] +[:key_down_raw, 1073741904, 0, 2, 43, 175] +[:key_down_raw, 1073741904, 0, 2, 44, 190] +[:key_down_raw, 1073741904, 0, 2, 45, 192] +[:key_down_raw, 1073741904, 0, 2, 46, 194] +[:key_down_raw, 1073741904, 0, 2, 47, 196] +[:key_down_raw, 1073741904, 0, 2, 48, 198] +[:key_down_raw, 1073741904, 0, 2, 49, 200] +[:key_down_raw, 1073741904, 0, 2, 50, 202] +[:key_down_raw, 1073741904, 0, 2, 51, 204] +[:key_down_raw, 1073741904, 0, 2, 52, 206] +[:key_down_raw, 1073741904, 0, 2, 53, 208] +[:key_down_raw, 1073741904, 0, 2, 54, 210] +[:key_down_raw, 1073741904, 0, 2, 55, 212] +[:key_down_raw, 1073741903, 0, 2, 56, 214] +[:key_down_raw, 1073741903, 0, 2, 57, 229] +[:key_down_raw, 1073741903, 0, 2, 58, 231] +[:key_down_raw, 1073741903, 0, 2, 59, 233] +[:key_down_raw, 1073741906, 0, 2, 60, 234] +[:key_up_raw, 1073741904, 0, 2, 61, 238] +[:key_down_raw, 1073741906, 0, 2, 62, 249] +[:key_down_raw, 1073741906, 0, 2, 63, 251] +[:key_down_raw, 1073741906, 0, 2, 64, 253] +[:key_down_raw, 1073741906, 0, 2, 65, 255] +[:key_down_raw, 1073741906, 0, 2, 66, 257] +[:key_down_raw, 1073741906, 0, 2, 67, 259] +[:key_down_raw, 1073741906, 0, 2, 68, 261] +[:key_down_raw, 1073741906, 0, 2, 69, 263] +[:key_down_raw, 1073741906, 0, 2, 70, 265] +[:key_down_raw, 1073741906, 0, 2, 71, 267] +[:key_down_raw, 1073741906, 0, 2, 72, 269] +[:key_down_raw, 1073741906, 0, 2, 73, 271] +[:key_down_raw, 1073741906, 0, 2, 74, 273] +[:key_down_raw, 1073741906, 0, 2, 75, 275] +[:key_down_raw, 1073741906, 0, 2, 76, 277] +[:key_down_raw, 1073741906, 0, 2, 77, 279] +[:key_down_raw, 1073741906, 0, 2, 78, 281] +[:key_down_raw, 1073741906, 0, 2, 79, 283] +[:key_down_raw, 1073741906, 0, 2, 80, 285] +[:key_down_raw, 1073741906, 0, 2, 81, 287] +[:key_down_raw, 1073741906, 0, 2, 82, 289] +[:key_down_raw, 1073741906, 0, 2, 83, 291] +[:key_down_raw, 1073741906, 0, 2, 84, 293] +[:key_down_raw, 1073741906, 0, 2, 85, 295] +[:key_down_raw, 1073741906, 0, 2, 86, 297] +[:key_down_raw, 1073741906, 0, 2, 87, 299] +[:key_down_raw, 1073741906, 0, 2, 88, 301] +[:key_down_raw, 1073741905, 0, 2, 89, 301] +[:key_up_raw, 1073741906, 0, 2, 90, 310] +[:key_up_raw, 1073741903, 0, 2, 91, 310] +[:key_down_raw, 1073741904, 0, 2, 92, 316] +[:key_down_raw, 1073741904, 0, 2, 93, 331] +[:key_down_raw, 1073741904, 0, 2, 94, 333] +[:key_down_raw, 1073741904, 0, 2, 95, 335] +[:key_down_raw, 1073741904, 0, 2, 96, 337] +[:key_down_raw, 1073741904, 0, 2, 97, 339] +[:key_down_raw, 1073741904, 0, 2, 98, 341] +[:key_down_raw, 1073741904, 0, 2, 99, 343] +[:key_down_raw, 1073741904, 0, 2, 100, 345] +[:key_down_raw, 1073741904, 0, 2, 101, 347] +[:key_down_raw, 1073741904, 0, 2, 102, 349] +[:key_down_raw, 1073741904, 0, 2, 103, 351] +[:key_down_raw, 1073741904, 0, 2, 104, 353] +[:key_down_raw, 1073741904, 0, 2, 105, 355] +[:key_down_raw, 1073741904, 0, 2, 106, 357] +[:key_down_raw, 1073741904, 0, 2, 107, 359] +[:key_down_raw, 1073741904, 0, 2, 108, 361] +[:key_up_raw, 1073741905, 0, 2, 109, 363] +[:key_down_raw, 1073741904, 0, 2, 110, 363] +[:key_down_raw, 1073741904, 0, 2, 111, 365] +[:key_down_raw, 1073741904, 0, 2, 112, 367] +[:key_down_raw, 1073741904, 0, 2, 113, 369] +[:key_down_raw, 1073741904, 0, 2, 114, 371] +[:key_down_raw, 1073741904, 0, 2, 115, 373] +[:key_down_raw, 1073741904, 0, 2, 116, 375] +[:key_down_raw, 1073741904, 0, 2, 117, 377] +[:key_down_raw, 1073741904, 0, 2, 118, 379] +[:key_down_raw, 1073741904, 0, 2, 119, 381] +[:key_down_raw, 1073741904, 0, 2, 120, 383] +[:key_down_raw, 1073741904, 0, 2, 121, 385] +[:key_down_raw, 1073741904, 0, 2, 122, 387] +[:key_down_raw, 1073741904, 0, 2, 123, 389] +[:key_down_raw, 1073741904, 0, 2, 124, 391] +[:key_down_raw, 1073741904, 0, 2, 125, 393] +[:key_down_raw, 1073741904, 0, 2, 126, 395] +[:key_down_raw, 1073741904, 0, 2, 127, 397] +[:key_up_raw, 1073741904, 0, 2, 128, 399] +[:key_down_raw, 1073741903, 0, 2, 129, 400] +[:key_down_raw, 1073741903, 0, 2, 130, 415] +[:key_down_raw, 1073741903, 0, 2, 131, 417] +[:key_down_raw, 1073741903, 0, 2, 132, 419] +[:key_down_raw, 1073741903, 0, 2, 133, 421] +[:key_down_raw, 1073741903, 0, 2, 134, 423] +[:key_down_raw, 1073741903, 0, 2, 135, 425] +[:key_down_raw, 1073741903, 0, 2, 136, 427] +[:key_down_raw, 1073741903, 0, 2, 137, 429] +[:key_down_raw, 1073741903, 0, 2, 138, 431] +[:key_down_raw, 1073741903, 0, 2, 139, 433] +[:key_down_raw, 1073741903, 0, 2, 140, 435] +[:key_down_raw, 1073741903, 0, 2, 141, 437] +[:key_down_raw, 1073741903, 0, 2, 142, 439] +[:key_down_raw, 1073741903, 0, 2, 143, 441] +[:key_down_raw, 1073741903, 0, 2, 144, 443] +[:key_down_raw, 1073741903, 0, 2, 145, 445] +[:key_down_raw, 1073741903, 0, 2, 146, 447] +[:key_down_raw, 1073741903, 0, 2, 147, 449] +[:key_down_raw, 1073741903, 0, 2, 148, 451] +[:key_down_raw, 1073741903, 0, 2, 149, 453] +[:key_down_raw, 1073741903, 0, 2, 150, 455] +[:key_down_raw, 1073741903, 0, 2, 151, 457] +[:key_down_raw, 1073741903, 0, 2, 152, 459] +[:key_down_raw, 1073741903, 0, 2, 153, 461] +[:key_down_raw, 1073741903, 0, 2, 154, 463] +[:key_down_raw, 1073741903, 0, 2, 155, 465] +[:key_down_raw, 1073741903, 0, 2, 156, 467] +[:key_down_raw, 1073741903, 0, 2, 157, 469] +[:key_down_raw, 1073741903, 0, 2, 158, 471] +[:key_down_raw, 1073741903, 0, 2, 159, 473] +[:key_down_raw, 1073741903, 0, 2, 160, 475] +[:key_down_raw, 1073741903, 0, 2, 161, 477] +[:key_down_raw, 1073741903, 0, 2, 162, 479] +[:key_down_raw, 1073741903, 0, 2, 163, 481] +[:key_down_raw, 1073741903, 0, 2, 164, 483] +[:key_down_raw, 1073741903, 0, 2, 165, 485] +[:key_down_raw, 1073741903, 0, 2, 166, 487] +[:key_down_raw, 1073741903, 0, 2, 167, 489] +[:key_down_raw, 1073741903, 0, 2, 168, 491] +[:key_down_raw, 1073741903, 0, 2, 169, 493] +[:key_down_raw, 1073741903, 0, 2, 170, 495] +[:key_down_raw, 1073741903, 0, 2, 171, 497] +[:key_down_raw, 1073741905, 0, 2, 172, 498] +[:key_down_raw, 1073741905, 0, 2, 173, 513] +[:key_down_raw, 1073741905, 0, 2, 174, 515] +[:key_down_raw, 1073741905, 0, 2, 175, 517] +[:key_down_raw, 1073741905, 0, 2, 176, 519] +[:key_down_raw, 1073741905, 0, 2, 177, 521] +[:key_down_raw, 1073741905, 0, 2, 178, 523] +[:key_down_raw, 1073741905, 0, 2, 179, 525] +[:key_down_raw, 1073741905, 0, 2, 180, 527] +[:key_down_raw, 1073741905, 0, 2, 181, 529] +[:key_down_raw, 1073741905, 0, 2, 182, 531] +[:key_down_raw, 1073741905, 0, 2, 183, 533] +[:key_down_raw, 1073741905, 0, 2, 184, 535] +[:key_down_raw, 1073741905, 0, 2, 185, 537] +[:key_down_raw, 1073741905, 0, 2, 186, 539] +[:key_down_raw, 1073741905, 0, 2, 187, 541] +[:key_down_raw, 1073741905, 0, 2, 188, 543] +[:key_up_raw, 1073741905, 0, 2, 189, 543] +[:key_up_raw, 1073741903, 0, 2, 190, 544] +[:key_down_raw, 1073741906, 0, 2, 191, 547] +[:key_down_raw, 1073741906, 0, 2, 192, 562] +[:key_down_raw, 1073741906, 0, 2, 193, 564] +[:key_down_raw, 1073741906, 0, 2, 194, 566] +[:key_down_raw, 1073741906, 0, 2, 195, 568] +[:key_down_raw, 1073741906, 0, 2, 196, 570] +[:key_down_raw, 1073741906, 0, 2, 197, 572] +[:key_down_raw, 1073741906, 0, 2, 198, 574] +[:key_down_raw, 1073741906, 0, 2, 199, 576] +[:key_down_raw, 1073741906, 0, 2, 200, 578] +[:key_down_raw, 1073741906, 0, 2, 201, 580] +[:key_down_raw, 1073741906, 0, 2, 202, 582] +[:key_down_raw, 1073741906, 0, 2, 203, 584] +[:key_down_raw, 1073741906, 0, 2, 204, 586] +[:key_down_raw, 1073741906, 0, 2, 205, 588] +[:key_down_raw, 1073741906, 0, 2, 206, 590] +[:key_down_raw, 1073741906, 0, 2, 207, 592] +[:key_down_raw, 1073741906, 0, 2, 208, 594] +[:key_down_raw, 1073741906, 0, 2, 209, 596] +[:key_down_raw, 1073741906, 0, 2, 210, 598] +[:key_down_raw, 1073741906, 0, 2, 211, 600] +[:key_down_raw, 1073741906, 0, 2, 212, 602] +[:key_down_raw, 1073741906, 0, 2, 213, 604] +[:key_down_raw, 1073741906, 0, 2, 214, 606] +[:key_down_raw, 1073741906, 0, 2, 215, 608] +[:key_down_raw, 1073741906, 0, 2, 216, 610] +[:key_down_raw, 1073741906, 0, 2, 217, 612] +[:key_down_raw, 1073741906, 0, 2, 218, 614] +[:key_down_raw, 1073741906, 0, 2, 219, 616] +[:key_down_raw, 1073741906, 0, 2, 220, 618] +[:key_down_raw, 1073741906, 0, 2, 221, 620] +[:key_down_raw, 1073741906, 0, 2, 222, 622] +[:key_down_raw, 1073741906, 0, 2, 223, 624] +[:key_down_raw, 1073741906, 0, 2, 224, 626] +[:key_down_raw, 1073741906, 0, 2, 225, 628] +[:key_down_raw, 1073741906, 0, 2, 226, 630] +[:key_down_raw, 1073741906, 0, 2, 227, 632] +[:key_down_raw, 1073741906, 0, 2, 228, 634] +[:key_up_raw, 1073741906, 0, 2, 229, 634] +[:key_down_raw, 96, 0, 2, 230, 648] +[:key_up_raw, 96, 0, 2, 231, 652] +[:mouse_move, 800, 84, 2, 232, 674] +[:mouse_move, 782, 88, 2, 233, 675] +[:mouse_move, 764, 94, 2, 234, 676] +[:mouse_move, 760, 94, 2, 235, 677] +[:mouse_move, 761, 94, 2, 236, 679] +[:mouse_move, 762, 93, 2, 237, 680] +[:key_down_raw, 13, 0, 2, 238, 706] diff --git a/samples/99_genre_3d/03_yaw_pitch_roll/app/main.rb b/samples/99_genre_3d/03_yaw_pitch_roll/app/main.rb new file mode 100644 index 0000000..52b5962 --- /dev/null +++ b/samples/99_genre_3d/03_yaw_pitch_roll/app/main.rb @@ -0,0 +1,351 @@ +class Game + attr_gtk + + def tick + defaults + render + input + end + + def matrix_mul m, v + (hmap x: ((m.x.x * v.x) + (m.x.y * v.y) + (m.x.z * v.z) + (m.x.w * v.w)), + y: ((m.y.x * v.x) + (m.y.y * v.y) + (m.y.z * v.z) + (m.y.w * v.w)), + z: ((m.z.x * v.x) + (m.z.y * v.y) + (m.z.z * v.z) + (m.z.w * v.w)), + w: ((m.w.x * v.x) + (m.w.y * v.y) + (m.w.z * v.z) + (m.w.w * v.w))) + end + + def player_ship + [ + # engine back + { x: -1, y: -1, z: 1, w: 0 }, + { x: -1, y: 1, z: 1, w: 0 }, + + { x: -1, y: 1, z: 1, w: 0 }, + { x: 1, y: 1, z: 1, w: 0 }, + + { x: 1, y: 1, z: 1, w: 0 }, + { x: 1, y: -1, z: 1, w: 0 }, + + { x: 1, y: -1, z: 1, w: 0 }, + { x: -1, y: -1, z: 1, w: 0 }, + + # engine front + { x: -1, y: -1, z: -1, w: 0 }, + { x: -1, y: 1, z: -1, w: 0 }, + + { x: -1, y: 1, z: -1, w: 0 }, + { x: 1, y: 1, z: -1, w: 0 }, + + { x: 1, y: 1, z: -1, w: 0 }, + { x: 1, y: -1, z: -1, w: 0 }, + + { x: 1, y: -1, z: -1, w: 0 }, + { x: -1, y: -1, z: -1, w: 0 }, + + # engine left + { x: -1, z: -1, y: -1, w: 0 }, + { x: -1, z: -1, y: 1, w: 0 }, + + { x: -1, z: -1, y: 1, w: 0 }, + { x: -1, z: 1, y: 1, w: 0 }, + + { x: -1, z: 1, y: 1, w: 0 }, + { x: -1, z: 1, y: -1, w: 0 }, + + { x: -1, z: 1, y: -1, w: 0 }, + { x: -1, z: -1, y: -1, w: 0 }, + + # engine right + { x: 1, z: -1, y: -1, w: 0 }, + { x: 1, z: -1, y: 1, w: 0 }, + + { x: 1, z: -1, y: 1, w: 0 }, + { x: 1, z: 1, y: 1, w: 0 }, + + { x: 1, z: 1, y: 1, w: 0 }, + { x: 1, z: 1, y: -1, w: 0 }, + + { x: 1, z: 1, y: -1, w: 0 }, + { x: 1, z: -1, y: -1, w: 0 }, + + # top front of engine to front of ship + { x: 1, y: 1, z: 1, w: 0 }, + { x: 0, y: -1, z: 9, w: 0 }, + + { x: 0, y: -1, z: 9, w: 0 }, + { x: -1, y: 1, z: 1, w: 0 }, + + # bottom front of engine + { x: 1, y: -1, z: 1, w: 0 }, + { x: 0, y: -1, z: 9, w: 0 }, + + { x: -1, y: -1, z: 1, w: 0 }, + { x: 0, y: -1, z: 9, w: 0 }, + + # right wing + # front of wing + { x: 1, y: 0.10, z: 1, w: 0 }, + { x: 9, y: 0.10, z: -1, w: 0 }, + + { x: 9, y: 0.10, z: -1, w: 0 }, + { x: 10, y: 0.10, z: -2, w: 0 }, + + # back of wing + { x: 1, y: 0.10, z: -1, w: 0 }, + { x: 9, y: 0.10, z: -1, w: 0 }, + + { x: 10, y: 0.10, z: -2, w: 0 }, + { x: 8, y: 0.10, z: -1, w: 0 }, + + # front of wing + { x: 1, y: -0.10, z: 1, w: 0 }, + { x: 9, y: -0.10, z: -1, w: 0 }, + + { x: 9, y: -0.10, z: -1, w: 0 }, + { x: 10, y: -0.10, z: -2, w: 0 }, + + # back of wing + { x: 1, y: -0.10, z: -1, w: 0 }, + { x: 9, y: -0.10, z: -1, w: 0 }, + + { x: 10, y: -0.10, z: -2, w: 0 }, + { x: 8, y: -0.10, z: -1, w: 0 }, + + # left wing + # front of wing + { x: -1, y: 0.10, z: 1, w: 0 }, + { x: -9, y: 0.10, z: -1, w: 0 }, + + { x: -9, y: 0.10, z: -1, w: 0 }, + { x: -10, y: 0.10, z: -2, w: 0 }, + + # back of wing + { x: -1, y: 0.10, z: -1, w: 0 }, + { x: -9, y: 0.10, z: -1, w: 0 }, + + { x: -10, y: 0.10, z: -2, w: 0 }, + { x: -8, y: 0.10, z: -1, w: 0 }, + + # front of wing + { x: -1, y: -0.10, z: 1, w: 0 }, + { x: -9, y: -0.10, z: -1, w: 0 }, + + { x: -9, y: -0.10, z: -1, w: 0 }, + { x: -10, y: -0.10, z: -2, w: 0 }, + + # back of wing + { x: -1, y: -0.10, z: -1, w: 0 }, + { x: -9, y: -0.10, z: -1, w: 0 }, + + { x: -10, y: -0.10, z: -2, w: 0 }, + { x: -8, y: -0.10, z: -1, w: 0 }, + + # left fin + # top + { x: -1, y: 0.10, z: 1, w: 0 }, + { x: -1, y: 3, z: -3, w: 0 }, + + { x: -1, y: 0.10, z: -1, w: 0 }, + { x: -1, y: 3, z: -3, w: 0 }, + + { x: -1.1, y: 0.10, z: 1, w: 0 }, + { x: -1.1, y: 3, z: -3, w: 0 }, + + { x: -1.1, y: 0.10, z: -1, w: 0 }, + { x: -1.1, y: 3, z: -3, w: 0 }, + + # bottom + { x: -1, y: -0.10, z: 1, w: 0 }, + { x: -1, y: -2, z: -2, w: 0 }, + + { x: -1, y: -0.10, z: -1, w: 0 }, + { x: -1, y: -2, z: -2, w: 0 }, + + { x: -1.1, y: -0.10, z: 1, w: 0 }, + { x: -1.1, y: -2, z: -2, w: 0 }, + + { x: -1.1, y: -0.10, z: -1, w: 0 }, + { x: -1.1, y: -2, z: -2, w: 0 }, + + # right fin + { x: 1, y: 0.10, z: 1, w: 0 }, + { x: 1, y: 3, z: -3, w: 0 }, + + { x: 1, y: 0.10, z: -1, w: 0 }, + { x: 1, y: 3, z: -3, w: 0 }, + + { x: 1.1, y: 0.10, z: 1, w: 0 }, + { x: 1.1, y: 3, z: -3, w: 0 }, + + { x: 1.1, y: 0.10, z: -1, w: 0 }, + { x: 1.1, y: 3, z: -3, w: 0 }, + + # bottom + { x: 1, y: -0.10, z: 1, w: 0 }, + { x: 1, y: -2, z: -2, w: 0 }, + + { x: 1, y: -0.10, z: -1, w: 0 }, + { x: 1, y: -2, z: -2, w: 0 }, + + { x: 1.1, y: -0.10, z: 1, w: 0 }, + { x: 1.1, y: -2, z: -2, w: 0 }, + + { x: 1.1, y: -0.10, z: -1, w: 0 }, + { x: 1.1, y: -2, z: -2, w: 0 }, + ] + end + + def defaults + state.points ||= player_ship + state.shifted_points ||= state.points.map { |point| point } + + state.scale ||= 1 + state.angle_x ||= 0 + state.angle_y ||= 0 + state.angle_z ||= 0 + end + + def matrix_new x0, y0, z0, w0, x1, y1, z1, w1, x2, y2, z2, w2, x3, y3, z3, w3 + (hmap x: (hmap x: x0, y: y0, z: z0, w: w0), + y: (hmap x: x1, y: y1, z: z1, w: w1), + z: (hmap x: x2, y: y2, z: z2, w: w2), + w: (hmap x: x3, y: y3, z: z3, w: w3)) + end + + def angle_z_matrix degrees + cos_t = Math.cos degrees.to_radians + sin_t = Math.sin degrees.to_radians + (matrix_new cos_t, -sin_t, 0, 0, + sin_t, cos_t, 0, 0, + 0, 0, 1, 0, + 0, 0, 0, 1) + end + + def angle_y_matrix degrees + cos_t = Math.cos degrees.to_radians + sin_t = Math.sin degrees.to_radians + (matrix_new cos_t, 0, sin_t, 0, + 0, 1, 0, 0, + -sin_t, 0, cos_t, 0, + 0, 0, 0, 1) + end + + def angle_x_matrix degrees + cos_t = Math.cos degrees.to_radians + sin_t = Math.sin degrees.to_radians + (matrix_new 1, 0, 0, 0, + 0, cos_t, -sin_t, 0, + 0, sin_t, cos_t, 0, + 0, 0, 0, 1) + end + + def scale_matrix factor + (matrix_new factor, 0, 0, 0, + 0, factor, 0, 0, + 0, 0, factor, 0, + 0, 0, 0, 1) + end + + def input + if (inputs.keyboard.shift && inputs.keyboard.p) + state.scale -= 0.1 + elsif inputs.keyboard.p + state.scale += 0.1 + end + + if inputs.mouse.wheel + state.scale += inputs.mouse.wheel.y + end + + state.scale = state.scale.clamp(0.1, 1000) + + if (inputs.keyboard.shift && inputs.keyboard.y) || inputs.keyboard.right + state.angle_y += 1 + elsif (inputs.keyboard.y) || inputs.keyboard.left + state.angle_y -= 1 + end + + if (inputs.keyboard.shift && inputs.keyboard.x) || inputs.keyboard.down + state.angle_x -= 1 + elsif (inputs.keyboard.x || inputs.keyboard.up) + state.angle_x += 1 + end + + if inputs.keyboard.shift && inputs.keyboard.z + state.angle_z += 1 + elsif inputs.keyboard.z + state.angle_z -= 1 + end + + if inputs.keyboard.zero + state.angle_x = 0 + state.angle_y = 0 + state.angle_z = 0 + end + + angle_x = state.angle_x + angle_y = state.angle_y + angle_z = state.angle_z + scale = state.scale + + s_matrix = scale_matrix state.scale + x_matrix = angle_z_matrix angle_z + y_matrix = angle_y_matrix angle_y + z_matrix = angle_x_matrix angle_x + + state.shifted_points = state.points.map do |point| + (matrix_mul s_matrix, + (matrix_mul z_matrix, + (matrix_mul x_matrix, + (matrix_mul y_matrix, point)))).merge(original: point) + end + end + + def thick_line line + [ + line.merge(y: line.y - 1, y2: line.y2 - 1, r: 0, g: 0, b: 0), + line.merge(x: line.x - 1, x2: line.x2 - 1, r: 0, g: 0, b: 0), + line.merge(x: line.x - 0, x2: line.x2 - 0, r: 0, g: 0, b: 0), + line.merge(y: line.y + 1, y2: line.y2 + 1, r: 0, g: 0, b: 0), + line.merge(x: line.x + 1, x2: line.x2 + 1, r: 0, g: 0, b: 0) + ] + end + + def render + outputs.lines << state.shifted_points.each_slice(2).map do |(p1, p2)| + perc = 0 + thick_line({ x: p1.x.*(10) + 640, y: p1.y.*(10) + 320, + x2: p2.x.*(10) + 640, y2: p2.y.*(10) + 320, + r: 255 * perc, + g: 255 * perc, + b: 255 * perc }) + end + + outputs.labels << [ 10, 700, "angle_x: #{state.angle_x.to_sf}", 0] + outputs.labels << [ 10, 670, "x, shift+x", 0] + + outputs.labels << [210, 700, "angle_y: #{state.angle_y.to_sf}", 0] + outputs.labels << [210, 670, "y, shift+y", 0] + + outputs.labels << [410, 700, "angle_z: #{state.angle_z.to_sf}", 0] + outputs.labels << [410, 670, "z, shift+z", 0] + + outputs.labels << [610, 700, "scale: #{state.scale.to_sf}", 0] + outputs.labels << [610, 670, "p, shift+p", 0] + end +end + +$game = Game.new + +def tick args + $game.args = args + $game.tick +end + +def set_angles x, y, z + $game.state.angle_x = x + $game.state.angle_y = y + $game.state.angle_z = z +end + +$gtk.reset diff --git a/samples/99_genre_3d/03_yaw_pitch_roll/replay.txt b/samples/99_genre_3d/03_yaw_pitch_roll/replay.txt new file mode 100644 index 0000000..918fc9e --- /dev/null +++ b/samples/99_genre_3d/03_yaw_pitch_roll/replay.txt @@ -0,0 +1,361 @@ +replay_version 2.0 +stopped_at 493 +seed 100 +recorded_at 2021-10-18 16:32:03 -0500 +[:mouse_button_up, 1, 0, 1, 1, 1] +[:mouse_move, 813, 82, 2, 2, 9] +[:mouse_move, 813, 83, 2, 3, 17] +[:mouse_move, 812, 84, 2, 4, 17] +[:mouse_move, 809, 86, 2, 5, 17] +[:mouse_move, 803, 91, 2, 6, 18] +[:mouse_move, 795, 96, 2, 7, 18] +[:mouse_move, 792, 98, 2, 8, 19] +[:mouse_move, 791, 106, 2, 9, 19] +[:mouse_move, 791, 120, 2, 10, 19] +[:mouse_move, 791, 138, 2, 11, 20] +[:mouse_move, 794, 157, 2, 12, 20] +[:mouse_move, 795, 175, 2, 13, 21] +[:mouse_move, 795, 193, 2, 14, 21] +[:mouse_move, 795, 211, 2, 15, 21] +[:mouse_move, 795, 225, 2, 16, 22] +[:mouse_move, 795, 233, 2, 17, 22] +[:mouse_move, 795, 236, 2, 18, 23] +[:mouse_move, 795, 237, 2, 19, 23] +[:mouse_move, 795, 238, 2, 20, 24] +[:mouse_move, 795, 239, 2, 21, 24] +[:mouse_move, 795, 240, 2, 22, 25] +[:mouse_move, 794, 241, 2, 23, 26] +[:mouse_button_pressed, 1, 0, 1, 24, 29] +[:mouse_button_up, 1, 0, 1, 25, 31] +[:key_down_raw, 120, 0, 2, 26, 49] +[:key_down_raw, 120, 0, 2, 27, 55] +[:key_down_raw, 120, 0, 2, 28, 56] +[:key_down_raw, 120, 0, 2, 29, 56] +[:key_down_raw, 120, 0, 2, 30, 57] +[:key_down_raw, 120, 0, 2, 31, 58] +[:key_down_raw, 120, 0, 2, 32, 59] +[:key_down_raw, 120, 0, 2, 33, 60] +[:key_down_raw, 120, 0, 2, 34, 60] +[:key_down_raw, 120, 0, 2, 35, 61] +[:key_down_raw, 120, 0, 2, 36, 62] +[:key_down_raw, 120, 0, 2, 37, 63] +[:key_down_raw, 120, 0, 2, 38, 64] +[:key_down_raw, 120, 0, 2, 39, 65] +[:key_down_raw, 120, 0, 2, 40, 66] +[:key_down_raw, 120, 0, 2, 41, 66] +[:key_down_raw, 120, 0, 2, 42, 67] +[:key_down_raw, 120, 0, 2, 43, 68] +[:key_down_raw, 120, 0, 2, 44, 69] +[:key_down_raw, 120, 0, 2, 45, 70] +[:key_down_raw, 120, 0, 2, 46, 70] +[:key_down_raw, 120, 0, 2, 47, 71] +[:key_down_raw, 120, 0, 2, 48, 72] +[:key_down_raw, 120, 0, 2, 49, 73] +[:key_down_raw, 120, 0, 2, 50, 74] +[:key_down_raw, 120, 0, 2, 51, 75] +[:key_up_raw, 120, 0, 2, 52, 75] +[:key_down_raw, 1073742053, 2, 2, 53, 81] +[:key_down_raw, 120, 2, 2, 54, 83] +[:key_down_raw, 120, 2, 2, 55, 89] +[:key_down_raw, 120, 2, 2, 56, 90] +[:key_down_raw, 120, 2, 2, 57, 91] +[:key_down_raw, 120, 2, 2, 58, 92] +[:key_down_raw, 120, 2, 2, 59, 93] +[:key_down_raw, 120, 2, 2, 60, 93] +[:key_down_raw, 120, 2, 2, 61, 94] +[:key_down_raw, 120, 2, 2, 62, 95] +[:key_down_raw, 120, 2, 2, 63, 96] +[:key_down_raw, 120, 2, 2, 64, 97] +[:key_down_raw, 120, 2, 2, 65, 97] +[:key_down_raw, 120, 2, 2, 66, 98] +[:key_down_raw, 120, 2, 2, 67, 99] +[:key_down_raw, 120, 2, 2, 68, 100] +[:key_down_raw, 120, 2, 2, 69, 101] +[:key_down_raw, 120, 2, 2, 70, 102] +[:key_down_raw, 120, 2, 2, 71, 102] +[:key_down_raw, 120, 2, 2, 72, 103] +[:key_down_raw, 120, 2, 2, 73, 104] +[:key_down_raw, 120, 2, 2, 74, 105] +[:key_down_raw, 120, 2, 2, 75, 106] +[:key_down_raw, 120, 2, 2, 76, 107] +[:key_down_raw, 120, 2, 2, 77, 107] +[:key_down_raw, 120, 2, 2, 78, 108] +[:key_down_raw, 120, 2, 2, 79, 109] +[:key_down_raw, 120, 2, 2, 80, 110] +[:key_down_raw, 120, 2, 2, 81, 111] +[:key_down_raw, 120, 2, 2, 82, 111] +[:key_down_raw, 120, 2, 2, 83, 112] +[:key_down_raw, 120, 2, 2, 84, 113] +[:key_down_raw, 120, 2, 2, 85, 114] +[:key_down_raw, 120, 2, 2, 86, 115] +[:key_down_raw, 120, 2, 2, 87, 116] +[:key_down_raw, 120, 2, 2, 88, 117] +[:key_down_raw, 120, 2, 2, 89, 117] +[:key_down_raw, 120, 2, 2, 90, 118] +[:key_down_raw, 120, 2, 2, 91, 119] +[:key_down_raw, 120, 2, 2, 92, 120] +[:key_down_raw, 120, 2, 2, 93, 121] +[:key_down_raw, 120, 2, 2, 94, 122] +[:key_down_raw, 120, 2, 2, 95, 122] +[:key_down_raw, 120, 2, 2, 96, 123] +[:key_down_raw, 120, 2, 2, 97, 124] +[:key_down_raw, 120, 2, 2, 98, 125] +[:key_down_raw, 120, 2, 2, 99, 126] +[:key_down_raw, 120, 2, 2, 100, 127] +[:key_down_raw, 120, 2, 2, 101, 127] +[:key_down_raw, 120, 2, 2, 102, 128] +[:key_down_raw, 120, 2, 2, 103, 129] +[:key_down_raw, 120, 2, 2, 104, 130] +[:key_down_raw, 120, 2, 2, 105, 131] +[:key_down_raw, 120, 2, 2, 106, 131] +[:key_down_raw, 120, 2, 2, 107, 132] +[:key_down_raw, 120, 2, 2, 108, 133] +[:key_down_raw, 120, 2, 2, 109, 134] +[:key_down_raw, 120, 2, 2, 110, 135] +[:key_down_raw, 120, 2, 2, 111, 136] +[:key_down_raw, 120, 2, 2, 112, 136] +[:key_down_raw, 120, 2, 2, 113, 137] +[:key_down_raw, 120, 2, 2, 114, 138] +[:key_down_raw, 120, 2, 2, 115, 139] +[:key_down_raw, 120, 2, 2, 116, 140] +[:key_down_raw, 120, 2, 2, 117, 140] +[:key_down_raw, 120, 2, 2, 118, 141] +[:key_down_raw, 120, 2, 2, 119, 142] +[:key_down_raw, 120, 2, 2, 120, 143] +[:key_down_raw, 120, 2, 2, 121, 144] +[:key_up_raw, 1073742053, 0, 2, 122, 144] +[:key_down_raw, 120, 0, 2, 123, 145] +[:key_up_raw, 120, 0, 2, 124, 145] +[:key_down_raw, 121, 0, 2, 125, 158] +[:key_down_raw, 121, 0, 2, 126, 165] +[:key_down_raw, 121, 0, 2, 127, 166] +[:key_down_raw, 121, 0, 2, 128, 166] +[:key_down_raw, 121, 0, 2, 129, 167] +[:key_down_raw, 121, 0, 2, 130, 168] +[:key_down_raw, 121, 0, 2, 131, 169] +[:key_down_raw, 121, 0, 2, 132, 170] +[:key_down_raw, 121, 0, 2, 133, 171] +[:key_down_raw, 121, 0, 2, 134, 171] +[:key_down_raw, 121, 0, 2, 135, 172] +[:key_down_raw, 121, 0, 2, 136, 173] +[:key_down_raw, 121, 0, 2, 137, 174] +[:key_down_raw, 121, 0, 2, 138, 175] +[:key_down_raw, 121, 0, 2, 139, 175] +[:key_down_raw, 121, 0, 2, 140, 176] +[:key_down_raw, 121, 0, 2, 141, 177] +[:key_down_raw, 121, 0, 2, 142, 178] +[:key_down_raw, 121, 0, 2, 143, 179] +[:key_down_raw, 121, 0, 2, 144, 180] +[:key_down_raw, 121, 0, 2, 145, 180] +[:key_down_raw, 121, 0, 2, 146, 181] +[:key_down_raw, 121, 0, 2, 147, 182] +[:key_down_raw, 121, 0, 2, 148, 183] +[:key_down_raw, 121, 0, 2, 149, 184] +[:key_down_raw, 121, 0, 2, 150, 185] +[:key_down_raw, 121, 0, 2, 151, 185] +[:key_down_raw, 121, 0, 2, 152, 186] +[:key_down_raw, 121, 0, 2, 153, 187] +[:key_down_raw, 121, 0, 2, 154, 188] +[:key_down_raw, 121, 0, 2, 155, 189] +[:key_down_raw, 121, 0, 2, 156, 190] +[:key_down_raw, 121, 0, 2, 157, 190] +[:key_up_raw, 121, 0, 2, 158, 191] +[:key_down_raw, 1073742053, 2, 2, 159, 198] +[:key_down_raw, 121, 2, 2, 160, 203] +[:key_down_raw, 121, 2, 2, 161, 209] +[:key_down_raw, 121, 2, 2, 162, 210] +[:key_down_raw, 121, 2, 2, 163, 211] +[:key_down_raw, 121, 2, 2, 164, 212] +[:key_down_raw, 121, 2, 2, 165, 213] +[:key_down_raw, 121, 2, 2, 166, 213] +[:key_down_raw, 121, 2, 2, 167, 214] +[:key_down_raw, 121, 2, 2, 168, 215] +[:key_down_raw, 121, 2, 2, 169, 216] +[:key_down_raw, 121, 2, 2, 170, 217] +[:key_down_raw, 121, 2, 2, 171, 217] +[:key_down_raw, 121, 2, 2, 172, 219] +[:key_down_raw, 121, 2, 2, 173, 220] +[:key_down_raw, 121, 2, 2, 174, 220] +[:key_down_raw, 121, 2, 2, 175, 221] +[:key_down_raw, 121, 2, 2, 176, 222] +[:key_down_raw, 121, 2, 2, 177, 223] +[:key_down_raw, 121, 2, 2, 178, 224] +[:key_down_raw, 121, 2, 2, 179, 224] +[:key_down_raw, 121, 2, 2, 180, 225] +[:key_down_raw, 121, 2, 2, 181, 226] +[:key_down_raw, 121, 2, 2, 182, 227] +[:key_down_raw, 121, 2, 2, 183, 228] +[:key_down_raw, 121, 2, 2, 184, 229] +[:key_down_raw, 121, 2, 2, 185, 229] +[:key_down_raw, 121, 2, 2, 186, 230] +[:key_down_raw, 121, 2, 2, 187, 231] +[:key_down_raw, 121, 2, 2, 188, 232] +[:key_down_raw, 121, 2, 2, 189, 233] +[:key_down_raw, 121, 2, 2, 190, 233] +[:key_down_raw, 121, 2, 2, 191, 234] +[:key_down_raw, 121, 2, 2, 192, 235] +[:key_down_raw, 121, 2, 2, 193, 236] +[:key_down_raw, 121, 2, 2, 194, 237] +[:key_down_raw, 121, 2, 2, 195, 238] +[:key_down_raw, 121, 2, 2, 196, 238] +[:key_down_raw, 121, 2, 2, 197, 239] +[:key_down_raw, 121, 2, 2, 198, 240] +[:key_down_raw, 121, 2, 2, 199, 241] +[:key_down_raw, 121, 2, 2, 200, 242] +[:key_down_raw, 121, 2, 2, 201, 242] +[:key_down_raw, 121, 2, 2, 202, 243] +[:key_down_raw, 121, 2, 2, 203, 244] +[:key_down_raw, 121, 2, 2, 204, 245] +[:key_down_raw, 121, 2, 2, 205, 246] +[:key_down_raw, 121, 2, 2, 206, 247] +[:key_down_raw, 121, 2, 2, 207, 247] +[:key_down_raw, 121, 2, 2, 208, 248] +[:key_down_raw, 121, 2, 2, 209, 249] +[:key_down_raw, 121, 2, 2, 210, 250] +[:key_down_raw, 121, 2, 2, 211, 251] +[:key_down_raw, 121, 2, 2, 212, 251] +[:key_down_raw, 121, 2, 2, 213, 252] +[:key_down_raw, 121, 2, 2, 214, 253] +[:key_down_raw, 121, 2, 2, 215, 254] +[:key_down_raw, 121, 2, 2, 216, 255] +[:key_down_raw, 121, 2, 2, 217, 255] +[:key_down_raw, 121, 2, 2, 218, 256] +[:key_down_raw, 121, 2, 2, 219, 257] +[:key_down_raw, 121, 2, 2, 220, 258] +[:key_down_raw, 121, 2, 2, 221, 259] +[:key_down_raw, 121, 2, 2, 222, 260] +[:key_down_raw, 121, 2, 2, 223, 260] +[:key_down_raw, 121, 2, 2, 224, 261] +[:key_down_raw, 121, 2, 2, 225, 262] +[:key_down_raw, 121, 2, 2, 226, 263] +[:key_up_raw, 121, 2, 2, 227, 263] +[:key_up_raw, 1073742053, 0, 2, 228, 266] +[:key_down_raw, 122, 0, 2, 229, 270] +[:key_up_raw, 122, 0, 2, 230, 272] +[:key_down_raw, 122, 0, 2, 231, 289] +[:key_down_raw, 122, 0, 2, 232, 295] +[:key_down_raw, 122, 0, 2, 233, 296] +[:key_down_raw, 122, 0, 2, 234, 297] +[:key_down_raw, 122, 0, 2, 235, 297] +[:key_down_raw, 122, 0, 2, 236, 298] +[:key_down_raw, 122, 0, 2, 237, 299] +[:key_down_raw, 122, 0, 2, 238, 300] +[:key_down_raw, 122, 0, 2, 239, 301] +[:key_down_raw, 122, 0, 2, 240, 302] +[:key_down_raw, 122, 0, 2, 241, 302] +[:key_down_raw, 122, 0, 2, 242, 303] +[:key_down_raw, 122, 0, 2, 243, 304] +[:key_down_raw, 122, 0, 2, 244, 305] +[:key_down_raw, 122, 0, 2, 245, 306] +[:key_down_raw, 122, 0, 2, 246, 306] +[:key_down_raw, 122, 0, 2, 247, 307] +[:key_down_raw, 122, 0, 2, 248, 308] +[:key_down_raw, 122, 0, 2, 249, 309] +[:key_down_raw, 122, 0, 2, 250, 310] +[:key_up_raw, 122, 0, 2, 251, 310] +[:key_down_raw, 1073742053, 2, 2, 252, 319] +[:key_down_raw, 122, 2, 2, 253, 322] +[:key_down_raw, 122, 2, 2, 254, 328] +[:key_down_raw, 122, 2, 2, 255, 329] +[:key_down_raw, 122, 2, 2, 256, 330] +[:key_down_raw, 122, 2, 2, 257, 331] +[:key_down_raw, 122, 2, 2, 258, 332] +[:key_down_raw, 122, 2, 2, 259, 333] +[:key_down_raw, 122, 2, 2, 260, 333] +[:key_down_raw, 122, 2, 2, 261, 334] +[:key_down_raw, 122, 2, 2, 262, 335] +[:key_down_raw, 122, 2, 2, 263, 336] +[:key_down_raw, 122, 2, 2, 264, 337] +[:key_down_raw, 122, 2, 2, 265, 338] +[:key_down_raw, 122, 2, 2, 266, 339] +[:key_down_raw, 122, 2, 2, 267, 340] +[:key_down_raw, 122, 2, 2, 268, 341] +[:key_down_raw, 122, 2, 2, 269, 341] +[:key_down_raw, 122, 2, 2, 270, 342] +[:key_down_raw, 122, 2, 2, 271, 343] +[:key_down_raw, 122, 2, 2, 272, 344] +[:key_down_raw, 122, 2, 2, 273, 345] +[:key_down_raw, 122, 2, 2, 274, 346] +[:key_down_raw, 122, 2, 2, 275, 346] +[:key_down_raw, 122, 2, 2, 276, 347] +[:key_down_raw, 122, 2, 2, 277, 348] +[:key_down_raw, 122, 2, 2, 278, 349] +[:key_down_raw, 122, 2, 2, 279, 350] +[:key_down_raw, 122, 2, 2, 280, 350] +[:key_down_raw, 122, 2, 2, 281, 351] +[:key_down_raw, 122, 2, 2, 282, 352] +[:key_down_raw, 122, 2, 2, 283, 353] +[:key_down_raw, 122, 2, 2, 284, 354] +[:key_down_raw, 122, 2, 2, 285, 355] +[:key_down_raw, 122, 2, 2, 286, 355] +[:key_down_raw, 122, 2, 2, 287, 356] +[:key_down_raw, 122, 2, 2, 288, 357] +[:key_down_raw, 122, 2, 2, 289, 358] +[:key_down_raw, 122, 2, 2, 290, 359] +[:key_down_raw, 122, 2, 2, 291, 360] +[:key_down_raw, 122, 2, 2, 292, 360] +[:key_down_raw, 122, 2, 2, 293, 361] +[:key_down_raw, 122, 2, 2, 294, 362] +[:key_down_raw, 122, 2, 2, 295, 363] +[:key_up_raw, 122, 2, 2, 296, 363] +[:key_up_raw, 1073742053, 0, 2, 297, 366] +[:key_down_raw, 112, 0, 2, 298, 370] +[:key_down_raw, 112, 0, 2, 299, 376] +[:key_down_raw, 112, 0, 2, 300, 377] +[:key_down_raw, 112, 0, 2, 301, 378] +[:key_down_raw, 112, 0, 2, 302, 379] +[:key_down_raw, 112, 0, 2, 303, 380] +[:key_down_raw, 112, 0, 2, 304, 381] +[:key_down_raw, 112, 0, 2, 305, 381] +[:key_down_raw, 112, 0, 2, 306, 382] +[:key_down_raw, 112, 0, 2, 307, 383] +[:key_down_raw, 112, 0, 2, 308, 384] +[:key_down_raw, 112, 0, 2, 309, 385] +[:key_down_raw, 112, 0, 2, 310, 386] +[:key_down_raw, 112, 0, 2, 311, 386] +[:key_down_raw, 112, 0, 2, 312, 387] +[:key_down_raw, 112, 0, 2, 313, 388] +[:key_down_raw, 112, 0, 2, 314, 389] +[:key_down_raw, 112, 0, 2, 315, 390] +[:key_down_raw, 112, 0, 2, 316, 391] +[:key_down_raw, 112, 0, 2, 317, 391] +[:key_down_raw, 112, 0, 2, 318, 392] +[:key_down_raw, 112, 0, 2, 319, 393] +[:key_down_raw, 112, 0, 2, 320, 394] +[:key_down_raw, 112, 0, 2, 321, 395] +[:key_up_raw, 112, 0, 2, 322, 395] +[:key_down_raw, 1073742049, 1, 2, 323, 402] +[:key_down_raw, 112, 1, 2, 324, 402] +[:key_down_raw, 112, 1, 2, 325, 409] +[:key_down_raw, 112, 1, 2, 326, 410] +[:key_down_raw, 112, 1, 2, 327, 410] +[:key_down_raw, 112, 1, 2, 328, 411] +[:key_down_raw, 112, 1, 2, 329, 412] +[:key_down_raw, 112, 1, 2, 330, 413] +[:key_down_raw, 112, 1, 2, 331, 414] +[:key_down_raw, 112, 1, 2, 332, 415] +[:key_down_raw, 112, 1, 2, 333, 415] +[:key_down_raw, 112, 1, 2, 334, 416] +[:key_down_raw, 112, 1, 2, 335, 417] +[:key_down_raw, 112, 1, 2, 336, 418] +[:key_down_raw, 112, 1, 2, 337, 419] +[:key_down_raw, 112, 1, 2, 338, 420] +[:key_down_raw, 112, 1, 2, 339, 420] +[:key_down_raw, 112, 1, 2, 340, 421] +[:key_down_raw, 112, 1, 2, 341, 422] +[:key_down_raw, 112, 1, 2, 342, 423] +[:key_down_raw, 112, 1, 2, 343, 424] +[:key_down_raw, 112, 1, 2, 344, 424] +[:key_down_raw, 112, 1, 2, 345, 425] +[:key_down_raw, 112, 1, 2, 346, 426] +[:key_down_raw, 112, 1, 2, 347, 427] +[:key_down_raw, 112, 1, 2, 348, 428] +[:key_down_raw, 112, 1, 2, 349, 429] +[:key_down_raw, 112, 1, 2, 350, 429] +[:key_down_raw, 112, 1, 2, 351, 430] +[:key_down_raw, 112, 1, 2, 352, 431] +[:key_up_raw, 112, 1, 2, 353, 432] +[:key_up_raw, 1073742049, 0, 2, 354, 433] +[:key_down_raw, 96, 0, 2, 355, 439] +[:key_up_raw, 96, 0, 2, 356, 441] +[:key_down_raw, 13, 0, 2, 357, 493] diff --git a/samples/99_genre_arcade/bullet_hell/replay.txt b/samples/99_genre_arcade/bullet_hell/replay.txt new file mode 100644 index 0000000..49a22d1 --- /dev/null +++ b/samples/99_genre_arcade/bullet_hell/replay.txt @@ -0,0 +1,126 @@ +replay_version 2.0 +stopped_at 718 +seed 100 +recorded_at 2021-11-20 11:26:42 -0600 +[:mouse_button_up, 1, 0, 1, 1, 4] +[:mouse_move, 824, 91, 2, 2, 27] +[:key_down_raw, 1073741903, 0, 2, 3, 64] +[:key_down_raw, 1073741903, 0, 2, 4, 78] +[:key_down_raw, 1073741903, 0, 2, 5, 80] +[:key_down_raw, 1073741903, 0, 2, 6, 82] +[:key_down_raw, 1073741903, 0, 2, 7, 84] +[:key_down_raw, 1073741903, 0, 2, 8, 86] +[:key_down_raw, 1073741903, 0, 2, 9, 88] +[:key_down_raw, 1073741903, 0, 2, 10, 90] +[:key_down_raw, 1073741903, 0, 2, 11, 92] +[:key_down_raw, 1073741903, 0, 2, 12, 94] +[:key_down_raw, 1073741903, 0, 2, 13, 96] +[:key_down_raw, 1073741903, 0, 2, 14, 98] +[:key_down_raw, 1073741903, 0, 2, 15, 100] +[:key_down_raw, 1073741903, 0, 2, 16, 102] +[:key_down_raw, 1073741903, 0, 2, 17, 104] +[:key_down_raw, 1073741903, 0, 2, 18, 106] +[:key_down_raw, 1073741903, 0, 2, 19, 108] +[:key_down_raw, 32, 0, 2, 20, 108] +[:key_up_raw, 1073741903, 0, 2, 21, 108] +[:key_up_raw, 32, 0, 2, 22, 114] +[:key_down_raw, 32, 0, 2, 23, 120] +[:key_up_raw, 32, 0, 2, 24, 126] +[:key_down_raw, 1073741903, 0, 2, 25, 127] +[:key_down_raw, 1073741903, 0, 2, 26, 142] +[:key_up_raw, 1073741903, 0, 2, 27, 143] +[:key_down_raw, 32, 0, 2, 28, 144] +[:key_up_raw, 32, 0, 2, 29, 152] +[:key_down_raw, 32, 0, 2, 30, 156] +[:key_down_raw, 1073741904, 0, 2, 31, 159] +[:key_up_raw, 32, 0, 2, 32, 163] +[:key_down_raw, 1073741904, 0, 2, 33, 174] +[:key_down_raw, 1073741904, 0, 2, 34, 176] +[:key_down_raw, 1073741904, 0, 2, 35, 178] +[:key_down_raw, 1073741904, 0, 2, 36, 180] +[:key_down_raw, 1073741904, 0, 2, 37, 182] +[:key_down_raw, 32, 0, 2, 38, 183] +[:key_up_raw, 1073741904, 0, 2, 39, 186] +[:key_up_raw, 32, 0, 2, 40, 191] +[:key_down_raw, 32, 0, 2, 41, 195] +[:key_up_raw, 32, 0, 2, 42, 203] +[:key_down_raw, 1073741904, 0, 2, 43, 228] +[:key_down_raw, 1073741904, 0, 2, 44, 243] +[:key_down_raw, 1073741904, 0, 2, 45, 245] +[:key_down_raw, 1073741904, 0, 2, 46, 247] +[:key_down_raw, 1073741904, 0, 2, 47, 249] +[:key_down_raw, 1073741904, 0, 2, 48, 251] +[:key_down_raw, 1073741904, 0, 2, 49, 253] +[:key_down_raw, 32, 0, 2, 50, 253] +[:key_up_raw, 1073741904, 0, 2, 51, 255] +[:key_up_raw, 32, 0, 2, 52, 260] +[:key_down_raw, 32, 0, 2, 53, 265] +[:key_up_raw, 32, 0, 2, 54, 270] +[:key_down_raw, 1073741904, 0, 2, 55, 278] +[:key_down_raw, 1073741904, 0, 2, 56, 293] +[:key_down_raw, 1073741904, 0, 2, 57, 295] +[:key_down_raw, 1073741904, 0, 2, 58, 297] +[:key_down_raw, 1073741904, 0, 2, 59, 299] +[:key_down_raw, 1073741904, 0, 2, 60, 301] +[:key_down_raw, 1073741904, 0, 2, 61, 303] +[:key_up_raw, 1073741904, 0, 2, 62, 305] +[:key_down_raw, 32, 0, 2, 63, 307] +[:key_up_raw, 32, 0, 2, 64, 314] +[:key_down_raw, 32, 0, 2, 65, 319] +[:key_up_raw, 32, 0, 2, 66, 326] +[:key_down_raw, 32, 0, 2, 67, 331] +[:key_up_raw, 32, 0, 2, 68, 337] +[:key_down_raw, 1073741904, 0, 2, 69, 339] +[:key_down_raw, 1073741904, 0, 2, 70, 354] +[:key_down_raw, 1073741904, 0, 2, 71, 356] +[:key_down_raw, 1073741904, 0, 2, 72, 358] +[:key_down_raw, 1073741904, 0, 2, 73, 360] +[:key_down_raw, 32, 0, 2, 74, 361] +[:key_up_raw, 1073741904, 0, 2, 75, 361] +[:key_up_raw, 32, 0, 2, 76, 368] +[:key_down_raw, 32, 0, 2, 77, 373] +[:key_up_raw, 32, 0, 2, 78, 379] +[:key_down_raw, 1073741903, 0, 2, 79, 397] +[:key_down_raw, 1073741903, 0, 2, 80, 412] +[:key_down_raw, 1073741903, 0, 2, 81, 414] +[:key_down_raw, 1073741903, 0, 2, 82, 416] +[:key_down_raw, 1073741903, 0, 2, 83, 418] +[:key_down_raw, 1073741903, 0, 2, 84, 420] +[:key_down_raw, 1073741903, 0, 2, 85, 422] +[:key_down_raw, 1073741903, 0, 2, 86, 424] +[:key_down_raw, 1073741903, 0, 2, 87, 426] +[:key_down_raw, 1073741903, 0, 2, 88, 428] +[:key_down_raw, 32, 0, 2, 89, 428] +[:key_up_raw, 1073741903, 0, 2, 90, 429] +[:key_up_raw, 32, 0, 2, 91, 435] +[:key_down_raw, 1073741903, 0, 2, 92, 456] +[:key_down_raw, 32, 0, 2, 93, 468] +[:key_up_raw, 1073741903, 0, 2, 94, 468] +[:key_up_raw, 32, 0, 2, 95, 475] +[:key_down_raw, 32, 0, 2, 96, 480] +[:key_up_raw, 32, 0, 2, 97, 487] +[:key_down_raw, 32, 0, 2, 98, 493] +[:key_up_raw, 32, 0, 2, 99, 499] +[:key_down_raw, 1073741903, 0, 2, 100, 516] +[:key_down_raw, 32, 0, 2, 101, 522] +[:key_up_raw, 32, 0, 2, 102, 529] +[:key_up_raw, 1073741903, 0, 2, 103, 529] +[:key_down_raw, 32, 0, 2, 104, 535] +[:key_up_raw, 32, 0, 2, 105, 542] +[:key_down_raw, 1073741903, 0, 2, 106, 582] +[:key_up_raw, 1073741903, 0, 2, 107, 591] +[:key_down_raw, 96, 0, 2, 108, 652] +[:mouse_move, 824, 90, 2, 109, 656] +[:key_up_raw, 96, 0, 2, 110, 658] +[:mouse_move, 833, 91, 2, 111, 684] +[:mouse_move, 852, 92, 2, 112, 685] +[:mouse_move, 873, 95, 2, 113, 686] +[:mouse_move, 895, 98, 2, 114, 687] +[:mouse_move, 914, 101, 2, 115, 688] +[:mouse_move, 921, 102, 2, 116, 689] +[:mouse_move, 922, 102, 2, 117, 690] +[:mouse_move, 913, 106, 2, 118, 692] +[:mouse_move, 902, 110, 2, 119, 693] +[:mouse_move, 892, 114, 2, 120, 694] +[:mouse_move, 890, 114, 2, 121, 695] +[:key_down_raw, 13, 0, 2, 122, 718] diff --git a/samples/99_genre_arcade/flappy_dragon/app/main.rb b/samples/99_genre_arcade/flappy_dragon/app/main.rb index 56ce3ec..7ddc5a0 100644 --- a/samples/99_genre_arcade/flappy_dragon/app/main.rb +++ b/samples/99_genre_arcade/flappy_dragon/app/main.rb @@ -38,31 +38,36 @@ class FlappyDragon end def render_score - outputs.primitives << [10, 710, "HI SCORE: #{state.hi_score}", large_white_typeset].label - outputs.primitives << [10, 680, "SCORE: #{state.score}", large_white_typeset].label - outputs.primitives << [10, 650, "DIFFICULTY: #{state.difficulty.upcase}", large_white_typeset].label + outputs.primitives << { x: 10, y: 710, text: "HI SCORE: #{state.hi_score}", **large_white_typeset } + outputs.primitives << { x: 10, y: 680, text: "SCORE: #{state.score}", **large_white_typeset } + outputs.primitives << { x: 10, y: 650, text: "DIFFICULTY: #{state.difficulty.upcase}", **large_white_typeset } end def render_menu return unless state.scene == :menu render_overlay - outputs.labels << [640, 700, "Flappy Dragon", 50, 1, 255, 255, 255] - outputs.labels << [640, 500, "Instructions: Press Spacebar to flap. Don't die.", 4, 1, 255, 255, 255] - outputs.labels << [430, 430, "[Tab] Change difficulty", 4, 0, 255, 255, 255] - outputs.labels << [430, 400, "[Enter] Start at New Difficulty ", 4, 0, 255, 255, 255] - outputs.labels << [430, 370, "[Escape] Cancel/Resume ", 4, 0, 255, 255, 255] - outputs.labels << [640, 300, "(mouse, touch, and game controllers work, too!) ", 4, 1, 255, 255, 255] - outputs.labels << [640, 200, "Difficulty: #{state.new_difficulty.capitalize}", 4, 1, 255, 255, 255] - - outputs.labels << [10, 100, "Code: @amirrajan", 255, 255, 255] - outputs.labels << [10, 80, "Art: @mobypixel", 255, 255, 255] - outputs.labels << [10, 60, "Music: @mobypixel", 255, 255, 255] - outputs.labels << [10, 40, "Engine: DragonRuby GTK", 255, 255, 255] + outputs.labels << { x: 640, y: 700, text: "Flappy Dragon", size_enum: 50, alignment_enum: 1, **white } + outputs.labels << { x: 640, y: 500, text: "Instructions: Press Spacebar to flap. Don't die.", size_enum: 4, alignment_enum: 1, **white } + outputs.labels << { x: 430, y: 430, text: "[Tab] Change difficulty", size_enum: 4, alignment_enum: 0, **white } + outputs.labels << { x: 430, y: 400, text: "[Enter] Start at New Difficulty ", size_enum: 4, alignment_enum: 0, **white } + outputs.labels << { x: 430, y: 370, text: "[Escape] Cancel/Resume ", size_enum: 4, alignment_enum: 0, **white } + outputs.labels << { x: 640, y: 300, text: "(mouse, touch, and game controllers work, too!) ", size_enum: 4, alignment_enum: 1, **white } + outputs.labels << { x: 640, y: 200, text: "Difficulty: #{state.new_difficulty.capitalize}", size_enum: 4, alignment_enum: 1, **white } + + outputs.labels << { x: 10, y: 100, text: "Code: @amirrajan", **white } + outputs.labels << { x: 10, y: 80, text: "Art: @mobypixel", **white } + outputs.labels << { x: 10, y: 60, text: "Music: @mobypixel", **white } + outputs.labels << { x: 10, y: 40, text: "Engine: DragonRuby GTK", **white } end def render_overlay - outputs.primitives << [grid.rect.scale_rect(1.1, 0, 0), 0, 0, 0, 230].solid + overlay_rect = grid.rect.scale_rect(1.1, 0, 0) + outputs.primitives << { x: overlay_rect.x, + y: overlay_rect.y, + w: overlay_rect.w, + h: overlay_rect.h, + r: 0, g: 0, b: 0, a: 230 }.solid! end def render_game @@ -75,14 +80,14 @@ class FlappyDragon def render_game_over return unless state.scene == :game - outputs.labels << [638, 358, score_text, 20, 1] - outputs.labels << [635, 360, score_text, 20, 1, 255, 255, 255] - outputs.labels << [638, 428, countdown_text, 20, 1] - outputs.labels << [635, 430, countdown_text, 20, 1, 255, 255, 255] + outputs.labels << { x: 638, y: 358, text: score_text, size_enum: 20, alignment_enum: 1 } + outputs.labels << { x: 635, y: 360, text: score_text, size_enum: 20, alignment_enum: 1, r: 255, g: 255, b: 255 } + outputs.labels << { x: 638, y: 428, text: countdown_text, size_enum: 20, alignment_enum: 1 } + outputs.labels << { x: 635, y: 430, text: countdown_text, size_enum: 20, alignment_enum: 1, r: 255, g: 255, b: 255 } end def render_background - outputs.sprites << [0, 0, 1280, 720, 'sprites/background.png'] + outputs.sprites << { x: 0, y: 0, w: 1280, h: 720, path: 'sprites/background.png' } scroll_point_at = state.tick_count scroll_point_at = state.scene_at if state.scene == :menu @@ -94,11 +99,18 @@ class FlappyDragon outputs.sprites << scrolling_background(scroll_point_at, 'sprites/parallax_front.png', 1.00, -80) end + def scrolling_background at, path, rate, y = 0 + [ + { x: 0 - at.*(rate) % 1440, y: y, w: 1440, h: 720, path: path }, + { x: 1440 - at.*(rate) % 1440, y: y, w: 1440, h: 720, path: path } + ] + end + def render_walls state.walls.each do |w| w.sprites = [ - [w.x, w.bottom_height - 720, 100, 720, 'sprites/wall.png', 180], - [w.x, w.top_y, 100, 720, 'sprites/wallbottom.png', 0] + { x: w.x, y: w.bottom_height - 720, w: 100, h: 720, path: 'sprites/wall.png', angle: 180 }, + { x: w.x, y: w.top_y, w: 100, h: 720, path: 'sprites/wallbottom.png', angle: 0 } ] end outputs.sprites << state.walls.map(&:sprites) @@ -107,15 +119,13 @@ class FlappyDragon def render_dragon state.show_death = true if state.countdown == 3.seconds - render_debug_hitbox false - if state.show_death == false || !state.death_at animation_index = state.flapped_at.frame_index 6, 2, false if state.flapped_at sprite_name = "sprites/dragon_fly#{animation_index.or(0) + 1}.png" - state.dragon_sprite = [state.x, state.y, 100, 80, sprite_name, state.dy * 1.2] + state.dragon_sprite = { x: state.x, y: state.y, w: 100, h: 80, path: sprite_name, angle: state.dy * 1.2 } else sprite_name = "sprites/dragon_die.png" - state.dragon_sprite = [state.x, state.y, 100, 80, sprite_name, state.dy * 1.2] + state.dragon_sprite = { x: state.x, y: state.y, w: 100, h: 80, path: sprite_name, angle: state.dy * 1.2 } sprite_changed_elapsed = state.death_at.elapsed_time - 1.seconds state.dragon_sprite.angle += (sprite_changed_elapsed ** 1.3) * state.death_fall_direction * -1 state.dragon_sprite.x += (sprite_changed_elapsed ** 1.2) * state.death_fall_direction @@ -125,20 +135,12 @@ class FlappyDragon outputs.sprites << state.dragon_sprite end - def render_debug_hitbox show - return unless show - outputs.borders << [dragon_collision_box.rect, 255, 0, 0] if state.dragon_sprite - outputs.borders << state.walls.flat_map do |w| - w.sprites.map { |s| [s.rect, 255, 0, 0] } - end - end - def render_flash return unless state.flash_at - outputs.primitives << [grid.rect, - white, - 255 * state.flash_at.ease(20, :flip)].solid + outputs.primitives << { **grid.rect.to_hash, + **white, + a: 255 * state.flash_at.ease(20, :flip) }.solid! state.flash_at = 0 if state.flash_at.elapsed_time > 20 end @@ -258,19 +260,12 @@ class FlappyDragon end end - def scrolling_background at, path, rate, y = 0 - [ - [ 0 - at.*(rate) % 1440, y, 1440, 720, path], - [1440 - at.*(rate) % 1440, y, 1440, 720, path] - ] - end - def white - [255, 255, 255] + { r: 255, g: 255, b: 255 } end def large_white_typeset - [5, 0, 255, 255, 255] + { size_enum: 5, alignment_enum: 0, r: 255, g: 255, b: 255 } end def at_beginning? @@ -279,9 +274,9 @@ class FlappyDragon def dragon_collision_box state.dragon_sprite - .scale_rect(1.0 - collision_forgiveness, 0.5, 0.5) - .rect_shift_right(10) - .rect_shift_up(state.dy * 2) + .scale_rect(1.0 - collision_forgiveness, 0.5, 0.5) + .rect_shift_right(10) + .rect_shift_up(state.dy * 2) end def game_over? @@ -290,7 +285,7 @@ class FlappyDragon state.walls .flat_map { |w| w.sprites } .any? do |s| - s.intersect_rect?(dragon_collision_box) + s && s.intersect_rect?(dragon_collision_box) end end diff --git a/samples/99_genre_arcade/twinstick/replay.txt b/samples/99_genre_arcade/twinstick/replay.txt new file mode 100644 index 0000000..e05480f --- /dev/null +++ b/samples/99_genre_arcade/twinstick/replay.txt @@ -0,0 +1,174 @@ +replay_version 2.0 +stopped_at 819 +seed 100 +recorded_at 2021-11-20 11:29:24 -0600 +[:mouse_button_up, 1, 0, 1, 1, 3] +[:key_down_raw, 1073741903, 0, 2, 2, 89] +[:key_down_raw, 1073741903, 0, 2, 3, 104] +[:key_down_raw, 1073741903, 0, 2, 4, 106] +[:key_down_raw, 1073741903, 0, 2, 5, 108] +[:key_down_raw, 1073741903, 0, 2, 6, 110] +[:key_down_raw, 1073741903, 0, 2, 7, 112] +[:key_down_raw, 1073741903, 0, 2, 8, 114] +[:key_down_raw, 1073741903, 0, 2, 9, 116] +[:key_up_raw, 1073741903, 0, 2, 10, 117] +[:key_down_raw, 115, 0, 2, 11, 121] +[:key_down_raw, 1073741905, 0, 2, 12, 133] +[:key_down_raw, 1073741905, 0, 2, 13, 148] +[:key_down_raw, 1073741905, 0, 2, 14, 150] +[:key_down_raw, 1073741905, 0, 2, 15, 152] +[:key_down_raw, 1073741904, 0, 2, 16, 152] +[:key_up_raw, 1073741904, 0, 2, 17, 158] +[:key_up_raw, 1073741905, 0, 2, 18, 159] +[:key_down_raw, 1073741906, 0, 2, 19, 163] +[:key_down_raw, 1073741903, 0, 2, 20, 178] +[:key_up_raw, 1073741903, 0, 2, 21, 185] +[:key_down_raw, 100, 0, 2, 22, 195] +[:key_up_raw, 1073741906, 0, 2, 23, 195] +[:key_up_raw, 115, 0, 2, 24, 195] +[:key_down_raw, 1073741904, 0, 2, 25, 209] +[:key_down_raw, 1073741904, 0, 2, 26, 224] +[:key_down_raw, 1073741904, 0, 2, 27, 226] +[:key_down_raw, 1073741904, 0, 2, 28, 228] +[:key_down_raw, 1073741904, 0, 2, 29, 230] +[:key_down_raw, 119, 0, 2, 30, 230] +[:key_down_raw, 1073741906, 0, 2, 31, 237] +[:key_up_raw, 100, 0, 2, 32, 251] +[:key_down_raw, 1073741906, 0, 2, 33, 252] +[:key_down_raw, 1073741906, 0, 2, 34, 254] +[:key_down_raw, 1073741906, 0, 2, 35, 256] +[:key_down_raw, 1073741906, 0, 2, 36, 258] +[:key_down_raw, 97, 0, 2, 37, 259] +[:key_up_raw, 119, 0, 2, 38, 267] +[:key_up_raw, 1073741906, 0, 2, 39, 268] +[:key_down_raw, 1073741903, 0, 2, 40, 269] +[:key_up_raw, 1073741904, 0, 2, 41, 270] +[:key_down_raw, 1073741903, 0, 2, 42, 284] +[:key_down_raw, 1073741903, 0, 2, 43, 286] +[:key_down_raw, 1073741903, 0, 2, 44, 288] +[:key_down_raw, 1073741903, 0, 2, 45, 290] +[:key_down_raw, 1073741903, 0, 2, 46, 292] +[:key_down_raw, 1073741903, 0, 2, 47, 294] +[:key_down_raw, 1073741903, 0, 2, 48, 296] +[:key_down_raw, 1073741903, 0, 2, 49, 298] +[:key_down_raw, 1073741903, 0, 2, 50, 300] +[:key_down_raw, 1073741903, 0, 2, 51, 302] +[:key_down_raw, 1073741903, 0, 2, 52, 304] +[:key_down_raw, 119, 0, 2, 53, 304] +[:key_down_raw, 1073741906, 0, 2, 54, 311] +[:key_down_raw, 1073741906, 0, 2, 55, 326] +[:key_down_raw, 1073741906, 0, 2, 56, 328] +[:key_down_raw, 1073741906, 0, 2, 57, 330] +[:key_down_raw, 1073741906, 0, 2, 58, 332] +[:key_down_raw, 1073741906, 0, 2, 59, 334] +[:key_down_raw, 1073741906, 0, 2, 60, 336] +[:key_up_raw, 1073741903, 0, 2, 61, 336] +[:key_down_raw, 1073741906, 0, 2, 62, 338] +[:key_down_raw, 1073741906, 0, 2, 63, 340] +[:key_down_raw, 1073741906, 0, 2, 64, 342] +[:key_down_raw, 1073741906, 0, 2, 65, 344] +[:key_up_raw, 119, 0, 2, 66, 344] +[:key_down_raw, 1073741906, 0, 2, 67, 346] +[:key_up_raw, 1073741906, 0, 2, 68, 347] +[:key_down_raw, 1073741903, 0, 2, 69, 347] +[:key_down_raw, 115, 0, 2, 70, 353] +[:key_down_raw, 1073741906, 0, 2, 71, 355] +[:key_up_raw, 97, 0, 2, 72, 356] +[:key_up_raw, 1073741903, 0, 2, 73, 360] +[:key_down_raw, 1073741906, 0, 2, 74, 370] +[:key_down_raw, 1073741906, 0, 2, 75, 372] +[:key_down_raw, 1073741906, 0, 2, 76, 374] +[:key_down_raw, 1073741906, 0, 2, 77, 376] +[:key_down_raw, 1073741906, 0, 2, 78, 378] +[:key_down_raw, 1073741906, 0, 2, 79, 380] +[:key_down_raw, 97, 0, 2, 80, 381] +[:key_up_raw, 115, 0, 2, 81, 385] +[:key_down_raw, 1073741903, 0, 2, 82, 386] +[:key_up_raw, 1073741906, 0, 2, 83, 391] +[:key_down_raw, 1073741903, 0, 2, 84, 401] +[:key_down_raw, 1073741903, 0, 2, 85, 403] +[:key_down_raw, 1073741903, 0, 2, 86, 405] +[:key_down_raw, 1073741903, 0, 2, 87, 407] +[:key_down_raw, 1073741903, 0, 2, 88, 409] +[:key_down_raw, 1073741903, 0, 2, 89, 411] +[:key_down_raw, 1073741903, 0, 2, 90, 413] +[:key_down_raw, 1073741903, 0, 2, 91, 415] +[:key_down_raw, 1073741903, 0, 2, 92, 417] +[:key_down_raw, 1073741903, 0, 2, 93, 419] +[:key_down_raw, 1073741903, 0, 2, 94, 421] +[:key_down_raw, 1073741903, 0, 2, 95, 423] +[:key_down_raw, 1073741903, 0, 2, 96, 425] +[:key_down_raw, 1073741903, 0, 2, 97, 428] +[:key_down_raw, 1073741903, 0, 2, 98, 430] +[:key_up_raw, 97, 0, 2, 99, 430] +[:key_down_raw, 1073741903, 0, 2, 100, 432] +[:key_down_raw, 1073741903, 0, 2, 101, 434] +[:key_down_raw, 1073741903, 0, 2, 102, 436] +[:key_up_raw, 1073741903, 0, 2, 103, 436] +[:key_down_raw, 100, 0, 2, 104, 447] +[:key_down_raw, 1073741904, 0, 2, 105, 447] +[:key_down_raw, 1073741904, 0, 2, 106, 462] +[:key_down_raw, 1073741904, 0, 2, 107, 464] +[:key_down_raw, 1073741904, 0, 2, 108, 466] +[:key_down_raw, 1073741904, 0, 2, 109, 468] +[:key_down_raw, 1073741904, 0, 2, 110, 470] +[:key_down_raw, 1073741904, 0, 2, 111, 472] +[:key_down_raw, 1073741904, 0, 2, 112, 474] +[:key_down_raw, 1073741904, 0, 2, 113, 476] +[:key_down_raw, 1073741904, 0, 2, 114, 478] +[:key_down_raw, 1073741904, 0, 2, 115, 480] +[:key_down_raw, 1073741904, 0, 2, 116, 482] +[:key_down_raw, 1073741904, 0, 2, 117, 484] +[:key_down_raw, 1073741904, 0, 2, 118, 486] +[:key_down_raw, 1073741904, 0, 2, 119, 488] +[:key_down_raw, 1073741904, 0, 2, 120, 490] +[:key_down_raw, 1073741904, 0, 2, 121, 492] +[:key_down_raw, 1073741904, 0, 2, 122, 494] +[:key_down_raw, 1073741904, 0, 2, 123, 496] +[:key_down_raw, 1073741904, 0, 2, 124, 498] +[:key_down_raw, 1073741904, 0, 2, 125, 500] +[:key_down_raw, 1073741904, 0, 2, 126, 502] +[:key_down_raw, 1073741904, 0, 2, 127, 504] +[:key_down_raw, 1073741904, 0, 2, 128, 506] +[:key_down_raw, 1073741904, 0, 2, 129, 508] +[:key_up_raw, 100, 0, 2, 130, 508] +[:key_down_raw, 1073741904, 0, 2, 131, 510] +[:key_down_raw, 1073741904, 0, 2, 132, 512] +[:key_up_raw, 1073741904, 0, 2, 133, 513] +[:key_down_raw, 1073741906, 0, 2, 134, 569] +[:key_down_raw, 1073741903, 0, 2, 135, 570] +[:key_down_raw, 1073741903, 0, 2, 136, 585] +[:key_down_raw, 1073741903, 0, 2, 137, 587] +[:key_up_raw, 1073741903, 0, 2, 138, 588] +[:key_down_raw, 1073741903, 0, 2, 139, 597] +[:key_up_raw, 1073741906, 0, 2, 140, 600] +[:key_up_raw, 1073741903, 0, 2, 141, 608] +[:key_down_raw, 1073741906, 0, 2, 142, 610] +[:key_up_raw, 1073741906, 0, 2, 143, 615] +[:key_down_raw, 1073741906, 0, 2, 144, 619] +[:key_down_raw, 119, 0, 2, 145, 621] +[:key_up_raw, 1073741906, 0, 2, 146, 623] +[:key_down_raw, 119, 0, 2, 147, 636] +[:key_down_raw, 119, 0, 2, 148, 638] +[:key_down_raw, 119, 0, 2, 149, 640] +[:key_down_raw, 119, 0, 2, 150, 642] +[:key_up_raw, 119, 0, 2, 151, 642] +[:key_down_raw, 100, 0, 2, 152, 653] +[:key_down_raw, 100, 0, 2, 153, 668] +[:key_down_raw, 100, 0, 2, 154, 670] +[:key_down_raw, 100, 0, 2, 155, 672] +[:key_down_raw, 100, 0, 2, 156, 674] +[:key_down_raw, 100, 0, 2, 157, 676] +[:key_down_raw, 100, 0, 2, 158, 678] +[:key_down_raw, 100, 0, 2, 159, 680] +[:key_down_raw, 100, 0, 2, 160, 682] +[:key_down_raw, 100, 0, 2, 161, 684] +[:key_down_raw, 100, 0, 2, 162, 686] +[:key_down_raw, 115, 0, 2, 163, 686] +[:key_up_raw, 100, 0, 2, 164, 697] +[:key_down_raw, 97, 0, 2, 165, 699] +[:key_up_raw, 115, 0, 2, 166, 704] +[:key_up_raw, 97, 0, 2, 167, 714] +[:key_down_raw, 96, 0, 2, 168, 769] +[:key_up_raw, 96, 0, 2, 169, 774] +[:key_down_raw, 13, 0, 2, 170, 819] diff --git a/samples/99_genre_crafting/farming_game_starting_point/replay.txt b/samples/99_genre_crafting/farming_game_starting_point/replay.txt new file mode 100644 index 0000000..740810d --- /dev/null +++ b/samples/99_genre_crafting/farming_game_starting_point/replay.txt @@ -0,0 +1,170 @@ +replay_version 2.0 +stopped_at 851 +seed 100 +recorded_at 2021-11-20 11:30:20 -0600 +[:mouse_button_up, 1, 0, 1, 1, 4] +[:key_down_raw, 1073741904, 0, 2, 2, 69] +[:key_down_raw, 1073741904, 0, 2, 3, 83] +[:key_up_raw, 1073741904, 0, 2, 4, 84] +[:key_down_raw, 1073741906, 0, 2, 5, 89] +[:key_down_raw, 1073741903, 0, 2, 6, 95] +[:key_up_raw, 1073741906, 0, 2, 7, 103] +[:key_down_raw, 1073741903, 0, 2, 8, 110] +[:key_down_raw, 1073741903, 0, 2, 9, 112] +[:key_down_raw, 1073741903, 0, 2, 10, 114] +[:key_down_raw, 1073741903, 0, 2, 11, 116] +[:key_down_raw, 1073741903, 0, 2, 12, 118] +[:key_down_raw, 1073741903, 0, 2, 13, 120] +[:key_down_raw, 1073741903, 0, 2, 14, 122] +[:key_down_raw, 1073741903, 0, 2, 15, 124] +[:key_up_raw, 1073741903, 0, 2, 16, 125] +[:key_down_raw, 106, 0, 2, 17, 147] +[:key_up_raw, 106, 0, 2, 18, 156] +[:key_down_raw, 1073741904, 0, 2, 19, 180] +[:key_down_raw, 1073741904, 0, 2, 20, 195] +[:key_down_raw, 1073741904, 0, 2, 21, 197] +[:key_down_raw, 1073741904, 0, 2, 22, 199] +[:key_down_raw, 1073741904, 0, 2, 23, 201] +[:key_down_raw, 1073741904, 0, 2, 24, 203] +[:key_down_raw, 1073741904, 0, 2, 25, 205] +[:key_up_raw, 1073741904, 0, 2, 26, 207] +[:key_down_raw, 1073741903, 0, 2, 27, 208] +[:key_down_raw, 1073741903, 0, 2, 28, 223] +[:key_down_raw, 1073741903, 0, 2, 29, 225] +[:key_down_raw, 1073741903, 0, 2, 30, 227] +[:key_down_raw, 1073741903, 0, 2, 31, 229] +[:key_down_raw, 1073741903, 0, 2, 32, 231] +[:key_down_raw, 1073741903, 0, 2, 33, 233] +[:key_down_raw, 1073741903, 0, 2, 34, 235] +[:key_down_raw, 1073741903, 0, 2, 35, 237] +[:key_down_raw, 1073741903, 0, 2, 36, 239] +[:key_down_raw, 1073741903, 0, 2, 37, 241] +[:key_down_raw, 1073741903, 0, 2, 38, 243] +[:key_down_raw, 1073741903, 0, 2, 39, 245] +[:key_down_raw, 1073741903, 0, 2, 40, 247] +[:key_down_raw, 1073741903, 0, 2, 41, 249] +[:key_down_raw, 1073741903, 0, 2, 42, 251] +[:key_down_raw, 1073741903, 0, 2, 43, 253] +[:key_down_raw, 1073741903, 0, 2, 44, 255] +[:key_down_raw, 1073741906, 0, 2, 45, 257] +[:key_up_raw, 1073741903, 0, 2, 46, 258] +[:key_down_raw, 1073741906, 0, 2, 47, 271] +[:key_down_raw, 1073741906, 0, 2, 48, 274] +[:key_down_raw, 1073741906, 0, 2, 49, 276] +[:key_down_raw, 1073741906, 0, 2, 50, 278] +[:key_down_raw, 1073741906, 0, 2, 51, 280] +[:key_up_raw, 1073741906, 0, 2, 52, 280] +[:key_down_raw, 1073741903, 0, 2, 53, 280] +[:key_down_raw, 1073741903, 0, 2, 54, 296] +[:key_down_raw, 1073741903, 0, 2, 55, 298] +[:key_down_raw, 1073741905, 0, 2, 56, 298] +[:key_up_raw, 1073741903, 0, 2, 57, 300] +[:key_down_raw, 1073741905, 0, 2, 58, 313] +[:key_down_raw, 1073741905, 0, 2, 59, 315] +[:key_down_raw, 1073741905, 0, 2, 60, 317] +[:key_down_raw, 1073741905, 0, 2, 61, 319] +[:key_down_raw, 1073741905, 0, 2, 62, 321] +[:key_down_raw, 1073741905, 0, 2, 63, 323] +[:key_down_raw, 1073741905, 0, 2, 64, 325] +[:key_down_raw, 1073741905, 0, 2, 65, 327] +[:key_down_raw, 1073741905, 0, 2, 66, 329] +[:key_down_raw, 1073741904, 0, 2, 67, 330] +[:key_up_raw, 1073741905, 0, 2, 68, 332] +[:key_down_raw, 1073741904, 0, 2, 69, 345] +[:key_down_raw, 1073741904, 0, 2, 70, 347] +[:key_down_raw, 1073741904, 0, 2, 71, 349] +[:key_down_raw, 1073741904, 0, 2, 72, 351] +[:key_up_raw, 1073741904, 0, 2, 73, 353] +[:key_down_raw, 1073741903, 0, 2, 74, 354] +[:key_down_raw, 1073741903, 0, 2, 75, 369] +[:key_down_raw, 1073741903, 0, 2, 76, 371] +[:key_down_raw, 1073741903, 0, 2, 77, 373] +[:key_down_raw, 1073741903, 0, 2, 78, 375] +[:key_down_raw, 1073741903, 0, 2, 79, 377] +[:key_down_raw, 1073741903, 0, 2, 80, 379] +[:key_down_raw, 1073741903, 0, 2, 81, 382] +[:key_down_raw, 1073741903, 0, 2, 82, 383] +[:key_down_raw, 1073741903, 0, 2, 83, 385] +[:key_down_raw, 1073741903, 0, 2, 84, 387] +[:key_down_raw, 1073741903, 0, 2, 85, 390] +[:key_down_raw, 1073741903, 0, 2, 86, 392] +[:key_down_raw, 1073741903, 0, 2, 87, 394] +[:key_down_raw, 1073741905, 0, 2, 88, 395] +[:key_up_raw, 1073741903, 0, 2, 89, 400] +[:key_down_raw, 1073741904, 0, 2, 90, 405] +[:key_up_raw, 1073741905, 0, 2, 91, 416] +[:key_down_raw, 1073741904, 0, 2, 92, 420] +[:key_down_raw, 1073741904, 0, 2, 93, 422] +[:key_down_raw, 1073741904, 0, 2, 94, 424] +[:key_down_raw, 1073741904, 0, 2, 95, 426] +[:key_down_raw, 1073741904, 0, 2, 96, 428] +[:key_down_raw, 1073741904, 0, 2, 97, 430] +[:key_down_raw, 1073741904, 0, 2, 98, 432] +[:key_down_raw, 1073741904, 0, 2, 99, 434] +[:key_down_raw, 1073741904, 0, 2, 100, 436] +[:key_down_raw, 1073741904, 0, 2, 101, 438] +[:key_down_raw, 1073741904, 0, 2, 102, 440] +[:key_down_raw, 1073741904, 0, 2, 103, 442] +[:key_down_raw, 1073741904, 0, 2, 104, 444] +[:key_up_raw, 1073741904, 0, 2, 105, 444] +[:key_down_raw, 1073741906, 0, 2, 106, 445] +[:key_up_raw, 1073741906, 0, 2, 107, 448] +[:key_down_raw, 1073741905, 0, 2, 108, 452] +[:key_down_raw, 1073741905, 0, 2, 109, 467] +[:key_down_raw, 1073741905, 0, 2, 110, 469] +[:key_up_raw, 1073741905, 0, 2, 111, 470] +[:key_down_raw, 1073741906, 0, 2, 112, 484] +[:key_up_raw, 1073741906, 0, 2, 113, 496] +[:key_down_raw, 32, 0, 2, 114, 499] +[:key_up_raw, 32, 0, 2, 115, 505] +[:key_down_raw, 1073741903, 0, 2, 116, 538] +[:key_up_raw, 1073741903, 0, 2, 117, 553] +[:key_down_raw, 106, 0, 2, 118, 604] +[:key_up_raw, 106, 0, 2, 119, 608] +[:key_down_raw, 1073741903, 0, 2, 120, 640] +[:key_down_raw, 1073741906, 0, 2, 121, 654] +[:key_up_raw, 1073741903, 0, 2, 122, 654] +[:key_down_raw, 1073741906, 0, 2, 123, 669] +[:key_down_raw, 1073741906, 0, 2, 124, 671] +[:key_down_raw, 1073741906, 0, 2, 125, 673] +[:key_down_raw, 1073741906, 0, 2, 126, 675] +[:key_up_raw, 1073741906, 0, 2, 127, 677] +[:key_down_raw, 1073741903, 0, 2, 128, 677] +[:key_down_raw, 1073741903, 0, 2, 129, 692] +[:key_down_raw, 1073741903, 0, 2, 130, 694] +[:key_down_raw, 1073741905, 0, 2, 131, 694] +[:key_up_raw, 1073741903, 0, 2, 132, 696] +[:key_down_raw, 1073741905, 0, 2, 133, 709] +[:key_down_raw, 1073741905, 0, 2, 134, 711] +[:key_down_raw, 1073741905, 0, 2, 135, 713] +[:key_down_raw, 1073741905, 0, 2, 136, 715] +[:key_down_raw, 1073741905, 0, 2, 137, 717] +[:key_down_raw, 1073741904, 0, 2, 138, 719] +[:key_up_raw, 1073741905, 0, 2, 139, 721] +[:key_down_raw, 1073741904, 0, 2, 140, 734] +[:key_down_raw, 1073741904, 0, 2, 141, 736] +[:key_down_raw, 1073741904, 0, 2, 142, 738] +[:key_down_raw, 1073741904, 0, 2, 143, 740] +[:key_down_raw, 1073741904, 0, 2, 144, 742] +[:key_down_raw, 1073741904, 0, 2, 145, 744] +[:key_down_raw, 1073741904, 0, 2, 146, 746] +[:key_down_raw, 1073741904, 0, 2, 147, 748] +[:key_up_raw, 1073741904, 0, 2, 148, 748] +[:key_down_raw, 96, 0, 2, 149, 778] +[:key_up_raw, 96, 0, 2, 150, 782] +[:mouse_move, 782, 86, 2, 151, 822] +[:mouse_move, 774, 93, 2, 152, 823] +[:mouse_move, 764, 101, 2, 153, 824] +[:mouse_move, 752, 113, 2, 154, 825] +[:mouse_move, 732, 126, 2, 155, 826] +[:mouse_move, 716, 141, 2, 156, 827] +[:mouse_move, 705, 152, 2, 157, 828] +[:mouse_move, 699, 162, 2, 158, 829] +[:mouse_move, 693, 172, 2, 159, 830] +[:mouse_move, 690, 177, 2, 160, 831] +[:mouse_move, 690, 176, 2, 161, 839] +[:mouse_move, 691, 175, 2, 162, 840] +[:mouse_move, 693, 173, 2, 163, 841] +[:mouse_move, 695, 173, 2, 164, 842] +[:mouse_move, 695, 172, 2, 165, 844] +[:key_down_raw, 13, 0, 2, 166, 851] diff --git a/samples/99_genre_crafting/replay.txt b/samples/99_genre_crafting/replay.txt new file mode 100644 index 0000000..740810d --- /dev/null +++ b/samples/99_genre_crafting/replay.txt @@ -0,0 +1,170 @@ +replay_version 2.0 +stopped_at 851 +seed 100 +recorded_at 2021-11-20 11:30:20 -0600 +[:mouse_button_up, 1, 0, 1, 1, 4] +[:key_down_raw, 1073741904, 0, 2, 2, 69] +[:key_down_raw, 1073741904, 0, 2, 3, 83] +[:key_up_raw, 1073741904, 0, 2, 4, 84] +[:key_down_raw, 1073741906, 0, 2, 5, 89] +[:key_down_raw, 1073741903, 0, 2, 6, 95] +[:key_up_raw, 1073741906, 0, 2, 7, 103] +[:key_down_raw, 1073741903, 0, 2, 8, 110] +[:key_down_raw, 1073741903, 0, 2, 9, 112] +[:key_down_raw, 1073741903, 0, 2, 10, 114] +[:key_down_raw, 1073741903, 0, 2, 11, 116] +[:key_down_raw, 1073741903, 0, 2, 12, 118] +[:key_down_raw, 1073741903, 0, 2, 13, 120] +[:key_down_raw, 1073741903, 0, 2, 14, 122] +[:key_down_raw, 1073741903, 0, 2, 15, 124] +[:key_up_raw, 1073741903, 0, 2, 16, 125] +[:key_down_raw, 106, 0, 2, 17, 147] +[:key_up_raw, 106, 0, 2, 18, 156] +[:key_down_raw, 1073741904, 0, 2, 19, 180] +[:key_down_raw, 1073741904, 0, 2, 20, 195] +[:key_down_raw, 1073741904, 0, 2, 21, 197] +[:key_down_raw, 1073741904, 0, 2, 22, 199] +[:key_down_raw, 1073741904, 0, 2, 23, 201] +[:key_down_raw, 1073741904, 0, 2, 24, 203] +[:key_down_raw, 1073741904, 0, 2, 25, 205] +[:key_up_raw, 1073741904, 0, 2, 26, 207] +[:key_down_raw, 1073741903, 0, 2, 27, 208] +[:key_down_raw, 1073741903, 0, 2, 28, 223] +[:key_down_raw, 1073741903, 0, 2, 29, 225] +[:key_down_raw, 1073741903, 0, 2, 30, 227] +[:key_down_raw, 1073741903, 0, 2, 31, 229] +[:key_down_raw, 1073741903, 0, 2, 32, 231] +[:key_down_raw, 1073741903, 0, 2, 33, 233] +[:key_down_raw, 1073741903, 0, 2, 34, 235] +[:key_down_raw, 1073741903, 0, 2, 35, 237] +[:key_down_raw, 1073741903, 0, 2, 36, 239] +[:key_down_raw, 1073741903, 0, 2, 37, 241] +[:key_down_raw, 1073741903, 0, 2, 38, 243] +[:key_down_raw, 1073741903, 0, 2, 39, 245] +[:key_down_raw, 1073741903, 0, 2, 40, 247] +[:key_down_raw, 1073741903, 0, 2, 41, 249] +[:key_down_raw, 1073741903, 0, 2, 42, 251] +[:key_down_raw, 1073741903, 0, 2, 43, 253] +[:key_down_raw, 1073741903, 0, 2, 44, 255] +[:key_down_raw, 1073741906, 0, 2, 45, 257] +[:key_up_raw, 1073741903, 0, 2, 46, 258] +[:key_down_raw, 1073741906, 0, 2, 47, 271] +[:key_down_raw, 1073741906, 0, 2, 48, 274] +[:key_down_raw, 1073741906, 0, 2, 49, 276] +[:key_down_raw, 1073741906, 0, 2, 50, 278] +[:key_down_raw, 1073741906, 0, 2, 51, 280] +[:key_up_raw, 1073741906, 0, 2, 52, 280] +[:key_down_raw, 1073741903, 0, 2, 53, 280] +[:key_down_raw, 1073741903, 0, 2, 54, 296] +[:key_down_raw, 1073741903, 0, 2, 55, 298] +[:key_down_raw, 1073741905, 0, 2, 56, 298] +[:key_up_raw, 1073741903, 0, 2, 57, 300] +[:key_down_raw, 1073741905, 0, 2, 58, 313] +[:key_down_raw, 1073741905, 0, 2, 59, 315] +[:key_down_raw, 1073741905, 0, 2, 60, 317] +[:key_down_raw, 1073741905, 0, 2, 61, 319] +[:key_down_raw, 1073741905, 0, 2, 62, 321] +[:key_down_raw, 1073741905, 0, 2, 63, 323] +[:key_down_raw, 1073741905, 0, 2, 64, 325] +[:key_down_raw, 1073741905, 0, 2, 65, 327] +[:key_down_raw, 1073741905, 0, 2, 66, 329] +[:key_down_raw, 1073741904, 0, 2, 67, 330] +[:key_up_raw, 1073741905, 0, 2, 68, 332] +[:key_down_raw, 1073741904, 0, 2, 69, 345] +[:key_down_raw, 1073741904, 0, 2, 70, 347] +[:key_down_raw, 1073741904, 0, 2, 71, 349] +[:key_down_raw, 1073741904, 0, 2, 72, 351] +[:key_up_raw, 1073741904, 0, 2, 73, 353] +[:key_down_raw, 1073741903, 0, 2, 74, 354] +[:key_down_raw, 1073741903, 0, 2, 75, 369] +[:key_down_raw, 1073741903, 0, 2, 76, 371] +[:key_down_raw, 1073741903, 0, 2, 77, 373] +[:key_down_raw, 1073741903, 0, 2, 78, 375] +[:key_down_raw, 1073741903, 0, 2, 79, 377] +[:key_down_raw, 1073741903, 0, 2, 80, 379] +[:key_down_raw, 1073741903, 0, 2, 81, 382] +[:key_down_raw, 1073741903, 0, 2, 82, 383] +[:key_down_raw, 1073741903, 0, 2, 83, 385] +[:key_down_raw, 1073741903, 0, 2, 84, 387] +[:key_down_raw, 1073741903, 0, 2, 85, 390] +[:key_down_raw, 1073741903, 0, 2, 86, 392] +[:key_down_raw, 1073741903, 0, 2, 87, 394] +[:key_down_raw, 1073741905, 0, 2, 88, 395] +[:key_up_raw, 1073741903, 0, 2, 89, 400] +[:key_down_raw, 1073741904, 0, 2, 90, 405] +[:key_up_raw, 1073741905, 0, 2, 91, 416] +[:key_down_raw, 1073741904, 0, 2, 92, 420] +[:key_down_raw, 1073741904, 0, 2, 93, 422] +[:key_down_raw, 1073741904, 0, 2, 94, 424] +[:key_down_raw, 1073741904, 0, 2, 95, 426] +[:key_down_raw, 1073741904, 0, 2, 96, 428] +[:key_down_raw, 1073741904, 0, 2, 97, 430] +[:key_down_raw, 1073741904, 0, 2, 98, 432] +[:key_down_raw, 1073741904, 0, 2, 99, 434] +[:key_down_raw, 1073741904, 0, 2, 100, 436] +[:key_down_raw, 1073741904, 0, 2, 101, 438] +[:key_down_raw, 1073741904, 0, 2, 102, 440] +[:key_down_raw, 1073741904, 0, 2, 103, 442] +[:key_down_raw, 1073741904, 0, 2, 104, 444] +[:key_up_raw, 1073741904, 0, 2, 105, 444] +[:key_down_raw, 1073741906, 0, 2, 106, 445] +[:key_up_raw, 1073741906, 0, 2, 107, 448] +[:key_down_raw, 1073741905, 0, 2, 108, 452] +[:key_down_raw, 1073741905, 0, 2, 109, 467] +[:key_down_raw, 1073741905, 0, 2, 110, 469] +[:key_up_raw, 1073741905, 0, 2, 111, 470] +[:key_down_raw, 1073741906, 0, 2, 112, 484] +[:key_up_raw, 1073741906, 0, 2, 113, 496] +[:key_down_raw, 32, 0, 2, 114, 499] +[:key_up_raw, 32, 0, 2, 115, 505] +[:key_down_raw, 1073741903, 0, 2, 116, 538] +[:key_up_raw, 1073741903, 0, 2, 117, 553] +[:key_down_raw, 106, 0, 2, 118, 604] +[:key_up_raw, 106, 0, 2, 119, 608] +[:key_down_raw, 1073741903, 0, 2, 120, 640] +[:key_down_raw, 1073741906, 0, 2, 121, 654] +[:key_up_raw, 1073741903, 0, 2, 122, 654] +[:key_down_raw, 1073741906, 0, 2, 123, 669] +[:key_down_raw, 1073741906, 0, 2, 124, 671] +[:key_down_raw, 1073741906, 0, 2, 125, 673] +[:key_down_raw, 1073741906, 0, 2, 126, 675] +[:key_up_raw, 1073741906, 0, 2, 127, 677] +[:key_down_raw, 1073741903, 0, 2, 128, 677] +[:key_down_raw, 1073741903, 0, 2, 129, 692] +[:key_down_raw, 1073741903, 0, 2, 130, 694] +[:key_down_raw, 1073741905, 0, 2, 131, 694] +[:key_up_raw, 1073741903, 0, 2, 132, 696] +[:key_down_raw, 1073741905, 0, 2, 133, 709] +[:key_down_raw, 1073741905, 0, 2, 134, 711] +[:key_down_raw, 1073741905, 0, 2, 135, 713] +[:key_down_raw, 1073741905, 0, 2, 136, 715] +[:key_down_raw, 1073741905, 0, 2, 137, 717] +[:key_down_raw, 1073741904, 0, 2, 138, 719] +[:key_up_raw, 1073741905, 0, 2, 139, 721] +[:key_down_raw, 1073741904, 0, 2, 140, 734] +[:key_down_raw, 1073741904, 0, 2, 141, 736] +[:key_down_raw, 1073741904, 0, 2, 142, 738] +[:key_down_raw, 1073741904, 0, 2, 143, 740] +[:key_down_raw, 1073741904, 0, 2, 144, 742] +[:key_down_raw, 1073741904, 0, 2, 145, 744] +[:key_down_raw, 1073741904, 0, 2, 146, 746] +[:key_down_raw, 1073741904, 0, 2, 147, 748] +[:key_up_raw, 1073741904, 0, 2, 148, 748] +[:key_down_raw, 96, 0, 2, 149, 778] +[:key_up_raw, 96, 0, 2, 150, 782] +[:mouse_move, 782, 86, 2, 151, 822] +[:mouse_move, 774, 93, 2, 152, 823] +[:mouse_move, 764, 101, 2, 153, 824] +[:mouse_move, 752, 113, 2, 154, 825] +[:mouse_move, 732, 126, 2, 155, 826] +[:mouse_move, 716, 141, 2, 156, 827] +[:mouse_move, 705, 152, 2, 157, 828] +[:mouse_move, 699, 162, 2, 158, 829] +[:mouse_move, 693, 172, 2, 159, 830] +[:mouse_move, 690, 177, 2, 160, 831] +[:mouse_move, 690, 176, 2, 161, 839] +[:mouse_move, 691, 175, 2, 162, 840] +[:mouse_move, 693, 173, 2, 163, 841] +[:mouse_move, 695, 173, 2, 164, 842] +[:mouse_move, 695, 172, 2, 165, 844] +[:key_down_raw, 13, 0, 2, 166, 851] diff --git a/samples/99_genre_dungeon_crawl/classics_jam/replay.txt b/samples/99_genre_dungeon_crawl/classics_jam/replay.txt new file mode 100644 index 0000000..eab6ec5 --- /dev/null +++ b/samples/99_genre_dungeon_crawl/classics_jam/replay.txt @@ -0,0 +1,197 @@ +replay_version 2.0 +stopped_at 873 +seed 100 +recorded_at 2021-11-20 11:38:43 -0600 +[:mouse_button_up, 1, 0, 1, 1, 4] +[:key_down_raw, 1073741905, 0, 2, 2, 99] +[:key_down_raw, 1073741905, 0, 2, 3, 113] +[:key_down_raw, 1073741905, 0, 2, 4, 115] +[:key_down_raw, 1073741905, 0, 2, 5, 117] +[:key_down_raw, 1073741905, 0, 2, 6, 119] +[:key_down_raw, 1073741905, 0, 2, 7, 121] +[:key_down_raw, 1073741905, 0, 2, 8, 123] +[:key_down_raw, 1073741905, 0, 2, 9, 125] +[:key_down_raw, 1073741905, 0, 2, 10, 127] +[:key_down_raw, 1073741905, 0, 2, 11, 129] +[:key_down_raw, 1073741905, 0, 2, 12, 131] +[:key_down_raw, 1073741905, 0, 2, 13, 133] +[:key_down_raw, 1073741905, 0, 2, 14, 135] +[:key_down_raw, 1073741905, 0, 2, 15, 137] +[:key_down_raw, 1073741905, 0, 2, 16, 139] +[:key_down_raw, 1073741905, 0, 2, 17, 141] +[:key_down_raw, 1073741905, 0, 2, 18, 143] +[:key_down_raw, 1073741905, 0, 2, 19, 145] +[:key_down_raw, 1073741905, 0, 2, 20, 147] +[:key_down_raw, 1073741905, 0, 2, 21, 149] +[:key_down_raw, 1073741905, 0, 2, 22, 151] +[:key_down_raw, 1073741905, 0, 2, 23, 153] +[:key_down_raw, 1073741905, 0, 2, 24, 155] +[:key_down_raw, 1073741905, 0, 2, 25, 157] +[:key_down_raw, 1073741905, 0, 2, 26, 159] +[:key_down_raw, 1073741905, 0, 2, 27, 161] +[:key_down_raw, 1073741905, 0, 2, 28, 163] +[:key_down_raw, 1073741905, 0, 2, 29, 165] +[:key_down_raw, 1073741905, 0, 2, 30, 167] +[:key_down_raw, 1073741905, 0, 2, 31, 169] +[:key_down_raw, 1073741905, 0, 2, 32, 171] +[:key_down_raw, 1073741905, 0, 2, 33, 173] +[:key_down_raw, 1073741905, 0, 2, 34, 175] +[:key_down_raw, 1073741905, 0, 2, 35, 177] +[:key_down_raw, 1073741905, 0, 2, 36, 179] +[:key_down_raw, 1073741905, 0, 2, 37, 181] +[:key_down_raw, 1073741905, 0, 2, 38, 183] +[:key_down_raw, 1073741905, 0, 2, 39, 185] +[:key_down_raw, 1073741905, 0, 2, 40, 187] +[:key_down_raw, 1073741905, 0, 2, 41, 189] +[:key_down_raw, 1073741905, 0, 2, 42, 191] +[:key_down_raw, 1073741905, 0, 2, 43, 193] +[:key_down_raw, 1073741905, 0, 2, 44, 195] +[:key_down_raw, 1073741904, 0, 2, 45, 196] +[:key_up_raw, 1073741905, 0, 2, 46, 196] +[:key_up_raw, 1073741904, 0, 2, 47, 205] +[:key_down_raw, 32, 0, 2, 48, 206] +[:key_up_raw, 32, 0, 2, 49, 212] +[:key_down_raw, 32, 0, 2, 50, 217] +[:key_up_raw, 32, 0, 2, 51, 222] +[:key_down_raw, 32, 0, 2, 52, 227] +[:key_up_raw, 32, 0, 2, 53, 233] +[:key_down_raw, 32, 0, 2, 54, 237] +[:key_up_raw, 32, 0, 2, 55, 243] +[:key_down_raw, 32, 0, 2, 56, 266] +[:key_up_raw, 32, 0, 2, 57, 271] +[:key_down_raw, 32, 0, 2, 58, 276] +[:key_up_raw, 32, 0, 2, 59, 282] +[:key_down_raw, 32, 0, 2, 60, 294] +[:key_up_raw, 32, 0, 2, 61, 300] +[:key_down_raw, 32, 0, 2, 62, 305] +[:key_down_raw, 1073741904, 0, 2, 63, 306] +[:key_up_raw, 32, 0, 2, 64, 310] +[:key_down_raw, 1073741904, 0, 2, 65, 322] +[:key_down_raw, 1073741904, 0, 2, 66, 324] +[:key_down_raw, 1073741904, 0, 2, 67, 326] +[:key_down_raw, 1073741904, 0, 2, 68, 328] +[:key_down_raw, 1073741904, 0, 2, 69, 330] +[:key_down_raw, 1073741904, 0, 2, 70, 332] +[:key_down_raw, 1073741904, 0, 2, 71, 334] +[:key_down_raw, 1073741904, 0, 2, 72, 336] +[:key_down_raw, 1073741904, 0, 2, 73, 338] +[:key_down_raw, 1073741904, 0, 2, 74, 340] +[:key_down_raw, 1073741904, 0, 2, 75, 342] +[:key_down_raw, 1073741904, 0, 2, 76, 344] +[:key_down_raw, 1073741904, 0, 2, 77, 346] +[:key_down_raw, 1073741904, 0, 2, 78, 348] +[:key_down_raw, 1073741904, 0, 2, 79, 350] +[:key_down_raw, 1073741904, 0, 2, 80, 352] +[:key_down_raw, 1073741904, 0, 2, 81, 354] +[:key_down_raw, 1073741904, 0, 2, 82, 356] +[:key_down_raw, 1073741904, 0, 2, 83, 358] +[:key_down_raw, 1073741904, 0, 2, 84, 360] +[:key_down_raw, 1073741904, 0, 2, 85, 362] +[:key_down_raw, 1073741904, 0, 2, 86, 364] +[:key_down_raw, 1073741904, 0, 2, 87, 366] +[:key_down_raw, 1073741904, 0, 2, 88, 368] +[:key_down_raw, 1073741904, 0, 2, 89, 370] +[:key_down_raw, 1073741904, 0, 2, 90, 372] +[:key_down_raw, 1073741904, 0, 2, 91, 374] +[:key_down_raw, 1073741904, 0, 2, 92, 376] +[:key_down_raw, 1073741904, 0, 2, 93, 378] +[:key_down_raw, 1073741904, 0, 2, 94, 380] +[:key_down_raw, 1073741904, 0, 2, 95, 382] +[:key_down_raw, 1073741904, 0, 2, 96, 384] +[:key_down_raw, 1073741904, 0, 2, 97, 386] +[:key_down_raw, 1073741904, 0, 2, 98, 388] +[:key_down_raw, 1073741904, 0, 2, 99, 390] +[:key_down_raw, 1073741904, 0, 2, 100, 392] +[:key_down_raw, 1073741904, 0, 2, 101, 394] +[:key_down_raw, 1073741904, 0, 2, 102, 396] +[:key_down_raw, 1073741904, 0, 2, 103, 398] +[:key_down_raw, 1073741904, 0, 2, 104, 400] +[:key_down_raw, 1073741904, 0, 2, 105, 402] +[:key_down_raw, 1073741904, 0, 2, 106, 404] +[:key_down_raw, 1073741904, 0, 2, 107, 406] +[:key_down_raw, 1073741904, 0, 2, 108, 408] +[:key_down_raw, 1073741904, 0, 2, 109, 410] +[:key_down_raw, 1073741904, 0, 2, 110, 412] +[:key_down_raw, 1073741904, 0, 2, 111, 414] +[:key_down_raw, 1073741904, 0, 2, 112, 416] +[:key_down_raw, 1073741904, 0, 2, 113, 418] +[:key_down_raw, 1073741904, 0, 2, 114, 420] +[:key_down_raw, 1073741904, 0, 2, 115, 422] +[:key_down_raw, 1073741904, 0, 2, 116, 424] +[:key_down_raw, 1073741904, 0, 2, 117, 426] +[:key_down_raw, 1073741904, 0, 2, 118, 428] +[:key_down_raw, 1073741904, 0, 2, 119, 430] +[:key_down_raw, 1073741904, 0, 2, 120, 432] +[:key_down_raw, 1073741904, 0, 2, 121, 434] +[:key_down_raw, 1073741904, 0, 2, 122, 436] +[:key_down_raw, 1073741904, 0, 2, 123, 438] +[:key_down_raw, 1073741904, 0, 2, 124, 440] +[:key_up_raw, 1073741904, 0, 2, 125, 442] +[:key_down_raw, 1073741903, 0, 2, 126, 461] +[:key_down_raw, 1073741903, 0, 2, 127, 476] +[:key_down_raw, 1073741903, 0, 2, 128, 478] +[:key_down_raw, 1073741903, 0, 2, 129, 480] +[:key_down_raw, 1073741903, 0, 2, 130, 482] +[:key_down_raw, 1073741903, 0, 2, 131, 484] +[:key_down_raw, 1073741903, 0, 2, 132, 486] +[:key_down_raw, 1073741903, 0, 2, 133, 488] +[:key_down_raw, 1073741903, 0, 2, 134, 490] +[:key_down_raw, 1073741903, 0, 2, 135, 492] +[:key_down_raw, 1073741903, 0, 2, 136, 494] +[:key_down_raw, 1073741903, 0, 2, 137, 496] +[:key_down_raw, 1073741903, 0, 2, 138, 498] +[:key_down_raw, 1073741903, 0, 2, 139, 500] +[:key_down_raw, 1073741903, 0, 2, 140, 502] +[:key_down_raw, 1073741903, 0, 2, 141, 504] +[:key_down_raw, 1073741903, 0, 2, 142, 506] +[:key_down_raw, 1073741903, 0, 2, 143, 508] +[:key_down_raw, 1073741903, 0, 2, 144, 510] +[:key_down_raw, 1073741903, 0, 2, 145, 512] +[:key_down_raw, 1073741903, 0, 2, 146, 514] +[:key_down_raw, 1073741903, 0, 2, 147, 516] +[:key_down_raw, 1073741903, 0, 2, 148, 518] +[:key_down_raw, 1073741903, 0, 2, 149, 520] +[:key_down_raw, 1073741903, 0, 2, 150, 522] +[:key_down_raw, 1073741903, 0, 2, 151, 524] +[:key_down_raw, 1073741903, 0, 2, 152, 526] +[:key_down_raw, 1073741903, 0, 2, 153, 528] +[:key_down_raw, 1073741904, 0, 2, 154, 528] +[:key_up_raw, 1073741903, 0, 2, 155, 528] +[:key_down_raw, 32, 0, 2, 156, 534] +[:key_up_raw, 32, 0, 2, 157, 539] +[:key_down_raw, 32, 0, 2, 158, 545] +[:key_up_raw, 32, 0, 2, 159, 549] +[:key_down_raw, 32, 0, 2, 160, 554] +[:key_up_raw, 32, 0, 2, 161, 560] +[:key_down_raw, 32, 0, 2, 162, 564] +[:key_up_raw, 32, 0, 2, 163, 570] +[:key_down_raw, 32, 0, 2, 164, 575] +[:key_up_raw, 32, 0, 2, 165, 581] +[:key_down_raw, 32, 0, 2, 166, 585] +[:key_up_raw, 32, 0, 2, 167, 590] +[:key_down_raw, 32, 0, 2, 168, 594] +[:key_up_raw, 32, 0, 2, 169, 600] +[:key_down_raw, 32, 0, 2, 170, 605] +[:key_up_raw, 32, 0, 2, 171, 610] +[:key_down_raw, 32, 0, 2, 172, 615] +[:key_up_raw, 32, 0, 2, 173, 620] +[:key_down_raw, 32, 0, 2, 174, 624] +[:key_up_raw, 32, 0, 2, 175, 630] +[:key_up_raw, 1073741904, 0, 2, 176, 631] +[:key_down_raw, 32, 0, 2, 177, 634] +[:key_up_raw, 32, 0, 2, 178, 639] +[:key_down_raw, 32, 0, 2, 179, 644] +[:key_up_raw, 32, 0, 2, 180, 649] +[:key_down_raw, 32, 0, 2, 181, 654] +[:key_up_raw, 32, 0, 2, 182, 659] +[:key_down_raw, 32, 0, 2, 183, 664] +[:key_up_raw, 32, 0, 2, 184, 669] +[:key_down_raw, 32, 0, 2, 185, 674] +[:key_up_raw, 32, 0, 2, 186, 679] +[:key_down_raw, 32, 0, 2, 187, 684] +[:key_up_raw, 32, 0, 2, 188, 689] +[:key_down_raw, 32, 0, 2, 189, 694] +[:key_up_raw, 32, 0, 2, 190, 699] +[:key_down_raw, 96, 0, 2, 191, 823] +[:key_up_raw, 96, 0, 2, 192, 828] +[:key_down_raw, 13, 0, 2, 193, 873] diff --git a/samples/99_genre_mario/01_jumping/app/main.rb b/samples/99_genre_mario/01_jumping/app/main.rb new file mode 100644 index 0000000..2d12a22 --- /dev/null +++ b/samples/99_genre_mario/01_jumping/app/main.rb @@ -0,0 +1,78 @@ +def tick args + defaults args + render args + input args + calc args +end + +def defaults args + args.state.player.x ||= args.grid.w.half + args.state.player.y ||= 0 + args.state.player.size ||= 100 + args.state.player.dy ||= 0 + args.state.player.action ||= :jumping + args.state.jump.power = 20 + args.state.jump.increase_frames = 10 + args.state.jump.increase_power = 1 + args.state.gravity = -1 +end + +def render args + args.outputs.sprites << { + x: args.state.player.x - + args.state.player.size.half, + y: args.state.player.y, + w: args.state.player.size, + h: args.state.player.size, + path: 'sprites/square/red.png' + } +end + +def input args + if args.inputs.keyboard.key_down.space + if args.state.player.action == :standing + args.state.player.action = :jumping + args.state.player.dy = args.state.jump.power + + # record when the action took place + current_frame = args.state.tick_count + args.state.player.action_at = current_frame + end + end + + # if the space bar is being held + if args.inputs.keyboard.key_held.space + # is the player jumping + is_jumping = args.state.player.action == :jumping + + # when was the jump performed + time_of_jump = args.state.player.action_at + + # how much time has passed since the jump + jump_elapsed_time = time_of_jump.elapsed_time + + # how much time is allowed for increasing power + time_allowed = args.state.jump.increase_frames + + # if the player is jumping + # and the elapsed time is less than + # the allowed time + if is_jumping && jump_elapsed_time < time_allowed + # increase the dy by the increase power + power_to_add = args.state.jump.increase_power + args.state.player.dy += power_to_add + end + end +end + +def calc args + if args.state.player.action == :jumping + args.state.player.y += args.state.player.dy + args.state.player.dy += args.state.gravity + end + + if args.state.player.y < 0 + args.state.player.y = 0 + args.state.player.action = :standing + end +end diff --git a/samples/99_genre_mario/01_jumping/replay.txt b/samples/99_genre_mario/01_jumping/replay.txt new file mode 100644 index 0000000..d56d585 --- /dev/null +++ b/samples/99_genre_mario/01_jumping/replay.txt @@ -0,0 +1,52 @@ +replay_version 2.0 +stopped_at 574 +seed 100 +recorded_at 2021-11-20 16:44:37 -0600 +[:mouse_button_up, 1, 0, 1, 1, 3] +[:key_down_raw, 32, 0, 2, 2, 89] +[:key_up_raw, 32, 0, 2, 3, 92] +[:key_down_raw, 32, 0, 2, 4, 193] +[:key_up_raw, 32, 0, 2, 5, 195] +[:key_down_raw, 32, 0, 2, 6, 258] +[:key_down_raw, 32, 0, 2, 7, 273] +[:key_down_raw, 32, 0, 2, 8, 275] +[:key_down_raw, 32, 0, 2, 9, 277] +[:key_down_raw, 32, 0, 2, 10, 279] +[:key_down_raw, 32, 0, 2, 11, 281] +[:key_down_raw, 32, 0, 2, 12, 283] +[:key_down_raw, 32, 0, 2, 13, 285] +[:key_down_raw, 32, 0, 2, 14, 287] +[:key_down_raw, 32, 0, 2, 15, 289] +[:key_down_raw, 32, 0, 2, 16, 291] +[:key_down_raw, 32, 0, 2, 17, 293] +[:key_down_raw, 32, 0, 2, 18, 295] +[:key_down_raw, 32, 0, 2, 19, 297] +[:key_down_raw, 32, 0, 2, 20, 299] +[:key_down_raw, 32, 0, 2, 21, 301] +[:key_down_raw, 32, 0, 2, 22, 303] +[:key_down_raw, 32, 0, 2, 23, 305] +[:key_down_raw, 32, 0, 2, 24, 307] +[:key_up_raw, 32, 0, 2, 25, 307] +[:key_down_raw, 32, 0, 2, 26, 336] +[:key_up_raw, 32, 0, 2, 27, 339] +[:key_down_raw, 32, 0, 2, 28, 389] +[:key_up_raw, 32, 0, 2, 29, 392] +[:key_down_raw, 32, 0, 2, 30, 444] +[:key_down_raw, 32, 0, 2, 31, 459] +[:key_down_raw, 32, 0, 2, 32, 461] +[:key_down_raw, 32, 0, 2, 33, 463] +[:key_down_raw, 32, 0, 2, 34, 465] +[:key_down_raw, 32, 0, 2, 35, 467] +[:key_down_raw, 32, 0, 2, 36, 469] +[:key_down_raw, 32, 0, 2, 37, 471] +[:key_down_raw, 32, 0, 2, 38, 473] +[:key_down_raw, 32, 0, 2, 39, 475] +[:key_down_raw, 32, 0, 2, 40, 477] +[:key_down_raw, 32, 0, 2, 41, 479] +[:key_down_raw, 32, 0, 2, 42, 481] +[:key_down_raw, 32, 0, 2, 43, 483] +[:key_down_raw, 32, 0, 2, 44, 485] +[:key_up_raw, 32, 0, 2, 45, 485] +[:key_down_raw, 96, 0, 2, 46, 509] +[:key_up_raw, 96, 0, 2, 47, 512] +[:key_down_raw, 13, 0, 2, 48, 574] diff --git a/samples/99_genre_mario/01_jumping/sprites/square/red.png b/samples/99_genre_mario/01_jumping/sprites/square/red.png new file mode 100644 index 0000000..a59443e Binary files /dev/null and b/samples/99_genre_mario/01_jumping/sprites/square/red.png differ diff --git a/samples/99_genre_mario/02_jumping_and_collisions/app/main.rb b/samples/99_genre_mario/02_jumping_and_collisions/app/main.rb new file mode 100644 index 0000000..52d9135 --- /dev/null +++ b/samples/99_genre_mario/02_jumping_and_collisions/app/main.rb @@ -0,0 +1,281 @@ +class Game + attr_gtk + + def tick + defaults + render + input + calc + end + + def defaults + return if state.tick_count != 0 + + player.x = 64 + player.y = 800 + player.size = 50 + player.dx = 0 + player.dy = 0 + player.action = :falling + + player.max_speed = 20 + player.jump_power = 15 + player.jump_air_time = 15 + player.jump_increase_power = 1 + + state.gravity = -1 + state.drag = 0.001 + state.tile_size = 64 + state.tiles ||= [ + { ordinal_x: 0, ordinal_y: 0 }, + { ordinal_x: 1, ordinal_y: 0 }, + { ordinal_x: 2, ordinal_y: 0 }, + { ordinal_x: 3, ordinal_y: 0 }, + { ordinal_x: 4, ordinal_y: 0 }, + { ordinal_x: 5, ordinal_y: 0 }, + { ordinal_x: 6, ordinal_y: 0 }, + { ordinal_x: 7, ordinal_y: 0 }, + { ordinal_x: 8, ordinal_y: 0 }, + { ordinal_x: 9, ordinal_y: 0 }, + { ordinal_x: 10, ordinal_y: 0 }, + { ordinal_x: 11, ordinal_y: 0 }, + { ordinal_x: 12, ordinal_y: 0 }, + + { ordinal_x: 9, ordinal_y: 3 }, + { ordinal_x: 10, ordinal_y: 3 }, + { ordinal_x: 11, ordinal_y: 3 }, + ] + + tiles.each do |t| + t.rect = { x: t.ordinal_x * 64, + y: t.ordinal_y * 64, + w: 64, + h: 64 } + end + end + + def render + render_player + render_tiles + # render_grid + end + + def input + input_jump + input_move + end + + def calc + calc_player_rect + calc_left + calc_right + calc_below + calc_above + calc_player_dy + calc_player_dx + calc_game_over + end + + def render_player + outputs.sprites << { + x: player.x, + y: player.y, + w: player.size, + h: player.size, + path: 'sprites/square/red.png' + } + end + + def render_tiles + outputs.sprites << state.tiles.map do |t| + t.merge path: 'sprites/square/white.png', + x: t.ordinal_x * 64, + y: t.ordinal_y * 64, + w: 64, + h: 64 + end + end + + def render_grid + if state.tick_count == 0 + outputs[:grid].background_color = [0, 0, 0, 0] + outputs[:grid].borders << available_brick_locations + outputs[:grid].labels << available_brick_locations.map do |b| + [ + b.merge(text: "#{b.ordinal_x},#{b.ordinal_y}", + x: b.x + 2, + y: b.y + 2, + size_enum: -3, + vertical_alignment_enum: 0, + blendmode_enum: 0), + b.merge(text: "#{b.x},#{b.y}", + x: b.x + 2, + y: b.y + 2 + 20, + size_enum: -3, + vertical_alignment_enum: 0, + blendmode_enum: 0) + ] + end + end + + outputs.sprites << { x: 0, y: 0, w: 1280, h: 720, path: :grid } + end + + def input_jump + if inputs.keyboard.key_down.space + player_jump + end + + if inputs.keyboard.key_held.space + player_jump_increase_air_time + end + end + + def input_move + if player.dx.abs < 20 + if inputs.keyboard.left + player.dx -= 2 + elsif inputs.keyboard.right + player.dx += 2 + end + end + end + + def calc_game_over + if player.y < -64 + player.x = 64 + player.y = 800 + player.dx = 0 + player.dy = 0 + end + end + + def calc_player_rect + player.rect = player_current_rect + player.next_rect = player_next_rect + player.prev_rect = player_prev_rect + end + + def calc_player_dx + player.dx = player_next_dx + player.x += player.dx + end + + def calc_player_dy + player.y += player.dy + player.dy = player_next_dy + end + + def calc_below + return unless player.dy < 0 + tiles_below = tiles_find { |t| t.rect.top <= player.prev_rect.y } + collision = tiles_find_colliding tiles_below, (player.rect.merge y: player.next_rect.y) + if collision + player.y = collision.rect.y + state.tile_size + player.dy = 0 + player.action = :standing + else + player.action = :falling + end + end + + def calc_left + return unless player.dx < 0 && player_next_dx < 0 + tiles_left = tiles_find { |t| t.rect.right <= player.prev_rect.left } + collision = tiles_find_colliding tiles_left, (player.rect.merge x: player.next_rect.x) + return unless collision + player.x = collision.rect.right + player.dx = 0 + end + + def calc_right + return unless player.dx > 0 && player_next_dx > 0 + tiles_right = tiles_find { |t| t.rect.left >= player.prev_rect.right } + collision = tiles_find_colliding tiles_right, (player.rect.merge x: player.next_rect.x) + return unless collision + player.x = collision.rect.left - player.rect.w + player.dx = 0 + end + + def calc_above + return unless player.dy > 0 + tiles_above = tiles_find { |t| t.rect.y >= player.prev_rect.y } + collision = tiles_find_colliding tiles_above, (player.rect.merge y: player.next_rect.y) + return unless collision + player.dy = 0 + player.y = collision.rect.bottom - player.rect.h + end + + def player_current_rect + { x: player.x, y: player.y, w: player.size, h: player.size } + end + + def available_brick_locations + (0..19).to_a + .product(0..11) + .map do |(ordinal_x, ordinal_y)| + { ordinal_x: ordinal_x, + ordinal_y: ordinal_y, + x: ordinal_x * 64, + y: ordinal_y * 64, + w: 64, + h: 64 } + end + end + + def player + state.player ||= args.state.new_entity :player + end + + def player_next_dy + player.dy + state.gravity + state.drag ** 2 * -1 + end + + def player_next_dx + player.dx * 0.8 + end + + def player_next_rect + player.rect.merge x: player.x + player_next_dx, + y: player.y + player_next_dy + end + + def player_prev_rect + player.rect.merge x: player.x - player.dx, + y: player.y - player.dy + end + + def player_jump + return if player.action != :standing + player.action = :jumping + player.dy = state.player.jump_power + current_frame = state.tick_count + player.action_at = current_frame + end + + def player_jump_increase_air_time + return if player.action != :jumping + return if player.action_at.elapsed_time >= player.jump_air_time + player.dy += player.jump_increase_power + end + + def tiles + state.tiles + end + + def tiles_find_colliding tiles, target + tiles.find { |t| t.rect.intersect_rect? target } + end + + def tiles_find &block + tiles.find_all(&block) + end +end + +def tick args + $game ||= Game.new + $game.args = args + $game.tick +end + +$gtk.reset diff --git a/samples/99_genre_mario/02_jumping_and_collisions/replay.txt b/samples/99_genre_mario/02_jumping_and_collisions/replay.txt new file mode 100644 index 0000000..17e610f --- /dev/null +++ b/samples/99_genre_mario/02_jumping_and_collisions/replay.txt @@ -0,0 +1,159 @@ +replay_version 2.0 +stopped_at 913 +seed 100 +recorded_at 2021-11-20 17:04:30 -0600 +[:mouse_move, 784, 90, 2, 1, 1] +[:mouse_button_up, 1, 0, 1, 2, 4] +[:mouse_move, 785, 90, 2, 3, 7] +[:key_down_raw, 1073741903, 0, 2, 4, 63] +[:key_down_raw, 1073741903, 0, 2, 5, 78] +[:key_down_raw, 1073741903, 0, 2, 6, 81] +[:key_down_raw, 1073741903, 0, 2, 7, 83] +[:key_down_raw, 1073741903, 0, 2, 8, 85] +[:key_down_raw, 1073741903, 0, 2, 9, 87] +[:key_down_raw, 1073741903, 0, 2, 10, 89] +[:key_down_raw, 1073741903, 0, 2, 11, 91] +[:key_down_raw, 1073741903, 0, 2, 12, 93] +[:key_down_raw, 1073741903, 0, 2, 13, 95] +[:key_down_raw, 1073741903, 0, 2, 14, 97] +[:key_down_raw, 1073741903, 0, 2, 15, 99] +[:key_down_raw, 1073741903, 0, 2, 16, 101] +[:key_down_raw, 1073741903, 0, 2, 17, 103] +[:key_down_raw, 1073741903, 0, 2, 18, 105] +[:key_down_raw, 1073741903, 0, 2, 19, 107] +[:key_down_raw, 1073741903, 0, 2, 20, 109] +[:key_down_raw, 1073741903, 0, 2, 21, 111] +[:key_down_raw, 1073741903, 0, 2, 22, 113] +[:key_down_raw, 1073741903, 0, 2, 23, 115] +[:key_down_raw, 1073741903, 0, 2, 24, 117] +[:key_down_raw, 1073741903, 0, 2, 25, 119] +[:key_down_raw, 1073741903, 0, 2, 26, 121] +[:key_up_raw, 1073741903, 0, 2, 27, 121] +[:key_down_raw, 1073741904, 0, 2, 28, 155] +[:key_up_raw, 1073741904, 0, 2, 29, 159] +[:key_down_raw, 32, 0, 2, 30, 170] +[:key_up_raw, 32, 0, 2, 31, 176] +[:key_down_raw, 1073741903, 0, 2, 32, 189] +[:key_up_raw, 1073741903, 0, 2, 33, 199] +[:key_down_raw, 1073741904, 0, 2, 34, 235] +[:key_up_raw, 1073741904, 0, 2, 35, 249] +[:key_down_raw, 32, 0, 2, 36, 258] +[:key_down_raw, 1073741903, 0, 2, 37, 262] +[:key_down_raw, 1073741903, 0, 2, 38, 277] +[:key_down_raw, 1073741903, 0, 2, 39, 279] +[:key_down_raw, 1073741903, 0, 2, 40, 281] +[:key_down_raw, 1073741903, 0, 2, 41, 283] +[:key_down_raw, 1073741903, 0, 2, 42, 285] +[:key_down_raw, 1073741903, 0, 2, 43, 287] +[:key_up_raw, 32, 0, 2, 44, 288] +[:key_down_raw, 1073741903, 0, 2, 45, 289] +[:key_up_raw, 1073741903, 0, 2, 46, 290] +[:key_down_raw, 1073741904, 0, 2, 47, 309] +[:key_down_raw, 32, 0, 2, 48, 320] +[:key_up_raw, 32, 0, 2, 49, 330] +[:key_down_raw, 32, 0, 2, 50, 335] +[:key_up_raw, 32, 0, 2, 51, 339] +[:key_up_raw, 1073741904, 0, 2, 52, 355] +[:key_down_raw, 1073741903, 0, 2, 53, 361] +[:key_down_raw, 1073741903, 0, 2, 54, 376] +[:key_down_raw, 1073741903, 0, 2, 55, 378] +[:key_down_raw, 1073741903, 0, 2, 56, 380] +[:key_down_raw, 1073741903, 0, 2, 57, 382] +[:key_down_raw, 1073741903, 0, 2, 58, 384] +[:key_down_raw, 1073741903, 0, 2, 59, 386] +[:key_down_raw, 1073741903, 0, 2, 60, 388] +[:key_down_raw, 1073741903, 0, 2, 61, 390] +[:key_down_raw, 1073741903, 0, 2, 62, 392] +[:key_down_raw, 1073741903, 0, 2, 63, 394] +[:key_down_raw, 1073741903, 0, 2, 64, 396] +[:key_down_raw, 1073741903, 0, 2, 65, 398] +[:key_down_raw, 1073741903, 0, 2, 66, 400] +[:key_down_raw, 1073741903, 0, 2, 67, 402] +[:key_up_raw, 1073741903, 0, 2, 68, 403] +[:key_down_raw, 32, 0, 2, 69, 408] +[:key_up_raw, 32, 0, 2, 70, 415] +[:key_down_raw, 32, 0, 2, 71, 435] +[:key_up_raw, 32, 0, 2, 72, 450] +[:key_down_raw, 32, 0, 2, 73, 461] +[:key_up_raw, 32, 0, 2, 74, 473] +[:key_down_raw, 1073741903, 0, 2, 75, 480] +[:key_up_raw, 1073741903, 0, 2, 76, 491] +[:key_down_raw, 32, 0, 2, 77, 495] +[:key_down_raw, 32, 0, 2, 78, 509] +[:key_down_raw, 32, 0, 2, 79, 511] +[:key_down_raw, 32, 0, 2, 80, 515] +[:key_down_raw, 32, 0, 2, 81, 515] +[:key_down_raw, 32, 0, 2, 82, 517] +[:key_up_raw, 32, 0, 2, 83, 519] +[:key_down_raw, 1073741903, 0, 2, 84, 525] +[:key_down_raw, 32, 0, 2, 85, 537] +[:key_up_raw, 1073741903, 0, 2, 86, 539] +[:key_up_raw, 32, 0, 2, 87, 549] +[:key_down_raw, 1073741904, 0, 2, 88, 567] +[:key_down_raw, 1073741904, 0, 2, 89, 582] +[:key_down_raw, 1073741904, 0, 2, 90, 584] +[:key_down_raw, 1073741904, 0, 2, 91, 586] +[:key_down_raw, 1073741904, 0, 2, 92, 588] +[:key_down_raw, 1073741904, 0, 2, 93, 591] +[:key_down_raw, 1073741904, 0, 2, 94, 593] +[:key_down_raw, 1073741904, 0, 2, 95, 594] +[:key_up_raw, 1073741904, 0, 2, 96, 595] +[:key_down_raw, 1073741904, 0, 2, 97, 623] +[:key_down_raw, 1073741904, 0, 2, 98, 640] +[:key_down_raw, 1073741904, 0, 2, 99, 640] +[:key_down_raw, 1073741904, 0, 2, 100, 642] +[:key_down_raw, 1073741904, 0, 2, 101, 645] +[:key_down_raw, 1073741904, 0, 2, 102, 647] +[:key_down_raw, 1073741904, 0, 2, 103, 649] +[:key_down_raw, 1073741904, 0, 2, 104, 651] +[:key_up_raw, 1073741904, 0, 2, 105, 652] +[:key_down_raw, 1073741903, 0, 2, 106, 683] +[:key_down_raw, 1073741903, 0, 2, 107, 698] +[:key_down_raw, 1073741903, 0, 2, 108, 700] +[:key_down_raw, 1073741903, 0, 2, 109, 702] +[:key_down_raw, 1073741903, 0, 2, 110, 704] +[:key_down_raw, 1073741903, 0, 2, 111, 706] +[:key_down_raw, 1073741903, 0, 2, 112, 708] +[:key_down_raw, 1073741903, 0, 2, 113, 710] +[:key_down_raw, 1073741903, 0, 2, 114, 712] +[:key_down_raw, 1073741903, 0, 2, 115, 714] +[:key_down_raw, 1073741903, 0, 2, 116, 716] +[:key_down_raw, 1073741903, 0, 2, 117, 718] +[:key_down_raw, 1073741903, 0, 2, 118, 720] +[:key_down_raw, 1073741903, 0, 2, 119, 722] +[:key_down_raw, 1073741903, 0, 2, 120, 724] +[:key_down_raw, 1073741903, 0, 2, 121, 726] +[:key_down_raw, 1073741903, 0, 2, 122, 728] +[:key_down_raw, 1073741903, 0, 2, 123, 730] +[:key_down_raw, 1073741903, 0, 2, 124, 732] +[:key_down_raw, 1073741903, 0, 2, 125, 734] +[:key_down_raw, 1073741903, 0, 2, 126, 736] +[:key_down_raw, 1073741903, 0, 2, 127, 738] +[:key_down_raw, 1073741903, 0, 2, 128, 740] +[:key_down_raw, 1073741903, 0, 2, 129, 742] +[:key_down_raw, 1073741903, 0, 2, 130, 744] +[:key_down_raw, 1073741903, 0, 2, 131, 746] +[:key_down_raw, 1073741903, 0, 2, 132, 748] +[:key_down_raw, 32, 0, 2, 133, 748] +[:key_down_raw, 32, 0, 2, 134, 763] +[:key_down_raw, 32, 0, 2, 135, 765] +[:key_down_raw, 32, 0, 2, 136, 767] +[:key_down_raw, 32, 0, 2, 137, 769] +[:key_down_raw, 32, 0, 2, 138, 771] +[:key_up_raw, 32, 0, 2, 139, 773] +[:key_down_raw, 1073741904, 0, 2, 140, 775] +[:key_up_raw, 1073741903, 0, 2, 141, 776] +[:key_down_raw, 1073741904, 0, 2, 142, 790] +[:key_down_raw, 1073741904, 0, 2, 143, 792] +[:key_down_raw, 1073741904, 0, 2, 144, 794] +[:key_down_raw, 1073741904, 0, 2, 145, 796] +[:key_down_raw, 1073741904, 0, 2, 146, 798] +[:key_down_raw, 1073741904, 0, 2, 147, 801] +[:key_down_raw, 1073741904, 0, 2, 148, 803] +[:key_down_raw, 1073741904, 0, 2, 149, 804] +[:key_down_raw, 1073741904, 0, 2, 150, 807] +[:key_down_raw, 1073741904, 0, 2, 151, 809] +[:key_up_raw, 1073741904, 0, 2, 152, 810] +[:key_down_raw, 96, 0, 2, 153, 854] +[:key_up_raw, 96, 0, 2, 154, 858] +[:key_down_raw, 13, 0, 2, 155, 913] diff --git a/samples/99_genre_mario/02_jumping_and_collisions/sprites/square/red.png b/samples/99_genre_mario/02_jumping_and_collisions/sprites/square/red.png new file mode 100644 index 0000000..a59443e Binary files /dev/null and b/samples/99_genre_mario/02_jumping_and_collisions/sprites/square/red.png differ diff --git a/samples/99_genre_mario/02_jumping_and_collisions/sprites/square/white.png b/samples/99_genre_mario/02_jumping_and_collisions/sprites/square/white.png new file mode 100644 index 0000000..7a233ea Binary files /dev/null and b/samples/99_genre_mario/02_jumping_and_collisions/sprites/square/white.png differ diff --git a/samples/99_genre_platformer/clepto_frog/app/main.rb b/samples/99_genre_platformer/clepto_frog/app/main.rb index a4eb069..a3a237e 100644 --- a/samples/99_genre_platformer/clepto_frog/app/main.rb +++ b/samples/99_genre_platformer/clepto_frog/app/main.rb @@ -1,4 +1,4 @@ -MAP_FILE_PATH = 'app/map.txt' +MAP_FILE_PATH = 'map.txt' require 'app/map.rb' @@ -53,35 +53,7 @@ class CleptoFrog def render_intro outputs.labels << [640, 700, "Clepto Frog", 4, 1] - if state.tick_count >= 120 - outputs.labels << [640, 620, "\"Uh... your office has a pet frog?\" - New Guy", - 4, 1, 0, 0, 0, 255 * 120.ease(60)] - end - - if state.tick_count >= 240 - outputs.labels << [640, 580, "\"Yep! His name is Clepto.\" - Jim", - 4, 1, 0, 0, 0, 255 * 240.ease(60)] - end - - if state.tick_count >= 360 - outputs.labels << [640, 540, "\"Uh...\" - New Guy", - 4, 1, 0, 0, 0, 255 * 360.ease(60)] - end - - if state.tick_count >= 480 - outputs.labels << [640, 500, "\"He steals mugs while we're away...\" - Jim", - 4, 1, 0, 0, 0, 255 * 480.ease(60)] - end - - if state.tick_count >= 600 - outputs.labels << [640, 460, "\"It's not a big deal, we take them back in the morning.\" - Jim", - 4, 1, 0, 0, 0, 255 * 600.ease(60)] - end - - outputs.sprites << [640 - 50, 360 - 50, 100, 100, - "sprites/square-green.png"] - - if state.tick_count == 800 + if state.tick_count == 120 state.scene = :game state.game_start_at = state.tick_count end @@ -89,7 +61,7 @@ class CleptoFrog def tick defaults - if state.scene == :intro && state.tick_count <= 800 + if state.scene == :intro && state.tick_count <= 120 render_intro elsif state.scene == :ending render_ending @@ -192,15 +164,15 @@ class CleptoFrog if state.god_mode # SHOW HIDE COLLISIONS - outputs.sprites << state.world.map do |x, y, w, h| - x = vx(x) - y = vy(y) + outputs.sprites << state.world.map do |rect| + x = vx(rect.x) + y = vy(rect.y) if x > -80 && x < 1280 && y > -80 && y < 720 { x: x, y: y, - w: vw(w || state.tile_size), - h: vh(h || state.tile_size), + w: vw(rect.w || state.tile_size), + h: vh(rect.h || state.tile_size), path: 'sprites/square-gray.png', a: 128 } @@ -223,8 +195,10 @@ class CleptoFrog # Creates sprite following mouse to help indicate which sprite you have selected - outputs.primitives << [inputs.mouse.position.x, inputs.mouse.position.y, - state.tile_size, state.tile_size, 'sprites/square-indigo.png', 0, 100].sprite + outputs.primitives << [inputs.mouse.position.x - 32 * state.camera_scale, + inputs.mouse.position.y - 32 * state.camera_scale, + state.tile_size * state.camera_scale, + state.tile_size * state.camera_scale, 'sprites/square-indigo.png', 0, 100].sprite end render_mini_map @@ -305,6 +279,29 @@ class CleptoFrog set_camera_scale 1 end + if inputs.mouse.click + state.id_seed += 1 + id = state.id_seed + x = state.camera_x + (inputs.mouse.click.x.fdiv(state.camera_scale) - 32) + y = state.camera_y + (inputs.mouse.click.y.fdiv(state.camera_scale) - 32) + x = ((x + 2).idiv 4) * 4 + y = ((y + 2).idiv 4) * 4 + w = 64 + h = 64 + candidate_rect = { id: id, x: x, y: y, w: w, h: h } + scaled_candidate_rect = { x: x + 30, y: y + 30, w: w - 60, h: h - 60 } + to_remove = state.world.find { |r| r.intersect_rect? scaled_candidate_rect } + if to_remove && args.inputs.keyboard.x + state.world.reject! { |r| r.id == to_remove.id } + else + state.world << candidate_rect + end + export_map + state.world_lookup = {} + state.world_collision_rects = nil + calc_world_lookup + end + if input_up? state.y += 10 state.dy = 0 @@ -326,12 +323,6 @@ class CleptoFrog if state.scene == :game process_inputs_player_movement process_inputs_god_mode - elsif state.scene == :intro - if args.inputs.keyboard.key_down.enter || args.inputs.keyboard.key_down.space - if Kernel.tick_count < 600 - Kernel.tick_count = 600 - end - end end end @@ -429,17 +420,6 @@ class CleptoFrog end end - def add_floors - # floors - state.world += [ - [0, 0, 10000, 40], - [0, 1670, 3250, 60], - [6691, 1653, 3290, 60], - [1521, 3792, 7370, 60], - [0, 5137, 3290, 60] - ] - end - def attempt_load_world_from_file return if state.world # exported_world = gtk.read_file(MAP_FILE_PATH) @@ -447,26 +427,11 @@ class CleptoFrog state.objects = [] if $collisions - $collisions.map do |x, y, w, h| - state.world << [x, y, w, h] + state.id_seed ||= 0 + $collisions.each do |x, y, w, h| + state.id_seed += 1 + state.world << { id: state.id_seed, x: x, y: y, w: w, h: h } end - - add_floors - # elsif exported_world - # exported_world.each_line.map do |l| - # tokens = l.strip.split(',') - # x = tokens[0].to_i - # y = tokens[1].to_i - # type = tokens[2].to_i - # if type == 1 - # state.world << [x, y, state.tile_size, state.tile_size] - # elsif type == 2 - # w, h, path = tokens[3..-1] - # state.objects << [x, y, w.to_i, h.to_i, path] - # end - # end - - # add_floors end if $mugs @@ -487,23 +452,24 @@ class CleptoFrog # Searches through the world and finds the cordinates that exist state.world_lookup = {} - state.world.each do |x, y, w, h| - state.world_lookup[[x, y, w || state.tile_size, h || state.tile_size]] = true + state.world.each do |rect| + state.world_lookup[rect.id] = rect end # Assigns collision rects for every sprite drawn state.world_collision_rects = state.world_lookup .keys - .map do |x, y, w, h| + .map do |key| + rect = state.world_lookup[key] s = state.tile_size - w ||= s - h ||= s + rect.w ||= s + rect.h ||= s { - args: [x, y, w, h], - left_right: [x, y + 4, w, h - 6], - top: [x + 4, y + 6, w - 8, h - 6], - bottom: [x + 1, y - 1, w - 2, h - 8], + args: rect, + left_right: { x: rect.x, y: rect.y + 4, w: rect.w, h: rect.h - 6 }, + top: { x: rect.x + 4, y: rect.y + 6, w: rect.w - 8, h: rect.h - 6 }, + bottom: { x: rect.x + 1, y: rect.y - 1, w: rect.w - 2, h: rect.h - 8 }, } end @@ -559,12 +525,21 @@ class CleptoFrog def end_of_tongue p = state.tongue_angle.vector(state.tongue_length) - [start_of_tongue.x + p.x, start_of_tongue.y + p.y] + { x: start_of_tongue.x + p.x, y: start_of_tongue.y + p.y } end def calc_shooting + calc_shooting_increment + calc_shooting_increment + calc_shooting_increment + calc_shooting_increment + calc_shooting_increment + calc_shooting_increment + end + + def calc_shooting_increment return unless state.action == :shooting - state.tongue_length += 30 + state.tongue_length += 5 potential_anchor = end_of_tongue if potential_anchor.x <= 0 state.anchor_point = potential_anchor @@ -583,9 +558,9 @@ class CleptoFrog state.action = :anchored outputs.sounds << 'sounds/attached.wav' else - anchor_rect = [potential_anchor.x - 5, potential_anchor.y - 5, 10, 10] + anchor_rect = { x: potential_anchor.x - 5, y: potential_anchor.y - 5, w: 10, h: 10 } collision = state.world_collision_rects.find_all do |v| - [v[:args].x, v[:args].y, v[:args].w, v[:args].h].intersect_rect?(anchor_rect) + v[:args].intersect_rect?(anchor_rect) end.first if collision state.anchor_point = potential_anchor @@ -681,7 +656,7 @@ class CleptoFrog .first return unless left_side_collisions - state.x = left_side_collisions[:left_right].right + state.x = left_side_collisions[:left_right].right + 1 state.dx = state.dy.abs * 0.8 state.collision_on_x = true end @@ -696,7 +671,7 @@ class CleptoFrog .first return unless right_side_collisions - state.x = right_side_collisions[:left_right].left - state.tile_size + state.x = right_side_collisions[:left_right].left - state.tile_size - 1 state.dx = state.dx.abs * 0.8 * -1 state.collision_on_x = true end @@ -712,7 +687,7 @@ class CleptoFrog .first return unless ceil_collisions - state.y = ceil_collisions[:bottom].y - state.tile_size + state.y = ceil_collisions[:bottom].y - state.tile_size - 1 state.dy = state.dy.abs * 0.8 * -1 state.collision_on_y = true end @@ -725,13 +700,17 @@ class CleptoFrog end def export_map - export_string = state.world.map do |x, y| - "#{x},#{y},1" - end + export_string = "$collisions = [\n" + export_string += state.world.map do |rect| + "[#{rect.x},#{rect.y},#{rect.w},#{rect.h}]," + end.join "\n" + export_string += "\n]\n\n" + export_string += "$mugs = [\n" export_string += state.objects.map do |x, y, w, h, path| - "#{x},#{y},2,#{w},#{h},#{path}" - end - gtk.write_file(MAP_FILE_PATH, export_string.join("\n")) + "[#{x},#{y},#{w},#{h},'#{path}']," + end.join "\n" + export_string += "\n]\n\n" + gtk.write_file(MAP_FILE_PATH, export_string) state.map_saved_at = state.tick_count end diff --git a/samples/99_genre_platformer/clepto_frog/app/map.rb b/samples/99_genre_platformer/clepto_frog/app/map.rb index c048c82..a504ff9 100644 --- a/samples/99_genre_platformer/clepto_frog/app/map.rb +++ b/samples/99_genre_platformer/clepto_frog/app/map.rb @@ -989,6 +989,11 @@ $collisions = [ [4459, 3997, 64, 64], [76, 5215, 64, 64], [39, 5217, 64, 64], + [0, 0, 10000, 40], + [0, 1670, 3250, 60], + [6691, 1653, 3290, 60], + [1521, 3792, 7370, 60], + [0, 5137, 3290, 60] ] $mugs = [ diff --git a/samples/99_genre_platformer/clepto_frog/replay.txt b/samples/99_genre_platformer/clepto_frog/replay.txt new file mode 100644 index 0000000..8662d31 --- /dev/null +++ b/samples/99_genre_platformer/clepto_frog/replay.txt @@ -0,0 +1,249 @@ +replay_version 2.0 +stopped_at 1097 +seed 100 +recorded_at 2021-11-20 11:32:38 -0600 +[:mouse_button_up, 1, 0, 1, 1, 4] +[:key_down_raw, 1073741903, 0, 2, 2, 157] +[:key_down_raw, 1073741903, 0, 2, 3, 171] +[:key_down_raw, 1073741903, 0, 2, 4, 174] +[:key_down_raw, 1073741903, 0, 2, 5, 176] +[:key_down_raw, 1073741903, 0, 2, 6, 177] +[:key_down_raw, 1073741903, 0, 2, 7, 179] +[:key_down_raw, 1073741903, 0, 2, 8, 181] +[:key_down_raw, 1073741903, 0, 2, 9, 182] +[:key_down_raw, 1073741903, 0, 2, 10, 185] +[:key_up_raw, 1073741903, 0, 2, 11, 185] +[:key_down_raw, 32, 0, 2, 12, 187] +[:key_up_raw, 32, 0, 2, 13, 190] +[:key_down_raw, 1073741906, 0, 2, 14, 231] +[:key_down_raw, 1073741903, 0, 2, 15, 239] +[:key_down_raw, 1073741903, 0, 2, 16, 252] +[:key_down_raw, 1073741903, 0, 2, 17, 254] +[:key_down_raw, 1073741903, 0, 2, 18, 256] +[:key_down_raw, 1073741903, 0, 2, 19, 258] +[:key_down_raw, 1073741903, 0, 2, 20, 259] +[:key_down_raw, 1073741903, 0, 2, 21, 261] +[:key_down_raw, 1073741903, 0, 2, 22, 263] +[:key_down_raw, 1073741903, 0, 2, 23, 265] +[:key_down_raw, 1073741903, 0, 2, 24, 267] +[:key_down_raw, 1073741903, 0, 2, 25, 269] +[:key_down_raw, 1073741903, 0, 2, 26, 271] +[:key_down_raw, 1073741903, 0, 2, 27, 273] +[:key_down_raw, 1073741903, 0, 2, 28, 274] +[:key_down_raw, 1073741903, 0, 2, 29, 276] +[:key_down_raw, 1073741903, 0, 2, 30, 278] +[:key_down_raw, 1073741903, 0, 2, 31, 280] +[:key_down_raw, 1073741903, 0, 2, 32, 282] +[:key_down_raw, 1073741903, 0, 2, 33, 284] +[:key_down_raw, 1073741903, 0, 2, 34, 286] +[:key_down_raw, 1073741903, 0, 2, 35, 287] +[:key_down_raw, 1073741903, 0, 2, 36, 289] +[:key_down_raw, 1073741903, 0, 2, 37, 291] +[:key_down_raw, 1073741903, 0, 2, 38, 293] +[:key_down_raw, 1073741903, 0, 2, 39, 295] +[:key_down_raw, 1073741903, 0, 2, 40, 296] +[:key_down_raw, 1073741903, 0, 2, 41, 298] +[:key_down_raw, 1073741903, 0, 2, 42, 300] +[:key_down_raw, 1073741903, 0, 2, 43, 302] +[:key_down_raw, 1073741903, 0, 2, 44, 303] +[:key_down_raw, 1073741903, 0, 2, 45, 305] +[:key_down_raw, 1073741903, 0, 2, 46, 307] +[:key_down_raw, 1073741903, 0, 2, 47, 309] +[:key_down_raw, 1073741903, 0, 2, 48, 310] +[:key_down_raw, 1073741903, 0, 2, 49, 312] +[:key_down_raw, 1073741903, 0, 2, 50, 314] +[:key_down_raw, 1073741903, 0, 2, 51, 316] +[:key_down_raw, 1073741903, 0, 2, 52, 318] +[:key_down_raw, 1073741903, 0, 2, 53, 320] +[:key_down_raw, 1073741903, 0, 2, 54, 322] +[:key_down_raw, 1073741903, 0, 2, 55, 324] +[:key_down_raw, 1073741903, 0, 2, 56, 326] +[:key_down_raw, 1073741903, 0, 2, 57, 328] +[:key_down_raw, 1073741903, 0, 2, 58, 330] +[:key_down_raw, 1073741903, 0, 2, 59, 332] +[:key_down_raw, 1073741903, 0, 2, 60, 334] +[:key_down_raw, 1073741903, 0, 2, 61, 336] +[:key_down_raw, 1073741903, 0, 2, 62, 338] +[:key_down_raw, 1073741903, 0, 2, 63, 340] +[:key_down_raw, 1073741903, 0, 2, 64, 342] +[:key_down_raw, 1073741903, 0, 2, 65, 344] +[:key_down_raw, 1073741903, 0, 2, 66, 345] +[:key_down_raw, 1073741903, 0, 2, 67, 347] +[:key_down_raw, 1073741903, 0, 2, 68, 349] +[:key_up_raw, 1073741906, 0, 2, 69, 351] +[:key_down_raw, 1073741903, 0, 2, 70, 351] +[:key_down_raw, 1073741903, 0, 2, 71, 353] +[:key_down_raw, 1073741903, 0, 2, 72, 355] +[:key_down_raw, 1073741903, 0, 2, 73, 357] +[:key_down_raw, 1073741903, 0, 2, 74, 359] +[:key_down_raw, 1073741903, 0, 2, 75, 361] +[:key_down_raw, 1073741903, 0, 2, 76, 363] +[:key_down_raw, 1073741903, 0, 2, 77, 365] +[:key_down_raw, 1073741903, 0, 2, 78, 367] +[:key_down_raw, 1073741903, 0, 2, 79, 369] +[:key_down_raw, 1073741903, 0, 2, 80, 371] +[:key_down_raw, 1073741903, 0, 2, 81, 373] +[:key_down_raw, 1073741903, 0, 2, 82, 375] +[:key_down_raw, 1073741903, 0, 2, 83, 376] +[:key_down_raw, 1073741903, 0, 2, 84, 378] +[:key_down_raw, 1073741903, 0, 2, 85, 380] +[:key_down_raw, 1073741903, 0, 2, 86, 382] +[:key_down_raw, 1073741903, 0, 2, 87, 384] +[:key_down_raw, 1073741903, 0, 2, 88, 386] +[:key_down_raw, 1073741906, 0, 2, 89, 386] +[:key_down_raw, 1073741906, 0, 2, 90, 400] +[:key_down_raw, 1073741906, 0, 2, 91, 402] +[:key_down_raw, 1073741906, 0, 2, 92, 404] +[:key_down_raw, 1073741906, 0, 2, 93, 405] +[:key_down_raw, 1073741906, 0, 2, 94, 407] +[:key_down_raw, 1073741906, 0, 2, 95, 409] +[:key_down_raw, 1073741906, 0, 2, 96, 411] +[:key_down_raw, 1073741906, 0, 2, 97, 413] +[:key_down_raw, 1073741906, 0, 2, 98, 415] +[:key_down_raw, 1073741906, 0, 2, 99, 417] +[:key_down_raw, 1073741906, 0, 2, 100, 419] +[:key_down_raw, 1073741906, 0, 2, 101, 421] +[:key_down_raw, 1073741906, 0, 2, 102, 422] +[:key_down_raw, 1073741906, 0, 2, 103, 424] +[:key_down_raw, 1073741906, 0, 2, 104, 426] +[:key_down_raw, 1073741906, 0, 2, 105, 428] +[:key_down_raw, 1073741906, 0, 2, 106, 430] +[:key_down_raw, 1073741906, 0, 2, 107, 432] +[:key_down_raw, 1073741906, 0, 2, 108, 434] +[:key_down_raw, 32, 0, 2, 109, 434] +[:key_up_raw, 32, 0, 2, 110, 442] +[:key_up_raw, 1073741906, 0, 2, 111, 460] +[:key_up_raw, 1073741903, 0, 2, 112, 576] +[:key_down_raw, 1073741903, 0, 2, 113, 588] +[:key_down_raw, 1073741903, 0, 2, 114, 602] +[:key_down_raw, 1073741903, 0, 2, 115, 604] +[:key_down_raw, 1073741903, 0, 2, 116, 606] +[:key_down_raw, 1073741903, 0, 2, 117, 608] +[:key_down_raw, 1073741903, 0, 2, 118, 610] +[:key_down_raw, 1073741903, 0, 2, 119, 612] +[:key_down_raw, 1073741903, 0, 2, 120, 614] +[:key_down_raw, 1073741903, 0, 2, 121, 616] +[:key_down_raw, 1073741903, 0, 2, 122, 617] +[:key_down_raw, 1073741903, 0, 2, 123, 619] +[:key_down_raw, 1073741903, 0, 2, 124, 621] +[:key_down_raw, 1073741903, 0, 2, 125, 623] +[:key_down_raw, 1073741903, 0, 2, 126, 624] +[:key_down_raw, 1073741903, 0, 2, 127, 626] +[:key_down_raw, 1073741903, 0, 2, 128, 628] +[:key_down_raw, 1073741903, 0, 2, 129, 630] +[:key_down_raw, 1073741903, 0, 2, 130, 632] +[:key_down_raw, 1073741903, 0, 2, 131, 634] +[:key_down_raw, 1073741903, 0, 2, 132, 636] +[:key_down_raw, 1073741903, 0, 2, 133, 638] +[:key_down_raw, 1073741903, 0, 2, 134, 640] +[:key_down_raw, 1073741903, 0, 2, 135, 641] +[:key_down_raw, 1073741903, 0, 2, 136, 643] +[:key_down_raw, 1073741903, 0, 2, 137, 645] +[:key_down_raw, 1073741903, 0, 2, 138, 647] +[:key_down_raw, 1073741903, 0, 2, 139, 649] +[:key_down_raw, 1073741903, 0, 2, 140, 651] +[:key_down_raw, 1073741903, 0, 2, 141, 653] +[:key_down_raw, 1073741903, 0, 2, 142, 655] +[:key_down_raw, 1073741903, 0, 2, 143, 656] +[:key_down_raw, 1073741903, 0, 2, 144, 658] +[:key_down_raw, 1073741903, 0, 2, 145, 660] +[:key_down_raw, 1073741903, 0, 2, 146, 662] +[:key_down_raw, 1073741903, 0, 2, 147, 664] +[:key_down_raw, 1073741903, 0, 2, 148, 666] +[:key_down_raw, 1073741903, 0, 2, 149, 668] +[:key_down_raw, 1073741903, 0, 2, 150, 670] +[:key_down_raw, 1073741903, 0, 2, 151, 672] +[:key_down_raw, 1073741903, 0, 2, 152, 674] +[:key_down_raw, 1073741903, 0, 2, 153, 676] +[:key_down_raw, 1073741903, 0, 2, 154, 678] +[:key_down_raw, 1073741903, 0, 2, 155, 680] +[:key_down_raw, 1073741903, 0, 2, 156, 681] +[:key_down_raw, 1073741903, 0, 2, 157, 683] +[:key_down_raw, 32, 0, 2, 158, 684] +[:key_up_raw, 1073741903, 0, 2, 159, 686] +[:key_up_raw, 32, 0, 2, 160, 689] +[:key_down_raw, 1073741904, 0, 2, 161, 692] +[:key_down_raw, 1073741904, 0, 2, 162, 704] +[:key_down_raw, 1073741904, 0, 2, 163, 706] +[:key_down_raw, 1073741904, 0, 2, 164, 707] +[:key_down_raw, 1073741904, 0, 2, 165, 709] +[:key_down_raw, 1073741904, 0, 2, 166, 711] +[:key_down_raw, 1073741904, 0, 2, 167, 713] +[:key_down_raw, 1073741904, 0, 2, 168, 715] +[:key_up_raw, 1073741904, 0, 2, 169, 717] +[:key_down_raw, 32, 0, 2, 170, 769] +[:key_up_raw, 32, 0, 2, 171, 775] +[:key_down_raw, 1073741904, 0, 2, 172, 785] +[:key_down_raw, 1073741904, 0, 2, 173, 799] +[:key_down_raw, 1073741904, 0, 2, 174, 801] +[:key_down_raw, 1073741904, 0, 2, 175, 803] +[:key_down_raw, 1073741904, 0, 2, 176, 805] +[:key_down_raw, 1073741904, 0, 2, 177, 807] +[:key_down_raw, 1073741904, 0, 2, 178, 810] +[:key_down_raw, 1073741904, 0, 2, 179, 812] +[:key_down_raw, 1073741904, 0, 2, 180, 814] +[:key_down_raw, 1073741904, 0, 2, 181, 816] +[:key_down_raw, 1073741904, 0, 2, 182, 818] +[:key_down_raw, 1073741904, 0, 2, 183, 820] +[:key_down_raw, 1073741904, 0, 2, 184, 822] +[:key_down_raw, 1073741904, 0, 2, 185, 824] +[:key_down_raw, 1073741904, 0, 2, 186, 826] +[:key_down_raw, 1073741904, 0, 2, 187, 828] +[:key_down_raw, 1073741904, 0, 2, 188, 830] +[:key_down_raw, 1073741904, 0, 2, 189, 832] +[:key_down_raw, 1073741904, 0, 2, 190, 834] +[:key_down_raw, 1073741904, 0, 2, 191, 836] +[:key_down_raw, 1073741904, 0, 2, 192, 838] +[:key_down_raw, 1073741904, 0, 2, 193, 840] +[:key_down_raw, 1073741904, 0, 2, 194, 841] +[:key_down_raw, 1073741904, 0, 2, 195, 843] +[:key_down_raw, 1073741904, 0, 2, 196, 845] +[:key_down_raw, 1073741904, 0, 2, 197, 847] +[:key_down_raw, 1073741904, 0, 2, 198, 849] +[:key_down_raw, 1073741904, 0, 2, 199, 851] +[:key_down_raw, 1073741904, 0, 2, 200, 853] +[:key_down_raw, 1073741904, 0, 2, 201, 855] +[:key_down_raw, 1073741904, 0, 2, 202, 857] +[:key_down_raw, 1073741904, 0, 2, 203, 859] +[:key_down_raw, 1073741904, 0, 2, 204, 861] +[:key_down_raw, 1073741904, 0, 2, 205, 863] +[:key_down_raw, 1073741904, 0, 2, 206, 864] +[:key_down_raw, 1073741904, 0, 2, 207, 866] +[:key_down_raw, 1073741904, 0, 2, 208, 868] +[:key_down_raw, 1073741904, 0, 2, 209, 870] +[:key_down_raw, 1073741904, 0, 2, 210, 872] +[:key_down_raw, 1073741904, 0, 2, 211, 874] +[:key_down_raw, 1073741904, 0, 2, 212, 876] +[:key_down_raw, 1073741904, 0, 2, 213, 878] +[:key_down_raw, 1073741904, 0, 2, 214, 880] +[:key_down_raw, 1073741904, 0, 2, 215, 882] +[:key_down_raw, 1073741904, 0, 2, 216, 884] +[:key_down_raw, 1073741904, 0, 2, 217, 886] +[:key_down_raw, 1073741904, 0, 2, 218, 887] +[:key_down_raw, 1073741904, 0, 2, 219, 889] +[:key_down_raw, 1073741904, 0, 2, 220, 891] +[:key_down_raw, 1073741904, 0, 2, 221, 893] +[:key_down_raw, 1073741904, 0, 2, 222, 895] +[:key_down_raw, 1073741904, 0, 2, 223, 897] +[:key_down_raw, 1073741904, 0, 2, 224, 899] +[:key_down_raw, 1073741904, 0, 2, 225, 901] +[:key_down_raw, 1073741904, 0, 2, 226, 903] +[:key_down_raw, 1073741904, 0, 2, 227, 905] +[:key_down_raw, 1073741904, 0, 2, 228, 907] +[:key_down_raw, 1073741904, 0, 2, 229, 909] +[:key_down_raw, 1073741904, 0, 2, 230, 911] +[:key_down_raw, 1073741904, 0, 2, 231, 913] +[:key_down_raw, 1073741904, 0, 2, 232, 915] +[:key_down_raw, 1073741904, 0, 2, 233, 917] +[:key_down_raw, 1073741904, 0, 2, 234, 919] +[:key_down_raw, 1073741904, 0, 2, 235, 921] +[:key_down_raw, 1073741904, 0, 2, 236, 923] +[:key_down_raw, 1073741904, 0, 2, 237, 925] +[:key_down_raw, 1073741904, 0, 2, 238, 927] +[:key_down_raw, 1073741904, 0, 2, 239, 929] +[:key_up_raw, 1073741904, 0, 2, 240, 930] +[:key_down_raw, 1073741904, 0, 2, 241, 1024] +[:key_up_raw, 1073741904, 0, 2, 242, 1036] +[:key_down_raw, 96, 0, 2, 243, 1046] +[:key_up_raw, 96, 0, 2, 244, 1050] +[:key_down_raw, 13, 0, 2, 245, 1097] diff --git a/samples/99_genre_platformer/the_little_probe/app/main.rb b/samples/99_genre_platformer/the_little_probe/app/main.rb index 8fcf279..9d43ce6 100644 --- a/samples/99_genre_platformer/the_little_probe/app/main.rb +++ b/samples/99_genre_platformer/the_little_probe/app/main.rb @@ -394,6 +394,7 @@ class FallingCircle end def load_lines file + return unless state.snaps data = gtk.read_file(file) || "" data.each_line .reject { |l| l.strip.length == 0 } @@ -452,10 +453,10 @@ class FallingCircle 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| + results[:impacts] = terrain.find_all { |t| t && (line_near_rect? results[:rect], t) }.map do |t| { terrain: t, - point: geometry.line_intersect(results[:trajectory], t), + point: geometry.line_intersect(results[:trajectory], t, replace_infinity: 1000), type: :terrain } end.reject { |t| !point_within_line? t[:point], t[:terrain] } @@ -463,10 +464,10 @@ class FallingCircle results[:impacts] += lava.find_all { |t| line_near_rect? results[:rect], t }.map do |t| { terrain: t, - point: geometry.line_intersect(results[:trajectory], t), + point: geometry.line_intersect(results[:trajectory], t, replace_infinity: 1000), type: :lava } - end.reject { |t| !point_within_line? t[:point], t[:terrain] } + end.reject { |t| !t || (!point_within_line? t[:point], t[:terrain]) } results end @@ -479,6 +480,7 @@ class FallingCircle end def calc_terrains_to_monitor + return unless circle.impacts circle.impact = nil circle.impacts.each do |i| circle.terrains_to_monitor[i[:terrain]] ||= { diff --git a/samples/99_genre_platformer/the_little_probe/bug-replay.txt b/samples/99_genre_platformer/the_little_probe/bug-replay.txt new file mode 100644 index 0000000..378d3c3 --- /dev/null +++ b/samples/99_genre_platformer/the_little_probe/bug-replay.txt @@ -0,0 +1,205 @@ +replay_version 2.0 +stopped_at 2085 +seed 100 +recorded_at 2021-11-20 11:34:07 -0600 +[:mouse_button_up, 1, 0, 1, 1, 1] +[:mouse_move, 803, 93, 2, 2, 31] +[:mouse_move, 811, 93, 2, 3, 32] +[:key_down_raw, 1073741903, 0, 2, 4, 123] +[:key_down_raw, 1073741903, 0, 2, 5, 137] +[:key_down_raw, 1073741903, 0, 2, 6, 139] +[:key_down_raw, 1073741903, 0, 2, 7, 141] +[:key_down_raw, 1073741903, 0, 2, 8, 143] +[:key_down_raw, 1073741903, 0, 2, 9, 145] +[:key_down_raw, 1073741903, 0, 2, 10, 147] +[:key_down_raw, 1073741903, 0, 2, 11, 149] +[:key_up_raw, 1073741903, 0, 2, 12, 150] +[:key_down_raw, 32, 0, 2, 13, 171] +[:key_down_raw, 32, 0, 2, 14, 186] +[:key_down_raw, 32, 0, 2, 15, 189] +[:key_down_raw, 32, 0, 2, 16, 190] +[:key_down_raw, 32, 0, 2, 17, 192] +[:key_down_raw, 32, 0, 2, 18, 194] +[:key_down_raw, 32, 0, 2, 19, 196] +[:key_down_raw, 32, 0, 2, 20, 198] +[:key_down_raw, 32, 0, 2, 21, 200] +[:key_down_raw, 32, 0, 2, 22, 202] +[:key_down_raw, 32, 0, 2, 23, 204] +[:key_down_raw, 32, 0, 2, 24, 206] +[:key_down_raw, 32, 0, 2, 25, 208] +[:key_down_raw, 32, 0, 2, 26, 210] +[:key_down_raw, 32, 0, 2, 27, 212] +[:key_down_raw, 32, 0, 2, 28, 214] +[:key_down_raw, 32, 0, 2, 29, 216] +[:key_down_raw, 32, 0, 2, 30, 218] +[:key_down_raw, 32, 0, 2, 31, 221] +[:key_down_raw, 32, 0, 2, 32, 222] +[:key_down_raw, 32, 0, 2, 33, 224] +[:key_down_raw, 32, 0, 2, 34, 227] +[:key_down_raw, 32, 0, 2, 35, 229] +[:key_down_raw, 32, 0, 2, 36, 231] +[:key_down_raw, 32, 0, 2, 37, 233] +[:key_down_raw, 32, 0, 2, 38, 235] +[:key_down_raw, 32, 0, 2, 39, 237] +[:key_down_raw, 32, 0, 2, 40, 239] +[:key_down_raw, 32, 0, 2, 41, 241] +[:key_down_raw, 32, 0, 2, 42, 243] +[:key_down_raw, 32, 0, 2, 43, 245] +[:key_down_raw, 32, 0, 2, 44, 247] +[:key_down_raw, 32, 0, 2, 45, 249] +[:key_down_raw, 32, 0, 2, 46, 251] +[:key_down_raw, 32, 0, 2, 47, 253] +[:key_down_raw, 32, 0, 2, 48, 255] +[:key_down_raw, 32, 0, 2, 49, 257] +[:key_down_raw, 32, 0, 2, 50, 259] +[:key_down_raw, 32, 0, 2, 51, 261] +[:key_down_raw, 32, 0, 2, 52, 263] +[:key_down_raw, 32, 0, 2, 53, 265] +[:key_down_raw, 32, 0, 2, 54, 267] +[:key_down_raw, 32, 0, 2, 55, 269] +[:key_down_raw, 32, 0, 2, 56, 271] +[:key_down_raw, 1073741903, 0, 2, 57, 272] +[:key_up_raw, 1073741903, 0, 2, 58, 284] +[:key_up_raw, 32, 0, 2, 59, 350] +[:key_down_raw, 1073741904, 0, 2, 60, 611] +[:key_down_raw, 1073741904, 0, 2, 61, 626] +[:key_down_raw, 1073741904, 0, 2, 62, 628] +[:key_down_raw, 1073741904, 0, 2, 63, 630] +[:key_down_raw, 1073741904, 0, 2, 64, 632] +[:key_down_raw, 1073741904, 0, 2, 65, 634] +[:key_down_raw, 1073741904, 0, 2, 66, 636] +[:key_up_raw, 1073741904, 0, 2, 67, 636] +[:key_down_raw, 32, 0, 2, 68, 640] +[:key_down_raw, 32, 0, 2, 69, 655] +[:key_down_raw, 32, 0, 2, 70, 657] +[:key_down_raw, 32, 0, 2, 71, 659] +[:key_down_raw, 32, 0, 2, 72, 661] +[:key_down_raw, 32, 0, 2, 73, 663] +[:key_down_raw, 32, 0, 2, 74, 665] +[:key_down_raw, 1073741903, 0, 2, 75, 666] +[:key_up_raw, 1073741903, 0, 2, 76, 672] +[:key_down_raw, 1073741903, 0, 2, 77, 703] +[:key_down_raw, 1073741903, 0, 2, 78, 717] +[:key_up_raw, 1073741903, 0, 2, 79, 717] +[:key_down_raw, 1073741903, 0, 2, 80, 736] +[:key_up_raw, 1073741903, 0, 2, 81, 741] +[:key_up_raw, 32, 0, 2, 82, 798] +[:key_down_raw, 1073741903, 0, 2, 83, 861] +[:key_down_raw, 1073741903, 0, 2, 84, 876] +[:key_down_raw, 1073741903, 0, 2, 85, 878] +[:key_down_raw, 1073741903, 0, 2, 86, 880] +[:key_down_raw, 1073741903, 0, 2, 87, 882] +[:key_down_raw, 1073741903, 0, 2, 88, 884] +[:key_up_raw, 1073741903, 0, 2, 89, 886] +[:key_down_raw, 1073741903, 0, 2, 90, 1063] +[:key_down_raw, 1073741903, 0, 2, 91, 1079] +[:key_down_raw, 1073741903, 0, 2, 92, 1081] +[:key_down_raw, 1073741903, 0, 2, 93, 1083] +[:key_down_raw, 1073741903, 0, 2, 94, 1085] +[:key_down_raw, 1073741903, 0, 2, 95, 1086] +[:key_down_raw, 1073741903, 0, 2, 96, 1088] +[:key_down_raw, 1073741903, 0, 2, 97, 1090] +[:key_down_raw, 1073741903, 0, 2, 98, 1092] +[:key_down_raw, 1073741903, 0, 2, 99, 1094] +[:key_down_raw, 1073741903, 0, 2, 100, 1096] +[:key_down_raw, 1073741903, 0, 2, 101, 1098] +[:key_down_raw, 1073741903, 0, 2, 102, 1100] +[:key_down_raw, 1073741903, 0, 2, 103, 1102] +[:key_down_raw, 1073741903, 0, 2, 104, 1104] +[:key_down_raw, 1073741903, 0, 2, 105, 1106] +[:key_down_raw, 1073741903, 0, 2, 106, 1109] +[:key_down_raw, 1073741903, 0, 2, 107, 1111] +[:key_down_raw, 1073741903, 0, 2, 108, 1113] +[:key_down_raw, 1073741903, 0, 2, 109, 1115] +[:key_down_raw, 1073741903, 0, 2, 110, 1117] +[:key_down_raw, 1073741903, 0, 2, 111, 1119] +[:key_down_raw, 1073741903, 0, 2, 112, 1121] +[:key_down_raw, 1073741903, 0, 2, 113, 1122] +[:key_down_raw, 1073741903, 0, 2, 114, 1125] +[:key_down_raw, 1073741903, 0, 2, 115, 1127] +[:key_down_raw, 1073741903, 0, 2, 116, 1128] +[:key_down_raw, 1073741903, 0, 2, 117, 1131] +[:key_down_raw, 1073741903, 0, 2, 118, 1132] +[:key_down_raw, 1073741903, 0, 2, 119, 1134] +[:key_down_raw, 1073741903, 0, 2, 120, 1136] +[:key_down_raw, 1073741903, 0, 2, 121, 1138] +[:key_down_raw, 1073741903, 0, 2, 122, 1140] +[:key_down_raw, 1073741903, 0, 2, 123, 1142] +[:key_up_raw, 1073741903, 0, 2, 124, 1142] +[:key_down_raw, 32, 0, 2, 125, 1208] +[:key_down_raw, 32, 0, 2, 126, 1223] +[:key_down_raw, 32, 0, 2, 127, 1225] +[:key_down_raw, 1073741903, 0, 2, 128, 1226] +[:key_up_raw, 1073741903, 0, 2, 129, 1236] +[:key_down_raw, 1073741904, 0, 2, 130, 1253] +[:key_up_raw, 1073741904, 0, 2, 131, 1266] +[:key_down_raw, 1073741903, 0, 2, 132, 1324] +[:key_up_raw, 1073741903, 0, 2, 133, 1330] +[:key_down_raw, 1073741903, 0, 2, 134, 1414] +[:key_up_raw, 1073741903, 0, 2, 135, 1417] +[:key_up_raw, 32, 0, 2, 136, 1441] +[:mouse_move, 812, 92, 2, 137, 1607] +[:mouse_move, 818, 92, 2, 138, 1608] +[:mouse_move, 818, 91, 2, 139, 1614] +[:mouse_move, 818, 90, 2, 140, 1622] +[:mouse_move, 813, 89, 2, 141, 1623] +[:mouse_move, 801, 86, 2, 142, 1624] +[:mouse_move, 786, 83, 2, 143, 1625] +[:mouse_move, 770, 82, 2, 144, 1626] +[:mouse_move, 756, 82, 2, 145, 1627] +[:mouse_move, 745, 82, 2, 146, 1628] +[:mouse_move, 738, 82, 2, 147, 1629] +[:mouse_move, 731, 83, 2, 148, 1630] +[:mouse_move, 724, 84, 2, 149, 1631] +[:mouse_move, 712, 85, 2, 150, 1632] +[:mouse_move, 707, 87, 2, 151, 1633] +[:mouse_move, 702, 89, 2, 152, 1634] +[:mouse_move, 699, 95, 2, 153, 1635] +[:mouse_move, 693, 102, 2, 154, 1636] +[:mouse_move, 687, 110, 2, 155, 1637] +[:mouse_move, 680, 118, 2, 156, 1638] +[:mouse_move, 671, 125, 2, 157, 1639] +[:mouse_move, 659, 132, 2, 158, 1640] +[:mouse_move, 645, 142, 2, 159, 1641] +[:mouse_move, 632, 153, 2, 160, 1642] +[:mouse_move, 616, 164, 2, 161, 1643] +[:mouse_move, 583, 184, 2, 162, 1644] +[:mouse_move, 554, 198, 2, 163, 1645] +[:mouse_move, 519, 212, 2, 164, 1646] +[:mouse_move, 480, 224, 2, 165, 1647] +[:mouse_move, 445, 234, 2, 166, 1648] +[:mouse_move, 414, 246, 2, 167, 1649] +[:mouse_move, 393, 265, 2, 168, 1650] +[:mouse_move, 388, 276, 2, 169, 1651] +[:mouse_move, 386, 272, 2, 170, 1665] +[:mouse_move, 380, 272, 2, 171, 1666] +[:mouse_move, 366, 272, 2, 172, 1667] +[:mouse_move, 336, 266, 2, 173, 1668] +[:mouse_move, 313, 262, 2, 174, 1669] +[:mouse_move, 294, 258, 2, 175, 1670] +[:mouse_move, 278, 255, 2, 176, 1671] +[:mouse_move, 268, 254, 2, 177, 1672] +[:mouse_move, 263, 253, 2, 178, 1673] +[:mouse_move, 261, 252, 2, 179, 1674] +[:mouse_move, 260, 251, 2, 180, 1675] +[:mouse_move, 258, 250, 2, 181, 1676] +[:mouse_move, 256, 249, 2, 182, 1677] +[:mouse_move, 252, 249, 2, 183, 1678] +[:mouse_move, 251, 249, 2, 184, 1679] +[:mouse_move, 248, 249, 2, 185, 1680] +[:mouse_move, 246, 248, 2, 186, 1681] +[:mouse_move, 242, 247, 2, 187, 1682] +[:mouse_move, 234, 247, 2, 188, 1683] +[:mouse_move, 231, 247, 2, 189, 1684] +[:mouse_move, 230, 247, 2, 190, 1685] +[:mouse_move, 230, 246, 2, 191, 1688] +[:mouse_move, 229, 246, 2, 192, 1691] +[:mouse_move, 228, 246, 2, 193, 1692] +[:mouse_move, 227, 246, 2, 194, 1702] +[:mouse_move, 228, 246, 2, 195, 1834] +[:mouse_move, 229, 246, 2, 196, 1898] +[:mouse_move, 229, 245, 2, 197, 1968] +[:key_down_raw, 96, 0, 2, 198, 2024] +[:mouse_move, 230, 245, 2, 199, 2027] +[:key_up_raw, 96, 0, 2, 200, 2028] +[:key_down_raw, 13, 0, 2, 201, 2085] diff --git a/samples/99_genre_rpg_roguelike/01_roguelike_starting_point/replay.txt b/samples/99_genre_rpg_roguelike/01_roguelike_starting_point/replay.txt new file mode 100644 index 0000000..d75d454 --- /dev/null +++ b/samples/99_genre_rpg_roguelike/01_roguelike_starting_point/replay.txt @@ -0,0 +1,196 @@ +replay_version 2.0 +stopped_at 697 +seed 100 +recorded_at 2021-11-20 11:36:12 -0600 +[:mouse_button_up, 1, 0, 1, 1, 4] +[:mouse_move, 793, 90, 2, 2, 24] +[:mouse_move, 799, 95, 2, 3, 25] +[:mouse_move, 809, 104, 2, 4, 26] +[:mouse_move, 818, 111, 2, 5, 27] +[:mouse_move, 832, 118, 2, 6, 28] +[:mouse_move, 843, 123, 2, 7, 29] +[:mouse_move, 849, 126, 2, 8, 30] +[:key_down_raw, 1073741903, 0, 2, 9, 89] +[:key_up_raw, 1073741903, 0, 2, 10, 94] +[:key_down_raw, 1073741903, 0, 2, 11, 98] +[:key_up_raw, 1073741903, 0, 2, 12, 105] +[:key_down_raw, 1073741903, 0, 2, 13, 108] +[:key_down_raw, 1073741906, 0, 2, 14, 116] +[:key_up_raw, 1073741903, 0, 2, 15, 117] +[:key_up_raw, 1073741906, 0, 2, 16, 121] +[:key_down_raw, 1073741906, 0, 2, 17, 126] +[:key_up_raw, 1073741906, 0, 2, 18, 128] +[:key_down_raw, 1073741906, 0, 2, 19, 135] +[:key_up_raw, 1073741906, 0, 2, 20, 138] +[:key_down_raw, 1073741906, 0, 2, 21, 143] +[:key_up_raw, 1073741906, 0, 2, 22, 147] +[:key_down_raw, 1073741906, 0, 2, 23, 152] +[:key_up_raw, 1073741906, 0, 2, 24, 156] +[:key_down_raw, 1073741906, 0, 2, 25, 162] +[:key_up_raw, 1073741906, 0, 2, 26, 167] +[:key_down_raw, 1073741903, 0, 2, 27, 171] +[:key_up_raw, 1073741903, 0, 2, 28, 177] +[:key_down_raw, 1073741903, 0, 2, 29, 181] +[:key_up_raw, 1073741903, 0, 2, 30, 187] +[:key_down_raw, 1073741903, 0, 2, 31, 190] +[:key_up_raw, 1073741903, 0, 2, 32, 197] +[:key_down_raw, 1073741903, 0, 2, 33, 200] +[:key_up_raw, 1073741903, 0, 2, 34, 212] +[:key_down_raw, 1073741906, 0, 2, 35, 214] +[:key_up_raw, 1073741906, 0, 2, 36, 218] +[:key_down_raw, 1073741906, 0, 2, 37, 224] +[:key_up_raw, 1073741906, 0, 2, 38, 227] +[:key_down_raw, 1073741906, 0, 2, 39, 233] +[:key_up_raw, 1073741906, 0, 2, 40, 238] +[:key_down_raw, 1073741906, 0, 2, 41, 243] +[:key_up_raw, 1073741906, 0, 2, 42, 247] +[:key_down_raw, 1073741903, 0, 2, 43, 252] +[:key_up_raw, 1073741903, 0, 2, 44, 259] +[:key_down_raw, 1073741903, 0, 2, 45, 264] +[:key_up_raw, 1073741903, 0, 2, 46, 269] +[:key_down_raw, 1073741903, 0, 2, 47, 274] +[:key_up_raw, 1073741903, 0, 2, 48, 279] +[:key_down_raw, 1073741903, 0, 2, 49, 283] +[:key_up_raw, 1073741903, 0, 2, 50, 289] +[:key_down_raw, 1073741903, 0, 2, 51, 294] +[:key_up_raw, 1073741903, 0, 2, 52, 300] +[:key_down_raw, 1073741905, 0, 2, 53, 308] +[:key_up_raw, 1073741905, 0, 2, 54, 313] +[:key_down_raw, 1073741903, 0, 2, 55, 323] +[:key_up_raw, 1073741903, 0, 2, 56, 333] +[:key_down_raw, 1073741906, 0, 2, 57, 360] +[:key_up_raw, 1073741906, 0, 2, 58, 364] +[:key_down_raw, 1073741906, 0, 2, 59, 369] +[:key_up_raw, 1073741906, 0, 2, 60, 374] +[:key_down_raw, 1073741906, 0, 2, 61, 379] +[:key_up_raw, 1073741906, 0, 2, 62, 383] +[:mouse_move, 868, 122, 2, 63, 418] +[:mouse_move, 879, 121, 2, 64, 419] +[:mouse_move, 882, 120, 2, 65, 420] +[:mouse_move, 876, 120, 2, 66, 426] +[:mouse_move, 853, 119, 2, 67, 427] +[:mouse_move, 830, 117, 2, 68, 428] +[:mouse_move, 799, 112, 2, 69, 429] +[:mouse_move, 750, 105, 2, 70, 430] +[:mouse_move, 659, 100, 2, 71, 431] +[:mouse_move, 544, 100, 2, 72, 432] +[:mouse_move, 447, 100, 2, 73, 433] +[:mouse_move, 383, 100, 2, 74, 434] +[:mouse_move, 336, 100, 2, 75, 435] +[:mouse_move, 290, 100, 2, 76, 436] +[:mouse_move, 251, 100, 2, 77, 437] +[:mouse_move, 205, 100, 2, 78, 438] +[:mouse_move, 181, 100, 2, 79, 439] +[:mouse_move, 159, 102, 2, 80, 440] +[:mouse_move, 137, 106, 2, 81, 441] +[:mouse_move, 124, 111, 2, 82, 442] +[:mouse_move, 120, 113, 2, 83, 443] +[:mouse_move, 134, 117, 2, 84, 446] +[:mouse_move, 167, 127, 2, 85, 447] +[:mouse_move, 208, 137, 2, 86, 448] +[:mouse_move, 255, 142, 2, 87, 449] +[:mouse_move, 356, 155, 2, 88, 450] +[:mouse_move, 439, 159, 2, 89, 451] +[:mouse_move, 522, 159, 2, 90, 452] +[:mouse_move, 576, 151, 2, 91, 453] +[:mouse_move, 606, 139, 2, 92, 454] +[:mouse_move, 622, 128, 2, 93, 455] +[:mouse_move, 630, 120, 2, 94, 456] +[:mouse_move, 630, 117, 2, 95, 457] +[:mouse_move, 620, 104, 2, 96, 458] +[:mouse_move, 592, 85, 2, 97, 459] +[:mouse_move, 544, 64, 2, 98, 460] +[:mouse_move, 465, 35, 2, 99, 461] +[:mouse_move, 377, 15, 2, 100, 462] +[:mouse_move, 209, 0, 2, 101, 463] +[:mouse_move, 10, 66, 2, 102, 473] +[:mouse_move, 39, 76, 2, 103, 474] +[:mouse_move, 66, 80, 2, 104, 475] +[:mouse_move, 96, 81, 2, 105, 476] +[:mouse_move, 125, 81, 2, 106, 477] +[:mouse_move, 149, 80, 2, 107, 478] +[:mouse_move, 173, 76, 2, 108, 479] +[:mouse_move, 192, 74, 2, 109, 480] +[:mouse_move, 209, 71, 2, 110, 481] +[:mouse_move, 213, 71, 2, 111, 482] +[:mouse_move, 212, 72, 2, 112, 486] +[:mouse_move, 212, 75, 2, 113, 487] +[:mouse_move, 217, 79, 2, 114, 488] +[:mouse_move, 218, 80, 2, 115, 489] +[:key_down_raw, 1073741905, 0, 2, 116, 517] +[:key_up_raw, 1073741905, 0, 2, 117, 522] +[:key_down_raw, 1073741905, 0, 2, 118, 526] +[:key_up_raw, 1073741905, 0, 2, 119, 530] +[:key_down_raw, 1073741905, 0, 2, 120, 535] +[:key_up_raw, 1073741905, 0, 2, 121, 539] +[:key_down_raw, 1073741905, 0, 2, 122, 544] +[:key_up_raw, 1073741905, 0, 2, 123, 549] +[:mouse_move, 217, 80, 2, 124, 582] +[:mouse_move, 214, 80, 2, 125, 583] +[:mouse_move, 205, 80, 2, 126, 584] +[:mouse_move, 190, 80, 2, 127, 585] +[:mouse_move, 168, 80, 2, 128, 586] +[:mouse_move, 145, 80, 2, 129, 587] +[:mouse_move, 123, 80, 2, 130, 588] +[:mouse_move, 95, 80, 2, 131, 589] +[:mouse_move, 64, 80, 2, 132, 590] +[:mouse_move, 43, 82, 2, 133, 591] +[:mouse_move, 29, 82, 2, 134, 592] +[:mouse_move, 22, 83, 2, 135, 593] +[:mouse_move, 19, 83, 2, 136, 594] +[:mouse_move, 19, 85, 2, 137, 596] +[:mouse_move, 22, 98, 2, 138, 597] +[:mouse_move, 35, 116, 2, 139, 598] +[:mouse_move, 55, 135, 2, 140, 599] +[:mouse_move, 79, 147, 2, 141, 600] +[:mouse_move, 106, 152, 2, 142, 601] +[:mouse_move, 140, 153, 2, 143, 602] +[:mouse_move, 182, 151, 2, 144, 603] +[:mouse_move, 220, 141, 2, 145, 604] +[:mouse_move, 247, 127, 2, 146, 605] +[:mouse_move, 272, 103, 2, 147, 606] +[:mouse_move, 274, 90, 2, 148, 607] +[:mouse_move, 271, 77, 2, 149, 608] +[:mouse_move, 254, 64, 2, 150, 609] +[:mouse_move, 222, 50, 2, 151, 610] +[:mouse_move, 181, 37, 2, 152, 611] +[:mouse_move, 141, 32, 2, 153, 612] +[:mouse_move, 102, 30, 2, 154, 613] +[:mouse_move, 69, 30, 2, 155, 614] +[:mouse_move, 40, 34, 2, 156, 615] +[:mouse_move, 20, 43, 2, 157, 616] +[:mouse_move, 5, 54, 2, 158, 617] +[:mouse_move, 0, 77, 2, 159, 618] +[:mouse_move, 6, 99, 2, 160, 619] +[:mouse_move, 25, 120, 2, 161, 620] +[:mouse_move, 51, 134, 2, 162, 621] +[:mouse_move, 83, 139, 2, 163, 622] +[:mouse_move, 119, 142, 2, 164, 623] +[:mouse_move, 156, 142, 2, 165, 624] +[:mouse_move, 189, 142, 2, 166, 625] +[:mouse_move, 209, 138, 2, 167, 626] +[:mouse_move, 222, 132, 2, 168, 627] +[:mouse_move, 227, 126, 2, 169, 628] +[:mouse_move, 229, 120, 2, 170, 629] +[:mouse_move, 231, 113, 2, 171, 630] +[:mouse_move, 232, 113, 2, 172, 631] +[:mouse_move, 235, 113, 2, 173, 651] +[:mouse_move, 236, 113, 2, 174, 652] +[:mouse_move, 237, 113, 2, 175, 653] +[:mouse_move, 242, 113, 2, 176, 654] +[:mouse_move, 252, 115, 2, 177, 655] +[:mouse_move, 277, 116, 2, 178, 656] +[:key_down_raw, 96, 0, 2, 179, 656] +[:mouse_move, 316, 116, 2, 180, 657] +[:mouse_move, 372, 116, 2, 181, 658] +[:mouse_move, 445, 117, 2, 182, 659] +[:mouse_move, 513, 123, 2, 183, 660] +[:key_up_raw, 96, 0, 2, 184, 661] +[:mouse_move, 572, 131, 2, 185, 661] +[:mouse_move, 622, 135, 2, 186, 662] +[:mouse_move, 669, 135, 2, 187, 663] +[:mouse_move, 704, 135, 2, 188, 664] +[:mouse_move, 724, 135, 2, 189, 665] +[:mouse_move, 728, 135, 2, 190, 666] +[:mouse_move, 727, 135, 2, 191, 670] +[:key_down_raw, 13, 0, 2, 192, 697] diff --git a/samples/99_genre_rpg_topdown/topdown_casino/app/main.rb b/samples/99_genre_rpg_topdown/topdown_casino/app/main.rb new file mode 100644 index 0000000..eccf744 --- /dev/null +++ b/samples/99_genre_rpg_topdown/topdown_casino/app/main.rb @@ -0,0 +1,139 @@ +$gtk.reset + +def coinflip + rand < 0.5 +end + +class Game + attr_accessor :args + + def text_font + return nil #"rpg.ttf" + end + + def text_color + [ 255, 255, 255, 255 ] + end + + def set_gem_values + @args.state.gem0 = ((coinflip) ? 100 : 20) + @args.state.gem1 = ((coinflip) ? -10 : -50) + @args.state.gem2 = ((coinflip) ? -10 : -30) + if coinflip + tmp = @args.state.gem0 + @args.state.gem0 = @args.state.gem1 + @args.state.gem1 = tmp + end + if coinflip + tmp = @args.state.gem1 + @args.state.gem1 = @args.state.gem2 + @args.state.gem2 = tmp + end + if coinflip + tmp = @args.state.gem0 + @args.state.gem0 = @args.state.gem2 + @args.state.gem2 = tmp + end + end + + def initialize args + @args = args + @args.state.animticks = 0 + @args.state.score = 0 + @args.state.gem_chosen = false + @args.state.round_finished = false + @args.state.gem0_x = 197 + @args.state.gem0_y = 720-274 + @args.state.gem1_x = 623 + @args.state.gem1_y = 720-274 + @args.state.gem2_x = 1049 + @args.state.gem2_y = 720-274 + @args.state.hero_sprite = "sprites/herodown100.png" + @args.state.hero_x = 608 + @args.state.hero_y = 720-656 + set_gem_values + end + + def render_gem_value x, y, gem + if @args.state.gem_chosen + @args.outputs.labels << [ x, y + 96, gem.to_s, 1, 1, *text_color, text_font ] + end + end + + def render + gemsprite = ((@args.state.animticks % 400) < 200) ? 'sprites/gem200.png' : 'sprites/gem400.png' + @args.outputs.background_color = [ 0, 0, 0, 255 ] + @args.outputs.sprites << [608, 720-150, 64, 64, 'sprites/oldman.png'] + @args.outputs.sprites << [300, 720-150, 64, 64, 'sprites/fire.png'] + @args.outputs.sprites << [900, 720-150, 64, 64, 'sprites/fire.png'] + @args.outputs.sprites << [@args.state.gem0_x, @args.state.gem0_y, 32, 64, gemsprite] + @args.outputs.sprites << [@args.state.gem1_x, @args.state.gem1_y, 32, 64, gemsprite] + @args.outputs.sprites << [@args.state.gem2_x, @args.state.gem2_y, 32, 64, gemsprite] + @args.outputs.sprites << [@args.state.hero_x, @args.state.hero_y, 64, 64, @args.state.hero_sprite] + + @args.outputs.labels << [ 630, 720-30, "IT'S A SECRET TO EVERYONE.", 1, 1, *text_color, text_font ] + @args.outputs.labels << [ 50, 720-85, @args.state.score.to_s, 1, 1, *text_color, text_font ] + render_gem_value @args.state.gem0_x, @args.state.gem0_y, @args.state.gem0 + render_gem_value @args.state.gem1_x, @args.state.gem1_y, @args.state.gem1 + render_gem_value @args.state.gem2_x, @args.state.gem2_y, @args.state.gem2 + end + + def calc + @args.state.animticks += 16 + + return unless @args.state.gem_chosen + @args.state.round_finished_debounce ||= 60 * 3 + @args.state.round_finished_debounce -= 1 + return if @args.state.round_finished_debounce > 0 + + @args.state.gem_chosen = false + @args.state.hero.sprite[0] = 'sprites/herodown100.png' + @args.state.hero.sprite[1] = 608 + @args.state.hero.sprite[2] = 656 + @args.state.round_finished_debounce = nil + set_gem_values + end + + def walk xdir, ydir, anim + @args.state.hero_sprite = "sprites/#{anim}#{(((@args.state.animticks % 200) < 100) ? '100' : '200')}.png" + @args.state.hero_x += 5 * xdir + @args.state.hero_y += 5 * ydir + end + + def check_gem_touching gem_x, gem_y, gem + return if @args.state.gem_chosen + herorect = [ @args.state.hero_x, @args.state.hero_y, 64, 64 ] + return if !herorect.intersect_rect?([gem_x, gem_y, 32, 64]) + @args.state.gem_chosen = true + @args.state.score += gem + @args.outputs.sounds << ((gem < 0) ? 'sounds/lose.wav' : 'sounds/win.wav') + end + + def input + if @args.inputs.keyboard.key_held.left + walk(-1.0, 0.0, 'heroleft') + elsif @args.inputs.keyboard.key_held.right + walk(1.0, 0.0, 'heroright') + elsif @args.inputs.keyboard.key_held.up + walk(0.0, 1.0, 'heroup') + elsif @args.inputs.keyboard.key_held.down + walk(0.0, -1.0, 'herodown') + end + + check_gem_touching(@args.state.gem0_x, @args.state.gem0_y, @args.state.gem0) + check_gem_touching(@args.state.gem1_x, @args.state.gem1_y, @args.state.gem1) + check_gem_touching(@args.state.gem2_x, @args.state.gem2_y, @args.state.gem2) + end + + def tick + input + calc + render + end +end + +def tick args + args.state.game ||= Game.new args + args.state.game.args = args + args.state.game.tick +end diff --git a/samples/99_genre_rpg_topdown/topdown_casino/license-for-sample.txt b/samples/99_genre_rpg_topdown/topdown_casino/license-for-sample.txt new file mode 100644 index 0000000..c25563f --- /dev/null +++ b/samples/99_genre_rpg_topdown/topdown_casino/license-for-sample.txt @@ -0,0 +1,9 @@ +Copyright 2019 DragonRuby LLC (code), Nick Culbertson @mobypixel (art/music) + +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_rpg_topdown/topdown_casino/replay.txt b/samples/99_genre_rpg_topdown/topdown_casino/replay.txt new file mode 100644 index 0000000..e4d52d7 --- /dev/null +++ b/samples/99_genre_rpg_topdown/topdown_casino/replay.txt @@ -0,0 +1,123 @@ +replay_version 2.0 +stopped_at 871 +seed 100 +recorded_at 2021-11-20 11:37:50 -0600 +[:mouse_button_up, 1, 0, 1, 1, 4] +[:mouse_move, 802, 86, 2, 2, 21] +[:key_down_raw, 1073741906, 0, 2, 3, 105] +[:key_down_raw, 1073741906, 0, 2, 4, 119] +[:key_down_raw, 1073741906, 0, 2, 5, 121] +[:key_down_raw, 1073741906, 0, 2, 6, 123] +[:key_down_raw, 1073741906, 0, 2, 7, 125] +[:key_down_raw, 1073741906, 0, 2, 8, 127] +[:key_down_raw, 1073741906, 0, 2, 9, 129] +[:key_down_raw, 1073741906, 0, 2, 10, 131] +[:key_down_raw, 1073741906, 0, 2, 11, 133] +[:key_down_raw, 1073741906, 0, 2, 12, 135] +[:key_down_raw, 1073741906, 0, 2, 13, 137] +[:key_down_raw, 1073741906, 0, 2, 14, 139] +[:key_up_raw, 1073741906, 0, 2, 15, 140] +[:key_down_raw, 1073741903, 0, 2, 16, 141] +[:key_down_raw, 1073741906, 0, 2, 17, 153] +[:key_up_raw, 1073741903, 0, 2, 18, 160] +[:key_down_raw, 1073741906, 0, 2, 19, 168] +[:key_down_raw, 1073741906, 0, 2, 20, 170] +[:key_down_raw, 1073741906, 0, 2, 21, 172] +[:key_down_raw, 1073741906, 0, 2, 22, 174] +[:key_down_raw, 1073741906, 0, 2, 23, 176] +[:key_down_raw, 1073741906, 0, 2, 24, 178] +[:key_down_raw, 1073741906, 0, 2, 25, 180] +[:key_down_raw, 1073741906, 0, 2, 26, 182] +[:key_down_raw, 1073741906, 0, 2, 27, 184] +[:key_down_raw, 1073741906, 0, 2, 28, 186] +[:key_down_raw, 1073741906, 0, 2, 29, 188] +[:key_down_raw, 1073741906, 0, 2, 30, 190] +[:key_down_raw, 1073741906, 0, 2, 31, 192] +[:key_down_raw, 1073741906, 0, 2, 32, 194] +[:key_down_raw, 1073741906, 0, 2, 33, 196] +[:key_up_raw, 1073741906, 0, 2, 34, 196] +[:key_down_raw, 1073741904, 0, 2, 35, 225] +[:key_down_raw, 1073741904, 0, 2, 36, 240] +[:key_down_raw, 1073741904, 0, 2, 37, 242] +[:key_down_raw, 1073741904, 0, 2, 38, 244] +[:key_up_raw, 1073741904, 0, 2, 39, 244] +[:key_down_raw, 1073741905, 0, 2, 40, 297] +[:key_down_raw, 1073741905, 0, 2, 41, 312] +[:key_down_raw, 1073741905, 0, 2, 42, 314] +[:key_down_raw, 1073741905, 0, 2, 43, 316] +[:key_down_raw, 1073741905, 0, 2, 44, 318] +[:key_down_raw, 1073741905, 0, 2, 45, 320] +[:key_down_raw, 1073741905, 0, 2, 46, 322] +[:key_down_raw, 1073741905, 0, 2, 47, 324] +[:key_up_raw, 1073741905, 0, 2, 48, 326] +[:key_down_raw, 1073741904, 0, 2, 49, 355] +[:key_down_raw, 1073741904, 0, 2, 50, 370] +[:key_down_raw, 1073741904, 0, 2, 51, 372] +[:key_down_raw, 1073741904, 0, 2, 52, 374] +[:key_down_raw, 1073741904, 0, 2, 53, 376] +[:key_down_raw, 1073741904, 0, 2, 54, 378] +[:key_up_raw, 1073741904, 0, 2, 55, 379] +[:key_down_raw, 1073741906, 0, 2, 56, 393] +[:key_down_raw, 1073741906, 0, 2, 57, 408] +[:key_down_raw, 1073741906, 0, 2, 58, 410] +[:key_down_raw, 1073741906, 0, 2, 59, 412] +[:key_down_raw, 1073741906, 0, 2, 60, 414] +[:key_down_raw, 1073741906, 0, 2, 61, 416] +[:key_down_raw, 1073741906, 0, 2, 62, 418] +[:key_down_raw, 1073741906, 0, 2, 63, 421] +[:key_up_raw, 1073741906, 0, 2, 64, 421] +[:key_down_raw, 1073741906, 0, 2, 65, 454] +[:key_down_raw, 1073741906, 0, 2, 66, 468] +[:key_down_raw, 1073741906, 0, 2, 67, 470] +[:key_down_raw, 1073741906, 0, 2, 68, 472] +[:key_down_raw, 1073741906, 0, 2, 69, 474] +[:key_up_raw, 1073741906, 0, 2, 70, 475] +[:key_down_raw, 1073741904, 0, 2, 71, 476] +[:key_down_raw, 1073741904, 0, 2, 72, 491] +[:key_down_raw, 1073741904, 0, 2, 73, 493] +[:key_down_raw, 1073741904, 0, 2, 74, 495] +[:key_down_raw, 1073741906, 0, 2, 75, 496] +[:key_down_raw, 1073741906, 0, 2, 76, 511] +[:key_down_raw, 1073741906, 0, 2, 77, 513] +[:key_down_raw, 1073741906, 0, 2, 78, 515] +[:key_up_raw, 1073741906, 0, 2, 79, 515] +[:key_down_raw, 1073741905, 0, 2, 80, 524] +[:key_up_raw, 1073741904, 0, 2, 81, 526] +[:key_up_raw, 1073741905, 0, 2, 82, 532] +[:key_down_raw, 1073741906, 0, 2, 83, 570] +[:key_down_raw, 1073741906, 0, 2, 84, 585] +[:key_up_raw, 1073741906, 0, 2, 85, 586] +[:key_down_raw, 1073741903, 0, 2, 86, 591] +[:key_up_raw, 1073741903, 0, 2, 87, 605] +[:key_down_raw, 1073741905, 0, 2, 88, 608] +[:key_down_raw, 1073741905, 0, 2, 89, 623] +[:key_down_raw, 1073741904, 0, 2, 90, 625] +[:key_up_raw, 1073741905, 0, 2, 91, 627] +[:key_down_raw, 1073741904, 0, 2, 92, 640] +[:key_down_raw, 1073741904, 0, 2, 93, 642] +[:key_down_raw, 1073741904, 0, 2, 94, 644] +[:key_down_raw, 1073741904, 0, 2, 95, 646] +[:key_down_raw, 1073741904, 0, 2, 96, 648] +[:key_up_raw, 1073741904, 0, 2, 97, 650] +[:key_down_raw, 1073741903, 0, 2, 98, 705] +[:key_down_raw, 1073741903, 0, 2, 99, 720] +[:key_down_raw, 1073741903, 0, 2, 100, 722] +[:key_down_raw, 1073741903, 0, 2, 101, 724] +[:key_down_raw, 1073741903, 0, 2, 102, 726] +[:key_down_raw, 1073741903, 0, 2, 103, 729] +[:key_down_raw, 1073741903, 0, 2, 104, 731] +[:key_down_raw, 1073741903, 0, 2, 105, 733] +[:key_down_raw, 1073741903, 0, 2, 106, 735] +[:key_down_raw, 1073741903, 0, 2, 107, 737] +[:key_down_raw, 1073741903, 0, 2, 108, 739] +[:key_down_raw, 1073741903, 0, 2, 109, 741] +[:key_down_raw, 1073741903, 0, 2, 110, 743] +[:key_down_raw, 1073741903, 0, 2, 111, 745] +[:key_down_raw, 1073741903, 0, 2, 112, 747] +[:key_down_raw, 1073741903, 0, 2, 113, 749] +[:key_down_raw, 1073741903, 0, 2, 114, 751] +[:key_down_raw, 1073741903, 0, 2, 115, 753] +[:key_up_raw, 1073741903, 0, 2, 116, 753] +[:key_down_raw, 96, 0, 2, 117, 818] +[:key_up_raw, 96, 0, 2, 118, 823] +[:key_down_raw, 13, 0, 2, 119, 871] diff --git a/samples/99_genre_rpg_topdown/topdown_casino/sprites/fire.png b/samples/99_genre_rpg_topdown/topdown_casino/sprites/fire.png new file mode 100644 index 0000000..ed4b2f0 Binary files /dev/null and b/samples/99_genre_rpg_topdown/topdown_casino/sprites/fire.png differ diff --git a/samples/99_genre_rpg_topdown/topdown_casino/sprites/gem200.png b/samples/99_genre_rpg_topdown/topdown_casino/sprites/gem200.png new file mode 100644 index 0000000..f643db9 Binary files /dev/null and b/samples/99_genre_rpg_topdown/topdown_casino/sprites/gem200.png differ diff --git a/samples/99_genre_rpg_topdown/topdown_casino/sprites/gem400.png b/samples/99_genre_rpg_topdown/topdown_casino/sprites/gem400.png new file mode 100644 index 0000000..f872e06 Binary files /dev/null and b/samples/99_genre_rpg_topdown/topdown_casino/sprites/gem400.png differ diff --git a/samples/99_genre_rpg_topdown/topdown_casino/sprites/herodown100.png b/samples/99_genre_rpg_topdown/topdown_casino/sprites/herodown100.png new file mode 100644 index 0000000..116d406 Binary files /dev/null and b/samples/99_genre_rpg_topdown/topdown_casino/sprites/herodown100.png differ diff --git a/samples/99_genre_rpg_topdown/topdown_casino/sprites/herodown200.png b/samples/99_genre_rpg_topdown/topdown_casino/sprites/herodown200.png new file mode 100644 index 0000000..116d406 Binary files /dev/null and b/samples/99_genre_rpg_topdown/topdown_casino/sprites/herodown200.png differ diff --git a/samples/99_genre_rpg_topdown/topdown_casino/sprites/heroleft100.png b/samples/99_genre_rpg_topdown/topdown_casino/sprites/heroleft100.png new file mode 100644 index 0000000..116d406 Binary files /dev/null and b/samples/99_genre_rpg_topdown/topdown_casino/sprites/heroleft100.png differ diff --git a/samples/99_genre_rpg_topdown/topdown_casino/sprites/heroleft200.png b/samples/99_genre_rpg_topdown/topdown_casino/sprites/heroleft200.png new file mode 100644 index 0000000..116d406 Binary files /dev/null and b/samples/99_genre_rpg_topdown/topdown_casino/sprites/heroleft200.png differ diff --git a/samples/99_genre_rpg_topdown/topdown_casino/sprites/heroright100.png b/samples/99_genre_rpg_topdown/topdown_casino/sprites/heroright100.png new file mode 100644 index 0000000..116d406 Binary files /dev/null and b/samples/99_genre_rpg_topdown/topdown_casino/sprites/heroright100.png differ diff --git a/samples/99_genre_rpg_topdown/topdown_casino/sprites/heroright200.png b/samples/99_genre_rpg_topdown/topdown_casino/sprites/heroright200.png new file mode 100644 index 0000000..116d406 Binary files /dev/null and b/samples/99_genre_rpg_topdown/topdown_casino/sprites/heroright200.png differ diff --git a/samples/99_genre_rpg_topdown/topdown_casino/sprites/heroup100.png b/samples/99_genre_rpg_topdown/topdown_casino/sprites/heroup100.png new file mode 100644 index 0000000..116d406 Binary files /dev/null and b/samples/99_genre_rpg_topdown/topdown_casino/sprites/heroup100.png differ diff --git a/samples/99_genre_rpg_topdown/topdown_casino/sprites/heroup200.png b/samples/99_genre_rpg_topdown/topdown_casino/sprites/heroup200.png new file mode 100644 index 0000000..116d406 Binary files /dev/null and b/samples/99_genre_rpg_topdown/topdown_casino/sprites/heroup200.png differ diff --git a/samples/99_genre_rpg_topdown/topdown_casino/sprites/oldman.png b/samples/99_genre_rpg_topdown/topdown_casino/sprites/oldman.png new file mode 100644 index 0000000..a9bb758 Binary files /dev/null and b/samples/99_genre_rpg_topdown/topdown_casino/sprites/oldman.png differ diff --git a/samples/99_genre_teenytiny/teenytiny_starting_point/app/main.rb b/samples/99_genre_teenytiny/teenytiny_starting_point/app/main.rb new file mode 100644 index 0000000..a542a93 --- /dev/null +++ b/samples/99_genre_teenytiny/teenytiny_starting_point/app/main.rb @@ -0,0 +1,162 @@ +# full documenation is at http://docs.dragonruby.org +# be sure to come to the discord if you hit any snags: http://discord.dragonruby.org +def tick args + # ==================================================== + # initialize default variables + # ==================================================== + + # ruby has an operator called ||= which means "only initialize this if it's nil" + args.state.count_down ||= 20 * 60 # set the count down to 20 seconds + # set the initial position of the target + args.state.target ||= { x: args.grid.w.half, + y: args.grid.h.half, + w: 20, + h: 20 } + + # set the initial position of the player + args.state.player ||= { x: 50, + y: 50, + w: 20, + h: 20 } + + # set the player movement speed + args.state.player_speed ||= 5 + + # set the score + args.state.score ||= 0 + args.state.teleports ||= 3 + + # set the instructions + args.state.instructions ||= "Get to the red goal! Use arrow keys to move. Spacebar to teleport (use them carefully)!" + + # ==================================================== + # render the game + # ==================================================== + args.outputs.labels << { x: args.grid.w.half, y: args.grid.h - 10, + text: args.state.instructions, + alignment_enum: 1 } + + # check if it's game over. if so, then render game over + # otherwise render the current time left + if game_over? args + args.outputs.labels << { x: args.grid.w.half, + y: args.grid.h - 40, + text: "game over! (press r to start over)", + alignment_enum: 1 } + else + args.outputs.labels << { x: args.grid.w.half, + y: args.grid.h - 40, + text: "time left: #{(args.state.count_down.idiv 60) + 1}", + alignment_enum: 1 } + end + + # render the score + args.outputs.labels << { x: args.grid.w.half, + y: args.grid.h - 70, + text: "score: #{args.state.score}", + alignment_enum: 1 } + + # render the player with teleport count + args.outputs.sprites << { x: args.state.player.x, + y: args.state.player.y, + w: args.state.player.w, + h: args.state.player.h, + path: 'sprites/square-green.png' } + + args.outputs.labels << { x: args.state.player.x + 10, + y: args.state.player.y + 40, + text: "teleports: #{args.state.teleports}", + alignment_enum: 1, size_enum: -2 } + + # render the target + args.outputs.sprites << { x: args.state.target.x, + y: args.state.target.y, + w: args.state.target.w, + h: args.state.target.h, + path: 'sprites/square-red.png' } + + # ==================================================== + # run simulation + # ==================================================== + + # count down calculation + args.state.count_down -= 1 + args.state.count_down = -1 if args.state.count_down < -1 + + # ==================================================== + # process player input + # ==================================================== + # if it isn't game over let them move + if !game_over? args + dir_y = 0 + dir_x = 0 + + # determine the change horizontally + if args.inputs.keyboard.up + dir_y += args.state.player_speed + elsif args.inputs.keyboard.down + dir_y -= args.state.player_speed + end + + # determine the change vertically + if args.inputs.keyboard.left + dir_x -= args.state.player_speed + elsif args.inputs.keyboard.right + dir_x += args.state.player_speed + end + + # determine if teleport can be used + if args.inputs.keyboard.key_down.space && args.state.teleports > 0 + args.state.teleports -= 1 + dir_x *= 20 + dir_y *= 20 + end + + # apply change to player + args.state.player.x += dir_x + args.state.player.y += dir_y + else + # if r is pressed, reset the game + if args.inputs.keyboard.key_down.r + $gtk.reset + return + end + end + + # ==================================================== + # determine score + # ==================================================== + + # calculate new score if the player is at goal + if !game_over? args + + # if the player is at the goal, then move the goal + if args.state.player.intersect_rect? args.state.target + # increment the goal + args.state.score += 1 + + # move the goal to a random location + args.state.target = { x: (rand args.grid.w), y: (rand args.grid.h), w: 20, h: 20 } + + # make sure the goal is inside the view area + if args.state.target.x < 0 + args.state.target.x += 20 + elsif args.state.target.x > 1280 + args.state.target.x -= 20 + end + + # make sure the goal is inside the view area + if args.state.target.y < 0 + args.state.target.y += 20 + elsif args.state.target.y > 720 + args.state.target.y -= 20 + end + end + end +end + +def game_over? args + args.state.count_down < 0 +end + +$gtk.reset diff --git a/samples/99_genre_teenytiny/teenytiny_starting_point/license.txt b/samples/99_genre_teenytiny/teenytiny_starting_point/license.txt new file mode 100644 index 0000000..100dcec --- /dev/null +++ b/samples/99_genre_teenytiny/teenytiny_starting_point/license.txt @@ -0,0 +1,9 @@ +Copyright 2019 DragonRuby LLC + +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_teenytiny/teenytiny_starting_point/sprites/square-green.png b/samples/99_genre_teenytiny/teenytiny_starting_point/sprites/square-green.png new file mode 100644 index 0000000..5ef7f75 Binary files /dev/null and b/samples/99_genre_teenytiny/teenytiny_starting_point/sprites/square-green.png differ diff --git a/samples/99_genre_teenytiny/teenytiny_starting_point/sprites/square-red.png b/samples/99_genre_teenytiny/teenytiny_starting_point/sprites/square-red.png new file mode 100644 index 0000000..3ed5f13 Binary files /dev/null and b/samples/99_genre_teenytiny/teenytiny_starting_point/sprites/square-red.png differ -- cgit v1.2.3